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];