diff --git a/ChangeLog b/ChangeLog index 222e23cfe..19444f447 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-02-11 Wolfgang Sourdeau + + * OpenChange/MAPIStoreGCSMessageTable.m (-setSordOrder:): + implemented overriden method, making use of the new + "sortIdentifierForProperty:" subclass method for the mapping of + sort fields and SQL fields. + 2011-02-10 Wolfgang Sourdeau * OpenChange/MAPIStoreContactsMessageTable.m diff --git a/OpenChange/MAPIStoreGCSMessageTable.h b/OpenChange/MAPIStoreGCSMessageTable.h index 15498aecb..e26a41252 100644 --- a/OpenChange/MAPIStoreGCSMessageTable.h +++ b/OpenChange/MAPIStoreGCSMessageTable.h @@ -28,8 +28,12 @@ @class EOQualifier; @interface MAPIStoreGCSMessageTable : MAPIStoreMessageTable +{ + NSMutableArray *sortOrderings; +} - (EOQualifier *) componentQualifier; +- (NSString *) sortIdentifierForProperty: (enum MAPITAGS) property; @end diff --git a/OpenChange/MAPIStoreGCSMessageTable.m b/OpenChange/MAPIStoreGCSMessageTable.m index 64e48e898..5f0234bf9 100644 --- a/OpenChange/MAPIStoreGCSMessageTable.m +++ b/OpenChange/MAPIStoreGCSMessageTable.m @@ -21,9 +21,14 @@ */ #import +#import #import +#import + +#import #import +#import #import #import @@ -34,17 +39,33 @@ #import "MAPIStoreGCSMessageTable.h" #undef DEBUG -#include -#include -#include +#include @implementation MAPIStoreGCSMessageTable +- (id) init +{ + if ((self = [super init])) + { + sortOrderings = nil; + } + + return self; +} + +- (void) dealloc +{ + [sortOrderings release]; + [super dealloc]; +} + - (NSArray *) _childKeysUsingRestrictions: (BOOL) useRestrictions { static NSArray *fields = nil; NSArray *records; EOQualifier *componentQualifier, *fetchQualifier; + GCSFolder *ocsFolder; + EOFetchSpecification *fs; NSArray *keys; if (!fields) @@ -73,8 +94,12 @@ if (fetchQualifier) { - records = [[folder ocsFolder] fetchFields: fields - matchingQualifier: fetchQualifier]; + ocsFolder = [folder ocsFolder]; + fs = [EOFetchSpecification + fetchSpecificationWithEntityName: [ocsFolder folderName] + qualifier: fetchQualifier + sortOrderings: sortOrderings]; + records = [ocsFolder fetchFields: fields fetchSpecification: fs]; keys = [records objectsForKey: @"c_name" notFoundMarker: nil]; } @@ -118,7 +143,7 @@ MAPIRestrictionState rc; if ((res->ulPropTag & 0x0040) == 0x0040) /* is date ? */ - rc = [self evaluateDatePropertyRestriction: (struct mapi_SPropertyRestriction *) res + rc = [self evaluateDatePropertyRestriction: res intoQualifier: qualifier]; else rc = [super evaluatePropertyRestriction: res intoQualifier: qualifier]; @@ -133,4 +158,97 @@ return nil; } +/* sorting */ + +- (NSString *) sortIdentifierForProperty: (enum MAPITAGS) property +{ + [self subclassResponsibility: _cmd]; + + return nil; +} + +- (EOSortOrdering *) _sortOrderingFromSortOrder: (struct SSortOrder *) sortOrder +{ + EOSortOrdering *newSortOrdering; + NSString *sortIdentifier; + SEL orderSelector; + const char *propName; + + sortIdentifier = [self sortIdentifierForProperty: sortOrder->ulPropTag]; + if (sortIdentifier) + { + if ((sortOrder->ulPropTag & 0xffff) == PT_UNICODE + || (sortOrder->ulPropTag & 0xffff) == PT_STRING8) + { + if (sortOrder->ulOrder == TABLE_SORT_ASCEND) + orderSelector = EOCompareCaseInsensitiveAscending; + else if (sortOrder->ulOrder == TABLE_SORT_DESCEND) + orderSelector = EOCompareCaseInsensitiveDescending; + else if (sortOrder->ulOrder == TABLE_SORT_MAXIMUM_CATEGORY) + { + orderSelector = EOCompareCaseInsensitiveAscending; + [self errorWithFormat: + @"TABLE_SORT_MAXIMUM_CATEGORY is not handled"]; + } + } + else + { + if (sortOrder->ulOrder == TABLE_SORT_ASCEND) + orderSelector = EOCompareAscending; + else if (sortOrder->ulOrder == TABLE_SORT_DESCEND) + orderSelector = EOCompareDescending; + else if (sortOrder->ulOrder == TABLE_SORT_MAXIMUM_CATEGORY) + { + orderSelector = EOCompareAscending; + [self errorWithFormat: + @"TABLE_SORT_MAXIMUM_CATEGORY is not handled"]; + } + } + newSortOrdering = [EOSortOrdering sortOrderingWithKey: sortIdentifier + selector: orderSelector]; + } + else + { + newSortOrdering = nil; + propName = get_proptag_name (sortOrder->ulPropTag); + if (!propName) + propName = ""; + [self errorWithFormat: + @"sort unhandled for property: %s (0x%.8x)", + propName, sortOrder->ulPropTag]; + } + + return newSortOrdering; +} + +- (void) setSortOrder: (const struct SSortOrderSet *) set +{ + NSMutableArray *newSortOrderings; + EOSortOrdering *sortOrdering; + uint16_t count; + + if (set) + { + newSortOrderings = [NSMutableArray arrayWithCapacity: set->cSorts]; + + /* TODO: */ + if (set->cCategories > 0) + [self errorWithFormat: @"we don't handle sort categories yet"]; + + for (count = 0; count < set->cSorts; count++) + { + sortOrdering = [self _sortOrderingFromSortOrder: set->aSort + count]; + if (sortOrdering) + [newSortOrderings addObject: sortOrdering]; + } + } + else + newSortOrderings = nil; + + ASSIGN (sortOrderings, newSortOrderings); + [self cleanupCaches]; + + [self logWithFormat: @"new sort orderings: %@", sortOrderings]; +} + @end