diff --git a/OpenChange/iCalTimeZone+MAPIStore.h b/OpenChange/iCalTimeZone+MAPIStore.h index d476869c5..76b0a00a2 100644 --- a/OpenChange/iCalTimeZone+MAPIStore.h +++ b/OpenChange/iCalTimeZone+MAPIStore.h @@ -28,6 +28,8 @@ @interface iCalTimeZone (MAPIStoreProperties) - (struct Binary_r *) asTimeZoneStructInMemCtx: (TALLOC_CTX *) memCtx; +- (struct Binary_r *) asZoneTimeDefinitionWithFlags: (enum TZRuleFlag) flags + inMemCtx: (TALLOC_CTX *) memCtx; @end diff --git a/OpenChange/iCalTimeZone+MAPIStore.m b/OpenChange/iCalTimeZone+MAPIStore.m index d15447233..8e9bf7c14 100644 --- a/OpenChange/iCalTimeZone+MAPIStore.m +++ b/OpenChange/iCalTimeZone+MAPIStore.m @@ -27,6 +27,8 @@ #import #import +#import "NSString+MAPIStore.h" + #include #include #include @@ -112,4 +114,49 @@ return set_TimeZoneStruct (memCtx, &tz); } +- (struct Binary_r *) asZoneTimeDefinitionWithFlags: (enum TZRuleFlag) flags + inMemCtx: (TALLOC_CTX *) memCtx +{ + iCalTimeZonePeriod *period; + struct TimeZoneDefinition definition; + struct TZRule rule; + NSString *tzId; + int lBias, dlBias; + + memset (&definition, 0, sizeof (struct TimeZoneDefinition)); + + definition.major = 0x02; + definition.minor = 0x01; + definition.reserved = 0x0002; + + tzId = [self tzId]; + definition.keyName = [tzId asUnicodeInMemCtx: memCtx]; + definition.cbHeader = 6 + [tzId length] * 2; + + definition.cRules = 1; + definition.TZRules = &rule; + + memset (&rule, 0, sizeof (struct TZRule)); + rule.major = 0x02; + rule.minor = 0x01; + rule.reserved = 0x003e; + rule.flags = flags; + + period = [self _mostRecentPeriodWithName: @"STANDARD"]; + rule.wYear = [[period startDate] yearOfCommonEra]; + lBias = -[period secondsOffsetFromGMT] / 60; + rule.lBias = (uint32_t) lBias; + [period _fillTZDate: &rule.stStandardDate]; + period = [self _mostRecentPeriodWithName: @"DAYLIGHT"]; + if (!period) + rule.stStandardDate.wMonth = 0; + dlBias = -([period secondsOffsetFromGMT] / 60) - lBias; + rule.lDaylightBias = (uint32_t) (dlBias); + [period _fillTZDate: &rule.stDaylightDate]; + + + return set_TimeZoneDefinition (memCtx, &definition); +} + + @end