From 56ad0c3289f94c2d753f35227d1721a8cd667a2b Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 12 Jan 2012 16:06:57 +0000 Subject: [PATCH] Monotone-Parent: d0b2cce64733874b10da170e30bdcb9f9730f61e Monotone-Revision: d807738c8f35c5080fb2e1684404fb8d992c8032 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-01-12T16:06:57 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 ++++ OpenChange/MAPIStoreAppointmentWrapper.m | 20 ++++++++--- OpenChange/MAPIStoreCalendarMessage.m | 42 +++++++++++++++++------- 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 032295ad3..7467c990d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2012-01-12 Wolfgang Sourdeau + * OpenChange/MAPIStoreCalendarMessage.m (-save): same as below + + ensure that nil fields are removed from non-new instances. + + * OpenChange/MAPIStoreAppointmentWrapper.m + (-getPrStartDate:inMemCtx:, -getPrEndDate:inMemCtx:): remove the + tz offset from dates in all-day events. + * OpenChange/MAPIStoreTasksMessage.m (-save): the dates provided by Outlook for start, due and completed are all-day dates, we thus need to remove the timezone offset from those dates. diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index c1f0e8b90..947e2119b 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -638,11 +638,19 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; + NSInteger offset; if ([event isRecurrent]) dateValue = [event firstRecurrenceStartDate]; else dateValue = [event startDate]; + if ([event isAllDay]) + { + offset = -[timeZone secondsFromGMTForDate: dateValue]; + dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: offset]; + } [dateValue setTimeZone: utcTZ]; *data = [dateValue asFileTimeInMemCtx: memCtx]; @@ -882,16 +890,18 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; + NSInteger offset; if ([event isRecurrent]) dateValue = [event firstRecurrenceStartDate]; else dateValue = [event startDate]; - dateValue - = [dateValue dateByAddingYears: 0 months: 0 days: 0 - hours: 0 minutes: 0 - seconds: (NSInteger) [event - durationAsTimeInterval]]; + offset = [event durationAsTimeInterval]; + if ([event isAllDay]) + offset -= [timeZone secondsFromGMTForDate: dateValue]; + dateValue = [dateValue dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: offset]; [dateValue setTimeZone: utcTZ]; *data = [dateValue asFileTimeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 263e60d30..aa46a8962 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -207,7 +207,8 @@ - (int) getPidLidAppointmentSubType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPidLidAppointmentSubType: data inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidLidAppointmentSubType: data + inMemCtx: memCtx]; } - (int) getPidLidBusyStatus: (void **) data // TODO @@ -653,6 +654,7 @@ iCalEvent *newEvent; iCalPerson *userPerson; NSUInteger responseStatus = 0; + NSInteger tzOffset; SOGoUser *activeUser, *ownerUser; id value; @@ -747,10 +749,11 @@ if (value) [newEvent setLocation: value]; - isAllDay = [[properties - objectForKey: MAPIPropertyKey (PidLidAppointmentSubType)] - boolValue]; - + isAllDay = [newEvent isAllDay]; + value = [properties + objectForKey: MAPIPropertyKey (PidLidAppointmentSubType)]; + if (value) + isAllDay = [value boolValue]; if (!isAllDay) { tzName = [[self ownerTimeZone] name]; @@ -767,7 +770,14 @@ { start = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtstart"]; if (isAllDay) - [start setDate: value]; + { + tzOffset = [[value timeZone] secondsFromGMTForDate: value]; + value = [value dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: -tzOffset]; + [start setTimeZone: nil]; + [start setDate: value]; + } else { [start setTimeZone: tz]; @@ -776,14 +786,21 @@ } /* end */ - value = [properties objectForKey: MAPIPropertyKey(PR_END_DATE)]; + value = [properties objectForKey: MAPIPropertyKey (PR_END_DATE)]; if (!value) - value = [properties objectForKey: MAPIPropertyKey(PidLidAppointmentEndWhole)]; + value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentEndWhole)]; if (value) { end = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtend"]; if (isAllDay) - [end setDate: value]; + { + tzOffset = [[value timeZone] secondsFromGMTForDate: value]; + value = [value dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: -tzOffset]; + [end setTimeZone: nil]; + [end setDate: value]; + } else { [end setTimeZone: tz]; @@ -840,13 +857,14 @@ if (value) { value = [[NSString alloc] initWithData: value - encoding: NSUTF8StringEncoding]; + encoding: NSUTF8StringEncoding]; [value autorelease]; value = [value htmlToText]; } } - if (value) - [newEvent setComment: value]; + if (value && [value length] == 0) + value = nil; + [newEvent setComment: value]; /* recurrence */ value = [properties