From 04e09e0b61a9c6385bc5bff4e7af042592adc8d5 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 20 Feb 2012 14:50:54 +0000 Subject: [PATCH 1/2] Monotone-Parent: 04bea15431a5d37d2c52ccda4a30d78b57741793 Monotone-Revision: 1446e7383727bc0d371dfafcec06697f030f7117 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-02-20T14:50:54 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 ++++++ OpenChange/MAPIStoreObject.h | 6 ------ OpenChange/MAPIStoreObject.m | 11 ----------- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index e7bff64c7..41f884f33 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-02-20 Wolfgang Sourdeau + + * OpenChange/MAPIStoreObject.m (-setMAPIRetainCount) + (-retainCount): removed accessors as well as the corresponding + "mapiRetainCount" ivar as this was part of an unused feature. + 2012-02-16 Francis Lachapelle * UI/WebServerResources/UIxAttendeesEditor.js (checkAttendee): diff --git a/OpenChange/MAPIStoreObject.h b/OpenChange/MAPIStoreObject.h index 773db8bd4..31e21fee9 100644 --- a/OpenChange/MAPIStoreObject.h +++ b/OpenChange/MAPIStoreObject.h @@ -45,8 +45,6 @@ { const IMP *classGetters; - uint32_t mapiRetainCount; - NSMutableArray *parentContainersBag; MAPIStoreObject *container; id sogoObject; @@ -62,10 +60,6 @@ - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newFolder; -/* HACK: MAPI retain count */ -- (void) setMAPIRetainCount: (uint32_t) newCount; -- (uint32_t) mapiRetainCount; - - (void) setIsNew: (BOOL) newIsNew; - (BOOL) isNew; diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index d064aca30..c9d71d1ef 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -100,7 +100,6 @@ static Class NSExceptionK, MAPIStoreFolderK; { if ((self = [super init])) { - mapiRetainCount = 0; classGetters = (IMP *) MAPIStorePropertyGettersForClass (isa); parentContainersBag = [NSMutableArray new]; container = nil; @@ -136,16 +135,6 @@ static Class NSExceptionK, MAPIStoreFolderK; [super dealloc]; } -- (void) setMAPIRetainCount: (uint32_t) newCount -{ - mapiRetainCount = newCount; -} - -- (uint32_t) mapiRetainCount -{ - return mapiRetainCount; -} - - (void) setIsNew: (BOOL) newIsNew { isNew = newIsNew; From 18eab081650cd7ca43d171b5607f7c90b8aabafc Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 20 Feb 2012 19:47:58 +0000 Subject: [PATCH 2/2] Monotone-Parent: 1446e7383727bc0d371dfafcec06697f030f7117 Monotone-Revision: 7f4c04f0c1883efb437cd0189f442b20c0063c82 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-02-20T19:47:58 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 12 ++++++++ OpenChange/MAPIStoreCalendarContext.m | 5 ++++ OpenChange/MAPIStoreGCSBaseContext.h | 3 ++ OpenChange/MAPIStoreGCSBaseContext.m | 25 ++++++++++++++-- OpenChange/MAPIStoreGCSFolder.m | 42 +++++++++++++++++++++++++-- OpenChange/MAPIStoreMailContext.m | 8 ++++- OpenChange/MAPIStoreMailFolder.h | 5 ++++ OpenChange/MAPIStoreMailFolder.m | 20 +++++++++++-- OpenChange/MAPIStoreTasksContext.m | 5 ++++ Tests/Integration/webdavlib.py | 10 +++---- 10 files changed, 121 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 41f884f33..6d520f719 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2012-02-20 Wolfgang Sourdeau + * OpenChange/MAPIStoreGCSFolder.m (-setDisplayName:): new method + that intercept the setting of PR_DISPLAY_NAME_UNICODE following + the mechanism described below. + (-getPrDisplayName:inMemCtx): overriden method. + + * OpenChange/MAPIStoreGCSBaseContext.m (+folderNameSuffix): new + method that returns an optional suffix to differentiate between + SOGo folders that are common to multiple Outlook folders, in + particular for Calendar and Tasks folder. + (+getFolderDisplayName:): new utility method that returns a + display name with the above suffix added properly. + * OpenChange/MAPIStoreObject.m (-setMAPIRetainCount) (-retainCount): removed accessors as well as the corresponding "mapiRetainCount" ivar as this was part of an unused feature. diff --git a/OpenChange/MAPIStoreCalendarContext.m b/OpenChange/MAPIStoreCalendarContext.m index 16018ce85..279e9a081 100644 --- a/OpenChange/MAPIStoreCalendarContext.m +++ b/OpenChange/MAPIStoreCalendarContext.m @@ -56,4 +56,9 @@ static Class MAPIStoreCalendarFolderK; return MAPIStoreCalendarFolderK; } ++ (NSString *) folderNameSuffix +{ + return @"c"; +} + @end diff --git a/OpenChange/MAPIStoreGCSBaseContext.h b/OpenChange/MAPIStoreGCSBaseContext.h index 974c8cf54..76fba3602 100644 --- a/OpenChange/MAPIStoreGCSBaseContext.h +++ b/OpenChange/MAPIStoreGCSBaseContext.h @@ -29,6 +29,9 @@ @interface MAPIStoreGCSBaseContext : MAPIStoreContext ++ (NSString *) folderNameSuffix; ++ (NSString *) getFolderDisplayName: (NSString *) sogoDisplayName; + @end #endif /* MAPISTOREGCSBASECONTEXT_H */ diff --git a/OpenChange/MAPIStoreGCSBaseContext.m b/OpenChange/MAPIStoreGCSBaseContext.m index 60ec45346..d13e6bc58 100644 --- a/OpenChange/MAPIStoreGCSBaseContext.m +++ b/OpenChange/MAPIStoreGCSBaseContext.m @@ -43,12 +43,31 @@ return nil; } ++ (NSString *) folderNameSuffix +{ + return @""; +} + ++ (NSString *) getFolderDisplayName: (NSString *) sogoDisplayName +{ + NSString *suffix, *displayName; + + suffix = [self folderNameSuffix]; + if ([suffix length] > 0 && ![sogoDisplayName hasSuffix: suffix]) + displayName = [NSString stringWithFormat: @"%@ (%@)", + sogoDisplayName, suffix]; + else + displayName = sogoDisplayName; + + return displayName; +} + + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withTDBIndexing: (struct tdb_wrap *) indexingTdb inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; - NSString *moduleName, *baseUrl, *url, *nameInContainer; + NSString *moduleName, *baseUrl, *url, *nameInContainer, *displayName; NSArray *subfolders; MAPIStoreUserContext *userContext; SOGoParentFolder *parentFolder; @@ -75,8 +94,8 @@ nameInContainer = [currentFolder nameInContainer]; url = [NSString stringWithFormat: @"%@%@", baseUrl, nameInContainer]; context->url = [url asUnicodeInMemCtx: context]; - context->name = [[currentFolder displayName] - asUnicodeInMemCtx: context]; + displayName = [self getFolderDisplayName: [currentFolder displayName]]; + context->name = [displayName asUnicodeInMemCtx: context]; context->main_folder = [nameInContainer isEqualToString: @"personal"]; context->role = [self MAPIContextRole]; context->tag = "tag"; diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index f41aa5eb3..ce4f4c2b1 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -34,7 +34,7 @@ #import #import -#import "MAPIStoreContext.h" +#import "MAPIStoreGCSBaseContext.h" #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSData+MAPIStore.h" @@ -102,6 +102,44 @@ return (rc == MAPISTORE_SUCCESS) ? [super deleteFolder] : rc; } +- (void) setDisplayName: (NSString *) newDisplayName +{ + NSString *suffix, *fullSuffix; + Class cClass; + + cClass = [(MAPIStoreGCSBaseContext *) [self context] class]; + + /* if a suffix exists, we strip it from the final name */ + suffix = [cClass folderNameSuffix]; + if ([suffix length] > 0) + { + fullSuffix = [NSString stringWithFormat: @"(%@)", suffix]; + if ([newDisplayName hasSuffix: fullSuffix]) + { + newDisplayName = [newDisplayName substringToIndex: + [newDisplayName length] + - [fullSuffix length]]; + newDisplayName = [newDisplayName stringByTrimmingSpaces]; + } + } + + if (![[sogoObject displayName] isEqualToString: newDisplayName]) + [sogoObject renameTo: newDisplayName]; +} + +- (int) getPrDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + NSString *displayName; + Class cClass; + + cClass = [(MAPIStoreGCSBaseContext *) [self context] class]; + displayName = [cClass getFolderDisplayName: [sogoObject displayName]]; + *data = [displayName asUnicodeInMemCtx: memCtx]; + + return MAPISTORE_SUCCESS; +} + - (void) addProperties: (NSDictionary *) newProperties { NSString *newDisplayName; @@ -112,7 +150,7 @@ newDisplayName = [newProperties objectForKey: key]; if (newDisplayName) { - [sogoObject renameTo: newDisplayName]; + [self setDisplayName: newDisplayName]; propsCopy = [newProperties mutableCopy]; [propsCopy removeObjectForKey: key]; [propsCopy autorelease]; diff --git a/OpenChange/MAPIStoreMailContext.m b/OpenChange/MAPIStoreMailContext.m index 2b5348461..67091a8c2 100644 --- a/OpenChange/MAPIStoreMailContext.m +++ b/OpenChange/MAPIStoreMailContext.m @@ -38,13 +38,14 @@ #undef DEBUG #include -static Class MAPIStoreMailFolderK; +static Class MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; @implementation MAPIStoreMailContext + (void) initialize { MAPIStoreMailFolderK = [MAPIStoreMailFolder class]; + MAPIStoreOutboxFolderK = [MAPIStoreOutboxFolder class]; } + (NSString *) MAPIModuleName @@ -208,4 +209,9 @@ static Class MAPIStoreMailFolderK; return context; } +- (Class) MAPIStoreFolderClass +{ + return MAPIStoreOutboxFolderK; +} + @end diff --git a/OpenChange/MAPIStoreMailFolder.h b/OpenChange/MAPIStoreMailFolder.h index 84dceea27..7e47e8c09 100644 --- a/OpenChange/MAPIStoreMailFolder.h +++ b/OpenChange/MAPIStoreMailFolder.h @@ -53,4 +53,9 @@ @end +/* MAPIStoreOutboxFolder is a special subclass of MAPIStoreMailFolder where + the displayname is always "Outbox" and can not be changed. */ +@interface MAPIStoreOutboxFolder : MAPIStoreMailFolder +@end + #endif /* MAPISTOREMAILFOLDER_H */ diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index d781b41a0..3aefb8931 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -61,7 +61,7 @@ #import "MAPIStoreMailFolder.h" -static Class SOGoMailFolderK; +static Class SOGoMailFolderK, MAPIStoreOutboxFolderK; #undef DEBUG #include @@ -74,6 +74,7 @@ static Class SOGoMailFolderK; + (void) initialize { SOGoMailFolderK = [SOGoMailFolder class]; + MAPIStoreOutboxFolderK = [MAPIStoreOutboxFolder class]; [MAPIStoreAppointmentWrapper class]; } @@ -113,7 +114,10 @@ static Class SOGoMailFolderK; key = MAPIPropertyKey (PR_DISPLAY_NAME_UNICODE); newDisplayName = [newProperties objectForKey: key]; - if (newDisplayName) + if (newDisplayName + && ![self isKindOfClass: MAPIStoreOutboxFolderK] + && ![[(SOGoMailFolder *) sogoObject displayName] + isEqualToString: newDisplayName]) { [(SOGoMailFolder *) sogoObject renameTo: newDisplayName]; propsCopy = [newProperties mutableCopy]; @@ -1078,3 +1082,15 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) } @end + +@implementation MAPIStoreOutboxFolder + +- (int) getPrDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + *data = [@"Outbox" asUnicodeInMemCtx: memCtx]; + + return MAPISTORE_SUCCESS; +} + +@end diff --git a/OpenChange/MAPIStoreTasksContext.m b/OpenChange/MAPIStoreTasksContext.m index c8714c469..2726a2a62 100644 --- a/OpenChange/MAPIStoreTasksContext.m +++ b/OpenChange/MAPIStoreTasksContext.m @@ -55,4 +55,9 @@ static Class MAPIStoreTasksFolderK; return MAPIStoreTasksFolderK; } ++ (NSString *) folderNameSuffix +{ + return @"t"; +} + @end diff --git a/Tests/Integration/webdavlib.py b/Tests/Integration/webdavlib.py index 46bc6d317..d63dfb448 100644 --- a/Tests/Integration/webdavlib.py +++ b/Tests/Integration/webdavlib.py @@ -66,7 +66,7 @@ class HTTPUnparsedURL: class WebDAVClient: user_agent = "Mozilla/5.0" - def __init__(self, hostname, port, username = None, password = None, + def __init__(self, hostname, port, username = None, password = "", forcessl = False): if int(port) == 443 or forcessl: import M2Crypto.httpslib @@ -75,13 +75,11 @@ class WebDAVClient: else: self.conn = httplib.HTTPConnection(hostname, port, True) - if username is not None: - if password is None: - password = "" + if username is None: + self.simpleauth_hash = None + else: self.simpleauth_hash = (("%s:%s" % (username, password)) .encode('base64')[:-1]) - else: - self.simpleauth_hash = None def prepare_headers(self, query, body): headers = { "User-Agent": self.user_agent }