From d5d97db8e8d64ddbc0797325ce023723fd1227bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Fri, 16 Jan 2015 00:02:01 +0100 Subject: [PATCH 1/4] oc: PT_SYSTIME is an absolute timestamp As the epoch is in UTC timezone, we set this timezone for NSCalendarDate. --- OpenChange/MAPIStoreObject.m | 16 ---------------- OpenChange/MAPIStoreTypes.m | 1 + 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index 1c4b26be4..ecb00dba3 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -23,7 +23,6 @@ #import #import #import -#import #import #import #import @@ -245,13 +244,8 @@ static Class NSExceptionK, MAPIStoreFolderK; struct SPropValue *cValue; NSUInteger counter; NSMutableDictionary *newProperties; - NSTimeZone *tz; - NSInteger tzOffset; id value; - tz = nil; - tzOffset = 0; - newProperties = [NSMutableDictionary dictionaryWithCapacity: aRow->cValues]; for (counter = 0; counter < aRow->cValues; counter++) { @@ -268,16 +262,6 @@ static Class NSExceptionK, MAPIStoreFolderK; @"attempting to set string property as PR_STRING8: %.8x", cValue->ulPropTag]; break; - case PT_SYSTIME: - if (!tz) - { - tz = [[self userContext] timeZone]; - tzOffset = -[tz secondsFromGMT]; - } - value = [value addYear: 0 month: 0 day: 0 - hour: 0 minute: 0 second: tzOffset]; - [value setTimeZone: tz]; - break; } [newProperties setObject: value forKey: MAPIPropertyKey (cValue->ulPropTag)]; diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m index 01b650463..76e72c5d6 100644 --- a/OpenChange/MAPIStoreTypes.m +++ b/OpenChange/MAPIStoreTypes.m @@ -119,6 +119,7 @@ NSObjectFromMAPISPropValue (const struct mapi_SPropValue *value) break; case PT_SYSTIME: result = [NSCalendarDate dateFromFileTime: &(value->value.ft)]; + [result setTimeZone: utcTZ]; break; case PT_BINARY: case PT_SVREID: From c6b976a83077b94b043d38b4e1bb7c16ccbc1898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Fri, 16 Jan 2015 00:06:11 +0100 Subject: [PATCH 2/4] oc-mail: Remove unnecessary time shift in date for new mails The MIME type can store the date in UTC and the clients are responsible on showing correctly to the client as it does. --- OpenChange/MAPIStoreMailVolatileMessage.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index 55d62309e..6c340a721 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -29,7 +29,6 @@ #import #import #import -#import #import #import #import @@ -673,8 +672,6 @@ FillMessageHeadersFromProperties (NGMutableHashMap *headers, date = [mailProperties objectForKey: MAPIPropertyKey (PR_CLIENT_SUBMIT_TIME)]; if (date) { - date = [date addYear: 0 month: 0 day: 0 - hour: 0 minute: 0 second: [[date timeZone] secondsFromGMT]]; [headers addObject: [date rfc822DateString] forKey: @"date"]; } [headers addObject: @"1.0" forKey: @"MIME-Version"]; From c893963da592bc56d0d95b7c18e7085907a9fdeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Fri, 16 Jan 2015 00:09:01 +0100 Subject: [PATCH 3/4] oc-tasks: Set right start, due and complete dates As explained in [MS-OXOTASK], we have to shift the given date to store the right point in time with the correct timezone. --- OpenChange/MAPIStoreTasksMessage.m | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index 9215bc409..20bf67f8b 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -367,13 +367,15 @@ NSString *status, *priority, *tzName; NSCalendarDate *now; NSInteger tzOffset; + NSTimeZone *userTZ; double doubleValue; vToDo = [sogoObject component: YES secure: NO]; vCalendar = [vToDo parent]; [vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"]; - tzName = [[[self userContext] timeZone] name]; + userTZ = [[self userContext] timeZone]; + tzName = [userTZ name]; tz = [iCalTimeZone timeZoneForName: tzName]; [vCalendar addTimeZone: tz]; @@ -428,6 +430,13 @@ { date = (iCalDateTime *) [vToDo uniqueChildWithTag: @"dtstart"]; [date setTimeZone: tz]; + /* The property is set to user's local time zone. + See: [MS-OXOTASK] 2.2.2.2.4 + TODO: Ignore when the PT_SYSTIME is 0x5AE980E0*/ + tzOffset = [userTZ secondsFromGMTForDate: value]; + value = [value dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: -tzOffset]; [date setDateTime: value]; } @@ -437,6 +446,13 @@ { date = (iCalDateTime *) [vToDo uniqueChildWithTag: @"due"]; [date setTimeZone: tz]; + /* The property is set to user's local time zone. + See: [MS-OXOTASK] 2.2.2.2.5 + TODO: Ignore when the PT_SYSTIME is 0x5AE980E0*/ + tzOffset = [userTZ secondsFromGMTForDate: value]; + value = [value dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: -tzOffset]; [date setDateTime: value]; } @@ -445,7 +461,9 @@ if (value) { date = (iCalDateTime *) [vToDo uniqueChildWithTag: @"completed"]; - tzOffset = [[value timeZone] secondsFromGMTForDate: value]; + /* The property is set to midnight in local time zone converted to UTC: + See: [MS-OXOTASK] 2.2.2.2.9 */ + tzOffset = [userTZ secondsFromGMTForDate: value]; value = [value dateByAddingYears: 0 months: 0 days: 0 hours: 0 minutes: 0 seconds: -tzOffset]; From 8b44c08a32375b8386b24d518e3fdc0b906ec3cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Fri, 16 Jan 2015 00:12:24 +0100 Subject: [PATCH 4/4] oc-calendar: Remove unnecessary shifts on start,end and replace time props As the data is sent in UTC, no shifts are longer required. --- OpenChange/iCalEvent+MAPIStore.m | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/OpenChange/iCalEvent+MAPIStore.m b/OpenChange/iCalEvent+MAPIStore.m index 40eb0c0ef..c5c70a686 100644 --- a/OpenChange/iCalEvent+MAPIStore.m +++ b/OpenChange/iCalEvent+MAPIStore.m @@ -207,16 +207,7 @@ value = [properties objectForKey: MAPIPropertyKey (PidLidExceptionReplaceTime)]; if (value) - { - if (!isAllDay) - { - tzOffset = [userTimeZone secondsFromGMTForDate: value]; - value = [value dateByAddingYears: 0 months: 0 days: 0 - hours: 0 minutes: 0 - seconds: tzOffset]; - } - [self setRecurrenceId: value]; - } + [self setRecurrenceId: value]; // start value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentStartWhole)]; @@ -241,13 +232,7 @@ [start setTimeZone: nil]; } else - { - tzOffset = [userTimeZone secondsFromGMTForDate: value]; - value = [value dateByAddingYears: 0 months: 0 days: 0 - hours: 0 minutes: 0 - seconds: tzOffset]; [start setDateTime: value]; - } } /* end */ @@ -273,13 +258,7 @@ [end setTimeZone: nil]; } else - { - tzOffset = [[value timeZone] secondsFromGMTForDate: value]; - value = [value dateByAddingYears: 0 months: 0 days: 0 - hours: 0 minutes: 0 - seconds: tzOffset]; [end setDateTime: value]; - } } /* priority */