diff --git a/ChangeLog b/ChangeLog index bc276839d..31c868e35 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2011-07-11 Wolfgang Sourdeau + * OpenChange/*: made backend ops consistent with the talloc API, + where resources are allocated in a tree of "talloc contexts". + * OpenChange/NSObject+MAPIStore.m (-tallocWrapper:): new method enabling the wrapping of obj-c objects into talloc structures, in order to ease memory management. diff --git a/OpenChange/MAPIStoreAttachment.h b/OpenChange/MAPIStoreAttachment.h index 2f5a1cb9a..413d80062 100644 --- a/OpenChange/MAPIStoreAttachment.h +++ b/OpenChange/MAPIStoreAttachment.h @@ -35,7 +35,7 @@ - (void) setAID: (uint32_t) newAID; - (uint32_t) AID; -- (int) openEmbeddedMessage: (void **) message +- (int) openEmbeddedMessage: (MAPIStoreAttachmentMessage **) message withMID: (uint64_t *) mid withMAPIStoreMsg: (struct mapistore_message *) mapistoreMsg andFlags: (enum OpenEmbeddedMessage_OpenModeFlags) flags; diff --git a/OpenChange/MAPIStoreAttachment.m b/OpenChange/MAPIStoreAttachment.m index 571c2fe13..311a5b78d 100644 --- a/OpenChange/MAPIStoreAttachment.m +++ b/OpenChange/MAPIStoreAttachment.m @@ -67,6 +67,7 @@ - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { int rc; @@ -90,7 +91,7 @@ return rc; } -- (int) openEmbeddedMessage: (void **) message +- (int) openEmbeddedMessage: (MAPIStoreAttachmentMessage **) message withMID: (uint64_t *) mid withMAPIStoreMsg: (struct mapistore_message *) mapistoreMsg andFlags: (enum OpenEmbeddedMessage_OpenModeFlags) flags @@ -113,7 +114,6 @@ withID: *mid]; } *message = attMessage; - [attMessage retain]; return (attMessage ? MAPISTORE_SUCCESS : MAPISTORE_ERROR); } diff --git a/OpenChange/MAPIStoreCalendarAttachment.m b/OpenChange/MAPIStoreCalendarAttachment.m index 335c3fce1..929a724e7 100644 --- a/OpenChange/MAPIStoreCalendarAttachment.m +++ b/OpenChange/MAPIStoreCalendarAttachment.m @@ -36,6 +36,7 @@ - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) localMemCtx { int rc; @@ -43,13 +44,13 @@ switch (propTag) { case PR_ATTACHMENT_HIDDEN: - *data = MAPIBoolValue (memCtx, YES); + *data = MAPIBoolValue (localMemCtx, YES); break; case PR_ATTACHMENT_FLAGS: - *data = MAPILongValue (memCtx, 0x00000002); /* afException */ + *data = MAPILongValue (localMemCtx, 0x00000002); /* afException */ break; case PR_ATTACH_METHOD: - *data = MAPILongValue (memCtx, 0x00000005); /* afEmbeddedMessage */ + *data = MAPILongValue (localMemCtx, 0x00000005); /* afEmbeddedMessage */ break; // case PidTagExceptionStartTime: @@ -57,7 +58,7 @@ // case PidTagExceptionReplaceTime: default: - rc = [super getProperty: data withTag: propTag]; + rc = [super getProperty: data withTag: propTag inMemCtx: localMemCtx]; } return rc; diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 7edfe631d..f92b449d1 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -115,11 +115,10 @@ static NSTimeZone *utcTZ; [calendar removeChildren: otherEvents]; [otherEvents release]; - blob = [mapiRecurrenceData asBinaryInMemCtx: memCtx]; - pattern = get_AppointmentRecurrencePattern (memCtx, blob); + blob = [mapiRecurrenceData asBinaryInMemCtx: NULL]; + pattern = get_AppointmentRecurrencePattern (blob, blob); [calendar setupRecurrenceWithMasterEntity: event fromRecurrencePattern: &pattern->RecurrencePattern]; - talloc_free (pattern); talloc_free (blob); } @@ -146,7 +145,8 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, arp->ReservedBlock2Size = 0; */ } -- (struct SBinary_short *) _computeAppointmentRecur +- (struct SBinary_short *) _computeAppointmentRecurInMemCtx: (TALLOC_CTX *) memCtx + { struct AppointmentRecurrencePattern *arp; struct Binary_r *bin; @@ -188,6 +188,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, /* getters */ - (int) getPrIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; iCalEvent *event; @@ -212,6 +213,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPrMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup(memCtx, "IPM.Appointment"); @@ -219,6 +221,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPrStartDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; iCalEvent *event; @@ -236,16 +239,19 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidAppointmentStartWhole: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrStartDate: data]; + return [self getPrStartDate: data inMemCtx: memCtx]; } - (int) getPidLidCommonStart: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrStartDate: data]; + return [self getPrStartDate: data inMemCtx: memCtx]; } - (int) getPrEndDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; iCalEvent *event; @@ -268,16 +274,19 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidAppointmentEndWhole: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrEndDate: data]; + return [self getPrEndDate: data inMemCtx: memCtx]; } - (int) getPidLidCommonEnd: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrEndDate: data]; + return [self getPrEndDate: data inMemCtx: memCtx]; } - (int) getPidLidAppointmentDuration: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSTimeInterval timeValue; iCalEvent *event; @@ -291,6 +300,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidAppointmentSubType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { iCalEvent *event; @@ -301,6 +311,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidBusyStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x02); @@ -308,6 +319,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPrSubject: (void **) data // SUMMARY + inMemCtx: (TALLOC_CTX *) memCtx { iCalEvent *event; @@ -318,6 +330,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidLocation: (void **) data // LOCATION + inMemCtx: (TALLOC_CTX *) memCtx { iCalEvent *event; @@ -328,17 +341,20 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrSensitivity: (void **) data // not implemented, depends on CLASS + inMemCtx: (TALLOC_CTX *) memCtx { // normal = 0, personal?? = 1, private = 2, confidential = 3 - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPrImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; iCalEvent *event; @@ -357,6 +373,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidIsRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { iCalEvent *event; @@ -367,6 +384,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { iCalEvent *event; @@ -377,6 +395,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (int) getPidLidAppointmentRecur: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; iCalEvent *event; @@ -384,7 +403,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, event = [sogoObject component: NO secure: NO]; if ([event isRecurrent]) - *data = [self _computeAppointmentRecur]; + *data = [self _computeAppointmentRecurInMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; @@ -392,6 +411,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, } - (void) openMessage: (struct mapistore_message *) msg + inMemCtx: (TALLOC_CTX *) memCtx { NSString *text; NSArray *attendees; @@ -400,7 +420,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, int count, max; iCalEvent *event; - [super openMessage: msg]; + [super openMessage: msg inMemCtx: memCtx]; event = [sogoObject component: NO secure: NO]; attendees = [event attendees]; diff --git a/OpenChange/MAPIStoreContactsMessage.m b/OpenChange/MAPIStoreContactsMessage.m index c1e33bd5f..e871582f4 100644 --- a/OpenChange/MAPIStoreContactsMessage.m +++ b/OpenChange/MAPIStoreContactsMessage.m @@ -49,6 +49,7 @@ @implementation MAPIStoreContactsMessage - (int) getPrIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ *data = MAPILongValue (memCtx, 0x00000200); @@ -57,6 +58,7 @@ } - (int) getPrMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.Contact"); @@ -64,6 +66,7 @@ } - (int) getPrOabName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "PR_OAB_NAME_UNICODE"); @@ -71,6 +74,7 @@ } - (int) getPrOabLangid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/goglobal/bb895996.asxp */ /* English US */ @@ -80,6 +84,7 @@ } - (int) getPrTitle: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -90,6 +95,7 @@ } - (int) getPrCompanyName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSArray *values; NSString *stringValue; @@ -108,6 +114,7 @@ } - (int) getPrDepartmentName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSArray *values; NSString *stringValue; @@ -126,6 +133,7 @@ } - (int) getPrSendInternetEncoding: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00065001); @@ -133,16 +141,19 @@ } - (int) getPrSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayName: data]; + return [self getPrDisplayName: data inMemCtx: memCtx]; } - (int) getPidLidFileUnder: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayName: data]; + return [self getPrDisplayName: data inMemCtx: memCtx]; } - (int) getPidLidFileUnderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0xffffffff); @@ -150,6 +161,7 @@ } - (int) getPidLidEmail1DisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NGVCard *vCard; NSString *fn, *email; @@ -164,11 +176,13 @@ } - (int) getPidLidEmail1OriginalDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPidLidEmail1DisplayName: data]; + return [self getPidLidEmail1DisplayName: data inMemCtx: memCtx]; } - (int) getPidLidEmail1EmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -179,11 +193,13 @@ } - (int) getPrAccount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPidLidEmail1EmailAddress: data]; + return [self getPidLidEmail1EmailAddress: data inMemCtx: memCtx]; } - (int) getPrContactEmailAddresses: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -197,6 +213,7 @@ } - (int) getPrEmsAbTargetAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -208,6 +225,7 @@ } - (int) getPrSearchKey: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -219,11 +237,13 @@ } - (int) getPrMailPermission: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getYes: data]; + return [self getYes: data inMemCtx: memCtx]; } - (int) getPidLidEmail2EmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSMutableArray *emails; NSString *email, *stringValue; @@ -257,11 +277,13 @@ } - (int) getPidLidEmail2OriginalDisplayName: (void **) data // Other email + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPidLidEmail2EmailAddress: data]; + return [self getPidLidEmail2EmailAddress: data inMemCtx: memCtx]; } - (int) getPrBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -276,6 +298,7 @@ excluding: (NSString *) aTypeToExclude atPos: (NSUInteger) pos inData: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSArray *elements; CardElement *ce; @@ -307,57 +330,67 @@ } - (int) getPrOfficeTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"work" excluding: @"fax" - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPrHomeTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"home" excluding: @"fax" - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPrMobileTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"cell" excluding: nil - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPrPrimaryTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"pref" excluding: nil - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPrBusinessHomePage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"url" ofType: @"work" excluding: nil - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPrPersonalHomePage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"url" ofType: @"home" excluding: nil - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidLidEmail1AddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getSMTPAddrType: data]; + return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidLidEmail2AddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getSMTPAddrType: data]; + return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidLidEmail3AddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getSMTPAddrType: data]; + return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPidLidInstantMessagingAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -371,6 +404,7 @@ } - (int) getPidLidPostalAddressId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSArray *elements; CardElement *element; @@ -397,90 +431,105 @@ } - (int) getPrPostalAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"pref" excluding: nil - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPrPostOfficeBox: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPrStreetAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil - atPos: 2 inData: data]; + atPos: 2 inData: data inMemCtx: memCtx]; } - (int) getPrLocality: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil - atPos: 3 inData: data]; + atPos: 3 inData: data inMemCtx: memCtx]; } - (int) getPrStateOrProvince: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil - atPos: 4 inData: data]; + atPos: 4 inData: data inMemCtx: memCtx]; } - (int) getPrPostalCode: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil - atPos: 5 inData: data]; + atPos: 5 inData: data inMemCtx: memCtx]; } - (int) getPrCountry: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil - atPos: 6 inData: data]; + atPos: 6 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"work" excluding: nil - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressPostOfficeBox: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil - atPos: 0 inData: data]; + atPos: 0 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressStreet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil - atPos: 2 inData: data]; + atPos: 2 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressCity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil - atPos: 3 inData: data]; + atPos: 3 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressState: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil - atPos: 4 inData: data]; + atPos: 4 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressPostalCode: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil - atPos: 5 inData: data]; + atPos: 5 inData: data inMemCtx: memCtx]; } - (int) getPidLidWorkAddressCountry: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil - atPos: 6 inData: data]; + atPos: 6 inData: data inMemCtx: memCtx]; } - (int) getPrNickname: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -491,6 +540,7 @@ } - (int) getPrBirthday: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSString *stringValue; @@ -599,8 +649,7 @@ [newCard addChild: element]; } if (postalAddressId == 2) - [element addAttribute: @"type" - value: @"pref"]; + [element addAttribute: @"type" value: @"pref"]; value = [newProperties objectForKey: MAPIPropertyKey (PidLidWorkAddressPostOfficeBox)]; if (value) [element setValue: 0 to: value]; diff --git a/OpenChange/MAPIStoreContext.h b/OpenChange/MAPIStoreContext.h index 04b0c5d62..b2e7e408e 100644 --- a/OpenChange/MAPIStoreContext.h +++ b/OpenChange/MAPIStoreContext.h @@ -23,6 +23,8 @@ #ifndef MAPISTORECONTEXT_H #define MAPISTORECONTEXT_H +#include + #import @class NSArray; @@ -41,13 +43,15 @@ @class SOGoObject; @class MAPIStoreAuthenticator; +@class MAPIStoreAttachment; +@class MAPIStoreAttachmentTable; @class MAPIStoreFolder; @class MAPIStoreMapping; @class MAPIStoreTable; @interface MAPIStoreContext : NSObject { - struct mapistore_context *memCtx; + struct mapistore_context *mstoreCtx; struct mapistore_connection_info *connInfo; NSURL *contextUrl; @@ -100,7 +104,8 @@ /* backend methods */ - (int) getPath: (char **) path ofFMID: (uint64_t) fmid - withTableType: (uint8_t) tableType; + withTableType: (uint8_t) tableType + inMemCtx: (TALLOC_CTX *) memCtx; - (int) getFID: (uint64_t *) fid byName: (const char *) foldername @@ -119,7 +124,8 @@ atPosition: (uint32_t) pos withTableType: (uint8_t) tableType andQueryType: (enum table_query_type) queryType - inFID: (uint64_t) fid; + inFID: (uint64_t) fid + inMemCtx: (TALLOC_CTX *) memCtx; - (int) mkDir: (struct SRow *) aRow withFID: (uint64_t) fid @@ -133,7 +139,8 @@ inFID: (uint64_t) fid; - (int) openMessage: (struct mapistore_message *) msg withMID: (uint64_t) mid - inFID: (uint64_t) fid; + inFID: (uint64_t) fid + inMemCtx: (TALLOC_CTX *) memCtx; - (int) createMessageWithMID: (uint64_t) mid inFID: (uint64_t) fid isAssociated: (BOOL) isAssociated; @@ -144,9 +151,11 @@ - (int) getProperties: (struct SPropTagArray *) SPropTagArray ofTableType: (uint8_t) tableType inRow: (struct SRow *) aRow - withMID: (uint64_t) fmid; + withMID: (uint64_t) fmid + inMemCtx: (TALLOC_CTX *) memCtx; - (int) getAvailableProperties: (struct SPropTagArray **) propertiesP - ofTableType: (uint8_t) type; + ofTableType: (uint8_t) type + inMemCtx: (TALLOC_CTX *) memCtx; - (int) setPropertiesWithFMID: (uint64_t) fmid ofTableType: (uint8_t) tableType inRow: (struct SRow *) aRow; @@ -171,21 +180,21 @@ - (void) setupBaseFolder: (NSURL *) newURL; /* proof of concept */ -- (int) getTable: (void **) table +- (int) getTable: (MAPIStoreTable **) tablePtr andRowCount: (uint32_t *) count withFID: (uint64_t) fid tableType: (uint8_t) tableType andHandleId: (uint32_t) handleId; -- (int) getAttachmentTable: (void **) table +- (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr andRowCount: (uint32_t *) count withMID: (uint64_t) mid; -- (int) getAttachment: (void **) attachment +- (int) getAttachment: (MAPIStoreAttachment **) attachmentPr withAID: (uint32_t) aid inMID: (uint64_t) mid; -- (int) createAttachment: (void **) attachmentPtr +- (int) createAttachment: (MAPIStoreAttachment **) attachmentPtr inAID: (uint32_t *) aid withMessage: (uint64_t) mid; diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 25adf7d92..5f1c17ee6 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -229,7 +229,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, withID: newFid]; contextFid = newFid; - memCtx = newConnInfo->mstore_ctx; + mstoreCtx = newConnInfo->mstore_ctx; connInfo = newConnInfo; } @@ -682,6 +682,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, withTableType: (uint8_t) tableType andQueryType: (enum table_query_type) queryType inFID: (uint64_t) fid + inMemCtx: (TALLOC_CTX *) memCtx { NSString *folderURL; MAPIStoreTable *table; @@ -699,7 +700,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, object = [table childAtRowID: pos forQueryType: queryType]; if (object) { - rc = [object getProperty: data withTag: propTag]; + rc = [object getProperty: data withTag: propTag inMemCtx: memCtx]; if (rc == MAPISTORE_ERR_NOT_FOUND) rc = MAPI_E_NOT_FOUND; else if (rc == MAPISTORE_ERR_NO_MEMORY) @@ -730,19 +731,20 @@ _prepareContextClass (struct mapistore_context *newMemCtx, - (int) getAvailableProperties: (struct SPropTagArray **) propertiesP ofTableType: (uint8_t) type + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; switch (type) { case MAPISTORE_FOLDER_TABLE: - [[baseFolder class] getAvailableProperties: propertiesP]; + [[baseFolder class] getAvailableProperties: propertiesP inMemCtx: memCtx]; break; case MAPISTORE_MESSAGE_TABLE: - [[baseFolder messageClass] getAvailableProperties: propertiesP]; + [[baseFolder messageClass] getAvailableProperties: propertiesP inMemCtx: memCtx]; break; case MAPISTORE_FAI_TABLE: - [MAPIStoreFAIMessage getAvailableProperties: propertiesP]; + [MAPIStoreFAIMessage getAvailableProperties: propertiesP inMemCtx: memCtx]; break; case MAPISTORE_RULE_TABLE: [self errorWithFormat: @"%s: rules not handled yet", @@ -762,6 +764,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, - (int) openMessage: (struct mapistore_message *) msg withMID: (uint64_t) mid inFID: (uint64_t) fid + inMemCtx: (TALLOC_CTX *) memCtx { NSString *messageKey, *messageURL; MAPIStoreMessage *message; @@ -787,7 +790,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, message = [folder lookupChild: messageKey]; if (message) { - [message openMessage: msg]; + [message openMessage: msg inMemCtx: memCtx]; [messages setObject: message forKey: midKey]; rc = MAPISTORE_SUCCESS; } @@ -879,7 +882,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, /* folder modified */ notif_parameters - = talloc_zero(memCtx, + = talloc_zero(NULL, struct mapistore_object_notification_parameters); notif_parameters->object_id = folderId; if ([message isNew]) @@ -897,12 +900,13 @@ _prepareContextClass (struct mapistore_context *newMemCtx, MAPISTORE_FOLDER, MAPISTORE_OBJECT_MODIFIED, notif_parameters); + talloc_free (notif_parameters); /* message created */ if ([message isNew]) { notif_parameters - = talloc_zero(memCtx, + = talloc_zero(NULL, struct mapistore_object_notification_parameters); notif_parameters->object_id = [message objectId]; notif_parameters->folder_id = folderId; @@ -969,6 +973,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, ofTableType: (uint8_t) tableType inRow: (struct SRow *) aRow withMID: (uint64_t) fmid + inMemCtx: (TALLOC_CTX *) memCtx { NSNumber *midKey; MAPIStoreObject *child; @@ -995,7 +1000,8 @@ _prepareContextClass (struct mapistore_context *newMemCtx, sizeof (struct mapistore_property_data) * sPropTagArray->cValues); rc = [child getProperties: data withTags: sPropTagArray->aulPropTag - andCount: sPropTagArray->cValues]; + andCount: sPropTagArray->cValues + inMemCtx: memCtx]; if (rc == MAPISTORE_SUCCESS) { aRow->lpProps = talloc_array (aRow, struct SPropValue, @@ -1051,6 +1057,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, - (int) getPath: (char **) path ofFMID: (uint64_t) fmid withTableType: (uint8_t) tableType + inMemCtx: (TALLOC_CTX *) memCtx { int rc; NSString *objectURL, *url; @@ -1327,7 +1334,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, { /* folder notification */ notif_parameters - = talloc_zero(memCtx, + = talloc_zero(NULL, struct mapistore_object_notification_parameters); notif_parameters->object_id = fid; notif_parameters->tag_count = 5; @@ -1349,7 +1356,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, /* message notification */ notif_parameters - = talloc_zero(memCtx, + = talloc_zero(NULL, struct mapistore_object_notification_parameters); notif_parameters->object_id = mid; notif_parameters->folder_id = fid; @@ -1479,16 +1486,16 @@ _prepareContextClass (struct mapistore_context *newMemCtx, openchangedb_get_new_folderID (connInfo->oc_ctx, &mappingId); [mapping registerURL: childURL withID: mappingId]; contextId = 0; - mapistore_search_context_by_uri (memCtx, [folderURL UTF8String] + 7, + mapistore_search_context_by_uri (mstoreCtx, [folderURL UTF8String] + 7, &contextId); - mapistore_indexing_record_add_mid (memCtx, contextId, mappingId); + mapistore_indexing_record_add_mid (mstoreCtx, contextId, mappingId); } return mappingId; } /* proof of concept */ -- (int) getTable: (void **) tablePtr +- (int) getTable: (MAPIStoreTable **) tablePtr andRowCount: (uint32_t *) countPtr withFID: (uint64_t) fid tableType: (uint8_t) tableType @@ -1497,7 +1504,6 @@ _prepareContextClass (struct mapistore_context *newMemCtx, MAPIStoreTable *table; table = [self _tableForFID: fid andTableType: tableType]; - [table retain]; [table setHandleId: handleId]; *countPtr = [[table childKeys] count]; *tablePtr = table; @@ -1505,7 +1511,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, return MAPISTORE_SUCCESS; } -- (int) getAttachmentTable: (void **) tablePtr +- (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr andRowCount: (uint32_t *) count withMID: (uint64_t) mid { @@ -1525,7 +1531,6 @@ _prepareContextClass (struct mapistore_context *newMemCtx, attTable = [message attachmentTable]; if (attTable) { - [attTable retain]; *tablePtr = attTable; rc = MAPISTORE_SUCCESS; } @@ -1534,7 +1539,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, return rc; } -- (int) getAttachment: (void **) attachmentPtr +- (int) getAttachment: (MAPIStoreAttachment **) attachmentPtr withAID: (uint32_t) aid inMID: (uint64_t) mid { @@ -1557,7 +1562,6 @@ _prepareContextClass (struct mapistore_context *newMemCtx, attachment = [message lookupChild: [keys objectAtIndex: aid]]; if (attachment) { - [attachment retain]; *attachmentPtr = attachment; rc = MAPISTORE_SUCCESS; } @@ -1567,7 +1571,7 @@ _prepareContextClass (struct mapistore_context *newMemCtx, return rc; } -- (int) createAttachment: (void **) attachmentPtr +- (int) createAttachment: (MAPIStoreAttachment **) attachmentPtr inAID: (uint32_t *) aid withMessage: (uint64_t) mid { @@ -1585,7 +1589,6 @@ _prepareContextClass (struct mapistore_context *newMemCtx, attachment = [message createAttachment]; if (attachment) { - [attachment retain]; *attachmentPtr = attachment; *aid = [attachment AID]; rc = MAPISTORE_SUCCESS; diff --git a/OpenChange/MAPIStoreDraftsMessage.m b/OpenChange/MAPIStoreDraftsMessage.m index e3183da79..f5d3e8bb0 100644 --- a/OpenChange/MAPIStoreDraftsMessage.m +++ b/OpenChange/MAPIStoreDraftsMessage.m @@ -53,6 +53,7 @@ } - (int) getPrMessageFlags: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { unsigned int v = MSGFLAG_FROMME; diff --git a/OpenChange/MAPIStoreFAIMessage.m b/OpenChange/MAPIStoreFAIMessage.m index 10fb4e600..b1c2cc6f3 100644 --- a/OpenChange/MAPIStoreFAIMessage.m +++ b/OpenChange/MAPIStoreFAIMessage.m @@ -25,8 +25,9 @@ @implementation MAPIStoreFAIMessage - (int) getPrAssociated: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getYes: data]; + return [self getYes: data inMemCtx: memCtx]; } @end diff --git a/OpenChange/MAPIStoreFSMessage.m b/OpenChange/MAPIStoreFSMessage.m index bd63052c4..70ac53fc0 100644 --- a/OpenChange/MAPIStoreFSMessage.m +++ b/OpenChange/MAPIStoreFSMessage.m @@ -65,6 +65,7 @@ - (enum MAPISTATUS) getProperty: (void **) data withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { id value; enum MAPISTATUS rc; @@ -73,19 +74,19 @@ if (value) rc = [value getMAPIValue: data forTag: propTag inMemCtx: memCtx]; else - rc = [super getProperty: data withTag: propTag]; + rc = [super getProperty: data withTag: propTag inMemCtx: memCtx]; return rc; } -- (int) getPrSubject: (void **) data +- (int) getPrSubject: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* if we get here, it means that the properties file didn't contain a relevant value */ - return [self getEmptyString: data]; + return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPrMessageClass: (void **) data +- (int) getPrMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { /* if we get here, it means that the properties file didn't contain a relevant value */ @@ -96,6 +97,7 @@ } - (int) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) memCtx { NSArray *keys; NSUInteger count, max; diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 3f1234442..3d9e9c660 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -304,6 +304,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrParentFid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); @@ -311,6 +312,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrFid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [self objectId]); @@ -318,6 +320,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrAccess: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x63); @@ -325,6 +328,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrAccessLevel: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x01); @@ -332,28 +336,33 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrAttrHidden: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrAttrSystem: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrAttrReadOnly: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrSubfolders: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [folderKeys count] > 0); return MAPISTORE_SUCCESS; } -- (int) getPrFolderChildCount: (void **) data; +- (int) getPrFolderChildCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self folderKeys] count]); @@ -361,6 +370,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrContentCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self messageKeys] count]); @@ -368,6 +378,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrContentUnread: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); @@ -375,6 +386,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrAssocContentCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self faiMessageKeys] count]); @@ -382,6 +394,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrDeletedCountTotal: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* TODO */ *data = MAPILongValue (memCtx, 0); @@ -390,6 +403,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore } - (int) getPrLocalCommitTimeMax: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self lastMessageModificationTime] asFileTimeInMemCtx: memCtx]; @@ -398,6 +412,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { int rc; id value; @@ -407,7 +422,7 @@ Class NSExceptionK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStore if (value) rc = [value getMAPIValue: data forTag: propTag inMemCtx: memCtx]; else - rc = [super getProperty: data withTag: propTag]; + rc = [super getProperty: data withTag: propTag inMemCtx: memCtx]; return rc; } diff --git a/OpenChange/MAPIStoreMailAttachment.m b/OpenChange/MAPIStoreMailAttachment.m index ff1653382..136d47b94 100644 --- a/OpenChange/MAPIStoreMailAttachment.m +++ b/OpenChange/MAPIStoreMailAttachment.m @@ -69,6 +69,7 @@ - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) localMemCtx { static char recordBytes[] = {0xd9, 0xd8, 0x11, 0xa3, 0xe2, 0x90, 0x18, 0x41, 0x9e, 0x04, 0x58, 0x46, 0x9d, 0x6d, 0x1b, 0x68}; @@ -82,20 +83,20 @@ switch (propTag) { case PR_ATTACH_METHOD: - *data = MAPILongValue (memCtx, 0x00000001); // afByValue + *data = MAPILongValue (localMemCtx, 0x00000001); // afByValue break; case PR_ATTACH_TAG: *data = [[self mimeAttachTag] - asBinaryInMemCtx: memCtx]; + asBinaryInMemCtx: localMemCtx]; break; case PR_ATTACH_SIZE: longValue = [[bodyInfo objectForKey: @"size"] longValue]; - *data = MAPILongValue (memCtx, longValue); + *data = MAPILongValue (localMemCtx, longValue); break; case PR_RECORD_KEY: *data = [[NSData dataWithBytes: recordBytes length: 16] - asBinaryInMemCtx: memCtx]; + asBinaryInMemCtx: localMemCtx]; break; // PR_RECORD_KEY (0xFF90102) D9 D8 11 A3 E2 90 18 41 9E 04 58 46 9D 6D 1B 68 @@ -125,38 +126,38 @@ stringValue = [NSString stringWithFormat: @"%@.%@", baseName, ext]; } - *data = [stringValue asUnicodeInMemCtx: memCtx]; + *data = [stringValue asUnicodeInMemCtx: localMemCtx]; break; case PR_DISPLAY_NAME_UNICODE: /* TODO: check if description ? */ stringValue = [bodyInfo objectForKey: @"description"]; - *data = [stringValue asUnicodeInMemCtx: memCtx]; + *data = [stringValue asUnicodeInMemCtx: localMemCtx]; break; case PR_ATTACH_CONTENT_ID_UNICODE: stringValue = [bodyInfo objectForKey: @"bodyId"]; - *data = [stringValue asUnicodeInMemCtx: memCtx]; + *data = [stringValue asUnicodeInMemCtx: localMemCtx]; break; case PR_ATTACH_MIME_TAG_UNICODE: stringValue = [NSString stringWithFormat: @"%@/%@", [bodyInfo objectForKey: @"type"], [bodyInfo objectForKey: @"subtype"]]; - *data = [[stringValue lowercaseString] asUnicodeInMemCtx: memCtx]; + *data = [[stringValue lowercaseString] asUnicodeInMemCtx: localMemCtx]; break; case PR_CREATION_TIME: case PR_LAST_MODIFICATION_TIME: date = [[container sogoObject] date]; - *data = [date asFileTimeInMemCtx: memCtx]; + *data = [date asFileTimeInMemCtx: localMemCtx]; break; case PR_ATTACH_DATA_BIN: - *data = [[sogoObject fetchBLOB] asBinaryInMemCtx: memCtx]; + *data = [[sogoObject fetchBLOB] asBinaryInMemCtx: localMemCtx]; break; default: - rc = [super getProperty: data withTag: propTag]; + rc = [super getProperty: data withTag: propTag inMemCtx: localMemCtx]; } return rc; diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 577120a19..c0e47b722 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -172,6 +172,7 @@ static Class SOGoMailFolderK; } - (int) getPrContentUnread: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { EOQualifier *searchQualifier; uint32_t longValue; @@ -187,6 +188,7 @@ static Class SOGoMailFolderK; } - (int) getPrContainerClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPF.Note" asUnicodeInMemCtx: memCtx]; @@ -194,6 +196,7 @@ static Class SOGoMailFolderK; } - (int) getPrMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index 271cf120b..486d80246 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -85,12 +85,8 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; MAPIStoreDraftsFolderK = [MAPIStoreDraftsFolder class]; } -+ (int) getAvailableProperties: (struct SPropTagArray **) propertiesP -{ - return [super getAvailableProperties: propertiesP]; -} - - (int) getPrIconIndex: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -111,6 +107,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPidLidImapDeleted: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -124,6 +121,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -136,6 +134,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrSubjectPrefix: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *subject; NSUInteger colIdx; @@ -154,6 +153,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *subject; NSUInteger colIdx; @@ -174,6 +174,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.Note"); @@ -181,11 +182,13 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrReplyRequested: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrResponseRequested: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, NO); @@ -203,26 +206,31 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrLatestDeliveryTime: (void **) data // DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrCreationTime: data]; + return [self getPrCreationTime: data inMemCtx: memCtx]; } - (int) getPrOriginalSubmitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrCreationTime: data]; + return [self getPrCreationTime: data inMemCtx: memCtx]; } - (int) getPrClientSubmitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrCreationTime: data]; + return [self getPrCreationTime: data inMemCtx: memCtx]; } - (int) getPrMessageDeliveryTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrCreationTime: data]; + return [self getPrCreationTime: data inMemCtx: memCtx]; } - (int) getPrMessageFlags: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -246,6 +254,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrFlagStatus: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -265,6 +274,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrFollowupIcon: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -284,36 +294,43 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrSensitivity: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPrOriginalSensitivity: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSensitivity: data]; + return [self getPrSensitivity: data inMemCtx: memCtx]; } - (int) getPrSentRepresentingAddrtype: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getSMTPAddrType: data]; + return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPrRcvdRepresentingAddrtype: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getSMTPAddrType: data]; + return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPrReceivedByAddrtype: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getSMTPAddrType: data]; + return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPrSenderAddrtype: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getSMTPAddrType: data]; + return [self getSMTPAddrType: data inMemCtx: memCtx]; } - (int) getPrSenderEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -327,26 +344,31 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrSenderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSenderEmailAddress: data]; + return [self getPrSenderEmailAddress: data inMemCtx: memCtx]; } - (int) getPrOriginalAuthorName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSenderEmailAddress: data]; + return [self getPrSenderEmailAddress: data inMemCtx: memCtx]; } - (int) getPrSentRepresentingEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSenderEmailAddress: data]; + return [self getPrSenderEmailAddress: data inMemCtx: memCtx]; } - (int) getPrSentRepresentingName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSenderEmailAddress: data]; + return [self getPrSenderEmailAddress: data inMemCtx: memCtx]; } - (int) getPrReceivedByEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -360,31 +382,37 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrReceivedByName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrReceivedByEmailAddress: data]; + return [self getPrReceivedByEmailAddress: data inMemCtx: memCtx]; } - (int) getPrRcvdRepresentingName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrReceivedByEmailAddress: data]; + return [self getPrReceivedByEmailAddress: data inMemCtx: memCtx]; } - (int) getPrRcvdRepresentingEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrReceivedByEmailAddress: data]; + return [self getPrReceivedByEmailAddress: data inMemCtx: memCtx]; } - (int) getPrDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrReceivedByEmailAddress: data]; + return [self getPrReceivedByEmailAddress: data inMemCtx: memCtx]; } - (int) getPrOriginalDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayTo: data]; + return [self getPrDisplayTo: data inMemCtx: memCtx]; } - (int) getPrDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -398,21 +426,25 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrOriginalDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayCc: data]; + return [self getPrDisplayCc: data inMemCtx: memCtx]; } - (int) getPrDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getEmptyString: data]; + return [self getEmptyString: data inMemCtx: memCtx]; } - (int) getPrOriginalDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayBcc: data]; + return [self getPrDisplayBcc: data inMemCtx: memCtx]; } - (int) getPidNameContentType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"message/rfc822" asUnicodeInMemCtx: memCtx]; @@ -420,6 +452,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; NSString *s; @@ -438,6 +471,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrInternetCpid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* ref: http://msdn.microsoft.com/en-us/library/dd317756%28v=vs.85%29.aspx @@ -453,6 +487,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSMutableArray *keys; id result; @@ -504,6 +539,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrHtml: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { id result; NSData *content; @@ -566,6 +602,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrRtfCompressed: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = NULL; @@ -573,11 +610,13 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrRtfInSync: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrInternetMessageId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject messageId] asUnicodeInMemCtx: memCtx]; @@ -585,21 +624,25 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPrReadReceiptRequested: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrDeleteAfterSubmit: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidPrivate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrMsgEditorFormat: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSMutableArray *keys; NSArray *acceptedTypes; @@ -629,26 +672,31 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; } - (int) getPidLidReminderSet: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidUseTnef: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidRemoteStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidLidAgingDontAgeMe: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getYes: data]; + return [self getYes: data inMemCtx: memCtx]; } - (void) openMessage: (struct mapistore_message *) msg + inMemCtx: (TALLOC_CTX *) memCtx { struct SRowSet *recipients; NSArray *to; @@ -656,7 +704,7 @@ static Class NSExceptionK, MAPIStoreSentItemsFolderK, MAPIStoreDraftsFolderK; NGImap4EnvelopeAddress *currentAddress; NSString *text; - [super openMessage: msg]; + [super openMessage: msg inMemCtx: memCtx]; /* Retrieve recipients from the message */ to = [sogoObject toEnvelopeAddresses]; max = [to count]; diff --git a/OpenChange/MAPIStoreMessage.h b/OpenChange/MAPIStoreMessage.h index 6c35b27f9..74220bdba 100644 --- a/OpenChange/MAPIStoreMessage.h +++ b/OpenChange/MAPIStoreMessage.h @@ -41,10 +41,12 @@ NSMutableArray *activeTables; } -- (void) openMessage: (struct mapistore_message *) msg; +- (void) openMessage: (struct mapistore_message *) msg + inMemCtx: (TALLOC_CTX *) memCtx; /* helper getters */ -- (int) getSMTPAddrType: (void **) data; +- (int) getSMTPAddrType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; /* subclasses */ - (void) submit; diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index a1f3b62a5..5df7399a6 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -71,6 +71,7 @@ } - (void) openMessage: (struct mapistore_message *) msg + inMemCtx: (TALLOC_CTX *) memCtx { static enum MAPITAGS tags[] = { PR_SUBJECT_PREFIX_UNICODE, PR_NORMALIZED_SUBJECT_UNICODE }; @@ -95,7 +96,7 @@ properties->lpProps = talloc_array (properties, struct SPropValue, max); for (count = 0; count < max; count++) { - if ([self getProperty: &propValue withTag: tags[count]] + if ([self getProperty: &propValue withTag: tags[count] inMemCtx: memCtx] == MAPI_E_SUCCESS) { if (propValue == NULL) @@ -120,7 +121,7 @@ } /* helper getters */ -- (int) getSMTPAddrType: (void **) data +- (int) getSMTPAddrType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"SMTP" asUnicodeInMemCtx: memCtx]; @@ -129,6 +130,7 @@ /* getters */ - (int) getPrInstId: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { /* we return a unique id based on the key */ *data = MAPILongLongValue (memCtx, [[sogoObject nameInContainer] hash]); @@ -137,11 +139,13 @@ } - (int) getPrInstanceNum: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPrRowType: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, TBL_LEAF_ROW); @@ -149,6 +153,7 @@ } - (int) getPrDepth: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, 0); @@ -156,6 +161,7 @@ } - (int) getPrAccess: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x03); @@ -163,6 +169,7 @@ } - (int) getPrAccessLevel: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x01); @@ -171,20 +178,22 @@ // - (int) getPrViewStyle: (void **) data // { -// return [self getLongZero: data]; +// return [self getLongZero: data inMemCtx: memCtx]; // } // - (int) getPrViewMajorversion: (void **) data // { -// return [self getLongZero: data]; +// return [self getLongZero: data inMemCtx: memCtx]; // } - (int) getPidLidSideEffects: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidLidCurrentVersion: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 115608); // Outlook 11.5608 @@ -192,6 +201,7 @@ } - (int) getPidLidCurrentVersionName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"11.0" asUnicodeInMemCtx: memCtx]; @@ -199,6 +209,7 @@ } - (int) getPidLidAutoProcessState: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000000); @@ -206,6 +217,7 @@ } - (int) getPidNameContentClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"Sharing" asUnicodeInMemCtx: memCtx]; @@ -213,6 +225,7 @@ } - (int) getPrFid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); @@ -220,6 +233,7 @@ } - (int) getPrMid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [self objectId]); @@ -227,6 +241,7 @@ } - (int) getPrMessageLocaleId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x0409); @@ -234,6 +249,7 @@ } - (int) getPrMessageFlags: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, MSGFLAG_FROMME | MSGFLAG_READ | MSGFLAG_UNMODIFIED); @@ -241,6 +257,7 @@ } - (int) getPrMessageSize: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* TODO: choose another name in SOGo for that method */ *data = MAPILongValue (memCtx, [[sogoObject davContentLength] intValue]); @@ -249,11 +266,13 @@ } - (int) getPrMsgStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPrImportance: (void **) data // TODO -> subclass? + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 1); @@ -261,16 +280,19 @@ } - (int) getPrPriority: (void **) data // TODO -> subclass? + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPrSensitivity: (void **) data // TODO -> subclass in calendar + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPrSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { [self subclassResponsibility: _cmd]; @@ -278,38 +300,45 @@ } - (int) getPrNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSubject: data]; + return [self getPrSubject: data inMemCtx: memCtx]; } - (int) getPrOriginalSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrNormalizedSubject: data]; + return [self getPrNormalizedSubject: data inMemCtx: memCtx]; } - (int) getPrConversationTopic: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrNormalizedSubject: data]; + return [self getPrNormalizedSubject: data inMemCtx: memCtx]; } - (int) getPrSubjectPrefix: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getEmptyString: data]; + return [self getEmptyString: data inMemCtx: memCtx]; } - (int) getPrDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getEmptyString: data]; + return [self getEmptyString: data inMemCtx: memCtx]; } - (int) getPrDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getEmptyString: data]; + return [self getEmptyString: data inMemCtx: memCtx]; } - (int) getPrDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getEmptyString: data]; + return [self getEmptyString: data inMemCtx: memCtx]; } // - (int) getPrOriginalDisplayTo: (void **) data @@ -328,6 +357,7 @@ // } - (int) getPrLastModifierName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSURL *contextUrl; @@ -338,6 +368,7 @@ } - (int) getPrMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { [self subclassResponsibility: _cmd]; @@ -345,11 +376,13 @@ } - (int) getPrOrigMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrMessageClass: data]; + return [self getPrMessageClass: data inMemCtx: memCtx]; } - (int) getPrHasattach: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [[self childKeysMatchingQualifier: nil @@ -359,8 +392,9 @@ } - (int) getPrAssociated: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx];; } - (void) save diff --git a/OpenChange/MAPIStoreNotesMessage.m b/OpenChange/MAPIStoreNotesMessage.m index bb6821b81..bdf60829a 100644 --- a/OpenChange/MAPIStoreNotesMessage.m +++ b/OpenChange/MAPIStoreNotesMessage.m @@ -29,6 +29,7 @@ @implementation MAPIStoreNotesMessage - (int) getPrIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ // *longValue = 0x00000300 for blue @@ -42,9 +43,11 @@ } - (int) getPrSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getProperty: data - withTag: PR_NORMALIZED_SUBJECT_UNICODE]; + withTag: PR_NORMALIZED_SUBJECT_UNICODE + inMemCtx: memCtx]; } @end diff --git a/OpenChange/MAPIStoreObject.h b/OpenChange/MAPIStoreObject.h index 54ee1bcb1..00fcb7d13 100644 --- a/OpenChange/MAPIStoreObject.h +++ b/OpenChange/MAPIStoreObject.h @@ -23,6 +23,8 @@ #ifndef MAPISTOREOBJECT_H #define MAPISTOREOBJECT_H +#include + #import @class NSCalendarDate; @@ -45,13 +47,13 @@ MAPIStoreObject *container; id sogoObject; NSMutableDictionary *newProperties; - void *memCtx; BOOL isNew; } + (id) mapiStoreObjectWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer; -+ (int) getAvailableProperties: (struct SPropTagArray **) propertiesP; ++ (int) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) memCtx; - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newFolder; @@ -82,33 +84,45 @@ - (void) resetNewProperties; /* ops */ -- (int) getAvailableProperties: (struct SPropTagArray **) propertiesP; +- (int) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) localMemCtx; - (int) getProperties: (struct mapistore_property_data *) data withTags: (enum MAPITAGS *) tags - andCount: (uint16_t) columnCount; + andCount: (uint16_t) columnCount + inMemCtx: (TALLOC_CTX *) localMemCtx; - (int) setProperties: (struct SRow *) aRow; - (int) getProperty: (void **) data - withTag: (enum MAPITAGS) propTag; + withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) localMemCtx; /* helper getters */ -- (int) getEmptyString: (void **) data; -- (int) getLongZero: (void **) data; -- (int) getYes: (void **) data; -- (int) getNo: (void **) data; +- (int) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getLongZero: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getYes: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getNo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getReplicaKey: (void **) data - fromGlobCnt: (uint64_t) objectCnt; + fromGlobCnt: (uint64_t) objectCnt + inMemCtx: (TALLOC_CTX *) memCtx; /* implemented getters */ -- (int) getPrDisplayName: (void **) data; -- (int) getPrSearchKey: (void **) data; -- (int) getPrGenerateExchangeViews: (void **) data; -- (int) getPrParentSourceKey: (void **) data; -- (int) getPrSourceKey: (void **) data; -- (int) getPrChangeKey: (void **) data; -- (int) getPrCreationTime: (void **) data; -- (int) getPrLastModificationTime: (void **) data; +- (int) getPrDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPrSearchKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPrGenerateExchangeViews: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPrParentSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPrSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPrChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPrCreationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPrLastModificationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; /* subclasses */ - (NSDate *) creationTime; diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index 78c250449..422ac191a 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -64,6 +64,7 @@ static Class NSExceptionK, MAPIStoreFolderK; } + (int) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) memCtx { struct SPropTagArray *properties; const MAPIStorePropertyGetter *classGetters; @@ -71,7 +72,7 @@ static Class NSExceptionK, MAPIStoreFolderK; enum MAPITAGS propTag; uint16_t propValue; - properties = talloc_zero(NULL, struct SPropTagArray); + properties = talloc_zero(memCtx, struct SPropTagArray); properties->aulPropTag = talloc_array (properties, enum MAPITAGS, MAPIStoreSupportedPropertiesCount); classGetters = MAPIStorePropertyGettersForClass (self); @@ -101,7 +102,6 @@ static Class NSExceptionK, MAPIStoreFolderK; container = nil; sogoObject = nil; newProperties = [NSMutableDictionary new]; - memCtx = talloc_size (NULL, 0); isNew = NO; } @@ -126,7 +126,6 @@ static Class NSExceptionK, MAPIStoreFolderK; [newProperties release]; [parentContainersBag release]; [container release]; - talloc_free (memCtx); [super dealloc]; } @@ -222,6 +221,7 @@ static Class NSExceptionK, MAPIStoreFolderK; - (int) getProperty: (void **) data withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStorePropertyGetter method = NULL; uint16_t propValue; @@ -234,7 +234,7 @@ static Class NSExceptionK, MAPIStoreFolderK; method = (MAPIStorePropertyGetter) classGetters[propValue]; if (method) - rc = method (self, methodSel, data); + rc = method (self, methodSel, data, memCtx); else { *data = NULL; @@ -256,28 +256,28 @@ static Class NSExceptionK, MAPIStoreFolderK; } /* helper getters */ -- (int) getEmptyString: (void **) data +- (int) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getLongZero: (void **) data +- (int) getLongZero: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } -- (int) getYes: (void **) data +- (int) getYes: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, YES); return MAPISTORE_SUCCESS; } -- (int) getNo: (void **) data +- (int) getNo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, NO); @@ -286,6 +286,7 @@ static Class NSExceptionK, MAPIStoreFolderK; - (int) getReplicaKey: (void **) data fromGlobCnt: (uint64_t) objectCnt + inMemCtx: (TALLOC_CTX *) memCtx { struct mapistore_connection_info *connInfo; NSMutableData *replicaKey; @@ -312,6 +313,7 @@ static Class NSExceptionK, MAPIStoreFolderK; /* getters */ - (int) getPrDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject displayName] asUnicodeInMemCtx: memCtx]; @@ -319,6 +321,7 @@ static Class NSExceptionK, MAPIStoreFolderK; } - (int) getPrSearchKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -330,18 +333,23 @@ static Class NSExceptionK, MAPIStoreFolderK; } - (int) getPrGenerateExchangeViews: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPrParentSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getReplicaKey: data fromGlobCnt: [container objectId] >> 16]; + return [self getReplicaKey: data fromGlobCnt: [container objectId] >> 16 + inMemCtx: memCtx]; } - (int) getPrSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getReplicaKey: data fromGlobCnt: [self objectId] >> 16]; + return [self getReplicaKey: data fromGlobCnt: [self objectId] >> 16 + inMemCtx: memCtx]; } - (uint64_t) objectVersion @@ -357,11 +365,14 @@ static Class NSExceptionK, MAPIStoreFolderK; } - (int) getPrChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getReplicaKey: data fromGlobCnt: [self objectVersion]]; + return [self getReplicaKey: data fromGlobCnt: [self objectVersion] + inMemCtx: memCtx]; } - (int) getPrChangeNum: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, ([self objectVersion] << 16) | 0x0001); @@ -369,6 +380,7 @@ static Class NSExceptionK, MAPIStoreFolderK; } - (int) getPrCreationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self creationTime] asFileTimeInMemCtx: memCtx]; @@ -376,6 +388,7 @@ static Class NSExceptionK, MAPIStoreFolderK; } - (int) getPrLastModificationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self lastModificationTime] asFileTimeInMemCtx: memCtx]; @@ -383,19 +396,22 @@ static Class NSExceptionK, MAPIStoreFolderK; } - (int) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) memCtx { - return [isa getAvailableProperties: propertiesP]; + return [isa getAvailableProperties: propertiesP inMemCtx: memCtx]; } - (int) getProperties: (struct mapistore_property_data *) data withTags: (enum MAPITAGS *) tags andCount: (uint16_t) columnCount + inMemCtx: (TALLOC_CTX *) memCtx { uint16_t count; for (count = 0; count < columnCount; count++) data[count].error = [self getProperty: &data[count].data - withTag: tags[count]]; + withTag: tags[count] + inMemCtx: memCtx]; return MAPISTORE_SUCCESS; diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 638d563bf..9ca76cd8d 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -35,6 +35,7 @@ #import "MAPIStoreContext.h" #import "MAPIStoreObject.h" #import "MAPIStoreTable.h" +#import "NSObject+MAPIStore.h" #import "MAPIStoreSOGo.h" @@ -208,8 +209,8 @@ sogo_release_record(void *private_data, uint64_t fmid, uint8_t type) \return MAPISTORE_SUCCESS on success, otherwise MAPISTORE error */ static int -sogo_get_path(void *private_data, uint64_t fmid, - uint8_t type, char **path) +sogo_get_path(void *private_data, TALLOC_CTX *mem_ctx, + uint64_t fmid, uint8_t type, char **path) { NSAutoreleasePool *pool; sogo_context *cContext; @@ -224,7 +225,7 @@ sogo_get_path(void *private_data, uint64_t fmid, context = cContext->objcContext; [context setupRequest]; - rc = [context getPath: path ofFMID: fmid withTableType: type]; + rc = [context getPath: path ofFMID: fmid withTableType: type inMemCtx: mem_ctx]; [context tearDownRequest]; @@ -428,6 +429,7 @@ sogo_op_readdir_count(void *private_data, static int sogo_op_get_table_property(void *private_data, + TALLOC_CTX *mem_ctx, uint64_t fid, uint8_t table_type, enum table_query_type query_type, @@ -450,7 +452,7 @@ sogo_op_get_table_property(void *private_data, rc = [context getTableProperty: data withTag: proptag atPosition: pos withTableType: table_type andQueryType: query_type - inFID: fid]; + inFID: fid inMemCtx: mem_ctx]; [context tearDownRequest]; [pool release]; @@ -459,7 +461,7 @@ sogo_op_get_table_property(void *private_data, } static int -sogo_op_get_available_table_properties(void *private_data, +sogo_op_get_available_table_properties(void *private_data, TALLOC_CTX *mem_ctx, uint8_t type, struct SPropTagArray **propertiesP) { @@ -477,7 +479,8 @@ sogo_op_get_available_table_properties(void *private_data, [context setupRequest]; rc = [context getAvailableProperties: propertiesP - ofTableType: type]; + ofTableType: type + inMemCtx: mem_ctx]; [context tearDownRequest]; [pool release]; @@ -487,6 +490,7 @@ sogo_op_get_available_table_properties(void *private_data, static int sogo_op_openmessage(void *private_data, + TALLOC_CTX *mem_ctx, uint64_t fid, uint64_t mid, struct mapistore_message *msg) @@ -506,7 +510,7 @@ sogo_op_openmessage(void *private_data, if (!context) DEBUG (5, (" context data is empty, failure ahead...")); - rc = [context openMessage: msg withMID: mid inFID: fid]; + rc = [context openMessage: msg withMID: mid inFID: fid inMemCtx: mem_ctx]; if (rc) DEBUG (5, (" failure opening message\n")); @@ -598,7 +602,8 @@ sogo_op_submitmessage(void *private_data, } static int -sogo_op_getprops(void *private_data, +sogo_op_getprops(void *private_data, + TALLOC_CTX *mem_ctx, uint64_t fmid, uint8_t type, struct SPropTagArray *SPropTagArray, @@ -620,7 +625,8 @@ sogo_op_getprops(void *private_data, rc = [context getProperties: SPropTagArray ofTableType: type inRow: aRow - withMID: fmid]; + withMID: fmid + inMemCtx: mem_ctx]; [context tearDownRequest]; [pool release]; @@ -784,13 +790,15 @@ sogo_op_set_sort_order (void *private_data, uint64_t fid, uint8_t type, proof of concept */ static int -sogo_pocop_open_table(void *private_data, uint64_t fid, uint8_t table_type, +sogo_pocop_open_table(void *private_data, TALLOC_CTX *mem_ctx, + uint64_t fid, uint8_t table_type, uint32_t handle_id, void **table_object, uint32_t *row_count) { NSAutoreleasePool *pool; sogo_context *cContext; MAPIStoreContext *context; + MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); @@ -802,11 +810,13 @@ sogo_pocop_open_table(void *private_data, uint64_t fid, uint8_t table_type, if (context) { [context setupRequest]; - rc = [context getTable: table_object + rc = [context getTable: &table andRowCount: row_count withFID: fid tableType: table_type andHandleId: handle_id]; + if (rc == MAPISTORE_SUCCESS) + *table_object = [table tallocWrapper: mem_ctx]; [context tearDownRequest]; [pool release]; } @@ -820,11 +830,12 @@ sogo_pocop_open_table(void *private_data, uint64_t fid, uint8_t table_type, } static int -sogo_pocop_get_attachment_table (void *private_data, uint64_t mid, void **table_object, uint32_t *row_count) +sogo_pocop_get_attachment_table (void *private_data, TALLOC_CTX *mem_ctx, uint64_t mid, void **table_object, uint32_t *row_count) { NSAutoreleasePool *pool; sogo_context *cContext; MAPIStoreContext *context; + MAPIStoreAttachmentTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); @@ -836,9 +847,44 @@ sogo_pocop_get_attachment_table (void *private_data, uint64_t mid, void **table_ if (context) { [context setupRequest]; - rc = [context getAttachmentTable: table_object + rc = [context getAttachmentTable: &table andRowCount: row_count withMID: mid]; + *table_object = [table tallocWrapper: mem_ctx]; + [context tearDownRequest]; + } + else + { + NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO CONTEXT"); + rc = MAPI_E_NOT_FOUND; + } + + [pool release]; + + return rc; +} + +static int +sogo_pocop_get_attachment (void *private_data, TALLOC_CTX *mem_ctx, uint64_t mid, uint32_t aid, void **attachment_object) +{ + NSAutoreleasePool *pool; + sogo_context *cContext; + MAPIStoreContext *context; + MAPIStoreAttachment *attachment; + int rc; + + DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); + + pool = [NSAutoreleasePool new]; + + cContext = private_data; + context = cContext->objcContext; + if (context) + { + [context setupRequest]; + rc = [context getAttachment: &attachment withAID: aid inMID: mid]; + if (rc == MAPISTORE_SUCCESS) + *attachment_object = [attachment tallocWrapper: mem_ctx]; [context tearDownRequest]; [pool release]; } @@ -852,11 +898,12 @@ sogo_pocop_get_attachment_table (void *private_data, uint64_t mid, void **table_ } static int -sogo_pocop_get_attachment (void *private_data, uint64_t mid, uint32_t aid, void **attachment_object) +sogo_pocop_create_attachment (void *private_data, TALLOC_CTX *mem_ctx, uint64_t mid, uint32_t *aid, void **attachment_object) { NSAutoreleasePool *pool; sogo_context *cContext; MAPIStoreContext *context; + MAPIStoreAttachment *attachment; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); @@ -868,37 +915,10 @@ sogo_pocop_get_attachment (void *private_data, uint64_t mid, uint32_t aid, void if (context) { [context setupRequest]; - rc = [context getAttachment: attachment_object withAID: aid inMID: mid]; - [context tearDownRequest]; - [pool release]; - } - else - { - NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO CONTEXT"); - rc = MAPI_E_NOT_FOUND; - } - - return rc; -} - -static int -sogo_pocop_create_attachment (void *private_data, uint64_t mid, uint32_t *aid, void **attachment_object) -{ - NSAutoreleasePool *pool; - sogo_context *cContext; - MAPIStoreContext *context; - int rc; - - DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - - pool = [NSAutoreleasePool new]; - - cContext = private_data; - context = cContext->objcContext; - if (context) - { - [context setupRequest]; - rc = [context createAttachment: attachment_object inAID: aid withMessage: mid]; + rc = [context createAttachment: &attachment inAID: aid + withMessage: mid]; + if (rc == MAPISTORE_SUCCESS) + *attachment_object = [attachment tallocWrapper: mem_ctx]; [context tearDownRequest]; [pool release]; } @@ -913,11 +933,14 @@ sogo_pocop_create_attachment (void *private_data, uint64_t mid, uint32_t *aid, v static int sogo_pocop_open_embedded_message (void *attachment_object, + TALLOC_CTX *mem_ctx, uint64_t *mid, enum OpenEmbeddedMessage_OpenModeFlags flags, struct mapistore_message *msg, void **message_object) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; + MAPIStoreAttachmentMessage *message; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); @@ -926,11 +949,14 @@ sogo_pocop_open_embedded_message (void *attachment_object, if (attachment_object) { - attachment = attachment_object; + wrapper = attachment_object; + attachment = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; - rc = [attachment openEmbeddedMessage: message_object + rc = [attachment openEmbeddedMessage: &message withMID: mid withMAPIStoreMsg: msg andFlags: flags]; + if (rc == MAPISTORE_SUCCESS) + *message_object = [message tallocWrapper: mem_ctx]; [pool release]; } else @@ -942,19 +968,22 @@ sogo_pocop_open_embedded_message (void *attachment_object, return rc; } -static int sogo_pocop_get_available_table_properties(void *table_object, struct SPropTagArray **propertiesP) +static int sogo_pocop_get_available_table_properties(void *table_object, + TALLOC_CTX *mem_ctx, struct SPropTagArray **propertiesP) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - table = table_object; - if (table) + if (table_object) { + wrapper = table_object; + table = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; - rc = [table getAvailableProperties: propertiesP]; + rc = [table getAvailableProperties: propertiesP inMemCtx: mem_ctx]; [pool release]; } else @@ -969,15 +998,17 @@ static int sogo_pocop_get_available_table_properties(void *table_object, struct static int sogo_pocop_set_table_columns (void *table_object, uint16_t count, enum MAPITAGS *properties) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - table = table_object; - if (table) + if (table_object) { + wrapper = table_object; + table = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; rc = [table setColumns: properties withCount: count]; @@ -995,15 +1026,17 @@ sogo_pocop_set_table_columns (void *table_object, uint16_t count, enum MAPITAGS static int sogo_pocop_set_table_restrictions (void *table_object, struct mapi_SRestriction *restrictions, uint8_t *table_status) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - table = table_object; - if (table) + if (table_object) { + wrapper = table_object; + table = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; [table setRestrictions: restrictions]; [table cleanupCaches]; @@ -1023,15 +1056,17 @@ sogo_pocop_set_table_restrictions (void *table_object, struct mapi_SRestriction static int sogo_pocop_set_table_sort_order (void *table_object, struct SSortOrderSet *sort_order, uint8_t *table_status) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - table = table_object; - if (table) + if (table_object) { + wrapper = table_object; + table = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; [table setSortOrder: sort_order]; [table cleanupCaches]; @@ -1049,19 +1084,24 @@ sogo_pocop_set_table_sort_order (void *table_object, struct SSortOrderSet *sort_ } static int -sogo_pocop_get_table_row (void *table_object, enum table_query_type query_type, uint32_t row_id, struct mapistore_property_data *data) +sogo_pocop_get_table_row (void *table_object, TALLOC_CTX *mem_ctx, + enum table_query_type query_type, uint32_t row_id, + struct mapistore_property_data *data) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - table = table_object; - if (table) + if (table_object) { + wrapper = table_object; + table = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; - rc = [table getRow: data withRowID: row_id andQueryType: query_type]; + rc = [table getRow: data withRowID: row_id andQueryType: query_type + inMemCtx: mem_ctx]; [pool release]; } else @@ -1073,19 +1113,23 @@ sogo_pocop_get_table_row (void *table_object, enum table_query_type query_type, return rc; } -static int sogo_pocop_get_available_properties(void *object, struct SPropTagArray **propertiesP) +static int sogo_pocop_get_available_properties(void *object, + TALLOC_CTX *mem_ctx, + struct SPropTagArray **propertiesP) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - propObject = object; - if (propObject) + if (object) { + wrapper = object; + propObject = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; - rc = [propObject getAvailableProperties: propertiesP]; + rc = [propObject getAvailableProperties: propertiesP inMemCtx: mem_ctx]; [pool release]; } else @@ -1099,20 +1143,25 @@ static int sogo_pocop_get_available_properties(void *object, struct SPropTagArra static int sogo_pocop_get_properties (void *object, + TALLOC_CTX *mem_ctx, uint16_t count, enum MAPITAGS *properties, struct mapistore_property_data *data) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - propObject = object; - if (propObject) + if (object) { + wrapper = object; + propObject = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; - rc = [propObject getProperties: data withTags: properties andCount: count]; + rc = [propObject getProperties: data withTags: properties + andCount: count + inMemCtx: mem_ctx]; [pool release]; } else @@ -1127,15 +1176,17 @@ sogo_pocop_get_properties (void *object, static int sogo_pocop_set_properties (void *object, struct SRow *aRow) { + struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; int rc; DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - propObject = object; - if (propObject) + if (object) { + wrapper = object; + propObject = wrapper->MAPIStoreSOGoObject; pool = [NSAutoreleasePool new]; rc = [propObject setProperties: aRow]; [pool release]; @@ -1149,32 +1200,6 @@ sogo_pocop_set_properties (void *object, struct SRow *aRow) return rc; } -static int -sogo_pocop_release (void *object) -{ - NSAutoreleasePool *pool; - MAPIStoreObject *propObject; - int rc; - - DEBUG (5, ("[SOGo: %s:%d]\n", __FUNCTION__, __LINE__)); - - propObject = object; - if (propObject) - { - pool = [NSAutoreleasePool new]; - [propObject release]; - [pool release]; - rc = MAPI_E_SUCCESS; - } - else - { - NSLog (@" UNEXPECTED WEIRDNESS: RECEIVED NO DATA"); - rc = MAPI_E_NOT_FOUND; - } - - return rc; -} - /** \details Entry point for mapistore SOGO backend @@ -1238,7 +1263,6 @@ int mapistore_init_backend(void) backend.properties.get_available_properties = sogo_pocop_get_available_properties; backend.properties.get_properties = sogo_pocop_get_properties; backend.properties.set_properties = sogo_pocop_set_properties; - backend.store.release = sogo_pocop_release; /* Register ourselves with the MAPISTORE subsystem */ ret = mapistore_backend_register(&backend); diff --git a/OpenChange/MAPIStoreTable.h b/OpenChange/MAPIStoreTable.h index b6b891677..7db3c3b06 100644 --- a/OpenChange/MAPIStoreTable.h +++ b/OpenChange/MAPIStoreTable.h @@ -23,6 +23,8 @@ #ifndef MAPISTORETABLE_H #define MAPISTORETABLE_H +#include + #import #define SENSITIVITY_NONE 0 @@ -85,13 +87,15 @@ typedef enum { - (void) cleanupCaches; -- (int) getAvailableProperties: (struct SPropTagArray **) propertiesP; +- (int) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) localMemCtx; - (void) setRestrictions: (const struct mapi_SRestriction *) res; - (int) setColumns: (enum MAPITAGS *) newColumns withCount: (uint16_t) newColumCount; - (int) getRow: (struct mapistore_property_data *) data withRowID: (uint32_t) rowId - andQueryType: (enum table_query_type) queryType; + andQueryType: (enum table_query_type) queryType + inMemCtx: (TALLOC_CTX *) memCtx; - (void) notifyChangesForChild: (MAPIStoreObject *) child; diff --git a/OpenChange/MAPIStoreTable.m b/OpenChange/MAPIStoreTable.m index 12c62840d..26c4b7ae0 100644 --- a/OpenChange/MAPIStoreTable.m +++ b/OpenChange/MAPIStoreTable.m @@ -376,8 +376,10 @@ static Class NSDataK, NSStringK; } - (int) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) memCtx { - return [[isa childObjectClass] getAvailableProperties: propertiesP]; + return [[isa childObjectClass] getAvailableProperties: propertiesP + inMemCtx: memCtx]; } - (void) setRestrictions: (const struct mapi_SRestriction *) res @@ -804,6 +806,7 @@ static Class NSDataK, NSStringK; - (int) getRow: (struct mapistore_property_data *) data withRowID: (uint32_t) rowId andQueryType: (enum table_query_type) queryType + inMemCtx: (TALLOC_CTX *) memCtx { NSUInteger count; MAPIStoreObject *child; @@ -816,7 +819,8 @@ static Class NSDataK, NSStringK; rc = MAPI_E_SUCCESS; for (count = 0; count < columnsCount; count++) data[count].error = [child getProperty: &data[count].data - withTag: columns[count]]; + withTag: columns[count] + inMemCtx: memCtx]; } else rc = MAPI_E_INVALID_OBJECT; diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index d05cc107d..b95ba3885 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -50,6 +50,7 @@ @implementation MAPIStoreTasksMessage - (int) getPrIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ // Unassigned recurring task 0x00000501 @@ -64,6 +65,7 @@ } - (int) getPrMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup(memCtx, "IPM.Task"); @@ -71,6 +73,7 @@ } - (int) getPrSubject: (void **) data // SUMMARY + inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; @@ -81,6 +84,7 @@ } - (int) getPrImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; iCalToDo *task; @@ -99,6 +103,7 @@ } - (int) getPidLidTaskComplete: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; @@ -110,6 +115,7 @@ } - (int) getPidLidPercentComplete: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { double doubleValue; iCalToDo *task; @@ -123,6 +129,7 @@ } - (int) getPidLidTaskDateCompleted: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSCalendarDate *dateValue; @@ -140,6 +147,7 @@ } - (int) getPidLidTaskState: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x1); // not assigned @@ -147,36 +155,43 @@ } - (int) getPidLidTaskMode: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidLidTaskFRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidTaskAccepted: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidTaskActualEffort: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidLidTaskEstimatedEffort: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPrHasattach: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getNo: data]; + return [self getNo: data inMemCtx: memCtx]; } - (int) getPidLidTaskDueDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSCalendarDate *dateValue; @@ -193,21 +208,25 @@ } - (int) getPrMessageDeliveryTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrLastModificationTime: data]; + return [self getPrLastModificationTime: data inMemCtx: memCtx]; } - (int) getClientSubmitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrLastModificationTime: data]; + return [self getPrLastModificationTime: data inMemCtx: memCtx]; } - (int) getLocalCommitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrLastModificationTime: data]; + return [self getPrLastModificationTime: data inMemCtx: memCtx]; } - (int) getPidLidTaskStatus: (void **) data // status + inMemCtx: (TALLOC_CTX *) memCtx { NSString *status; uint32_t longValue; @@ -230,6 +249,7 @@ } - (int) getPidLidTaskOwner: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"openchange@example.com" asUnicodeInMemCtx: memCtx]; @@ -237,8 +257,9 @@ } - (int) getPidLidTaskOwnership: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getLongZero: data]; + return [self getLongZero: data inMemCtx: memCtx]; } - (void) save diff --git a/OpenChange/NSObject+MAPIStore.m b/OpenChange/NSObject+MAPIStore.m index 0f833b8cf..f84598715 100644 --- a/OpenChange/NSObject+MAPIStore.m +++ b/OpenChange/NSObject+MAPIStore.m @@ -36,10 +36,11 @@ static int MAPIStoreTallocWrapperDestroy (void *data) { - id wrappedObject; + struct MAPIStoreTallocWrapper *wrapper; - wrappedObject = data; - [wrappedObject release]; + wrapper = data; + NSLog (@"destroying wrapped object (wrapper: %p; object: %p...\n", wrapper, wrapper->MAPIStoreSOGoObject); + [wrapper->MAPIStoreSOGoObject release]; return 0; } @@ -50,8 +51,9 @@ static int MAPIStoreTallocWrapperDestroy (void *data) wrapper = talloc_zero (tallocCtx, struct MAPIStoreTallocWrapper); wrapper->MAPIStoreSOGoObject = self; + [wrapper->MAPIStoreSOGoObject retain]; talloc_set_destructor ((void *) wrapper, MAPIStoreTallocWrapperDestroy); - [self retain]; + NSLog (@"returning wrapper: %p; object: %p", wrapper, self); return wrapper; } diff --git a/OpenChange/code-MAPIStorePropertySelectors.h b/OpenChange/code-MAPIStorePropertySelectors.h index 0f7590ed5..cceb2b751 100644 --- a/OpenChange/code-MAPIStorePropertySelectors.h +++ b/OpenChange/code-MAPIStorePropertySelectors.h @@ -20,7 +20,8 @@ * Boston, MA 02111-1307, USA. */ -typedef int (*MAPIStorePropertyGetter) (id inst, SEL _cmd, void **data); +typedef int (*MAPIStorePropertyGetter) (id inst, SEL _cmd, + void **data, TALLOC_CTX *memCtx); const MAPIStorePropertyGetter *MAPIStorePropertyGettersForClass (Class klass); SEL MAPIStoreSelectorForPropertyGetter (uint16_t propertyId); diff --git a/OpenChange/gen-property-selectors.py b/OpenChange/gen-property-selectors.py index 469ce32a7..a8539f3f9 100755 --- a/OpenChange/gen-property-selectors.py +++ b/OpenChange/gen-property-selectors.py @@ -253,9 +253,9 @@ if __name__ == "__main__": getters_idx[prop_idx] = " 0x%.4x" % current_getter_idx if prop_idx > highest_prop_idx: highest_prop_idx = prop_idx - getters.append(" @selector (get%s:)" % name) + getters.append(" @selector (get%s:inMemCtx:)" % name) # preferred_types.append(" 0x%.4x" % (prop_tag & 0xffff)) - prototypes.append("- (int) get%s: (void **) data;" % name) + prototypes.append("- (int) get%s: (void **) data inMemCtx: (TALLOC_CTX *) memCtx;" % name) current_getter_idx = current_getter_idx + 1 # setters[prop_idx] = " @selector (set%s:)" % name # prototypes.append("- (int) set%s: (void **) data;" % name)