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"]; 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/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]; 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: 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 */