diff --git a/ChangeLog b/ChangeLog index 901c7d36f..fc820244f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2011-10-12 Wolfgang Sourdeau + * OpenChange/MAPIStoreSOGo.m (sogo_manager_generate_uri): new + backend op. Code from j.kerihuel@openchange.org. + * OpenChange/MAPIStoreAppointmentWrapper.m (-initWithICalEvent:andUser:andSenderEmail:inTimeZone:): take a new "senderEmail" parameter in order to help the process of diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index fa9f86788..312b20ec4 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -170,6 +170,9 @@ _prepareContextClass (Class contextClass, if (context) { *contextPtr = context; + mapistore_mgmt_backend_register_user (newConnInfo, + "SOGo", + [[[context authenticator] username] UTF8String]); rc = MAPISTORE_SUCCESS; } } @@ -221,6 +224,9 @@ _prepareContextClass (Class contextClass, - (void) dealloc { + mapistore_mgmt_backend_unregister_user ([self connectionInfo], "SOGo", + [[[self authenticator] username] + UTF8String]); [baseFolder release]; [woContext release]; [authenticator release]; diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 32869f644..edd758aad 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -25,6 +25,7 @@ #import #import #import +#import #import #import #import @@ -1044,6 +1045,54 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) return rc; } +static int +sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, + const char *user, + const char *folder, + const char *message, + const char *rootURI, + char **uri) +{ + NSAutoreleasePool *pool; + NSString *partialURLString, *username, *directory; + + DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); + + if (uri == NULL) return MAPISTORE_ERR_INVALID_PARAMETER; + + /* This fixes a crash occurring during the instantiation of the + NSAutoreleasePool below. */ + GSRegisterCurrentThread (); + + pool = [NSAutoreleasePool new]; + + // printf("rootURI = %s\n", rootURI); + if (rootURI) + partialURLString = [NSString stringWithUTF8String: rootURI]; + else + { + /* sogo uri are of type: sogo://[username]:[password]@[folder type]/folder/id */ + username = [NSString stringWithUTF8String: (user ? user : "*")]; + /* Do proper directory lookup here */ + directory = [NSString stringWithUTF8String: (folder ? folder : "*")]; + partialURLString = [NSString stringWithFormat: @"sogo://%@:*@%@", username, directory]; + } + if (![partialURLString hasSuffix: @"/"]) + partialURLString = [partialURLString stringByAppendingString: @"/"]; + + if (message) + partialURLString = [partialURLString stringByAppendingFormat: @"%s.eml", message]; + + // printf("uri = %s\n", [partialURLString UTF8String]); + *uri = talloc_strdup (mem_ctx, [partialURLString UTF8String]); + + [pool release]; + + GSUnregisterCurrentThread (); + + return MAPISTORE_SUCCESS; +} + /** \details Entry point for mapistore SOGO backend @@ -1061,7 +1110,6 @@ int mapistore_init_backend(void) { registered = YES; - /* Fill in our name */ backend.backend.name = "SOGo"; backend.backend.description = "mapistore SOGo backend"; backend.backend.namespace = "sogo://"; @@ -1096,12 +1144,12 @@ int mapistore_init_backend(void) backend.properties.get_available_properties = sogo_properties_get_available_properties; backend.properties.get_properties = sogo_properties_get_properties; backend.properties.set_properties = sogo_properties_set_properties; + backend.manager.generate_uri = sogo_manager_generate_uri; /* Register ourselves with the MAPISTORE subsystem */ - ret = mapistore_backend_register(&backend); - if (ret != MAPISTORE_SUCCESS) { + ret = mapistore_backend_register (&backend); + if (ret != MAPISTORE_SUCCESS) DEBUG(0, ("Failed to register the '%s' mapistore backend!\n", backend.backend.name)); - } } return ret;