From 33b353b97442c106dba2b63b29954f05af9c34b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20P=C3=A9rez-Aradros=20Herce?= Date: Fri, 8 Nov 2013 17:02:50 +0100 Subject: [PATCH 01/45] Moved to abstract index_context instead of tdb_wrap --- OpenChange/MAPIStoreContext.h | 8 ++++---- OpenChange/MAPIStoreContext.m | 16 ++++++++-------- OpenChange/MAPIStoreFallbackContext.m | 4 ++-- OpenChange/MAPIStoreGCSBaseContext.m | 4 ++-- OpenChange/MAPIStoreMailContext.m | 8 ++++---- OpenChange/MAPIStoreMapping.h | 6 +++--- OpenChange/MAPIStoreMapping.m | 8 ++------ OpenChange/MAPIStoreNotesContext.m | 2 +- OpenChange/MAPIStoreSOGo.m | 10 +++++----- OpenChange/MAPIStoreUserContext.h | 4 ++-- OpenChange/MAPIStoreUserContext.m | 10 +++++----- 11 files changed, 38 insertions(+), 42 deletions(-) diff --git a/OpenChange/MAPIStoreContext.h b/OpenChange/MAPIStoreContext.h index 9987b8d2f..533d7f278 100644 --- a/OpenChange/MAPIStoreContext.h +++ b/OpenChange/MAPIStoreContext.h @@ -61,10 +61,10 @@ } + (struct mapistore_contexts_list *) listAllContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx; + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx; + (enum mapistore_error) createRootFolder: (NSString **) mapistoreUriP withFID: (uint64_t ) fid @@ -75,11 +75,11 @@ + (int) openContext: (MAPIStoreContext **) contextPtr withURI: (const char *) newUri connectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; - (id) initFromURL: (NSURL *) newUri withConnectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; - (NSURL *) url; - (struct mapistore_connection_info *) connectionInfo; diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 4f1e67819..ce447d87e 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -100,7 +100,7 @@ static NSMutableDictionary *contextClassMapping; } + (struct mapistore_contexts_list *) listAllContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *list, *current; @@ -112,7 +112,7 @@ static NSMutableDictionary *contextClassMapping; list = NULL; userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; [userContext activateWithUser: [userContext sogoUser]]; classes = GSObjCAllSubclassesOfClass (self); @@ -121,7 +121,7 @@ static NSMutableDictionary *contextClassMapping; { currentClass = [classes objectAtIndex: count]; current = [currentClass listContextsForUser: userName - withTDBIndexing: indexingTdb + withIndexing: indexing inMemCtx: memCtx]; if (current) DLIST_CONCATENATE(list, current, void); @@ -131,7 +131,7 @@ static NSMutableDictionary *contextClassMapping; } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { return NULL; @@ -216,7 +216,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) + (int) openContext: (MAPIStoreContext **) contextPtr withURI: (const char *) newUri connectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct tdb_wrap *) indexingTdb + andTDBIndexing: (struct indexing_context *) indexing { MAPIStoreContext *context; Class contextClass; @@ -239,7 +239,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { context = [[contextClass alloc] initFromURL: baseURL withConnectionInfo: newConnInfo - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; if (context) { [context autorelease]; @@ -272,7 +272,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) - (id) initFromURL: (NSURL *) newUrl withConnectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct tdb_wrap *) indexingTdb + andTDBIndexing: (struct indexing_context *) indexing { NSString *username; @@ -291,7 +291,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) ASSIGN (userContext, [MAPIStoreUserContext userContextWithUsername: username - andTDBIndexing: indexingTdb]); + andTDBIndexing: indexing]); #if 0 mapistore_mgmt_backend_register_user (newConnInfo, diff --git a/OpenChange/MAPIStoreFallbackContext.m b/OpenChange/MAPIStoreFallbackContext.m index 1c9a0106b..41463542a 100644 --- a/OpenChange/MAPIStoreFallbackContext.m +++ b/OpenChange/MAPIStoreFallbackContext.m @@ -45,7 +45,7 @@ } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; @@ -72,7 +72,7 @@ inContainer: nil]; [root setOwner: userName]; userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; [userContext ensureFolderTableExists]; [root setTableUrl: [userContext folderTableURL]]; names = [root toManyRelationshipKeys]; diff --git a/OpenChange/MAPIStoreGCSBaseContext.m b/OpenChange/MAPIStoreGCSBaseContext.m index cc09a41fe..216eab01c 100644 --- a/OpenChange/MAPIStoreGCSBaseContext.m +++ b/OpenChange/MAPIStoreGCSBaseContext.m @@ -64,7 +64,7 @@ } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; @@ -79,7 +79,7 @@ if (moduleName) { userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; parentFolder = [[userContext rootFolders] objectForKey: moduleName]; baseUrl = [NSString stringWithFormat: @"sogo://%@@%@/", userName, moduleName]; diff --git a/OpenChange/MAPIStoreMailContext.m b/OpenChange/MAPIStoreMailContext.m index 79ea0b62e..24d974e5a 100644 --- a/OpenChange/MAPIStoreMailContext.m +++ b/OpenChange/MAPIStoreMailContext.m @@ -83,7 +83,7 @@ MakeDisplayFolderName (NSString *folderName) } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *firstContext = NULL, *context; @@ -100,7 +100,7 @@ MakeDisplayFolderName (NSString *folderName) WOContext *woContext; userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; accountFolder = [[userContext rootFolders] objectForKey: @"mail"]; woContext = [userContext woContext]; @@ -245,7 +245,7 @@ MakeDisplayFolderName (NSString *folderName) } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *context; @@ -256,7 +256,7 @@ MakeDisplayFolderName (NSString *folderName) WOContext *woContext; userContext = [MAPIStoreUserContext userContextWithUsername: userName - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; accountFolder = [[userContext rootFolders] objectForKey: @"mail"]; woContext = [userContext woContext]; diff --git a/OpenChange/MAPIStoreMapping.h b/OpenChange/MAPIStoreMapping.h index c974c7496..c756686f4 100644 --- a/OpenChange/MAPIStoreMapping.h +++ b/OpenChange/MAPIStoreMapping.h @@ -32,17 +32,17 @@ { void *memCtx; NSString *username; - struct tdb_wrap *indexing; + struct indexing_context *indexing; NSMutableDictionary *mapping; /* FID/MID -> url */ NSMutableDictionary *reverseMapping; /* url -> FID/MID */ NSUInteger useCount; } + (id) mappingForUsername: (NSString *) username - withIndexing: (struct tdb_wrap *) indexing; + withIndexing: (struct indexing_context *) indexing; - (id) initForUsername: (NSString *) username - withIndexing: (struct tdb_wrap *) indexing; + withIndexing: (struct indexing_context *) indexing; - (void) increaseUseCount; diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index ffc035aea..5fa9e851d 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -39,10 +39,6 @@ #include #include - -struct tdb_wrap { - struct tdb_context *tdb; -}; static NSMutableDictionary *mappingRegistry = nil; @@ -103,7 +99,7 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, } + (id) mappingForUsername: (NSString *) username - withIndexing: (struct tdb_wrap *) indexing + withIndexing: (struct indexing_context *) indexing { id mapping; @@ -153,7 +149,7 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, } - (id) initForUsername: (NSString *) newUsername - withIndexing: (struct tdb_wrap *) newIndexing + withIndexing: (struct indexing_context *) newIndexing { NSString *idNbr, *uri; NSArray *keys; diff --git a/OpenChange/MAPIStoreNotesContext.m b/OpenChange/MAPIStoreNotesContext.m index 36d6804b9..594a819b5 100644 --- a/OpenChange/MAPIStoreNotesContext.m +++ b/OpenChange/MAPIStoreNotesContext.m @@ -38,7 +38,7 @@ } + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName - withTDBIndexing: (struct tdb_wrap *) indexingTdb + withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_contexts_list *context; diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 720635975..23cee8290 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -144,7 +144,7 @@ sogo_backend_init (void) static enum mapistore_error sogo_backend_create_context(TALLOC_CTX *mem_ctx, struct mapistore_connection_info *conn_info, - struct tdb_wrap *indexingTdb, + struct indexing_context *indexing, const char *uri, void **context_object) { NSAutoreleasePool *pool; @@ -161,7 +161,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, rc = [MAPIStoreContextK openContext: &context withURI: uri connectionInfo: conn_info - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; if (rc == MAPISTORE_SUCCESS) *context_object = [context tallocWrapper: mem_ctx]; } @@ -178,7 +178,7 @@ static enum mapistore_error sogo_backend_create_root_folder (const char *username, enum mapistore_context_role role, uint64_t fid, const char *name, - // struct tdb_wrap *indexingTdb, + // struct indexing_context *indexing, TALLOC_CTX *mem_ctx, char **mapistore_urip) { NSAutoreleasePool *pool; @@ -213,7 +213,7 @@ sogo_backend_create_root_folder (const char *username, } static enum mapistore_error -sogo_backend_list_contexts(const char *username, struct tdb_wrap *indexingTdb, +sogo_backend_list_contexts(const char *username, struct indexing_context *indexing, TALLOC_CTX *mem_ctx, struct mapistore_contexts_list **contexts_listp) { @@ -230,7 +230,7 @@ sogo_backend_list_contexts(const char *username, struct tdb_wrap *indexingTdb, { userName = [NSString stringWithUTF8String: username]; *contexts_listp = [MAPIStoreContextK listAllContextsForUser: userName - withTDBIndexing: indexingTdb + withIndexing: indexing inMemCtx: mem_ctx]; rc = MAPISTORE_SUCCESS; } diff --git a/OpenChange/MAPIStoreUserContext.h b/OpenChange/MAPIStoreUserContext.h index 237819655..f9867d15a 100644 --- a/OpenChange/MAPIStoreUserContext.h +++ b/OpenChange/MAPIStoreUserContext.h @@ -63,10 +63,10 @@ } + (id) userContextWithUsername: (NSString *) username - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; - (id) initWithUsername: (NSString *) newUsername - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; - (NSString *) username; - (SOGoUser *) sogoUser; diff --git a/OpenChange/MAPIStoreUserContext.m b/OpenChange/MAPIStoreUserContext.m index bad00b260..e034ce3bc 100644 --- a/OpenChange/MAPIStoreUserContext.m +++ b/OpenChange/MAPIStoreUserContext.m @@ -60,7 +60,7 @@ static NSMapTable *contextsTable = nil; } + (id) userContextWithUsername: (NSString *) username - andTDBIndexing: (struct tdb_wrap *) indexingTdb; + andTDBIndexing: (struct indexing_context *) indexing; { id userContext; @@ -68,7 +68,7 @@ static NSMapTable *contextsTable = nil; if (!userContext) { userContext = [[self alloc] initWithUsername: username - andTDBIndexing: indexingTdb]; + andTDBIndexing: indexing]; [userContext autorelease]; [contextsTable setObject: userContext forKey: username]; } @@ -125,7 +125,7 @@ static NSMapTable *contextsTable = nil; } - (id) initWithUsername: (NSString *) newUsername - andTDBIndexing: (struct tdb_wrap *) indexingTdb + andTDBIndexing: (struct indexing_context *) indexing { NSString *userPassword; @@ -133,9 +133,9 @@ static NSMapTable *contextsTable = nil; { /* "username" will be retained by table */ username = newUsername; - if (indexingTdb) + if (indexing) ASSIGN (mapping, [MAPIStoreMapping mappingForUsername: username - withIndexing: indexingTdb]); + withIndexing: indexing]); authenticator = [MAPIStoreAuthenticator new]; [authenticator setUsername: username]; From a6bfb9d5c50b2fa299b6bb583dd33630848c0d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20P=C3=A9rez-Aradros=20Herce?= Date: Sat, 9 Nov 2013 18:00:44 +0100 Subject: [PATCH 02/45] Use indexing generic code instead of tdb private funtions --- OpenChange/MAPIStoreMapping.h | 2 - OpenChange/MAPIStoreMapping.m | 92 ++++++++--------------------------- 2 files changed, 20 insertions(+), 74 deletions(-) diff --git a/OpenChange/MAPIStoreMapping.h b/OpenChange/MAPIStoreMapping.h index c756686f4..620112d76 100644 --- a/OpenChange/MAPIStoreMapping.h +++ b/OpenChange/MAPIStoreMapping.h @@ -33,8 +33,6 @@ void *memCtx; NSString *username; struct indexing_context *indexing; - NSMutableDictionary *mapping; /* FID/MID -> url */ - NSMutableDictionary *reverseMapping; /* url -> FID/MID */ NSUInteger useCount; } diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index 5fa9e851d..371e32ea7 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -33,12 +33,15 @@ #import +#undef DEBUG +#include +#include + #import "MAPIStoreTypes.h" #import "MAPIStoreMapping.h" #include -#include static NSMutableDictionary *mappingRegistry = nil; @@ -55,48 +58,6 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) return [NSString stringWithUnsignedLongLong: idNbr]; } -static int -MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, - void *data) -{ - NSMutableDictionary *mapping; - id idKey; - NSString *uri; - char *idStr, *uriStr; - uint64_t idNbr; - - // get the key - // key examples : key(18) = "0x6900000000000001" - // key(31) = "SOFT_DELETED:0xb100020000000001" - // - idStr = (char *) data1.dptr; - idKey = nil; - - if (strncmp(idStr, "SOFT_DELETED:", 13) != 0) - { - // It's very important here to use strtoull and NOT strtoll as - // the latter will overflow a long long with typical key values. - idNbr = strtoull(idStr, NULL, 0); - // idKey = [NSNumber numberWithUnsignedLongLong: idNbr]; - idKey = MAPIStoreMappingKeyFromId(idNbr); - } - - // get the value and null-terminate it - uriStr = (char *)malloc(sizeof(char *) * data2.dsize+1); - memset(uriStr, 0, data2.dsize+1); - memcpy(uriStr, (const char *) data2.dptr, data2.dsize); - uri = [NSString stringWithUTF8String: uriStr]; - free (uriStr); - - mapping = data; - - if (uri && idKey) - { - [mapping setObject: uri forKey: idKey]; - } - - return 0; -} + (id) mappingForUsername: (NSString *) username withIndexing: (struct indexing_context *) indexing @@ -119,8 +80,6 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, if ((self = [super init])) { memCtx = talloc_zero (NULL, TALLOC_CTX); - mapping = [NSMutableDictionary new]; - reverseMapping = [NSMutableDictionary new]; indexing = NULL; useCount = 0; } @@ -151,27 +110,10 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, - (id) initForUsername: (NSString *) newUsername withIndexing: (struct indexing_context *) newIndexing { - NSString *idNbr, *uri; - NSArray *keys; - NSUInteger count, max; - if ((self = [self init])) { ASSIGN (username, newUsername); indexing = newIndexing; - (void) talloc_reference (memCtx, newIndexing); - tdb_traverse_read (indexing->tdb, MAPIStoreMappingTDBTraverse, mapping); - keys = [mapping allKeys]; - max = [keys count]; - for (count = 0; count < max; count++) - { - idNbr = [keys objectAtIndex: count]; - uri = [mapping objectForKey: idNbr]; - //[self logWithFormat: @"preregistered id '%@' for url '%@'", idNbr, uri]; - [reverseMapping setObject: idNbr forKey: uri]; - } - - //[self logWithFormat: @"Complete mapping: %@ \nComplete reverse mapping: %@", mapping, reverseMapping]; } return self; @@ -180,29 +122,35 @@ MAPIStoreMappingTDBTraverse (TDB_CONTEXT *ctx, TDB_DATA data1, TDB_DATA data2, - (void) dealloc { [username release]; - [mapping release]; - [reverseMapping release]; talloc_free (memCtx); [super dealloc]; } - (NSString *) urlFromID: (uint64_t) idNbr { - return [mapping objectForKey: MAPIStoreMappingKeyFromId (idNbr)]; + char* url; + + indexing->get_uri(indexing, [username UTF8String], + memCtx, idNbr, &url, false); + NSString *res = [[[NSString alloc] initWithUTF8String:url] autorelease]; + talloc_free(url); + + return res; } - (uint64_t) idFromURL: (NSString *) url { - id key; + enum mapistore_error ret; uint64_t idNbr; + bool softDeleted; - key = [reverseMapping objectForKey: url]; - if (key) - idNbr = [key unsignedLongLongValue]; + ret = indexing->get_fmid(indexing, [username UTF8String], [url UTF8String], + false, &idNbr, &softDeleted); + + if (ret == MAPISTORE_SUCCESS && !softDeleted) + return idNbr; else - idNbr = NSNotFound; - - return idNbr; + return NSNotFound; } - (void) _updateFolderWithURL: (NSString *) oldURL From fd308b592fcf8c7052258c4e2e17d25278344e26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20P=C3=A9rez-Aradros=20Herce?= Date: Mon, 11 Nov 2013 03:17:53 +0100 Subject: [PATCH 03/45] Converted all the indexing code to indexing backends --- OpenChange/MAPIStoreMapping.m | 121 ++++++++-------------------------- 1 file changed, 29 insertions(+), 92 deletions(-) diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index 371e32ea7..2781aa814 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -128,7 +128,7 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) - (NSString *) urlFromID: (uint64_t) idNbr { - char* url; + char* url = NULL; indexing->get_uri(indexing, [username UTF8String], memCtx, idNbr, &url, false); @@ -156,55 +156,32 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) - (void) _updateFolderWithURL: (NSString *) oldURL withURL: (NSString *) urlString { - NSArray *allKeys; - NSUInteger count, max; - NSString *currentKey, *newKey; - id idKey; - TDB_DATA key, dbuf; + const char *searchURL; + uint64_t idNbr; + bool softDeleted; + NSString *current; + NSString *newURL; - [oldURL retain]; + searchURL = [[oldURL stringByAppendingString:@"*"] UTF8String]; - allKeys = [reverseMapping allKeys]; - max = [allKeys count]; - for (count = 0; count < max; count++) - { - currentKey = [allKeys objectAtIndex: count]; - if ([currentKey hasPrefix: oldURL]) - { - newKey = [currentKey stringByReplacingPrefix: oldURL - withPrefix: urlString]; + while (indexing->get_fmid(indexing, [username UTF8String], + searchURL,true, &idNbr, &softDeleted) == MAPISTORE_SUCCESS) + { + // Ignore deleted + if (softDeleted) continue; - idKey = [reverseMapping objectForKey: currentKey]; - [mapping setObject: newKey forKey: idKey]; - [reverseMapping setObject: idKey forKey: newKey]; - [reverseMapping removeObjectForKey: currentKey]; - - /* update the record in the indexing database */ - key.dptr = (unsigned char *) talloc_asprintf (NULL, "0x%.16"PRIx64, - (uint64_t) [idKey unsignedLongLongValue]); - key.dsize = strlen ((const char *) key.dptr); - - dbuf.dptr = (unsigned char *) talloc_strdup (NULL, - [newKey UTF8String]); - dbuf.dsize = strlen ((const char *) dbuf.dptr); - tdb_store (indexing->tdb, key, dbuf, TDB_MODIFY); - talloc_free (key.dptr); - talloc_free (dbuf.dptr); - } - } - - [oldURL release]; + current = [self urlFromID:idNbr]; + newURL = [current stringByReplacingPrefix: oldURL withPrefix: urlString]; + indexing->update_fmid(indexing, [username UTF8String], idNbr, [newURL UTF8String]); + } } - (void) updateID: (uint64_t) idNbr withURL: (NSString *) urlString { NSString *oldURL; - id idKey; - TDB_DATA key, dbuf; - idKey = MAPIStoreMappingKeyFromId (idNbr); - oldURL = [mapping objectForKey: idKey]; + oldURL = [self urlFromID: idNbr]; if (oldURL) { if ([oldURL hasSuffix: @"/"]) /* is container ? */ @@ -212,28 +189,16 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) if (![urlString hasSuffix: @"/"]) [NSException raise: NSInvalidArgumentException format: @"a container url must have an ending '/'"]; - tdb_transaction_start (indexing->tdb); [self _updateFolderWithURL: oldURL withURL: urlString]; - tdb_transaction_commit (indexing->tdb); } else { if ([urlString hasSuffix: @"/"]) [NSException raise: NSInvalidArgumentException format: @"a leaf url must not have an ending '/'"]; - [mapping setObject: urlString forKey: idKey]; - [reverseMapping setObject: idKey forKey: urlString]; - [reverseMapping removeObjectForKey: oldURL]; - /* update the record in the indexing database */ - key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); - key.dsize = strlen((const char *) key.dptr); - - dbuf.dptr = (unsigned char *) talloc_strdup (NULL, [urlString UTF8String]); - dbuf.dsize = strlen((const char *) dbuf.dptr); - tdb_store (indexing->tdb, key, dbuf, TDB_MODIFY); - talloc_free (key.dptr); - talloc_free (dbuf.dptr); + indexing->update_fmid(indexing, [username UTF8String], + idNbr, [urlString UTF8String]); } } } @@ -241,13 +206,13 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) - (BOOL) registerURL: (NSString *) urlString withID: (uint64_t) idNbr { - id idKey; - BOOL rc; - TDB_DATA key, dbuf; + NSString *oldURL; + uint64_t oldIdNbr; + bool rc; - idKey = MAPIStoreMappingKeyFromId (idNbr); - if ([mapping objectForKey: idKey] - || [reverseMapping objectForKey: urlString]) + oldURL = [self urlFromID: idNbr]; + oldIdNbr = [self idFromURL: urlString]; + if (oldURL != NULL || oldIdNbr != NSNotFound) { [self errorWithFormat: @"attempt to double register an entry ('%@', %lld," @@ -257,21 +222,13 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) } else { - [mapping setObject: urlString forKey: idKey]; - [reverseMapping setObject: idKey forKey: urlString]; rc = YES; // [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")", // urlString, idNbr, idNbr]; /* Add the record given its fid and mapistore_uri */ - key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); - key.dsize = strlen((const char *) key.dptr); - - dbuf.dptr = (unsigned char *) talloc_strdup(NULL, [urlString UTF8String]); - dbuf.dsize = strlen((const char *) dbuf.dptr); - tdb_store (indexing->tdb, key, dbuf, TDB_INSERT); - talloc_free (key.dptr); - talloc_free (dbuf.dptr); + indexing->add_fmid(indexing, [username UTF8String], + idNbr, [urlString UTF8String]); } return rc; @@ -285,7 +242,6 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) max = [urlStrings count]; if (max == [idNbrs count]) { - tdb_transaction_start (indexing->tdb); for (count = 0; count < max; count++) { newID = [[idNbrs objectAtIndex: count] @@ -293,7 +249,6 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) [self registerURL: [urlStrings objectAtIndex: count] withID: newID]; } - tdb_transaction_commit (indexing->tdb); } else [NSException raise: NSInvalidArgumentException @@ -302,26 +257,8 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) - (void) unregisterURLWithID: (uint64_t) idNbr { - NSString *urlString; - id idKey; - TDB_DATA key; - - idKey = MAPIStoreMappingKeyFromId (idNbr); - urlString = [mapping objectForKey: idKey]; - if (urlString) - { - // [self logWithFormat: @"unregistering url '%@' with id %lld (0x%.16"PRIx64")", - // urlString, idNbr, idNbr]; - [reverseMapping removeObjectForKey: urlString]; - [mapping removeObjectForKey: idKey]; - - /* We hard-delete the entry from the indexing database */ - key.dptr = (unsigned char *) talloc_asprintf(NULL, "0x%.16"PRIx64, idNbr); - key.dsize = strlen((const char *) key.dptr); - - tdb_delete(indexing->tdb, key); - talloc_free(key.dptr); - } + indexing->del_fmid(indexing, [username UTF8String], + idNbr, MAPISTORE_PERMANENT_DELETE); } @end From 34b98a563dec2229a6d7c363e1f77a659d872bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Tue, 19 Nov 2013 15:24:31 +0100 Subject: [PATCH 04/45] get_new_folderID functions are now on mapistore_indexing --- OpenChange/MAPIStoreContext.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index ce447d87e..093e3fb3a 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -534,7 +534,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { //[self warnWithFormat: @"no id exist yet for '%@', requesting one...", // childURL]; - openchangedb_get_new_folderID (connInfo->oc_ctx, &mappingId); + mapistore_indexing_get_new_folderID (connInfo->mstore_ctx, &mappingId); [mapping registerURL: childURL withID: mappingId]; contextId = 0; @@ -597,8 +597,8 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) memCtx = talloc_zero(NULL, TALLOC_CTX); newFMIDs = [NSMutableArray arrayWithCapacity: max]; - if (openchangedb_get_new_folderIDs (connInfo->oc_ctx, - memCtx, max, &numbers) + if (mapistore_indexing_get_new_folderIDs (connInfo->mstore_ctx, + memCtx, max, &numbers) != MAPI_E_SUCCESS || numbers->cValues != max) abort (); for (count = 0; count < max; count++) From 2aa71cc8a3fdc94b925773ce5dc5cd3b0eced242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Fri, 20 Dec 2013 11:26:09 +0100 Subject: [PATCH 05/45] check ret value properly --- OpenChange/MAPIStoreContext.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 093e3fb3a..fb248a35d 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -599,7 +599,7 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) if (mapistore_indexing_get_new_folderIDs (connInfo->mstore_ctx, memCtx, max, &numbers) - != MAPI_E_SUCCESS || numbers->cValues != max) + != MAPISTORE_SUCCESS || numbers->cValues != max) abort (); for (count = 0; count < max; count++) { From f6d1a37127eea974a3a64c1cea138b796d62eaa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Tue, 24 Dec 2013 11:03:03 +0100 Subject: [PATCH 06/45] use properly get_uri function and check ret value --- OpenChange/MAPIStoreMapping.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index 2781aa814..67a6c132a 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -129,9 +129,13 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) - (NSString *) urlFromID: (uint64_t) idNbr { char* url = NULL; + enum mapistore_error ret; + bool soft_delete = false; - indexing->get_uri(indexing, [username UTF8String], - memCtx, idNbr, &url, false); + ret = indexing->get_uri(indexing, [username UTF8String], + memCtx, idNbr, &url, &soft_delete); + if (ret != MAPISTORE_SUCCESS) + return NULL; NSString *res = [[[NSString alloc] initWithUTF8String:url] autorelease]; talloc_free(url); From 95298de9f18ce440355eb6ef783e7294d9432a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Mon, 10 Feb 2014 12:38:42 +0100 Subject: [PATCH 07/45] avoid infinite loop when trying to update a folder id --- OpenChange/MAPIStoreMapping.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index 67a6c132a..1bd27b963 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -166,6 +166,8 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) NSString *current; NSString *newURL; + if ([oldURL isEqualToString: urlString]) return; + searchURL = [[oldURL stringByAppendingString:@"*"] UTF8String]; while (indexing->get_fmid(indexing, [username UTF8String], From a24f009cfe88be15977c661b7fcc100dd76a6f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Thu, 27 Feb 2014 17:42:58 +0100 Subject: [PATCH 08/45] mapistoreURI encoding should be done the same way as listContextForUser stringByEncodingImap4FolderName is used inside [newFolder create] where is needed --- OpenChange/MAPIStoreMailContext.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreMailContext.m b/OpenChange/MAPIStoreMailContext.m index 24d974e5a..82da82dac 100644 --- a/OpenChange/MAPIStoreMailContext.m +++ b/OpenChange/MAPIStoreMailContext.m @@ -189,7 +189,7 @@ MakeDisplayFolderName (NSString *folderName) if ([newFolder create]) mapistoreURI = [NSString stringWithFormat: @"sogo://%@:%@@mail/%@/", userName, userName, - [[folderName stringByEncodingImap4FolderName] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; + [folderName stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; else mapistoreURI = nil; [MAPIApp setUserContext: nil]; From c81476bd040508bf2e70e51ef8052c5400746777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Thu, 27 Feb 2014 17:46:55 +0100 Subject: [PATCH 09/45] no need to modify url --- OpenChange/MAPIStoreContext.m | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index fb248a35d..5205234c1 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -365,10 +365,8 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { int rc; NSString *objectURL, *url; - // TDB_DATA key, dbuf; - url = [[contextUrl absoluteString] - stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; + url = [contextUrl absoluteString]; objectURL = [[userContext mapping] urlFromID: fmid]; if (objectURL) { From 6bef67811432f5685802cb134d85cffd79de2e41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Thu, 27 Feb 2014 17:47:28 +0100 Subject: [PATCH 10/45] fix format logging uint64_t --- OpenChange/MAPIStoreContext.m | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 5205234c1..9aaa38a7b 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -372,17 +372,14 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { if ([objectURL hasPrefix: url]) { - *path = [[objectURL substringFromIndex: 7] - asUnicodeInMemCtx: memCtx]; - [self logWithFormat: @"found path '%s' for fmid %.16x", - *path, fmid]; + *path = [[objectURL substringFromIndex: 7] asUnicodeInMemCtx: memCtx]; + [self logWithFormat: @"found path '%s' for fmid %"PRIu64, *path, fmid]; rc = MAPISTORE_SUCCESS; } else { - [self logWithFormat: @"context (%@, %@) does not contain" - @" found fmid: 0x%.16x", - objectURL, url, fmid]; + [self logWithFormat: @"context (%@, %@) does not contain " + @"found fmid: %"PRIu64, objectURL, url, fmid]; *path = NULL; rc = MAPISTORE_SUCCESS; } From f8028b5a94f1899ca1f20fa3f63d8949c91c7069 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Sat, 22 Feb 2014 23:01:41 +0100 Subject: [PATCH 11/45] OpenChange: Avoid crashing when creating embedded message in attachment Signed-off-by: Kamen Mazdrashki (cherry picked from commit 15a55f9f707247c9164e8fa7a102639744f686e5) --- OpenChange/MAPIStoreSOGo.m | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 23cee8290..cd387cf32 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -61,6 +61,17 @@ sogo_backend_unexpected_error() return MAPISTORE_SUCCESS; } +static enum mapistore_error +sogo_backend_handle_objc_exception(NSException *e, const char *fn_name, const int line_no) +{ + DEBUG(0,("[SOGo: %s:%d] - EXCEPTION: %s, reason: %s\n", fn_name, line_no, [[e name] UTF8String], [[e reason] UTF8String])); + if ([[e name] isEqual:@"NotImplementedException"]) + { + return MAPISTORE_ERR_NOT_IMPLEMENTED; + } + return MAPISTORE_ERROR; +} + static void sogo_backend_atexit (void) { @@ -73,6 +84,7 @@ sogo_backend_atexit (void) GSUnregisterCurrentThread (); } + /** \details Initialize sogo mapistore backend @@ -1139,11 +1151,18 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, attachment = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; - rc = [attachment createEmbeddedMessage: &message - withMAPIStoreMsg: msg - inMemCtx: mem_ctx]; - if (rc == MAPISTORE_SUCCESS) - *message_object = [message tallocWrapper: mem_ctx]; + @try + { + rc = [attachment createEmbeddedMessage: &message + withMAPIStoreMsg: msg + inMemCtx: mem_ctx]; + if (rc == MAPISTORE_SUCCESS) + *message_object = [message tallocWrapper: mem_ctx]; + } + @catch (NSException *e) + { + rc = sogo_backend_handle_objc_exception(e, __FUNCTION__, __LINE__); + } [pool release]; GSUnregisterCurrentThread (); } From d1f54298d29963e76f12e3cc2ef4abf07b697f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Mon, 3 Mar 2014 16:09:30 +0100 Subject: [PATCH 12/45] stringByDecodingImap4FolderName is not neccesary For russian locale and characters nonexistent in latin1 sogo crashes --- OpenChange/MAPIStoreMailContext.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreMailContext.m b/OpenChange/MAPIStoreMailContext.m index 82da82dac..f81b6c10e 100644 --- a/OpenChange/MAPIStoreMailContext.m +++ b/OpenChange/MAPIStoreMailContext.m @@ -157,7 +157,7 @@ MakeDisplayFolderName (NSString *folderName) stringData = [NSString stringWithFormat: @"%@%@", urlBase, [currentName stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; context->url = [stringData asUnicodeInMemCtx: context]; - stringData = [[[currentName substringFromIndex: 6] fromCSSIdentifier] stringByDecodingImap4FolderName]; + stringData = [[currentName substringFromIndex: 6] fromCSSIdentifier]; context->name = [stringData asUnicodeInMemCtx: context]; context->main_folder = false; context->role = MAPISTORE_MAIL_ROLE; From a77863947f92730dbd407f25c0e65fc0a9b51c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Tue, 4 Mar 2014 12:29:13 +0100 Subject: [PATCH 13/45] add try catch to all functions on struct mapistore_backend --- OpenChange/MAPIStoreSOGo.m | 88 +++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index cd387cf32..dba78b5f1 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -53,6 +53,11 @@ static Class MAPIStoreContextK = Nil; static BOOL leakDebugging = NO; +#define TRYCATCH_START @try { +#define TRYCATCH_END } @catch (NSException * e) { \ + return sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \ + } + static enum mapistore_error sogo_backend_unexpected_error() { @@ -64,7 +69,8 @@ sogo_backend_unexpected_error() static enum mapistore_error sogo_backend_handle_objc_exception(NSException *e, const char *fn_name, const int line_no) { - DEBUG(0,("[SOGo: %s:%d] - EXCEPTION: %s, reason: %s\n", fn_name, line_no, [[e name] UTF8String], [[e reason] UTF8String])); + NSLog(@"[SOGo: %s:%d] - EXCEPTION: %@, reason: %@, stackframe: %@", + fn_name, line_no, e.name, e.reason, [e callStackSymbols]); if ([[e name] isEqual:@"NotImplementedException"]) { return MAPISTORE_ERR_NOT_IMPLEMENTED; @@ -159,6 +165,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, struct indexing_context *indexing, const char *uri, void **context_object) { + TRYCATCH_START NSAutoreleasePool *pool; MAPIStoreContext *context; int rc; @@ -184,6 +191,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, GSUnregisterCurrentThread (); return rc; + TRYCATCH_END } static enum mapistore_error @@ -193,6 +201,7 @@ sogo_backend_create_root_folder (const char *username, // struct indexing_context *indexing, TALLOC_CTX *mem_ctx, char **mapistore_urip) { + TRYCATCH_START NSAutoreleasePool *pool; NSString *userName, *folderName; NSString *mapistoreUri; @@ -222,6 +231,7 @@ sogo_backend_create_root_folder (const char *username, GSUnregisterCurrentThread (); return rc; + TRYCATCH_END } static enum mapistore_error @@ -229,6 +239,7 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi TALLOC_CTX *mem_ctx, struct mapistore_contexts_list **contexts_listp) { + TRYCATCH_START NSAutoreleasePool *pool; NSString *userName; int rc; @@ -253,6 +264,7 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi GSUnregisterCurrentThread (); return rc; + TRYCATCH_END } // andFID: fid @@ -274,6 +286,7 @@ static enum mapistore_error sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, uint64_t fmid, char **path) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreContext *context; @@ -297,12 +310,14 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, uint64_t fid, void **folder_object) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreContext *context; @@ -329,6 +344,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, } return rc; + TRYCATCH_END } /** @@ -343,6 +359,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, static enum mapistore_error sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, void **childfolder_object) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder, *childFolder; @@ -369,6 +386,7 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, } return rc; + TRYCATCH_END } /** @@ -383,6 +401,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, struct SRow *aRow, void **childfolder_object) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder, *childFolder; @@ -408,6 +427,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, } return rc; + TRYCATCH_END } /** @@ -422,6 +442,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, static enum mapistore_error sogo_folder_delete(void *folder_object) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -445,11 +466,13 @@ sogo_folder_delete(void *folder_object) } return rc; + TRYCATCH_END } static enum mapistore_error sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table_type, uint32_t *child_count) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -473,6 +496,7 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table } return rc; + TRYCATCH_END } static enum mapistore_error @@ -481,6 +505,7 @@ sogo_folder_open_message(void *folder_object, uint64_t mid, bool write_access, void **message_object) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -510,6 +535,7 @@ sogo_folder_open_message(void *folder_object, } return rc; + TRYCATCH_END } static enum mapistore_error @@ -519,6 +545,7 @@ sogo_folder_create_message(void *folder_object, uint8_t associated, void **message_object) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -547,11 +574,13 @@ sogo_folder_create_message(void *folder_object, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -575,6 +604,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) } return rc; + TRYCATCH_END } static enum mapistore_error @@ -586,6 +616,7 @@ sogo_folder_move_copy_messages(void *folder_object, struct Binary_r **target_change_keys, uint8_t want_copy) { + TRYCATCH_START MAPIStoreFolder *sourceFolder, *targetFolder; NSAutoreleasePool *pool; struct MAPIStoreTallocWrapper *wrapper; @@ -619,12 +650,14 @@ sogo_folder_move_copy_messages(void *folder_object, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_folder_move_folder(void *folder_object, void *target_folder_object, TALLOC_CTX *mem_ctx, const char *new_folder_name) { + TRYCATCH_START NSAutoreleasePool *pool; MAPIStoreFolder *moveFolder, *targetFolder; NSString *newFolderName; @@ -667,12 +700,14 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_CTX *mem_ctx, bool recursive, const char *new_folder_name) { + TRYCATCH_START NSAutoreleasePool *pool; MAPIStoreFolder *copyFolder, *targetFolder; NSString *newFolderName; @@ -709,6 +744,7 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_ } return rc; + TRYCATCH_END } static enum mapistore_error @@ -716,6 +752,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, enum mapistore_table_type table_type, uint64_t change_num, struct UI8Array_r **fmidsp, uint64_t *cnp) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -743,6 +780,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, } return rc; + TRYCATCH_END } static enum mapistore_error @@ -750,6 +788,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, enum mapistore_table_type table_type, uint32_t handle_id, void **table_object, uint32_t *row_count) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -779,6 +818,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, } return rc; + TRYCATCH_END } static enum mapistore_error @@ -786,6 +826,7 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, uint16_t pcount, struct PermissionData *permissions) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -811,11 +852,13 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_type table_type, const struct UI8Array_r *mids) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -840,6 +883,7 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ } return rc; + TRYCATCH_END } static enum mapistore_error @@ -847,6 +891,7 @@ sogo_message_get_message_data(void *message_object, TALLOC_CTX *mem_ctx, struct mapistore_message **msg_dataP) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -872,11 +917,13 @@ sogo_message_get_message_data(void *message_object, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void **attachment_object, uint32_t *aidp) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -904,12 +951,14 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void } return rc; + TRYCATCH_END } static enum mapistore_error sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, uint32_t aid, void **attachment_object) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -937,11 +986,13 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, void **table_object, uint32_t *row_count) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -970,6 +1021,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo } return rc; + TRYCATCH_END } static enum mapistore_error @@ -978,6 +1030,7 @@ sogo_message_modify_recipients (void *message_object, uint16_t count, struct mapistore_message_recipient *recipients) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -1004,11 +1057,13 @@ sogo_message_modify_recipients (void *message_object, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_message_set_read_flag (void *message_object, uint8_t flag) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -1033,11 +1088,13 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) } return rc; + TRYCATCH_END } static enum mapistore_error sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -1062,11 +1119,13 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) } return rc; + TRYCATCH_END } static enum mapistore_error sogo_message_submit (void *message_object, enum SubmitFlags flags) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMailVolatileMessage *message; @@ -1091,6 +1150,7 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) } return rc; + TRYCATCH_END } static enum mapistore_error @@ -1100,6 +1160,7 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, uint64_t *midP, struct mapistore_message **msg) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; @@ -1129,6 +1190,7 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, } return rc; + TRYCATCH_END } static enum mapistore_error @@ -1137,6 +1199,7 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, void **message_object, struct mapistore_message **msg) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; @@ -1172,11 +1235,13 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_table_get_available_properties(void *table_object, TALLOC_CTX *mem_ctx, struct SPropTagArray **propertiesP) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1200,11 +1265,13 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje } return rc; + TRYCATCH_END } static enum mapistore_error sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *properties) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1229,11 +1296,13 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope } return rc; + TRYCATCH_END } static enum mapistore_error sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restrictions, uint8_t *table_status) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1260,11 +1329,13 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr } return rc; + TRYCATCH_END } static enum mapistore_error sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, uint8_t *table_status) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1291,6 +1362,7 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, } return rc; + TRYCATCH_END } static enum mapistore_error @@ -1298,6 +1370,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, enum mapistore_query_type query_type, uint32_t row_id, struct mapistore_property_data **data) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1322,6 +1395,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, } return rc; + TRYCATCH_END } static enum mapistore_error @@ -1329,6 +1403,7 @@ sogo_table_get_row_count (void *table_object, enum mapistore_query_type query_type, uint32_t *row_countp) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1353,11 +1428,13 @@ sogo_table_get_row_count (void *table_object, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_table_handle_destructor (void *table_object, uint32_t handle_id) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1382,12 +1459,14 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) } return rc; + TRYCATCH_END } static enum mapistore_error sogo_properties_get_available_properties(void *object, TALLOC_CTX *mem_ctx, struct SPropTagArray **propertiesP) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; @@ -1411,6 +1490,7 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec } return rc; + TRYCATCH_END } static enum mapistore_error @@ -1419,6 +1499,7 @@ sogo_properties_get_properties (void *object, uint16_t count, enum MAPITAGS *properties, struct mapistore_property_data *data) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; @@ -1444,11 +1525,13 @@ sogo_properties_get_properties (void *object, } return rc; + TRYCATCH_END } static enum mapistore_error sogo_properties_set_properties (void *object, struct SRow *aRow) { + TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; @@ -1472,6 +1555,7 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) } return rc; + TRYCATCH_END } static enum mapistore_error @@ -1482,6 +1566,7 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, const char *rootURI, char **uri) { + TRYCATCH_START NSAutoreleasePool *pool; NSString *partialURLString, *username, *directory; @@ -1518,6 +1603,7 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, GSUnregisterCurrentThread (); return MAPISTORE_SUCCESS; + TRYCATCH_END } /** From c6b8be742d1197ad24f0d1735db36892a6b4c1aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Tue, 4 Mar 2014 16:40:41 +0100 Subject: [PATCH 14/45] use execinfo.h to get backtrace Really poor backtrace because it will only have the frames from oc side, I don't know why callStackSymbols is returning null, compilation flags? --- OpenChange/MAPIStoreSOGo.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index dba78b5f1..97d1d7d7c 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -49,6 +49,7 @@ #include #include +#include static Class MAPIStoreContextK = Nil; static BOOL leakDebugging = NO; @@ -69,8 +70,18 @@ sogo_backend_unexpected_error() static enum mapistore_error sogo_backend_handle_objc_exception(NSException *e, const char *fn_name, const int line_no) { - NSLog(@"[SOGo: %s:%d] - EXCEPTION: %@, reason: %@, stackframe: %@", + NSLog(@"[SOGo: %s:%d] - EXCEPTION: %@, reason: %@, backtrace: %@", fn_name, line_no, e.name, e.reason, [e callStackSymbols]); + if (![e callStackSymbols]) + { + void *frames[128]; + int i, len = backtrace(frames, 128); + char **symbols = backtrace_symbols(frames, len); + NSLog(@"Backtrace using execinfo.h:"); + for (i = 0; i < len; ++i) + NSLog(@"\t%s", symbols[i]); + free(symbols); + } if ([[e name] isEqual:@"NotImplementedException"]) { return MAPISTORE_ERR_NOT_IMPLEMENTED; From 3b2174eeec1843eeb011129134cecf5b6bfd2246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Mon, 17 Mar 2014 21:08:12 +0100 Subject: [PATCH 15/45] if there is no password file for specific user, try to read global password file This way we can have a master password for imap access --- OpenChange/MAPIStoreUserContext.m | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/OpenChange/MAPIStoreUserContext.m b/OpenChange/MAPIStoreUserContext.m index e034ce3bc..04300fd35 100644 --- a/OpenChange/MAPIStoreUserContext.m +++ b/OpenChange/MAPIStoreUserContext.m @@ -100,16 +100,12 @@ static NSMapTable *contextsTable = nil; return self; } -- (NSString *) _readUserPassword: (NSString *) newUsername +- (NSString *) _readPasswordFile: (NSString *) path { - NSString *password, *path; + NSString *password; NSData *content; - - password = nil; - - path = [NSString stringWithFormat: SAMBA_PRIVATE_DIR - @"/mapistore/%@/password", newUsername]; + password = nil; content = [NSData dataWithContentsOfFile: path]; if (content) @@ -124,6 +120,24 @@ static NSMapTable *contextsTable = nil; return password; } +- (NSString *) _readUserPassword: (NSString *) newUsername +{ + NSString *password, *path; + + path = [NSString stringWithFormat: SAMBA_PRIVATE_DIR + @"/mapistore/%@/password", newUsername]; + + password = [self _readPasswordFile: path]; + if (password == nil) + { + // Try to get master password + path = [NSString stringWithFormat: SAMBA_PRIVATE_DIR @"/mapistore/master.password"]; + password = [self _readPasswordFile: path]; + } + + return password; +} + - (id) initWithUsername: (NSString *) newUsername andTDBIndexing: (struct indexing_context *) indexing { From 09e6fcc3ff2021b1a9a4a2d99e8a4a852f8c5c93 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 20 Mar 2014 14:24:58 +0100 Subject: [PATCH 16/45] oc-sogo: try/catch to guard only the actual impelementation rather than *everything* Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreSOGo.m | 237 +++++++++++++++++++++++-------------- 1 file changed, 149 insertions(+), 88 deletions(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 97d1d7d7c..3ff960714 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -176,7 +176,6 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, struct indexing_context *indexing, const char *uri, void **context_object) { - TRYCATCH_START NSAutoreleasePool *pool; MAPIStoreContext *context; int rc; @@ -188,12 +187,14 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, if (MAPIStoreContextK) { + TRYCATCH_START rc = [MAPIStoreContextK openContext: &context withURI: uri connectionInfo: conn_info andTDBIndexing: indexing]; if (rc == MAPISTORE_SUCCESS) *context_object = [context tallocWrapper: mem_ctx]; + TRYCATCH_END } else rc = MAPISTORE_ERROR; @@ -202,7 +203,6 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, GSUnregisterCurrentThread (); return rc; - TRYCATCH_END } static enum mapistore_error @@ -212,7 +212,6 @@ sogo_backend_create_root_folder (const char *username, // struct indexing_context *indexing, TALLOC_CTX *mem_ctx, char **mapistore_urip) { - TRYCATCH_START NSAutoreleasePool *pool; NSString *userName, *folderName; NSString *mapistoreUri; @@ -225,6 +224,7 @@ sogo_backend_create_root_folder (const char *username, if (MAPIStoreContextK) { + TRYCATCH_START userName = [NSString stringWithUTF8String: username]; folderName = [NSString stringWithUTF8String: name]; rc = [MAPIStoreContextK createRootFolder: &mapistoreUri @@ -234,6 +234,7 @@ sogo_backend_create_root_folder (const char *username, withRole: role]; if (rc == MAPISTORE_SUCCESS) *mapistore_urip = [mapistoreUri asUnicodeInMemCtx: mem_ctx]; + TRYCATCH_END } else rc = MAPISTORE_ERROR; @@ -242,7 +243,6 @@ sogo_backend_create_root_folder (const char *username, GSUnregisterCurrentThread (); return rc; - TRYCATCH_END } static enum mapistore_error @@ -250,7 +250,6 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi TALLOC_CTX *mem_ctx, struct mapistore_contexts_list **contexts_listp) { - TRYCATCH_START NSAutoreleasePool *pool; NSString *userName; int rc; @@ -262,11 +261,13 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi if (MAPIStoreContextK) { + TRYCATCH_START userName = [NSString stringWithUTF8String: username]; *contexts_listp = [MAPIStoreContextK listAllContextsForUser: userName withIndexing: indexing inMemCtx: mem_ctx]; rc = MAPISTORE_SUCCESS; + TRYCATCH_END } else rc = MAPISTORE_ERROR; @@ -275,7 +276,6 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi GSUnregisterCurrentThread (); return rc; - TRYCATCH_END } // andFID: fid @@ -297,7 +297,6 @@ static enum mapistore_error sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, uint64_t fmid, char **path) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreContext *context; @@ -311,7 +310,11 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, context = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [context getPath: path ofFMID: fmid inMemCtx: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -321,14 +324,12 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, uint64_t fid, void **folder_object) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreContext *context; @@ -343,9 +344,13 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, context = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [context getRootFolder: &folder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *folder_object = [folder tallocWrapper: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -355,7 +360,6 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, } return rc; - TRYCATCH_END } /** @@ -370,7 +374,6 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, static enum mapistore_error sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, void **childfolder_object) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder, *childFolder; @@ -384,10 +387,14 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder openFolder: &childFolder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -397,7 +404,6 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, } return rc; - TRYCATCH_END } /** @@ -412,7 +418,6 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, struct SRow *aRow, void **childfolder_object) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder, *childFolder; @@ -426,9 +431,13 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder createFolder: &childFolder withRow: aRow andFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -438,7 +447,6 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, } return rc; - TRYCATCH_END } /** @@ -453,7 +461,6 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, static enum mapistore_error sogo_folder_delete(void *folder_object) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -467,7 +474,11 @@ sogo_folder_delete(void *folder_object) folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder deleteFolder]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -477,13 +488,11 @@ sogo_folder_delete(void *folder_object) } return rc; - TRYCATCH_END } static enum mapistore_error sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table_type, uint32_t *child_count) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -497,7 +506,11 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder getChildCount: child_count ofTableType: table_type]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -507,7 +520,6 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table } return rc; - TRYCATCH_END } static enum mapistore_error @@ -516,7 +528,6 @@ sogo_folder_open_message(void *folder_object, uint64_t mid, bool write_access, void **message_object) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -531,12 +542,16 @@ sogo_folder_open_message(void *folder_object, folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder openMessage: &message withMID: mid forWriting: write_access inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -546,7 +561,6 @@ sogo_folder_open_message(void *folder_object, } return rc; - TRYCATCH_END } static enum mapistore_error @@ -556,7 +570,6 @@ sogo_folder_create_message(void *folder_object, uint8_t associated, void **message_object) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -571,11 +584,15 @@ sogo_folder_create_message(void *folder_object, folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder createMessage: &message withMID: mid isAssociated: associated]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -585,13 +602,11 @@ sogo_folder_create_message(void *folder_object, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -605,7 +620,11 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder deleteMessageWithMID: mid andFlags: flags]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -615,7 +634,6 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) } return rc; - TRYCATCH_END } static enum mapistore_error @@ -627,7 +645,6 @@ sogo_folder_move_copy_messages(void *folder_object, struct Binary_r **target_change_keys, uint8_t want_copy) { - TRYCATCH_START MAPIStoreFolder *sourceFolder, *targetFolder; NSAutoreleasePool *pool; struct MAPIStoreTallocWrapper *wrapper; @@ -645,6 +662,8 @@ sogo_folder_move_copy_messages(void *folder_object, GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [targetFolder moveCopyMessagesWithMIDs: src_mids andCount: mid_count fromFolder: sourceFolder @@ -652,6 +671,8 @@ sogo_folder_move_copy_messages(void *folder_object, andChangeKeys: target_change_keys wantCopy: want_copy inMemCtx: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -661,14 +682,12 @@ sogo_folder_move_copy_messages(void *folder_object, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_folder_move_folder(void *folder_object, void *target_folder_object, TALLOC_CTX *mem_ctx, const char *new_folder_name) { - TRYCATCH_START NSAutoreleasePool *pool; MAPIStoreFolder *moveFolder, *targetFolder; NSString *newFolderName; @@ -696,11 +715,13 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, else newFolderName = nil; + TRYCATCH_START rc = [moveFolder moveCopyToFolder: targetFolder withNewName: newFolderName isMove: YES isRecursive: YES inMemCtx: mem_ctx]; + TRYCATCH_END [pool release]; GSUnregisterCurrentThread (); @@ -711,14 +732,12 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_CTX *mem_ctx, bool recursive, const char *new_folder_name) { - TRYCATCH_START NSAutoreleasePool *pool; MAPIStoreFolder *copyFolder, *targetFolder; NSString *newFolderName; @@ -740,12 +759,14 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_ newFolderName = [NSString stringWithUTF8String: new_folder_name]; + TRYCATCH_START rc = [copyFolder moveCopyToFolder: targetFolder withNewName: newFolderName isMove: NO isRecursive: recursive inMemCtx: mem_ctx]; - + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -755,7 +776,6 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_ } return rc; - TRYCATCH_END } static enum mapistore_error @@ -763,7 +783,6 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, enum mapistore_table_type table_type, uint64_t change_num, struct UI8Array_r **fmidsp, uint64_t *cnp) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -777,11 +796,15 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder getDeletedFMIDs: fmidsp andCN: cnp fromChangeNumber: change_num inTableType: table_type inMemCtx: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -791,7 +814,6 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, } return rc; - TRYCATCH_END } static enum mapistore_error @@ -799,7 +821,6 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, enum mapistore_table_type table_type, uint32_t handle_id, void **table_object, uint32_t *row_count) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -814,12 +835,16 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder getTable: &table andRowCount: row_count tableType: table_type andHandleId: handle_id]; if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -829,7 +854,6 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, } return rc; - TRYCATCH_END } static enum mapistore_error @@ -837,7 +861,6 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, uint16_t pcount, struct PermissionData *permissions) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -851,9 +874,13 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder modifyPermissions: permissions withCount: pcount andFlags: flags]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -863,13 +890,11 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_type table_type, const struct UI8Array_r *mids) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; @@ -883,8 +908,12 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ folder = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [folder preloadMessageBodiesWithMIDs: mids ofTableType: table_type]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -894,7 +923,6 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ } return rc; - TRYCATCH_END } static enum mapistore_error @@ -902,7 +930,6 @@ sogo_message_get_message_data(void *message_object, TALLOC_CTX *mem_ctx, struct mapistore_message **msg_dataP) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -916,8 +943,12 @@ sogo_message_get_message_data(void *message_object, message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START [message getMessageData: msg_dataP inMemCtx: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); rc = MAPISTORE_SUCCESS; @@ -928,13 +959,11 @@ sogo_message_get_message_data(void *message_object, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void **attachment_object, uint32_t *aidp) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -949,10 +978,14 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message createAttachment: &attachment inAID: aidp]; if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -962,14 +995,12 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void } return rc; - TRYCATCH_END } static enum mapistore_error sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, uint32_t aid, void **attachment_object) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -984,10 +1015,14 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message getAttachment: &attachment withAID: aid]; if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -997,13 +1032,11 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, void **table_object, uint32_t *row_count) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -1018,11 +1051,15 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message getAttachmentTable: &table andRowCount: row_count]; if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1032,7 +1069,6 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo } return rc; - TRYCATCH_END } static enum mapistore_error @@ -1041,7 +1077,6 @@ sogo_message_modify_recipients (void *message_object, uint16_t count, struct mapistore_message_recipient *recipients) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -1055,10 +1090,14 @@ sogo_message_modify_recipients (void *message_object, message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message modifyRecipientsWithRecipients: recipients andCount: count andColumns: columns]; // [context tearDownRequest]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1068,13 +1107,11 @@ sogo_message_modify_recipients (void *message_object, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_message_set_read_flag (void *message_object, uint8_t flag) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -1088,8 +1125,12 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message setReadFlag: flag]; // [context tearDownRequest]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1099,13 +1140,11 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) } return rc; - TRYCATCH_END } static enum mapistore_error sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; @@ -1119,8 +1158,12 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message saveMessage: mem_ctx]; // [context tearDownRequest]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1130,13 +1173,11 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) } return rc; - TRYCATCH_END } static enum mapistore_error sogo_message_submit (void *message_object, enum SubmitFlags flags) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMailVolatileMessage *message; @@ -1150,8 +1191,12 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) message = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [message submitWithFlags: flags]; // [context tearDownRequest]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1161,7 +1206,6 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) } return rc; - TRYCATCH_END } static enum mapistore_error @@ -1171,7 +1215,6 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, uint64_t *midP, struct mapistore_message **msg) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; @@ -1186,12 +1229,16 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, attachment = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [attachment openEmbeddedMessage: &message withMID: midP withMAPIStoreMsg: msg inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1201,7 +1248,6 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, } return rc; - TRYCATCH_END } static enum mapistore_error @@ -1210,7 +1256,6 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, void **message_object, struct mapistore_message **msg) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; @@ -1225,18 +1270,15 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, attachment = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; - @try - { + + TRYCATCH_START rc = [attachment createEmbeddedMessage: &message withMAPIStoreMsg: msg inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; - } - @catch (NSException *e) - { - rc = sogo_backend_handle_objc_exception(e, __FUNCTION__, __LINE__); - } + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1246,13 +1288,11 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_table_get_available_properties(void *table_object, TALLOC_CTX *mem_ctx, struct SPropTagArray **propertiesP) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1266,7 +1306,11 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [table getAvailableProperties: propertiesP inMemCtx: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1276,13 +1320,11 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje } return rc; - TRYCATCH_END } static enum mapistore_error sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *properties) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1296,8 +1338,12 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [table setColumns: properties withCount: count]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1307,13 +1353,11 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope } return rc; - TRYCATCH_END } static enum mapistore_error sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restrictions, uint8_t *table_status) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1327,10 +1371,14 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START [table setRestrictions: restrictions]; //[table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1340,13 +1388,11 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr } return rc; - TRYCATCH_END } static enum mapistore_error sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, uint8_t *table_status) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1360,10 +1406,14 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START [table setSortOrder: sort_order]; [table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1373,7 +1423,6 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, } return rc; - TRYCATCH_END } static enum mapistore_error @@ -1381,7 +1430,6 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, enum mapistore_query_type query_type, uint32_t row_id, struct mapistore_property_data **data) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1395,8 +1443,12 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [table getRow: data withRowID: row_id andQueryType: query_type inMemCtx: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1406,7 +1458,6 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, } return rc; - TRYCATCH_END } static enum mapistore_error @@ -1414,7 +1465,6 @@ sogo_table_get_row_count (void *table_object, enum mapistore_query_type query_type, uint32_t *row_countp) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1428,8 +1478,12 @@ sogo_table_get_row_count (void *table_object, table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [table getRowCount: row_countp withQueryType: query_type]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1439,13 +1493,11 @@ sogo_table_get_row_count (void *table_object, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_table_handle_destructor (void *table_object, uint32_t handle_id) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; @@ -1459,7 +1511,11 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) table = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START [table destroyHandle: handle_id]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); rc = MAPISTORE_SUCCESS; @@ -1470,14 +1526,12 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) } return rc; - TRYCATCH_END } static enum mapistore_error sogo_properties_get_available_properties(void *object, TALLOC_CTX *mem_ctx, struct SPropTagArray **propertiesP) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; @@ -1491,7 +1545,11 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec propObject = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [propObject getAvailableProperties: propertiesP inMemCtx: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1501,7 +1559,6 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec } return rc; - TRYCATCH_END } static enum mapistore_error @@ -1510,7 +1567,6 @@ sogo_properties_get_properties (void *object, uint16_t count, enum MAPITAGS *properties, struct mapistore_property_data *data) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; @@ -1524,9 +1580,13 @@ sogo_properties_get_properties (void *object, propObject = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [propObject getProperties: data withTags: properties andCount: count inMemCtx: mem_ctx]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1536,13 +1596,11 @@ sogo_properties_get_properties (void *object, } return rc; - TRYCATCH_END } static enum mapistore_error sogo_properties_set_properties (void *object, struct SRow *aRow) { - TRYCATCH_START struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; @@ -1556,7 +1614,11 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) propObject = wrapper->instance; GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + + TRYCATCH_START rc = [propObject addPropertiesFromRow: aRow]; + TRYCATCH_END + [pool release]; GSUnregisterCurrentThread (); } @@ -1566,7 +1628,6 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) } return rc; - TRYCATCH_END } static enum mapistore_error @@ -1577,7 +1638,6 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, const char *rootURI, char **uri) { - TRYCATCH_START NSAutoreleasePool *pool; NSString *partialURLString, *username, *directory; @@ -1590,6 +1650,7 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; + TRYCATCH_START // printf("rootURI = %s\n", rootURI); if (rootURI) partialURLString = [NSString stringWithUTF8String: rootURI]; @@ -1609,12 +1670,12 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, // printf("uri = %s\n", [partialURLString UTF8String]); *uri = talloc_strdup (mem_ctx, [partialURLString UTF8String]); + TRYCATCH_END [pool release]; GSUnregisterCurrentThread (); return MAPISTORE_SUCCESS; - TRYCATCH_END } /** From cbe616358dde8a1bbc19d5c84e0371402a919532 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 20 Mar 2014 14:36:29 +0100 Subject: [PATCH 17/45] oc-sogo: Clean up AutoRelease pool and unregister threads in Catch handler Most of the time we have "not yet implemented" kind of exceptions, so it is better to clean up allocated resources Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreSOGo.m | 89 ++++++++++++++++++++------------------ 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 3ff960714..b157ea131 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -55,9 +55,12 @@ static Class MAPIStoreContextK = Nil; static BOOL leakDebugging = NO; #define TRYCATCH_START @try { -#define TRYCATCH_END } @catch (NSException * e) { \ - return sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \ - } +#define TRYCATCH_END(pool) \ + } @catch (NSException * e) { \ + [pool release]; \ + GSUnregisterCurrentThread(); \ + return sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \ + } static enum mapistore_error sogo_backend_unexpected_error() @@ -194,7 +197,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, andTDBIndexing: indexing]; if (rc == MAPISTORE_SUCCESS) *context_object = [context tallocWrapper: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) } else rc = MAPISTORE_ERROR; @@ -234,7 +237,7 @@ sogo_backend_create_root_folder (const char *username, withRole: role]; if (rc == MAPISTORE_SUCCESS) *mapistore_urip = [mapistoreUri asUnicodeInMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) } else rc = MAPISTORE_ERROR; @@ -267,7 +270,7 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi withIndexing: indexing inMemCtx: mem_ctx]; rc = MAPISTORE_SUCCESS; - TRYCATCH_END + TRYCATCH_END(pool) } else rc = MAPISTORE_ERROR; @@ -313,7 +316,7 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, TRYCATCH_START rc = [context getPath: path ofFMID: fmid inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -349,7 +352,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, rc = [context getRootFolder: &folder withFID: fid]; if (rc == MAPISTORE_SUCCESS) *folder_object = [folder tallocWrapper: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -393,7 +396,7 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; // [context tearDownRequest]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -436,7 +439,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, rc = [folder createFolder: &childFolder withRow: aRow andFID: fid]; if (rc == MAPISTORE_SUCCESS) *childfolder_object = [childFolder tallocWrapper: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -477,7 +480,7 @@ sogo_folder_delete(void *folder_object) TRYCATCH_START rc = [folder deleteFolder]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -509,7 +512,7 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table TRYCATCH_START rc = [folder getChildCount: child_count ofTableType: table_type]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -550,7 +553,7 @@ sogo_folder_open_message(void *folder_object, inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -591,7 +594,7 @@ sogo_folder_create_message(void *folder_object, isAssociated: associated]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -623,7 +626,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) TRYCATCH_START rc = [folder deleteMessageWithMID: mid andFlags: flags]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -671,7 +674,7 @@ sogo_folder_move_copy_messages(void *folder_object, andChangeKeys: target_change_keys wantCopy: want_copy inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -721,7 +724,7 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, isMove: YES isRecursive: YES inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -765,7 +768,7 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_ isMove: NO isRecursive: recursive inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -803,7 +806,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, fromChangeNumber: change_num inTableType: table_type inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -843,7 +846,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, andHandleId: handle_id]; if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -879,7 +882,7 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, rc = [folder modifyPermissions: permissions withCount: pcount andFlags: flags]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -912,7 +915,7 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ TRYCATCH_START rc = [folder preloadMessageBodiesWithMIDs: mids ofTableType: table_type]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -947,7 +950,7 @@ sogo_message_get_message_data(void *message_object, TRYCATCH_START [message getMessageData: msg_dataP inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -984,7 +987,7 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1021,7 +1024,7 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, if (rc == MAPISTORE_SUCCESS) *attachment_object = [attachment tallocWrapper: mem_ctx]; // [context tearDownRequest]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1058,7 +1061,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo if (rc == MAPISTORE_SUCCESS) *table_object = [table tallocWrapper: mem_ctx]; // [context tearDownRequest]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1096,7 +1099,7 @@ sogo_message_modify_recipients (void *message_object, andCount: count andColumns: columns]; // [context tearDownRequest]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1129,7 +1132,7 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) TRYCATCH_START rc = [message setReadFlag: flag]; // [context tearDownRequest]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1162,7 +1165,7 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) TRYCATCH_START rc = [message saveMessage: mem_ctx]; // [context tearDownRequest]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1195,7 +1198,7 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) TRYCATCH_START rc = [message submitWithFlags: flags]; // [context tearDownRequest]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1237,7 +1240,7 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1277,7 +1280,7 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, inMemCtx: mem_ctx]; if (rc == MAPISTORE_SUCCESS) *message_object = [message tallocWrapper: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1309,7 +1312,7 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje TRYCATCH_START rc = [table getAvailableProperties: propertiesP inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1342,7 +1345,7 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope TRYCATCH_START rc = [table setColumns: properties withCount: count]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1377,7 +1380,7 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr //[table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1412,7 +1415,7 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, [table cleanupCaches]; rc = MAPISTORE_SUCCESS; *table_status = TBLSTAT_COMPLETE; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1447,7 +1450,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, TRYCATCH_START rc = [table getRow: data withRowID: row_id andQueryType: query_type inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1482,7 +1485,7 @@ sogo_table_get_row_count (void *table_object, TRYCATCH_START rc = [table getRowCount: row_countp withQueryType: query_type]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1514,7 +1517,7 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) TRYCATCH_START [table destroyHandle: handle_id]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1548,7 +1551,7 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec TRYCATCH_START rc = [propObject getAvailableProperties: propertiesP inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1585,7 +1588,7 @@ sogo_properties_get_properties (void *object, rc = [propObject getProperties: data withTags: properties andCount: count inMemCtx: mem_ctx]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1617,7 +1620,7 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) TRYCATCH_START rc = [propObject addPropertiesFromRow: aRow]; - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); @@ -1670,7 +1673,7 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, // printf("uri = %s\n", [partialURLString UTF8String]); *uri = talloc_strdup (mem_ctx, [partialURLString UTF8String]); - TRYCATCH_END + TRYCATCH_END(pool) [pool release]; GSUnregisterCurrentThread (); From 2c94d21f3e62222304cd75ba7300acf1de8663fe Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 20 Mar 2014 15:52:21 +0100 Subject: [PATCH 18/45] oc-sogo: Use [e name] and [e reason] selectors Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreSOGo.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index b157ea131..366b84421 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -74,7 +74,7 @@ static enum mapistore_error sogo_backend_handle_objc_exception(NSException *e, const char *fn_name, const int line_no) { NSLog(@"[SOGo: %s:%d] - EXCEPTION: %@, reason: %@, backtrace: %@", - fn_name, line_no, e.name, e.reason, [e callStackSymbols]); + fn_name, line_no, [e name], [e reason], [e callStackSymbols]); if (![e callStackSymbols]) { void *frames[128]; From 6be768af42c7e21653149b81cfc1b2f09847d0f9 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 20 Mar 2014 16:27:03 +0100 Subject: [PATCH 19/45] oc-sogo: Move memory clean up *after* handling the exception Otherwise the mess is full :) Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreSOGo.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 366b84421..3d091bf42 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -57,9 +57,10 @@ static BOOL leakDebugging = NO; #define TRYCATCH_START @try { #define TRYCATCH_END(pool) \ } @catch (NSException * e) { \ + enum mapistore_error ret = sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \ [pool release]; \ GSUnregisterCurrentThread(); \ - return sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \ + return ret; \ } static enum mapistore_error From bcfb674cd1ba63189eb8210a95b388c0dc2468a6 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 20 Mar 2014 17:04:11 +0100 Subject: [PATCH 20/45] oc-sogo: Print both [NSException callStackSymbols] and execinfo.h stack trace Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreSOGo.m | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 3d091bf42..73872db7e 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -76,16 +76,18 @@ sogo_backend_handle_objc_exception(NSException *e, const char *fn_name, const in { NSLog(@"[SOGo: %s:%d] - EXCEPTION: %@, reason: %@, backtrace: %@", fn_name, line_no, [e name], [e reason], [e callStackSymbols]); - if (![e callStackSymbols]) - { - void *frames[128]; - int i, len = backtrace(frames, 128); - char **symbols = backtrace_symbols(frames, len); - NSLog(@"Backtrace using execinfo.h:"); - for (i = 0; i < len; ++i) - NSLog(@"\t%s", symbols[i]); - free(symbols); - } + + // Another point of view on the stack trace + { + void *frames[128]; + int i, len = backtrace(frames, 128); + char **symbols = backtrace_symbols(frames, len); + NSLog(@"Backtrace using execinfo.h:\n"); + for (i = 0; i < len; ++i) + NSLog(@"\t%s", symbols[i]); + free(symbols); + } + if ([[e name] isEqual:@"NotImplementedException"]) { return MAPISTORE_ERR_NOT_IMPLEMENTED; From fc9dc080455025f16c2ef58d14d8b16913eeb999 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 20 Mar 2014 17:26:44 +0100 Subject: [PATCH 21/45] oc-sogo: pretty print Exceptions in sogo_backend_handle_objc_exception() Now we have a nice stack trace printed out from [NSException callStackSymbols] Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreSOGo.m | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 73872db7e..7d52151c6 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -74,8 +74,13 @@ sogo_backend_unexpected_error() static enum mapistore_error sogo_backend_handle_objc_exception(NSException *e, const char *fn_name, const int line_no) { - NSLog(@"[SOGo: %s:%d] - EXCEPTION: %@, reason: %@, backtrace: %@", - fn_name, line_no, [e name], [e reason], [e callStackSymbols]); + NSString *callStackSymbols = nil; + if ([e respondsToSelector:@selector(callStackSymbols)]) + { + callStackSymbols = [[e callStackSymbols] componentsJoinedByString:@"\n\t"]; + } + NSLog(@"[SOGo: %s:%d] - EXCEPTION: %@, reason: %@, backtrace: \n\t%@\n", + fn_name, line_no, [e name], [e reason], callStackSymbols); // Another point of view on the stack trace { From 7da8885190acac061bb54518cf6bbe305eb8d35b Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Mon, 5 May 2014 01:47:17 +0200 Subject: [PATCH 22/45] openchange: getMessageData - replace int literals with ulRecipClass values Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreMailVolatileMessage.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index c640ab7db..58b4e66d2 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -367,7 +367,7 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; msgData->recipients_count = max; msgData->recipients = talloc_array (msgData, struct mapistore_message_recipient, max); current = 0; - for (type = 0; type < 4; type++) + for (type = MAPI_ORIG; type <= MAPI_BCC; type++) { recipients = [allRecipients objectForKey: recTypes[type]]; recipientsMax = [recipients count]; From 27851ef4280812ce5bf53c1cce33318a4774cc6f Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Mon, 5 May 2014 01:51:18 +0200 Subject: [PATCH 23/45] openchange: FillMessageHeadersFromProperties fix skipping of last value in possible range of recepients IMHO, this fixes a bug, that when saving a meessage, it is saved without BCC fields. Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreMailVolatileMessage.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index 58b4e66d2..73476bef7 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -541,7 +541,7 @@ FillMessageHeadersFromProperties (NGMutableHashMap *headers, NSArray *list; NSCalendarDate *date; NSDictionary *recipients; - NSUInteger type, bccLimit; + enum ulRecipClass type, bccLimit; SOGoUser *activeUser; NSNumber *priority; @@ -562,7 +562,7 @@ FillMessageHeadersFromProperties (NGMutableHashMap *headers, else bccLimit = MAPI_CC; bccLimit++; - for (type = MAPI_TO; type < bccLimit; type++) + for (type = MAPI_TO; type <= bccLimit; type++) { recId = recTypes[type]; list = MakeRecipientsList ([recipients objectForKey: recId]); From dd7200e00f6d975e8b4d3705745b49fae6509256 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Wed, 7 May 2014 01:26:34 +0200 Subject: [PATCH 24/45] openchange/MAPIStoreFolder: Add private selector for actual folder delete action Usually, it is a bad idea for an object to call its own public methods (just like in this case). Thus separating impelementation for deleteFolder: would allow MAPIStoreFolder to call only private implementation when needed Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreFolder.m | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 3dba819b8..a0455efb6 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -433,10 +433,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) deleteFolder +- (void) deleteFolderImpl { + // TODO: raise exception in case underlying delete fails? // [propsMessage delete]; [dbFolder delete]; +} + +- (int) deleteFolder +{ + [self deleteFolderImpl]; [self cleanupCaches]; @@ -890,7 +896,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe { fmid = [mapping idFromURL: [self url]]; [mapping unregisterURLWithID: fmid]; - [self deleteFolder]; + [self deleteFolderImpl]; [mapping registerURL: [newFolder url] withID: fmid]; } From 4b383705fff833a1c41dde513119fe847bbaefc7 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Mon, 2 Jun 2014 01:18:23 +0200 Subject: [PATCH 25/45] openchange: Fix submitWithFlags to submit to BCC-ed recipients also this reintroduces commit 7efb263c659451d2c781547a5b38cb5d01ed837f Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreMailVolatileMessage.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index 73476bef7..aba0d8a49 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -865,7 +865,7 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS NSMutableArray *recipientEmails; NSArray *list; NSString *recId, *from, *msgClass; - NSUInteger count; + enum ulRecipClass type; SOGoUser *activeUser; SOGoDomainDefaults *dd; NSException *error; @@ -881,9 +881,9 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS recipientEmails = [NSMutableArray arrayWithCapacity: 32]; recipients = [properties objectForKey: @"recipients"]; - for (count = 0; count < 3; count++) + for (type = MAPI_ORIG; type <= MAPI_BCC; type++) { - recId = recTypes[count]; + recId = recTypes[type]; list = [recipients objectForKey: recId]; [recipientEmails addObjectsFromArray: [list objectsForKey: @"email" From 2792baac028ecca9253e5ec88021e0cc7a8c7e53 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Mon, 2 Jun 2014 01:20:18 +0200 Subject: [PATCH 26/45] openchange: don't overflow possible recipient type while creating message headers Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreMailVolatileMessage.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index aba0d8a49..7df01fdf1 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -561,7 +561,7 @@ FillMessageHeadersFromProperties (NGMutableHashMap *headers, bccLimit = MAPI_BCC; else bccLimit = MAPI_CC; - bccLimit++; + for (type = MAPI_TO; type <= bccLimit; type++) { recId = recTypes[type]; From 2458af1a43e6e422538e3627313c591c7121b1d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Juli=C3=A1n?= Date: Wed, 11 Jun 2014 16:14:11 +0200 Subject: [PATCH 27/45] All day events deladyed one day if user timezone is +XX:XX * Those events were not shown properly in SOGo web UI --- OpenChange/iCalEvent+MAPIStore.m | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/OpenChange/iCalEvent+MAPIStore.m b/OpenChange/iCalEvent+MAPIStore.m index 4d64a7ac7..40eb0c0ef 100644 --- a/OpenChange/iCalEvent+MAPIStore.m +++ b/OpenChange/iCalEvent+MAPIStore.m @@ -228,6 +228,15 @@ [start setTimeZone: tz]; if (isAllDay) { + /* when user TZ is positive (East) all-day events were not + shown properly in SOGo UI. This day delay fixes it */ + tzOffset = [userTimeZone secondsFromGMTForDate: value]; + if (tzOffset > 0) + { + value = [value dateByAddingYears: 0 months: 0 days: 1 + hours: 0 minutes: 0 + seconds: 0]; + } [start setDate: value]; [start setTimeZone: nil]; } @@ -251,6 +260,15 @@ [end setTimeZone: tz]; if (isAllDay) { + /* when user TZ is positive (East) all-day events were not + shown properly in SOGo UI. This day delay fixes it */ + tzOffset = [userTimeZone secondsFromGMTForDate: value]; + if (tzOffset > 0) + { + value = [value dateByAddingYears: 0 months: 0 days: 1 + hours: 0 minutes: 0 + seconds: 0]; + } [end setDate: value]; [end setTimeZone: nil]; } From 5d43513dd9f36dd47610c822bee3ace20e91aae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Juli=C3=A1n?= Date: Thu, 12 Jun 2014 15:46:02 +0200 Subject: [PATCH 28/45] Removing some trail characters at event description * They are sometimes present after a \r\n\n --- OpenChange/MAPIStoreAppointmentWrapper.m | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 5445f989c..c07998c5e 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -1214,11 +1214,27 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } +/* +private static function parseDescriptionOc2Rc($description) +{ + $description = ltrim($description, ')'); + + if (strpos($description, "\r\n\n") !== false) { + $exploded = explode("\r\n\n", $description, -1); + $description = join($exploded, "\n"); + } + + return $description; +} +*/ + - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; + NSRange range; NSString *stringValue; + NSString *trimingString = @"\r\n\n"; /* FIXME: there is a confusion in NGCards around "comment" and "description" */ stringValue = [event comment]; @@ -1226,6 +1242,14 @@ static NSCharacterSet *hexCharacterSet = nil; && ![stringValue isEqualToString: @"\r\n"] && ![stringValue isEqualToString: @"\n"]) { + /* Avoiding those trail weird characters at event description */ + range = [stringValue rangeOfString: trimingString + options: NSBackwardsSearch]; + if (range.location > 0) + { + stringValue = [stringValue substringToIndex: (NSMaxRange(range) -1)]; + } + rc = MAPISTORE_SUCCESS; *data = [stringValue asUnicodeInMemCtx: memCtx]; } From 51df0adb79095dde2b0fc48f619a4b8497768970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Juli=C3=A1n?= Date: Thu, 12 Jun 2014 16:20:41 +0200 Subject: [PATCH 29/45] Removed development tip comment --- OpenChange/MAPIStoreAppointmentWrapper.m | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index c07998c5e..24c6e1ad3 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -1214,20 +1214,6 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -/* -private static function parseDescriptionOc2Rc($description) -{ - $description = ltrim($description, ')'); - - if (strpos($description, "\r\n\n") !== false) { - $exploded = explode("\r\n\n", $description, -1); - $description = join($exploded, "\n"); - } - - return $description; -} -*/ - - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { From 98505c1b6b54c477e5c438d7fee3eac9ee100d66 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Fri, 13 Jun 2014 14:19:20 +0200 Subject: [PATCH 30/45] oc/MAPIStoreContext: Fix log messages to actually print 64bit FMIDs Signed-off-by: Kamen Mazdrashki Conflicts: OpenChange/MAPIStoreContext.m --- OpenChange/MAPIStoreContext.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 9aaa38a7b..128e8d31f 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -373,13 +373,13 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) if ([objectURL hasPrefix: url]) { *path = [[objectURL substringFromIndex: 7] asUnicodeInMemCtx: memCtx]; - [self logWithFormat: @"found path '%s' for fmid %"PRIu64, *path, fmid]; + [self logWithFormat: @"found path '%s' for fmid 0x%.16"PRIx64"", *path, fmid]; rc = MAPISTORE_SUCCESS; } else { - [self logWithFormat: @"context (%@, %@) does not contain " - @"found fmid: %"PRIu64, objectURL, url, fmid]; + [self logWithFormat: @"context (%@, %@) does not contain " + @"found fmid: 0x%.16"PRIx64"", objectURL, url, fmid]; *path = NULL; rc = MAPISTORE_SUCCESS; } From 6de298d20285730e06fb41488ee6d97edfffbfab Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Fri, 13 Jun 2014 14:20:00 +0200 Subject: [PATCH 31/45] oc/MAPIStoreMapping: Split the check for existing entry so we have better error message Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreMapping.m | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index 1bd27b963..194488bc7 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -217,14 +217,22 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) bool rc; oldURL = [self urlFromID: idNbr]; - oldIdNbr = [self idFromURL: urlString]; - if (oldURL != NULL || oldIdNbr != NSNotFound) + if (oldURL != NULL) { [self errorWithFormat: - @"attempt to double register an entry ('%@', %lld," - @" 0x%.16"PRIx64")", - urlString, idNbr, idNbr]; - rc = NO; + @"url with idNbr already registered: (oldUrl='%@', newUrl='%@', id=x%.16"PRIx64")", + oldURL, urlString, idNbr]; + return NO; + } + + oldIdNbr = [self idFromURL: urlString]; + if (oldIdNbr != NSNotFound) + { + [self errorWithFormat: + @"attempt to double register an entry with idNbr ('%@', %lld," + @" 0x%.16"PRIx64", oldid=0x%.16"PRIx64")", + urlString, idNbr, idNbr, oldIdNbr]; + return NO; } else { From bf0f2a76d565fc1f0265ad6f45e28c37c965dba3 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Mon, 16 Jun 2014 13:20:51 +0200 Subject: [PATCH 32/45] oc/MAPIStoreSOGo: Do not destroy current thread context after any API call We have thread context already in place during *_init() function. Thus guarding every API call with TreadInit/Destroy is: - a bit redundand - makes SOGo backend not reentrant even on single thread and leads to hard to find use-after-free crashes Signed-off-by: Kamen Mazdrashki --- OpenChange/MAPIStoreSOGo.m | 176 ++++++++++++++++++++----------------- 1 file changed, 95 insertions(+), 81 deletions(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 7d52151c6..0a160618c 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -54,15 +54,29 @@ static Class MAPIStoreContextK = Nil; static BOOL leakDebugging = NO; +#define NS_CURRENT_THREAD_REGISTER() \ + BOOL __nsrct_thread_registered = GSRegisterCurrentThread(); \ + if (__nsrct_thread_registered) { \ + DEBUG(0, ("[SOGo: %s:%d] Current Thread not registered! You should call sogo_backend_init() first. Current thread: %p, pid: %d\n", \ + __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); \ + } +#define NS_CURRENT_THREAD_TRY_UNREGISTER() \ + if (__nsrct_thread_registered) { \ + DEBUG(0, ("[SOGo: %s:%d] Unregister current thread. You should have called sogo_backend_init(). Current thread: %p, pid: %d\n", \ + __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); \ + GSUnregisterCurrentThread(); \ + } + #define TRYCATCH_START @try { #define TRYCATCH_END(pool) \ } @catch (NSException * e) { \ enum mapistore_error ret = sogo_backend_handle_objc_exception(e, __PRETTY_FUNCTION__, __LINE__); \ [pool release]; \ - GSUnregisterCurrentThread(); \ + NS_CURRENT_THREAD_TRY_UNREGISTER(); \ return ret; \ } + static enum mapistore_error sogo_backend_unexpected_error() { @@ -193,7 +207,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) @@ -211,7 +225,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, rc = MAPISTORE_ERROR; [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); return rc; } @@ -230,7 +244,7 @@ sogo_backend_create_root_folder (const char *username, DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) @@ -251,7 +265,7 @@ sogo_backend_create_root_folder (const char *username, rc = MAPISTORE_ERROR; [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); return rc; } @@ -267,7 +281,7 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi DEBUG(0, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; if (MAPIStoreContextK) @@ -284,7 +298,7 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi rc = MAPISTORE_ERROR; [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); return rc; } @@ -319,7 +333,7 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, { wrapper = backend_object; context = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -327,7 +341,7 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -353,7 +367,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, { wrapper = backend_object; context = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -363,7 +377,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -396,7 +410,7 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -407,7 +421,7 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -440,7 +454,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -450,7 +464,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -483,7 +497,7 @@ sogo_folder_delete(void *folder_object) { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -491,7 +505,7 @@ sogo_folder_delete(void *folder_object) TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -515,7 +529,7 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -523,7 +537,7 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -551,7 +565,7 @@ sogo_folder_open_message(void *folder_object, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -564,7 +578,7 @@ sogo_folder_open_message(void *folder_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -593,7 +607,7 @@ sogo_folder_create_message(void *folder_object, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -605,7 +619,7 @@ sogo_folder_create_message(void *folder_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -629,7 +643,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -637,7 +651,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -671,7 +685,7 @@ sogo_folder_move_copy_messages(void *folder_object, wrapper = source_folder_object; sourceFolder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -685,7 +699,7 @@ sogo_folder_move_copy_messages(void *folder_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -718,7 +732,7 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, else targetFolder = nil; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; if (new_folder_name) @@ -735,7 +749,7 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -765,7 +779,7 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_ wrapper = target_folder_object; targetFolder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; newFolderName = [NSString stringWithUTF8String: new_folder_name]; @@ -779,7 +793,7 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_ TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -805,7 +819,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -817,7 +831,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -844,7 +858,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -857,7 +871,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -883,7 +897,7 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -893,7 +907,7 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -917,7 +931,7 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ { wrapper = folder_object; folder = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -926,7 +940,7 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -952,7 +966,7 @@ sogo_message_get_message_data(void *message_object, { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -961,7 +975,7 @@ sogo_message_get_message_data(void *message_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); rc = MAPISTORE_SUCCESS; } else @@ -987,7 +1001,7 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -998,7 +1012,7 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1024,7 +1038,7 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1035,7 +1049,7 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1060,7 +1074,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1072,7 +1086,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1099,7 +1113,7 @@ sogo_message_modify_recipients (void *message_object, { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1110,7 +1124,7 @@ sogo_message_modify_recipients (void *message_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1134,7 +1148,7 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1143,7 +1157,7 @@ sogo_message_set_read_flag (void *message_object, uint8_t flag) TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1167,7 +1181,7 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1176,7 +1190,7 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1200,7 +1214,7 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) { wrapper = message_object; message = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1209,7 +1223,7 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1238,7 +1252,7 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, { wrapper = attachment_object; attachment = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1251,7 +1265,7 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1279,7 +1293,7 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, { wrapper = attachment_object; attachment = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1291,7 +1305,7 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1315,7 +1329,7 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1323,7 +1337,7 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1347,7 +1361,7 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1356,7 +1370,7 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1380,7 +1394,7 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1391,7 +1405,7 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1415,7 +1429,7 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1426,7 +1440,7 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1452,7 +1466,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1461,7 +1475,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1487,7 +1501,7 @@ sogo_table_get_row_count (void *table_object, { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1496,7 +1510,7 @@ sogo_table_get_row_count (void *table_object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1520,7 +1534,7 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) { wrapper = table_object; table = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1528,7 +1542,7 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); rc = MAPISTORE_SUCCESS; } else @@ -1554,7 +1568,7 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec { wrapper = object; propObject = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1562,7 +1576,7 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1589,7 +1603,7 @@ sogo_properties_get_properties (void *object, { wrapper = object; propObject = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1599,7 +1613,7 @@ sogo_properties_get_properties (void *object, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1623,7 +1637,7 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) { wrapper = object; propObject = wrapper->instance; - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1631,7 +1645,7 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); } else { @@ -1658,7 +1672,7 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, /* This fixes a crash occurring during the instantiation of the NSAutoreleasePool below. */ - GSRegisterCurrentThread (); + NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; TRYCATCH_START @@ -1684,7 +1698,7 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, TRYCATCH_END(pool) [pool release]; - GSUnregisterCurrentThread (); + NS_CURRENT_THREAD_TRY_UNREGISTER(); return MAPISTORE_SUCCESS; } From 116e738e63e7b281191b76665ce616961ca93293 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 19 Jun 2014 19:30:17 +0200 Subject: [PATCH 33/45] oc/utils: Move OCDumpPListData() function into plreader - this is the only user for this function Signed-off-by: Kamen Mazdrashki --- OpenChange/NSObject+PropertyList.m | 43 ----------------------------- OpenChange/plreader.m | 44 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/OpenChange/NSObject+PropertyList.m b/OpenChange/NSObject+PropertyList.m index 07a42d976..08fcd01f6 100644 --- a/OpenChange/NSObject+PropertyList.m +++ b/OpenChange/NSObject+PropertyList.m @@ -139,46 +139,3 @@ const char *indentationStep = " "; @end -static void -OCDumpPListData (NSData *content) -{ - //NSDictionary *d; - //NSPropertyListFormat format; - //NSString *error = nil; - //const char *formatName; - - //d = [NSPropertyListSerialization propertyListFromData: content - // mutabilityOption: NSPropertyListImmutable - // format: &format - // errorDescription: &error]; - //d = [content BSONValue]; - - // if (d) - // { - // switch (format) - // { - // case NSPropertyListOpenStepFormat: - // formatName = "OpenStep"; - // break; - // case NSPropertyListXMLFormat_v1_0: - // formatName = "XML"; - // break; - // case NSPropertyListBinaryFormat_v1_0: - // formatName = "Binary"; - // break; - // case NSPropertyListGNUstepFormat: - // formatName = "GNUstep"; - // break; - // case NSPropertyListGNUstepBinaryFormat: - // formatName = "GNUstep binary"; - // break; - // default: formatName = "unknown"; - // } - - // printf ("File format is: %s\n", formatName); - // [d displayWithIndentation: 0]; - // printf ("\n"); - // } - // else - // printf ("an error occurred: %s\n", [error UTF8String]); -} diff --git a/OpenChange/plreader.m b/OpenChange/plreader.m index f6ee15672..69d0cd099 100644 --- a/OpenChange/plreader.m +++ b/OpenChange/plreader.m @@ -29,6 +29,50 @@ #import "NSObject+PropertyList.m" +static void +OCDumpPListData (NSData *content) +{ + //NSDictionary *d; + //NSPropertyListFormat format; + //NSString *error = nil; + //const char *formatName; + + //d = [NSPropertyListSerialization propertyListFromData: content + // mutabilityOption: NSPropertyListImmutable + // format: &format + // errorDescription: &error]; + //d = [content BSONValue]; + + // if (d) + // { + // switch (format) + // { + // case NSPropertyListOpenStepFormat: + // formatName = "OpenStep"; + // break; + // case NSPropertyListXMLFormat_v1_0: + // formatName = "XML"; + // break; + // case NSPropertyListBinaryFormat_v1_0: + // formatName = "Binary"; + // break; + // case NSPropertyListGNUstepFormat: + // formatName = "GNUstep"; + // break; + // case NSPropertyListGNUstepBinaryFormat: + // formatName = "GNUstep binary"; + // break; + // default: formatName = "unknown"; + // } + + // printf ("File format is: %s\n", formatName); + // [d displayWithIndentation: 0]; + // printf ("\n"); + // } + // else + // printf ("an error occurred: %s\n", [error UTF8String]); +} + static void PLReaderDumpPListFile (NSString *filename) { From 86e54989fbba8997eb41eb0b1b84fd2f10faa0b7 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Fri, 20 Jun 2014 03:23:38 +0200 Subject: [PATCH 34/45] oc/utils: Make "plext" category publicly visible Signed-off-by: Kamen Mazdrashki --- OpenChange/NSObject+PropertyList.h | 64 ++++++++++++++++++++++++++++++ OpenChange/NSObject+PropertyList.m | 6 +-- 2 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 OpenChange/NSObject+PropertyList.h diff --git a/OpenChange/NSObject+PropertyList.h b/OpenChange/NSObject+PropertyList.h new file mode 100644 index 000000000..34ea28ea8 --- /dev/null +++ b/OpenChange/NSObject+PropertyList.h @@ -0,0 +1,64 @@ +/* dbmsgdump.m - this file is part of SOGo + * + * Copyright (C) 2014 Kamen Mazdrashki + * + * Based on implementation done by Wolfgang Sourdeau + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * A format-agnostic dump extensions for: + * NSArray + * NSObject + * NSDictionary + */ + +#ifndef NSOBJECT_PROPERTYLIST_H +#define NSOBJECT_PROPERTYLIST_H + +#import +#import +#import + + +@interface NSObject (plext) + +- (void) displayWithIndentation: (NSInteger) anInt; + +@end + + +@interface NSDictionary (plext) + +- (void) displayKey: (NSString *) key + withIndentation: (NSInteger) anInt; + +- (void) displayWithIndentation: (NSInteger) anInt; + +@end + + +@interface NSArray (plext) + +- (void) displayCount: (NSUInteger) count + withIndentation: (NSInteger) anInt; + +- (void) displayWithIndentation: (NSInteger) anInt; + +@end + +#endif /* NSOBJECT_PROPERTYLIST_H */ diff --git a/OpenChange/NSObject+PropertyList.m b/OpenChange/NSObject+PropertyList.m index 08fcd01f6..164ac5054 100644 --- a/OpenChange/NSObject+PropertyList.m +++ b/OpenChange/NSObject+PropertyList.m @@ -32,14 +32,10 @@ #import #import +#import "NSObject+PropertyList.h" const char *indentationStep = " "; -@interface NSObject (plext) - -- (void) displayWithIndentation: (NSInteger) anInt; - -@end @implementation NSObject (plext) From c91741ad1f925b3acc828d88d28b82f640eb6997 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 19 Jun 2014 19:43:14 +0200 Subject: [PATCH 35/45] oc/dbmsgreader: Fix to work again this time basen on BSON format for msg data Also, implement reading for message data in case only 1 param is passed. This could be usefull when have msg data by other means than by reading it directly from DB Signed-off-by: Kamen Mazdrashki --- OpenChange/GNUmakefile | 3 ++- OpenChange/dbmsgreader.m | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index 2a7bac557..6f52587a7 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -133,7 +133,8 @@ $(PLREADER_TOOL)_OBJC_FILES += \ DBMSGREADER_TOOL = dbmsgreader $(DBMSGREADER_TOOL)_OBJC_FILES += \ - dbmsgreader.m + dbmsgreader.m \ + NSObject+PropertyList.m $(DBMSGREADER_TOOL)_LIB_DIRS += \ -L../SoObjects/SOGo/SOGo.framework/ -lSOGo \ diff --git a/OpenChange/dbmsgreader.m b/OpenChange/dbmsgreader.m index 97b3356d0..8e56655b8 100644 --- a/OpenChange/dbmsgreader.m +++ b/OpenChange/dbmsgreader.m @@ -36,10 +36,20 @@ #import "MAPIStoreUserContext.h" #import -#import "NSObject+PropertyList.m" +#import +#import "NSObject+PropertyList.h" Class MAPIStoreUserContextK, SOGoMAPIDBObjectK; +static void +DumpBSONData(NSData *data) +{ + NSDictionary *dvalue; + dvalue = [data BSONValue]; + [dvalue displayWithIndentation:0]; + printf("\n"); +} + static void DbDumpObject (NSString *username, NSString *path) { @@ -55,8 +65,9 @@ DbDumpObject (NSString *username, NSString *path) record = [dbobject lookupRecord: path newerThanVersion: -1]; if (record) { + printf("record found: %p\n", record); content = [[record objectForKey: @"c_content"] dataByDecodingBase64]; - OCDumpPListData (content); + DumpBSONData(content); } else NSLog (@"record not found"); @@ -99,9 +110,12 @@ int main (int argc, char *argv[], char *envp[]) SOGoMAPIDBObjectK = NSClassFromString (@"SOGoMAPIDBObject"); arguments = [[NSProcessInfo processInfo] arguments]; - if ([arguments count] > 2) + if ([arguments count] > 2) { DbDumpObject ([arguments objectAtIndex: 1], [arguments objectAtIndex: 2]); + } else if ([arguments count] > 1) { + DumpBSONData([[arguments objectAtIndex:1] dataByDecodingBase64]); + } [pool release]; From 5b75c817e21bb43c8a731ff2cb9a04f2e58bf080 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 19 Jun 2014 19:57:32 +0200 Subject: [PATCH 36/45] oc: Log when mapistore backend is successfully initialized --- OpenChange/MAPIStoreSOGo.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 0a160618c..570c06d86 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -184,6 +184,8 @@ sogo_backend_init (void) [pool release]; + DEBUG(0, ("[SOGo: %s:%d] backend init SUCCESS. Current thread: %p, pid: %d\n", __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); + return MAPISTORE_SUCCESS; } From 1fc3a57210b61cc73a91757f5d7ddc4050dc5f7f Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 19 Jun 2014 20:41:37 +0200 Subject: [PATCH 37/45] oc: Protect backend initialization to happen only once --- OpenChange/MAPIStoreSOGo.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 570c06d86..6975ab966 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -140,8 +140,14 @@ sogo_backend_init (void) Class MAPIApplicationK; NSUserDefaults *ud; SoProductRegistry *registry; + static BOOL moduleInitialized = NO; char *argv[] = { SAMBA_PREFIX "/sbin/samba", NULL }; + if (moduleInitialized) { + DEBUG(0, ("SOGo backend already initialized.\n")); + return MAPISTORE_SUCCESS; + } + GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; @@ -185,6 +191,7 @@ sogo_backend_init (void) [pool release]; DEBUG(0, ("[SOGo: %s:%d] backend init SUCCESS. Current thread: %p, pid: %d\n", __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); + moduleInitialized = YES; return MAPISTORE_SUCCESS; } From 1846e1ee5db7120d4ebca9842ab402333b26cac5 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Tue, 24 Jun 2014 15:28:42 +0200 Subject: [PATCH 38/45] oc/TallocWrapper: don't handle Threading initialization here It is SOGo backend module responsibility to setup/teardonw all ObjC specific initialization Signed-off-by: Kamen Mazdrashki --- OpenChange/NSObject+MAPIStore.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenChange/NSObject+MAPIStore.m b/OpenChange/NSObject+MAPIStore.m index e02f29f07..9ed02b7ab 100644 --- a/OpenChange/NSObject+MAPIStore.m +++ b/OpenChange/NSObject+MAPIStore.m @@ -47,13 +47,13 @@ MAPIStoreTallocWrapperDestroy (void *data) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; - GSRegisterCurrentThread (); +// GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; wrapper = data; //NSLog (@"destroying wrapped object (wrapper: %p; object: %p (%@))...\n", wrapper, wrapper->instance, NSStringFromClass([wrapper->instance class])); [wrapper->instance release]; [pool release]; - GSUnregisterCurrentThread (); +// GSUnregisterCurrentThread (); return 0; } From 65ece612734ec4fd88d08daeed5c86bd06fbd598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Juli=C3=A1n?= Date: Thu, 12 Jun 2014 15:46:02 +0200 Subject: [PATCH 39/45] Removing some trail characters at event description * They are sometimes present after a \r\n\n --- OpenChange/MAPIStoreAppointmentWrapper.m | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 24c6e1ad3..c07998c5e 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -1214,6 +1214,20 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } +/* +private static function parseDescriptionOc2Rc($description) +{ + $description = ltrim($description, ')'); + + if (strpos($description, "\r\n\n") !== false) { + $exploded = explode("\r\n\n", $description, -1); + $description = join($exploded, "\n"); + } + + return $description; +} +*/ + - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { From 41f2e917e76e07f1f6a62dc7eea0e8aada9d2bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Juli=C3=A1n?= Date: Thu, 12 Jun 2014 16:20:41 +0200 Subject: [PATCH 40/45] Removed development tip comment --- OpenChange/MAPIStoreAppointmentWrapper.m | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index c07998c5e..24c6e1ad3 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -1214,20 +1214,6 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -/* -private static function parseDescriptionOc2Rc($description) -{ - $description = ltrim($description, ')'); - - if (strpos($description, "\r\n\n") !== false) { - $exploded = explode("\r\n\n", $description, -1); - $description = join($exploded, "\n"); - } - - return $description; -} -*/ - - (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { From 7f2ee7be89d6dbbd0a70eb43a3ef32d6c56761c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Wed, 2 Jul 2014 10:40:05 +0200 Subject: [PATCH 41/45] Error message only when initialization hadn't been done In a multithread environment, sogo_backend_init is registering the thread only for the first one that calls this function, then the others threads (even if they call sogo_backend_init) won't be registered because moduleInitialized was YES. We just want to ensure sogo_backend_init is called at least once (per process, not per thread). --- OpenChange/MAPIStoreSOGo.m | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 6975ab966..e43422078 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -53,18 +53,17 @@ static Class MAPIStoreContextK = Nil; static BOOL leakDebugging = NO; +static BOOL initialization_done = NO; #define NS_CURRENT_THREAD_REGISTER() \ BOOL __nsrct_thread_registered = GSRegisterCurrentThread(); \ - if (__nsrct_thread_registered) { \ - DEBUG(0, ("[SOGo: %s:%d] Current Thread not registered! You should call sogo_backend_init() first. Current thread: %p, pid: %d\n", \ + if (!initialization_done) { \ + DEBUG(0, ("[SOGo: %s:%d] You should call sogo_backend_init() first. Current thread: %p, pid: %d\n", \ __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); \ } #define NS_CURRENT_THREAD_TRY_UNREGISTER() \ if (__nsrct_thread_registered) { \ - DEBUG(0, ("[SOGo: %s:%d] Unregister current thread. You should have called sogo_backend_init(). Current thread: %p, pid: %d\n", \ - __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); \ - GSUnregisterCurrentThread(); \ + GSUnregisterCurrentThread(); \ } #define TRYCATCH_START @try { @@ -140,15 +139,15 @@ sogo_backend_init (void) Class MAPIApplicationK; NSUserDefaults *ud; SoProductRegistry *registry; - static BOOL moduleInitialized = NO; char *argv[] = { SAMBA_PREFIX "/sbin/samba", NULL }; - if (moduleInitialized) { + GSRegisterCurrentThread(); + + if (initialization_done) { DEBUG(0, ("SOGo backend already initialized.\n")); return MAPISTORE_SUCCESS; } - GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; /* Here we work around a bug in GNUstep which decodes XML user @@ -191,7 +190,7 @@ sogo_backend_init (void) [pool release]; DEBUG(0, ("[SOGo: %s:%d] backend init SUCCESS. Current thread: %p, pid: %d\n", __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); - moduleInitialized = YES; + initialization_done = YES; return MAPISTORE_SUCCESS; } From 3eba5f940e353909628ab6fa59c4f402cccd0e32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Wed, 2 Jul 2014 12:24:09 +0200 Subject: [PATCH 42/45] increase log level of debug message --- OpenChange/MAPIStoreSOGo.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index e43422078..923541764 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -58,7 +58,7 @@ static BOOL initialization_done = NO; #define NS_CURRENT_THREAD_REGISTER() \ BOOL __nsrct_thread_registered = GSRegisterCurrentThread(); \ if (!initialization_done) { \ - DEBUG(0, ("[SOGo: %s:%d] You should call sogo_backend_init() first. Current thread: %p, pid: %d\n", \ + DEBUG(5, ("[SOGo: %s:%d] You should call sogo_backend_init() first. Current thread: %p, pid: %d\n", \ __FUNCTION__, __LINE__, GSCurrentThread(), getpid())); \ } #define NS_CURRENT_THREAD_TRY_UNREGISTER() \ From 2b3bc10f786ce6948dfeb90d1752d975de5bbf51 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 3 Jul 2014 14:59:49 +0200 Subject: [PATCH 43/45] Scripts/openchange_user_cleanup: Don't hardcode samba private dir, use samba LoadParm() Signed-off-by: Kamen Mazdrashki --- Scripts/openchange_user_cleanup | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Scripts/openchange_user_cleanup b/Scripts/openchange_user_cleanup index 411479819..a42aa8b37 100755 --- a/Scripts/openchange_user_cleanup +++ b/Scripts/openchange_user_cleanup @@ -9,12 +9,14 @@ import re import shutil import subprocess import sys +from samba.param import LoadParm imaphost = '127.0.0.1' imapport = 143 -sambaprivate = '/var/lib/samba/private' -mapistorefolder = "%s/mapistore" % (sambaprivate) +samba_lp = LoadParm() +sambaprivate = samba_lp.get("private dir") +mapistorefolder = samba_lp.private_path("mapistore") sogoSysDefaultsFile = "/etc/sogo/sogo.conf" sogoUserDefaultsFile = os.path.expanduser("~sogo/GNUstep/Defaults/.GNUstepDefaults") From f76a6cfc96aeefd1d5b913a29e60dcce6dfa9b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20P=C3=A9rez-Aradros=20Herce?= Date: Wed, 9 Jul 2014 13:28:42 +0200 Subject: [PATCH 44/45] Fix mysql cleanup log message --- Scripts/openchange_user_cleanup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Scripts/openchange_user_cleanup b/Scripts/openchange_user_cleanup index a42aa8b37..e67289480 100755 --- a/Scripts/openchange_user_cleanup +++ b/Scripts/openchange_user_cleanup @@ -214,7 +214,7 @@ On RHEL, install it using 'yum install MySQL-python'""" c=conn.cursor() tablename="sogo_cache_folder_%s" % (username) c.execute("TRUNCATE TABLE %s" % tablename) - print "Table %s emptied" + print "Table %s emptied" % tablename def postgresqlCleanup(dbhost, dbport, dbuser, dbpass, dbname, username): From 1a2fe8908b2f6feb674d69f47f034b253c2a444d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Wed, 19 Mar 2014 17:19:07 +0100 Subject: [PATCH 45/45] Revert "Merge pull request #2 from Zentyal/jgarcia/fix-encoding-of-mapistoreuris" --- OpenChange/MAPIStoreContext.m | 10 ++++++---- OpenChange/MAPIStoreMailContext.m | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 128e8d31f..5b73173d8 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -365,21 +365,23 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { int rc; NSString *objectURL, *url; + // TDB_DATA key, dbuf; - url = [contextUrl absoluteString]; + url = [[contextUrl absoluteString] + stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; objectURL = [[userContext mapping] urlFromID: fmid]; if (objectURL) { if ([objectURL hasPrefix: url]) { *path = [[objectURL substringFromIndex: 7] asUnicodeInMemCtx: memCtx]; - [self logWithFormat: @"found path '%s' for fmid 0x%.16"PRIx64"", *path, fmid]; + [self logWithFormat: @"found path '%s' for fmid 0x%.16"PRIx64"", *path, fmid]; rc = MAPISTORE_SUCCESS; } else { - [self logWithFormat: @"context (%@, %@) does not contain " - @"found fmid: 0x%.16"PRIx64"", objectURL, url, fmid]; + [self logWithFormat: @"context (%@, %@) does not contain " + @"found fmid: 0x%.16"PRIx64"", objectURL, url, fmid]; *path = NULL; rc = MAPISTORE_SUCCESS; } diff --git a/OpenChange/MAPIStoreMailContext.m b/OpenChange/MAPIStoreMailContext.m index f81b6c10e..24d974e5a 100644 --- a/OpenChange/MAPIStoreMailContext.m +++ b/OpenChange/MAPIStoreMailContext.m @@ -157,7 +157,7 @@ MakeDisplayFolderName (NSString *folderName) stringData = [NSString stringWithFormat: @"%@%@", urlBase, [currentName stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; context->url = [stringData asUnicodeInMemCtx: context]; - stringData = [[currentName substringFromIndex: 6] fromCSSIdentifier]; + stringData = [[[currentName substringFromIndex: 6] fromCSSIdentifier] stringByDecodingImap4FolderName]; context->name = [stringData asUnicodeInMemCtx: context]; context->main_folder = false; context->role = MAPISTORE_MAIL_ROLE; @@ -189,7 +189,7 @@ MakeDisplayFolderName (NSString *folderName) if ([newFolder create]) mapistoreURI = [NSString stringWithFormat: @"sogo://%@:%@@mail/%@/", userName, userName, - [folderName stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; + [[folderName stringByEncodingImap4FolderName] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]; else mapistoreURI = nil; [MAPIApp setUserContext: nil];