Monotone-Parent: 385b1ef1c54f07a7e75a0de0fdf1149cd54755b8

Monotone-Revision: 56f579d41c63981db591c91450d6286b9ca53078

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2011-02-06T22:49:33
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2011-02-06 22:49:33 +00:00
parent 3cb14e0cc8
commit 8053f126f7
3 changed files with 105 additions and 4 deletions

View File

@ -1,5 +1,9 @@
2011-02-06 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/MAPIStoreMailMessageTable.m (-setSordOrder):
overriden method with proper mapping of IMAP sort fields, still
lack handling of categories.
* OpenChange/MAPIStoreMessageTable.m (-setSortOrder:): implemented
stub method.

View File

@ -26,6 +26,10 @@
#import "MAPIStoreMessageTable.h"
@interface MAPIStoreMailMessageTable : MAPIStoreMessageTable
{
NSString *sortOrdering;
}
@end
#endif /* MAPISTOREMAILMESSAGETABLE_H */

View File

@ -42,7 +42,8 @@
#import "MAPIStoreMailMessageTable.h"
#include <libmapi/mapidefs.h>
#undef DEBUG
#include <mapistore/mapistore.h>
#include <mapistore/mapistore_nameid.h>
@implementation MAPIStoreMailMessageTable
@ -66,10 +67,26 @@ static EOQualifier *nonDeletedQualifier = nil;
[deletedQualifier release];
}
- (id) init
{
if ((self = [super init]))
{
sortOrdering = @"ARRIVAL";
}
return self;
}
- (void) dealloc
{
[sortOrdering release];
[super dealloc];
}
- (NSArray *) childKeys
{
return [[folder fetchUIDsMatchingQualifier: nonDeletedQualifier
sortOrdering: @"ARRIVAL"]
sortOrdering: sortOrdering]
stringsWithFormat: @"%@.eml"];
}
@ -87,7 +104,7 @@ static EOQualifier *nonDeletedQualifier = nil;
andQualifier = [[EOAndQualifier alloc]
initWithQualifiers: restriction, nonDeletedQualifier, nil];
keys = [[folder fetchUIDsMatchingQualifier: andQualifier
sortOrdering: @"ARRIVAL"]
sortOrdering: sortOrdering]
stringsWithFormat: @"%@.eml"];
[andQualifier release];
[self logWithFormat: @" restricted keys: %@", keys];
@ -451,7 +468,6 @@ static EOQualifier *nonDeletedQualifier = nil;
return rc;
}
- (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property
{
static NSMutableDictionary *knownProperties = nil;
@ -595,4 +611,81 @@ static EOQualifier *nonDeletedQualifier = nil;
return rc;
}
/* sorting */
- (NSString *) _sortIdentifierForProperty: (enum MAPITAGS) property
{
static NSMutableDictionary *knownProperties = nil;
if (!knownProperties)
{
knownProperties = [NSMutableDictionary new];
/* ARRIVAL, CC */
[knownProperties setObject: @"DATE"
forKey: MAPIPropertyKey (PR_MESSAGE_DELIVERY_TIME)];
[knownProperties setObject: @"FROM"
forKey: MAPIPropertyKey (PR_SENT_REPRESENTING_NAME_UNICODE)];
[knownProperties setObject: @"SIZE"
forKey: MAPIPropertyKey (PR_MESSAGE_SIZE)];
[knownProperties setObject: @"SIZE"
forKey: MAPIPropertyKey (PidLidRemoteTransferSize)];
[knownProperties setObject: @"SUBJECT"
forKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)];
[knownProperties setObject: @"TO"
forKey: MAPIPropertyKey (PR_DISPLAY_TO_UNICODE)];
}
return [knownProperties objectForKey: MAPIPropertyKey (property)];
}
- (void) setSortOrder: (const struct SSortOrderSet *) set
{
NSMutableString *newSortOrdering;
struct SSortOrder *sortOrder;
NSString *sortIdentifier;
const char *propName;
uint16_t count;
if (set)
{
/* TODO: */
if (set->cCategories > 0)
[self errorWithFormat: @"we don't handle sort categories yet"];
newSortOrdering = [NSMutableString string];
for (count = 0; count < set->cSorts; count++)
{
sortOrder = set->aSort + count;
sortIdentifier
= [self _sortIdentifierForProperty: sortOrder->ulPropTag];
if (sortIdentifier)
{
if (sortOrder->ulOrder == TABLE_SORT_DESCEND)
[newSortOrdering appendString: @" REVERSE"];
else if (sortOrder->ulOrder == TABLE_SORT_MAXIMUM_CATEGORY)
[self errorWithFormat: @"TABLE_SORT_MAXIMUM_CATEGORY is not handled"];
[newSortOrdering appendFormat: @" %@", sortIdentifier];
}
else
{
propName = get_proptag_name (sortOrder->ulPropTag);
if (!propName)
propName = "<unknown>";
[self errorWithFormat:
@"sort unhandled for property: %s (0x%.8x)",
propName, sortOrder->ulPropTag];
}
}
if ([newSortOrdering length] > 0)
ASSIGN (sortOrdering, [newSortOrdering substringFromIndex: 1]);
else
ASSIGN (sortOrdering, @"ARRIVAL");
[self cleanupCaches];
[self logWithFormat: @"new sort ordering: '%@'", sortOrdering];
}
else
ASSIGN (sortOrdering, @"ARRIVAL");
}
@end