diff --git a/ChangeLog b/ChangeLog index 2324f4ec9..0f8d28664 100644 --- a/ChangeLog +++ b/ChangeLog @@ -41,13 +41,99 @@ * UI/WebServerResources/UIxAclEditor.js (addUser): fixed positioning of new user. +2012-03-13 Wolfgang Sourdeau + + * OpenChange/MAPIStoreCalendarFolder.m + (-getPidTagDefaultPostMessageClass:inMemCtx:): new getter. + + * OpenChange/MAPIStoreFolder.m + (_modifyPermissionEntryForUser:withRoles:isAddition:withACLFolder:): + skip any modification when user is nil. + (_usernameFromEntryId:): when the bytes array is nil or is empty, + we return a nil username. + (-modifyPermissions:withCount:andFlags:): ignore the presence of + certain fields but not others depending on the requested + modification. + 2012-03-12 Francis Lachapelle * SoObjects/SOGo/WORequest+SOGo.m (-isIPhoneAddressBookApp): catch the user agent of iOS 5.0.1 on iPad. +2012-03-12 Wolfgang Sourdeau + + * OpenChange/MAPIStoreGCSFolder.m (-lastMessageModificationTime): + force a synchronisation from here to ensure that the cache is + up-to-date. + + * OpenChange/MAPIStoreTypes.m (_reverseCN): fixed used of ull + constants on 32 bit platforms. + + * OpenChange/MAPIStoreGCSFolder.m (-componentQualifier): now + provided by the parent class itself. + (-contentComponentQualifier): new method that returns a qualifier + that translated to "c_content like '%BEGIN:XXX%'". This is a hack + to work-around the fact that calendar folders may content both + vevent and vtodo and that c_component, being part of the quick + table, is no longer available when a record is deleted. + (-synchroniseCache): update version values for deleted records + too, by taking into account the fact that their c_version value + might still be 0. Make use of contentComponentQualifier above. + Remove the modified records from the SOGoGCSFolder cache. + (-getDeletedKeysFromChangeNumber:andCN:inTableType:): wander the + list of deleted records and no longer increase the change number, + as this is now done from "synchroniseCache". Also, handle the case + were deleted records might already have been reported by comparing + their change number to the one provided as parameter. The + resulting change number is now guaranteed to be the highest one. + (-component): new subclassable method that returns a string + matching the folder's handled component. + + * OpenChange/MAPIStoreFolder.m + (-getPidTagLocalCommitTimeMax:inMemCtx:): returns + MAPISTORE_ERR_NOT_FOUND if the resulting date is nil. + + * OpenChange/MAPIStoreGCSMessage.m + (-getPidTagPredecessorChangeList:inMemCtx:): when the list is + missing, request a synchronisation from the container as the + message might now have been synchronised yet... + + * OpenChange/MAPIStoreTypes.m (MAPICNCompare): new function that + returns an NSComparisonResult for two change numbers (reverse + format). + +2012-03-11 Wolfgang Sourdeau + + * OpenChange/MAPIStoreCalendarMessage.m + (-getPidLidAppointmentMessageClass:inMemCtx:): returns "IPM.Appointment". + (-getPidLidSideEffects:inMemCtx:): returns the value specified in + OXOCAL, section 2.2.2.2. + (_fixupAppointmentObjectWithUID:): renamed method and made more + generic, in order to handle the case where the response record has + already been deleted. + (-save): handle organizer and attendees more in compliance with + the spec, in order to avoid ending up with an empty event when an + invitation is being replied to. Of course, the documentation + happened to be inexact with regardes to the value of + "PidTagRecipientTrackStatus", which can be 5 even though the user + replied with another value... Also, lowered the priority of + SOGo-specific hacks for setting the organizer. + 2012-03-09 Wolfgang Sourdeau + * OpenChange/MAPIStoreMailVolatileMessage.m (-submitWithFlags:): + skip any message that is not of class "IPM.Note", in order to + avoid sending invitations or responses. + + * SoObjects/Mailer/SOGoMailFolder.m (-renameTo:): reset the + imap4URL to nil and change the nameInContainer after a successful + operation. + + * OpenChange/MAPIStoreFolder.m + (-getTable:andRowCount:tableType:andHandleId:): if the current + user is not the owner of the folder, the permissions table cannot + be open and MAPISTORE_ERR_DENIED is now returned. + * SoObjects/Contacts/NGVCard+SOGo.m (_setupEmailFieldsInLDIFRecord:): the value of card elements were not properly extracted when no email field were of type "home" or @@ -59,6 +145,27 @@ attributes of document.body before calling "hasClassName" to fix an error with IE9. +2012-03-08 Wolfgang Sourdeau + + * OpenChange/MAPIStoreFolder.m: commented out key cache ivars + (temporarily). + + * OpenChange/MAPIStoreContext.m (-getRootFolder:inMemCtx:): do not + store the looked up folders when they are not descendants of + SOGoObject. Return MAPISTORE_ERR_NOT_FOUND when the looked up + folder is owner by the current user and MAPISTORE_ERR_DENIED + otherwise. + + * OpenChange/MAPIStoreGCSFolder.m (-synchroniseCache): ensure that + any record that are marked as updated are removed from the record + cache of the corresponding SOGoGCSFolder instance. + + * OpenChange/MAPIStoreFolder.m (-getPidTagSubFolders:inMemCtx:): + invoke [self folderKeys] rather than the corresponding ivar. + + * OpenChange/MAPIStoreTypes.m (NSObjectFromMAPISPropValue) + (NSObjectFromSPropValue): treat PT_ERROR just as PT_LONG. + 2012-03-06 Wolfgang Sourdeau * SoObjects/Mailer/SOGoMailFolder.m @@ -70,6 +177,37 @@ where the home mail would be taken for both first and second email fields when no work mail was present. +2012-03-02 Wolfgang Sourdeau + + * OpenChange/MAPIStoreAppointmentWrapper.m,, + OpenChange/MAPIStoreAttachment.m, + OpenChange/MAPIStoreCalendarAttachment.m, + OpenChange/MAPIStoreCalendarMessage.m, + OpenChange/MAPIStoreContactsAttachment.m, + OpenChange/MAPIStoreContactsMessage.m, + OpenChange/MAPIStoreFAIMessage.m, + OpenChange/MAPIStoreFSMessageTable.m, + OpenChange/MAPIStoreFolder.m, OpenChange/MAPIStoreFolderTable.m, + OpenChange/MAPIStoreGCSFolder.m, OpenChange/MAPIStoreGCSMessage.m, + OpenChange/MAPIStoreGCSMessageTable.m, + OpenChange/MAPIStoreMailAttachment.m, + OpenChange/MAPIStoreMailFolder.m, + OpenChange/MAPIStoreMailMessage.m, + OpenChange/MAPIStoreMailMessageTable.m, + OpenChange/MAPIStoreMessage.m, OpenChange/MAPIStoreNotesMessage.m, + OpenChange/MAPIStoreObject.m, + OpenChange/MAPIStorePermissionsTable.m, + OpenChange/MAPIStoreTasksMessage.m, + OpenChange/MAPIStoreVolatileMessage.m: updated name of getters to + reflect the new nomenclature. + + * OpenChange/NSArray+MAPIStore.[hm]: updated to new name of + handled structs. + + * OpenChange/gen-property-selectors.py: adapted for new getters + name, based on new property names. Added all new clashing + properties to bannedProps. + 2012-03-02 Jean Raby * Scripts/sogo-backup.sh: new script to automate backups. @@ -92,6 +230,31 @@ * UI/WebServerResources/ContactsUI.js (appendAddressBook): assume that lists can be created in the new addressbook. +2012-02-28 Wolfgang Sourdeau + + * OpenChange/MAPIStoreMailFolder.m + (-moveCopyMessagesWithMIDs:andCount:fromFolder:withMIDs:andChangeKeys:wantCopy:): + we sync the version cache with the folder in order to update the + target message change keys, which was causing versioning issues + with Outlook 2010. + + * OpenChange/gen-property-selectors.py: bannedProps is now an + array instead of a dict of "True" values. + Added "PrOabContainerGuid" to bannedProps. + +2012-02-27 Wolfgang Sourdeau + + * OpenChange/MAPIStoreUserContext.m (-rootFolders:): + -[NGImap4Connection enableExtensions:] now takes an array of + strings rather than a single string argument. + +2012-02-24 Wolfgang Sourdeau + + * SoObjects/Mailer/SOGoMailFolder.m: ensure the imap connection is + available before performing certain operations, otherwise return + an exception. This only applies on methods that return an + exception, others were left untouched. + 2012-02-23 Wolfgang Sourdeau * OpenChange/MAPIStoreMailContext.m diff --git a/OpenChange/MAPIStoreAppointmentWrapper.h b/OpenChange/MAPIStoreAppointmentWrapper.h index fa1cb8f20..7f68e82e0 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.h +++ b/OpenChange/MAPIStoreAppointmentWrapper.h @@ -69,33 +69,33 @@ extern NSTimeZone *utcTZ; - (void) fillMessageData: (struct mapistore_message *) dataPtr inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrSenderEmailAddress: (void **) data +- (int) getPidTagSenderEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrSenderAddrtype: (void **) data +- (int) getPidTagSenderAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrSenderName: (void **) data +- (int) getPidTagSenderName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrSenderEntryid: (void **) data +- (int) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrReceivedByAddrtype: (void **) data +- (int) getPidTagReceivedByAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrReceivedByEmailAddress: (void **) data +- (int) getPidTagReceivedByEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrReceivedByName: (void **) data +- (int) getPidTagReceivedByName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrReceivedByEntryid: (void **) data +- (int) getPidTagReceivedByEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrIconIndex: (void **) data +- (int) getPidTagIconIndex: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrOwnerApptId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidTagOwnerAppointmentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidMeetingType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrMessageClass: (void **) data +- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrStartDate: (void **) data +- (int) getPidTagStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentStateFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; @@ -106,7 +106,7 @@ extern NSTimeZone *utcTZ; inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidCommonStart: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrEndDate: (void **) data +- (int) getPidTagEndDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentEndWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; @@ -120,17 +120,17 @@ extern NSTimeZone *utcTZ; inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidIndentedBusyStatus: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrSubject: (void **) data // SUMMARY +- (int) getPidTagSubject: (void **) data // SUMMARY inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidLocation: (void **) data // LOCATION inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrSensitivity: (void **) data // not implemented, depends on CLASS +- (int) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrImportance: (void **) data +- (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrBody: (void **) data +- (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidIsRecurring: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 947e2119b..808acfe2b 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -436,7 +436,7 @@ static NSCharacterSet *hexCharacterSet = nil; } } -- (int) getPrIconIndex: (void **) data // TODO +- (int) getPidTagIconIndex: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -502,8 +502,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPrOwnerApptId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOwnerAppointmentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc; const char *utf8UID; @@ -581,7 +581,7 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) getPrMessageClass: (void **) data +- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { const char *className; @@ -634,7 +634,7 @@ static NSCharacterSet *hexCharacterSet = nil; return [self getYes: data inMemCtx: memCtx]; } -- (int) getPrStartDate: (void **) data +- (int) getPidTagStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; @@ -716,7 +716,7 @@ static NSCharacterSet *hexCharacterSet = nil; - (int) getPidLidAppointmentStartWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrStartDate: data inMemCtx: memCtx]; + return [self getPidTagStartDate: data inMemCtx: memCtx]; } - (int) getPidLidCommonStart: (void **) data @@ -797,7 +797,7 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) _getEntryid: (void **) data +- (int) _getEntryId: (void **) data forICalPerson: (iCalPerson *) person inMemCtx: (TALLOC_CTX *) memCtx { @@ -820,7 +820,7 @@ static NSCharacterSet *hexCharacterSet = nil; } /* sender (organizer) */ -- (int) getPrSenderEmailAddress: (void **) data +- (int) getPidTagSenderEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddress: data @@ -828,7 +828,7 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: memCtx]; } -- (int) getPrSenderAddrtype: (void **) data +- (int) getPidTagSenderAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getAddrType: data @@ -836,7 +836,7 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: memCtx]; } -- (int) getPrSenderName: (void **) data +- (int) getPidTagSenderName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getName: data @@ -844,16 +844,16 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: memCtx]; } -- (int) getPrSenderEntryid: (void **) data +- (int) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self _getEntryid: data + return [self _getEntryId: data forICalPerson: [event organizer] inMemCtx: memCtx]; } /* attendee */ -- (int) getPrReceivedByEmailAddress: (void **) data +- (int) getPidTagReceivedByEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddress: data @@ -861,7 +861,7 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: memCtx]; } -- (int) getPrReceivedByAddrtype: (void **) data +- (int) getPidTagReceivedByAddressType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getAddrType: data @@ -869,7 +869,7 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: memCtx]; } -- (int) getPrReceivedByName: (void **) data +- (int) getPidTagReceivedByName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getName: data @@ -877,16 +877,16 @@ static NSCharacterSet *hexCharacterSet = nil; inMemCtx: memCtx]; } -- (int) getPrReceivedByEntryid: (void **) data +- (int) getPidTagReceivedByEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self _getEntryid: data + return [self _getEntryId: data forICalPerson: [event userAsAttendee: user] inMemCtx: memCtx]; } /* /attendee */ -- (int) getPrEndDate: (void **) data +- (int) getPidTagEndDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; @@ -911,7 +911,7 @@ static NSCharacterSet *hexCharacterSet = nil; - (int) getPidLidAppointmentEndWhole: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrEndDate: data inMemCtx: memCtx]; + return [self getPidTagEndDate: data inMemCtx: memCtx]; } - (int) getPidLidCommonEnd: (void **) data @@ -960,7 +960,7 @@ static NSCharacterSet *hexCharacterSet = nil; return [self getPidLidBusyStatus: data inMemCtx: memCtx]; } -- (int) getPrSubject: (void **) data // SUMMARY +- (int) getPidTagSubject: (void **) data // SUMMARY inMemCtx: (TALLOC_CTX *) memCtx { *data = [[event summary] asUnicodeInMemCtx: memCtx]; @@ -1013,14 +1013,14 @@ static NSCharacterSet *hexCharacterSet = nil; return [self getNo: data inMemCtx: memCtx]; } -- (int) getPrSensitivity: (void **) data // not implemented, depends on CLASS +- (int) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS inMemCtx: (TALLOC_CTX *) memCtx { // normal = 0, personal?? = 1, private = 2, confidential = 3 return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPrImportance: (void **) data +- (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; @@ -1036,7 +1036,7 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPrBody: (void **) data +- (int) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; @@ -1397,7 +1397,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, [self _setupAlarm]; return (alarm - ? [self getPrStartDate: data inMemCtx: memCtx] + ? [self getPidTagStartDate: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } diff --git a/OpenChange/MAPIStoreAttachment.m b/OpenChange/MAPIStoreAttachment.m index ca9076ad0..9b17f9e03 100644 --- a/OpenChange/MAPIStoreAttachment.m +++ b/OpenChange/MAPIStoreAttachment.m @@ -65,24 +65,24 @@ return mimeAttachTag; } -- (int) getPrMid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } -- (int) getPrAttachNum: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, aid); return MAPISTORE_SUCCESS; } -- (int) getPrRenderingPosition: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagRenderingPosition: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0xffffffff); diff --git a/OpenChange/MAPIStoreCalendarAttachment.m b/OpenChange/MAPIStoreCalendarAttachment.m index 5bfce054b..63aa68df8 100644 --- a/OpenChange/MAPIStoreCalendarAttachment.m +++ b/OpenChange/MAPIStoreCalendarAttachment.m @@ -34,24 +34,24 @@ @implementation MAPIStoreCalendarAttachment -- (int) getPrAttachmentHidden: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (int) getPidTagAttachmentHidden: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { *data = MAPIBoolValue (localMemCtx, YES); return MAPISTORE_SUCCESS; } -- (int) getPrAttachmentFlags: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (int) getPidTagAttachmentFlags: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { *data = MAPILongValue (localMemCtx, 0x00000002); /* afException */ return MAPISTORE_SUCCESS; } -- (int) getPrAttachmMethod: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (int) getPidTagAttachMethod: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { *data = MAPILongValue (localMemCtx, 0x00000005); /* afEmbeddedMessage */ diff --git a/OpenChange/MAPIStoreCalendarFolder.m b/OpenChange/MAPIStoreCalendarFolder.m index f2ec0a4dd..f50b0358c 100644 --- a/OpenChange/MAPIStoreCalendarFolder.m +++ b/OpenChange/MAPIStoreCalendarFolder.m @@ -35,9 +35,11 @@ #import "MAPIStoreCalendarContext.h" #import "MAPIStoreCalendarMessage.h" #import "MAPIStoreCalendarMessageTable.h" +#import "NSString+MAPIStore.h" #import "MAPIStoreCalendarFolder.h" +#include #include #include @@ -49,17 +51,9 @@ return [MAPIStoreCalendarMessageTable tableForContainer: self]; } -- (EOQualifier *) componentQualifier +- (NSString *) component { - static EOQualifier *componentQualifier = nil; - - if (!componentQualifier) - componentQualifier - = [[EOKeyValueQualifier alloc] initWithKey: @"c_component" - operatorSelector: EOQualifierOperatorEqual - value: @"vevent"]; - - return componentQualifier; + return @"vevent"; } - (MAPIStoreMessage *) createMessage @@ -170,4 +164,13 @@ [(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]]; } +- (int) getPidTagDefaultPostMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + *data = [@"IPM.Appointment" asUnicodeInMemCtx: memCtx]; + + return MAPISTORE_SUCCESS; +} + + @end diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 5c491bf5e..bd299eb35 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -126,10 +126,10 @@ } /* getters */ -- (int) getPrIconIndex: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagIconIndex: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrIconIndex: data inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagIconIndex: data inMemCtx: memCtx]; } - (int) getPidLidFInvited: (void **) data @@ -138,24 +138,32 @@ return [self getYes: data inMemCtx: memCtx]; } -- (int) getPrMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.Appointment"); return MAPISTORE_SUCCESS; } -- (int) getPrOwnerApptId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidLidAppointmentMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrOwnerApptId: data inMemCtx: memCtx]; + *data = talloc_strdup (memCtx, "IPM.Appointment"); + + return MAPISTORE_SUCCESS; } -- (int) getPrStartDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOwnerAppointmentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrStartDate: data inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagOwnerAppointmentId: data inMemCtx: memCtx]; +} + +- (int) getPidTagStartDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidTagStartDate: data inMemCtx: memCtx]; } - (int) getPidLidAppointmentStateFlags: (void **) data @@ -183,10 +191,10 @@ return [[self appointmentWrapper] getPidLidCommonStart: data inMemCtx: memCtx]; } -- (int) getPrEndDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagEndDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrEndDate: data inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagEndDate: data inMemCtx: memCtx]; } - (int) getPidLidAppointmentEndWhole: (void **) data @@ -220,10 +228,20 @@ return [[self appointmentWrapper] getPidLidBusyStatus: data inMemCtx: memCtx]; } -- (int) getPrSubject: (void **) data // SUMMARY - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSubject: (void **) data // SUMMARY + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrSubject: data inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagSubject: data inMemCtx: memCtx]; +} + +- (int) getPidLidSideEffects: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx +{ + *data = MAPILongValue (memCtx, + seOpenToDelete | seOpenToCopy | seOpenToMove + | seCoerceToInbox | seOpenForCtxMenu); + + return MAPISTORE_SUCCESS; } - (int) getPidLidLocation: (void **) data // LOCATION @@ -238,22 +256,22 @@ return [[self appointmentWrapper] getPidLidPrivate: data inMemCtx: memCtx]; } -- (int) getPrSensitivity: (void **) data // not implemented, depends on CLASS - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrSensitivity: data inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagSensitivity: data inMemCtx: memCtx]; } -- (int) getPrImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrImportance: data inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagImportance: data inMemCtx: memCtx]; } -- (int) getPrBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrBody: data inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagBody: data inMemCtx: memCtx]; } - (int) getPidLidIsRecurring: (void **) data @@ -289,7 +307,7 @@ inMemCtx: memCtx]; } -- (int) getPrProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } @@ -324,114 +342,114 @@ } /* sender */ -- (int) getPrSenderEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSenderEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrSenderEmailAddress: data - inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagSenderEmailAddress: data + inMemCtx: memCtx]; } -- (int) getPrSenderAddrtype: (void **) data +- (int) getPidTagSenderAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidTagSenderAddressType: data + inMemCtx: memCtx]; +} + +- (int) getPidTagSenderName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrSenderAddrtype: data + return [[self appointmentWrapper] getPidTagSenderName: data inMemCtx: memCtx]; } -- (int) getPrSenderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [[self appointmentWrapper] getPrSenderName: data - inMemCtx: memCtx]; -} - -- (int) getPrSenderEntryid: (void **) data inMemCtx: (TALLOC_CTX *) memCtx -{ - return [[self appointmentWrapper] getPrSenderEntryid: data - inMemCtx: memCtx]; + return [[self appointmentWrapper] getPidTagSenderEntryId: data + inMemCtx: memCtx]; } /* sender representing */ -- (int) getPrSentRepresentingEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSentRepresentingEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSenderEmailAddress: data inMemCtx: memCtx]; + return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; } -- (int) getPrSentRepresentingAddrtype: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSentRepresentingAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPrSentRepresentingName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSentRepresentingName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSenderName: data inMemCtx: memCtx]; + return [self getPidTagSenderName: data inMemCtx: memCtx]; } -- (int) getPrSentRepresentingEntryid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSentRepresentingEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSenderEntryid: data inMemCtx: memCtx]; + return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; } /* attendee */ -// - (int) getPrReceivedByAddrtype: (void **) data +// - (int) getPidTagReceivedByAddressType: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { -// return [[self appointmentWrapper] getPrReceivedByAddrtype: data +// return [[self appointmentWrapper] getPidTagReceivedByAddressType: data // inMemCtx: memCtx]; // } -// - (int) getPrReceivedByEmailAddress: (void **) data +// - (int) getPidTagReceivedByEmailAddress: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { -// return [[self appointmentWrapper] getPrReceivedByEmailAddress: data +// return [[self appointmentWrapper] getPidTagReceivedByEmailAddress: data // inMemCtx: memCtx]; // } -// - (int) getPrReceivedByName: (void **) data +// - (int) getPidTagReceivedByName: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { -// return [[self appointmentWrapper] getPrReceivedByName: data +// return [[self appointmentWrapper] getPidTagReceivedByName: data // inMemCtx: memCtx]; // } -// - (int) getPrReceivedByEntryid: (void **) data +// - (int) getPidTagReceivedByEntryId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { -// return [[self appointmentWrapper] getPrReceivedByEntryid: data +// return [[self appointmentWrapper] getPidTagReceivedByEntryId: data // inMemCtx: memCtx]; // } // /* attendee representing */ -// - (int) getPrRcvdRepresentingEmailAddress: (void **) data +// - (int) getPidTagReceivedRepresentingEmailAddress: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { -// return [self getPrReceivedByEmailAddress: data inMemCtx: memCtx]; +// return [self getPidTagReceivedByEmailAddress: data inMemCtx: memCtx]; // } -// - (int) getPrRcvdRepresentingAddrtype: (void **) data +// - (int) getPidTagReceivedRepresentingAddressType: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // return [self getSMTPAddrType: data inMemCtx: memCtx]; // } -// - (int) getPrRcvdRepresentingName: (void **) data +// - (int) getPidTagReceivedRepresentingName: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { -// return [self getPrReceivedByName: data inMemCtx: memCtx]; +// return [self getPidTagReceivedByName: data inMemCtx: memCtx]; // } -// - (int) getPrRcvdRepresentingEntryid: (void **) data +// - (int) getPidTagReceivedRepresentingEntryId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { -// return [self getPrReceivedByEntryid: data inMemCtx: memCtx]; +// return [self getPidTagReceivedByEntryId: data inMemCtx: memCtx]; // } -- (int) getPrResponseRequested: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagResponseRequested: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } @@ -542,43 +560,50 @@ return uid; } -- (void) _fixupEventWithExistingUID +- (void) _fixupAppointmentObjectWithUID: (NSString *) uid { - NSString *uid, *existingCName, *existingURL; + NSString *cname, *url; MAPIStoreMapping *mapping; uint64_t objectId; - SOGoAppointmentObject *existingObject; + SOGoAppointmentFolder *folder; + SOGoAppointmentObject *newObject; WOContext *woContext; - uid = [self _uidFromGlobalObjectId]; - existingCName = [[container sogoObject] resourceNameForEventUID: uid]; - if (existingCName) + cname = [[container sogoObject] resourceNameForEventUID: uid]; + if (cname) + isNew = NO; + else + cname = [NSString stringWithFormat: @"%@.ics", uid]; + + mapping = [self mapping]; + + url = [NSString stringWithFormat: @"%@%@", [container url], cname]; + folder = [container sogoObject]; + /* reinstantiate the old sogo object and attach it to self */ + woContext = [[self userContext] woContext]; + if (isNew) + newObject = [SOGoAppointmentObject objectWithName: cname + inContainer: folder]; + else { - mapping = [self mapping]; - /* dissociate the object url from the old object's id */ - existingURL = [NSString stringWithFormat: @"%@%@", - [container url], existingCName]; - objectId = [mapping idFromURL: existingURL]; + objectId = [mapping idFromURL: url]; [mapping unregisterURLWithID: objectId]; - - /* dissociate the object url associated with this object, as we want to - discard it */ - objectId = [self objectId]; - [mapping unregisterURLWithID: objectId]; - - /* associate the object url with this object id */ - [mapping registerURL: existingURL withID: objectId]; - - /* reinstantiate the old sogo object and attach it to self */ - woContext = [[self userContext] woContext]; - existingObject = [[container sogoObject] lookupName: existingCName - inContext: woContext - acquire: NO]; - [existingObject setContext: woContext]; - ASSIGN (sogoObject, existingObject); - isNew = NO; + newObject = [folder lookupName: cname + inContext: woContext + acquire: NO]; } + + /* dissociate the object url associated with this object, as we want to + discard it */ + objectId = [self objectId]; + [mapping unregisterURLWithID: objectId]; + + /* associate the new object url with this object id */ + [mapping registerURL: url withID: objectId]; + + [newObject setContext: woContext]; + ASSIGN (sogoObject, newObject); } - (void) _setupAlarmDataInEvent: (iCalEvent *) newEvent @@ -657,9 +682,9 @@ iCalDateTime *start, *end; iCalTimeZone *tz; NSCalendarDate *now; - NSString *content, *tzName, *priority; + NSString *uid, *content, *tzName, *priority, *newParticipationStatus = nil; iCalEvent *newEvent; - iCalPerson *userPerson; + // iCalPerson *userPerson; NSUInteger responseStatus = 0; NSInteger tzOffset; SOGoUser *activeUser, *ownerUser; @@ -667,12 +692,18 @@ if (isNew) { - /* Hack required because of what's explained in oxocal 3.1.4.7.1: - basically, Outlook creates a copy of the event and then removes the - old instance. We perform a trickery to avoid performing those - operations in the backend, in a way that enables us to recover the - initial instance and act solely on it. */ - [self _fixupEventWithExistingUID]; + uid = [self _uidFromGlobalObjectId]; + if (uid) + { + /* Hack required because of what's explained in oxocal 3.1.4.7.1: + basically, Outlook creates a copy of the event and then removes the + old instance. We perform a trickery to avoid performing those + operations in the backend, in a way that enables us to recover the + initial instance and act solely on it. */ + [self _fixupAppointmentObjectWithUID: uid]; + } + else + uid = [SOGoObject globallyUniqueObjectId]; } [self logWithFormat: @"-save, event props:"]; @@ -686,286 +717,225 @@ newEvent = [sogoObject component: YES secure: NO]; vCalendar = [newEvent parent]; [vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"]; - content = [vCalendar versitString]; [newEvent setCreated: now]; + [newEvent setUid: uid]; + content = [vCalendar versitString]; } vCalendar = [iCalCalendar parseSingleFromSource: content]; newEvent = [[vCalendar events] objectAtIndex: 0]; - - ownerUser = [[self userContext] sogoUser]; - userPerson = [newEvent userAsAttendee: ownerUser]; [newEvent setTimeStampAsDate: now]; + [newEvent setLastModified: now]; - if (userPerson) + // summary + value = [properties + objectForKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)]; + if (value) + [newEvent setSummary: value]; + + // Location + value = [properties objectForKey: MAPIPropertyKey (PidLidLocation)]; + if (value) + [newEvent setLocation: value]; + + isAllDay = [newEvent isAllDay]; + value = [properties + objectForKey: MAPIPropertyKey (PidLidAppointmentSubType)]; + if (value) + isAllDay = [value boolValue]; + if (!isAllDay) { - // iCalPersonPartStat newPartStat; - NSString *newPartStat; - - value - = [properties objectForKey: MAPIPropertyKey (PidLidResponseStatus)]; - if (value) - responseStatus = [value unsignedLongValue]; - - /* FIXME: we should provide a data converter between OL partstats and - SOGo */ - switch (responseStatus) + tzName = [[self ownerTimeZone] name]; + tz = [iCalTimeZone timeZoneForName: tzName]; + [vCalendar addTimeZone: tz]; + } + + // start + value = [properties objectForKey: MAPIPropertyKey (PR_START_DATE)]; + if (!value) + value = [properties + objectForKey: MAPIPropertyKey (PidLidAppointmentStartWhole)]; + if (value) + { + start = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtstart"]; + if (isAllDay) { - case 0x02: /* respTentative */ - // newPartStat = iCalPersonPartStatTentative; - newPartStat = @"TENTATIVE"; - break; - case 0x03: /* respAccepted */ - // newPartStat = iCalPersonPartStatAccepted; - newPartStat = @"ACCEPTED"; - break; - case 0x04: /* respDeclined */ - // newPartStat = iCalPersonPartStatDeclined; - newPartStat = @"DECLINED"; - break; - default: - newPartStat = nil; + tzOffset = [[value timeZone] secondsFromGMTForDate: value]; + value = [value dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: -tzOffset]; + [start setTimeZone: nil]; + [start setDate: value]; } - - if (newPartStat // != iCalPersonPartStatUndefined - ) + else { - // iCalPerson *participant; + [start setTimeZone: tz]; + [start setDateTime: value]; + } + } - // participant = [newEvent userAsAttendee: ownerUser]; - // [participant setParticipationStatus: newPartStat]; - // [sogoObject saveComponent: newEvent]; + /* end */ + value = [properties objectForKey: MAPIPropertyKey (PR_END_DATE)]; + if (!value) + value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentEndWhole)]; + if (value) + { + end = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtend"]; + if (isAllDay) + { + tzOffset = [[value timeZone] secondsFromGMTForDate: value]; + value = [value dateByAddingYears: 0 months: 0 days: 0 + hours: 0 minutes: 0 + seconds: -tzOffset]; + [end setTimeZone: nil]; + [end setDate: value]; + } + else + { + [end setTimeZone: tz]; + [end setDateTime: value]; + } + } - [sogoObject changeParticipationStatus: newPartStat - withDelegate: nil]; - // [[self context] tearDownRequest]; + /* priority */ + value = [properties objectForKey: MAPIPropertyKey(PR_IMPORTANCE)]; + if (value) + { + switch ([value intValue]) + { + case 0: // IMPORTANCE_LOW + priority = @"9"; + break; + case 2: // IMPORTANCE_HIGH + priority = @"1"; + break; + default: // IMPORTANCE_NORMAL + priority = @"5"; } } else + priority = @"0"; // None + [newEvent setPriority: priority]; + + /* show time as free/busy/tentative/out of office. Possible values are: + 0x00000000 - olFree + 0x00000001 - olTentative + 0x00000002 - olBusy + 0x00000003 - olOutOfOffice */ + value = [properties objectForKey: MAPIPropertyKey(PidLidBusyStatus)]; + if (value) { - [newEvent setLastModified: now]; - - // summary - value = [properties - objectForKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)]; - if (value) - [newEvent setSummary: value]; - - // Location - value = [properties objectForKey: MAPIPropertyKey (PidLidLocation)]; - if (value) - [newEvent setLocation: value]; - - isAllDay = [newEvent isAllDay]; - value = [properties - objectForKey: MAPIPropertyKey (PidLidAppointmentSubType)]; - if (value) - isAllDay = [value boolValue]; - if (!isAllDay) + switch ([value intValue]) { - tzName = [[self ownerTimeZone] name]; - tz = [iCalTimeZone timeZoneForName: tzName]; - [vCalendar addTimeZone: tz]; + case 0: + [newEvent setTransparency: @"TRANSPARENT"]; + break; + case 1: + case 2: + case 3: + default: + [newEvent setTransparency: @"OPAQUE"]; } + } - // start - value = [properties objectForKey: MAPIPropertyKey (PR_START_DATE)]; - if (!value) - value = [properties - objectForKey: MAPIPropertyKey (PidLidAppointmentStartWhole)]; + /* Comment */ + value = [properties objectForKey: MAPIPropertyKey (PR_BODY_UNICODE)]; + if (!value) + { + value = [properties objectForKey: MAPIPropertyKey (PR_HTML)]; if (value) { - start = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtstart"]; - if (isAllDay) - { - tzOffset = [[value timeZone] secondsFromGMTForDate: value]; - value = [value dateByAddingYears: 0 months: 0 days: 0 - hours: 0 minutes: 0 - seconds: -tzOffset]; - [start setTimeZone: nil]; - [start setDate: value]; - } - else - { - [start setTimeZone: tz]; - [start setDateTime: value]; - } + value = [[NSString alloc] initWithData: value + encoding: NSUTF8StringEncoding]; + [value autorelease]; + value = [value htmlToText]; } - - /* end */ - value = [properties objectForKey: MAPIPropertyKey (PR_END_DATE)]; - if (!value) - value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentEndWhole)]; - if (value) - { - end = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtend"]; - if (isAllDay) - { - tzOffset = [[value timeZone] secondsFromGMTForDate: value]; - value = [value dateByAddingYears: 0 months: 0 days: 0 - hours: 0 minutes: 0 - seconds: -tzOffset]; - [end setTimeZone: nil]; - [end setDate: value]; - } - else - { - [end setTimeZone: tz]; - [end setDateTime: value]; - } - } - - /* priority */ - value = [properties objectForKey: MAPIPropertyKey(PR_IMPORTANCE)]; - if (value) - { - switch ([value intValue]) - { - case 0: // IMPORTANCE_LOW - priority = @"9"; - break; - case 2: // IMPORTANCE_HIGH - priority = @"1"; - break; - default: // IMPORTANCE_NORMAL - priority = @"5"; - } - } - else - priority = @"0"; // None - [newEvent setPriority: priority]; - - /* show time as free/busy/tentative/out of office. Possible values are: - 0x00000000 - olFree - 0x00000001 - olTentative - 0x00000002 - olBusy - 0x00000003 - olOutOfOffice */ - value = [properties objectForKey: MAPIPropertyKey(PidLidBusyStatus)]; - if (value) - { - switch ([value intValue]) - { - case 0: - [newEvent setTransparency: @"TRANSPARENT"]; - break; - case 1: - case 2: - case 3: - default: - [newEvent setTransparency: @"OPAQUE"]; - } - } - - /* Comment */ - value = [properties objectForKey: MAPIPropertyKey (PR_BODY_UNICODE)]; - if (!value) - { - value = [properties objectForKey: MAPIPropertyKey (PR_HTML)]; - if (value) - { - value = [[NSString alloc] initWithData: value - encoding: NSUTF8StringEncoding]; - [value autorelease]; - value = [value htmlToText]; - } - } - if (value && [value length] == 0) - value = nil; - [newEvent setComment: value]; + } + if (value && [value length] == 0) + value = nil; + [newEvent setComment: value]; - /* recurrence */ - value = [properties + /* recurrence */ + value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentRecur)]; + if (value) + [self _setupRecurrenceInCalendar: vCalendar + withEvent: newEvent + fromData: value]; + + [newEvent setOrganizer: nil]; + [newEvent removeAllAttendees]; + + /* alarm */ + [self _setupAlarmDataInEvent: newEvent]; + + if ([[properties objectForKey: MAPIPropertyKey (PidLidAppointmentStateFlags)] intValue] + != 0) + { + // Organizer + value = [properties objectForKey: @"recipients"]; if (value) - [self _setupRecurrenceInCalendar: vCalendar - withEvent: newEvent - fromData: value]; - - [newEvent setOrganizer: nil]; - [newEvent removeAllAttendees]; - - /* alarm */ - [self _setupAlarmDataInEvent: newEvent]; - - if ([[properties objectForKey: MAPIPropertyKey (PidLidAppointmentStateFlags)] intValue] - != 0) { - // Organizer - value = [properties objectForKey: @"recipients"]; - if (value) - { - NSArray *recipients; - NSDictionary *dict; - NSString *orgEmail, *sentBy, *attEmail; - iCalPerson *person; - iCalPersonPartStat newPartStat; - NSNumber *flags, *trackStatus; - int i, effective; + NSArray *recipients; + NSDictionary *dict; + NSString *orgEmail, *sentBy, *attEmail; + iCalPerson *person; + iCalPersonPartStat newPartStat; + NSNumber *flags, *trackStatus; + int i, effective; + BOOL organizerIsSet = NO; - /* We must set the organizer preliminarily here because, unlike what - the doc states, Outlook does not always pass the real organizer - in the recipients list. */ - dict = [ownerUser primaryIdentity]; + recipients = [value objectForKey: @"to"]; + effective = 0; + for (i = 0; i < [recipients count]; i++) + { + dict = [recipients objectAtIndex: i]; person = [iCalPerson new]; [person setCn: [dict objectForKey: @"fullName"]]; - orgEmail = [dict objectForKey: @"email"]; - [person setEmail: orgEmail]; - - activeUser = [[self context] activeUser]; - if (![activeUser isEqual: ownerUser]) + attEmail = [dict objectForKey: @"email"]; + [person setEmail: attEmail]; + + flags = [dict objectForKey: MAPIPropertyKey (PR_RECIPIENT_FLAGS)]; + if (!flags) { - dict = [activeUser primaryIdentity]; - sentBy = [NSString stringWithFormat: @"mailto:%@", - [dict objectForKey: @"email"]]; - [person setSentBy: sentBy]; + [self logWithFormat: + @"no recipient flags specified: skipping recipient"]; + continue; } - [newEvent setOrganizer: person]; - [person release]; - recipients = [value objectForKey: @"to"]; - effective = 0; - for (i = 0; i < [recipients count]; i++) + if (([flags unsignedIntValue] & 0x0002)) /* recipOrganizer */ { - dict = [recipients objectAtIndex: i]; + [newEvent setOrganizer: person]; + organizerIsSet = YES; + [self logWithFormat: @"organizer set via recipient flags"]; + } + else + { + BOOL isOrganizer = NO; - flags = [dict objectForKey: MAPIPropertyKey (PR_RECIPIENT_FLAGS)]; - if (!flags) + // /* Work-around: it happens that Outlook still passes the + // organizer as a recipient, maybe because of a feature + // documented in a pre-mesozoic PDF still buried in a + // cavern... In that case we remove it, and we keep the + // number of effective recipients in "effective". If the + // total is 0, we remove the "ORGANIZER" too. */ + // if ([attEmail isEqualToString: orgEmail]) + // { + // [self logWithFormat: + // @"avoiding setting organizer as recipient"]; + // continue; + // } + + trackStatus = [dict objectForKey: MAPIPropertyKey (PidTagRecipientTrackStatus)]; + if (trackStatus) { - [self logWithFormat: - @"no recipient flags specified: skipping recipient"]; - continue; - } - - person = [iCalPerson new]; - [person setCn: [dict objectForKey: @"fullName"]]; - attEmail = [dict objectForKey: @"email"]; - [person setEmail: attEmail]; - - if (([flags unsignedIntValue] & 0x0002)) /* recipOrganizer */ - [newEvent setOrganizer: person]; - else - { - /* Work-around: it happens that Outlook still passes the - organizer as a recipient, maybe because of a feature - documented in a pre-mesozoic PDF still buried in a - cavern... In that case we remove it, and we keep the - number of effective recipients in "effective". If the - total is 0, we remove the "ORGANIZER" too. */ - if ([attEmail isEqualToString: orgEmail]) - { - [self logWithFormat: - @"avoiding setting organizer as recipient"]; - continue; - } - - trackStatus - = [dict - objectForKey: MAPIPropertyKey (PR_RECIPIENT_TRACKSTATUS)]; - /* FIXME: we should provide a data converter between OL partstats and SOGo */ switch ([trackStatus unsignedIntValue]) { + case 0x01: /* respOrganized */ + isOrganizer = YES; + break; case 0x02: /* respTentative */ newPartStat = iCalPersonPartStatTentative; break; @@ -979,28 +949,127 @@ newPartStat = iCalPersonPartStatNeedsAction; } - [person setParticipationStatus: newPartStat]; - [person setRsvp: @"TRUE"]; - [person setRole: @"REQ-PARTICIPANT"]; - [newEvent addToAttendees: person]; - effective++; + if (isOrganizer) + { + [newEvent setOrganizer: person]; + organizerIsSet = YES; + [self logWithFormat: @"organizer set via track status"]; + } + else + { + [person setParticipationStatus: newPartStat]; + [person setRsvp: @"TRUE"]; + [person setRole: @"REQ-PARTICIPANT"]; + [newEvent addToAttendees: person]; + effective++; + } } - - [person release]; + else + [self errorWithFormat: @"skipped recipient due" + @" to missing track status"]; } - if (effective == 0) /* See work-around above */ - [newEvent setOrganizer: nil]; + [person release]; + } + + if (effective == 0) /* See work-around above */ + [newEvent setOrganizer: nil]; + else + { + ownerUser = [[self userContext] sogoUser]; + if (organizerIsSet) + { + /* We must reset the participation status to the value + obtained from PidLidResponseStatus as the value in + PidTagRecipientTrackStatus is not correct. Note (hack): + the method used here requires that the user directory + from LDAP and Samba matches perfectly. This can be solved + more appropriately by making use of the sender + properties... */ + person = [newEvent userAsAttendee: ownerUser]; + if (person) + { + value + = [properties objectForKey: MAPIPropertyKey (PidLidResponseStatus)]; + if (value) + responseStatus = [value unsignedLongValue]; + + /* FIXME: we should provide a data converter between OL partstats and + SOGo */ + switch (responseStatus) + { + case 0x02: /* respTentative */ + newPartStat = iCalPersonPartStatTentative; + break; + case 0x03: /* respAccepted */ + newPartStat = iCalPersonPartStatAccepted; + break; + case 0x04: /* respDeclined */ + newPartStat = iCalPersonPartStatDeclined; + break; + default: + newPartStat = iCalPersonPartStatNeedsAction; + } + [person setParticipationStatus: newPartStat]; + newParticipationStatus = [person partStatWithDefault]; + + // if (newPartStat // != iCalPersonPartStatUndefined + // ) + // { + // // iCalPerson *participant; + + // // participant = [newEvent userAsAttendee: ownerUser]; + // // [participant setParticipationStatus: newPartStat]; + // // [sogoObject saveComponent: newEvent]; + + // [sogoObject changeParticipationStatus: newPartStat + // withDelegate: nil]; + // // [[self context] tearDownRequest]; + // } + // // }1005 + + // // else + // // { + } + } + else + { + [self errorWithFormat: @"organizer was not set although a" + @" recipient list was specified"]; + /* We must set the organizer preliminarily here because, unlike what + the doc states, Outlook does not always pass the real organizer + in the recipients list. */ + dict = [ownerUser primaryIdentity]; + person = [iCalPerson new]; + [person setCn: [dict objectForKey: @"fullName"]]; + orgEmail = [dict objectForKey: @"email"]; + [person setEmail: orgEmail]; + + activeUser = [[self context] activeUser]; + if (![activeUser isEqual: ownerUser]) + { + dict = [activeUser primaryIdentity]; + sentBy = [NSString stringWithFormat: @"mailto:%@", + [dict objectForKey: @"email"]]; + [person setSentBy: sentBy]; + } + [newEvent setOrganizer: person]; + [person release]; + } } } - - [sogoObject saveComponent: newEvent]; } + + [sogoObject saveComponent: newEvent]; + if (newParticipationStatus) + [sogoObject changeParticipationStatus: newParticipationStatus + withDelegate: nil]; + [(MAPIStoreCalendarFolder *) container synchroniseCache]; value = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; if (value) [(MAPIStoreCalendarFolder *) container - setChangeKey: value forMessageWithKey: [self nameInContainer]]; + setChangeKey: value forMessageWithKey: [self nameInContainer]]; } - (id) lookupAttachment: (NSString *) childKey diff --git a/OpenChange/MAPIStoreContactsAttachment.m b/OpenChange/MAPIStoreContactsAttachment.m index 99cb65538..6a9afe86a 100644 --- a/OpenChange/MAPIStoreContactsAttachment.m +++ b/OpenChange/MAPIStoreContactsAttachment.m @@ -94,52 +94,52 @@ extern NSTimeZone *utcTZ; return [container lastModificationTime]; } -- (int) getPrAttachEncoding: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidTagAttachEncoding: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; { *data = [[NSData data] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrAttachFlags: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getLongZero: data inMemCtx: memCtx]; -} - -- (int) getPrAttachmentFlags: (void **) data +- (int) getPidTagAttachFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPrAttachmentHidden: (void **) data inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getNo: data inMemCtx: memCtx]; -} - -- (int) getPrAttachmentLinkid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachmentFlags: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPrAttachMethod: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachmentHidden: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getNo: data inMemCtx: memCtx]; +} + +- (int) getPidTagAttachmentLinkId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getLongZero: data inMemCtx: memCtx]; +} + +- (int) getPidTagAttachMethod: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000001); return MAPISTORE_SUCCESS; } -- (int) getPrAttachmentContactphoto: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachmentContactPhoto: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPrAttachDataBin: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachDataBinary: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!photoData) ASSIGN (photoData, @@ -150,8 +150,8 @@ extern NSTimeZone *utcTZ; return MAPISTORE_SUCCESS; } -- (int) getPrAttachSize: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachSize: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!photoData) ASSIGN (photoData, @@ -162,16 +162,16 @@ extern NSTimeZone *utcTZ; return MAPISTORE_SUCCESS; } -- (int) getPrAttachExtension: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachExtension: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self fileExtension] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrAttachLongFilename: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachLongFilename: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *filename; @@ -183,17 +183,17 @@ extern NSTimeZone *utcTZ; return MAPISTORE_SUCCESS; } -- (int) getPrAttachFilename: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachFilename: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrAttachLongFilename: data - inMemCtx: memCtx]; + return [self getPidTagAttachLongFilename: data + inMemCtx: memCtx]; } -- (int) getPrDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrAttachLongFilename: data inMemCtx: memCtx]; + return [self getPidTagAttachLongFilename: data inMemCtx: memCtx]; } @end diff --git a/OpenChange/MAPIStoreContactsFolder.m b/OpenChange/MAPIStoreContactsFolder.m index 6485a3af8..49c26df90 100644 --- a/OpenChange/MAPIStoreContactsFolder.m +++ b/OpenChange/MAPIStoreContactsFolder.m @@ -45,18 +45,9 @@ return [MAPIStoreContactsMessageTable tableForContainer: self]; } -- (EOQualifier *) componentQualifier +- (NSString *) component { - static EOQualifier *componentQualifier = nil; - - /* TODO: we need to support vlist as well */ - if (!componentQualifier) - componentQualifier - = [[EOKeyValueQualifier alloc] initWithKey: @"c_component" - operatorSelector: EOQualifierOperatorEqual - value: @"vcard"]; - - return componentQualifier; + return @"vcard"; } - (MAPIStoreMessage *) createMessage diff --git a/OpenChange/MAPIStoreContactsMessage.m b/OpenChange/MAPIStoreContactsMessage.m index 3ef9e4c66..d1bdebadc 100644 --- a/OpenChange/MAPIStoreContactsMessage.m +++ b/OpenChange/MAPIStoreContactsMessage.m @@ -85,7 +85,7 @@ CardElement *element; elements = [card childrenWithTag: tag - andAttribute: @"type" havingValue: type]; + andAttribute: @"type" havingValue: type]; if ([elements count] > 0) element = [elements objectAtIndex: 0]; else @@ -100,8 +100,8 @@ return element; } -- (int) getPrIconIndex: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ *data = MAPILongValue (memCtx, 0x00000200); @@ -109,15 +109,15 @@ return MAPISTORE_SUCCESS; } -- (int) getPrMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.Contact"); return MAPISTORE_SUCCESS; } -// - (int) getPrOabName: (void **) data +// - (int) getPidTagOfflineAddressBookName: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // *data = talloc_strdup (memCtx, "PR_OAB_NAME_UNICODE"); @@ -125,7 +125,7 @@ // return MAPISTORE_SUCCESS; // } -// - (int) getPrOabLangid: (void **) data +// - (int) getPidTagOfflineAddressBookLanguageId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // /* see http://msdn.microsoft.com/en-us/goglobal/bb895996.asxp */ @@ -136,8 +136,8 @@ // } -- (int) getPrTitle: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagTitle: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -147,8 +147,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrCompanyName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagCompanyName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { CardElement *org; @@ -159,8 +159,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrDepartmentName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDepartmentName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { CardElement *org; @@ -171,24 +171,24 @@ return MAPISTORE_SUCCESS; } -- (int) getPrSendInternetEncoding: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSendInternetEncoding: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00065001); return MAPISTORE_SUCCESS; } -- (int) getPrSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayName: data inMemCtx: memCtx]; + return [self getPidTagDisplayName: data inMemCtx: memCtx]; } - (int) getPidLidFileUnder: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayName: data inMemCtx: memCtx]; + return [self getPidTagDisplayName: data inMemCtx: memCtx]; } - (int) getPidLidFileUnderId: (void **) data @@ -231,14 +231,14 @@ return MAPISTORE_SUCCESS; } -- (int) getPrAccount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAccount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidEmail1EmailAddress: data inMemCtx: memCtx]; } -- (int) getPrContactEmailAddresses: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagContactEmailAddresses: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -251,8 +251,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrEmsAbTargetAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagEmsAbTargetAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -263,8 +263,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrSearchKey: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSearchKey: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -275,8 +275,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrMailPermission: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMailPermission: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } @@ -321,8 +321,8 @@ return [self getPidLidEmail2EmailAddress: data inMemCtx: memCtx]; } -- (int) getPrBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSString *stringValue; @@ -372,57 +372,57 @@ return MAPISTORE_SUCCESS; } -- (int) getPrOfficeTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagBusinessTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"work" excluding: @"fax" atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrHomeTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHomeTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"home" excluding: @"fax" atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrMobileTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMobileTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"cell" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrPagerTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPagerTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"pager" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrPrimaryTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPrimaryTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrBusinessFaxNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagBusinessFaxNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"fax" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrBusinessHomePage: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagBusinessHomePage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"url" ofType: @"work" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrPersonalHomePage: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPersonalHomePage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"url" ofType: @"home" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; @@ -491,50 +491,50 @@ // // getters when no address is selected as the Mailing Address // -- (int) getPrPostalAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPostalAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrPostOfficeBox: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPostOfficeBox: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrStreetAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagStreetAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 2 inData: data inMemCtx: memCtx]; } -- (int) getPrLocality: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagLocality: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 3 inData: data inMemCtx: memCtx]; } -- (int) getPrStateOrProvince: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagStateOrProvince: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 4 inData: data inMemCtx: memCtx]; } -- (int) getPrPostalCode: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPostalCode: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 5 inData: data inMemCtx: memCtx]; } -- (int) getPrCountry: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagCountry: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 6 inData: data inMemCtx: memCtx]; @@ -550,42 +550,42 @@ atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrHomeAddressPostOfficeBox: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHomeAddressPostOfficeBox: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPrHomeAddressStreet: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHomeAddressStreet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 2 inData: data inMemCtx: memCtx]; } -- (int) getPrHomeAddressCity: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHomeAddressCity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 3 inData: data inMemCtx: memCtx]; } -- (int) getPrHomeAddressStateOrProvince: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHomeAddressStateOrProvince: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 4 inData: data inMemCtx: memCtx]; } -- (int) getPrHomeAddressPostalCode: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHomeAddressPostalCode: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 5 inData: data inMemCtx: memCtx]; } -- (int) getPrHomeAddressCountry: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHomeAddressCountry: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 6 inData: data inMemCtx: memCtx]; @@ -646,8 +646,8 @@ // // // -- (int) getPrNickname: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagNickname: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -657,8 +657,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrBirthday: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagBirthday: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSString *stringValue; @@ -681,8 +681,8 @@ // // Decomposed fullname getters // -- (int) getPrSurname: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSurname: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -694,8 +694,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrGivenName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagGivenName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -707,8 +707,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrMiddleName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMiddleName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -720,8 +720,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrDisplayNamePrefix: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDisplayNamePrefix: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -733,8 +733,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrGeneration: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagGeneration: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -746,8 +746,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrSensitivity: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSensitivity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } @@ -808,7 +808,7 @@ } - (void) _updatePhotoInVCard: (NGVCard *) card - fromProperties: (NSDictionary *) attachmentProps +fromProperties: (NSDictionary *) attachmentProps { NSString *photoExt, *photoType, *content; CardElement *photo; @@ -886,10 +886,10 @@ // Decomposed fullname [newCard setNWithFamily: [properties objectForKey: MAPIPropertyKey(PR_SURNAME_UNICODE)] - given: [properties objectForKey: MAPIPropertyKey(PR_GIVEN_NAME_UNICODE)] - additional: [properties objectForKey: MAPIPropertyKey(PR_MIDDLE_NAME_UNICODE)] - prefixes: [properties objectForKey: MAPIPropertyKey(PR_DISPLAY_NAME_PREFIX_UNICODE)] - suffixes: [properties objectForKey: MAPIPropertyKey(PR_GENERATION_UNICODE)]]; + given: [properties objectForKey: MAPIPropertyKey(PR_GIVEN_NAME_UNICODE)] + additional: [properties objectForKey: MAPIPropertyKey(PR_MIDDLE_NAME_UNICODE)] + prefixes: [properties objectForKey: MAPIPropertyKey(PR_DISPLAY_NAME_PREFIX_UNICODE)] + suffixes: [properties objectForKey: MAPIPropertyKey(PR_GENERATION_UNICODE)]]; // // display name @@ -1161,7 +1161,7 @@ value = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; if (value) [(MAPIStoreContactsFolder *) container - setChangeKey: value forMessageWithKey: [self nameInContainer]]; + setChangeKey: value forMessageWithKey: [self nameInContainer]]; } @end diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 81da9d4c6..17907e93b 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -67,7 +67,7 @@ /* sogo://username:password@{contacts,calendar,tasks,journal,notes,mail}/dossier/id */ -static Class NSExceptionK, MAPIStoreFallbackContextK; +static Class NSExceptionK, MAPIStoreFallbackContextK, SOGoObjectK; static NSMutableDictionary *contextClassMapping; @@ -79,6 +79,7 @@ static NSMutableDictionary *contextClassMapping; NSString *moduleName; NSExceptionK = [NSException class]; + SOGoObjectK = [SOGoObject class]; contextClassMapping = [NSMutableDictionary new]; classes = GSObjCAllSubclassesOfClass (self); @@ -441,10 +442,11 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) = [currentFolder lookupName: [pathComponents objectAtIndex: count] inContext: woContext acquire: NO]; - if ([currentFolder isKindOfClass: NSExceptionK]) - currentFolder = nil; - else + if ([currentFolder isKindOfClass: SOGoObjectK]) /* class common to all + SOGo folder types */ [containersBag addObject: currentFolder]; + else + currentFolder = nil; } if (currentFolder) @@ -457,8 +459,10 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) *folderPtr = baseFolder; rc = MAPISTORE_SUCCESS; } - else + else if ([[userContext sogoUser] isEqual: activeUser]) rc = MAPISTORE_ERR_NOT_FOUND; + else + rc = MAPISTORE_ERR_DENIED; return rc; } diff --git a/OpenChange/MAPIStoreFAIMessage.m b/OpenChange/MAPIStoreFAIMessage.m index b8fe33988..81a9dfb9c 100644 --- a/OpenChange/MAPIStoreFAIMessage.m +++ b/OpenChange/MAPIStoreFAIMessage.m @@ -42,8 +42,8 @@ andType: MAPISTORE_FAI_TABLE]; } -- (int) getPrAssociated: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAssociated: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } diff --git a/OpenChange/MAPIStoreFSFolder.m b/OpenChange/MAPIStoreFSFolder.m index 145781383..7ac725979 100644 --- a/OpenChange/MAPIStoreFSFolder.m +++ b/OpenChange/MAPIStoreFSFolder.m @@ -163,8 +163,9 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; NSUInteger count, max; NSDate *date, *fileDate; MAPIStoreFSMessage *msg; + NSArray *messageKeys; - [self messageKeys]; + messageKeys = [self messageKeys]; date = [NSCalendarDate date]; [self logWithFormat: @"current date: %@", date]; diff --git a/OpenChange/MAPIStoreFSMessageTable.m b/OpenChange/MAPIStoreFSMessageTable.m index 5a2e9f961..7c8504c67 100644 --- a/OpenChange/MAPIStoreFSMessageTable.m +++ b/OpenChange/MAPIStoreFSMessageTable.m @@ -59,7 +59,7 @@ static Class MAPIStoreFSMessageK = Nil; NSNumber *version; uint64_t cVersion; - if ((uint32_t) res->ulPropTag == PR_CHANGE_NUM) + if ((uint32_t) res->ulPropTag == PidTagChangeNumber) { value = NSObjectFromMAPISPropValue (&res->lpProp); cVersion = exchange_globcnt ([value unsignedLongLongValue] >> 16); diff --git a/OpenChange/MAPIStoreFolder.h b/OpenChange/MAPIStoreFolder.h index b327e8d6d..41b3bdd61 100644 --- a/OpenChange/MAPIStoreFolder.h +++ b/OpenChange/MAPIStoreFolder.h @@ -46,9 +46,9 @@ @interface MAPIStoreFolder : MAPIStoreObject { MAPIStoreContext *context; - NSArray *messageKeys; - NSArray *faiMessageKeys; - NSArray *folderKeys; + // NSArray *messageKeys; + // NSArray *faiMessageKeys; + // NSArray *folderKeys; SOGoMAPIFSFolder *faiFolder; SOGoMAPIFSFolder *propsFolder; diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 8c10feb07..9565288fe 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -56,7 +56,6 @@ #include #include #include -#include #include Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStoreFolderTableK; @@ -76,9 +75,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe { if ((self = [super init])) { - messageKeys = nil; - faiMessageKeys = nil; - folderKeys = nil; + // messageKeys = nil; + // faiMessageKeys = nil; + // folderKeys = nil; faiFolder = nil; context = nil; @@ -142,11 +141,11 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe - (void) dealloc { + // [messageKeys release]; + // [faiMessageKeys release]; + // [folderKeys release]; [propsMessage release]; [propsFolder release]; - [messageKeys release]; - [faiMessageKeys release]; - [folderKeys release]; [faiFolder release]; [context release]; @@ -167,16 +166,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe uint64_t cn; props = [propsMessage properties]; - value = [props objectForKey: MAPIPropertyKey (PR_CHANGE_NUM)]; + value = [props objectForKey: MAPIPropertyKey (PidTagChangeNumber)]; if (value) cn = [value unsignedLongLongValue]; else { - [self logWithFormat: @"no value for PR_CHANGE_NUM, adding one now"]; + [self logWithFormat: @"no value for PidTagChangeNumber, adding one now"]; cn = [[self context] getNewChangeNumber]; value = [NSNumber numberWithUnsignedLongLong: cn]; props = [NSDictionary dictionaryWithObject: value - forKey: MAPIPropertyKey (PR_CHANGE_NUM)]; + forKey: MAPIPropertyKey (PidTagChangeNumber)]; [propsMessage appendProperties: props]; [propsMessage save]; } @@ -262,8 +261,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe if (messageKey) { - [self faiMessageKeys]; - if ([faiMessageKeys containsObject: messageKey]) + if ([[self faiMessageKeys] containsObject: messageKey]) { msgObject = [faiFolder lookupName: messageKey inContext: nil @@ -372,7 +370,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe } else [NSException raise: @"MAPIStoreIOException" - format: @"unable to fetch created folder"]; + format: @"unable to fetch created folder"]; } } } @@ -770,9 +768,14 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe isAddition: (BOOL) isAddition withACLFolder: (SOGoFolder *) aclFolder { - if (isAddition) - [aclFolder addUserInAcls: user]; - [aclFolder setRoles: roles forUser: user]; + if (user) + { + if (isAddition) + [aclFolder addUserInAcls: user]; + [aclFolder setRoles: roles forUser: user]; + } + else + [self logWithFormat: @"user is nil, keeping intended entry intact"]; } - (void) setupVersionsMessage @@ -951,6 +954,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe { int rc = MAPISTORE_SUCCESS; MAPIStoreTable *table; + SOGoUser *ownerUser; if (tableType == MAPISTORE_MESSAGE_TABLE) table = [self messageTable]; @@ -959,21 +963,31 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe else if (tableType == MAPISTORE_FOLDER_TABLE) table = [self folderTable]; else if (tableType == MAPISTORE_PERMISSIONS_TABLE) - table = [self permissionsTable]; + { + ownerUser = [[self userContext] sogoUser]; + if ([[context activeUser] isEqual: ownerUser]) + table = [self permissionsTable]; + else + rc = MAPISTORE_ERR_DENIED; + } else { table = nil; [NSException raise: @"MAPIStoreIOException" format: @"unsupported table type: %d", tableType]; } - if (table) + + if (rc == MAPISTORE_SUCCESS) { - [table setHandleId: handleId]; - *tablePtr = table; - *countPtr = [[table childKeys] count]; + if (table) + { + [table setHandleId: handleId]; + *tablePtr = table; + *countPtr = [[table childKeys] count]; + } + else + rc = MAPISTORE_ERR_NOT_FOUND; } - else - rc = MAPISTORE_ERR_NOT_FOUND; return rc; } @@ -1004,14 +1018,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe - (NSArray *) messageKeys { - if (!messageKeys) - { - messageKeys = [self messageKeysMatchingQualifier: nil - andSortOrderings: nil]; - [messageKeys retain]; - } + return [self messageKeysMatchingQualifier: nil + andSortOrderings: nil]; + // if (!messageKeys) + // { + // messageKeys = [self messageKeysMatchingQualifier: nil + // andSortOrderings: nil]; + // [messageKeys retain]; + // } - return messageKeys; + // return messageKeys; } - (MAPIStoreFAIMessageTable *) faiMessageTable @@ -1029,14 +1045,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe - (NSArray *) faiMessageKeys { - if (!faiMessageKeys) - { - faiMessageKeys = [self faiMessageKeysMatchingQualifier: nil - andSortOrderings: nil]; - [faiMessageKeys retain]; - } + return [self faiMessageKeysMatchingQualifier: nil + andSortOrderings: nil]; + // if (!faiMessageKeys) + // { + // faiMessageKeys = [self faiMessageKeysMatchingQualifier: nil + // andSortOrderings: nil]; + // [faiMessageKeys retain]; + // } - return faiMessageKeys; + // return faiMessageKeys; } - (MAPIStoreFolderTable *) folderTable @@ -1046,14 +1064,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe - (NSArray *) folderKeys { - if (!folderKeys) - { - folderKeys = [self folderKeysMatchingQualifier: nil - andSortOrderings: nil]; - [folderKeys retain]; - } + return [self folderKeysMatchingQualifier: nil + andSortOrderings: nil]; + // if (!folderKeys) + // { + // folderKeys = [self folderKeysMatchingQualifier: nil + // andSortOrderings: nil]; + // [folderKeys retain]; + // } - return folderKeys; + // return folderKeys; } - (NSArray *) folderKeysMatchingQualifier: (EOQualifier *) qualifier @@ -1099,24 +1119,24 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe [self _cleanupTableCaches: MAPISTORE_MESSAGE_TABLE]; [self _cleanupTableCaches: MAPISTORE_FAI_TABLE]; [self _cleanupTableCaches: MAPISTORE_FOLDER_TABLE]; - [faiMessageKeys release]; - faiMessageKeys = nil; - [messageKeys release]; - messageKeys = nil; - [folderKeys release]; - folderKeys = nil; + // [faiMessageKeys release]; + // faiMessageKeys = nil; + // [messageKeys release]; + // messageKeys = nil; + // [folderKeys release]; + // folderKeys = nil; } -- (int) getPrParentFid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagParentFolderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } -- (int) getPrFid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagFolderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [self objectId]); @@ -1133,8 +1153,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe 0x00000010 Create Contents Table 0x00000020 Create Associated Contents Table */ -- (int) getPrAccess: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAccess: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; SOGoUser *ownerUser; @@ -1168,74 +1188,74 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe 0x00000000 Read-Only 0x00000001 Modify */ -- (int) getPrAccessLevel: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAccessLevel: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x01); return MAPISTORE_SUCCESS; } -- (int) getPrAttrHidden: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttributeHidden: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPrAttrSystem: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttributeSystem: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPrAttrReadOnly: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttributeReadOnly: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPrSubfolders: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSubfolders: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - *data = MAPIBoolValue (memCtx, [folderKeys count] > 0); + *data = MAPIBoolValue (memCtx, [[self folderKeys] count] > 0); return MAPISTORE_SUCCESS; } -- (int) getPrFolderChildCount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagFolderChildCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self folderKeys] count]); return MAPISTORE_SUCCESS; } -- (int) getPrContentCount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagContentCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self messageKeys] count]); return MAPISTORE_SUCCESS; } -- (int) getPrContentUnread: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagContentUnreadCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } -- (int) getPrAssocContentCount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAssociatedContentCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self faiMessageKeys] count]); return MAPISTORE_SUCCESS; } -- (int) getPrDeletedCountTotal: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDeletedCountTotal: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* TODO */ *data = MAPILongValue (memCtx, 0); @@ -1243,12 +1263,19 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return MAPISTORE_SUCCESS; } -- (int) getPrLocalCommitTimeMax: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagLocalCommitTimeMax: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - *data = [[self lastMessageModificationTime] asFileTimeInMemCtx: memCtx]; + int rc = MAPISTORE_SUCCESS; + NSDate *date; - return MAPISTORE_SUCCESS; + date = [self lastMessageModificationTime]; + if (date) + *data = [date asFileTimeInMemCtx: memCtx]; + else + rc = MAPISTORE_ERR_NOT_FOUND; + + return rc; } - (int) getProperty: (void **) data @@ -1390,20 +1417,25 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe NSString *username; struct ldb_context *samCtx; - bin32.cb = bin->cb; - bin32.lpb = bin->lpb; - - entryId = get_AddressBookEntryId (NULL, &bin32); - if (entryId) + if (bin && bin->cb) { - samCtx = [[self context] connectionInfo]->sam_ctx; - username = MAPIStoreSamDBUserAttribute (samCtx, @"legacyExchangeDN", - [NSString stringWithUTF8String: entryId->X500DN], - @"sAMAccountName"); + bin32.cb = bin->cb; + bin32.lpb = bin->lpb; + + entryId = get_AddressBookEntryId (NULL, &bin32); + if (entryId) + { + samCtx = [[self context] connectionInfo]->sam_ctx; + username = MAPIStoreSamDBUserAttribute (samCtx, @"legacyExchangeDN", + [NSString stringWithUTF8String: entryId->X500DN], + @"sAMAccountName"); + } + else + username = nil; + talloc_free (entryId); } else username = nil; - talloc_free (entryId); return username; } @@ -1415,12 +1447,19 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe NSUInteger count, max; MAPIStorePermissionEntry *entry; - max = [entries count]; - for (count = 0; !username && count < max; count++) + if (memberId == 0) + username = [[self aclFolder] defaultUserID]; + else if (memberId == ULLONG_MAX) + username = @"anonymous"; + else { - entry = [entries objectAtIndex: count]; - if ([entry memberId] == memberId) - username = [entry userId]; + max = [entries count]; + for (count = 0; !username && count < max; count++) + { + entry = [entries objectAtIndex: count]; + if ([entry memberId] == memberId) + username = [entry userId]; + } } return username; @@ -1450,7 +1489,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe NSString *permissionUser; NSArray *entries; NSArray *permissionRoles; - BOOL reset, isAdd; + BOOL reset, isAdd = NO, isDelete = NO, isModify = NO; SOGoFolder *aclFolder; aclFolder = [self aclFolder]; @@ -1468,7 +1507,13 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe permissionUser = nil; permissionRoles = nil; - isAdd = (currentPermission->PermissionDataFlags == ROW_ADD); + if (currentPermission->PermissionDataFlags == ROW_ADD) + isAdd = YES; + else if (currentPermission->PermissionDataFlags == ROW_MODIFY) + isModify = YES; + else + isDelete = YES; + for (propCount = 0; propCount < currentPermission->lpProps.cValues; propCount++) @@ -1477,16 +1522,19 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe switch (mapiValue->ulPropTag) { case PR_ENTRYID: - permissionUser - = [self _usernameFromEntryId: &mapiValue->value.bin]; + if (isAdd) + permissionUser + = [self _usernameFromEntryId: &mapiValue->value.bin]; break; case PR_MEMBER_ID: - permissionUser = [self _usernameFromMemberId: mapiValue->value.d - inEntries: entries]; + if (isModify || isDelete) + permissionUser = [self _usernameFromMemberId: mapiValue->value.d + inEntries: entries]; break; case PR_MEMBER_RIGHTS: - permissionRoles = [self - rolesForExchangeRights: mapiValue->value.l]; + if (isAdd || isModify) + permissionRoles + = [self rolesForExchangeRights: mapiValue->value.l]; break; default: if (mapiValue->ulPropTag != PR_MEMBER_NAME) diff --git a/OpenChange/MAPIStoreFolderTable.m b/OpenChange/MAPIStoreFolderTable.m index 1deb68998..c0beed517 100644 --- a/OpenChange/MAPIStoreFolderTable.m +++ b/OpenChange/MAPIStoreFolderTable.m @@ -95,7 +95,7 @@ /* HACK: we cheat here as we current have no mechanism for searching folders based on PR_CHANGE_NUM, which is used by the oxcfxics mechanism... */ - case PR_CHANGE_NUM: + case PidTagChangeNumber: rc = MAPIRestrictionStateAlwaysTrue; break; default: diff --git a/OpenChange/MAPIStoreGCSFolder.h b/OpenChange/MAPIStoreGCSFolder.h index 91ec334fd..d87c9c63c 100644 --- a/OpenChange/MAPIStoreGCSFolder.h +++ b/OpenChange/MAPIStoreGCSFolder.h @@ -36,6 +36,7 @@ { SOGoMAPIFSMessage *versionsMessage; NSArray *activeUserRoles; + EOQualifier *componentQualifier; } /* synchronisation */ @@ -50,9 +51,12 @@ - (NSArray *) activeUserRoles; +- (EOQualifier *) componentQualifier; +- (EOQualifier *) contentComponentQualifier; + /* subclasses */ - (EOQualifier *) aclQualifier; -- (EOQualifier *) componentQualifier; +- (NSString *) component; @end diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index ce4f4c2b1..b27e0a24f 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -48,8 +48,15 @@ #include #include +static Class NSNumberK; + @implementation MAPIStoreGCSFolder ++ (void) initialize +{ + NSNumberK = [NSNumber class]; +} + - (id) initWithSOGoObject: (id) newSOGoObject inContainer: (MAPIStoreObject *) newContainer { @@ -72,6 +79,7 @@ { [versionsMessage release]; [activeUserRoles release]; + [componentQualifier release]; [super dealloc]; } @@ -127,7 +135,7 @@ [sogoObject renameTo: newDisplayName]; } -- (int) getPrDisplayName: (void **) data +- (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *displayName; @@ -207,17 +215,17 @@ - (NSDate *) lastMessageModificationTime { + NSDate *value; NSNumber *ti; - NSDate *value = nil; + + [self synchroniseCache]; ti = [[versionsMessage properties] - objectForKey: @"SyncLastSynchronisationDate"]; + objectForKey: @"SyncLastModificationDate"]; if (ti) value = [NSDate dateWithTimeIntervalSince1970: [ti doubleValue]]; else - value = [NSDate date]; - - [self logWithFormat: @"lastMessageModificationTime: %@", value]; + value = nil; return value; } @@ -283,12 +291,41 @@ [changeList setObject: globCnt forKey: guid]; } +- (EOQualifier *) componentQualifier +{ + if (!componentQualifier) + componentQualifier + = [[EOKeyValueQualifier alloc] initWithKey: @"c_component" + operatorSelector: EOQualifierOperatorEqual + value: [self component]]; + + return componentQualifier; +} + +- (EOQualifier *) contentComponentQualifier +{ + EOQualifier *contentComponentQualifier; + NSString *likeString; + + likeString = [NSString stringWithFormat: @"%%BEGIN:%@%%", + [[self component] uppercaseString]]; + contentComponentQualifier = [[EOKeyValueQualifier alloc] + initWithKey: @"c_content" + operatorSelector: EOQualifierOperatorLike + value: likeString]; + [contentComponentQualifier autorelease]; + + return contentComponentQualifier; +} + - (BOOL) synchroniseCache { BOOL rc = YES, foundChange = NO; uint64_t newChangeNum; NSData *changeKey; - NSNumber *ti, *changeNumber, *lastModificationDate, *cName, *cVersion, *cLastModified; + NSString *cName; + NSNumber *ti, *changeNumber, *lastModificationDate, *cVersion, + *cLastModified, *cDeleted; EOFetchSpecification *fs; EOQualifier *searchQualifier, *fetchQualifier; NSUInteger count, max; @@ -303,7 +340,7 @@ if (!fields) fields = [[NSArray alloc] initWithObjects: @"c_name", @"c_version", @"c_lastmodified", - nil]; + @"c_deleted", nil]; if (!sortOrdering) { @@ -312,26 +349,7 @@ [sortOrdering retain]; } - now = [NSCalendarDate date]; - - currentProperties = [[versionsMessage properties] mutableCopy]; - if (!currentProperties) - currentProperties = [NSMutableDictionary new]; - [currentProperties autorelease]; - messages = [currentProperties objectForKey: @"Messages"]; - if (!messages) - { - messages = [NSMutableDictionary new]; - [currentProperties setObject: messages forKey: @"Messages"]; - [messages release]; - } - mapping = [currentProperties objectForKey: @"VersionMapping"]; - if (!mapping) - { - mapping = [NSMutableDictionary new]; - [currentProperties setObject: mapping forKey: @"VersionMapping"]; - [mapping release]; - } + currentProperties = [versionsMessage properties]; lastModificationDate = [currentProperties objectForKey: @"SyncLastModificationDate"]; if (lastModificationDate) @@ -341,8 +359,9 @@ operatorSelector: EOQualifierOperatorGreaterThanOrEqualTo value: lastModificationDate]; fetchQualifier = [[EOAndQualifier alloc] - initWithQualifiers: - searchQualifier, [self componentQualifier], nil]; + initWithQualifiers: searchQualifier, + [self contentComponentQualifier], + nil]; [fetchQualifier autorelease]; [searchQualifier release]; } @@ -354,17 +373,38 @@ fetchSpecificationWithEntityName: [ocsFolder folderName] qualifier: fetchQualifier sortOrderings: [NSArray arrayWithObject: sortOrdering]]; - fetchResults = [ocsFolder fetchFields: fields fetchSpecification: fs]; + fetchResults = [ocsFolder fetchFields: fields + fetchSpecification: fs + ignoreDeleted: NO]; max = [fetchResults count]; if (max > 0) { + messages = [currentProperties objectForKey: @"Messages"]; + if (!messages) + { + messages = [NSMutableDictionary new]; + [currentProperties setObject: messages forKey: @"Messages"]; + [messages release]; + } + mapping = [currentProperties objectForKey: @"VersionMapping"]; + if (!mapping) + { + mapping = [NSMutableDictionary new]; + [currentProperties setObject: mapping forKey: @"VersionMapping"]; + [mapping release]; + } + ldb_transaction_start([[self context] connectionInfo]->oc_ctx); for (count = 0; count < max; count++) { result = [fetchResults objectAtIndex: count]; cName = [result objectForKey: @"c_name"]; - cVersion = [result objectForKey: @"c_version"]; + cDeleted = [result objectForKey: @"c_deleted"]; + if ([cDeleted isKindOfClass: NSNumberK] && [cDeleted intValue]) + cVersion = [NSNumber numberWithInt: -1]; + else + cVersion = [result objectForKey: @"c_version"]; cLastModified = [result objectForKey: @"c_lastmodified"]; messageEntry = [messages objectForKey: cName]; @@ -374,9 +414,12 @@ [messages setObject: messageEntry forKey: cName]; [messageEntry release]; } + if (![[messageEntry objectForKey: @"c_version"] isEqual: cVersion]) { + [sogoObject removeChildRecordWithName: cName]; + foundChange = YES; newChangeNum = [[self context] getNewChangeNumber]; @@ -402,6 +445,7 @@ if (foundChange) { + now = [NSCalendarDate date]; ti = [NSNumber numberWithDouble: [now timeIntervalSince1970]]; [currentProperties setObject: ti forKey: @"SyncLastSynchronisationDate"]; @@ -526,9 +570,9 @@ NSArray *deletedKeys, *deletedCNames, *records; NSNumber *changeNumNbr, *lastModified; NSString *cName; - NSDictionary *versionProperties; - NSMutableDictionary *messages, *mapping; - uint64_t newChangeNum = 0; + NSDictionary *versionProperties, *messageEntry; + NSMutableDictionary *messages; + uint64_t maxChangeNum = changeNum, currentChangeNum; EOAndQualifier *fetchQualifier; EOKeyValueQualifier *cDeletedQualifier, *cLastModifiedQualifier; EOFetchSpecification *fs; @@ -573,28 +617,28 @@ ignoreDeleted: NO]; deletedCNames = [records objectsForKey: @"c_name" notFoundMarker: nil]; max = [deletedCNames count]; - if (max > 0) + for (count = 0; count < max; count++) { - mapping = [versionProperties objectForKey: @"VersionsMapping"]; - for (count = 0; count < max; count++) + cName = [deletedCNames objectAtIndex: count]; + [sogoObject removeChildRecordWithName: cName]; + messageEntry = [messages objectForKey: cName]; + if (messageEntry) { - cName = [deletedCNames objectAtIndex: count]; - if ([messages objectForKey: cName]) + currentChangeNum + = [[messageEntry objectForKey: @"version"] + unsignedLongLongValue]; + if (MAPICNCompare (changeNum, currentChangeNum) + == NSOrderedAscending) { - [messages removeObjectForKey: cName]; [(NSMutableArray *) deletedKeys addObject: cName]; - newChangeNum = [[self context] getNewChangeNumber]; + if (MAPICNCompare (maxChangeNum, currentChangeNum) + == NSOrderedAscending) + maxChangeNum = currentChangeNum; } } - if (newChangeNum) - { - changeNumNbr - = [NSNumber numberWithUnsignedLongLong: newChangeNum]; - [mapping setObject: lastModified forKey: changeNumNbr]; - *cnNbr = changeNumNbr; - [versionsMessage save]; - } } + if (maxChangeNum != changeNum) + *cnNbr = [NSNumber numberWithUnsignedLongLong: maxChangeNum]; } } else @@ -639,7 +683,7 @@ return nil; } -- (EOQualifier *) componentQualifier +- (NSString *) component { [self subclassResponsibility: _cmd]; diff --git a/OpenChange/MAPIStoreGCSMessage.m b/OpenChange/MAPIStoreGCSMessage.m index bb636f02d..4d7ea0c07 100644 --- a/OpenChange/MAPIStoreGCSMessage.m +++ b/OpenChange/MAPIStoreGCSMessage.m @@ -51,8 +51,8 @@ return [sogoObject lastModified]; } -- (int) getPrAccess: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAccess: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreContext *context; WOContext *woContext; @@ -88,8 +88,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrAccessLevel: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAccessLevel: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreContext *context; MAPIStoreUserContext *userContext; @@ -117,8 +117,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrChangeKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSData *changeKey; @@ -145,18 +145,26 @@ return rc; } -- (int) getPrPredecessorChangeList: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPredecessorChangeList: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSData *changeList; + MAPIStoreGCSFolder *parentFolder; if (isNew) rc = MAPISTORE_ERR_NOT_FOUND; else { - changeList = [(MAPIStoreGCSFolder *)[self container] - predecessorChangeListForMessageWithKey: [self nameInContainer]]; + parentFolder = (MAPIStoreGCSFolder *)[self container]; + changeList = [parentFolder + predecessorChangeListForMessageWithKey: [self nameInContainer]]; + if (!changeList) + { + [parentFolder synchroniseCache]; + changeList = [parentFolder + predecessorChangeListForMessageWithKey: [self nameInContainer]]; + } if (!changeList) abort (); *data = [changeList asBinaryInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreGCSMessageTable.m b/OpenChange/MAPIStoreGCSMessageTable.m index 45589fcc9..ef1d907eb 100644 --- a/OpenChange/MAPIStoreGCSMessageTable.m +++ b/OpenChange/MAPIStoreGCSMessageTable.m @@ -86,7 +86,7 @@ MAPIRestrictionState rc; TALLOC_CTX *memCtx = NULL; - if (res->ulPropTag == PR_CHANGE_NUM) + if (res->ulPropTag == PidTagChangeNumber) { value = NSObjectFromMAPISPropValue (&res->lpProp); lastModified = [(MAPIStoreGCSFolder *) diff --git a/OpenChange/MAPIStoreMailAttachment.m b/OpenChange/MAPIStoreMailAttachment.m index 2a7babc00..7b9641548 100644 --- a/OpenChange/MAPIStoreMailAttachment.m +++ b/OpenChange/MAPIStoreMailAttachment.m @@ -68,24 +68,24 @@ ASSIGN (bodyInfo, newBodyInfo); } -- (int) getPrAttachMethod: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachMethod: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000001); // afByValue return MAPISTORE_SUCCESS; } -- (int) getPrAttachTag: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachTag: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self mimeAttachTag] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrAttachSize: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachSize: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -95,8 +95,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrRecordKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagRecordKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { static char recordBytes[] = {0xd9, 0xd8, 0x11, 0xa3, 0xe2, 0x90, 0x18, 0x41, 0x9e, 0x04, 0x58, 0x46, 0x9d, 0x6d, 0x1b, @@ -125,16 +125,16 @@ return fileName; } -- (int) getPrAttachLongFilename: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachLongFilename: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self _fileName] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrAttachFilename: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachFilename: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *fileName, *baseName, *ext; @@ -153,7 +153,7 @@ return MAPISTORE_SUCCESS; } -- (int) getPrDisplayName: (void **) data +- (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[bodyInfo objectForKey: @"description"] @@ -162,8 +162,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrAttachContentId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachContentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[bodyInfo objectForKey: @"bodyId"] asUnicodeInMemCtx: memCtx]; @@ -171,21 +171,21 @@ return MAPISTORE_SUCCESS; } -- (int) getPrAttachMimeTag: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachMimeTag: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *mimeTag; mimeTag = [NSString stringWithFormat: @"%@/%@", - [bodyInfo objectForKey: @"type"], - [bodyInfo objectForKey: @"subtype"]]; + [bodyInfo objectForKey: @"type"], + [bodyInfo objectForKey: @"subtype"]]; *data = [[mimeTag lowercaseString] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrAttachDataBin: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAttachDataBinary: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject fetchBLOBWithPeek: YES] asBinaryInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 3aefb8931..23c55ec97 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -201,8 +201,8 @@ static Class SOGoMailFolderK, MAPIStoreOutboxFolderK; return (rc == MAPISTORE_SUCCESS) ? [super deleteFolder] : rc; } -- (int) getPrContentUnread: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagContentUnreadCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { EOQualifier *searchQualifier; uint32_t longValue; @@ -217,7 +217,7 @@ static Class SOGoMailFolderK, MAPIStoreOutboxFolderK; return MAPISTORE_SUCCESS; } -- (int) getPrContainerClass: (void **) data +- (int) getPidTagContainerClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPF.Note" asUnicodeInMemCtx: memCtx]; @@ -225,7 +225,7 @@ static Class SOGoMailFolderK, MAPIStoreOutboxFolderK; return MAPISTORE_SUCCESS; } -- (int) getPrMessageClass: (void **) data +- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; @@ -902,7 +902,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) { NGImap4Connection *connection; NGImap4Client *client; - NSString *sourceFolderName, *targetFolderName, *messageURL, *v; + NSString *sourceFolderName, *targetFolderName, *messageURL, *messageKey, *v; NSMutableArray *uids, *oldMessageURLs; NSNumber *uid; NSArray *destUIDs; @@ -910,6 +910,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) NSDictionary *result; NSUInteger count; NSArray *a; + NSData *changeKey; if (![sourceFolder isKindOfClass: [MAPIStoreMailFolder class]]) return [super moveCopyMessagesWithMIDs: srcMids andCount: midCount @@ -989,6 +990,17 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) [mapping registerURL: messageURL withID: targetMids[count]]; } + /* Update the change keys */ + [self synchroniseCache]; + for (count = 0; count < midCount; count++) + { + changeKey = [NSData dataWithBinary: targetChangeKeys[count]]; + messageKey = [NSString stringWithFormat: @"%@.eml", + [destUIDs objectAtIndex: count]]; + [self setChangeKey: changeKey + forMessageWithKey: messageKey]; + } + [self postNotificationsForMoveCopyMessagesWithMIDs: srcMids andMessageURLs: oldMessageURLs andCount: midCount @@ -1085,7 +1097,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) @implementation MAPIStoreOutboxFolder -- (int) getPrDisplayName: (void **) data +- (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"Outbox" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreMailMessage.h b/OpenChange/MAPIStoreMailMessage.h index 675f7e970..378d8e490 100644 --- a/OpenChange/MAPIStoreMailMessage.h +++ b/OpenChange/MAPIStoreMailMessage.h @@ -48,26 +48,26 @@ - (NSString *) subject; -- (int) getPrIconIndex: (void **) data +- (int) getPidTagIconIndex: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrFlagStatus: (void **) data +- (int) getPidTagFlagStatus: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrMessageFlags: (void **) data +- (int) getPidTagMessageFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrFollowupIcon: (void **) data +- (int) getPidTagFollowupIcon: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrImportance: (void **) data +- (int) getPidTagImportance: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrReceivedByEmailAddress: (void **) data +- (int) getPidTagReceivedByEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrSenderEmailAddress: (void **) data +- (int) getPidTagSenderEmailAddress: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrDisplayTo: (void **) data +- (int) getPidTagDisplayTo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrDisplayCc: (void **) data +- (int) getPidTagDisplayCc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPrDisplayBcc: (void **) data +- (int) getPidTagDisplayBcc: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; @end diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index 00130d20c..aa0469774 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -58,7 +58,6 @@ #include #include #include -#include @class iCalCalendar, iCalEvent; @@ -294,8 +293,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return appointmentWrapper; } -- (int) getPrChangeKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSData *changeKey; @@ -330,8 +329,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -- (int) getPrPredecessorChangeList: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPredecessorChangeList: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSData *changeList; @@ -341,14 +340,14 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) else { changeList = [(MAPIStoreMailFolder *)[self container] - predecessorChangeListForMessageWithKey: [self nameInContainer]]; + predecessorChangeListForMessageWithKey: [self nameInContainer]]; if (!changeList) { [self warnWithFormat: @"attempting to get predecessor change list" @" by synchronising folder..."]; [(MAPIStoreMailFolder *) container synchroniseCache]; changeList = [(MAPIStoreMailFolder *)[self container] - predecessorChangeListForMessageWithKey: [self nameInContainer]]; + predecessorChangeListForMessageWithKey: [self nameInContainer]]; if (changeList) [self logWithFormat: @"got one"]; else @@ -373,14 +372,14 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) if (uid) { changeNumber = [(MAPIStoreMailFolder *) container - changeNumberForMessageUID: uid]; + changeNumberForMessageUID: uid]; if (!changeNumber) { [self warnWithFormat: @"attempting to get change number" @" by synchronising folder..."]; [(MAPIStoreMailFolder *) container synchroniseCache]; changeNumber = [(MAPIStoreMailFolder *) container - changeNumberForMessageUID: uid]; + changeNumberForMessageUID: uid]; if (changeNumber) [self logWithFormat: @"got one"]; else @@ -397,8 +396,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return version; } -- (int) getPrIconIndex: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagIconIndex: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -406,7 +405,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) [self _fetchHeaderData]; if (mailIsEvent) - [[self _appointmentWrapper] getPrIconIndex: data inMemCtx: memCtx]; + [[self _appointmentWrapper] getPidTagIconIndex: data inMemCtx: memCtx]; else { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ @@ -448,8 +447,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -461,8 +460,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrSubjectPrefix: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSubjectPrefix: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *subject; NSUInteger colIdx; @@ -472,7 +471,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) colIdx = [subject rangeOfString: @":"].location; if (colIdx != NSNotFound && colIdx < 4) stringValue = [NSString stringWithFormat: @"%@: ", - [subject substringToIndex: colIdx]]; + [subject substringToIndex: colIdx]]; else stringValue = @""; *data = [stringValue asUnicodeInMemCtx: memCtx]; @@ -480,8 +479,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrNormalizedSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *subject; NSUInteger colIdx; @@ -507,15 +506,15 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return [self getYes: data inMemCtx: memCtx]; } -- (int) getPrMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; if (mailIsEvent) - [[self _appointmentWrapper] getPrMessageClass: data - inMemCtx: memCtx]; + [[self _appointmentWrapper] getPidTagMessageClass: data + inMemCtx: memCtx]; else *data = talloc_strdup (memCtx, "IPM.Note"); @@ -523,7 +522,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) } /* Note: this applies to regular mails... */ -// - (int) getPrReplyRequested: (void **) data // TODO +// - (int) getPidTagReplyRequested: (void **) data // TODO // inMemCtx: (TALLOC_CTX *) memCtx // { // if (!headerSetup) @@ -535,8 +534,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) // } /* ... while this applies to invitations. */ -- (int) getPrResponseRequested: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagResponseRequested: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -546,32 +545,32 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPrLatestDeliveryTime: (void **) data // DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagLatestDeliveryTime: (void **) data // DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrCreationTime: data inMemCtx: memCtx]; + return [self getPidTagCreationTime: data inMemCtx: memCtx]; } -- (int) getPrOriginalSubmitTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOriginalSubmitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrCreationTime: data inMemCtx: memCtx]; + return [self getPidTagCreationTime: data inMemCtx: memCtx]; } -- (int) getPrClientSubmitTime: (void **) data +- (int) getPidTagClientSubmitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagCreationTime: data inMemCtx: memCtx]; +} + +- (int) getPidTagMessageDeliveryTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagCreationTime: data inMemCtx: memCtx]; +} + +- (int) getPidTagMessageFlags: (void **) data // TODO inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrCreationTime: data inMemCtx: memCtx]; -} - -- (int) getPrMessageDeliveryTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrCreationTime: data inMemCtx: memCtx]; -} - -- (int) getPrMessageFlags: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -594,8 +593,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrFlagStatus: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagFlagStatus: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -614,8 +613,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrFollowupIcon: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagFollowupIcon: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -634,38 +633,38 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrSensitivity: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSensitivity: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPrOriginalSensitivity: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOriginalSensitivity: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSensitivity: data inMemCtx: memCtx]; + return [self getPidTagSensitivity: data inMemCtx: memCtx]; } -- (int) getPrSentRepresentingAddrtype: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSentRepresentingAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPrRcvdRepresentingAddrtype: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagReceivedRepresentingAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPrReceivedByAddrtype: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagReceivedByAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPrSenderAddrtype: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSenderAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } @@ -762,111 +761,111 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -- (int) getPrSenderEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSenderEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddressFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } -- (int) getPrSenderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSenderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getCNFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } -- (int) getPrSenderEntryid: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryIdFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } -- (int) getPrOriginalAuthorName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrSenderEmailAddress: data inMemCtx: memCtx]; -} - -- (int) getPrSentRepresentingEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrSenderEmailAddress: data inMemCtx: memCtx]; -} - -- (int) getPrSentRepresentingName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrSenderName: data inMemCtx: memCtx]; -} - -- (int) getPrSentRepresentingEntryid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrSenderEntryid: data inMemCtx: memCtx]; -} - -- (int) getPrReceivedByEmailAddress: (void **) data +- (int) getPidTagOriginalAuthorName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; +} + +- (int) getPidTagSentRepresentingEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; +} + +- (int) getPidTagSentRepresentingName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagSenderName: data inMemCtx: memCtx]; +} + +- (int) getPidTagSentRepresentingEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; +} + +- (int) getPidTagReceivedByEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddressFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } -- (int) getPrReceivedByName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagReceivedByName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getCNFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } -- (int) getPrReceivedByEntryid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagReceivedByEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryIdFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } -- (int) getPrRcvdRepresentingName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrReceivedByName: data inMemCtx: memCtx]; -} - -- (int) getPrRcvdRepresentingEmailAddress: (void **) data +- (int) getPidTagReceivedRepresentingName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrReceivedByEmailAddress: data inMemCtx: memCtx]; + return [self getPidTagReceivedByName: data inMemCtx: memCtx]; } -- (int) getPrRcvdRepresentingEntryid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagReceivedRepresentingEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrReceivedByEntryid: data inMemCtx: memCtx]; + return [self getPidTagReceivedByEmailAddress: data inMemCtx: memCtx]; } -- (int) getPrDisplayTo: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagReceivedRepresentingEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagReceivedByEntryId: data inMemCtx: memCtx]; +} + +- (int) getPidTagDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject to] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrOriginalDisplayTo: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOriginalDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayTo: data inMemCtx: memCtx]; + return [self getPidTagDisplayTo: data inMemCtx: memCtx]; } -- (int) getPrDisplayCc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -879,22 +878,22 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrOriginalDisplayCc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOriginalDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayCc: data inMemCtx: memCtx]; + return [self getPidTagDisplayCc: data inMemCtx: memCtx]; } -- (int) getPrDisplayBcc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPrOriginalDisplayBcc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOriginalDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrDisplayBcc: data inMemCtx: memCtx]; + return [self getPidTagDisplayBcc: data inMemCtx: memCtx]; } - (int) getPidNameContentType: (void **) data @@ -905,8 +904,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; NSString *s; @@ -924,24 +923,24 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPrInternetCpid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagInternetCodepage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* ref: - http://msdn.microsoft.com/en-us/library/dd317756%28v=vs.85%29.aspx + http://msdn.microsoft.com/en-us/library/dd317756%28v=vs.85%29.aspx - minimal list that should be handled: - us-ascii: 20127 - iso-8859-1: 28591 - iso-8859-15: 28605 - utf-8: 65001 */ + minimal list that should be handled: + us-ascii: 20127 + iso-8859-1: 28591 + iso-8859-15: 28605 + utf-8: 65001 */ *data = MAPILongValue(memCtx, 65001); return MAPISTORE_SUCCESS; } -- (int) getPrBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; int rc = MAPISTORE_SUCCESS; @@ -955,8 +954,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) *data = [stringValue asUnicodeInMemCtx: memCtx]; } else if (mailIsEvent) - rc = [[self _appointmentWrapper] getPrBody: data - inMemCtx: memCtx]; + rc = [[self _appointmentWrapper] getPidTagBody: data + inMemCtx: memCtx]; else { *data = NULL; @@ -966,8 +965,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -- (int) getPrHtml: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHtml: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; @@ -985,36 +984,36 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -- (int) getPrRtfCompressed: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagRtfCompressed: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = NULL; return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPrRtfInSync: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagRtfInSync: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPrInternetMessageId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagInternetMessageId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject messageId] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrReadReceiptRequested: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagReadReceiptRequested: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPrDeleteAfterSubmit: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDeleteAfterSubmit: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } @@ -1065,7 +1064,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPrProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; @@ -1104,8 +1103,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : [self getNo: data inMemCtx: memCtx]); } -- (int) getPrMsgEditorFormat: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageEditorFormat: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t format; @@ -1149,14 +1148,14 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) } /* event getters */ -- (int) getPrStartDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagStartDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent - ? [[self _appointmentWrapper] getPrStartDate: data inMemCtx: memCtx] + ? [[self _appointmentWrapper] getPidTagStartDate: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } @@ -1200,14 +1199,14 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPrEndDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagEndDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent - ? [[self _appointmentWrapper] getPrEndDate: data inMemCtx: memCtx] + ? [[self _appointmentWrapper] getPidTagEndDate: data inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } @@ -1319,15 +1318,15 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPrOwnerApptId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOwnerAppointmentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; return (mailIsEvent - ? [[self _appointmentWrapper] getPrOwnerApptId: data - inMemCtx: memCtx] + ? [[self _appointmentWrapper] getPidTagOwnerAppointmentId: data + inMemCtx: memCtx] : MAPISTORE_ERR_NOT_FOUND); } diff --git a/OpenChange/MAPIStoreMailMessageTable.m b/OpenChange/MAPIStoreMailMessageTable.m index 72133a210..62dc406fd 100644 --- a/OpenChange/MAPIStoreMailMessageTable.m +++ b/OpenChange/MAPIStoreMailMessageTable.m @@ -149,11 +149,11 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK; rc = MAPIRestrictionStateAlwaysFalse; break; - case PR_CONVERSATION_KEY: + case PidTagConversationKey: rc = MAPIRestrictionStateAlwaysFalse; break; - case PR_CHANGE_NUM: + case PidTagChangeNumber: { modseq = [(MAPIStoreMailFolder *) container modseqFromMessageChangeNumber: value]; @@ -205,7 +205,7 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK; else rc = MAPIRestrictionStateAlwaysFalse; break; - case PR_CONVERSATION_KEY: + case PidTagConversationKey: rc = MAPIRestrictionStateAlwaysFalse; break; default: diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index a8e06b92c..2d5a937e5 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -774,50 +774,55 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NSData *messageData; NSMutableArray *recipientEmails; NSArray *list; - NSString *recId; + NSString *recId, *from, *msgClass; NSUInteger count; - struct mapistore_connection_info *connInfo; SOGoUser *activeUser; - NSString *from; // SOGoMailFolder *sentFolder; SOGoDomainDefaults *dd; NSException *error; MAPIStoreMapping *mapping; - /* send mail */ - - messageData = [self _generateMailDataWithBcc: NO]; - mailProperties = [sogoObject properties]; - recipientEmails = [NSMutableArray arrayWithCapacity: 32]; - recipients = [mailProperties objectForKey: @"recipients"]; - for (count = 0; count < 3; count++) + msgClass = [mailProperties objectForKey: MAPIPropertyKey (PidTagMessageClass)]; + if ([msgClass isEqualToString: @"IPM.Note"]) /* we skip invitation replies */ { - recId = recTypes[count]; - list = [recipients objectForKey: recId]; - [recipientEmails - addObjectsFromArray: [list objectsForKey: @"email" - notFoundMarker: nil]]; - } + /* send mail */ - connInfo = [[self context] connectionInfo]; - activeUser = [SOGoUser userWithLogin: [NSString stringWithUTF8String: connInfo->username]]; + messageData = [self _generateMailDataWithBcc: NO]; + + mailProperties = [sogoObject properties]; + recipientEmails = [NSMutableArray arrayWithCapacity: 32]; + recipients = [mailProperties objectForKey: @"recipients"]; + for (count = 0; count < 3; count++) + { + recId = recTypes[count]; + list = [recipients objectForKey: recId]; + [recipientEmails + addObjectsFromArray: [list objectsForKey: @"email" + notFoundMarker: nil]]; + } - [self logWithFormat: @"recipients: %@", recipientEmails]; - dd = [activeUser domainDefaults]; - from = [[activeUser allEmails] objectAtIndex: 0]; - error = [[SOGoMailer mailerWithDomainDefaults: dd] + activeUser = [[self context] activeUser]; + + [self logWithFormat: @"recipients: %@", recipientEmails]; + dd = [activeUser domainDefaults]; + from = [[activeUser allEmails] objectAtIndex: 0]; + error = [[SOGoMailer mailerWithDomainDefaults: dd] sendMailData: messageData toRecipients: recipientEmails sender: from]; - if (error) - [self logWithFormat: @"an error occurred: '%@'", error]; + if (error) + [self logWithFormat: @"an error occurred: '%@'", error]; - mapping = [self mapping]; - [mapping unregisterURLWithID: [self objectId]]; - [self setIsNew: NO]; - [properties removeAllObjects]; - [[self container] cleanupCaches]; + mapping = [self mapping]; + [mapping unregisterURLWithID: [self objectId]]; + [self setIsNew: NO]; + [properties removeAllObjects]; + [[self container] cleanupCaches]; + } + else + [self logWithFormat: @"skipping submit of message with class '%@'", + msgClass]; return MAPISTORE_SUCCESS; } diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index 7e7a61b2e..2bc1dedaa 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -53,7 +53,6 @@ #include #include #include -#include static NSString *resourcesDir = nil; @@ -164,16 +163,16 @@ rtf2html (NSData *compressedRTF) // __FUNCTION__, __LINE__]; msgData = talloc_zero (memCtx, struct mapistore_message); - - if ([self getPrSubjectPrefix: &propValue - inMemCtx: msgData] == MAPISTORE_SUCCESS + + if ([self getPidTagSubjectPrefix: &propValue + inMemCtx: msgData] == MAPISTORE_SUCCESS && propValue) msgData->subject_prefix = propValue; else msgData->subject_prefix = ""; - if ([self getPrNormalizedSubject: &propValue - inMemCtx: msgData] == MAPISTORE_SUCCESS + if ([self getPidTagNormalizedSubject: &propValue + inMemCtx: msgData] == MAPISTORE_SUCCESS && propValue) msgData->normalized_subject = propValue; else @@ -421,8 +420,8 @@ rtf2html (NSData *compressedRTF) - (NSArray *) activeContainerMessageTables { return [[MAPIStoreActiveTables activeTables] - activeTablesForFMID: [container objectId] - andType: MAPISTORE_MESSAGE_TABLE]; + activeTablesForFMID: [container objectId] + andType: MAPISTORE_MESSAGE_TABLE]; } - (enum mapistore_error) saveMessage @@ -517,8 +516,8 @@ rtf2html (NSData *compressedRTF) } /* getters */ -- (int) getPrInstId: (void **) data // TODO: DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagInstID: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { /* we return a unique id based on the key */ *data = MAPILongLongValue (memCtx, [[sogoObject nameInContainer] hash]); @@ -526,22 +525,22 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPrInstanceNum: (void **) data // TODO: DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagInstanceNum: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPrRowType: (void **) data // TODO: DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagRowType: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, TBL_LEAF_ROW); return MAPISTORE_SUCCESS; } -- (int) getPrDepth: (void **) data // TODO: DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDepth: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, 0); @@ -558,8 +557,8 @@ rtf2html (NSData *compressedRTF) 0x00000010 Create Contents Table 0x00000020 Create Associated Contents Table */ -- (int) getPrAccess: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAccess: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; BOOL userIsOwner; @@ -587,8 +586,8 @@ rtf2html (NSData *compressedRTF) 0x00000000 Read-Only 0x00000001 Modify */ -- (int) getPrAccessLevel: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAccessLevel: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; BOOL userIsOwner; @@ -645,40 +644,40 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPrFid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagFolderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } -- (int) getPrMid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [self objectId]); return MAPISTORE_SUCCESS; } -- (int) getPrMessageLocaleId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageLocaleId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x0409); return MAPISTORE_SUCCESS; } -- (int) getPrMessageFlags: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageFlags: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, MSGFLAG_FROMME | MSGFLAG_READ | MSGFLAG_UNMODIFIED); return MAPISTORE_SUCCESS; } -- (int) getPrMessageSize: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageSize: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* TODO: choose another name in SOGo for that method */ *data = MAPILongValue (memCtx, [[sogoObject davContentLength] intValue]); @@ -686,99 +685,99 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPrMsgStatus: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPrImportance: (void **) data // TODO -> subclass? - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagImportance: (void **) data // TODO -> subclass? + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 1); return MAPISTORE_SUCCESS; } -- (int) getPrPriority: (void **) data // TODO -> subclass? - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagPriority: (void **) data // TODO -> subclass? + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPrSensitivity: (void **) data // TODO -> subclass in calendar +- (int) getPidTagSensitivity: (void **) data // TODO -> subclass in calendar + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getLongZero: data inMemCtx: memCtx]; +} + +- (int) getPidTagSubject: (void **) data inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getLongZero: data inMemCtx: memCtx]; -} - -- (int) getPrSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx { [self subclassResponsibility: _cmd]; return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPrNormalizedSubject: (void **) data +- (int) getPidTagNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagSubject: data inMemCtx: memCtx]; +} + +- (int) getPidTagOriginalSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagNormalizedSubject: data inMemCtx: memCtx]; +} + +- (int) getPidTagConversationTopic: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagNormalizedSubject: data inMemCtx: memCtx]; +} + +- (int) getPidTagSubjectPrefix: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrSubject: data inMemCtx: memCtx]; + return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPrOriginalSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrNormalizedSubject: data inMemCtx: memCtx]; -} - -- (int) getPrConversationTopic: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPrNormalizedSubject: data inMemCtx: memCtx]; -} - -- (int) getPrSubjectPrefix: (void **) data +- (int) getPidTagDisplayTo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPrDisplayTo: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPrDisplayCc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPrDisplayBcc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getEmptyString: data inMemCtx: memCtx]; -} - -// - (int) getPrOriginalDisplayTo: (void **) data +// - (int) getPidTagOriginalDisplayTo: (void **) data // { -// return [self getPrDisplayTo: data]; +// return [self getPidTagDisplayTo: data]; // } -// - (int) getPrOriginalDisplayCc: (void **) data +// - (int) getPidTagOriginalDisplayCc: (void **) data // { -// return [self getPrDisplayCc: data]; +// return [self getPidTagDisplayCc: data]; // } -// - (int) getPrOriginalDisplayBcc: (void **) data +// - (int) getPidTagOriginalDisplayBcc: (void **) data // { -// return [self getPrDisplayBcc: data]; +// return [self getPidTagDisplayBcc: data]; // } -- (int) getPrLastModifierName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagLastModifierName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSURL *contextUrl; @@ -788,22 +787,22 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPrMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { [self subclassResponsibility: _cmd]; return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPrOrigMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagOriginalMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrMessageClass: data inMemCtx: memCtx]; + return [self getPidTagMessageClass: data inMemCtx: memCtx]; } -- (int) getPrHasattach: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHasAttachments: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [[self attachmentKeys] count] > 0); @@ -811,8 +810,8 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPrAssociated: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagAssociated: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx];; } diff --git a/OpenChange/MAPIStoreNotesMessage.m b/OpenChange/MAPIStoreNotesMessage.m index 3933c167e..d59d9a2f8 100644 --- a/OpenChange/MAPIStoreNotesMessage.m +++ b/OpenChange/MAPIStoreNotesMessage.m @@ -32,8 +32,8 @@ @implementation MAPIStoreNotesMessage -- (int) getPrIconIndex: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ // *longValue = 0x00000300 for blue @@ -46,23 +46,23 @@ return MAPISTORE_SUCCESS; } -- (int) getPrMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.StickyNote" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { id value; int rc; value = [[sogoObject properties] - objectForKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)]; + objectForKey: MAPIPropertyKey (PidTagNormalizedSubject)]; if (value) - rc = [value getValue: data forTag: PR_NORMALIZED_SUBJECT_UNICODE + rc = [value getValue: data forTag: PidTagNormalizedSubject inMemCtx: memCtx]; else rc = MAPISTORE_ERR_NOT_FOUND; diff --git a/OpenChange/MAPIStoreObject.h b/OpenChange/MAPIStoreObject.h index 31e21fee9..773e806ac 100644 --- a/OpenChange/MAPIStoreObject.h +++ b/OpenChange/MAPIStoreObject.h @@ -107,22 +107,22 @@ inMemCtx: (TALLOC_CTX *) memCtx; /* implemented getters */ -- (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 +- (int) getPidTagDisplayName: (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; +- (int) getPidTagSearchKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidTagGenerateExchangeViews: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidTagParentSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidTagSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidTagCreationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidTagLastModificationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; /* subclasses */ - (uint64_t) objectVersion; diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index c9d71d1ef..c0649c7a3 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -294,7 +294,7 @@ static Class NSExceptionK, MAPIStoreFolderK; } /* getters */ -- (int) getPrDisplayName: (void **) data +- (int) getPidTagDisplayName: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject displayName] asUnicodeInMemCtx: memCtx]; @@ -302,7 +302,7 @@ static Class NSExceptionK, MAPIStoreFolderK; return MAPISTORE_SUCCESS; } -- (int) getPrSearchKey: (void **) data +- (int) getPidTagSearchKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -314,20 +314,20 @@ static Class NSExceptionK, MAPIStoreFolderK; return MAPISTORE_SUCCESS; } -- (int) getPrGenerateExchangeViews: (void **) data +- (int) getPidTagGenerateExchangeViews: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPrParentSourceKey: (void **) data +- (int) getPidTagParentSourceKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getReplicaKey: data fromGlobCnt: [container objectId] >> 16 inMemCtx: memCtx]; } -- (int) getPrSourceKey: (void **) data +- (int) getPidTagSourceKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getReplicaKey: data fromGlobCnt: [self objectId] >> 16 @@ -341,7 +341,7 @@ static Class NSExceptionK, MAPIStoreFolderK; return ULLONG_MAX; } -- (int) getPrChangeKey: (void **) data +- (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; @@ -357,7 +357,7 @@ static Class NSExceptionK, MAPIStoreFolderK; return rc; } -- (int) getPrChangeNum: (void **) data +- (int) getPidTagChangeNumber: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { int rc; @@ -376,7 +376,7 @@ static Class NSExceptionK, MAPIStoreFolderK; return rc; } -- (int) getPrCreationTime: (void **) data +- (int) getPidTagCreationTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self creationTime] asFileTimeInMemCtx: memCtx]; @@ -384,7 +384,7 @@ static Class NSExceptionK, MAPIStoreFolderK; return MAPISTORE_SUCCESS; } -- (int) getPrLastModificationTime: (void **) data +- (int) getPidTagLastModificationTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self lastModificationTime] asFileTimeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStorePermissionsTable.m b/OpenChange/MAPIStorePermissionsTable.m index 6247d8694..cde8edc82 100644 --- a/OpenChange/MAPIStorePermissionsTable.m +++ b/OpenChange/MAPIStorePermissionsTable.m @@ -84,16 +84,16 @@ return memberId; } -- (int) getPrMemberId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMemberId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, memberId); return MAPISTORE_SUCCESS; } -- (int) getPrEntryid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSData *entryId; struct mapistore_connection_info *connInfo; @@ -110,8 +110,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrMemberName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMemberName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *displayName; @@ -127,8 +127,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrMemberRights: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMemberRights: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t rights; NSArray *roles; diff --git a/OpenChange/MAPIStoreTasksFolder.m b/OpenChange/MAPIStoreTasksFolder.m index 323bdf6e8..888daf2a8 100644 --- a/OpenChange/MAPIStoreTasksFolder.m +++ b/OpenChange/MAPIStoreTasksFolder.m @@ -48,17 +48,9 @@ return [MAPIStoreTasksMessageTable tableForContainer: self]; } -- (EOQualifier *) componentQualifier +- (NSString *) component { - static EOQualifier *componentQualifier = nil; - - if (!componentQualifier) - componentQualifier - = [[EOKeyValueQualifier alloc] initWithKey: @"c_component" - operatorSelector: EOQualifierOperatorEqual - value: @"vtodo"]; - - return componentQualifier; + return @"vtodo"; } - (MAPIStoreMessage *) createMessage diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index 81c2a9ba9..28d690b74 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -66,8 +66,8 @@ @implementation MAPIStoreTasksMessage -- (int) getPrIconIndex: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ // Unassigned recurring task 0x00000501 @@ -81,16 +81,16 @@ return MAPISTORE_SUCCESS; } -- (int) getPrMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup(memCtx, "IPM.Task"); return MAPISTORE_SUCCESS; } -- (int) getPrSubject: (void **) data // SUMMARY - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSubject: (void **) data // SUMMARY + inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; @@ -100,8 +100,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPrImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; iCalToDo *task; @@ -201,8 +201,8 @@ return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPrHasattach: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagHasAttachments: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } @@ -242,22 +242,22 @@ } -- (int) getPrMessageDeliveryTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageDeliveryTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrLastModificationTime: data inMemCtx: memCtx]; + return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } - (int) getClientSubmitTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrLastModificationTime: data inMemCtx: memCtx]; + return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } - (int) getLocalCommitTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - return [self getPrLastModificationTime: data inMemCtx: memCtx]; + return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } - (int) getPidLidTaskStatus: (void **) data // status @@ -466,7 +466,7 @@ value = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; if (value) [(MAPIStoreTasksFolder *) container - setChangeKey: value forMessageWithKey: [self nameInContainer]]; + setChangeKey: value forMessageWithKey: [self nameInContainer]]; } @end diff --git a/OpenChange/MAPIStoreTypes.h b/OpenChange/MAPIStoreTypes.h index 53fb50272..c630b1e15 100644 --- a/OpenChange/MAPIStoreTypes.h +++ b/OpenChange/MAPIStoreTypes.h @@ -42,6 +42,8 @@ id NSObjectFromSPropValue (const struct SPropValue *); id NSObjectFromMAPISPropValue (const struct mapi_SPropValue *); id NSObjectFromValuePointer (enum MAPITAGS, const void *); +NSComparisonResult MAPICNCompare (uint64_t cn1, uint64_t cn2); + static inline NSNumber * MAPIPropertyKey (enum MAPITAGS propTag) { diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m index 980431d1b..24dbac860 100644 --- a/OpenChange/MAPIStoreTypes.m +++ b/OpenChange/MAPIStoreTypes.m @@ -96,6 +96,7 @@ NSObjectFromMAPISPropValue (const struct mapi_SPropValue *value) result = [NSNumber numberWithUnsignedShort: value->value.i]; break; case PT_LONG: + case PT_ERROR: result = [NSNumber numberWithUnsignedLong: value->value.l]; break; case PT_I8: @@ -175,6 +176,7 @@ NSObjectFromSPropValue (const struct SPropValue *value) result = [NSNumber numberWithShort: value->value.i]; break; case PT_LONG: + case PT_ERROR: result = [NSNumber numberWithLong: value->value.l]; break; case PT_I8: @@ -268,6 +270,34 @@ NSObjectFromValuePointer (enum MAPITAGS propTag, const void *data) return result; } +static uint64_t +_reverseCN (uint64_t cn) +{ + return ((cn & UINT64_C (0x00000000000000ff)) << 56 + | (cn & UINT64_C (0x000000000000ff00)) << 40 + | (cn & UINT64_C (0x0000000000ff0000)) << 24 + | (cn & UINT64_C (0x00000000ff000000)) << 8 + | (cn & UINT64_C (0x000000ff00000000)) >> 8 + | (cn & UINT64_C (0x0000ff0000000000)) >> 24 + | (cn & UINT64_C (0x00ff000000000000)) >> 40 + | (cn & UINT64_C (0xff00000000000000)) >> 56); +} + +NSComparisonResult +MAPICNCompare (uint64_t cn1, uint64_t cn2) +{ + NSComparisonResult result; + + if (cn1 == cn2) + result = NSOrderedSame; + else if (_reverseCN (cn1) < _reverseCN (cn2)) + result = NSOrderedAscending; + else + result = NSOrderedDescending; + + return result; +} + void MAPIStoreDumpMessageProperties (NSDictionary *properties) { diff --git a/OpenChange/MAPIStoreUserContext.m b/OpenChange/MAPIStoreUserContext.m index 222f1d560..53f20d37c 100644 --- a/OpenChange/MAPIStoreUserContext.m +++ b/OpenChange/MAPIStoreUserContext.m @@ -188,7 +188,7 @@ static NSMapTable *contextsTable = nil; [rootFolders setObject: currentFolder forKey: @"mail"]; [[currentFolder imap4Connection] - enableExtension: @"QRESYNC"]; + enableExtensions: [NSArray arrayWithObject: @"QRESYNC"]]; } return rootFolders; diff --git a/OpenChange/MAPIStoreVolatileMessage.m b/OpenChange/MAPIStoreVolatileMessage.m index 8bfc3b578..b248ef12a 100644 --- a/OpenChange/MAPIStoreVolatileMessage.m +++ b/OpenChange/MAPIStoreVolatileMessage.m @@ -121,21 +121,21 @@ Class NSNumberK; return rc; } -- (int) getPrSubject: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagSubject: (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 inMemCtx: memCtx]; } -- (int) getPrMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPrChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSData *changeKey; int rc; @@ -148,7 +148,7 @@ Class NSNumberK; rc = MAPISTORE_SUCCESS; } else - rc = [super getPrChangeKey: data inMemCtx: memCtx]; + rc = [super getPidTagChangeKey: data inMemCtx: memCtx]; return rc; } diff --git a/OpenChange/NSArray+MAPIStore.h b/OpenChange/NSArray+MAPIStore.h index 06e43f184..6bcf5f01d 100644 --- a/OpenChange/NSArray+MAPIStore.h +++ b/OpenChange/NSArray+MAPIStore.h @@ -29,7 +29,7 @@ /* mapi structs */ + (id) arrayFromMAPIMVLong: (const struct mapi_MV_LONG_STRUCT *) mvLong; -+ (id) arrayFromMAPIMVUnicode: (const struct mapi_SPLSTRArrayW *) mvUnicode; ++ (id) arrayFromMAPIMVUnicode: (const struct mapi_SLPSTRArrayW *) mvUnicode; + (id) arrayFromMAPIMVString: (const struct mapi_SLPSTRArray *) mvString; + (id) arrayFromMAPIMVBinary: (const struct mapi_SBinaryArray *) mvBinary; + (id) arrayFromMAPIMVGuid: (const struct mapi_SGuidArray *) mvGuid; @@ -39,8 +39,8 @@ - (struct LongArray_r *) asMVLongInMemCtx: (void *) memCtx; + (id) arrayFromMVI8: (const struct I8Array_r *) mvI8; + (id) arrayFromMVString: (const struct StringArray_r *) mvString; -+ (id) arrayFromMVUnicode: (const struct WStringArray_r *) mvUnicode; -- (struct WStringArray_r *) asMVUnicodeInMemCtx: (void *) memCtx; ++ (id) arrayFromMVUnicode: (const struct StringArrayW_r *) mvUnicode; +- (struct StringArrayW_r *) asMVUnicodeInMemCtx: (void *) memCtx; + (id) arrayFromMVBinary: (const struct BinaryArray_r *) mvBinary; - (struct BinaryArray_r *) asMVBinaryInMemCtx: (void *) memCtx; + (id) arrayFromMVGuid: (const struct FlatUIDArray_r *) mvGuid; diff --git a/OpenChange/NSArray+MAPIStore.m b/OpenChange/NSArray+MAPIStore.m index 6587154f9..1192ce124 100644 --- a/OpenChange/NSArray+MAPIStore.m +++ b/OpenChange/NSArray+MAPIStore.m @@ -52,7 +52,7 @@ return mvResult; } -+ (id) arrayFromMAPIMVUnicode: (struct mapi_SPLSTRArrayW *) mvUnicode ++ (id) arrayFromMAPIMVUnicode: (struct mapi_SLPSTRArrayW *) mvUnicode { NSUInteger count; NSString *subObject; @@ -185,7 +185,7 @@ return mvResult; } -+ (id) arrayFromMVUnicode: (const struct WStringArray_r *) mvUnicode ++ (id) arrayFromMVUnicode: (const struct StringArrayW_r *) mvUnicode { NSUInteger count; NSString *subObject; @@ -201,14 +201,14 @@ return mvResult; } -- (struct WStringArray_r *) asMVUnicodeInMemCtx: (void *) memCtx +- (struct StringArrayW_r *) asMVUnicodeInMemCtx: (void *) memCtx { - struct WStringArray_r *list; + struct StringArrayW_r *list; NSInteger count, max; max = [self count]; - list = talloc_zero (memCtx, struct WStringArray_r); + list = talloc_zero (memCtx, struct StringArrayW_r); list->cValues = max; list->lppszW = talloc_array (list, const char *, max); diff --git a/OpenChange/gen-property-selectors.py b/OpenChange/gen-property-selectors.py index abf2fb283..0a496db39 100755 --- a/OpenChange/gen-property-selectors.py +++ b/OpenChange/gen-property-selectors.py @@ -106,15 +106,32 @@ extern const enum MAPITAGS MAPIStoreSupportedProperties[]; # hack: some properties have multiple and incompatible types. Sometimes those # props are not related at all... -bannedProps = { "PrBodyHtml": True, "PrFavAutosubfolders": True, - "PrAttachDataObj": True, "PrAclTable": True, - "PrAclData": True, "PrRulesTable": True, "PrRulesData": True, - "PrDisableWinsock": True, "PrHierarchyServer": True, - "PrOfflineAddrbookEntryid": True, - "PrShorttermEntryidFromObject": True, - "PrNormalMessageSizeExtended": True, - "PrAssocMessageSizeExtended": True, - "PrMessageSizeExtended": True } +bannedProps = [ "PidTagBodyHtml", "PidTagFavAutosubfolders", + "PidTagAttachDataObj", "PidTagAclTable", "PidTagAclData", + "PidTagRulesTable", "PidTagRulesData", "PidTagDisableWinsock", + "PidTagHierarchyServer", "PidTagOfflineAddrbookEntryid", + "PidTagShorttermEntryidFromObject", + "PidTagNormalMessageSizeExtended", + "PidTagAssocMessageSizeExtended", "PidTagMessageSizeExtended", + "PidTagOabContainerGuid", + "PidTagOfflineAddressBookMessageClass", "PidTagScriptData", + "PidTagOfflineAddressBookTruncatedProperties", + "PidTagOfflineAddressBookContainerGuid", + "PidTagOfflineAddressBookDistinguishedName", + "PidTagOfflineAddressBookShaHash", + "PidTagSenderTelephoneNumber", "PidTagGatewayNeedsToRefresh", + "PidTagWlinkType", "PidTagWlinkFlags", + "PidTagWlinkGroupClsid", "PidTagWlinkGroupName", + "PidTagWlinkGroupHeaderID", + "PidTagScheduleInfoDelegatorWantsCopy", "PidTagWlinkOrdinal", + "PidTagWlinkSection", "PidTagWlinkCalendarColor", + "PidTagWlinkAddressBookEID", "PidTagWlinkFolderType", + "PidTagScheduleInfoDelegateNames", + "PidTagScheduleInfoDelegateEntryIds", + "PidTagBusiness2TelephoneNumbers", + "PidTagHome2TelephoneNumbers", + "PidTagAttachDataObject", "PidTagShorttermEntryIdFromObject", + ] def ParseExchangeH(names, lines): state = 0 @@ -135,23 +152,15 @@ def ParseExchangeH(names, lines): ParseExchangeHDefinition(names, stripped) x = x + 1 -def GenExchangeHName(startname): - parts = startname.split("_") - newParts = [] - for part in parts: - newParts.append("%s%s" % (part[0].upper(), part[1:].lower())) - - return "".join(newParts) - def ParseExchangeHDefinition(names, line): stripped = line.strip() eqIdx = stripped.find("=") if eqIdx == -1: raise Exception, "line does not contain a '='" - propName = GenExchangeHName(stripped[0:eqIdx]) - if not propName.endswith("Error") and not propName.endswith("Unicode") \ - and not propName.startswith("PrProfile") \ - and not bannedProps.has_key(propName): + + propName = stripped[0:eqIdx] + if not propName.endswith("_Error") and not propName.endswith("_string8") \ + and propName not in bannedProps: intIdx = stripped.find("(int", eqIdx) valueIdx = stripped.find("0x", intIdx + 1) endIdx = stripped.find(")", valueIdx) @@ -172,9 +181,9 @@ def ParseMapistoreNameIDHDefinition(names, line): raise Exception, "line does not contain a 'Pid'" valueIdx = stripped.find("0x") propName = stripped[pidIdx:valueIdx].strip() - value = int(stripped[valueIdx:], 16) - - names[propName] = value + if not propName.startswith("PidLidUnknown") and propName not in bannedProps: + value = int(stripped[valueIdx:], 16) + names[propName] = value def FindHFile(filename): found = None diff --git a/OpenChange/unrtf-0.21.2.diff b/OpenChange/unrtf-0.21.2.diff index 2cf49e698..466c2d16a 100644 --- a/OpenChange/unrtf-0.21.2.diff +++ b/OpenChange/unrtf-0.21.2.diff @@ -1,6 +1,6 @@ diff -durpN unrtf-0.21.2.old/outputs/html.conf unrtf-0.21.2/outputs/html.conf --- unrtf-0.21.2.old/outputs/html.conf 2010-08-15 08:44:09.000000000 -0400 -+++ unrtf-0.21.2/outputs/html.conf 2011-11-09 15:53:21.802783775 -0500 ++++ unrtf-0.21.2/outputs/html.conf 2012-03-13 16:38:53.295941363 -0400 @@ -5,7 +5,7 @@ comment_end --> @@ -10,9 +10,18 @@ diff -durpN unrtf-0.21.2.old/outputs/html.conf unrtf-0.21.2/outputs/html.conf #Second test of comments +@@ -67,7 +67,7 @@ align_right_end + + + forced_space +-   ++   + line_break +
+ diff -durpN unrtf-0.21.2.old/src/attr.c unrtf-0.21.2/src/attr.c --- unrtf-0.21.2.old/src/attr.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/attr.c 2011-12-01 10:14:45.282855488 -0500 ++++ unrtf-0.21.2/src/attr.c 2012-03-13 16:38:41.323940752 -0400 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -1265,7 +1274,7 @@ diff -durpN unrtf-0.21.2.old/src/attr.c unrtf-0.21.2/src/attr.c - diff -durpN unrtf-0.21.2.old/src/attr.h unrtf-0.21.2/src/attr.h --- unrtf-0.21.2.old/src/attr.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/attr.h 2011-11-09 15:53:21.806783776 -0500 ++++ unrtf-0.21.2/src/attr.h 2012-03-13 16:38:41.323940752 -0400 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -1415,7 +1424,7 @@ diff -durpN unrtf-0.21.2.old/src/attr.h unrtf-0.21.2/src/attr.h +#endif /* ATTR_H */ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c --- unrtf-0.21.2.old/src/convert.c 2011-06-07 08:00:23.000000000 -0400 -+++ unrtf-0.21.2/src/convert.c 2011-12-01 10:32:16.958862025 -0500 ++++ unrtf-0.21.2/src/convert.c 2012-03-13 16:38:41.327940973 -0400 @@ -1,24 +1,24 @@ /*=========================================================================== @@ -7111,7 +7120,7 @@ diff -durpN unrtf-0.21.2.old/src/convert.c unrtf-0.21.2/src/convert.c } diff -durpN unrtf-0.21.2.old/src/convert.h unrtf-0.21.2/src/convert.h --- unrtf-0.21.2.old/src/convert.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/convert.h 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/convert.h 2012-03-13 16:38:41.327940973 -0400 @@ -36,18 +36,135 @@ #ifndef _CONVERT @@ -7255,7 +7264,7 @@ diff -durpN unrtf-0.21.2.old/src/convert.h unrtf-0.21.2/src/convert.h diff -durpN unrtf-0.21.2.old/src/defs.h unrtf-0.21.2/src/defs.h --- unrtf-0.21.2.old/src/defs.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/defs.h 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/defs.h 2012-03-13 16:38:41.327940973 -0400 @@ -64,9 +64,6 @@ #define SKIP_ONE_WORD 2 #endif @@ -7275,7 +7284,7 @@ diff -durpN unrtf-0.21.2.old/src/defs.h unrtf-0.21.2/src/defs.h +#define DEFAULT_OUTPUT "html" diff -durpN unrtf-0.21.2.old/src/error.c unrtf-0.21.2/src/error.c --- unrtf-0.21.2.old/src/error.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/error.c 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/error.c 2012-03-13 16:38:41.327940973 -0400 @@ -51,27 +51,11 @@ #include #endif @@ -7320,7 +7329,7 @@ diff -durpN unrtf-0.21.2.old/src/error.c unrtf-0.21.2/src/error.c #endif diff -durpN unrtf-0.21.2.old/src/error.h unrtf-0.21.2/src/error.h --- unrtf-0.21.2.old/src/error.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/error.h 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/error.h 2012-03-13 16:38:41.327940973 -0400 @@ -37,9 +37,10 @@ #define CHECK_MALLOC_SUCCESS(XX) { if ((XX)==NULL) { fprintf (stderr, "internal error: cannot allocate memory in %s at %d\n", __FILE__, __LINE__); exit (1); }} @@ -7335,7 +7344,7 @@ diff -durpN unrtf-0.21.2.old/src/error.h unrtf-0.21.2/src/error.h diff -durpN unrtf-0.21.2.old/src/hash.c unrtf-0.21.2/src/hash.c --- unrtf-0.21.2.old/src/hash.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/hash.c 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/hash.c 2012-03-13 16:38:41.327940973 -0400 @@ -53,24 +53,16 @@ #include #endif @@ -7540,7 +7549,7 @@ diff -durpN unrtf-0.21.2.old/src/hash.c unrtf-0.21.2/src/hash.c +} diff -durpN unrtf-0.21.2.old/src/hash.h unrtf-0.21.2/src/hash.h --- unrtf-0.21.2.old/src/hash.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/hash.h 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/hash.h 2012-03-13 16:38:41.327940973 -0400 @@ -32,11 +32,15 @@ * 16 Dec 07, daved@physiol.usyd.edu.au: updated to GPL v3 *--------------------------------------------------------------------*/ @@ -7564,7 +7573,7 @@ diff -durpN unrtf-0.21.2.old/src/hash.h unrtf-0.21.2/src/hash.h +#endif /* HASH_H */ diff -durpN unrtf-0.21.2.old/src/main.c unrtf-0.21.2/src/main.c --- unrtf-0.21.2.old/src/main.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/main.c 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/main.c 2012-03-13 16:38:41.327940973 -0400 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -7986,7 +7995,7 @@ diff -durpN unrtf-0.21.2.old/src/main.c unrtf-0.21.2/src/main.c - diff -durpN unrtf-0.21.2.old/src/main.h unrtf-0.21.2/src/main.h --- unrtf-0.21.2.old/src/main.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/main.h 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/main.h 2012-03-13 16:38:41.327940973 -0400 @@ -35,21 +35,8 @@ * 17 Jan 10, daved@physiol.usyd.edu.au: change CONFIG_DIR to drop outputs/ *--------------------------------------------------------------------*/ @@ -8012,7 +8021,7 @@ diff -durpN unrtf-0.21.2.old/src/main.h unrtf-0.21.2/src/main.h +#define USAGE "unrtf [--version] [--verbose] [--help] [--nopict|-n] [--noremap] [--html] [--text] [--vt] [--latex] [--rtf] [-P config_search_path] [-t )] " diff -durpN unrtf-0.21.2.old/src/Makefile.am unrtf-0.21.2/src/Makefile.am --- unrtf-0.21.2.old/src/Makefile.am 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/Makefile.am 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/Makefile.am 2012-03-13 16:38:41.327940973 -0400 @@ -13,7 +13,6 @@ unrtf_SOURCES = attr.c attr.h \ malloc.c malloc.h \ output.c output.h \ @@ -8023,7 +8032,7 @@ diff -durpN unrtf-0.21.2.old/src/Makefile.am unrtf-0.21.2/src/Makefile.am util.c util.h \ diff -durpN unrtf-0.21.2.old/src/malloc.c unrtf-0.21.2/src/malloc.c --- unrtf-0.21.2.old/src/malloc.c 2010-07-09 01:13:05.000000000 -0400 -+++ unrtf-0.21.2/src/malloc.c 2011-12-01 10:36:18.514864760 -0500 ++++ unrtf-0.21.2/src/malloc.c 2012-03-13 16:38:41.327940973 -0400 @@ -135,19 +135,19 @@ total_malloced (void) { *=======================================================================*/ @@ -8063,7 +8072,7 @@ diff -durpN unrtf-0.21.2.old/src/malloc.c unrtf-0.21.2/src/malloc.c } diff -durpN unrtf-0.21.2.old/src/malloc.h unrtf-0.21.2/src/malloc.h --- unrtf-0.21.2.old/src/malloc.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/malloc.h 2011-11-09 15:53:21.810783765 -0500 ++++ unrtf-0.21.2/src/malloc.h 2012-03-13 16:38:41.327940973 -0400 @@ -32,9 +32,10 @@ * 09 Nov 08, arkadiusz.firus@gmail.com: added my_realloc *--------------------------------------------------------------------*/ @@ -8079,7 +8088,7 @@ diff -durpN unrtf-0.21.2.old/src/malloc.h unrtf-0.21.2/src/malloc.h +extern char * my_strdup (struct ConversionContext *, char*); diff -durpN unrtf-0.21.2.old/src/my_iconv.c unrtf-0.21.2/src/my_iconv.c --- unrtf-0.21.2.old/src/my_iconv.c 2010-08-16 00:12:43.000000000 -0400 -+++ unrtf-0.21.2/src/my_iconv.c 2011-11-09 15:53:21.814783744 -0500 ++++ unrtf-0.21.2/src/my_iconv.c 2012-03-13 16:38:41.327940973 -0400 @@ -12,154 +12,133 @@ #include #include @@ -8321,7 +8330,7 @@ diff -durpN unrtf-0.21.2.old/src/my_iconv.c unrtf-0.21.2/src/my_iconv.c diff -durpN unrtf-0.21.2.old/src/my_iconv.h unrtf-0.21.2/src/my_iconv.h --- unrtf-0.21.2.old/src/my_iconv.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/my_iconv.h 2011-11-09 15:53:21.814783744 -0500 ++++ unrtf-0.21.2/src/my_iconv.h 2012-03-13 16:38:41.327940973 -0400 @@ -5,6 +5,9 @@ * Purpose: my_conv definitions *--------------------------------------------------------------------*/ @@ -8351,7 +8360,7 @@ diff -durpN unrtf-0.21.2.old/src/my_iconv.h unrtf-0.21.2/src/my_iconv.h +#endif /* _MY_ICONV */ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c --- unrtf-0.21.2.old/src/output.c 2011-06-07 08:04:38.000000000 -0400 -+++ unrtf-0.21.2/src/output.c 2011-12-01 10:30:41.598861702 -0500 ++++ unrtf-0.21.2/src/output.c 2012-03-13 16:38:41.327940973 -0400 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -9535,7 +9544,7 @@ diff -durpN unrtf-0.21.2.old/src/output.c unrtf-0.21.2/src/output.c - diff -durpN unrtf-0.21.2.old/src/output.h unrtf-0.21.2/src/output.h --- unrtf-0.21.2.old/src/output.h 2010-08-11 21:09:02.000000000 -0400 -+++ unrtf-0.21.2/src/output.h 2011-11-09 15:53:21.814783744 -0500 ++++ unrtf-0.21.2/src/output.h 2012-03-13 16:38:41.327940973 -0400 @@ -44,227 +44,228 @@ typedef Collection Aliases; @@ -9923,7 +9932,7 @@ diff -durpN unrtf-0.21.2.old/src/output.h unrtf-0.21.2/src/output.h - diff -durpN unrtf-0.21.2.old/src/parse.c unrtf-0.21.2/src/parse.c --- unrtf-0.21.2.old/src/parse.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/parse.c 2011-12-01 10:27:41.486860883 -0500 ++++ unrtf-0.21.2/src/parse.c 2012-03-13 16:38:41.327940973 -0400 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -10597,7 +10606,7 @@ diff -durpN unrtf-0.21.2.old/src/parse.c unrtf-0.21.2/src/parse.c } diff -durpN unrtf-0.21.2.old/src/parse.h unrtf-0.21.2/src/parse.h --- unrtf-0.21.2.old/src/parse.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/parse.h 2011-11-09 15:53:21.814783744 -0500 ++++ unrtf-0.21.2/src/parse.h 2012-03-13 16:38:41.327940973 -0400 @@ -38,8 +38,6 @@ #include "word.h" #endif @@ -10690,7 +10699,7 @@ diff -durpN unrtf-0.21.2.old/src/path.h unrtf-0.21.2/src/path.h -void show_dirs(); diff -durpN unrtf-0.21.2.old/src/unrtf.h unrtf-0.21.2/src/unrtf.h --- unrtf-0.21.2.old/src/unrtf.h 1969-12-31 19:00:00.000000000 -0500 -+++ unrtf-0.21.2/src/unrtf.h 2011-11-09 15:53:21.814783744 -0500 ++++ unrtf-0.21.2/src/unrtf.h 2012-03-13 16:38:41.327940973 -0400 @@ -0,0 +1,55 @@ +/*=========================================================================== + GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -10749,7 +10758,7 @@ diff -durpN unrtf-0.21.2.old/src/unrtf.h unrtf-0.21.2/src/unrtf.h +#endif /* UNRTF_H */ diff -durpN unrtf-0.21.2.old/src/user.c unrtf-0.21.2/src/user.c --- unrtf-0.21.2.old/src/user.c 2011-06-07 08:08:17.000000000 -0400 -+++ unrtf-0.21.2/src/user.c 2011-12-01 09:59:46.215667415 -0500 ++++ unrtf-0.21.2/src/user.c 2012-03-13 16:38:41.327940973 -0400 @@ -7,7 +7,7 @@ *---------------------------------------------------------------------- * Changes: @@ -11179,7 +11188,7 @@ diff -durpN unrtf-0.21.2.old/src/user.c unrtf-0.21.2/src/user.c diff -durpN unrtf-0.21.2.old/src/user.h unrtf-0.21.2/src/user.h --- unrtf-0.21.2.old/src/user.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/user.h 2011-11-09 15:53:21.814783744 -0500 ++++ unrtf-0.21.2/src/user.h 2012-03-13 16:38:41.327940973 -0400 @@ -151,9 +151,10 @@ #ifndef _USER @@ -11195,7 +11204,7 @@ diff -durpN unrtf-0.21.2.old/src/user.h unrtf-0.21.2/src/user.h #endif diff -durpN unrtf-0.21.2.old/src/word.c unrtf-0.21.2/src/word.c --- unrtf-0.21.2.old/src/word.c 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/word.c 2011-12-01 10:15:34.590855632 -0500 ++++ unrtf-0.21.2/src/word.c 2012-03-13 16:38:41.327940973 -0400 @@ -1,23 +1,23 @@ /*============================================================================= - GNU UnRTF, a command-line program to convert RTF documents to other formats. @@ -11520,7 +11529,7 @@ diff -durpN unrtf-0.21.2.old/src/word.c unrtf-0.21.2/src/word.c diff -durpN unrtf-0.21.2.old/src/word.h unrtf-0.21.2/src/word.h --- unrtf-0.21.2.old/src/word.h 2010-07-03 22:30:58.000000000 -0400 -+++ unrtf-0.21.2/src/word.h 2011-11-09 15:53:21.814783744 -0500 ++++ unrtf-0.21.2/src/word.h 2012-03-13 16:38:41.327940973 -0400 @@ -41,14 +41,15 @@ typedef struct _w { struct _w * child; } Word; diff --git a/SoObjects/Mailer/SOGoMailFolder.m b/SoObjects/Mailer/SOGoMailFolder.m index 654f0cd73..a60d14f07 100644 --- a/SoObjects/Mailer/SOGoMailFolder.m +++ b/SoObjects/Mailer/SOGoMailFolder.m @@ -279,28 +279,38 @@ static NSString *defaultUserID = @"anyone"; { [self imap4URL]; - [self imap4Connection]; - client = [imap4 client]; + if ([self imap4Connection]) + { + client = [imap4 client]; - inbox = [[self mailAccountFolder] inboxFolderInContext: context]; - [client select: [inbox absoluteImap4Name]]; + inbox = [[self mailAccountFolder] inboxFolderInContext: context]; + [client select: [inbox absoluteImap4Name]]; - path = [[imap4URL path] stringByDeletingLastPathComponent]; - if (![path hasSuffix: @"/"]) - path = [path stringByAppendingString: @"/"]; - destURL = [[NSURL alloc] initWithScheme: [imap4URL scheme] - host: [imap4URL host] - path: [NSString stringWithFormat: @"%@%@", - path, newName]]; - [destURL autorelease]; - error = [imap4 moveMailboxAtURL: imap4URL - toURL: destURL]; - if (!error) - { - // We unsubscribe to the old one, and subscribe back to the new one - [client subscribe: [destURL path]]; - [client unsubscribe: [imap4URL path]]; + path = [[imap4URL path] stringByDeletingLastPathComponent]; + if (![path hasSuffix: @"/"]) + path = [path stringByAppendingString: @"/"]; + destURL = [[NSURL alloc] initWithScheme: [imap4URL scheme] + host: [imap4URL host] + path: [NSString stringWithFormat: @"%@%@", + path, newName]]; + [destURL autorelease]; + error = [imap4 moveMailboxAtURL: imap4URL + toURL: destURL]; + if (!error) + { + ASSIGN (imap4URL, nil); + ASSIGN (nameInContainer, + ([NSString stringWithFormat: @"folder%@", [newName asCSSIdentifier]])); + + // We unsubscribe to the old one, and subscribe back to the new one + [client subscribe: [destURL path]]; + [client unsubscribe: [imap4URL path]]; + } } + else + error = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; } else error = [NSException exceptionWithName: @"SOGoMailException" @@ -386,33 +396,41 @@ static NSString *defaultUserID = @"anyone"; error = (NSException *) trashFolder; else { - client = [[self imap4Connection] client]; - [imap4 selectFolder: [self imap4URL]]; - folderName = [imap4 imap4FolderNameForURL: [trashFolder imap4URL]]; - b = YES; + if ([self imap4Connection]) + { + error = nil; + client = [imap4 client]; + [imap4 selectFolder: [self imap4URL]]; + folderName = [imap4 imap4FolderNameForURL: [trashFolder imap4URL]]; + b = YES; - // If we are deleting messages within the Trash folder itself, we - // do not, of course, try to move messages to the Trash folder. - if ([folderName isEqualToString: [self relativeImap4Name]]) - { - *withTrash = NO; - } - else - { - // If our Trash folder doesn't exist when we try to copy messages - // to it, we create it. - result = [[client status: folderName flags: [NSArray arrayWithObject: @"UIDVALIDITY"]] - objectForKey: @"result"]; + // If we are deleting messages within the Trash folder itself, we + // do not, of course, try to move messages to the Trash folder. + if ([folderName isEqualToString: [self relativeImap4Name]]) + { + *withTrash = NO; + } + else + { + // If our Trash folder doesn't exist when we try to copy messages + // to it, we create it. + result = [[client status: folderName flags: [NSArray arrayWithObject: @"UIDVALIDITY"]] + objectForKey: @"result"]; - if (![result boolValue]) - [[self imap4Connection] createMailbox: folderName - atURL: [[self mailAccountFolder] imap4URL]]; + if (![result boolValue]) + [imap4 createMailbox: folderName + atURL: [[self mailAccountFolder] imap4URL]]; - result = [[client copyUids: uids toFolder: folderName] - objectForKey: @"result"]; + result = [[client copyUids: uids toFolder: folderName] + objectForKey: @"result"]; - b = [result boolValue]; + b = [result boolValue]; + } } + else + error = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; } } else @@ -608,23 +626,32 @@ static NSString *defaultUserID = @"anyone"; } client = [[self imap4Connection] client]; - [imap4 selectFolder: [self imap4URL]]; + if (client) + { + [imap4 selectFolder: [self imap4URL]]; - // We make sure the destination IMAP folder exist, if not, we create it. - result = [[client status: imapDestinationFolder - flags: [NSArray arrayWithObject: @"UIDVALIDITY"]] - objectForKey: @"result"]; - if (![result boolValue]) - result = [[self imap4Connection] createMailbox: imapDestinationFolder - atURL: [[self mailAccountFolder] imap4URL]]; - if (!result || [result boolValue]) - result = [client copyUids: uids toFolder: imapDestinationFolder]; + // We make sure the destination IMAP folder exist, if not, we create it. + result = [[client status: imapDestinationFolder + flags: [NSArray arrayWithObject: @"UIDVALIDITY"]] + objectForKey: @"result"]; + if (![result boolValue]) + result = [[self imap4Connection] createMailbox: imapDestinationFolder + atURL: [[self mailAccountFolder] imap4URL]]; + if (!result || [result boolValue]) + result = [client copyUids: uids toFolder: imapDestinationFolder]; - if ([[result valueForKey: @"result"] boolValue]) - result = nil; + if ([[result valueForKey: @"result"] boolValue]) + result = nil; + else + result = [NSException exceptionWithHTTPStatus: 500 + reason: [[[result objectForKey: @"RawResponse"] + objectForKey: @"ResponseResult"] + objectForKey: @"description"]]; + } else - result = [NSException exceptionWithHTTPStatus: 500 - reason: [[[result objectForKey: @"RawResponse"] objectForKey: @"ResponseResult"] objectForKey: @"description"]]; + result = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; } else result = [NSException exceptionWithHTTPStatus: 500 @@ -645,18 +672,24 @@ static NSString *defaultUserID = @"anyone"; NGImap4Client *client; client = [[self imap4Connection] client]; - - result = [self copyUIDs: uids toFolder: destinationFolder inContext: localContext]; - if (![result isNotNull]) + if (client) { - result = [client storeFlags: [NSArray arrayWithObject: @"Deleted"] - forUIDs: uids addOrRemove: YES]; - if ([[result valueForKey: @"result"] boolValue]) - { - [self markForExpunge]; - result = nil; - } + result = [self copyUIDs: uids toFolder: destinationFolder inContext: localContext]; + if (![result isNotNull]) + { + result = [client storeFlags: [NSArray arrayWithObject: @"Deleted"] + forUIDs: uids addOrRemove: YES]; + if ([[result valueForKey: @"result"] boolValue]) + { + [self markForExpunge]; + result = nil; + } + } } + else + result = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; return result; } @@ -740,7 +773,15 @@ static NSString *defaultUserID = @"anyone"; - (NSException *) expunge { - return [[self imap4Connection] expungeAtURL: [self imap4URL]]; + NSException *error; + + if ([self imap4Connection]) + error = [imap4 expungeAtURL: [self imap4URL]]; + else + error = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; + return error; } - (void) markForExpunge @@ -796,8 +837,17 @@ static NSString *defaultUserID = @"anyone"; - (NSException *) addFlagsToAllMessages: (id) _f { - return [[self imap4Connection] addFlags:_f - toAllMessagesInURL: [self imap4URL]]; + NSException *error; + + if ([self imap4Connection]) + error = [imap4 addFlags:_f + toAllMessagesInURL: [self imap4URL]]; + else + error = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; + + return error; } /* name lookup */ @@ -866,7 +916,16 @@ static NSString *defaultUserID = @"anyone"; - (NSException *) davCreateCollection: (NSString *) _name inContext: (id) _ctx { - return [[self imap4Connection] createMailbox:_name atURL:[self imap4URL]]; + NSException *error; + + if ([self imap4Connection]) + error = [imap4 createMailbox:_name atURL:[self imap4URL]]; + else + error = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; + + return error; } - (BOOL) exists @@ -879,29 +938,43 @@ static NSString *defaultUserID = @"anyone"; NSException *error; BOOL rc; - [self imap4Connection]; - error = [imap4 createMailbox: [self relativeImap4Name] - atURL: [container imap4URL]]; - if (error) - rc = NO; - else + if ([self imap4Connection]) { - [[imap4 client] subscribe: [self absoluteImap4Name]]; - rc = YES; + error = [imap4 createMailbox: [self relativeImap4Name] + atURL: [container imap4URL]]; + if (error) + rc = NO; + else + { + [[imap4 client] subscribe: [self absoluteImap4Name]]; + rc = YES; + } } + else + rc = NO; return rc; } - (NSException *) delete { - return [[self imap4Connection] deleteMailboxAtURL:[self imap4URL]]; + NSException *error; + + if ([self imap4Connection]) + error = [imap4 deleteMailboxAtURL: [self imap4URL]]; + else + error = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; + + return error; } - (NSException *) davMoveToTargetObject: (id) _target newName: (NSString *) _name inContext: (id)_ctx { + NSException *error; NSURL *destImapURL; if ([_name length] == 0) { /* target already exists! */ @@ -926,9 +999,16 @@ static NSString *defaultUserID = @"anyone"; [self logWithFormat:@"TODO: should move collection as '%@' to: %@", [[self imap4URL] absoluteString], [destImapURL absoluteString]]; - - return [[self imap4Connection] moveMailboxAtURL:[self imap4URL] - toURL:destImapURL]; + + if ([self imap4Connection]) + error = [imap4 moveMailboxAtURL: [self imap4URL] + toURL: destImapURL]; + else + error = [NSException exceptionWithName: @"SOGoMailException" + reason: @"IMAP connection is invalid" + userInfo: nil]; + + return error; } - (NSException *) davCopyToTargetObject: (id) _target diff --git a/Version b/Version index bf09603b5..09503ebca 100644 --- a/Version +++ b/Version @@ -2,6 +2,6 @@ # This file is included by library makefiles to set the version information # of the executable. -MAJOR_VERSION=1 -MINOR_VERSION=3 -SUBMINOR_VERSION=13 +MAJOR_VERSION=2 +MINOR_VERSION=0 +SUBMINOR_VERSION=0