diff --git a/SOPE/NGCards/iCalRecurrenceRule.h b/SOPE/NGCards/iCalRecurrenceRule.h index 354006dba..65cd11bcb 100644 --- a/SOPE/NGCards/iCalRecurrenceRule.h +++ b/SOPE/NGCards/iCalRecurrenceRule.h @@ -97,6 +97,7 @@ extern NSString *iCalWeekDayString[]; /* count and untilDate are mutually exclusive */ +- (BOOL) hasRepeatCount; - (void) setRepeatCount: (int) _repeatCount; - (int) repeatCount; diff --git a/SOPE/NGCards/iCalRecurrenceRule.m b/SOPE/NGCards/iCalRecurrenceRule.m index da20348d8..cf90b6c1e 100644 --- a/SOPE/NGCards/iCalRecurrenceRule.m +++ b/SOPE/NGCards/iCalRecurrenceRule.m @@ -403,6 +403,11 @@ NSString *iCalWeekDayString[] = { @"SU", @"MO", @"TU", @"WE", @"TH", @"FR", return [[self flattenedValuesForKey: @"count"] intValue]; } +- (BOOL) hasRepeatCount +{ + return [[self flattenedValuesForKey: @"count"] length] > 0; +} + - (void) setCount: (NSString *) _count { [self setSingleValue: _count forKey: @"count"]; diff --git a/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m b/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m index 25af97e5e..9e792f8d4 100644 --- a/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m +++ b/SOPE/NGCards/iCalWeeklyRecurrenceCalculator.m @@ -68,6 +68,7 @@ long i, repeatCount, count; unsigned interval; iCalByDayMask *dayMask; + BOOL hasRepeatCount; [self logWithFormat: @"Weekly %@", rrule]; @@ -76,6 +77,7 @@ endDate = [_r endDate]; dayMask = nil; repeatCount = 0; + hasRepeatCount = [rrule hasRepeatCount]; if ([endDate compare: firStart] == NSOrderedAscending) // Range ends before first occurrence @@ -113,7 +115,7 @@ return nil; if ([lastDate compare: endDate] == NSOrderedAscending) // Range ends after last occurence; adjust end date - endDate = lastDate; + endDate = [lastDate addTimeInterval: [firstRange duration]]; } } @@ -129,9 +131,7 @@ [currentStartDate compare: endDate] == NSOrderedSame) { currentEndDate = [currentStartDate addTimeInterval: [firstRange duration]]; - if ([startDate compare: currentStartDate] == NSOrderedAscending || - [startDate compare: currentStartDate] == NSOrderedSame || - [startDate compare: currentEndDate] == NSOrderedAscending) + if ([startDate compare: currentEndDate] == NSOrderedAscending) { NGCalendarDateRange *r; @@ -156,9 +156,9 @@ BOOL isRecurrence = NO; NSInteger week; - if (repeatCount > 0 || - [startDate compare: currentStartDate] == NSOrderedAscending || - [startDate compare: currentStartDate] == NSOrderedSame) + currentEndDate = [currentStartDate addTimeInterval: [firstRange duration]]; + if (hasRepeatCount || + [startDate compare: currentEndDate] == NSOrderedAscending) { // If the rule count is defined, stop once the count is reached. if ([currentStartDate compare: firStart] == NSOrderedSame) @@ -181,10 +181,8 @@ count++; if (repeatCount > 0 && count > repeatCount) break; - currentEndDate = [currentStartDate addTimeInterval: [firstRange duration]]; r = [NGCalendarDateRange calendarDateRangeWithStartDate: currentStartDate endDate: currentEndDate]; - if ([_r doesIntersectWithDateRange: r]) { [ranges addObject: r]; diff --git a/SoObjects/Appointments/iCalEvent+SOGo.m b/SoObjects/Appointments/iCalEvent+SOGo.m index c5e134be5..4dd3b7948 100644 --- a/SoObjects/Appointments/iCalEvent+SOGo.m +++ b/SoObjects/Appointments/iCalEvent+SOGo.m @@ -177,15 +177,15 @@ NSCalendarDate *date; date = [self lastPossibleRecurrenceStartDate]; - if (!date) - { - /* this could also be *nil*, but in the end it makes the fetchspecs - more complex - thus we set it to a "reasonable" distant future */ - date = iCalDistantFuture; - } + if (date) + date = [date addTimeInterval: [self durationAsTimeInterval]]; + else + /* this could also be *nil*, but in the end it makes the fetchspecs + more complex - thus we set it to a "reasonable" distant future */ + date = iCalDistantFuture; [row setObject: [self quickRecordDateAsNumber: date - withOffset: 0 forAllDay: NO] - forKey: @"c_cycleenddate"]; + withOffset: 0 forAllDay: NO] + forKey: @"c_cycleenddate"]; [row setObject: [self cycleInfo] forKey: @"c_cycleinfo"]; }