diff --git a/ChangeLog b/ChangeLog index a97a28c2d..7dd27b4ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-08-08 Wolfgang Sourdeau + * OpenChange/MAPIStoreCalendarMessageTable.m + (-evaluatePropertyRestriction:intoQualifier:): implemented + searches on PR_OWNER_APPT_ID in order to enable the retrieval of + the requested invitation. + * OpenChange/MAPIStoreCalendarMessage.m (-save): fixed attendees handling (only change the attendee partstat) and avoid saving the event when the newpartstat is "undefined". diff --git a/OpenChange/MAPIStoreCalendarMessageTable.m b/OpenChange/MAPIStoreCalendarMessageTable.m index eece603d9..6d897b772 100644 --- a/OpenChange/MAPIStoreCalendarMessageTable.m +++ b/OpenChange/MAPIStoreCalendarMessageTable.m @@ -21,6 +21,7 @@ */ #import +#import #import #import @@ -50,11 +51,49 @@ static Class MAPIStoreCalendarMessageK = Nil; return MAPIStoreCalendarMessageK; } +- (EOQualifier *) _orgMailNotNullQualifier +{ + static EOQualifier *orgMailQualifier = nil; + EOQualifier *notNullQualifier, *nullQualifier, *notEmptyQualifier, *emptyQualifier; + + if (!orgMailQualifier) + { + nullQualifier = [[EOKeyValueQualifier alloc] + initWithKey: @"c_orgmail" + operatorSelector: EOQualifierOperatorEqual + value: [NSNull null]]; + notNullQualifier = [[EONotQualifier alloc] + initWithQualifier: nullQualifier]; + emptyQualifier = [[EOKeyValueQualifier alloc] + initWithKey: @"c_orgmail" + operatorSelector: EOQualifierOperatorEqual + value: @""]; + notEmptyQualifier = [[EONotQualifier alloc] + initWithQualifier: emptyQualifier]; + orgMailQualifier = [[EOAndQualifier alloc] + initWithQualifiers: notNullQualifier, + notEmptyQualifier, nil]; + [nullQualifier release]; + [notNullQualifier release]; + [emptyQualifier release]; + [notEmptyQualifier release]; + } + + return orgMailQualifier; +} + - (MAPIRestrictionState) evaluatePropertyRestriction: (struct mapi_SPropertyRestriction *) res intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; id value; + NSMutableString *likeString; + NSString *likePartString; + EOAndQualifier *andQualifier, *stringQualifier; + union { + uint32_t longValue; + char charValue[4]; + } apptIdValue; value = NSObjectFromMAPISPropValue (&res->lpProp); switch ((uint32_t) res->ulPropTag) @@ -66,7 +105,33 @@ static Class MAPIStoreCalendarMessageK = Nil; rc = MAPIRestrictionStateAlwaysFalse; break; case PR_OWNER_APPT_ID: - rc = MAPIRestrictionStateAlwaysFalse; + // c_orgmail != NULL && c_orgmail != '' && c_uid like 'ab%89'; + apptIdValue.longValue = [value unsignedLongValue]; + likeString = [NSMutableString string]; + likePartString = [[NSString alloc] + initWithBytes: apptIdValue.charValue + length: 2 + encoding: NSISOLatin1StringEncoding]; + [likeString appendString: likePartString]; + [likePartString release]; + [likeString appendString: @"%%"]; + likePartString = [[NSString alloc] + initWithBytes: apptIdValue.charValue + 2 + length: 2 + encoding: NSISOLatin1StringEncoding]; + [likeString appendString: likePartString]; + [likePartString release]; + stringQualifier = [[EOKeyValueQualifier alloc] + initWithKey: @"c_uid" + operatorSelector: EOQualifierOperatorLike + value: likeString]; + andQualifier = [[EOAndQualifier alloc] + initWithQualifiers: [self _orgMailNotNullQualifier], + stringQualifier, nil]; + [andQualifier autorelease]; + [stringQualifier release]; + *qualifier = andQualifier; + rc = MAPIRestrictionStateNeedsEval; break; case PidLidBusyStatus: rc = MAPIRestrictionStateAlwaysTrue; // should be based on c_isopaque @@ -115,6 +180,8 @@ static Class MAPIStoreCalendarMessageK = Nil; forKey: MAPIPropertyKey (PidLidAppointmentSubType)]; [knownProperties setObject: @"c_creationdate" forKey: MAPIPropertyKey (PR_CREATION_TIME)]; + [knownProperties setObject: @"c_uid" + forKey: MAPIPropertyKey (PR_OWNER_APPT_ID)]; } return [knownProperties objectForKey: MAPIPropertyKey (property)];