diff --git a/ChangeLog b/ChangeLog index 4e45209ef..be41ab6aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2012-07-26 Wolfgang Sourdeau + + * OpenChange/iCalTimeZone+MAPIStore.[hm]: new category module. + (-asTimeZoneStructInMemCtx:): new method that returns a struct + TimeZoneStruct as a binary blob from an iCalTimeZone object. + + * OpenChange/MAPIStoreAppointmentWrapper.m + (-getPidLidTimeZoneStruct:inMemCtx:): new property getter that + returns the equivalent of the iCalTimeZone of the current event. + 2012-07-25 Wolfgang Sourdeau * OpenChange/MAPIStoreDBFolder.m (-createFolder:withFID:andKey:): diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index 03002e1c1..39fd7d826 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -127,6 +127,7 @@ $(SOGOBACKEND)_OBJC_FILES += \ NSValue+MAPIStore.m \ \ iCalEvent+MAPIStore.m \ + iCalTimeZone+MAPIStore.m \ \ GCSSpecialQueries+OpenChange.m\ \ diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index c6c707694..f545b443d 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -20,6 +20,8 @@ * Boston, MA 02111-1307, USA. */ +#include + #import #import #import @@ -29,6 +31,7 @@ #import #import #import +#import #import #import #import @@ -36,6 +39,7 @@ #import #import +#import "iCalTimeZone+MAPIStore.h" #import "MAPIStoreRecurrenceUtils.h" #import "MAPIStoreSamDBUtils.h" #import "MAPIStoreTypes.h" @@ -1584,4 +1588,22 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_ERR_NOT_FOUND; } +- (int) getPidLidTimeZoneStruct: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + enum mapistore_error rc; + iCalTimeZone *icalTZ; + + icalTZ = [(iCalDateTime *) [event firstChildWithTag: @"dtstart"] timeZone]; + if (icalTZ) + { + *data = [icalTZ asTimeZoneStructInMemCtx: memCtx]; + rc = MAPISTORE_SUCCESS; + } + else + rc = MAPISTORE_ERR_NOT_FOUND; + + return rc; +} + @end diff --git a/OpenChange/iCalTimeZone+MAPIStore.h b/OpenChange/iCalTimeZone+MAPIStore.h new file mode 100644 index 000000000..d476869c5 --- /dev/null +++ b/OpenChange/iCalTimeZone+MAPIStore.h @@ -0,0 +1,35 @@ +/* iCalTimeZone+MAPIStore.h - this file is part of SOGo + * + * Copyright (C) 2012 Inverse inc + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef ICALTIMEZONE_MAPISTORE_H +#define ICALTIMEZONE_MAPISTORE_H + +#import + +@interface iCalTimeZone (MAPIStoreProperties) + +- (struct Binary_r *) asTimeZoneStructInMemCtx: (TALLOC_CTX *) memCtx; + +@end + + +#endif /* ICALTIMEZONE_MAPISTORE_H */ diff --git a/OpenChange/iCalTimeZone+MAPIStore.m b/OpenChange/iCalTimeZone+MAPIStore.m new file mode 100644 index 000000000..d15447233 --- /dev/null +++ b/OpenChange/iCalTimeZone+MAPIStore.m @@ -0,0 +1,115 @@ +/* iCalTimeZone+MAPIStore.m - this file is part of SOGo + * + * Copyright (C) 2012 Inverse inc + * + * Author: Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import +#import +#import +#import +#import +#import + +#include +#include +#include +#undef DEBUG +#include + +#import "iCalTimeZone+MAPIStore.h" + +@interface iCalTimeZonePeriod (MAPIStorePropertiesPrivate) + +- (void) _fillTZDate: (struct SYSTEMTIME *) tzData; + +@end + +@implementation iCalTimeZonePeriod (MAPIStorePropertiesPrivate) + +- (void) _fillTZDate: (struct SYSTEMTIME *) tzData +{ + iCalRecurrenceRule *rrule; + NSArray *byMonth; + iCalByDayMask *mask; + NSCalendarDate *dateValue; + + rrule = [self recurrenceRule]; + byMonth = [rrule byMonth]; + if ([byMonth count] > 0) + { + tzData->wMonth = [[byMonth objectAtIndex: 0] intValue]; + mask = [rrule byDayMask]; + tzData->wDayOfWeek = [mask firstDay]; + tzData->wDay = [mask firstOccurrence]; + + dateValue = [self startDate]; + tzData->wHour = [dateValue hourOfDay]; + tzData->wMinute = [dateValue minuteOfHour]; + tzData->wSecond = [dateValue secondOfMinute]; + } +} + +@end + +@implementation iCalTimeZone (MAPIStoreProperties) + +- (iCalTimeZonePeriod *) _mostRecentPeriodWithName: (NSString *) periodName +{ + NSArray *periods; + iCalTimeZonePeriod *period; + NSUInteger max; + + periods = [self childrenWithTag: periodName]; + max = [periods count]; + if (max > 0) + { + periods = [periods sortedArrayUsingSelector: @selector (compare:)]; + period = (iCalTimeZonePeriod *) [periods objectAtIndex: (max - 1)]; + } + else + period = nil; + + return period; +} + +- (struct Binary_r *) asTimeZoneStructInMemCtx: (TALLOC_CTX *) memCtx +{ + iCalTimeZonePeriod *period; + struct TimeZoneStruct tz; + int lBias, dlBias; + + memset (&tz, 0, sizeof (struct TimeZoneStruct)); + period = [self _mostRecentPeriodWithName: @"STANDARD"]; + lBias = -[period secondsOffsetFromGMT] / 60; + tz.lBias = (uint32_t) lBias; + [period _fillTZDate: &tz.stStandardDate]; + period = [self _mostRecentPeriodWithName: @"DAYLIGHT"]; + if (!period) + tz.stStandardDate.wMonth = 0; + dlBias = -([period secondsOffsetFromGMT] / 60) - lBias; + tz.lDaylightBias = (uint32_t) (dlBias); + [period _fillTZDate: &tz.stDaylightDate]; + tz.wStandardYear = tz.stStandardDate.wYear; + tz.wDaylightYear = tz.stDaylightDate.wYear; + + return set_TimeZoneStruct (memCtx, &tz); +} + +@end