diff --git a/ChangeLog b/ChangeLog index eca66124c..e11f32d66 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2012-07-20 Wolfgang Sourdeau + * OpenChange/MAPIStoreSOGo.m + (sogo_message_attachment_create_embedded_message): new backend method. + * OpenChange/NSObject+MAPIStore.m (+fillAvailableProperties:withExclusions:): new method that fills an existing array of properties with properties existing in diff --git a/OpenChange/MAPIStoreAttachment.h b/OpenChange/MAPIStoreAttachment.h index 1d4576572..76afd8539 100644 --- a/OpenChange/MAPIStoreAttachment.h +++ b/OpenChange/MAPIStoreAttachment.h @@ -37,10 +37,12 @@ - (uint32_t) AID; - (int) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr - inMode: (enum OpenEmbeddedMessage_OpenModeFlags) mode withMID: (uint64_t *) mid withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr inMemCtx: (TALLOC_CTX *) memCtx; +- (int) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr + withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr + inMemCtx: (TALLOC_CTX *) memCtx; /* helpers */ - (NSData *) mimeAttachTag; diff --git a/OpenChange/MAPIStoreAttachment.m b/OpenChange/MAPIStoreAttachment.m index 86944436b..9e1551eb0 100644 --- a/OpenChange/MAPIStoreAttachment.m +++ b/OpenChange/MAPIStoreAttachment.m @@ -91,7 +91,6 @@ } - (int) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr - inMode: (enum OpenEmbeddedMessage_OpenModeFlags) mode withMID: (uint64_t *) mid withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr inMemCtx: (TALLOC_CTX *) memCtx @@ -104,24 +103,34 @@ mapping = [self mapping]; - if (mode == MAPI_CREATE) - attMessage = [self createEmbeddedMessage]; - else + // if (attMessage) + attMessage = [self openEmbeddedMessage]; + if (attMessage) { - // if (attMessage) - // [mapping registerURL: [attMessage url] - // withID: *mid]; - attMessage = [self openEmbeddedMessage]; - if (attMessage) - { - *mid = [mapping idFromURL: [attMessage url]]; - *messagePtr = attMessage; - *mapistoreMsgPtr = mapistoreMsg; - } + *mid = [mapping idFromURL: [attMessage url]]; + [mapping registerURL: [attMessage url] + withID: *mid]; + *messagePtr = attMessage; + *mapistoreMsgPtr = mapistoreMsg; + } + + return (attMessage ? MAPISTORE_SUCCESS : MAPISTORE_ERROR); +} + +- (int) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr + withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr + inMemCtx: (TALLOC_CTX *) memCtx +{ + MAPIStoreEmbeddedMessage *attMessage; + struct mapistore_message *mapistoreMsg; + + mapistoreMsg = talloc_zero (memCtx, struct mapistore_message); + attMessage = [self createEmbeddedMessage]; + if (attMessage) + { + *messagePtr = attMessage; + *mapistoreMsgPtr = mapistoreMsg; } - // else if (flags == MAPI_CREATE) - // { - // } return (attMessage ? MAPISTORE_SUCCESS : MAPISTORE_ERROR); } diff --git a/OpenChange/MAPIStoreEmbeddedMessage.h b/OpenChange/MAPIStoreEmbeddedMessage.h index 431f60e80..62c9431ba 100644 --- a/OpenChange/MAPIStoreEmbeddedMessage.h +++ b/OpenChange/MAPIStoreEmbeddedMessage.h @@ -26,13 +26,6 @@ #import "MAPIStoreMessage.h" @interface MAPIStoreEmbeddedMessage : MAPIStoreMessage -{ - id attachment; -} - -+ (id) embeddedMessageWithAttachment: (id) newAttachment; - -- (id) initWithAttachment: (id) newAttachment; @end diff --git a/OpenChange/MAPIStoreEmbeddedMessage.m b/OpenChange/MAPIStoreEmbeddedMessage.m index fe0e28105..63f093095 100644 --- a/OpenChange/MAPIStoreEmbeddedMessage.m +++ b/OpenChange/MAPIStoreEmbeddedMessage.m @@ -26,6 +26,8 @@ #import "MAPIStoreEmbeddedMessage.h" +#include + static Class MAPIStoreAttachmentK; @implementation MAPIStoreEmbeddedMessage @@ -35,25 +37,28 @@ static Class MAPIStoreAttachmentK; MAPIStoreAttachmentK = [MAPIStoreAttachment class]; } -+ (id) embeddedMessageWithAttachment: (id) newAttachment +- (int) getPidTagFolderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - MAPIStoreEmbeddedMessage *newMessage; - - newMessage = [[self alloc] initWithAttachment: newAttachment]; - [newMessage autorelease]; - - return newMessage; + return MAPISTORE_ERR_NOT_FOUND; } -- (id) initWithAttachment: (id) newAttachment +- (int) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - if ((self = [self init])) - { - if ([newAttachment isKindOfClass: MAPIStoreAttachmentK]) - ASSIGN (container, newAttachment); - } + return MAPISTORE_ERR_NOT_FOUND; +} - return self; +- (int) getPidTagParentSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return MAPISTORE_ERR_NOT_FOUND; +} + +- (int) getPidTagChangeNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return MAPISTORE_ERR_NOT_FOUND; } - (NSString *) nameInContainer @@ -61,4 +66,14 @@ static Class MAPIStoreAttachmentK; return @"as-message"; } +- (uint64_t) objectVersion +{ + return ULLONG_MAX; +} + +- (void) save +{ + [self subclassResponsibility: _cmd]; +} + @end diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index d7ba5c387..2dd78074b 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -962,10 +962,11 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) } static enum mapistore_error -sogo_message_attachment_open_embedded_message -(void *attachment_object, enum OpenEmbeddedMessage_OpenModeFlags mode, - TALLOC_CTX *mem_ctx, void **message_object, uint64_t *midP, - struct mapistore_message **msg) +sogo_message_attachment_open_embedded_message (void *attachment_object, + TALLOC_CTX *mem_ctx, + void **message_object, + uint64_t *midP, + struct mapistore_message **msg) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; @@ -982,7 +983,6 @@ sogo_message_attachment_open_embedded_message GSRegisterCurrentThread (); pool = [NSAutoreleasePool new]; rc = [attachment openEmbeddedMessage: &message - inMode: mode withMID: midP withMAPIStoreMsg: msg inMemCtx: mem_ctx]; @@ -999,6 +999,42 @@ sogo_message_attachment_open_embedded_message return rc; } +static enum mapistore_error +sogo_message_attachment_create_embedded_message (void *attachment_object, + TALLOC_CTX *mem_ctx, + void **message_object, + struct mapistore_message **msg) +{ + struct MAPIStoreTallocWrapper *wrapper; + NSAutoreleasePool *pool; + MAPIStoreAttachment *attachment; + MAPIStoreEmbeddedMessage *message; + int rc; + + DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); + + if (attachment_object) + { + wrapper = 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]; + [pool release]; + GSUnregisterCurrentThread (); + } + else + { + rc = sogo_backend_unexpected_error(); + } + + return rc; +} + static enum mapistore_error sogo_table_get_available_properties(void *table_object, TALLOC_CTX *mem_ctx, struct SPropTagArray **propertiesP) { @@ -1386,6 +1422,7 @@ int mapistore_init_backend(void) backend.message.get_attachment_table = sogo_message_get_attachment_table; backend.message.open_attachment = sogo_message_open_attachment; backend.message.open_embedded_message = sogo_message_attachment_open_embedded_message; + backend.message.create_embedded_message = sogo_message_attachment_create_embedded_message; backend.message.get_message_data = sogo_message_get_message_data; backend.message.modify_recipients = sogo_message_modify_recipients; backend.message.set_read_flag = sogo_message_set_read_flag;