Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
rooi committed Apr 19, 2015
2 parents 074f45a + 923cdc0 commit 119a866
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 33 deletions.
2 changes: 1 addition & 1 deletion Source/DefaultBrowserAction.m
Expand Up @@ -155,7 +155,7 @@ - (void)handleURL:(NSString *)url {
NULL,
(CFStringRef)decodedURL,
(CFStringRef)@"#",
(CFStringRef)@" &",
(CFStringRef)@" ",
kCFStringEncodingUTF8 );
NSArray *urls = [NSArray arrayWithObject:[NSURL URLWithString:newURL]];
[newURL release];
Expand Down
112 changes: 80 additions & 32 deletions Source/TimeOfDayEvidenceSource.m
Expand Up @@ -6,9 +6,10 @@
//

#import "TimeOfDayEvidenceSource.h"
#import "DSLogger.h"
#import "RuleType.h"


@interface TimeOfDayEvidenceSource (Private)
@interface TimeOfDayEvidenceSource ()

// Returns NO on failure
- (BOOL)parseParameter:(NSString *)parameter intoDay:(NSString **)day startTime:(NSDate **)startT endTime:(NSDate **)endT;
Expand All @@ -22,23 +23,33 @@ @implementation TimeOfDayEvidenceSource
- (BOOL)parseParameter:(NSString *)parameter intoDay:(NSString **)day startTime:(NSDate **)startT endTime:(NSDate **)endT
{
NSArray *arr = [parameter componentsSeparatedByString:@","];
if ([arr count] != 3)
return NO;

*day = [arr objectAtIndex:0];
// TODO: check day is an element in our list?

*startT = [formatter dateFromString:[arr objectAtIndex:1]];
*endT = [formatter dateFromString:[arr objectAtIndex:2]];
// TODO: check parsing? (maybe by re-encoding string, and comparing)

if ([arr count] != 3) {
return NO;
}

*day = arr[0];

*startT = [formatter dateFromString:arr[1]];
if (startT == nil) {
DSLog(@"Cannot parse value \"%@\" of parameter \"Start time\" in a \"Time of day\" rule.", arr[1]);
return NO;
}

*endT = [formatter dateFromString:arr[2]];
if (endT == nil) {
DSLog(@"Cannot parse value \"%@\" of parameter \"End time\" in a \"Time of day\" rule.", arr[2]);
return NO;
}

return YES;
}

- (id)init
{
if (!(self = [super initWithNibNamed:@"TimeOfDayRule"]))
return nil;
self = [super initWithNibNamed:@"TimeOfDayRule"];
if (self == nil) {
return nil;
}

// Create formatter for reading/writing times ("HH:MM" only)
formatter = [[NSDateFormatter alloc] init];
Expand Down Expand Up @@ -84,18 +95,42 @@ - (NSString *) description {
return NSLocalizedString(@"Create rules based on the time of day and day of week.", @"");
}

- (IBAction)closeSheetWithOK:(id)sender
{
if ([self validatePanelParams]) {
[super closeSheetWithOK:sender];
}
}

- (BOOL)validatePanelParams
{
NSString *startT = [formatter stringFromDate:startTime];
if (startT == nil) {
[RuleType alertOnInvalidParamValueWith:NSLocalizedString(@"Start time format is not correct", @"")];
return NO;
}

NSString *endT = [formatter stringFromDate:endTime];
if (endT == nil) {
[RuleType alertOnInvalidParamValueWith:NSLocalizedString(@"End time format is not correct", @"")];
return NO;
}

return YES;
}

- (NSMutableDictionary *)readFromPanel
{
NSMutableDictionary *dict = [super readFromPanel];

NSString *param = [NSString stringWithFormat:@"%@,%@,%@", selectedDay,
[formatter stringFromDate:startTime], [formatter stringFromDate:endTime]];

// Make formatter for description of times
NSDateFormatter *fmt = [[[NSDateFormatter alloc] init] autorelease];
[fmt setFormatterBehavior:NSDateFormatterBehavior10_4];
[fmt setDateStyle:NSDateFormatterNoStyle];
[fmt setTimeStyle:NSDateFormatterShortStyle];

NSString *param = [NSString stringWithFormat:@"%@,%@,%@", selectedDay,
[formatter stringFromDate:startTime], [formatter stringFromDate:endTime]];
// TODO: improve description?
NSString *desc = [NSString stringWithFormat:@"%@ %@-%@", selectedDay,
[fmt stringFromDate:startTime], [fmt stringFromDate:endTime]];
Expand Down Expand Up @@ -145,16 +180,29 @@ - (NSString *)name

- (BOOL)doesRuleMatch:(NSDictionary *)rule
{
NSString *day;
NSDate *startT, *endT;
NSCalendarDate *now = [NSCalendarDate calendarDate];

if (![self parseParameter:[rule valueForKey:@"parameter"] intoDay:&day startTime:&startT endTime:&endT])
return NO;

if ([startT earlierDate:endT] == endT) //cross-midnight rule
endT = [endT dateByAddingTimeInterval:(24 * 60 * 60)]; // +24 hours

NSString *day = nil;
NSDate *startT = nil, *endT = nil;

if (![self parseParameter:rule[@"parameter"] intoDay:&day startTime:&startT endTime:&endT]) {
return NO;
}

if (startT == (id)[NSNull null] || endT == (id)[NSNull null]) {
#if DEBUG_MODE
DSLog(@"Cannot cope with a null startT or endT, returning false");
#endif
return NO;
}

if ([startT earlierDate:endT] == endT) { //cross-midnight rule
endT = [endT dateByAddingTimeInterval:(24 * 60 * 60)]; // +24 hours
if (endT == nil) {
return NO;
}
}

NSCalendarDate *now = [NSCalendarDate calendarDate];

// Check day first
NSInteger dow = [now dayOfWeek]; // 0=Sunday, 1=Monday, etc.
if ([day isEqualToString:@"Any day"]) {
Expand All @@ -171,11 +219,11 @@ - (BOOL)doesRuleMatch:(NSDictionary *)rule
if (![day isEqualToString:day_name[dow]])
return NO;
}

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *startC = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:startT];
NSDateComponents *endC = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:endT];

NSDateComponents *startC = [cal components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:startT];
NSDateComponents *endC = [cal components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:endT];
// Test with startT
if (([now hourOfDay] < [startC hour]) ||
(([now hourOfDay] == [startC hour]) && ([now minuteOfHour] < [startC minute])))
Expand All @@ -188,7 +236,7 @@ - (BOOL)doesRuleMatch:(NSDictionary *)rule
return YES;
}

- (NSString *) friendlyName {
- (NSString *)friendlyName {
return NSLocalizedString(@"Time Of Day", @"");
}

Expand Down

0 comments on commit 119a866

Please sign in to comment.