diff --git a/ChangeLog b/ChangeLog index 60cc5865f..531b5d2c6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,10 @@ function for returning an NSObject from a property tag and a data pointer. + * OpenChange/MAPIStoreContext.m + (-setProperty:withFMID:ofTableType:fromFile:): new method + implementing the "set_property_from_fd" backend operation. + 2010-11-24 Wolfgang Sourdeau * OpenChange/SOGoDraftObject+MAPIStore.m: new category module. diff --git a/OpenChange/MAPIStoreContext.h b/OpenChange/MAPIStoreContext.h index db4272e0a..0267452ef 100644 --- a/OpenChange/MAPIStoreContext.h +++ b/OpenChange/MAPIStoreContext.h @@ -36,6 +36,7 @@ #define TBL_COLLAPSED_CATEGORY 0x00000004 @class NSArray; +@class NSFileHandle; @class NSMutableDictionary; @class NSString; @@ -123,6 +124,10 @@ - (int) setPropertiesWithFMID: (uint64_t) fmid ofTableType: (uint8_t) tableType inRow: (struct SRow *) aRow; +- (int) setProperty: (enum MAPITAGS) property + withFMID: (uint64_t) fmid + ofTableType: (uint8_t) tableType + fromFile: (NSFileHandle *) aFile; - (int) modifyRecipientsWithMID: (uint64_t) mid inRows: (struct ModifyRecipientRow *) rows withCount: (NSUInteger) max; diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 430f9013b..192cf963e 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -21,6 +21,7 @@ */ #import +#import #import #import #import @@ -1236,6 +1237,41 @@ _prepareContextClass (struct mapistore_context *newMemCtx, return rc; } +- (int) setProperty: (enum MAPITAGS) property + withFMID: (uint64_t) fmid + ofTableType: (uint8_t) tableType + fromFile: (NSFileHandle *) aFile +{ + NSMutableDictionary *message; + NSNumber *midNbr; + NSData *fileData; + int rc; + + fileData = [aFile readDataToEndOfFile]; + switch (tableType) + { + case MAPISTORE_MESSAGE: + midNbr = [NSNumber numberWithUnsignedLongLong: fmid]; + message = [messages objectForKey: midNbr]; + if (message) + { + [message setObject: NSObjectFromStreamData (property, fileData) + forKey: MAPIPropertyNumber (property)]; + rc = MAPISTORE_SUCCESS; + } + else + rc = MAPISTORE_ERR_NOT_FOUND; + break; + case MAPISTORE_FOLDER: + default: + [self errorWithFormat: @"%s: value of tableType not handled: %d", + __FUNCTION__, tableType]; + rc = MAPISTORE_ERROR; + } + + return rc; +} + - (NSDictionary *) _convertRecipientFromRow: (struct RecipientRow *) row { NSMutableDictionary *recipient; diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index afa6b0038..f53b5f664 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -23,6 +23,7 @@ /* OpenChange SOGo storage backend */ #import +#import #import #import @@ -588,6 +589,36 @@ static int sogo_op_setprops(void *private_data, return rc; } +static int sogo_op_set_property_from_fd(void *private_data, + uint64_t fmid, uint8_t type, + uint32_t property, int fd) +{ + NSAutoreleasePool *pool; + sogo_context *cContext; + MAPIStoreContext *context; + NSFileHandle *fileHandle; + int rc; + + DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); + + pool = [NSAutoreleasePool new]; + + cContext = private_data; + context = cContext->objcContext; + [context setupRequest]; + + fileHandle = [[NSFileHandle alloc] initWithFileDescriptor: fd + closeOnDealloc: NO]; + rc = [context setProperty: property withFMID: fmid ofTableType: type + fromFile: fileHandle]; + [fileHandle release]; + + [context tearDownRequest]; + [pool release]; + + return rc; +} + static int sogo_op_modifyrecipients(void *private_data, uint64_t mid, struct ModifyRecipientRow *rows, @@ -710,6 +741,7 @@ int mapistore_init_backend(void) backend.op_getprops = sogo_op_getprops; backend.op_get_fid_by_name = sogo_op_get_fid_by_name; backend.op_setprops = sogo_op_setprops; + backend.op_set_property_from_fd = sogo_op_set_property_from_fd; backend.op_modifyrecipients = sogo_op_modifyrecipients; backend.op_deletemessage = sogo_op_deletemessage; backend.op_get_folders_list = sogo_op_get_folders_list;