From 2dd37a51063e82ef01d55823bc832eae8e0144a8 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 8 Dec 2011 20:44:06 +0000 Subject: [PATCH] Monotone-Parent: 070ab5bab7996350566f161af861542e882b6ac8 Monotone-Revision: 706eb04192b3639905eba9bfb1e2433cacc45280 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-12-08T20:44:06 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 ++++ OpenChange/MAPIStoreFSMessageTable.m | 50 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/ChangeLog b/ChangeLog index 1378519ae..1deda3f7f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2011-12-08 Wolfgang Sourdeau + * OpenChange/MAPIStoreFSMessageTable.m + (-evaluatePropertyRestriction:intoQualifier:): interpret filtering + on PR_SUBJECT_UNICODE in order to include + PR_NORMALIZED_SUBJECT_UNICODE and PR_SUBJECT_PREFIX_UNICODE in the + search, as PR_SUBJECT_UNICODE might not actually exist on the FS + messages. + * OpenChange/MAPIStoreObject.m (-addPropertiesFromRow:): perform test on PT_STRING8 alone after "masking" the ulPropTag with 0xfff, since PT_XX values are not bitmasks. diff --git a/OpenChange/MAPIStoreFSMessageTable.m b/OpenChange/MAPIStoreFSMessageTable.m index 1c665c7a9..5a2e9f961 100644 --- a/OpenChange/MAPIStoreFSMessageTable.m +++ b/OpenChange/MAPIStoreFSMessageTable.m @@ -72,6 +72,56 @@ static Class MAPIStoreFSMessageK = Nil; [*qualifier autorelease]; rc = MAPIRestrictionStateNeedsEval; } + else if ((uint32_t) res->ulPropTag == PR_SUBJECT_UNICODE) + { + EOQualifier *subjectQualifier, *nSubjectQualifier, *subjectPQualifier; + EOQualifier *orQualifier, *andQualifier; + struct mapi_SPropertyRestriction subRes; + char *colPtr, *prefix; + + [super evaluatePropertyRestriction: res + intoQualifier: &subjectQualifier]; + + subRes.relop = res->relop; + subRes.ulPropTag = PR_NORMALIZED_SUBJECT_UNICODE; + subRes.lpProp.ulPropTag = PR_NORMALIZED_SUBJECT_UNICODE; + + colPtr = strstr (res->lpProp.value.lpszW, ":"); + if (colPtr) + subRes.lpProp.value.lpszW = colPtr + 1; + else + subRes.lpProp.value.lpszW = res->lpProp.value.lpszW; + + [self evaluatePropertyRestriction: &subRes + intoQualifier: &nSubjectQualifier]; + if (colPtr) + { + prefix = strndup (res->lpProp.value.lpszW, (colPtr - res->lpProp.value.lpszW)); + + subRes.relop = RELOP_EQ; + subRes.ulPropTag = PR_SUBJECT_PREFIX_UNICODE; + subRes.lpProp.ulPropTag = PR_SUBJECT_PREFIX_UNICODE; + subRes.lpProp.value.lpszW = prefix; + [self evaluatePropertyRestriction: &subRes + intoQualifier: &subjectPQualifier]; + free (prefix); + + andQualifier = [[EOOrQualifier alloc] + initWithQualifiers: + subjectPQualifier, nSubjectQualifier, nil]; + orQualifier = [[EOOrQualifier alloc] + initWithQualifiers: + subjectQualifier, andQualifier, nil]; + [andQualifier release]; + } + else + orQualifier = [[EOOrQualifier alloc] + initWithQualifiers: + subjectQualifier, nSubjectQualifier, nil]; + [orQualifier autorelease]; + *qualifier = orQualifier; + rc = MAPIRestrictionStateNeedsEval; + } else rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier];