diff --git a/ChangeLog b/ChangeLog index 38d6e103c..2c0a73997 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2009-03-16 Francis Lachapelle + + * UI/Scheduler/UIxCalListingActions.m ([UIxCalListingActions + -_fixDates:]): moved corrections for daylight saving time in this + new method. + + * SoObjects/Appointments/SOGoAppointmentFolder.m + ([SOGoAppointmentFolder + -fixupCycleRecord:_recordcycleRange:_rfirstInstanceCalendarDateRange:_firforViewRange:_viewRange]): + propagate the start date of the cycle so it can be used later to + adjust the timezone. + * ([SOGoAppointmentFolder + -_appendCycleException:firstInstanceCalendarDateRange:fromRow:forRange:toArray:]): idem . + 2009-03-16 Wolfgang Sourdeau * SoObjects/Appointments/SOGoAppointmentObject.m diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 1aebec649..44f6bf655 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -578,20 +578,20 @@ static Class sogoAppointmentFolderKlass = Nil; return md; } -- (NSArray *) fixupRecords: (NSArray *) records +- (NSArray *) fixupRecords: (NSArray *) theRecords { // TODO: is the result supposed to be sorted by date? NSMutableArray *ma; unsigned count, max; id row; // TODO: what is the type of the record? - if (records) + if (theRecords) { - max = [records count]; + max = [theRecords count]; ma = [NSMutableArray arrayWithCapacity: max]; for (count = 0; count < max; count++) { - row = [self fixupRecord: [records objectAtIndex: count]]; + row = [self fixupRecord: [theRecords objectAtIndex: count]]; if (row) [ma addObject: row]; } @@ -610,43 +610,31 @@ static Class sogoAppointmentFolderKlass = Nil; NSMutableDictionary *md; NSNumber *dateSecs; id tmp; - signed int daylightOffset; md = [[_record mutableCopy] autorelease]; - daylightOffset = 0; /* cycle is in _r. We also have to override the c_startdate/c_enddate with the date values of the reccurence since we use those when displaying events in SOGo Web */ - tmp = [_r startDate]; - if ([timeZone isDaylightSavingTimeForDate: tmp] != [timeZone isDaylightSavingTimeForDate: [_viewRange startDate]]) - // For the event's start/end dates, compute the daylight saving time - // offset with respect to the view period. - daylightOffset = (signed int)[timeZone secondsFromGMTForDate: tmp] - - (signed int)[timeZone secondsFromGMTForDate: [_viewRange startDate]]; - + tmp = [_r startDate]; [tmp setTimeZone: timeZone]; [md setObject: tmp forKey: @"startDate"]; - dateSecs = [NSNumber numberWithInt: [tmp timeIntervalSince1970] + daylightOffset]; + dateSecs = [NSNumber numberWithInt: [tmp timeIntervalSince1970]]; [md setObject: dateSecs forKey: @"c_startdate"]; tmp = [_r endDate]; [tmp setTimeZone: timeZone]; [md setObject: tmp forKey: @"endDate"]; - dateSecs = [NSNumber numberWithInt: [tmp timeIntervalSince1970] + daylightOffset]; + dateSecs = [NSNumber numberWithInt: [tmp timeIntervalSince1970]]; [md setObject: dateSecs forKey: @"c_enddate"]; tmp = [_r startDate]; - if ([timeZone isDaylightSavingTimeForDate: tmp] != [timeZone isDaylightSavingTimeForDate: [_fir startDate]]) - // For the event's recurrence id, compute the daylight saving time - // offset with respect to the first occurrence of the recurring event. - daylightOffset = (signed int)[timeZone secondsFromGMTForDate: tmp] - - (signed int)[timeZone secondsFromGMTForDate: [_fir startDate]]; - else - daylightOffset = 0; - dateSecs = [NSNumber numberWithInt: [tmp timeIntervalSince1970] + daylightOffset]; + dateSecs = [NSNumber numberWithInt: [tmp timeIntervalSince1970]]; [md setObject: dateSecs forKey: @"c_recurrence_id"]; + tmp = [_fir startDate]; + [md setObject: tmp forKey: @"cycleStartDate"]; + return md; } @@ -657,7 +645,6 @@ static Class sogoAppointmentFolderKlass = Nil; NSDictionary *currentRecord; recordIndex = -1; - count = 0; max = [recordArray count]; while (recordIndex == -1 && count < max) @@ -729,6 +716,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir oldRecord = [ma objectAtIndex: recordIndex]; [newRecord setObject: [oldRecord objectForKey: @"c_recurrence_id"] forKey: @"c_recurrence_id"]; + [newRecord setObject: [fir startDate] forKey: @"cycleStartDate"]; [ma replaceObjectAtIndex: recordIndex withObject: newRecord]; } else @@ -742,11 +730,9 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir else { newRecord = [self fixupRecord: [component quickRecord]]; - newRecordRange = [NGCalendarDateRange calendarDateRangeWithStartDate: - [newRecord objectForKey: - @"startDate"] - endDate: [newRecord objectForKey: - @"endDate"]]; + newRecordRange = [NGCalendarDateRange + calendarDateRangeWithStartDate: [newRecord objectForKey: @"startDate"] + endDate: [newRecord objectForKey: @"endDate"]]; if ([dateRange doesIntersectWithDateRange: newRecordRange]) [ma addObject: newRecord]; } diff --git a/SoObjects/Appointments/SOGoCalendarComponent.m b/SoObjects/Appointments/SOGoCalendarComponent.m index ebf898b73..40da38218 100644 --- a/SoObjects/Appointments/SOGoCalendarComponent.m +++ b/SoObjects/Appointments/SOGoCalendarComponent.m @@ -249,7 +249,7 @@ _occurenceHasID (iCalRepeatableEntityObject *occurence, NSString *recID) recDate = [NSCalendarDate dateWithTimeIntervalSince1970: [recID intValue]]; masterOccurence = [self component: NO secure: NO]; - + if ([masterOccurence doesOccurOnDate: recDate]) { newOccurence = [masterOccurence mutableCopy]; diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index c91b3c3aa..f7b364c4e 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -34,6 +34,7 @@ #import #import #import +#import #import #import @@ -247,6 +248,50 @@ static NSArray *tasksFields = nil; forKey: @"c_title"]; } +- (void) _fixDates: (NSMutableDictionary *) aRecord +{ + NSCalendarDate *aDate, *aStartDate; + NSNumber *aDateValue; + NSString *aDateField; + signed int daylightOffset; + unsigned int count; + static NSString *fields[] = { @"startDate", @"c_startdate", + @"endDate", @"c_enddate" }; + + for (count = 0; count < 2; count++) + { + aDateField = fields[count * 2]; + aDate = [aRecord objectForKey: aDateField]; + if ([userTimeZone isDaylightSavingTimeForDate: aDate] != + [userTimeZone isDaylightSavingTimeForDate: startDate]) + { + daylightOffset = (signed int)[userTimeZone secondsFromGMTForDate: aDate] + - (signed int)[userTimeZone secondsFromGMTForDate: startDate]; + aDate = [aDate dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:daylightOffset]; + [aRecord setObject: aDate forKey: aDateField]; + aDateValue = [NSNumber numberWithInt: [aDate timeIntervalSince1970]]; + [aRecord setObject: aDateValue forKey: fields[count * 2 + 1]]; + } + } + + aDateValue = [aRecord objectForKey: @"c_recurrence_id"]; + aDate = [aRecord objectForKey: @"cycleStartDate"]; + aStartDate = [aRecord objectForKey: @"startDate"]; + if (aDateValue && aDate) + { + if ([userTimeZone isDaylightSavingTimeForDate: aStartDate] != + [userTimeZone isDaylightSavingTimeForDate: aDate]) + { + // For the event's recurrence id, compute the daylight saving time + // offset with respect to the first occurrence of the recurring event. + daylightOffset = (signed int)[userTimeZone secondsFromGMTForDate: aStartDate] + - (signed int)[userTimeZone secondsFromGMTForDate: aDate]; + aDateValue = [NSNumber numberWithInt: [aDateValue intValue] + daylightOffset]; + [aRecord setObject: aDateValue forKey: @"c_recurrence_id"]; + } + } +} + - (NSArray *) _fetchFields: (NSArray *) fields forComponentOfType: (NSString *) component { @@ -282,6 +327,9 @@ static NSArray *tasksFields = nil; forKey: @"c_owner"]; if (![[newInfo objectForKey: @"c_title"] length]) [self _fixComponentTitle: newInfo withType: component]; + // Possible improvement: only call _fixDates if event is recurrent + // or the view range span a daylight saving time change + [self _fixDates: newInfo]; [infos addObject: [newInfo objectsForKeys: fields notFoundMarker: marker]]; }