From c12e7cdd20c96f2d211e196c2c5b63d6b8b1a361 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 2 Aug 2011 18:56:17 +0000 Subject: [PATCH] Monotone-Parent: 8e14613f7e0332410a0bb4de6eea4181b3432372 Monotone-Revision: 98421a1eccc93a8048d8f3c640bc4cf0e6743764 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-08-02T18:56:17 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 10 ++- OpenChange/MAPIStoreContactsMessageTable.m | 94 +++++++++++++++++++++- 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index d98dac749..8d8a67296 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,15 @@ 2011-08-02 Wolfgang Sourdeau + * OpenChange/MAPIStoreContactsMessageTable.m + (-evaluateContentRestriction:intoQualifier:): overriden method in + order to evaluate PR_MESSAGE_CLASS_UNICODE. + (-evaluatePropertyRestriction:intoQualifier:): added stub support for + PidLidAddressBookProviderArrayType, + PidLidAddressBookProviderEmailList and real support for + PidLidEmail[123]OriginalDisplayName. + * OpenChange/MAPIStoreTable.m (-operatorFromRestrictionOperator): - code split from evaluatePropertyRestriction:intoQualifier: and + code split from -evaluatePropertyRestriction:intoQualifier: and exposed for external use. 2011-08-01 Wolfgang Sourdeau diff --git a/OpenChange/MAPIStoreContactsMessageTable.m b/OpenChange/MAPIStoreContactsMessageTable.m index 95c9fd023..60e95a968 100644 --- a/OpenChange/MAPIStoreContactsMessageTable.m +++ b/OpenChange/MAPIStoreContactsMessageTable.m @@ -20,11 +20,14 @@ * Boston, MA 02111-1307, USA. */ +#import #import +#import #import #import - +#import +#import #import #import @@ -41,13 +44,16 @@ #include -static Class MAPIStoreContactsMessageK; +static Class MAPIStoreContactsMessageK, NGMailAddressK, NSDataK, NSStringK; @implementation MAPIStoreContactsMessageTable + (void) initialize { MAPIStoreContactsMessageK = [MAPIStoreContactsMessage class]; + NSDataK = [NSData class]; + NSStringK = [NSString class]; + NGMailAddressK = [NGMailAddress class]; } + (Class) childObjectClass @@ -83,7 +89,11 @@ static Class MAPIStoreContactsMessageK; intoQualifier: (EOQualifier **) qualifier { MAPIRestrictionState rc; - id value; + EOAndQualifier *andQualifier; + EOKeyValueQualifier *fullNameQualifier, *emailQualifier; + NSString *fullName, *email; + SEL operator; + id value, ngAddress; value = NSObjectFromMAPISPropValue (&res->lpProp); switch ((uint32_t) res->ulPropTag) @@ -94,6 +104,51 @@ static Class MAPIStoreContactsMessageK; else rc = MAPIRestrictionStateAlwaysFalse; break; + + case PidLidAddressBookProviderArrayType: + case PidLidAddressBookProviderEmailList: + /* FIXME: this is a hack. We should return a real qualifier here */ + rc = MAPIRestrictionStateAlwaysTrue; + break; + + case PidLidEmail1OriginalDisplayName: + case PidLidEmail2OriginalDisplayName: + case PidLidEmail3OriginalDisplayName: + rc = MAPIRestrictionStateAlwaysFalse; + value = NSObjectFromMAPISPropValue (&res->lpProp); + if (value && [value isKindOfClass: NSStringK]) + { + rc = MAPIRestrictionStateNeedsEval; + ngAddress = [[NGMailAddressParser mailAddressParserWithString: value] + parse]; + if ([ngAddress isKindOfClass: NGMailAddressK]) + { + operator = [self operatorFromRestrictionOperator: res->relop]; + fullName = [ngAddress displayName]; + email = [ngAddress address]; + emailQualifier = [[EOKeyValueQualifier alloc] + initWithKey: @"c_mail" + operatorSelector: operator + value: email]; + if ([fullName length] > 0) + { + fullNameQualifier = [[EOKeyValueQualifier alloc] + initWithKey: @"c_cn" + operatorSelector: operator + value: fullName]; + andQualifier = [[EOAndQualifier alloc] + initWithQualifiers: + emailQualifier, fullNameQualifier, nil]; + [fullNameQualifier release]; + [emailQualifier release]; + *qualifier = andQualifier; + } + else + *qualifier = emailQualifier; + [*qualifier autorelease]; + } + } + break; case PidLidEmail1AddressType: case PidLidEmail2AddressType: case PidLidEmail3AddressType: @@ -110,6 +165,39 @@ static Class MAPIStoreContactsMessageK; return rc; } +- (MAPIRestrictionState) evaluateContentRestriction: (struct mapi_SContentRestriction *) res + intoQualifier: (EOQualifier **) qualifier +{ + MAPIRestrictionState rc; + id value; + + value = NSObjectFromMAPISPropValue (&res->lpProp); + if ([value isKindOfClass: NSDataK]) + { + value = [[NSString alloc] initWithData: value + encoding: NSUTF8StringEncoding]; + [value autorelease]; + } + else if (![value isKindOfClass: NSStringK]) + [NSException raise: @"MAPIStoreTypeConversionException" + format: @"unhandled content restriction for class '%@'", + NSStringFromClass ([value class])]; + + switch (res->ulPropTag) + { + case PR_MESSAGE_CLASS_UNICODE: /* FIXME: should make use of c_component here */ + if ([value isEqualToString: @"IPM.Contact"]) + rc = MAPIRestrictionStateAlwaysTrue; + else + rc = MAPIRestrictionStateAlwaysFalse; + break; + default: + rc = [super evaluateContentRestriction: res intoQualifier: qualifier]; + } + + return rc; +} + /* sorting */ - (NSString *) sortIdentifierForProperty: (enum MAPITAGS) property