From d3a4b497c69c39de6130cd5861d0f43e5a91614e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Sun, 15 Feb 2015 18:34:28 +0100 Subject: [PATCH 1/5] oc-calendar: Remove commented code Available at MAPIStoreAppointmentWrapper class --- OpenChange/MAPIStoreCalendarMessage.m | 79 --------------------------- 1 file changed, 79 deletions(-) diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index de89eb487..bc4b33136 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -333,85 +333,6 @@ static Class NSArrayK; *dataPtr = msgData; } -/* sender representing */ -// - (int) getPidTagSentRepresentingEmailAddress: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; -// } - -// - (int) getPidTagSentRepresentingAddressType: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [self getSMTPAddrType: data inMemCtx: memCtx]; -// } - -// - (int) getPidTagSentRepresentingName: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [self getPidTagSenderName: data inMemCtx: memCtx]; -// } - -// - (int) getPidTagSentRepresentingEntryId: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; -// } - -/* attendee */ -// - (int) getPidTagReceivedByAddressType: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [appointmentWrapper getPidTagReceivedByAddressType: data -// inMemCtx: memCtx]; -// } - -// - (int) getPidTagReceivedByEmailAddress: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [appointmentWrapper getPidTagReceivedByEmailAddress: data -// inMemCtx: memCtx]; -// } - -// - (int) getPidTagReceivedByName: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [appointmentWrapper getPidTagReceivedByName: data -// inMemCtx: memCtx]; -// } - -// - (int) getPidTagReceivedByEntryId: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [appointmentWrapper getPidTagReceivedByEntryId: data -// inMemCtx: memCtx]; -// } - -// /* attendee representing */ -// - (int) getPidTagReceivedRepresentingEmailAddress: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [self getPidTagReceivedByEmailAddress: data inMemCtx: memCtx]; -// } - -// - (int) getPidTagReceivedRepresentingAddressType: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [self getSMTPAddrType: data inMemCtx: memCtx]; -// } - -// - (int) getPidTagReceivedRepresentingName: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [self getPidTagReceivedByName: data inMemCtx: memCtx]; -// } - -// - (int) getPidTagReceivedRepresentingEntryId: (void **) data -// inMemCtx: (TALLOC_CTX *) memCtx -// { -// return [self getPidTagReceivedByEntryId: data inMemCtx: memCtx]; -// } - - (int) getPidTagResponseRequested: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { From eaec3c061074ff7bf42bc54569acb8f066243a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Sun, 15 Feb 2015 18:38:59 +0100 Subject: [PATCH 2/5] oc-calendar: Remove useless method Better off implemented by AppointmentWrapper proxy --- OpenChange/MAPIStoreCalendarMessage.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index bc4b33136..53de64b51 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -206,10 +206,7 @@ static Class NSArrayK; } /* getters */ -- (int) getPidLidFInvited: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx { - return [self getYes: data inMemCtx: memCtx]; } - (int) getPidTagMessageClass: (void **) data From 2a1b363feedf77f1bcc1c848d8468d93817d7023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Sun, 15 Feb 2015 18:39:43 +0100 Subject: [PATCH 3/5] oc-calendar: Proper getter for AppointmentWrapper proxy object Do not assume it is in 0 position any longer --- OpenChange/MAPIStoreCalendarMessage.m | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 53de64b51..b5d65678c 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -81,7 +81,7 @@ // extern void ndr_print_AppointmentRecurrencePattern(struct ndr_print *ndr, const char *name, const struct AppointmentRecurrencePattern *r); -static Class NSArrayK; +static Class NSArrayK, MAPIStoreAppointmentWrapperK; @implementation SOGoAppointmentObject (MAPIStoreExtension) @@ -97,6 +97,7 @@ static Class NSArrayK; + (void) initialize { NSArrayK = [NSArray class]; + MAPIStoreAppointmentWrapperK = [MAPIStoreAppointmentWrapper class]; } + (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP @@ -205,10 +206,23 @@ static Class NSArrayK; [super dealloc]; } -/* getters */ +- (MAPIStoreAppointmentWrapper *) _appointmentWrapper { + NSUInteger i, max; + id proxy; + max = [proxies count]; + for (i = 0; i < max; i++) { + proxy = [proxies objectAtIndex: i]; + if ([proxy isKindOfClass: MAPIStoreAppointmentWrapperK]) + { + return proxy; + } + } + return nil; } + +/* getters */ - (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { @@ -321,10 +335,8 @@ static Class NSArrayK; } else { - /* HACK: we know the first (and only) proxy is our appointment wrapper - instance, but this might not always be true */ - [[proxies objectAtIndex: 0] fillMessageData: msgData - inMemCtx: memCtx]; + [[self _appointmentWrapper] fillMessageData: msgData + inMemCtx: memCtx]; } *dataPtr = msgData; From e6ba15bbae0633bf4a8bbd327a1578217cb2128f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Sun, 15 Feb 2015 18:41:03 +0100 Subject: [PATCH 4/5] oc-calendar: PidTagImportance and PidTagNormalizedSubject working It wasn't being called because the proxy (AppointmentWrapper) is not being called as there is a base implementation for these properties in MAPIStoreMessage making them impossible to be shared between Outlook profiles. --- OpenChange/MAPIStoreCalendarMessage.m | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index b5d65678c..73684df3d 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -348,6 +348,38 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; return [self getYes: data inMemCtx: memCtx]; } +/* This three methods: getPidTagNormalizedSubject, + getPidTagSensitivity and getPidTagImportance are implemented in + MAPIStoreMessage base class, then the proxy method is not reached + (see MAPIStoreObject). +*/ +- (int) getPidTagNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + MAPIStoreAppointmentWrapper *appointmentWrapper; + + appointmentWrapper = [self _appointmentWrapper]; + if (appointmentWrapper) + return [appointmentWrapper getPidTagNormalizedSubject: data inMemCtx: memCtx]; + + return MAPISTORE_ERR_NOT_FOUND; +} + +- (int) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + MAPIStoreAppointmentWrapper *appointmentWrapper; + + appointmentWrapper = [self _appointmentWrapper]; + if (appointmentWrapper) + return [appointmentWrapper getPidTagImportance: data inMemCtx: memCtx]; + + *data = MAPILongValue (memCtx, 1); + + return MAPISTORE_SUCCESS; +} + + - (NSString *) _uidFromGlobalObjectId: (TALLOC_CTX *) memCtx { NSData *objectId; From 624967c60b5d4c2bb23051f6995e323163f0c12d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20J=2E=20Hern=C3=A1ndez=20Blasco?= Date: Sun, 15 Feb 2015 18:44:47 +0100 Subject: [PATCH 5/5] oc-calendar: Implement PidTagSensitivity As described in [MS-OXCICAL] Section 2.1.3.11.20.4 by using access CLASS iCal field. Although Outlook does not support confidential level, it is properly exported and imported. --- OpenChange/MAPIStoreAppointmentWrapper.m | 26 +++++++++++++++++++++--- OpenChange/MAPIStoreCalendarMessage.m | 12 +++++++++++ OpenChange/MAPIStoreMessage.m | 2 +- OpenChange/iCalEvent+MAPIStore.m | 26 +++++++++++++++++++++++- 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index c6fc58c8a..3f3708915 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -1200,11 +1200,31 @@ static NSCharacterSet *hexCharacterSet = nil; return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS +- (int) getPidTagSensitivity: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - // normal = 0, personal?? = 1, private = 2, confidential = 3 - return [self getLongZero: data inMemCtx: memCtx]; + /* See [MS-OXCICAL] Section 2.1.3.11.20.4 */ + uint32_t v; + NSString *accessClass; + + accessClass = [event accessClass]; + if (accessClass) + { + if ([accessClass isEqualToString: @"X-PERSONAL"]) + v = 0x1; + else if ([accessClass isEqualToString: @"PRIVATE"]) + v = 0x2; + else if ([accessClass isEqualToString: @"CONFIDENTIAL"]) + v = 0x3; + else + v = 0x0; /* PUBLIC */ + } + else + v = 0x0; /* PUBLIC */ + + *data = MAPILongValue (memCtx, v); + + return MAPISTORE_SUCCESS; } - (int) getPidTagImportance: (void **) data diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 73684df3d..290a50bcd 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -365,6 +365,18 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; return MAPISTORE_ERR_NOT_FOUND; } +- (int) getPidTagSensitivity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + MAPIStoreAppointmentWrapper *appointmentWrapper; + + appointmentWrapper = [self _appointmentWrapper]; + if (appointmentWrapper) + return [appointmentWrapper getPidTagSensitivity: data inMemCtx: memCtx]; + + return [self getLongZero: data inMemCtx: memCtx]; +} + - (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index 2c5707158..e922d4a18 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -784,7 +784,7 @@ rtf2html (NSData *compressedRTF) return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagSensitivity: (void **) data // TODO -> subclass in calendar +- (int) getPidTagSensitivity: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; diff --git a/OpenChange/iCalEvent+MAPIStore.m b/OpenChange/iCalEvent+MAPIStore.m index c5c70a686..1c94b8ee3 100644 --- a/OpenChange/iCalEvent+MAPIStore.m +++ b/OpenChange/iCalEvent+MAPIStore.m @@ -140,7 +140,7 @@ iCalDateTime *start, *end; iCalTimeZone *tz; NSTimeZone *userTimeZone; - NSString *priority; + NSString *priority, *class = nil; NSUInteger responseStatus = 0; NSInteger tzOffset; SOGoUser *ownerUser; @@ -281,6 +281,30 @@ priority = @"0"; // None [self setPriority: priority]; + /* class */ + /* See [MS-OXCICAL] Section 2.1.3.11.20.4 */ + value = [properties objectForKey: MAPIPropertyKey(PR_SENSITIVITY)]; + if (value) + { + switch ([value intValue]) + { + case 1: + class = @"X-PERSONAL"; + break; + case 2: + class = @"PRIVATE"; + break; + case 3: + class = @"CONFIDENTIAL"; + break; + default: /* 0 as well */ + class = @"PUBLIC"; + } + } + + if (class) + [self setAccessClass: class]; + /* show time as free/busy/tentative/out of office. Possible values are: 0x00000000 - olFree 0x00000001 - olTentative