diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index 4fc207904..739fbd95b 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -78,6 +78,9 @@ $(SOGOBACKEND)_OBJC_FILES += \ MAPIStoreGCSMessage.m \ MAPIStoreGCSMessageTable.m \ \ + MAPIStoreCalTaskFolder.m \ + MAPIStoreCalTaskMessage.m \ + \ MAPIStoreCalendarAttachment.m \ MAPIStoreCalendarContext.m \ MAPIStoreCalendarFolder.m \ diff --git a/OpenChange/MAPIStoreAppointmentWrapper.h b/OpenChange/MAPIStoreAppointmentWrapper.h index d114076fe..5ed4c83ff 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.h +++ b/OpenChange/MAPIStoreAppointmentWrapper.h @@ -68,105 +68,109 @@ - (void) fillMessageData: (struct mapistore_message *) dataPtr inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagSenderEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagSenderAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagSenderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagSenderEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (NSString *) creator; +- (NSString *) owner; +- (NSUInteger) sensitivity; -- (int) getPidTagReceivedByAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagReceivedByEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagReceivedByName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagReceivedByEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagSenderEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagSenderAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagSenderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagSenderEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagIconIndex: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagOwnerAppointmentId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidMeetingType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagStartDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidAppointmentSequence: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidAppointmentStateFlags: (void **) data +- (enum mapistore_error) getPidTagReceivedByAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagReceivedByEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagReceivedByName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagReceivedByEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; + +- (enum mapistore_error) getPidTagIconIndex: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagOwnerAppointmentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidMeetingType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagStartDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidAppointmentSequence: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidAppointmentStateFlags: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidResponseStatus: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; + +- (enum mapistore_error) getPidLidAppointmentStartWhole: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidCommonStart: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagEndDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidAppointmentEndWhole: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidCommonEnd: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidAppointmentDuration: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidAppointmentSubType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidBusyStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidIndentedBusyStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data // SUMMARY + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidLocation: (void **) data // LOCATION + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagBody: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidResponseStatus: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; - -- (int) getPidLidAppointmentStartWhole: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidCommonStart: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagEndDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidAppointmentEndWhole: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidCommonEnd: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidAppointmentDuration: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidAppointmentSubType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidBusyStatus: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidIndentedBusyStatus: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagNormalizedSubject: (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) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidIsRecurring: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidRecurring: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidAppointmentRecur: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidGlobalObjectId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidCleanGlobalObjectId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidServerProcessed: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidServerProcessingActions: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidAppointmentReplyTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidIsRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidAppointmentRecur: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidGlobalObjectId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidCleanGlobalObjectId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidServerProcessed: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidServerProcessingActions: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidAppointmentReplyTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; /* reminders */ -- (int) getPidLidReminderSet: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidReminderDelta: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidReminderTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidReminderSignalTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidReminderOverride: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidReminderType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidReminderPlaySound: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidReminderFileParameter: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidReminderSet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidReminderDelta: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidReminderTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidReminderSignalTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidReminderOverride: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidReminderType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidReminderPlaySound: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidReminderFileParameter: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; @end diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 11a189500..1881a16a5 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -452,8 +452,8 @@ static NSCharacterSet *hexCharacterSet = nil; } } -- (int) getPidTagIconIndex: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -518,10 +518,10 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidTagOwnerAppointmentId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOwnerAppointmentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; const char *utf8UID; union { uint32_t longValue; @@ -549,8 +549,8 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) getPidLidMeetingType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidMeetingType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* TODO See 2.2.6.5 PidLidMeetingType (OXOCAL) */ @@ -559,10 +559,10 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidOwnerCriticalChange: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidOwnerCriticalChange: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; NSCalendarDate *lastModified; if ([[event attendees] count] > 0) @@ -578,10 +578,10 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) getPidLidAttendeeCriticalChange: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAttendeeCriticalChange: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; NSCalendarDate *lastModified; if ([[event attendees] count] > 0) @@ -597,8 +597,8 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { const char *className; @@ -644,30 +644,30 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidAppointmentMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.Appointment"); return MAPISTORE_SUCCESS; } -- (int) getPidLidFInvited: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidFInvited: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidLidAppointmentSequence: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentSequence: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[event sequence] unsignedIntValue]); return MAPISTORE_SUCCESS; } -- (int) getPidLidAppointmentStateFlags: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentStateFlags: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t flags = 0x00; @@ -684,8 +684,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidResponseStatus: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidResponseStatus: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t status = 0x00; iCalPerson *person; @@ -722,14 +722,14 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidAppointmentNotAllowPropose: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentNotAllowPropose: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidLidAppointmentStartWhole: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentStartWhole: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; @@ -744,8 +744,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidTagStartDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagStartDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* "The PidTagStartDate property ([MS-OXPROPS] section 2.1077) SHOULD be set, and when set, it MUST be equal to the value of the @@ -764,8 +764,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidCommonStart: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidCommonStart: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; @@ -777,8 +777,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidClipStart: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidClipStart: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSCalendarDate *dateValue, *start; @@ -806,8 +806,8 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) getPidLidAppointmentEndWhole: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentEndWhole: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; @@ -827,8 +827,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidTagEndDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagEndDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; @@ -847,8 +847,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidCommonEnd: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidCommonEnd: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; @@ -868,8 +868,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidClipEnd: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidClipEnd: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSCalendarDate *dateValue; @@ -896,10 +896,10 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) _getEntryIdFromCN: (NSString *) cn - andEmail: (NSString *) email - inData: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getEntryIdFromCN: (NSString *) cn + andEmail: (NSString *) email + inData: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *username; SOGoUserManager *mgr; @@ -921,11 +921,11 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) _getEmailAddress: (void **) data - forICalPerson: (iCalPerson *) person - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getEmailAddress: (void **) data + forICalPerson: (iCalPerson *) person + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; NSString *email; email = [person rfc822Email]; @@ -940,20 +940,20 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) _getAddrType: (void **) data - forICalPerson: (iCalPerson *) person - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getAddrType: (void **) data + forICalPerson: (iCalPerson *) person + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"SMTP" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) _getName: (void **) data - forICalPerson: (iCalPerson *) person - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getName: (void **) data + forICalPerson: (iCalPerson *) person + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; NSString *cn; cn = [person cn]; @@ -968,11 +968,11 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) _getEntryId: (void **) data - forICalPerson: (iCalPerson *) person - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getEntryId: (void **) data + forICalPerson: (iCalPerson *) person + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; NSString *email, *cn; if (person) @@ -991,201 +991,99 @@ static NSCharacterSet *hexCharacterSet = nil; } /* sender (organizer) */ -- (int) getPidTagSenderEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSenderEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddress: data forICalPerson: [event organizer] inMemCtx: memCtx]; } -- (int) getPidTagSenderAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSenderAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getAddrType: data forICalPerson: [event organizer] inMemCtx: memCtx]; } -- (int) getPidTagSenderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSenderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getName: data forICalPerson: [event organizer] inMemCtx: memCtx]; } -- (int) getPidTagSenderEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSenderEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryId: data forICalPerson: [event organizer] inMemCtx: memCtx]; } -/* sender representing */ -- (int) getPidTagSentRepresentingEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +/* creator (only if created from Outlook/SOGo or organizer as fallback */ +- (NSString *) creator { - return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; + iCalPerson *person; + NSDictionary *contactInfos; + NSString *creator = nil, *email; + SOGoUserManager *mgr; + + creator = [[event uniqueChildWithTag: @"x-sogo-component-created-by"] + flattenedValuesForKey: @""]; + if ([creator length] == 0) + { + person = [event organizer]; + if (person) + { + email = [person rfc822Email]; + if ([email length] > 0) + { + mgr = [SOGoUserManager sharedUserManager]; + contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; + if (contactInfos) + creator = [contactInfos objectForKey: @"sAMAccountName"]; + } + } + } + return creator; } -- (int) getPidTagSentRepresentingAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +/* owner is the organizer of the event, if none, try with the creator + who has saved only from Outlook or SOGo */ +- (NSString *) owner { - return [self getSMTPAddrType: data inMemCtx: memCtx]; + iCalPerson *person; + NSDictionary *contactInfos; + NSString *email, *owner = nil; + SOGoUserManager *mgr; + + person = [event organizer]; + if (person) + { + email = [person rfc822Email]; + if ([email length] > 0) + { + mgr = [SOGoUserManager sharedUserManager]; + contactInfos = [mgr contactInfosForUserWithUIDorEmail: email]; + if (contactInfos) + owner = [contactInfos objectForKey: @"sAMAccountName"]; + } + } + + if (!owner) + owner = [[event uniqueChildWithTag: @"x-sogo-component-created-by"] + flattenedValuesForKey: @""]; + + return owner; } -- (int) getPidTagSentRepresentingName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (NSUInteger) sensitivity { - return [self getPidTagSenderName: data inMemCtx: memCtx]; -} - -- (int) getPidTagSentRepresentingEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; -} - -/* attendee */ -- (int) getPidTagReceivedByEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self _getEmailAddress: data - forICalPerson: [event userAsAttendee: user] - inMemCtx: memCtx]; -} - -- (int) getPidTagReceivedByAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self _getAddrType: data - forICalPerson: [event userAsAttendee: user] - inMemCtx: memCtx]; -} - -- (int) getPidTagReceivedByName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self _getName: data - forICalPerson: [event userAsAttendee: user] - inMemCtx: memCtx]; -} - -- (int) getPidTagReceivedByEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self _getEntryId: data - forICalPerson: [event userAsAttendee: user] - inMemCtx: memCtx]; -} -/* /attendee */ - -- (int) getPidLidAppointmentDuration: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - NSTimeInterval timeValue; - - timeValue = [[event endDate] timeIntervalSinceDate: [event startDate]]; - *data = MAPILongValue (memCtx, (uint32_t) (timeValue / 60)); - - return MAPISTORE_SUCCESS; -} - -- (int) getPidLidAppointmentSubType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - *data = MAPIBoolValue (memCtx, [event isAllDay]); - - return MAPISTORE_SUCCESS; -} - -- (int) getPidLidBusyStatus: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - uint8_t value; - - value = 0x2; // olBusy - - if (![event isOpaque]) - value = 0x0; // olFree - - *data = MAPILongValue (memCtx, value); - - return MAPISTORE_SUCCESS; -} - -- (int) getPidLidIndentedBusyStatus: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPidLidBusyStatus: data inMemCtx: memCtx]; -} - -- (int) getPidTagNormalizedSubject: (void **) data // SUMMARY - inMemCtx: (TALLOC_CTX *) memCtx -{ - *data = [[event summary] asUnicodeInMemCtx: memCtx]; - - return MAPISTORE_SUCCESS; -} - -- (int) getPidLidLocation: (void **) data // LOCATION - inMemCtx: (TALLOC_CTX *) memCtx -{ - int rc = MAPISTORE_SUCCESS; - NSString *location; - - location = [event location]; - if (location) - *data = [location asUnicodeInMemCtx: memCtx]; - else - rc = MAPISTORE_ERR_NOT_FOUND; - - return rc; -} - -- (int) getPidLidWhere: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - return [self getPidLidLocation: data inMemCtx: memCtx]; -} - -- (int) getPidLidServerProcessed: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - /* TODO: we need to check whether the event has been processed internally by - SOGo or if it was received only by mail. We only assume the SOGo case - here. */ - return [self getYes: data inMemCtx: memCtx]; -} - -- (int) getPidLidServerProcessingActions: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - *data = MAPILongValue (memCtx, - 0x00000010 /* cpsCreatedOnPrincipal */ - | 0x00000080 /* cpsUpdatedCalItem */ - | 0x00000100 /* cpsCopiedOldProperties */); - - return MAPISTORE_SUCCESS; -} - -- (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions - inMemCtx: (TALLOC_CTX *) memCtx -{ - if ([event symbolicAccessClass] == iCalAccessPublic) - return [self getNo: data inMemCtx: memCtx]; - - return [self getYes: data inMemCtx: memCtx]; -} - -- (int) getPidTagSensitivity: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - /* See [MS-OXCICAL] Section 2.1.3.11.20.4 */ - uint32_t v; - NSString *accessClass; + NSString *accessClass = nil; + NSUInteger v; accessClass = [event accessClass]; if (accessClass) @@ -1202,13 +1100,180 @@ static NSCharacterSet *hexCharacterSet = nil; else v = 0x0; /* PUBLIC */ + return v; +} + +/* sender representing */ +- (enum mapistore_error) getPidTagSentRepresentingEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidTagSentRepresentingAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getSMTPAddrType: data inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidTagSentRepresentingName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagSenderName: data inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidTagSentRepresentingEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; +} + +/* attendee */ +- (enum mapistore_error) getPidTagReceivedByEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self _getEmailAddress: data + forICalPerson: [event userAsAttendee: user] + inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidTagReceivedByAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self _getAddrType: data + forICalPerson: [event userAsAttendee: user] + inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidTagReceivedByName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self _getName: data + forICalPerson: [event userAsAttendee: user] + inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidTagReceivedByEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self _getEntryId: data + forICalPerson: [event userAsAttendee: user] + inMemCtx: memCtx]; +} +/* /attendee */ + +- (enum mapistore_error) getPidLidAppointmentDuration: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + NSTimeInterval timeValue; + + timeValue = [[event endDate] timeIntervalSinceDate: [event startDate]]; + *data = MAPILongValue (memCtx, (uint32_t) (timeValue / 60)); + + return MAPISTORE_SUCCESS; +} + +- (enum mapistore_error) getPidLidAppointmentSubType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + *data = MAPIBoolValue (memCtx, [event isAllDay]); + + return MAPISTORE_SUCCESS; +} + +- (enum mapistore_error) getPidLidBusyStatus: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + uint8_t value; + + value = 0x2; // olBusy + + if (![event isOpaque]) + value = 0x0; // olFree + + *data = MAPILongValue (memCtx, value); + + return MAPISTORE_SUCCESS; +} + +- (enum mapistore_error) getPidLidIndentedBusyStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidLidBusyStatus: data inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data // SUMMARY + inMemCtx: (TALLOC_CTX *) memCtx +{ + *data = [[event summary] asUnicodeInMemCtx: memCtx]; + + return MAPISTORE_SUCCESS; +} + +- (enum mapistore_error) getPidLidLocation: (void **) data // LOCATION + inMemCtx: (TALLOC_CTX *) memCtx +{ + enum mapistore_error rc = MAPISTORE_SUCCESS; + NSString *location; + + location = [event location]; + if (location) + *data = [location asUnicodeInMemCtx: memCtx]; + else + rc = MAPISTORE_ERR_NOT_FOUND; + + return rc; +} + +- (enum mapistore_error) getPidLidWhere: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [self getPidLidLocation: data inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidLidServerProcessed: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + /* TODO: we need to check whether the event has been processed internally by + SOGo or if it was received only by mail. We only assume the SOGo case + here. */ + return [self getYes: data inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidLidServerProcessingActions: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + *data = MAPILongValue (memCtx, + 0x00000010 /* cpsCreatedOnPrincipal */ + | 0x00000080 /* cpsUpdatedCalItem */ + | 0x00000100 /* cpsCopiedOldProperties */); + + return MAPISTORE_SUCCESS; +} + +- (enum mapistore_error) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions + inMemCtx: (TALLOC_CTX *) memCtx +{ + if ([event symbolicAccessClass] == iCalAccessPublic) + return [self getNo: data inMemCtx: memCtx]; + + return [self getYes: data inMemCtx: memCtx]; +} + +- (enum mapistore_error) getPidTagSensitivity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + /* See [MS-OXCICAL] Section 2.1.3.11.20.4 */ + uint32_t v; + + v = (uint32_t) [self sensitivity]; *data = MAPILongValue (memCtx, v); return MAPISTORE_SUCCESS; } -- (int) getPidTagImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; if ([[event priority] isEqualToString: @"9"]) @@ -1223,8 +1288,8 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidNameKeywords: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameKeywords: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* See [MS-OXCICAL] Section 2.1.3.1.1.20.3 */ NSArray *categories; @@ -1239,10 +1304,10 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; NSRange range; NSString *stringValue; NSString *trimingString = @"\r\n\n"; @@ -1270,8 +1335,8 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) getPidTagInternetCodepage: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagInternetCodepage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* ref: http://msdn.microsoft.com/en-us/library/dd317756%28v=vs.85%29.aspx @@ -1286,16 +1351,16 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidRecurring: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [event isRecurrent]); return MAPISTORE_SUCCESS; } -- (int) getPidLidIsRecurring: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidIsRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [event isRecurrent] @@ -1304,16 +1369,16 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -- (int) getPidLidIsException: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidIsException: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [event recurrenceId] != nil); return MAPISTORE_SUCCESS; } -- (int) getPidLidExceptionReplaceTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidExceptionReplaceTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSCalendarDate *dateValue; @@ -1333,8 +1398,8 @@ static NSCharacterSet *hexCharacterSet = nil; return rc; } -- (int) getPidLidRecurrencePattern: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidRecurrencePattern: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"No description" asUnicodeInMemCtx: memCtx]; @@ -1569,10 +1634,10 @@ ExtendedException: (1) ReservedBlockEE2Size: 00 00 00 00 */ -- (int) getPidLidAppointmentRecur: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentRecur: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; if ([event isRecurrent]) *data = [self _computeAppointmentRecurInMemCtx: memCtx]; @@ -1582,10 +1647,10 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidRecurrenceType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidRecurrenceType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; iCalRecurrenceFrequency freq; iCalRecurrenceRule *rrule; enum RecurrenceType rectype; @@ -1614,7 +1679,7 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -// - (int) getPidLidGlobalObjectId: (void **) data +// - (enum mapistore_error) getPidLidGlobalObjectId: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // static char byteArrayId[] = {0x04, 0x00, 0x00, 0x00, 0x82, 0x00, 0xE0, @@ -1776,10 +1841,10 @@ ReservedBlockEE2Size: 00 00 00 00 talloc_free (localMemCtx); } -- (int) getPidLidGlobalObjectId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidGlobalObjectId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; if (!globalObjectId) [self _computeGlobalObjectIds]; @@ -1792,10 +1857,10 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidCleanGlobalObjectId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidCleanGlobalObjectId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; if (!cleanGlobalObjectId) [self _computeGlobalObjectIds]; @@ -1808,8 +1873,8 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidAppointmentReplyTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentReplyTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* We always return LAST-MODIFIED, which is a hack, but one that works because: the user is either (NOT recipient OR (is recipient AND its @@ -1817,7 +1882,7 @@ ReservedBlockEE2Size: 00 00 00 00 client OR the user is recipient and its status is defined, where this value is thus correct because the recipient status is the only property that can be changed. */ - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; NSCalendarDate *lastModified; lastModified = [event lastModified]; @@ -1860,8 +1925,8 @@ ReservedBlockEE2Size: 00 00 00 00 alarmSet = YES; } -- (int) getPidLidReminderSet: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderSet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!alarmSet) [self _setupAlarm]; @@ -1871,8 +1936,8 @@ ReservedBlockEE2Size: 00 00 00 00 return MAPISTORE_SUCCESS; } -- (int) getPidLidReminderTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!alarmSet) [self _setupAlarm]; @@ -1882,10 +1947,10 @@ ReservedBlockEE2Size: 00 00 00 00 : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidReminderDelta: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderDelta: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; iCalTrigger *trigger; NSCalendarDate *startDate, *relationDate, *alarmDate; NSTimeInterval interval; @@ -1922,10 +1987,10 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidReminderSignalTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderSignalTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSCalendarDate *alarmDate; if (!alarmSet) @@ -1942,10 +2007,10 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidReminderOverride: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderOverride: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; if (!alarmSet) [self _setupAlarm]; @@ -1958,10 +2023,10 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidReminderPlaySound: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderPlaySound: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; if (!alarmSet) [self _setupAlarm]; @@ -1974,8 +2039,8 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidReminderFileParameter: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderFileParameter: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { // if (!alarmSet) // [self _setupAlarm]; @@ -1983,14 +2048,14 @@ ReservedBlockEE2Size: 00 00 00 00 return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidLidReminderType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidLidTimeZoneDescription: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTimeZoneDescription: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSString *tzid; @@ -2007,8 +2072,8 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidTimeZoneStruct: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTimeZoneStruct: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; @@ -2018,15 +2083,15 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidAppointmentTimeZoneDefinitionStartDisplay: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentTimeZoneDefinitionStartDisplay: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; /* [MS-OXOCAL] 3.1.5.5.1: This property is used in floating (all-day) events, specified in floating time, to convert the start date from UTC to the user's time zone */ - if ([event isAllDay] | [event isRecurrent]) + if ([event isAllDay] || [event isRecurrent]) { /* [MS-OXOCAL] 2.2.1.42: This property can only have the E flag set in the TimeZoneDefinition struct */ @@ -2040,8 +2105,8 @@ ReservedBlockEE2Size: 00 00 00 00 return rc; } -- (int) getPidLidAppointmentTimeZoneDefinitionEndDisplay: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentTimeZoneDefinitionEndDisplay: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidAppointmentTimeZoneDefinitionStartDisplay: data inMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreAttachment.h b/OpenChange/MAPIStoreAttachment.h index bfa779b85..24ba32c43 100644 --- a/OpenChange/MAPIStoreAttachment.h +++ b/OpenChange/MAPIStoreAttachment.h @@ -36,13 +36,13 @@ - (void) setAID: (uint32_t) newAID; - (uint32_t) AID; -- (int) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr - withMID: (uint64_t *) mid - withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr - withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr + withMID: (uint64_t *) mid + withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr + withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr + inMemCtx: (TALLOC_CTX *) memCtx; /* helpers */ - (NSData *) mimeAttachTag; diff --git a/OpenChange/MAPIStoreAttachment.m b/OpenChange/MAPIStoreAttachment.m index cb85911e3..754436d7e 100644 --- a/OpenChange/MAPIStoreAttachment.m +++ b/OpenChange/MAPIStoreAttachment.m @@ -67,40 +67,40 @@ return mimeAttachTag; } -- (int) getPidTagMid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, aid); return MAPISTORE_SUCCESS; } -- (int) getPidTagRenderingPosition: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagRenderingPosition: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0xffffffff); return MAPISTORE_SUCCESS; } -- (int) getPidTagAccessLevel: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAccessLevel: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr - withMID: (uint64_t *) mid - withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr + withMID: (uint64_t *) mid + withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreEmbeddedMessage *attMessage; struct mapistore_message *mapistoreMsg; @@ -118,9 +118,9 @@ return (attMessage ? MAPISTORE_SUCCESS : MAPISTORE_ERROR); } -- (int) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr - withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr + withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreEmbeddedMessage *attMessage; struct mapistore_message *mapistoreMsg; diff --git a/OpenChange/MAPIStoreCalendarAttachment.m b/OpenChange/MAPIStoreCalendarAttachment.m index e101e735b..b2044b602 100644 --- a/OpenChange/MAPIStoreCalendarAttachment.m +++ b/OpenChange/MAPIStoreCalendarAttachment.m @@ -94,64 +94,64 @@ flattenedValuesForKey: @""]; } -- (int) getPidTagAttachmentHidden: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagAttachmentHidden: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { return [self getYes: data inMemCtx: localMemCtx]; } -- (int) getPidTagAttachmentFlags: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagAttachmentFlags: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { *data = MAPILongValue (localMemCtx, 0x00000002); /* afException */ return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachmentLinkId: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagAttachmentLinkId: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { return [self getLongZero: data inMemCtx: localMemCtx]; } -- (int) getPidTagAttachFlags: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagAttachFlags: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { return [self getLongZero: data inMemCtx: localMemCtx]; } -- (int) getPidTagAttachMethod: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagAttachMethod: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { *data = MAPILongValue (localMemCtx, afEmbeddedMessage); return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachEncoding: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagAttachEncoding: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { *data = [[NSData data] asBinaryInMemCtx: localMemCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { *data = [@"Untitled" asUnicodeInMemCtx: localMemCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachmentContactPhoto: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachmentContactPhoto: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagExceptionReplaceTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagExceptionReplaceTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc; NSCalendarDate *dateValue; @@ -178,8 +178,8 @@ return rc; } -- (int) getPidTagExceptionStartTime: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagExceptionStartTime: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { enum mapistore_error rc; NSCalendarDate *dateValue; @@ -205,8 +205,8 @@ return rc; } -- (int) getPidTagExceptionEndTime: (void **) data - inMemCtx: (TALLOC_CTX *) localMemCtx +- (enum mapistore_error) getPidTagExceptionEndTime: (void **) data + inMemCtx: (TALLOC_CTX *) localMemCtx { enum mapistore_error rc; NSCalendarDate *dateValue; diff --git a/OpenChange/MAPIStoreCalendarEmbeddedMessage.m b/OpenChange/MAPIStoreCalendarEmbeddedMessage.m index 986b106d3..02a776949 100644 --- a/OpenChange/MAPIStoreCalendarEmbeddedMessage.m +++ b/OpenChange/MAPIStoreCalendarEmbeddedMessage.m @@ -89,73 +89,73 @@ *dataPtr = msgData; } -- (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.OLE.CLASS.{00061055-0000-0000-C000-000000000046}"); return MAPISTORE_SUCCESS; } -- (int) getPidTagMessageFlags: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageFlags: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, MSGFLAG_UNMODIFIED); return MAPISTORE_SUCCESS; } -- (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidTagResponseRequested: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagResponseRequested: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } /* discarded properties */ -- (int) getPidLidAppointmentLastSequence: (void **) - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentLastSequence: (void **) + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidLidMeetingWorkspaceUrl: (void **) - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidMeetingWorkspaceUrl: (void **) + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidLidContacts: (void **) - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidContacts: (void **) + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagSensitivity: (void **) - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSensitivity: (void **) + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidLidPrivate: (void **) - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidPrivate: (void **) + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidNameKeywords: (void **) - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameKeywords: (void **) + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidLidFExceptionalBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidFExceptionalBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } @@ -208,6 +208,7 @@ [[container event] updateFromMAPIProperties: properties inUserContext: [self userContext] withActiveUser: activeUser + isNew: NO inMemCtx: memCtx]; } diff --git a/OpenChange/MAPIStoreCalendarFolder.h b/OpenChange/MAPIStoreCalendarFolder.h index fd6c5d20f..9b3a4cf5c 100644 --- a/OpenChange/MAPIStoreCalendarFolder.h +++ b/OpenChange/MAPIStoreCalendarFolder.h @@ -23,9 +23,9 @@ #ifndef MAPISTORECALENDARFOLDER_H #define MAPISTORECALENDARFOLDER_H -#import "MAPIStoreGCSFolder.h" +#import "MAPIStoreCalTaskFolder.h" -@interface MAPIStoreCalendarFolder : MAPIStoreGCSFolder +@interface MAPIStoreCalendarFolder : MAPIStoreCalTaskFolder @end diff --git a/OpenChange/MAPIStoreCalendarFolder.m b/OpenChange/MAPIStoreCalendarFolder.m index 5079c65cc..ed949e638 100644 --- a/OpenChange/MAPIStoreCalendarFolder.m +++ b/OpenChange/MAPIStoreCalendarFolder.m @@ -81,11 +81,7 @@ Following rights are not supported by SOGo specifically: - - DeleteOwned : Delete only own objects - - EditOwned : Edit only own objects - CreateSubfolders: No calendar subfolders - - FolderOwner: No sharing folder ownership? - - FolderContact: No support to store this information - FolderVisible: It is inferred by other rights when extracting */ NSMutableArray *roles; @@ -95,26 +91,35 @@ [roles addObject: SOGoRole_ObjectCreator]; if (rights & RightsDeleteAll) [roles addObject: SOGoRole_ObjectEraser]; + if (rights & RightsDeleteOwn) + [roles addObject: MAPIStoreRightDeleteOwn]; + if (rights & RightsEditAll) { [roles addObject: SOGoCalendarRole_PublicModifier]; [roles addObject: SOGoCalendarRole_PrivateModifier]; [roles addObject: SOGoCalendarRole_ConfidentialModifier]; } - else if (rights & RightsReadItems) + if (rights & RightsEditOwn) + [roles addObject: MAPIStoreRightEditOwn]; + + if (rights & RightsReadItems) { [roles addObject: SOGoCalendarRole_PublicViewer]; [roles addObject: SOGoCalendarRole_PrivateViewer]; [roles addObject: SOGoCalendarRole_ConfidentialViewer]; } if (rights & RightsFreeBusySimple) - { - [roles addObject: SOGoCalendarRole_PublicDAndTViewer]; - } + [roles addObject: SOGoCalendarRole_PublicDAndTViewer]; + if (rights & RightsFreeBusyDetailed) - { - [roles addObject: SOGoCalendarRole_ConfidentialDAndTViewer]; - } + [roles addObject: SOGoCalendarRole_ConfidentialDAndTViewer]; + + if (rights & RightsFolderOwner) + [roles addObject: MAPIStoreRightFolderOwner]; + + if (rights & RightsFolderContact) + [roles addObject: MAPIStoreRightFolderContact]; // [self logWithFormat: @"roles for rights %.8x = (%@)", rights, roles]; @@ -136,19 +141,28 @@ else if ([roles containsObject: SOGoCalendarRole_PublicViewer] && [roles containsObject: SOGoCalendarRole_PrivateViewer] && [roles containsObject: SOGoCalendarRole_ConfidentialViewer]) - // We have to set by hand other rights as only the highest role is returned - // See SOGoAppointmentFolder.m:aclsForUser for details - rights |= RightsReadItems | RightsFreeBusySimple | RightsFreeBusyDetailed; + rights |= RightsReadItems; + + if ([roles containsObject: MAPIStoreRightEditOwn]) + rights |= RightsEditOwn; + if ([roles containsObject: MAPIStoreRightDeleteOwn]) + rights |= RightsDeleteOwn; if ([roles containsObject: SOGoCalendarRole_PublicDAndTViewer]) rights |= RightsFreeBusySimple; if ([roles containsObject: SOGoCalendarRole_ConfidentialDAndTViewer]) - rights |= RightsFreeBusyDetailed; + rights |= RightsFreeBusySimple | RightsFreeBusyDetailed; if ((rights & RightsReadItems) != 0 || (rights & RightsCreateItems) != 0 || (rights & RightsDeleteAll) != 0) rights |= RoleNone; /* actually "folder visible" */ + if ([roles containsObject: MAPIStoreRightFolderOwner]) + rights |= RightsFolderOwner | RoleNone; + + if ([roles containsObject: MAPIStoreRightFolderContact]) + rights |= RightsFolderContact; + // [self logWithFormat: @"rights for roles (%@) = %.8x", roles, rights]; return rights; @@ -193,16 +207,16 @@ [(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]]; } -- (int) getPidTagContainerClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagContainerClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPF.Appointment" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagDefaultPostMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Appointment" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreCalendarMessage.h b/OpenChange/MAPIStoreCalendarMessage.h index 8b2de759d..99e286073 100644 --- a/OpenChange/MAPIStoreCalendarMessage.h +++ b/OpenChange/MAPIStoreCalendarMessage.h @@ -23,13 +23,13 @@ #ifndef MAPISTORECALENDARMESSAGE_H #define MAPISTORECALENDARMESSAGE_H -#import "MAPIStoreGCSMessage.h" +#import "MAPIStoreCalTaskMessage.h" @class iCalCalendar; @class iCalEvent; @class MAPIStoreAppointmentWrapper; -@interface MAPIStoreCalendarMessage : MAPIStoreGCSMessage +@interface MAPIStoreCalendarMessage : MAPIStoreCalTaskMessage { iCalCalendar *calendar; iCalEvent *masterEvent; diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 108471eae..5ec92d07f 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -228,8 +228,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; /* getters */ -- (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { SOGoUser *owner; @@ -242,8 +242,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; return MAPISTORE_SUCCESS; } -- (int) getPidLidSideEffects: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSideEffects: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, seOpenToDelete | seOpenToCopy | seOpenToMove @@ -252,7 +252,7 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; return MAPISTORE_SUCCESS; } -- (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } @@ -347,8 +347,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; *dataPtr = msgData; } -- (int) getPidTagResponseRequested: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagResponseRequested: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } @@ -358,8 +358,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; MAPIStoreMessage base class, then the proxy method is not reached (see MAPIStoreObject). */ -- (int) getPidTagNormalizedSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreAppointmentWrapper *appointmentWrapper; @@ -370,8 +370,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagSensitivity: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSensitivity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreAppointmentWrapper *appointmentWrapper; @@ -382,8 +382,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStoreAppointmentWrapper *appointmentWrapper; @@ -528,29 +528,19 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; ASSIGN (sogoObject, newObject); } -- (BOOL) subscriberCanReadMessage +- (NSUInteger) sensitivity { - NSArray *roles; - - roles = [self activeUserRoles]; - - return ([roles containsObject: SOGoCalendarRole_ComponentViewer] - || [roles containsObject: SOGoCalendarRole_ComponentDAndTViewer] - || [self subscriberCanModifyMessage]); + return [[self _appointmentWrapper] sensitivity]; } -- (BOOL) subscriberCanModifyMessage +- (NSString *) creator { - BOOL rc; - NSArray *roles = [self activeUserRoles]; + return [[self _appointmentWrapper] creator]; +} - if (isNew) - rc = [roles containsObject: SOGoRole_ObjectCreator]; - else - rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier] - || [roles containsObject: SOGoCalendarRole_ComponentResponder]); - - return rc; +- (NSString *) owner +{ + return [[self _appointmentWrapper] owner]; } - (void) _updateAttachedEvents @@ -632,6 +622,7 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK; [masterEvent updateFromMAPIProperties: properties inUserContext: [self userContext] withActiveUser: activeUser + isNew: isNew inMemCtx: memCtx]; [self _updateAttachedEvents]; [[self userContext] activate]; diff --git a/OpenChange/MAPIStoreContactsAttachment.m b/OpenChange/MAPIStoreContactsAttachment.m index f578dbc61..6b0d73133 100644 --- a/OpenChange/MAPIStoreContactsAttachment.m +++ b/OpenChange/MAPIStoreContactsAttachment.m @@ -92,52 +92,52 @@ return [container lastModificationTime]; } -- (int) getPidTagAttachEncoding: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagAttachEncoding: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; { *data = [[NSData data] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachFlags: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachFlags: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagAttachmentFlags: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachmentFlags: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagAttachmentHidden: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachmentHidden: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagAttachmentLinkId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachmentLinkId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagAttachMethod: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachMethod: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000001); return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachmentContactPhoto: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachmentContactPhoto: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidTagAttachDataBinary: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachDataBinary: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!photoData) ASSIGN (photoData, @@ -148,8 +148,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachSize: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachSize: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!photoData) ASSIGN (photoData, @@ -160,16 +160,16 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachExtension: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachExtension: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self fileExtension] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachLongFilename: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachLongFilename: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *filename; @@ -181,15 +181,15 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachFilename: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachFilename: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagAttachLongFilename: data inMemCtx: memCtx]; } -- (int) getPidTagDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagAttachLongFilename: data inMemCtx: memCtx]; } diff --git a/OpenChange/MAPIStoreContactsFolder.m b/OpenChange/MAPIStoreContactsFolder.m index a04110d0f..d55c34a25 100644 --- a/OpenChange/MAPIStoreContactsFolder.m +++ b/OpenChange/MAPIStoreContactsFolder.m @@ -74,18 +74,34 @@ - (NSArray *) rolesForExchangeRights: (uint32_t) rights { + /* Limitations + + Following rights are not supported by SOGo specifically: + + - CreateSubfolders: No contacts subfolders + - FolderVisible: It is inferred by other rights when extracting + */ NSMutableArray *roles; - roles = [NSMutableArray arrayWithCapacity: 6]; + roles = [NSMutableArray arrayWithCapacity: 8]; if (rights & RightsCreateItems) [roles addObject: SOGoRole_ObjectCreator]; if (rights & RightsDeleteAll) [roles addObject: SOGoRole_ObjectEraser]; + if (rights & RightsDeleteOwn) + [roles addObject: MAPIStoreRightDeleteOwn]; if (rights & RightsEditAll) [roles addObject: SOGoRole_ObjectEditor]; + if (rights & RightsEditOwn) + [roles addObject: MAPIStoreRightEditOwn]; if (rights & RightsReadItems) [roles addObject: SOGoRole_ObjectViewer]; + if (rights & RightsFolderOwner) + [roles addObject: MAPIStoreRightFolderOwner]; + if (rights & RightsFolderContact) + [roles addObject: MAPIStoreRightFolderContact]; + return roles; } @@ -95,15 +111,28 @@ if ([roles containsObject: SOGoRole_ObjectCreator]) rights |= RightsCreateItems; + if ([roles containsObject: SOGoRole_ObjectEraser]) rights |= RightsDeleteAll | RightsDeleteOwn; + else if ([roles containsObject: MAPIStoreRightDeleteOwn]) + rights |= RightsDeleteOwn; + if ([roles containsObject: SOGoRole_ObjectEditor]) rights |= RightsEditAll | RightsEditOwn; + else if ([roles containsObject: MAPIStoreRightEditOwn]) + rights |= RightsEditOwn; + if ([roles containsObject: SOGoRole_ObjectViewer]) rights |= RightsReadItems; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ + if ([roles containsObject: MAPIStoreRightFolderOwner]) + rights |= RightsFolderOwner | RoleNone; + + if ([roles containsObject: MAPIStoreRightFolderContact]) + rights |= RightsFolderContact; + return rights; } @@ -117,8 +146,8 @@ return [[self activeUserRoles] containsObject: SOGoRole_ObjectViewer]; } -- (int) getPidTagDefaultPostMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Contact" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreContactsMessage.m b/OpenChange/MAPIStoreContactsMessage.m index b183d445e..344f31c39 100644 --- a/OpenChange/MAPIStoreContactsMessage.m +++ b/OpenChange/MAPIStoreContactsMessage.m @@ -31,9 +31,11 @@ #import #import #import +#import #import #import #import +#import #import #import "MAPIStoreAttachment.h" @@ -104,8 +106,8 @@ return element; } -- (int) getPidTagIconIndex: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ *data = MAPILongValue (memCtx, 0x00000200); @@ -113,52 +115,52 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagAlternateRecipientAllowed: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAlternateRecipientAllowed: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidTagMessageFlags: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageFlags: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, MSGFLAG_READ); return MAPISTORE_SUCCESS; } -- (int) getPidTagDeleteAfterSubmit: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDeleteAfterSubmit: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "IPM.Contact"); return MAPISTORE_SUCCESS; } -- (int) getPidTagSendInternetEncoding: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSendInternetEncoding: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00065001); return MAPISTORE_SUCCESS; } -- (int) getPidTagNormalizedSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagDisplayName: data inMemCtx: memCtx]; } -- (int) getPidLidFileUnder: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidFileUnder: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *surName, *givenName, *middleName; NSMutableString *fileUnder; @@ -184,22 +186,22 @@ return MAPISTORE_SUCCESS; } -- (int) getPidLidFileUnderId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidFileUnderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00008017); /* what ol2003 sets */ return MAPISTORE_SUCCESS; } -- (int) getPidTagAccount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAccount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidEmail1EmailAddress: data inMemCtx: memCtx]; } -- (int) getPidTagContactEmailAddresses: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagContactEmailAddresses: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -212,8 +214,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagEmsAbTargetAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagEmsAbTargetAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -224,8 +226,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagSearchKey: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSearchKey: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -236,16 +238,16 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagMailPermission: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMailPermission: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidTagBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSString *stringValue; stringValue = [[sogoObject vCard] note]; @@ -257,8 +259,8 @@ return rc; } -- (int) getPidTagSensitivity: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSensitivity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } @@ -267,8 +269,8 @@ // Contact Name Properties [MS-OXOCNTC 2.2.1.1] // --------------------------------------------------------- -- (int) getPidTagNickname: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagNickname: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -278,8 +280,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagGeneration: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagGeneration: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -291,8 +293,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagSurname: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSurname: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -304,8 +306,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagMiddleName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMiddleName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -317,8 +319,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagGivenName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagGivenName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -330,8 +332,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagDisplayNamePrefix: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayNamePrefix: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -398,9 +400,9 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 Store on *data the given email (position) It can return MAPISTORE_ERR_NOT_FOUND if the email doesn't exist */ -- (int) _getPidLidEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx - atPosition: (NSUInteger) position +- (enum mapistore_error) _getPidLidEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx + atPosition: (NSUInteger) position { NSString *email; @@ -412,60 +414,60 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return MAPISTORE_SUCCESS; } -- (int) getPidLidEmail1EmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail1EmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailAddress: data inMemCtx: memCtx atPosition: 1]; } -- (int) getPidLidEmail2EmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail2EmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailAddress: data inMemCtx: memCtx atPosition: 2]; } -- (int) getPidLidEmail3EmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail3EmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailAddress: data inMemCtx: memCtx atPosition: 3]; } -- (int) getPidLidEmail1OriginalDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail1OriginalDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidEmail1EmailAddress: data inMemCtx: memCtx]; } -- (int) getPidLidEmail2OriginalDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail2OriginalDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidEmail2EmailAddress: data inMemCtx: memCtx]; } -- (int) getPidLidEmail3OriginalDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail3OriginalDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidEmail3EmailAddress: data inMemCtx: memCtx]; } -- (int) getPidLidEmail1AddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail1AddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (![self _fetchEmailAddress: 1]) return MAPISTORE_ERR_NOT_FOUND; return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPidLidEmail2AddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail2AddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (![self _fetchEmailAddress: 2]) return MAPISTORE_ERR_NOT_FOUND; return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPidLidEmail3AddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail3AddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (![self _fetchEmailAddress: 3]) return MAPISTORE_ERR_NOT_FOUND; @@ -476,9 +478,9 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 Store on *data a string with the display name for the given email (position) It can return MAPISTORE_ERR_NOT_FOUND if the email doesn't exist */ -- (int) _getPidLidEmailDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx - atPosition: (NSUInteger) position +- (enum mapistore_error) _getPidLidEmailDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx + atPosition: (NSUInteger) position { NGVCard *vCard; NSString *fn, *email; @@ -495,20 +497,20 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return MAPISTORE_SUCCESS; } -- (int) getPidLidEmail1DisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail1DisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailDisplayName: data inMemCtx: memCtx atPosition: 1]; } -- (int) getPidLidEmail2DisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail2DisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailDisplayName: data inMemCtx: memCtx atPosition: 2]; } -- (int) getPidLidEmail3DisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail3DisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailDisplayName: data inMemCtx: memCtx atPosition: 3]; } @@ -544,9 +546,9 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 Store on *data an entryId for the given email (position) It can return MAPISTORE_ERR_NOT_FOUND if the email doesn't exist */ -- (int) _getPidLidEmailOriginalEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx - atPosition: (NSUInteger) position +- (enum mapistore_error) _getPidLidEmailOriginalEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx + atPosition: (NSUInteger) position { NSData *value; @@ -558,36 +560,36 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return MAPISTORE_SUCCESS; } -- (int) getPidLidEmail1OriginalEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail1OriginalEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailOriginalEntryId: data inMemCtx: memCtx atPosition: 1]; } -- (int) getPidLidEmail2OriginalEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail2OriginalEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailOriginalEntryId: data inMemCtx: memCtx atPosition: 2]; } -- (int) getPidLidEmail3OriginalEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidEmail3OriginalEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getPidLidEmailOriginalEntryId: data inMemCtx: memCtx atPosition: 3]; } -- (int) _getElement: (NSString *) elementTag - ofType: (NSString *) aType - excluding: (NSString *) aTypeToExclude - atPos: (NSUInteger) pos - inData: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getElement: (NSString *) elementTag + ofType: (NSString *) aType + excluding: (NSString *) aTypeToExclude + atPos: (NSUInteger) pos + inData: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSArray *elements; CardElement *ce; @@ -611,15 +613,15 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 } if (!stringValue) - stringValue = @""; + return MAPISTORE_ERR_NOT_FOUND; *data = [stringValue asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagBusinessFaxNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagBusinessFaxNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"fax" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; @@ -656,30 +658,39 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return list; } -- (int) getPidLidAddressBookProviderArrayType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAddressBookProviderArrayType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { // [MS-OXOCNTC] 2.2.1.2.12 // https://msdn.microsoft.com/en-us/library/ee218011%28v=exchg.80%29.aspx uint32_t value = 0; NSArray *emailList = [self _buildAddressBookProviderEmailList]; - for (NSNumber *maskValue in emailList) - value |= 1 << [maskValue intValue]; + if ([emailList count] > 0) + { + for (NSNumber *maskValue in emailList) + value |= 1 << [maskValue intValue]; - *data = MAPILongValue (memCtx, value); + *data = MAPILongValue (memCtx, value); - return MAPISTORE_SUCCESS; + return MAPISTORE_SUCCESS; + } + else + return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidLidAddressBookProviderEmailList: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAddressBookProviderEmailList: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSArray *emailList = [self _buildAddressBookProviderEmailList]; - *data = [emailList asMVLongInMemCtx: memCtx]; - - return MAPISTORE_SUCCESS; + if ([emailList count] > 0) + { + *data = [emailList asMVLongInMemCtx: memCtx]; + return MAPISTORE_SUCCESS; + } + else + return MAPISTORE_ERR_NOT_FOUND; } // --------------------------------------------------------- @@ -688,49 +699,49 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 // Home Address -- (int) getPidTagHomeAddressStreet: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHomeAddressStreet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 2 inData: data inMemCtx: memCtx]; } -- (int) getPidTagHomeAddressCity: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHomeAddressCity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 3 inData: data inMemCtx: memCtx]; } -- (int) getPidTagHomeAddressStateOrProvince: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHomeAddressStateOrProvince: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 4 inData: data inMemCtx: memCtx]; } -- (int) getPidTagHomeAddressPostalCode: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHomeAddressPostalCode: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 5 inData: data inMemCtx: memCtx]; } -- (int) getPidTagHomeAddressCountry: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHomeAddressCountry: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 6 inData: data inMemCtx: memCtx]; } -- (int) getPidTagHomeAddressPostOfficeBox: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHomeAddressPostOfficeBox: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"home" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidLidHomeAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidHomeAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"home" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; @@ -738,50 +749,50 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 // Work Address -- (int) getPidLidWorkAddressStreet: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidWorkAddressStreet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 2 inData: data inMemCtx: memCtx]; } -- (int) getPidLidWorkAddressCity: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidWorkAddressCity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 3 inData: data inMemCtx: memCtx]; } -- (int) getPidLidWorkAddressState: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidWorkAddressState: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 4 inData: data inMemCtx: memCtx]; } -- (int) getPidLidWorkAddressPostalCode: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidWorkAddressPostalCode: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 5 inData: data inMemCtx: memCtx]; } -- (int) getPidLidWorkAddressCountry: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidWorkAddressCountry: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 6 inData: data inMemCtx: memCtx]; } -- (int) getPidLidWorkAddressPostOfficeBox: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidWorkAddressPostOfficeBox: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"work" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidLidWorkAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidWorkAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"work" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; @@ -789,57 +800,57 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 // Mailing Address -- (int) getPidTagStreetAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagStreetAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 2 inData: data inMemCtx: memCtx]; } -- (int) getPidTagLocality: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagLocality: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 3 inData: data inMemCtx: memCtx]; } -- (int) getPidTagStateOrProvince: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagStateOrProvince: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 4 inData: data inMemCtx: memCtx]; } -- (int) getPidTagPostalCode: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPostalCode: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 5 inData: data inMemCtx: memCtx]; } -- (int) getPidTagCountry: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagCountry: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 6 inData: data inMemCtx: memCtx]; } -- (int) getPidTagPostOfficeBox: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPostOfficeBox: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"adr" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidTagPostalAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPostalAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"label" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidLidPostalAddressId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidPostalAddressId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSArray *elements; CardElement *element; @@ -869,36 +880,36 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 // Telephone Properties [MS-OXOCNTC 2.2.1.4] // ------------------------------------------------------- -- (int) getPidTagPagerTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPagerTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"pager" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidTagBusinessTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagBusinessTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"work" excluding: @"fax" atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidTagHomeTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHomeTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"home" excluding: @"fax" atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidTagPrimaryTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPrimaryTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"pref" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidTagMobileTelephoneNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMobileTelephoneNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"tel" ofType: @"cell" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; @@ -908,12 +919,12 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 // Event Properties [MS-OXOCNTC 2.2.1.5] // --------------------------------------------------------- -- (int) getPidTagBirthday: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagBirthday: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; stringValue = [[sogoObject vCard] bday]; if ([stringValue length] != 0) @@ -929,12 +940,12 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return rc; } -- (int) getPidTagWeddingAnniversary: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagWeddingAnniversary: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-anniversary"] flattenedValuesForKey: @""]; @@ -954,8 +965,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 // Professional Properties [MS-OXOCNTC 2.2.1.6] // --------------------------------------------------------- -- (int) getPidTagTitle: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagTitle: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -965,8 +976,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return MAPISTORE_SUCCESS; } -- (int) getPidTagCompanyName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagCompanyName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { CardElement *org; @@ -977,8 +988,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return MAPISTORE_SUCCESS; } -- (int) getPidTagDepartmentName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDepartmentName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { CardElement *org; @@ -989,11 +1000,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return MAPISTORE_SUCCESS; } -- (int) getPidTagOfficeLocation: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOfficeLocation: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-office"] flattenedValuesForKey: @""]; @@ -1005,11 +1016,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return rc; } -- (int) getPidTagManagerName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagManagerName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-manager"] flattenedValuesForKey: @""]; @@ -1021,11 +1032,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return rc; } -- (int) getPidTagAssistant: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAssistant: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-assistant"] flattenedValuesForKey: @""]; @@ -1037,11 +1048,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return rc; } -- (int) getPidTagProfession: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagProfession: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; stringValue = [[sogoObject vCard] role]; if (stringValue) @@ -1080,8 +1091,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 fetchedAttachments = YES; } -- (int) getPidLidHasPicture: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidHasPicture: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!fetchedAttachments) [self _fetchAttachmentParts]; @@ -1154,11 +1165,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 // Other Properties [MS-OXOCNTC 2.2.1.10] // --------------------------------------------------------- -- (int) getPidTagSpouseName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSpouseName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-spouse"] flattenedValuesForKey: @""]; @@ -1170,8 +1181,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return rc; } -- (int) getPidLidInstantMessagingAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidInstantMessagingAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -1184,11 +1195,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return MAPISTORE_SUCCESS; } -- (int) getPidLidFreeBusyLocation: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidFreeBusyLocation: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"fburl"] flattenedValuesForKey: @""]; @@ -1200,38 +1211,43 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 return rc; } -- (int) getPidTagPersonalHomePage: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPersonalHomePage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"url" ofType: @"home" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } -- (int) getPidTagBusinessHomePage: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagBusinessHomePage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getElement: @"url" ofType: @"work" excluding: nil atPos: 0 inData: data inMemCtx: memCtx]; } // --------------------------------------------------------- +// Permissions +// --------------------------------------------------------- + +- (NSString *) creator +{ + return [[[sogoObject vCard] uniqueChildWithTag: @"x-openchange-creator"] + flattenedValuesForKey: @""]; +} + +- (NSString *) owner +{ + return [self creator]; +} - (BOOL) subscriberCanReadMessage { return [[self activeUserRoles] containsObject: SOGoRole_ObjectViewer]; } -- (BOOL) subscriberCanModifyMessage -{ - NSArray *roles; - - roles = [self activeUserRoles]; - - return ((isNew - && [roles containsObject: SOGoRole_ObjectCreator]) - || (!isNew && [roles containsObject: SOGoRole_ObjectEditor])); -} - +// --------------------------------------------------------- +// Save +// --------------------------------------------------------- - (void) saveDistList:(TALLOC_CTX *) memCtx { [self warnWithFormat: @"IPM.DistList messages are ignored"]; @@ -1575,6 +1591,14 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11 if (value) [newCard setNote: value]; + /* Store the creator name for sharing purposes */ + if (isNew) + { + value = [[[self context] activeUser] login]; + [[newCard uniqueChildWithTag: @"x-openchange-creator"] + setSingleValue: value forKey: @""]; + } + // // we save the new/modified card // diff --git a/OpenChange/MAPIStoreContext.h b/OpenChange/MAPIStoreContext.h index 533d7f278..4bde9d79a 100644 --- a/OpenChange/MAPIStoreContext.h +++ b/OpenChange/MAPIStoreContext.h @@ -72,10 +72,10 @@ forUser: (NSString *) username withRole: (enum mapistore_context_role) role; -+ (int) openContext: (MAPIStoreContext **) contextPtr - withURI: (const char *) newUri - connectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct indexing_context *) indexing; ++ (enum mapistore_error) openContext: (MAPIStoreContext **) contextPtr + withURI: (const char *) newUri + connectionInfo: (struct mapistore_connection_info *) newConnInfo + andTDBIndexing: (struct indexing_context *) indexing; - (id) initFromURL: (NSURL *) newUri withConnectionInfo: (struct mapistore_connection_info *) newConnInfo @@ -91,11 +91,11 @@ // - (id) lookupObject: (NSString *) objectURLString; /* backend methods */ -- (int) getPath: (char **) path - ofFMID: (uint64_t) fmid - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getRootFolder: (MAPIStoreFolder **) folderPtr - withFID: (uint64_t) fmid; +- (enum mapistore_error) getPath: (char **) path + ofFMID: (uint64_t) fmid + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getRootFolder: (MAPIStoreFolder **) folderPtr + withFID: (uint64_t) fmid; /* util methods */ - (NSString *) extractChildNameFromURL: (NSString *) childURL diff --git a/OpenChange/MAPIStoreContext.m b/OpenChange/MAPIStoreContext.m index 9b8e0a37a..32a01e147 100644 --- a/OpenChange/MAPIStoreContext.m +++ b/OpenChange/MAPIStoreContext.m @@ -212,16 +212,16 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) return completeURL; } -+ (int) openContext: (MAPIStoreContext **) contextPtr - withURI: (const char *) newUri - connectionInfo: (struct mapistore_connection_info *) newConnInfo - andTDBIndexing: (struct indexing_context *) indexing ++ (enum mapistore_error) openContext: (MAPIStoreContext **) contextPtr + withURI: (const char *) newUri + connectionInfo: (struct mapistore_connection_info *) newConnInfo + andTDBIndexing: (struct indexing_context *) indexing { MAPIStoreContext *context; Class contextClass; NSString *module; NSURL *baseURL; - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; context = nil; @@ -338,11 +338,11 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) return activeUser; } -- (int) getPath: (char **) path - ofFMID: (uint64_t) fmid - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPath: (char **) path + ofFMID: (uint64_t) fmid + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; NSString *objectURL, *url; url = [contextUrl absoluteString]; @@ -379,8 +379,8 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) { } -- (int) getRootFolder: (MAPIStoreFolder **) folderPtr - withFID: (uint64_t) newFid +- (enum mapistore_error) getRootFolder: (MAPIStoreFolder **) folderPtr + withFID: (uint64_t) newFid { enum mapistore_error rc; MAPIStoreFolder *baseFolder; @@ -438,8 +438,16 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) mapiStoreObjectWithSOGoObject: currentFolder inContainer: nil]; [baseFolder setContext: self]; - *folderPtr = baseFolder; - rc = MAPISTORE_SUCCESS; + + if ([[userContext sogoUser] isEqual: activeUser] + || [baseFolder subscriberCanReadMessages]) + { + *folderPtr = baseFolder; + rc = MAPISTORE_SUCCESS; + } + else + rc = MAPISTORE_ERR_DENIED; + } else if ([[userContext sogoUser] isEqual: activeUser]) rc = MAPISTORE_ERR_NOT_FOUND; @@ -494,8 +502,11 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) mappingId = [mapping idFromURL: childURL]; if (mappingId == NSNotFound) { + const char *owner; + [self logWithFormat: @"No id exist yet for '%@', requesting one", childURL]; - ret = mapistore_indexing_get_new_folderID (connInfo->mstore_ctx, &mappingId); + owner = [[userContext username] UTF8String]; + ret = mapistore_indexing_get_new_folderID_as_user (connInfo->mstore_ctx, owner, &mappingId); if (ret == MAPISTORE_SUCCESS) [mapping registerURL: childURL withID: mappingId]; else @@ -506,36 +517,56 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) return mappingId; } +/* Get new change number from openchange db interface using + resource's owner user */ - (uint64_t) getNewChangeNumber { + const char *owner; + enum MAPISTATUS retval; uint64_t newVersionNumber; - if (openchangedb_get_new_changeNumber (connInfo->oc_ctx, connInfo->username, &newVersionNumber) - != MAPI_E_SUCCESS) - abort (); + owner = [[userContext username] UTF8String]; + retval = openchangedb_get_new_changeNumber (connInfo->oc_ctx, owner, &newVersionNumber); + if (retval != MAPI_E_SUCCESS) + [NSException raise: @"MAPIStoreIOException" + format: @"Impossible to get new change number for %s: %s", owner, + mapi_get_errstr (retval)]; return newVersionNumber; } +/* Get new change numbers from openchange db interface using + resource's owner user */ - (NSArray *) getNewChangeNumbers: (uint64_t) max { + const char *owner; + enum MAPISTATUS retval; TALLOC_CTX *memCtx; NSMutableArray *newChangeNumbers; uint64_t count; struct UI8Array_r *numbers; NSString *newNumber; - memCtx = talloc_zero(NULL, TALLOC_CTX); - newChangeNumbers = [NSMutableArray arrayWithCapacity: max]; + memCtx = talloc_new (NULL); + if (!memCtx) + [NSException raise: @"MAPIStoreIOException" + format: @"Not enough memory to allocate change numbers"]; + + newChangeNumbers = [NSMutableArray arrayWithCapacity: max]; + owner = [[userContext username] UTF8String]; + + retval = openchangedb_get_new_changeNumbers (connInfo->oc_ctx, memCtx, owner, max, &numbers); + if (retval != MAPI_E_SUCCESS || numbers->cValues != max) + { + talloc_free (memCtx); + [NSException raise: @"MAPIStoreIOException" + format: @"Failing to get %d new change numbers: %s", max, + mapi_get_errstr (retval)]; + } - if (openchangedb_get_new_changeNumbers (connInfo->oc_ctx, - memCtx, connInfo->username, max, &numbers) - != MAPI_E_SUCCESS || numbers->cValues != max) - abort (); for (count = 0; count < max; count++) { - newNumber - = [NSString stringWithUnsignedLongLong: numbers->lpui8[count]]; + newNumber = [NSString stringWithUnsignedLongLong: numbers->lpui8[count]]; [newChangeNumbers addObject: newNumber]; } @@ -544,29 +575,31 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri) return newChangeNumbers; } +/* Get new fmids from mapistore_indexing interface using resource's + owner user */ - (NSArray *) getNewFMIDs: (uint64_t) max { - TALLOC_CTX *memCtx; + const char *owner; + enum mapistore_error ret; NSMutableArray *newFMIDs; - uint64_t count; - struct UI8Array_r *numbers; NSString *newNumber; + uint64_t count, newFID; - memCtx = talloc_zero(NULL, TALLOC_CTX); newFMIDs = [NSMutableArray arrayWithCapacity: max]; + /* Get the resource's owner name */ + owner = [[userContext username] UTF8String]; - if (mapistore_indexing_get_new_folderIDs (connInfo->mstore_ctx, - memCtx, max, &numbers) - != MAPISTORE_SUCCESS || numbers->cValues != max) - abort (); for (count = 0; count < max; count++) { - newNumber = [NSString stringWithUnsignedLongLong: numbers->lpui8[count]]; + ret = mapistore_indexing_get_new_folderID_as_user (connInfo->mstore_ctx, owner, &newFID); + if (ret != MAPISTORE_SUCCESS) + [NSException raise: @"MAPIStoreIOException" + format: @"Impossible to get new fmid for %s", owner]; + + newNumber = [NSString stringWithUnsignedLongLong: newFID]; [newFMIDs addObject: newNumber]; } - talloc_free (memCtx); - return newFMIDs; } diff --git a/OpenChange/MAPIStoreDBFolder.h b/OpenChange/MAPIStoreDBFolder.h index 2415af934..1da4d1bd9 100644 --- a/OpenChange/MAPIStoreDBFolder.h +++ b/OpenChange/MAPIStoreDBFolder.h @@ -25,6 +25,16 @@ #import "MAPIStoreFolder.h" +extern NSString *MAPIStoreRightReadItems; +extern NSString *MAPIStoreRightCreateItems; +extern NSString *MAPIStoreRightEditOwn; +extern NSString *MAPIStoreRightEditAll; +extern NSString *MAPIStoreRightDeleteOwn; +extern NSString *MAPIStoreRightDeleteAll; +extern NSString *MAPIStoreRightCreateSubfolders; +extern NSString *MAPIStoreRightFolderOwner; +extern NSString *MAPIStoreRightFolderContact; + @interface MAPIStoreDBFolder : MAPIStoreFolder @end diff --git a/OpenChange/MAPIStoreDBFolder.m b/OpenChange/MAPIStoreDBFolder.m index a7c49b72d..4fc954112 100644 --- a/OpenChange/MAPIStoreDBFolder.m +++ b/OpenChange/MAPIStoreDBFolder.m @@ -51,16 +51,6 @@ static Class EOKeyValueQualifierK, SOGoCacheGCSFolderK, MAPIStoreDBFolderK; -static NSString *MAPIStoreRightReadItems = @"RightsReadItems"; -static NSString *MAPIStoreRightCreateItems = @"RightsCreateItems"; -static NSString *MAPIStoreRightEditOwn = @"RightsEditOwn"; -static NSString *MAPIStoreRightEditAll = @"RightsEditAll"; -static NSString *MAPIStoreRightDeleteOwn = @"RightsDeleteOwn"; -static NSString *MAPIStoreRightDeleteAll = @"RightsDeleteAll"; -static NSString *MAPIStoreRightCreateSubfolders = @"RightsCreateSubfolders"; -static NSString *MAPIStoreRightFolderOwner = @"RightsFolderOwner"; -static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; - @implementation MAPIStoreDBFolder + (void) initialize @@ -355,8 +345,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; - (BOOL) subscriberCanModifyMessages { - return ([self _testRoleForActiveUser: MAPIStoreRightEditAll] - || [self _testRoleForActiveUser: MAPIStoreRightEditOwn]); + return [self _testRoleForActiveUser: MAPIStoreRightEditAll]; } - (BOOL) subscriberCanReadMessages @@ -377,8 +366,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; - (BOOL) subscriberCanDeleteMessages { - return ([self _testRoleForActiveUser: MAPIStoreRightDeleteAll] - || [self _testRoleForActiveUser: MAPIStoreRightDeleteOwn]); + return [self _testRoleForActiveUser: MAPIStoreRightDeleteAll]; } - (BOOL) subscriberCanCreateSubFolders diff --git a/OpenChange/MAPIStoreDBMessage.m b/OpenChange/MAPIStoreDBMessage.m index 98d357bf7..ca2b772d0 100644 --- a/OpenChange/MAPIStoreDBMessage.m +++ b/OpenChange/MAPIStoreDBMessage.m @@ -27,6 +27,9 @@ #import #import #import +#import +#import +#import #import "MAPIStoreContext.h" #import "MAPIStorePropertySelectors.h" @@ -282,7 +285,7 @@ // We might get there if for some reasons, all classes weren't able // to tell us the message class. // -- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; @@ -291,10 +294,10 @@ return MAPISTORE_SUCCESS; } -- (int) getProperties: (struct mapistore_property_data *) data - withTags: (enum MAPITAGS *) tags - andCount: (uint16_t) columnCount - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getProperties: (struct mapistore_property_data *) data + withTags: (enum MAPITAGS *) tags + andCount: (uint16_t) columnCount + inMemCtx: (TALLOC_CTX *) memCtx { [sogoObject reloadIfNeeded]; @@ -304,12 +307,12 @@ inMemCtx: memCtx]; } -- (int) getProperty: (void **) data - withTag: (enum MAPITAGS) propTag - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getProperty: (void **) data + withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { id value; - int rc; + enum mapistore_error rc; value = [properties objectForKey: MAPIPropertyKey (propTag)]; if (value) @@ -346,6 +349,16 @@ /* Update PredecessorChangeList accordingly */ [self _updatePredecessorChangeList]; + if (isNew) + { + NSString *lastModifierName; + + lastModifierName = (NSString *)[properties objectForKey: MAPIPropertyKey (PidTagLastModifierName)]; + if ([lastModifierName length] > 0) + [properties setObject: lastModifierName + forKey: MAPIPropertyKey (PidTagCreatorName)]; + } + // [self logWithFormat: @"Saving %@", [self description]]; // [self logWithFormat: @"%d props in dict", [properties count]]; @@ -364,20 +377,77 @@ return [msgClass isEqualToString: @"IPM.Microsoft.ScheduleData.FreeBusy"]; } -/* TODO: differentiate between the "Own" and "All" cases */ +//----------------------------- +// Permissions +//----------------------------- + - (BOOL) subscriberCanReadMessage { return [(MAPIStoreFolder *) container subscriberCanReadMessages]; - // || [self _messageIsFreeBusy]); +} + +- (SOGoUser *) _ownerUser +{ + NSString *ownerName; + SOGoUser *ownerUser = nil; + + ownerName = [properties objectForKey: MAPIPropertyKey (PidTagCreatorName)]; + if ([ownerName length] > 0) + ownerUser = [SOGoUser userWithLogin: ownerName]; + + return ownerUser; +} + +- (NSArray *) activeUserRoles +{ + /* Override because of this exception: NSInvalidArgumentException, + reason: [SOGoMAPIDBMessage-aclsForUser:] should be overridden by + subclass */ + if (!activeUserRoles) + { + SOGoUser *activeUser; + + activeUser = [[self context] activeUser]; + activeUserRoles = [[container aclFolder] aclsForUser: [activeUser login]]; + [activeUserRoles retain]; + } + + return activeUserRoles; } - (BOOL) subscriberCanModifyMessage { - return ((isNew - && [(MAPIStoreFolder *) container subscriberCanCreateMessages]) - || (!isNew - && [(MAPIStoreFolder *) container subscriberCanModifyMessages])); - // || [self _messageIsFreeBusy]); + BOOL rc; + NSArray *roles; + + roles = [self activeUserRoles]; + + if (isNew) + rc = [(MAPIStoreFolder *) container subscriberCanCreateMessages]; + else + rc = [roles containsObject: MAPIStoreRightEditAll]; + + /* Check if the message is owned and it has permission to edit it */ + if (!rc && [roles containsObject: MAPIStoreRightEditOwn]) + rc = [[[container context] activeUser] isEqual: [self _ownerUser]]; + + return rc; +} + +- (BOOL) subscriberCanDeleteMessage +{ + BOOL rc; + NSArray *roles; + + roles = [self activeUserRoles]; + + rc = [roles containsObject: MAPIStoreRightDeleteAll]; + + /* Check if the message is owned and it has permission to delete it */ + if (!rc && [roles containsObject: MAPIStoreRightDeleteOwn]) + rc = [[[container context] activeUser] isEqual: [self _ownerUser]]; + + return rc; } - (NSDate *) creationTime diff --git a/OpenChange/MAPIStoreEmbeddedMessage.m b/OpenChange/MAPIStoreEmbeddedMessage.m index f609726db..ff5f8b825 100644 --- a/OpenChange/MAPIStoreEmbeddedMessage.m +++ b/OpenChange/MAPIStoreEmbeddedMessage.m @@ -56,81 +56,81 @@ static Class MAPIStoreAttachmentK; idForObjectWithKey: objectKey]; } -- (int) getPidTagAccessLevel: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAccessLevel: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } /* disabled properties */ -- (int) getPidTagFolderId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagFolderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagChangeKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagSourceKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagParentSourceKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagParentSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagChangeNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagChangeNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagInstID: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagInstID: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagInstanceNum: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagInstanceNum: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagRowType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagRowType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagDepth: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDepth: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagIconIndex: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagIconIndex: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagGenerateExchangeViews: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagGenerateExchangeViews: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagOriginalMessageClass: (void **) dataa - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalMessageClass: (void **) dataa + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } diff --git a/OpenChange/MAPIStoreFAIMessage.m b/OpenChange/MAPIStoreFAIMessage.m index bfa093ff7..1c0f1b9a0 100644 --- a/OpenChange/MAPIStoreFAIMessage.m +++ b/OpenChange/MAPIStoreFAIMessage.m @@ -24,6 +24,7 @@ #import "MAPIStoreActiveTables.h" #import "MAPIStoreContext.h" +#import "MAPIStoreFolder.h" #import "MAPIStoreUserContext.h" #import "NSObject+MAPIStore.h" @@ -45,8 +46,8 @@ andType: MAPISTORE_FAI_TABLE]; } -- (int) getPidTagAssociated: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAssociated: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } @@ -69,7 +70,7 @@ - (BOOL) subscriberCanReadMessage { - return NO; + return [(MAPIStoreFolder *)container subscriberCanReadMessages]; } - (BOOL) subscriberCanModifyMessage diff --git a/OpenChange/MAPIStoreFolder.h b/OpenChange/MAPIStoreFolder.h index 3f3bfb204..46e13d235 100644 --- a/OpenChange/MAPIStoreFolder.h +++ b/OpenChange/MAPIStoreFolder.h @@ -22,6 +22,7 @@ #define MAPISTOREFOLDER_H #import +#import @class NSArray; @class NSMutableArray; @@ -41,6 +42,20 @@ #import "MAPIStoreSOGoObject.h" +/* MAPI Permissions + + This set has only sogo-openchange library scope + */ +extern NSString *MAPIStoreRightReadItems; +extern NSString *MAPIStoreRightCreateItems; +extern NSString *MAPIStoreRightEditOwn; +extern NSString *MAPIStoreRightEditAll; +extern NSString *MAPIStoreRightDeleteOwn; +extern NSString *MAPIStoreRightDeleteAll; +extern NSString *MAPIStoreRightCreateSubfolders; +extern NSString *MAPIStoreRightFolderOwner; +extern NSString *MAPIStoreRightFolderContact; + @interface MAPIStoreFolder : MAPIStoreSOGoObject { MAPIStoreContext *context; @@ -74,6 +89,8 @@ - (MAPIStorePermissionsTable *) permissionsTable; - (NSArray *) permissionEntries; +- (NSArray *) expandRoles: (NSArray *) roles; + /* message objects and tables */ - (id) lookupMessage: (NSString *) messageKey; - (NSArray *) messageKeys; @@ -96,34 +113,34 @@ /* backend interface */ -- (int) openFolder: (MAPIStoreFolder **) childFolderPtr - withFID: (uint64_t) fid; -- (int) createFolder: (MAPIStoreFolder **) childFolderPtr - withRow: (struct SRow *) aRow - andFID: (uint64_t) fid; -- (int) deleteFolder; -- (int) getChildCount: (uint32_t *) rowCount - ofTableType: (enum mapistore_table_type) tableType; +- (enum mapistore_error) openFolder: (MAPIStoreFolder **) childFolderPtr + withFID: (uint64_t) fid; +- (enum mapistore_error) createFolder: (MAPIStoreFolder **) childFolderPtr + withRow: (struct SRow *) aRow + andFID: (uint64_t) fid; +- (enum mapistore_error) deleteFolder; +- (enum mapistore_error) getChildCount: (uint32_t *) rowCount + ofTableType: (enum mapistore_table_type) tableType; -- (int) createMessage: (MAPIStoreMessage **) messagePtr - withMID: (uint64_t) mid - isAssociated: (BOOL) isAssociated; +- (enum mapistore_error) createMessage: (MAPIStoreMessage **) messagePtr + withMID: (uint64_t) mid + isAssociated: (BOOL) isAssociated; -- (int) openMessage: (MAPIStoreMessage **) messagePtr - withMID: (uint64_t) mid - forWriting: (BOOL) readWrite - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) deleteMessageWithMID: (uint64_t) mid - andFlags: (uint8_t) flags; +- (enum mapistore_error) openMessage: (MAPIStoreMessage **) messagePtr + withMID: (uint64_t) mid + forWriting: (BOOL) readWrite + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) deleteMessageWithMID: (uint64_t) mid + andFlags: (uint8_t) flags; -- (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids - andCount: (uint32_t) count - fromFolder: (MAPIStoreFolder *) sourceFolder - withMIDs: (uint64_t *) targetMids - andChangeKeys: (struct Binary_r **) targetChangeKeys - andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists - wantCopy: (uint8_t) want_copy - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) moveCopyMessagesWithMIDs: (uint64_t *) srcMids + andCount: (uint32_t) count + fromFolder: (MAPIStoreFolder *) sourceFolder + withMIDs: (uint64_t *) targetMids + andChangeKeys: (struct Binary_r **) targetChangeKeys + andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists + wantCopy: (uint8_t) want_copy + inMemCtx: (TALLOC_CTX *) memCtx; - (enum mapistore_error) moveCopyToFolder: (MAPIStoreFolder *) targetFolder withNewName: (NSString *) newFolderName @@ -131,20 +148,20 @@ isRecursive: (BOOL) isRecursive inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr - andCN: (uint64_t *) cnPtr - fromChangeNumber: (uint64_t) changeNum - inTableType: (enum mapistore_table_type) tableType - inMemCtx: (TALLOC_CTX *) mem_ctx; +- (enum mapistore_error) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr + andCN: (uint64_t *) cnPtr + fromChangeNumber: (uint64_t) changeNum + inTableType: (enum mapistore_table_type) tableType + inMemCtx: (TALLOC_CTX *) mem_ctx; -- (int) getTable: (MAPIStoreTable **) tablePtr - andRowCount: (uint32_t *) count - tableType: (enum mapistore_table_type) tableType - andHandleId: (uint32_t) handleId; +- (enum mapistore_error) getTable: (MAPIStoreTable **) tablePtr + andRowCount: (uint32_t *) count + tableType: (enum mapistore_table_type) tableType + andHandleId: (uint32_t) handleId; -- (int) modifyPermissions: (struct PermissionData *) permissions - withCount: (uint16_t) pcount - andFlags: (int8_t) flags; +- (enum mapistore_error) modifyPermissions: (struct PermissionData *) permissions + withCount: (uint16_t) pcount + andFlags: (int8_t) flags; - (enum mapistore_error) preloadMessageBodiesWithMIDs: (const struct UI8Array_r *) mids ofTableType: (enum mapistore_table_type) tableType; diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index c111f2305..43efcaff9 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -65,6 +65,17 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStoreFolderTableK; +/* MAPI permissions */ +NSString *MAPIStoreRightReadItems = @"RightsReadItems"; +NSString *MAPIStoreRightCreateItems = @"RightsCreateItems"; +NSString *MAPIStoreRightEditOwn = @"RightsEditOwn"; +NSString *MAPIStoreRightEditAll = @"RightsEditAll"; +NSString *MAPIStoreRightDeleteOwn = @"RightsDeleteOwn"; +NSString *MAPIStoreRightDeleteAll = @"RightsDeleteAll"; +NSString *MAPIStoreRightCreateSubfolders = @"RightsCreateSubfolders"; +NSString *MAPIStoreRightFolderOwner = @"RightsFolderOwner"; +NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; + @implementation MAPIStoreFolder + (void) initialize @@ -365,10 +376,10 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return foundObject; } -- (int) openFolder: (MAPIStoreFolder **) childFolderPtr - withFID: (uint64_t) fid +- (enum mapistore_error) openFolder: (MAPIStoreFolder **) childFolderPtr + withFID: (uint64_t) fid { - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; MAPIStoreFolder *childFolder; MAPIStoreMapping *mapping; NSString *childURL; @@ -390,9 +401,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) createFolder: (MAPIStoreFolder **) childFolderPtr - withRow: (struct SRow *) aRow - andFID: (uint64_t) fid +- (enum mapistore_error) createFolder: (MAPIStoreFolder **) childFolderPtr + withRow: (struct SRow *) aRow + andFID: (uint64_t) fid { BOOL mapped; enum mapistore_error rc = MAPISTORE_SUCCESS; @@ -447,7 +458,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) deleteFolder +- (enum mapistore_error) deleteFolder { // TODO: raise exception in case underlying delete fails? // [propsMessage delete]; @@ -458,11 +469,11 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return MAPISTORE_SUCCESS; } -- (int) getChildCount: (uint32_t *) rowCount - ofTableType: (enum mapistore_table_type) tableType +- (enum mapistore_error) getChildCount: (uint32_t *) rowCount + ofTableType: (enum mapistore_table_type) tableType { NSArray *keys; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; //[self logWithFormat: @"METHOD '%s' (%d) -- tableType: %d", //__FUNCTION__, __LINE__, tableType]; @@ -483,16 +494,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) openMessage: (MAPIStoreMessage **) messagePtr - withMID: (uint64_t) mid - forWriting: (BOOL) readWrite - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) openMessage: (MAPIStoreMessage **) messagePtr + withMID: (uint64_t) mid + forWriting: (BOOL) readWrite + inMemCtx: (TALLOC_CTX *) memCtx; { NSString *messageURL; MAPIStoreMapping *mapping; MAPIStoreMessage *message; SOGoUser *ownerUser; - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; mapping = [self mapping]; messageURL = [mapping urlFromID: mid]; @@ -523,9 +534,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) createMessage: (MAPIStoreMessage **) messagePtr - withMID: (uint64_t) mid - isAssociated: (BOOL) isAssociated +- (enum mapistore_error) createMessage: (MAPIStoreMessage **) messagePtr + withMID: (uint64_t) mid + isAssociated: (BOOL) isAssociated { enum mapistore_error rc; MAPIStoreMessage *message; @@ -570,8 +581,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) deleteMessageWithMID: (uint64_t) mid - andFlags: (uint8_t) flags +- (enum mapistore_error) deleteMessageWithMID: (uint64_t) mid + andFlags: (uint8_t) flags { NSString *childURL; MAPIStoreMapping *mapping; @@ -580,7 +591,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe NSUInteger count, max; id msgObject; SOGoUser *ownerUser; - int rc; + enum mapistore_error rc; /* flags that control the behaviour of the operation (MAPISTORE_SOFT_DELETE or MAPISTORE_PERMANENT_DELETE) */ @@ -597,7 +608,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe if ([[context activeUser] isEqual: ownerUser] || (![message isKindOfClass: MAPIStoreFAIMessageK] - && [self subscriberCanDeleteMessages])) + && ([self subscriberCanDeleteMessages] || [message subscriberCanDeleteMessage]))) { /* we ensure the table caches are loaded so that old and new state can be compared */ @@ -638,15 +649,15 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe } // private method -- (int) _moveCopyMessageWithMID: (uint64_t) srcMid - fromFolder: (MAPIStoreFolder *) sourceFolder - withMID: (uint64_t) targetMid - andChangeKey: (struct Binary_r *) targetChangeKey - andPredecessorChangeList: (struct Binary_r *) targetPredecessorChangeList - wantCopy: (uint8_t) wantCopy - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _moveCopyMessageWithMID: (uint64_t) srcMid + fromFolder: (MAPIStoreFolder *) sourceFolder + withMID: (uint64_t) targetMid + andChangeKey: (struct Binary_r *) targetChangeKey + andPredecessorChangeList: (struct Binary_r *) targetPredecessorChangeList + wantCopy: (uint8_t) wantCopy + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; MAPIStoreMessage *sourceMsg, *destMsg; //TALLOC_CTX *memCtx; struct SRow aRow; @@ -695,16 +706,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids - andCount: (uint32_t) midCount - fromFolder: (MAPIStoreFolder *) sourceFolder - withMIDs: (uint64_t *) targetMids - andChangeKeys: (struct Binary_r **) targetChangeKeys - andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists - wantCopy: (uint8_t) wantCopy - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) moveCopyMessagesWithMIDs: (uint64_t *) srcMids + andCount: (uint32_t) midCount + fromFolder: (MAPIStoreFolder *) sourceFolder + withMIDs: (uint64_t *) targetMids + andChangeKeys: (struct Binary_r **) targetChangeKeys + andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists + wantCopy: (uint8_t) wantCopy + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSUInteger count; NSMutableArray *oldMessageURLs; NSString *oldMessageURL; @@ -908,6 +919,11 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return nil; } +- (NSArray *) expandRoles: (NSArray *) roles +{ + return roles; +} + - (void) _modifyPermissionEntryForUser: (NSString *) user withRoles: (NSArray *) roles isAddition: (BOOL) isAddition @@ -957,13 +973,13 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe withIDs: newIDs]; } -- (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr - andCN: (uint64_t *) cnPtr - fromChangeNumber: (uint64_t) changeNum - inTableType: (enum mapistore_table_type) tableType - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr + andCN: (uint64_t *) cnPtr + fromChangeNumber: (uint64_t) changeNum + inTableType: (enum mapistore_table_type) tableType + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; NSString *baseURL, *format, *url; NSArray *keys; NSNumber *cnNbr; @@ -1016,14 +1032,15 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) getTable: (MAPIStoreTable **) tablePtr - andRowCount: (uint32_t *) countPtr - tableType: (enum mapistore_table_type) tableType - andHandleId: (uint32_t) handleId +- (enum mapistore_error) getTable: (MAPIStoreTable **) tablePtr + andRowCount: (uint32_t *) countPtr + tableType: (enum mapistore_table_type) tableType + andHandleId: (uint32_t) handleId { - int rc = MAPISTORE_SUCCESS; + BOOL access; + enum mapistore_error rc = MAPISTORE_SUCCESS; MAPIStoreTable *table; - SOGoUser *ownerUser; + SOGoUser *activeUser, *ownerUser; if (tableType == MAPISTORE_MESSAGE_TABLE) table = [self messageTable]; @@ -1034,8 +1051,20 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe else if (tableType == MAPISTORE_PERMISSIONS_TABLE) { ownerUser = [[self userContext] sogoUser]; - if ([[context activeUser] isEqual: ownerUser]) - table = [self permissionsTable]; + activeUser = [context activeUser]; + access = [activeUser isEqual: ownerUser]; + if (!access) + { + NSArray *roles; + + roles = [[self aclFolder] aclsForUser: [activeUser login]]; + roles = [self expandRoles: roles]; // Not required here + /* Check FolderVisible right to return the table */ + access = ([self exchangeRightsForRoles: roles] & RoleNone) != 0; + } + + if (access) + table = [self permissionsTable]; else rc = MAPISTORE_ERR_DENIED; } @@ -1208,16 +1237,16 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe // folderKeys = nil; } -- (int) getPidTagParentFolderId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagParentFolderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } -- (int) getPidTagFolderId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagFolderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [self objectId]); @@ -1234,8 +1263,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe 0x00000010 Create Contents Table 0x00000020 Create Associated Contents Table */ -- (int) getPidTagAccess: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAccess: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; SOGoUser *ownerUser; @@ -1263,103 +1292,107 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return MAPISTORE_SUCCESS; } -- (int) getPidTagRights: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagRights: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t rights = 0; - SOGoUser *ownerUser; - BOOL userIsOwner; + SOGoUser *activeUser, *ownerUser; ownerUser = [[self userContext] sogoUser]; + activeUser = [context activeUser]; - userIsOwner = [[context activeUser] isEqual: ownerUser]; - if (userIsOwner || [self subscriberCanReadMessages]) - rights |= RightsReadItems; - if (userIsOwner || [self subscriberCanCreateMessages]) - rights |= RightsCreateItems; - if (userIsOwner || [self subscriberCanModifyMessages]) - rights |= RightsEditOwn | RightsEditAll; - if (userIsOwner || [self subscriberCanDeleteMessages]) - rights |= RightsDeleteOwn | RightsDeleteAll; - if ((userIsOwner || [self subscriberCanCreateSubFolders]) - && [self supportsSubFolders]) - rights |= RightsCreateSubfolders; - if (userIsOwner) - rights |= RightsFolderOwner | RightsFolderContact; + if ([activeUser isEqual: ownerUser]) + { + rights = RightsReadItems | RightsCreateItems | RightsEditOwn | RightsEditAll + | RightsDeleteOwn | RightsDeleteAll | RightsFolderOwner | RightsFolderContact | RoleNone; + if ([self supportsSubFolders]) + rights |= RightsCreateSubfolders; + } + else + { + NSArray *roles; + + roles = [[self aclFolder] aclsForUser: [activeUser login]]; + roles = [self expandRoles: roles]; + rights = [self exchangeRightsForRoles: roles]; + /* FreeBusySimple and FreeBusyDetailed does not apply here + [MS-OXCFOLD] Section 2.2.2.2.2.8 */ + rights &= ~RightsFreeBusySimple & ~RightsFreeBusyDetailed; + } *data = MAPILongValue (memCtx, rights); return MAPISTORE_SUCCESS; } -- (int) getPidTagAccessControlListData: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAccessControlListData: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[NSData data] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagAttributeHidden: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttributeHidden: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagAttributeSystem: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttributeSystem: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagAttributeReadOnly: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttributeReadOnly: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagSubfolders: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSubfolders: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [self supportsSubFolders] && [[self folderKeys] count] > 0); return MAPISTORE_SUCCESS; } -- (int) getPidTagFolderChildCount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagFolderChildCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self folderKeys] count]); return MAPISTORE_SUCCESS; } -- (int) getPidTagContentCount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagContentCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self messageKeys] count]); return MAPISTORE_SUCCESS; } -- (int) getPidTagContentUnreadCount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagContentUnreadCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } -- (int) getPidTagAssociatedContentCount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAssociatedContentCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self faiMessageKeys] count]); return MAPISTORE_SUCCESS; } -- (int) getPidTagDeletedCountTotal: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDeletedCountTotal: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* TODO */ *data = MAPILongValue (memCtx, 0); @@ -1367,10 +1400,10 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return MAPISTORE_SUCCESS; } -- (int) getPidTagLocalCommitTimeMax: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagLocalCommitTimeMax: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSDate *date; date = [self lastMessageModificationTime]; @@ -1382,18 +1415,18 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return rc; } -- (int) getPidTagDefaultPostMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getProperties: (struct mapistore_property_data *) data - withTags: (enum MAPITAGS *) tags - andCount: (uint16_t) columnCount - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getProperties: (struct mapistore_property_data *) data + withTags: (enum MAPITAGS *) tags + andCount: (uint16_t) columnCount + inMemCtx: (TALLOC_CTX *) memCtx { [dbFolder reloadIfNeeded]; @@ -1403,11 +1436,11 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe inMemCtx: memCtx]; } -- (int) getProperty: (void **) data - withTag: (enum MAPITAGS) propTag - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getProperty: (void **) data + withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; id value; value = [properties objectForKey: MAPIPropertyKey (propTag)]; @@ -1614,9 +1647,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe [users release]; } -- (int) modifyPermissions: (struct PermissionData *) permissions - withCount: (uint16_t) pcount - andFlags: (int8_t) flags +- (enum mapistore_error) modifyPermissions: (struct PermissionData *) permissions + withCount: (uint16_t) pcount + andFlags: (int8_t) flags { NSUInteger count, propCount; struct PermissionData *currentPermission; @@ -1626,6 +1659,22 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe NSArray *permissionRoles; BOOL reset, isAdd = NO, isDelete = NO, isModify = NO; SOGoFolder *aclFolder; + SOGoUser *activeUser, *ownerUser; + + /* Check if we have permissions to modify the permissions. + See [MS-OXCPERM] Section 3.2.5.2 for details */ + ownerUser = [[self userContext] sogoUser]; + activeUser = [context activeUser]; + if (![activeUser isEqual: ownerUser]) + { + /* Check if we have FolderOwner right */ + NSArray *roles; + + roles = [[self aclFolder] aclsForUser: [activeUser login]]; + roles = [self expandRoles: roles]; // Not required + if (([self exchangeRightsForRoles: roles] & RightsFolderOwner) == 0) + return MAPISTORE_ERR_DENIED; + } aclFolder = [self aclFolder]; diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index 336474675..9b269df35 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -86,9 +86,9 @@ static Class NSNumberK; [super dealloc]; } -- (int) deleteFolder +- (enum mapistore_error) deleteFolder { - int rc; + enum mapistore_error rc; NSException *error; NSString *name; @@ -138,8 +138,8 @@ static Class NSNumberK; [sogoObject renameTo: newDisplayName]; } -- (int) getPidTagDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *displayName; Class cClass; @@ -859,6 +859,7 @@ static Class NSNumberK; woContext = [[self userContext] woContext]; activeUserRoles = [activeUser rolesForObject: sogoObject inContext: woContext]; + activeUserRoles = [self expandRoles: activeUserRoles]; [activeUserRoles retain]; } diff --git a/OpenChange/MAPIStoreGCSMessage.h b/OpenChange/MAPIStoreGCSMessage.h index cac182874..2cfd480d0 100644 --- a/OpenChange/MAPIStoreGCSMessage.h +++ b/OpenChange/MAPIStoreGCSMessage.h @@ -23,6 +23,8 @@ #ifndef MAPISTOREGCSMESSAGE_H #define MAPISTOREGCSMESSAGE_H +#import + #import "MAPIStoreMessage.h" @interface MAPIStoreGCSMessage : MAPIStoreMessage @@ -30,6 +32,11 @@ } /* subclass helpers */ + +/* Return the message original creator */ +- (NSString *) creator; +- (NSString *) owner; +- (SOGoUser *) ownerUser; - (void) updateVersions; @end diff --git a/OpenChange/MAPIStoreGCSMessage.m b/OpenChange/MAPIStoreGCSMessage.m index 58b4a9ca2..e1792fbdf 100644 --- a/OpenChange/MAPIStoreGCSMessage.m +++ b/OpenChange/MAPIStoreGCSMessage.m @@ -20,10 +20,12 @@ * Boston, MA 02111-1307, USA. */ +#import #import #import #import #import +#import #import #import #import @@ -35,6 +37,7 @@ #import "MAPIStoreTypes.h" #import "MAPIStoreUserContext.h" #import "NSData+MAPIStore.h" +#import "NSString+MAPIStore.h" #import "MAPIStoreGCSMessage.h" @@ -54,76 +57,28 @@ return [sogoObject lastModified]; } -- (int) getPidTagAccess: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagCreatorName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - MAPIStoreContext *context; - WOContext *woContext; - SoSecurityManager *sm; - MAPIStoreUserContext *userContext; - uint32_t access; + enum mapistore_error rc; + NSString *creator; - context = [self context]; - userContext = [self userContext]; - if ([[context activeUser] isEqual: [userContext sogoUser]]) - access = 0x03; - else + creator = [self creator]; + if (creator) { - sm = [SoSecurityManager sharedSecurityManager]; - woContext = [userContext woContext]; - - access = 0; - if (![sm validatePermission: SoPerm_ChangeImagesAndFiles - onObject: sogoObject - inContext: woContext]) - access |= 1; - if (![sm validatePermission: SoPerm_AccessContentsInformation - onObject: sogoObject - inContext: woContext]) - access |= 2; - if (![sm validatePermission: SOGoPerm_DeleteObject - onObject: sogoObject - inContext: woContext]) - access |= 4; + *data = [creator asUnicodeInMemCtx: memCtx]; + rc = MAPISTORE_SUCCESS; } - *data = MAPILongValue (memCtx, access); + else + rc = MAPISTORE_ERR_NOT_FOUND; - return MAPISTORE_SUCCESS; + return rc; } -- (int) getPidTagAccessLevel: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - MAPIStoreContext *context; - MAPIStoreUserContext *userContext; - WOContext *woContext; - SoSecurityManager *sm; - uint32_t accessLvl; - - context = [self context]; - userContext = [self userContext]; - if ([[context activeUser] isEqual: [userContext sogoUser]]) - accessLvl = 1; - else - { - sm = [SoSecurityManager sharedSecurityManager]; - woContext = [userContext woContext]; - if (![sm validatePermission: SoPerm_ChangeImagesAndFiles - onObject: sogoObject - inContext: woContext]) - accessLvl = 1; - else - accessLvl = 0; - } - *data = MAPILongValue (memCtx, accessLvl); - - return MAPISTORE_SUCCESS; -} - -- (int) getPidTagChangeKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSData *changeKey; MAPIStoreGCSFolder *parentFolder; NSString *nameInContainer; @@ -155,10 +110,10 @@ return rc; } -- (int) getPidTagPredecessorChangeList: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPredecessorChangeList: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSData *changeList; MAPIStoreGCSFolder *parentFolder; @@ -241,4 +196,69 @@ andPredecessorChangeList: predecessorChangeList]; } +//---------------------- +// Sharing +//---------------------- + +- (NSString *) creator +{ + return [self owner]; +} + +- (NSString *) owner +{ + return [sogoObject ownerInContext: nil]; +} + +- (SOGoUser *) ownerUser +{ + NSString *ownerName; + SOGoUser *owner = nil; + + ownerName = [self owner]; + if ([ownerName length] != 0) + owner = [SOGoUser userWithLogin: ownerName]; + + return owner; +} + +- (BOOL) subscriberCanModifyMessage +{ + BOOL rc; + NSArray *roles; + + roles = [self activeUserRoles]; + + if (isNew) + rc = [roles containsObject: SOGoRole_ObjectCreator]; + else + rc = [roles containsObject: SOGoRole_ObjectEditor]; + + /* Check if the message is owned and it has permission to edit it */ + if (!rc && [roles containsObject: MAPIStoreRightEditOwn]) + rc = [[[container context] activeUser] isEqual: [self ownerUser]]; + + return rc; +} + +- (BOOL) subscriberCanDeleteMessage +{ + BOOL rc; + NSArray *roles; + + roles = [self activeUserRoles]; + rc = [roles containsObject: SOGoRole_ObjectEraser]; + + /* Check if the message is owned and it has permission to delete it */ + if (!rc && [roles containsObject: MAPIStoreRightDeleteOwn]) + { + NSString *currentUser; + + currentUser = [[container context] activeUser]; + rc = [currentUser isEqual: [self ownerUser]]; + } + + return rc; +} + @end diff --git a/OpenChange/MAPIStoreMailAttachment.m b/OpenChange/MAPIStoreMailAttachment.m index 575808f39..17520202b 100644 --- a/OpenChange/MAPIStoreMailAttachment.m +++ b/OpenChange/MAPIStoreMailAttachment.m @@ -76,24 +76,24 @@ ASSIGN (bodyPart, newBodyPart); } -- (int) getPidTagAttachMethod: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachMethod: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000001); // afByValue return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachTag: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachTag: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self mimeAttachTag] asBinaryInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachSize: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachSize: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -103,8 +103,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagRecordKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) 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, @@ -121,16 +121,16 @@ return [bodyInfo filename]; } -- (int) getPidTagAttachLongFilename: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachLongFilename: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self _fileName] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachFilename: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachFilename: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *fileName, *baseName, *ext; @@ -149,8 +149,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *fileName; @@ -165,8 +165,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachContentId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachContentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[bodyInfo objectForKey: @"bodyId"] asUnicodeInMemCtx: memCtx]; @@ -174,8 +174,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachMimeTag: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachMimeTag: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *mimeTag, *fileName; @@ -193,8 +193,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagAttachDataBinary: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAttachDataBinary: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[bodyPart fetchBLOBWithPeek: YES] asBinaryInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 6e87d4ecd..ee2ff7d61 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -208,9 +208,9 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; return rc; } -- (int) deleteFolder +- (enum mapistore_error) deleteFolder { - int rc; + enum mapistore_error rc; NSException *error; NSString *name; @@ -234,8 +234,8 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; return (rc == MAPISTORE_SUCCESS) ? [super deleteFolder] : rc; } -- (int) getPidTagContentUnreadCount: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagContentUnreadCount: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { EOQualifier *searchQualifier; uint32_t longValue; @@ -250,8 +250,8 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; return MAPISTORE_SUCCESS; } -- (int) getPidTagContainerClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagContainerClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPF.Note" asUnicodeInMemCtx: memCtx]; @@ -1363,15 +1363,14 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) // Move (or eventually copy) the mails identified by // "srcMids" from the source folder into this folder. // -- (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids - andCount: (uint32_t) midCount - fromFolder: (MAPIStoreFolder *) sourceFolder - withMIDs: (uint64_t *) targetMids - andChangeKeys: (struct Binary_r **) targetChangeKeys - andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists - wantCopy: (uint8_t) wantCopy - inMemCtx: (TALLOC_CTX *) memCtx - +- (enum mapistore_error) moveCopyMessagesWithMIDs: (uint64_t *) srcMids + andCount: (uint32_t) midCount + fromFolder: (MAPIStoreFolder *) sourceFolder + withMIDs: (uint64_t *) targetMids + andChangeKeys: (struct Binary_r **) targetChangeKeys + andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists + wantCopy: (uint8_t) wantCopy + inMemCtx: (TALLOC_CTX *) memCtx { NGImap4Connection *connection; NGImap4Client *client; @@ -1657,7 +1656,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) - (id) lookupMessage: (NSString *) messageKey { MAPIStoreMailMessage *message; - NSData *rawBodyData; + NSArray *rawBodyData; message = [super lookupMessage: messageKey]; if (message) @@ -1731,73 +1730,31 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) - (enum mapistore_error) preloadMessageBodiesWithKeys: (NSArray *) keys ofTableType: (enum mapistore_table_type) tableType { + NSEnumerator *enumerator; + NSUInteger max; + NSString *messageKey; MAPIStoreMailMessage *message; - NSMutableSet *bodyPartKeys; - NSMutableDictionary *keyAssoc; - NSDictionary *response; - NSUInteger count, max; - NSString *messageKey, *messageUid, *bodyPartKey; - NGImap4Client *client; - NSArray *fetch; - NSData *bodyContent; + NSArray* bodyContent; - if (tableType == MAPISTORE_MESSAGE_TABLE) + if (tableType != MAPISTORE_MESSAGE_TABLE) + return MAPISTORE_SUCCESS; + + [bodyData removeAllObjects]; + + max = [keys count]; + if (max == 0) + return MAPISTORE_SUCCESS; + + enumerator = [keys objectEnumerator]; + while ((messageKey = [enumerator nextObject])) { - [bodyData removeAllObjects]; - max = [keys count]; - - if (max > 0) + message = [self lookupMessage: messageKey]; + if (message) { - bodyPartKeys = [NSMutableSet setWithCapacity: max]; - - keyAssoc = [NSMutableDictionary dictionaryWithCapacity: max]; - for (count = 0; count < max; count++) + bodyContent = [message getBodyContent]; + if (bodyContent) { - messageKey = [keys objectAtIndex: count]; - message = [self lookupMessage: messageKey]; - if (message) - { - bodyPartKey = [message bodyContentPartKey]; - if (bodyPartKey) - { - [bodyPartKeys addObject: bodyPartKey]; - messageUid = [self messageUIDFromMessageKey: messageKey]; - /* If the bodyPartKey include peek, remove it as it is not returned - as key in the IMAP server response. - - IMAP conversation example: - a4 UID FETCH 1 (UID BODY.PEEK[text]) - * 1 FETCH (UID 1 BODY[TEXT] {1677} - */ - bodyPartKey = [bodyPartKey stringByReplacingOccurrencesOfString: @"body.peek" - withString: @"body"]; - [keyAssoc setObject: bodyPartKey forKey: messageUid]; - } - } - } - - client = [[(SOGoMailFolder *) sogoObject imap4Connection] client]; - [client select: [sogoObject absoluteImap4Name]]; - response = [client fetchUids: [keyAssoc allKeys] - parts: [bodyPartKeys allObjects]]; - fetch = [response objectForKey: @"fetch"]; - max = [fetch count]; - for (count = 0; count < max; count++) - { - response = [fetch objectAtIndex: count]; - messageUid = [[response objectForKey: @"uid"] stringValue]; - bodyPartKey = [keyAssoc objectForKey: messageUid]; - if (bodyPartKey) - { - bodyContent = [[response objectForKey: bodyPartKey] - objectForKey: @"data"]; - if (bodyContent) - { - messageKey = [NSString stringWithFormat: @"%@.eml", - messageUid]; - [bodyData setObject: bodyContent forKey: messageKey]; - } - } + [bodyData setObject: bodyContent forKey: messageKey]; } } } @@ -1809,8 +1766,8 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) @implementation MAPIStoreOutboxFolder -- (int) getPidTagDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"Outbox" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreMailMessage.h b/OpenChange/MAPIStoreMailMessage.h index 60922feaf..580be0a6e 100644 --- a/OpenChange/MAPIStoreMailMessage.h +++ b/OpenChange/MAPIStoreMailMessage.h @@ -25,8 +25,10 @@ #import "MAPIStoreMessage.h" -@class NSData; @class NSString; +@class NSArray; +@class NSMutableArray; +@class NSMutableDictionary; @class MAPIStoreAppointmentWrapper; @class MAPIStoreMailFolder; @@ -37,12 +39,17 @@ BOOL mailIsEvent; BOOL mailIsMeetingRequest; BOOL mailIsSharingObject; - NSString *mimeKey; + + NSMutableArray *bodyContentKeys; + NSMutableDictionary *bodyPartsEncodings; + NSMutableDictionary *bodyPartsCharsets; + NSMutableDictionary *bodyPartsMimeTypes; + NSMutableDictionary *bodyPartsMixed; + NSString *headerCharset; - NSString *headerEncoding; NSString *headerMimeType; BOOL bodySetup; - NSData *bodyContent; + NSArray *bodyContent; BOOL fetchedAttachments; MAPIStoreAppointmentWrapper *appointmentWrapper; @@ -50,31 +57,31 @@ - (NSString *) subject; -- (int) getPidTagIconIndex: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagFlagStatus: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagIconIndex: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagFlagStatus: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagMessageFlags: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagFollowupIcon: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagReceivedByEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagSenderEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagDisplayTo: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagDisplayCc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagDisplayBcc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagMessageFlags: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagFollowupIcon: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagReceivedByEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagSenderEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; /* batch-mode helpers */ -- (NSString *) bodyContentPartKey; -- (void) setBodyContentFromRawData: (NSData *) rawContent; +- (void) setBodyContentFromRawData: (NSArray *) rawContent; +- (NSArray *) getBodyContent; @end diff --git a/OpenChange/MAPIStoreMailMessage.m b/OpenChange/MAPIStoreMailMessage.m index f79511eb6..6c20a6b04 100644 --- a/OpenChange/MAPIStoreMailMessage.m +++ b/OpenChange/MAPIStoreMailMessage.m @@ -25,8 +25,10 @@ #import #import #import +#import #import #import +#import #import #import #import @@ -41,6 +43,7 @@ #import #import #import +#import #import "Codepages.h" #import "NSData+MAPIStore.h" @@ -65,9 +68,13 @@ #include #include +#define BODY_CONTENT_TEXT 0 +#define BODY_CONTENT_HTML 1 + @class iCalCalendar, iCalEvent; static Class NSExceptionK, MAPIStoreSharingMessageK; +static NSArray *acceptedMimeTypes; @interface NSString (MAPIStoreMIME) @@ -111,22 +118,33 @@ static Class NSExceptionK, MAPIStoreSharingMessageK; { NSExceptionK = [NSException class]; MAPIStoreSharingMessageK = [MAPIStoreSharingMessage class]; + acceptedMimeTypes = [[NSArray alloc] initWithObjects: @"text/calendar", + @"application/ics", + @"text/html", + @"text/plain", + nil]; } - (id) init { if ((self = [super init])) { - mimeKey = nil; + bodyContentKeys = nil; + bodyPartsEncodings = nil; + bodyPartsCharsets = nil; + bodyPartsMimeTypes = nil; + bodyPartsMixed = nil; + + headerSetup = NO; + bodySetup = NO; + bodyContent = nil; + mailIsEvent = NO; mailIsMeetingRequest = NO; mailIsSharingObject = NO; headerCharset = nil; - headerEncoding = nil; headerMimeType = nil; - headerSetup = NO; - bodyContent = nil; - bodySetup = NO; + appointmentWrapper = nil; } @@ -135,11 +153,16 @@ static Class NSExceptionK, MAPIStoreSharingMessageK; - (void) dealloc { - [mimeKey release]; + [bodyContentKeys release]; + [bodyPartsEncodings release]; + [bodyPartsCharsets release]; + [bodyPartsMimeTypes release]; + [bodyPartsMixed release]; + [bodyContent release]; + [headerMimeType release]; [headerCharset release]; - [headerEncoding release]; [appointmentWrapper release]; [super dealloc]; } @@ -234,30 +257,117 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) { MAPIStoreSharingMessage *sharingMessage; NSMutableArray *keys; - NSArray *acceptedTypes; - NSDictionary *messageData, *partHeaderData, *parameters; + NSUInteger keysCount; + NSDictionary *partHeaderData, *parameters; NSString *sharingHeader; - acceptedTypes = [NSArray arrayWithObjects: @"text/calendar", - @"application/ics", - @"text/html", - @"text/plain", nil]; keys = [NSMutableArray array]; [sogoObject addRequiredKeysOfStructure: [sogoObject bodyStructure] - path: @"" toArray: keys - acceptedTypes: acceptedTypes + path: @"" + toArray: keys + acceptedTypes: acceptedMimeTypes withPeek: YES]; - [keys sortUsingFunction: _compareBodyKeysByPriority context: acceptedTypes]; - if ([keys count] > 0) + [keys sortUsingFunction: _compareBodyKeysByPriority context: acceptedMimeTypes]; + keysCount = [keys count]; + if (keysCount > 0) { - messageData = [keys objectAtIndex: 0]; - ASSIGN (mimeKey, [messageData objectForKey: @"key"]); - ASSIGN (headerMimeType, [messageData objectForKey: @"mimeType"]); - partHeaderData - = [sogoObject lookupInfoForBodyPart: [mimeKey _strippedBodyKey]]; - ASSIGN (headerEncoding, [partHeaderData objectForKey: @"encoding"]); - parameters = [partHeaderData objectForKey: @"parameterList"]; - ASSIGN (headerCharset, [parameters objectForKey: @"charset"]); + NSUInteger i; + BOOL hasHtml = NO; + BOOL hasText = NO; + + bodyContentKeys = [[NSMutableArray alloc] initWithCapacity: keysCount]; + bodyPartsEncodings = [[NSMutableDictionary alloc] initWithCapacity: keysCount]; + bodyPartsCharsets = [[NSMutableDictionary alloc] initWithCapacity: keysCount]; + bodyPartsMimeTypes = [[NSMutableDictionary alloc] initWithCapacity: keysCount]; + bodyPartsMixed = [[NSMutableDictionary alloc] initWithCapacity: keysCount]; + + for (i = 0; i < keysCount; i++) + { + NSDictionary *bodyStructureKey; + NSString *key; + NSString *mimeType; + BOOL mixedPart; + NSString *strippedKey; + NSString *encoding; + NSString *charset; + NSDictionary *partParameters; + NSString *multipart; + + bodyStructureKey = [keys objectAtIndex: i]; + key = [bodyStructureKey objectForKey: @"key"]; + if (key == nil) + continue; + + [bodyContentKeys addObject: key]; + + strippedKey = [key _strippedBodyKey]; + partHeaderData = [sogoObject lookupInfoForBodyPart: strippedKey]; + + partParameters = [partHeaderData objectForKey: @"parameterList"]; + encoding = [partHeaderData objectForKey: @"encoding"]; + charset = [partParameters objectForKey: @"charset"]; + mimeType = [bodyStructureKey objectForKey: @"mimeType"]; + + /* multipart/mixed is the default type. + multipart/alternative is the only other type of multipart supported now. + */ + multipart = [bodyStructureKey objectForKey: @"multipart"]; + if ([multipart isEqualToString: @""]) + { + mixedPart = NO; + } + else + { + mixedPart = !([multipart isEqualToString: @"multipart/alternative"] || + [multipart isEqualToString: @"multipart/related"]); + } + + if (encoding) + [bodyPartsEncodings setObject: encoding forKey: key]; + if (charset) + [bodyPartsCharsets setObject: charset forKey: key]; + if (mimeType) + { + [bodyPartsMimeTypes setObject: mimeType forKey: key]; + if ([mimeType isEqualToString: @"text/plain"]) + hasText = YES; + else if ([mimeType isEqualToString: @"text/html"]) + hasHtml = YES; + } + [bodyPartsMixed setObject: [NSNumber numberWithBool: mixedPart] forKey: key]; + + if (i == 0) + { + ASSIGN (headerMimeType, mimeType); + parameters = partParameters; + } + + if (charset) + { + if (headerCharset == nil) + { + ASSIGN (headerCharset, charset); + } + else if (![headerCharset isEqualToString: charset]) + { + /* Because we have different charsets we will encode all in UTF-8 */ + ASSIGN (headerCharset, @"utf-8"); + } + } + + } + + if (!hasHtml || !hasText) + { + NSArray *bodyPartsMixedKeys = [bodyPartsMixed allKeys]; + for (i = 0; i < [keys count]; i++) + { + NSString *key = [bodyPartsMixedKeys objectAtIndex: i]; + [bodyPartsMixed setObject: [NSNumber numberWithBool: NO] forKey: key]; + } + } + + if ([headerMimeType isEqualToString: @"text/calendar"] || [headerMimeType isEqualToString: @"application/ics"]) { @@ -288,31 +398,157 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) - (void) _fetchBodyData { - NSData *rawContent; - NSString *resultKey; - id result; - if (!headerSetup) [self _fetchHeaderData]; - if (!bodyContent && mimeKey) + if (!bodyContent && bodyContentKeys) { - result = [sogoObject fetchParts: [NSArray arrayWithObject: mimeKey]]; + id result; + NSString *key; + NSEnumerator *enumerator; + NSMutableData *htmlContent; + NSMutableData *textContent; + NSStringEncoding headerEncoding; + + result = [sogoObject fetchParts: bodyContentKeys]; result = [[result valueForKey: @"RawResponse"] objectForKey: @"fetch"]; - if ([mimeKey hasPrefix: @"body.peek"]) - resultKey = [NSString stringWithFormat: @"body[%@]", - [mimeKey _strippedBodyKey]]; - else - resultKey = mimeKey; - rawContent = [[result objectForKey: resultKey] objectForKey: @"data"]; - ASSIGN (bodyContent, [rawContent bodyDataFromEncoding: headerEncoding]); + + htmlContent = [[NSMutableData alloc] initWithCapacity: 0]; + textContent = [[NSMutableData alloc] initWithCapacity: 0]; + + headerEncoding = [NSString stringEncodingForEncodingNamed: headerCharset]; + + enumerator = [bodyContentKeys objectEnumerator]; + while ((key = [enumerator nextObject])) + { + NSString *noPeekKey = [key stringByReplacingOccurrencesOfString: @"body.peek" + withString: @"body"]; + + NSData *content = [[result objectForKey: noPeekKey] objectForKey: @"data"]; + if (content == nil) + continue; + NSString *mimeType = [bodyPartsMimeTypes objectForKey: key]; + if (mimeType == nil) + continue; + NSString *contentEncoding = [bodyPartsEncodings objectForKey: key]; + if (contentEncoding == nil) + contentEncoding = @"7-bit"; + + /* We should provide a case for each of the types in acceptedMimeTypes */ + if (!mailIsEvent) + { + NSString *charset; + NSStringEncoding charsetEncoding; + NSString *stringValue; + BOOL html; + BOOL mixed = [[bodyPartsMixed objectForKey: key] boolValue]; + if ([mimeType isEqualToString: @"text/html"]) + { + html = YES; + } + else if ([mimeType isEqualToString: @"text/plain"]) + { + html = NO; + } + else + { + [self warnWithFormat: @"Unsupported MIME type for non-event body part: %@.", + mimeType]; + continue; + } + + content = [content bodyDataFromEncoding: contentEncoding]; + charset = [bodyPartsCharsets objectForKey: key]; + + stringValue = nil; + if (charset) + { + charsetEncoding = [NSString stringEncodingForEncodingNamed: charset]; + if ((charsetEncoding == headerEncoding) || !headerEncoding) + { + if (html) + [htmlContent appendData: content]; + else + [textContent appendData: content]; + } + else + { + stringValue = [content bodyStringFromCharset: charset]; + if (html) + [htmlContent appendData: [stringValue dataUsingEncoding: headerEncoding]]; + else + [textContent appendData: [stringValue dataUsingEncoding: headerEncoding]]; + } + + if (mixed) + { + // We must add it also to the other mail representation + if (html) + { + // TODO: html conversion to text + if (stringValue && headerEncoding) + [textContent appendData: [stringValue dataUsingEncoding: headerEncoding]]; + else + [textContent appendData: content]; + } + else + { + if (headerEncoding) + { + if (stringValue == nil) + stringValue = [content bodyStringFromCharset: charset]; + + stringValue = [stringValue stringByReplacingOccurrencesOfString: @"\n" + withString: @"
"]; + [htmlContent appendData: [stringValue dataUsingEncoding: headerEncoding]]; + } + else + { + [htmlContent appendData: content]; + } + } + } + } + else + { + /* Without charset we cannot mangle the text, so we add as it stands */ + if (html || mixed) + [htmlContent appendData: content]; + if (!html || mixed) + [textContent appendData: content]; + } + + } + else if ([mimeType isEqualToString: @"text/calendar"] || + [mimeType isEqualToString: @"application/ics"]) + { + content = [content bodyDataFromEncoding: contentEncoding]; + [textContent appendData: content]; + } + else + { + [self warnWithFormat: @"Unsupported combination for event body part. MIME type: %@", + mimeType]; + } + } + + NSArray *newBodyContent = [[NSArray alloc] initWithObjects: textContent, htmlContent, nil]; + ASSIGN (bodyContent, newBodyContent); } bodySetup = YES; } +- (NSArray*) getBodyContent +{ + if (!bodySetup) + [self _fetchBodyData]; + return bodyContent; +} + - (MAPIStoreAppointmentWrapper *) _appointmentWrapper { + NSData *textContent; NSArray *events, *from; iCalCalendar *calendar; iCalEvent *event; @@ -324,7 +560,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) if (!bodySetup) [self _fetchBodyData]; - stringValue = [bodyContent bodyStringFromCharset: headerCharset]; + textContent = [bodyContent objectAtIndex: BODY_CONTENT_TEXT]; + stringValue = [textContent bodyStringFromCharset: headerCharset]; calendar = [iCalCalendar parseSingleFromSource: stringValue]; events = [calendar events]; if ([events count] > 0) @@ -348,10 +585,10 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return appointmentWrapper; } -- (int) getPidTagChangeKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSData *changeKey; MAPIStoreMailFolder *parentFolder; NSString *nameInContainer; @@ -384,10 +621,10 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -- (int) getPidTagPredecessorChangeList: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPredecessorChangeList: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSData *changeList; if (isNew) @@ -463,8 +700,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return version; } -- (int) getPidTagIconIndex: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagIconIndex: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -492,16 +729,16 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidLidResponseStatus: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidResponseStatus: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } -- (int) getPidLidImapDeleted: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidImapDeleted: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t longValue; @@ -514,8 +751,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagSubjectPrefix: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSubjectPrefix: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *subject; NSUInteger colIdx; @@ -536,8 +773,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagNormalizedSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue, *subject; NSUInteger quoteStartIdx, quoteEndIdx, colIdx; @@ -585,14 +822,14 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidLidFInvited: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidFInvited: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -608,8 +845,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagReplyRequested: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReplyRequested: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -619,38 +856,38 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidTagResponseRequested: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagResponseRequested: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagReplyRequested: data inMemCtx: memCtx]; } -- (int) getPidTagLatestDeliveryTime: (void **) data // DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagLatestDeliveryTime: (void **) data // DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagCreationTime: data inMemCtx: memCtx]; } -- (int) getPidTagOriginalSubmitTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalSubmitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagCreationTime: data inMemCtx: memCtx]; } -- (int) getPidTagClientSubmitTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagClientSubmitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagCreationTime: data inMemCtx: memCtx]; } -- (int) getPidTagMessageDeliveryTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageDeliveryTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagCreationTime: data inMemCtx: memCtx]; } -- (int) getPidTagMessageFlags: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageFlags: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -673,8 +910,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagFlagStatus: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagFlagStatus: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -693,8 +930,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagFollowupIcon: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagFollowupIcon: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *coreInfos; NSArray *flags; @@ -713,45 +950,45 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagSensitivity: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSensitivity: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagOriginalSensitivity: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalSensitivity: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSensitivity: data inMemCtx: memCtx]; } -- (int) getPidTagSentRepresentingAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSentRepresentingAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPidTagReceivedRepresentingAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReceivedRepresentingAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPidTagReceivedByAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReceivedByAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) getPidTagSenderAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSenderAddressType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getSMTPAddrType: data inMemCtx: memCtx]; } -- (int) _getEmailAddressFromEmail: (NSString *) fullMail - inData: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getEmailAddressFromEmail: (NSString *) fullMail + inData: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NGMailAddress *ngAddress; NSString *email; @@ -771,9 +1008,9 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) _getCNFromEmail: (NSString *) fullMail - inData: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getCNFromEmail: (NSString *) fullMail + inData: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NGMailAddress *ngAddress; NSString *cn; @@ -801,16 +1038,16 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) _getEntryIdFromEmail: (NSString *) fullMail - inData: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) _getEntryIdFromEmail: (NSString *) fullMail + inData: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *username, *cn, *email; SOGoUserManager *mgr; NSDictionary *contactInfos; NGMailAddress *ngAddress; NSData *entryId; - int rc; + enum mapistore_error rc; if (fullMail) { @@ -847,111 +1084,111 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -- (int) getPidTagSenderEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSenderEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddressFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } -- (int) getPidTagSenderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSenderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getCNFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } -- (int) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSenderEntryId: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryIdFromEmail: [sogoObject from] inData: data inMemCtx: memCtx]; } -- (int) getPidTagOriginalAuthorName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalAuthorName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; } -- (int) getPidTagSentRepresentingEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSentRepresentingEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderEmailAddress: data inMemCtx: memCtx]; } -- (int) getPidTagSentRepresentingName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSentRepresentingName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderName: data inMemCtx: memCtx]; } -- (int) getPidTagSentRepresentingEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSentRepresentingEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSenderEntryId: data inMemCtx: memCtx]; } -- (int) getPidTagReceivedByEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReceivedByEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddressFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } -- (int) getPidTagReceivedByName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReceivedByName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getCNFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } -- (int) getPidTagReceivedByEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReceivedByEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryIdFromEmail: [sogoObject to] inData: data inMemCtx: memCtx]; } -- (int) getPidTagReceivedRepresentingName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReceivedRepresentingName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagReceivedByName: data inMemCtx: memCtx]; } -- (int) getPidTagReceivedRepresentingEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReceivedRepresentingEmailAddress: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagReceivedByEmailAddress: data inMemCtx: memCtx]; } -- (int) getPidTagReceivedRepresentingEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReceivedRepresentingEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagReceivedByEntryId: data inMemCtx: memCtx]; } -- (int) getPidTagDisplayTo: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject to] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagOriginalDisplayTo: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagDisplayTo: data inMemCtx: memCtx]; } -- (int) getPidTagDisplayCc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -964,34 +1201,34 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagOriginalDisplayCc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagDisplayCc: data inMemCtx: memCtx]; } -- (int) getPidTagDisplayBcc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPidTagOriginalDisplayBcc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagDisplayBcc: data inMemCtx: memCtx]; } -- (int) getPidNameContentType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameContentType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"message/rfc822" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; NSString *s; @@ -1009,8 +1246,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagInternetCodepage: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagInternetCodepage: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSNumber *codepage; @@ -1027,23 +1264,67 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidTagBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - NSString *stringValue; - int rc = MAPISTORE_SUCCESS; + NSData *textContent; + enum mapistore_error rc; if (!bodySetup) [self _fetchBodyData]; - if ([headerMimeType isEqualToString: @"text/plain"]) + if (!bodyContent) { - stringValue = [bodyContent bodyStringFromCharset: headerCharset]; - *data = [stringValue asUnicodeInMemCtx: memCtx]; + *data = NULL; + return MAPISTORE_ERR_NOT_FOUND; + } + + if (mailIsEvent) + { + rc = [[self _appointmentWrapper] getPidTagBody: data + inMemCtx: memCtx]; + } + else + { + textContent = [bodyContent objectAtIndex: BODY_CONTENT_TEXT]; + if ([textContent length]) + { + NSString *stringValue = [textContent bodyStringFromCharset: headerCharset]; + *data = [stringValue asUnicodeInMemCtx: memCtx]; + rc = MAPISTORE_SUCCESS; + } + else + { + *data = NULL; + rc = MAPISTORE_ERR_NOT_FOUND; + } + } + + return rc; +} + +- (enum mapistore_error) getPidTagHtml: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + NSData *htmlContent; + enum mapistore_error rc; + + if (!bodySetup) + [self _fetchBodyData]; + + if (!bodyContent || mailIsEvent) + { + *data = NULL; + return MAPISTORE_ERR_NOT_FOUND; + } + + htmlContent = [bodyContent objectAtIndex: BODY_CONTENT_HTML] ; + + if ([htmlContent length]) + { + *data = [htmlContent asBinaryInMemCtx: memCtx]; + rc = MAPISTORE_SUCCESS; } - else if (mailIsEvent) - rc = [[self _appointmentWrapper] getPidTagBody: data - inMemCtx: memCtx]; else { *data = NULL; @@ -1053,55 +1334,36 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -- (int) getPidTagHtml: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx -{ - int rc = MAPISTORE_SUCCESS; - - if (!bodySetup) - [self _fetchBodyData]; - - if ([headerMimeType isEqualToString: @"text/html"]) - *data = [bodyContent asBinaryInMemCtx: memCtx]; - else - { - *data = NULL; - rc = MAPISTORE_ERR_NOT_FOUND; - } - - return rc; -} - -- (int) getPidTagRtfCompressed: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagRtfCompressed: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = NULL; return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagRtfInSync: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagRtfInSync: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagInternetMessageId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagInternetMessageId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject messageId] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagReadReceiptRequested: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagReadReceiptRequested: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidLidGlobalObjectId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidGlobalObjectId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1112,8 +1374,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidCleanGlobalObjectId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidCleanGlobalObjectId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1124,7 +1386,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidServerProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidServerProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1135,7 +1397,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidServerProcessingActions: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidServerProcessingActions: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1146,9 +1408,9 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; if (!headerSetup) [self _fetchHeaderData]; @@ -1161,7 +1423,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -// - (int) getPidLidServerProcessed: (void **) data +// - (enum mapistore_error) getPidLidServerProcessed: (void **) data // inMemCtx: (TALLOC_CTX *) memCtx // { // if (!headerSetup) @@ -1173,8 +1435,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) // : MAPISTORE_ERR_NOT_FOUND); // } -- (int) getPidLidPrivate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidPrivate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1185,8 +1447,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : [self getNo: data inMemCtx: memCtx]); } -- (int) getPidTagMessageEditorFormat: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageEditorFormat: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t format; @@ -1205,33 +1467,33 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (int) getPidLidReminderSet: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidReminderSet: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidLidUseTnef: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidUseTnef: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidLidRemoteStatus: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidRemoteStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidLidAgingDontAgeMe: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAgingDontAgeMe: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } /* event getters */ -- (int) getPidTagStartDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagStartDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1241,10 +1503,10 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidAppointmentMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; if (!headerSetup) [self _fetchHeaderData]; @@ -1257,8 +1519,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return rc; } -- (int) getPidLidAppointmentStartWhole: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentStartWhole: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1269,8 +1531,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidCommonStart: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidCommonStart: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1281,8 +1543,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidTagEndDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagEndDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1292,8 +1554,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidAppointmentEndWhole: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentEndWhole: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1304,8 +1566,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidCommonEnd: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidCommonEnd: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1316,8 +1578,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidAppointmentDuration: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentDuration: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1328,8 +1590,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidAppointmentSubType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentSubType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1340,8 +1602,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidBusyStatus: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidBusyStatus: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1352,8 +1614,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidLocation: (void **) data // LOCATION - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidLocation: (void **) data // LOCATION + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1364,8 +1626,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidIsRecurring: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidIsRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1376,8 +1638,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidRecurring: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1388,8 +1650,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidAppointmentRecur: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAppointmentRecur: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1400,8 +1662,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidTagOwnerAppointmentId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOwnerAppointmentId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1412,8 +1674,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidLidMeetingType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidMeetingType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { if (!headerSetup) [self _fetchHeaderData]; @@ -1424,8 +1686,8 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) : MAPISTORE_ERR_NOT_FOUND); } -- (int) getPidTagTransportMessageHeaders: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagTransportMessageHeaders: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSDictionary *mailHeaders; NSEnumerator *keyEnumerator; @@ -1680,24 +1942,12 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data) return MAPISTORE_SUCCESS; } -- (NSString *) bodyContentPartKey -{ - NSString *bodyPartKey; - - if (!headerSetup) - [self _fetchHeaderData]; - - bodyPartKey = mimeKey; - - return bodyPartKey; -} - -- (void) setBodyContentFromRawData: (NSData *) rawContent +- (void) setBodyContentFromRawData: (NSArray *) rawContent { if (!headerSetup) [self _fetchHeaderData]; - ASSIGN (bodyContent, [rawContent bodyDataFromEncoding: headerEncoding]); + ASSIGN (bodyContent, rawContent); bodySetup = YES; } diff --git a/OpenChange/MAPIStoreMailMessageTable.m b/OpenChange/MAPIStoreMailMessageTable.m index d315f6527..2375ca39b 100644 --- a/OpenChange/MAPIStoreMailMessageTable.m +++ b/OpenChange/MAPIStoreMailMessageTable.m @@ -340,10 +340,10 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK; [self cleanupCaches]; } -- (int) getRow: (struct mapistore_property_data **) dataP - withRowID: (uint32_t) rowId - andQueryType: (enum mapistore_query_type) queryType - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getRow: (struct mapistore_property_data **) dataP + withRowID: (uint32_t) rowId + andQueryType: (enum mapistore_query_type) queryType + inMemCtx: (TALLOC_CTX *) memCtx { if (!fetchedCoreInfos) { @@ -352,8 +352,8 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK; prefetchCoreInfosForMessageKeys: [self restrictedChildKeys]]; } - return [super getRow: dataP withRowID: rowId - andQueryType: queryType inMemCtx: memCtx]; + return [super getRow: dataP withRowID: rowId + andQueryType: queryType inMemCtx: memCtx]; } @end diff --git a/OpenChange/MAPIStoreMailVolatileMessage.h b/OpenChange/MAPIStoreMailVolatileMessage.h index 212226abf..417faeff6 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.h +++ b/OpenChange/MAPIStoreMailVolatileMessage.h @@ -27,7 +27,7 @@ @interface MAPIStoreMailVolatileMessage : MAPIStoreMessage -- (int) submitWithFlags: (enum SubmitFlags) flags; +- (enum mapistore_error) submitWithFlags: (enum SubmitFlags) flags; @end diff --git a/OpenChange/MAPIStoreMailVolatileMessage.m b/OpenChange/MAPIStoreMailVolatileMessage.m index 1db930ef8..36c3179e7 100644 --- a/OpenChange/MAPIStoreMailVolatileMessage.m +++ b/OpenChange/MAPIStoreMailVolatileMessage.m @@ -290,17 +290,17 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; : ULLONG_MAX); } -- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Note" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { NSData *changeKey; - int rc; + enum mapistore_error rc; changeKey = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)]; if (changeKey) @@ -1051,7 +1051,7 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS return messageData; } -- (int) submitWithFlags: (enum SubmitFlags) flags +- (enum mapistore_error) submitWithFlags: (enum SubmitFlags) flags { enum mapistore_error rc = MAPISTORE_SUCCESS; NSDictionary *recipients; diff --git a/OpenChange/MAPIStoreMapping.m b/OpenChange/MAPIStoreMapping.m index b7d303ed6..2e2c9a66d 100644 --- a/OpenChange/MAPIStoreMapping.m +++ b/OpenChange/MAPIStoreMapping.m @@ -258,7 +258,7 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) if (oldURL != NULL) { [self errorWithFormat: - @"url with idNbr already registered: (oldUrl='%@', newUrl='%@', id=x%.16"PRIx64")", + @"url with idNbr already registered: (oldUrl='%@', newUrl='%@', id=0x%.16"PRIx64")", oldURL, urlString, idNbr]; return NO; } @@ -306,7 +306,7 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr) } else [NSException raise: NSInvalidArgumentException - format: @"number of urls and ids do not match"]; + format: @"number of urls (%d) and ids (%d) do not match", max, [idNbrs count]]; } - (void) unregisterURLWithID: (uint64_t) idNbr diff --git a/OpenChange/MAPIStoreMessage.h b/OpenChange/MAPIStoreMessage.h index f914e543a..b7441a74c 100644 --- a/OpenChange/MAPIStoreMessage.h +++ b/OpenChange/MAPIStoreMessage.h @@ -48,27 +48,28 @@ - (void) getMessageData: (struct mapistore_message **) dataPtr inMemCtx: (TALLOC_CTX *) memCtx; -- (int) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) recipients - andCount: (NSUInteger) max - andColumns: (struct SPropTagArray *) columns; +- (enum mapistore_error) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) recipients + andCount: (NSUInteger) max + andColumns: (struct SPropTagArray *) columns; - (NSArray *) attachmentKeys; - (NSArray *) attachmentKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings; - (id) lookupAttachment: (NSString *) childKey; /* backend methods */ -- (int) createAttachment: (MAPIStoreAttachment **) attachmentPtr - inAID: (uint32_t *) aidPtr; -- (int) getAttachment: (MAPIStoreAttachment **) attachmentPtr - withAID: (uint32_t) aid; -- (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr - andRowCount: (uint32_t *) countPtr; +- (enum mapistore_error) createAttachment: (MAPIStoreAttachment **) attachmentPtr + inAID: (uint32_t *) aidPtr; +- (enum mapistore_error) getAttachment: (MAPIStoreAttachment **) attachmentPtr + withAID: (uint32_t) aid; +- (enum mapistore_error) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr + andRowCount: (uint32_t *) countPtr; - (enum mapistore_error) setReadFlag: (uint8_t) flag; - (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx; - (NSArray *) activeContainerMessageTables; - (NSArray *) activeUserRoles; +- (NSArray *) expandRoles: (NSArray *) roles; /* move & copy internal ops */ - (void) copyToMessage: (MAPIStoreMessage *) newMessage inMemCtx: (TALLOC_CTX *) memCtx; @@ -82,6 +83,7 @@ - (BOOL) subscriberCanReadMessage; - (BOOL) subscriberCanModifyMessage; +- (BOOL) subscriberCanDeleteMessage; @end diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index e6bda4578..3e303e5a3 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -276,9 +276,9 @@ rtf2html (NSData *compressedRTF) return recipientProperties; } -- (int) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) newRecipients - andCount: (NSUInteger) max - andColumns: (struct SPropTagArray *) columns; +- (enum mapistore_error) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) newRecipients + andCount: (NSUInteger) max + andColumns: (struct SPropTagArray *) columns; { static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" }; NSDictionary *recipientProperties; @@ -318,7 +318,7 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) addPropertiesFromRow: (struct SRow *) aRow +- (enum mapistore_error) addPropertiesFromRow: (struct SRow *) aRow { enum mapistore_error rc; MAPIStoreContext *context; @@ -397,11 +397,11 @@ rtf2html (NSData *compressedRTF) return newAttachment; } -- (int) createAttachment: (MAPIStoreAttachment **) attachmentPtr - inAID: (uint32_t *) aidPtr +- (enum mapistore_error) createAttachment: (MAPIStoreAttachment **) attachmentPtr + inAID: (uint32_t *) aidPtr { MAPIStoreAttachment *attachment; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; attachment = [self createAttachment]; if (attachment) @@ -422,12 +422,12 @@ rtf2html (NSData *compressedRTF) return nil; } -- (int) getAttachment: (MAPIStoreAttachment **) attachmentPtr - withAID: (uint32_t) aid +- (enum mapistore_error) getAttachment: (MAPIStoreAttachment **) attachmentPtr + withAID: (uint32_t) aid { MAPIStoreAttachment *attachment; NSArray *keys; - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; keys = [self attachmentKeys]; if (aid < [keys count]) @@ -443,11 +443,11 @@ rtf2html (NSData *compressedRTF) return rc; } -- (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr - andRowCount: (uint32_t *) countPtr +- (enum mapistore_error) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr + andRowCount: (uint32_t *) countPtr { MAPIStoreAttachmentTable *attTable; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; attTable = [self attachmentTable]; if (attTable) @@ -547,7 +547,8 @@ rtf2html (NSData *compressedRTF) for (count = 0; count < max; count++) [[containerTables objectAtIndex: count] restrictedChildKeys]; } - + + /* TODO: Check the save process succeeded */ [self save: memCtx]; /* We make sure that any change-related properties are removed from the properties dictionary, to make sure that related methods will be @@ -582,8 +583,8 @@ rtf2html (NSData *compressedRTF) } /* getters */ -- (int) getPidTagInstID: (void **) data // TODO: DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagInstID: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { /* we return a unique id based on the key */ *data = MAPILongLongValue (memCtx, [[sogoObject nameInContainer] hash]); @@ -591,22 +592,22 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPidTagInstanceNum: (void **) data // TODO: DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagInstanceNum: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagRowType: (void **) data // TODO: DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagRowType: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, TBL_LEAF_ROW); return MAPISTORE_SUCCESS; } -- (int) getPidTagDepth: (void **) data // TODO: DOUBT - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDepth: (void **) data // TODO: DOUBT + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, 0); @@ -623,8 +624,8 @@ rtf2html (NSData *compressedRTF) 0x00000010 Create Contents Table 0x00000020 Create Associated Contents Table */ -- (int) getPidTagAccess: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAccess: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; BOOL userIsOwner; @@ -649,8 +650,7 @@ rtf2html (NSData *compressedRTF) if (userIsOwner || ([self isKindOfClass: MAPIStoreEmbeddedMessageK] && [mainMessage subscriberCanModifyMessage]) - || [(MAPIStoreFolder *) - [mainMessage container] subscriberCanDeleteMessages]) + || [mainMessage subscriberCanDeleteMessage]) access |= 0x04; *data = MAPILongValue (memCtx, access); @@ -664,8 +664,8 @@ rtf2html (NSData *compressedRTF) 0x00000000 Read-Only 0x00000001 Modify */ -- (int) getPidTagAccessLevel: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAccessLevel: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t access = 0; BOOL userIsOwner; @@ -684,20 +684,20 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int ) getPidTagHasNamedProperties: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHasNamedProperties: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidLidSideEffects: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSideEffects: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidLidCurrentVersion: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidCurrentVersion: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { // *data = MAPILongValue (memCtx, 115608); // Outlook 11.5608 *data = MAPILongValue (memCtx, 0x1ce3a); // Outlook 11.8330 @@ -705,34 +705,34 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPidLidCurrentVersionName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidCurrentVersionName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"11.0" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidLidAutoProcessState: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidAutoProcessState: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000000); return MAPISTORE_SUCCESS; } -- (int) getPidTagFolderId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagFolderId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, [container objectId]); return MAPISTORE_SUCCESS; } -- (int) getPidTagMid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; uint64_t obId; obId = [self objectId]; @@ -747,24 +747,24 @@ rtf2html (NSData *compressedRTF) return rc; } -- (int) getPidTagMessageLocaleId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageLocaleId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x0409); return MAPISTORE_SUCCESS; } -- (int) getPidTagMessageFlags: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageFlags: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, MSGFLAG_FROMME | MSGFLAG_READ | MSGFLAG_UNMODIFIED); return MAPISTORE_SUCCESS; } -- (int) getPidTagMessageSize: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageSize: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* TODO: choose another name in SOGo for that method */ *data = MAPILongValue (memCtx, [[sogoObject davContentLength] intValue]); @@ -772,30 +772,30 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPidTagImportance: (void **) data // TODO -> subclass? - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagImportance: (void **) data // TODO -> subclass? + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 1); return MAPISTORE_SUCCESS; } -- (int) getPidTagPriority: (void **) data // TODO -> subclass? - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagPriority: (void **) data // TODO -> subclass? + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagSensitivity: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSensitivity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; TALLOC_CTX *localMemCtx; char *prefix, *normalizedSubject; @@ -816,71 +816,71 @@ rtf2html (NSData *compressedRTF) return rc; } -- (int) getPidTagNormalizedSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagOriginalSubject: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalSubject: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagSubject: data inMemCtx: memCtx]; } -- (int) getPidTagConversationTopic: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagConversationTopic: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagNormalizedSubject: data inMemCtx: memCtx]; } -- (int) getPidTagSubjectPrefix: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSubjectPrefix: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPidTagDeleteAfterSubmit: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDeleteAfterSubmit: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagDisplayTo: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayTo: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPidTagDisplayCc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayCc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -- (int) getPidTagDisplayBcc: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayBcc: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getEmptyString: data inMemCtx: memCtx]; } -// - (int) getPidTagOriginalDisplayTo: (void **) data +// - (enum mapistore_error) getPidTagOriginalDisplayTo: (void **) data // { // return [self getPidTagDisplayTo: data]; // } -// - (int) getPidTagOriginalDisplayCc: (void **) data +// - (enum mapistore_error) getPidTagOriginalDisplayCc: (void **) data // { // return [self getPidTagDisplayCc: data]; // } -// - (int) getPidTagOriginalDisplayBcc: (void **) data +// - (enum mapistore_error) getPidTagOriginalDisplayBcc: (void **) data // { // return [self getPidTagDisplayBcc: data]; // } -- (int) getPidTagLastModifierName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagLastModifierName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSURL *contextUrl; @@ -890,22 +890,22 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { [self subclassResponsibility: _cmd]; return MAPISTORE_ERR_NOT_FOUND; } -- (int) getPidTagOriginalMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagOriginalMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getProperty: data withTag: PidTagMessageClass inMemCtx: memCtx]; } -- (int) getPidTagHasAttachments: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHasAttachments: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [[self attachmentKeys] count] > 0); @@ -913,8 +913,8 @@ rtf2html (NSData *compressedRTF) return MAPISTORE_SUCCESS; } -- (int) getPidTagAssociated: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagAssociated: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx];; } @@ -981,20 +981,38 @@ rtf2html (NSData *compressedRTF) activeUserRoles = [[context activeUser] rolesForObject: sogoObject inContext: [userContext woContext]]; + /* We use in this library the roles as flags, so we expand high + access rights with the lower ones */ + activeUserRoles = [self expandRoles: activeUserRoles]; [activeUserRoles retain]; } return activeUserRoles; } +/* Expand current roles with lower access roles to transform them to + flags */ +- (NSArray *) expandRoles: (NSArray *) roles +{ + return roles; +} + +/* Can the current active user read the message? */ - (BOOL) subscriberCanReadMessage { return NO; } +/* Can the current active user modify the message? */ - (BOOL) subscriberCanModifyMessage { return NO; } +/* Can the current active user delete the message? */ +- (BOOL) subscriberCanDeleteMessage +{ + return NO; +} + @end diff --git a/OpenChange/MAPIStoreNotesContext.m b/OpenChange/MAPIStoreNotesContext.m index 725b0d158..f5b8b1be3 100644 --- a/OpenChange/MAPIStoreNotesContext.m +++ b/OpenChange/MAPIStoreNotesContext.m @@ -1,6 +1,7 @@ /* MAPIStoreNotesContext.m - this file is part of SOGo * * Copyright (C) 2010-2012 Inverse inc. + * Copyright (C) 2016 Enrique J. Hernandez * * Author: Wolfgang Sourdeau * @@ -30,13 +31,30 @@ #undef DEBUG #include +static Class MAPIStoreNotesFolderK; + @implementation MAPIStoreNotesContext ++ (void) initialize +{ + MAPIStoreNotesFolderK = [MAPIStoreNotesFolder class]; +} + + (NSString *) MAPIModuleName { return @"notes"; } ++ (enum mapistore_context_role) MAPIContextRole +{ + return MAPISTORE_NOTES_ROLE; +} + +- (Class) MAPIStoreFolderClass +{ + return MAPIStoreNotesFolderK; +} + + (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName withIndexing: (struct indexing_context *) indexing inMemCtx: (TALLOC_CTX *) memCtx diff --git a/OpenChange/MAPIStoreNotesFolder.m b/OpenChange/MAPIStoreNotesFolder.m index ae2652d88..c3c1c4777 100644 --- a/OpenChange/MAPIStoreNotesFolder.m +++ b/OpenChange/MAPIStoreNotesFolder.m @@ -30,8 +30,8 @@ @implementation MAPIStoreNotesFolder -- (int) getPidTagDefaultPostMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.StickyNote" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreNotesMessage.m b/OpenChange/MAPIStoreNotesMessage.m index 52712277b..f594b6c27 100644 --- a/OpenChange/MAPIStoreNotesMessage.m +++ b/OpenChange/MAPIStoreNotesMessage.m @@ -32,8 +32,8 @@ @implementation MAPIStoreNotesMessage -- (int) getPidTagIconIndex: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ // *longValue = 0x00000300 for blue @@ -46,7 +46,7 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.StickyNote" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreObject.h b/OpenChange/MAPIStoreObject.h index c5a466ac3..abf126658 100644 --- a/OpenChange/MAPIStoreObject.h +++ b/OpenChange/MAPIStoreObject.h @@ -68,27 +68,27 @@ - (NSMutableDictionary *) properties; /* ops */ -- (int) getProperties: (struct mapistore_property_data *) data - withTags: (enum MAPITAGS *) tags - andCount: (uint16_t) columnCount - inMemCtx: (TALLOC_CTX *) localMemCtx; +- (enum mapistore_error) getProperties: (struct mapistore_property_data *) data + withTags: (enum MAPITAGS *) tags + andCount: (uint16_t) columnCount + inMemCtx: (TALLOC_CTX *) localMemCtx; -- (int) addPropertiesFromRow: (struct SRow *) aRow; +- (enum mapistore_error) addPropertiesFromRow: (struct SRow *) aRow; -- (int) getProperty: (void **) data - withTag: (enum MAPITAGS) propTag - inMemCtx: (TALLOC_CTX *) localMemCtx; +- (enum mapistore_error) getProperty: (void **) data + withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) localMemCtx; /* helper getters */ - (NSData *) getReplicaKeyFromGlobCnt: (uint64_t) objectCnt; -- (int) getReplicaKey: (void **) data - fromGlobCnt: (uint64_t) objectCnt - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getReplicaKey: (void **) data + fromGlobCnt: (uint64_t) objectCnt + inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagCreationTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTagLastModificationTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagCreationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagLastModificationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; /* move and copy operations */ - (void) copyPropertiesToObject: (MAPIStoreObject *) newObject inMemCtx: (TALLOC_CTX *) memCtx; diff --git a/OpenChange/MAPIStoreObject.m b/OpenChange/MAPIStoreObject.m index ecb00dba3..c5c8cacb2 100644 --- a/OpenChange/MAPIStoreObject.m +++ b/OpenChange/MAPIStoreObject.m @@ -150,15 +150,15 @@ static Class NSExceptionK, MAPIStoreFolderK; return properties; } -- (int) getProperty: (void **) data - withTag: (enum MAPITAGS) propTag - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getProperty: (void **) data + withTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { MAPIStorePropertyGetter method = NULL; uint16_t propValue; SEL methodSel; id value; - int rc = MAPISTORE_ERR_NOT_FOUND; + enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; NSUInteger count, max; value = [properties objectForKey: MAPIPropertyKey (propTag)]; @@ -186,16 +186,16 @@ static Class NSExceptionK, MAPIStoreFolderK; return rc; } -- (int) getPidTagCreationTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagCreationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self creationTime] asFileTimeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagLastModificationTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagLastModificationTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self lastModificationTime] asFileTimeInMemCtx: memCtx]; @@ -219,10 +219,10 @@ static Class NSExceptionK, MAPIStoreFolderK; return canGetProperty; } -- (int) getProperties: (struct mapistore_property_data *) data - withTags: (enum MAPITAGS *) tags - andCount: (uint16_t) columnCount - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getProperties: (struct mapistore_property_data *) data + withTags: (enum MAPITAGS *) tags + andCount: (uint16_t) columnCount + inMemCtx: (TALLOC_CTX *) memCtx { uint16_t count; @@ -239,7 +239,7 @@ static Class NSExceptionK, MAPIStoreFolderK; [proxies addObject: newProxy]; } -- (int) addPropertiesFromRow: (struct SRow *) aRow +- (enum mapistore_error) addPropertiesFromRow: (struct SRow *) aRow { struct SPropValue *cValue; NSUInteger counter; @@ -298,9 +298,9 @@ static Class NSExceptionK, MAPIStoreFolderK; return replicaKey; } -- (int) getReplicaKey: (void **) data - fromGlobCnt: (uint64_t) objectCnt - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getReplicaKey: (void **) data + fromGlobCnt: (uint64_t) objectCnt + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[self getReplicaKeyFromGlobCnt: objectCnt] asBinaryInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreObjectProxy.m b/OpenChange/MAPIStoreObjectProxy.m index 945d16167..1fc6157e6 100644 --- a/OpenChange/MAPIStoreObjectProxy.m +++ b/OpenChange/MAPIStoreObjectProxy.m @@ -51,7 +51,7 @@ MAPIStorePropertyGetter method; uint16_t propValue; SEL methodSel; - int rc; + enum mapistore_error rc; propValue = (propTag & 0xffff0000) >> 16; methodSel = MAPIStoreSelectorForPropertyGetter (propValue); diff --git a/OpenChange/MAPIStorePermissionsTable.m b/OpenChange/MAPIStorePermissionsTable.m index 76896836f..3bd2f84b7 100644 --- a/OpenChange/MAPIStorePermissionsTable.m +++ b/OpenChange/MAPIStorePermissionsTable.m @@ -84,16 +84,16 @@ return memberId; } -- (int) getPidTagMemberId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMemberId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongLongValue (memCtx, memberId); return MAPISTORE_SUCCESS; } -- (int) getPidTagEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSData *entryId; struct mapistore_connection_info *connInfo; @@ -110,8 +110,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagMemberName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMemberName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *displayName; @@ -127,13 +127,14 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagMemberRights: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMemberRights: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t rights; NSArray *roles; roles = [[(MAPIStoreFolder *) container aclFolder] aclsForUser: userId]; + roles = [(MAPIStoreFolder *) container expandRoles: roles]; rights = [(MAPIStoreFolder *) container exchangeRightsForRoles: roles]; *data = MAPILongValue (memCtx, rights); diff --git a/OpenChange/MAPIStoreSOGo.m b/OpenChange/MAPIStoreSOGo.m index 0ec1d59bd..604482ee7 100644 --- a/OpenChange/MAPIStoreSOGo.m +++ b/OpenChange/MAPIStoreSOGo.m @@ -146,6 +146,8 @@ sogo_backend_init (void) NSUserDefaults *ud; SoProductRegistry *registry; char *argv[] = { SAMBA_PREFIX "/sbin/samba", NULL }; + NSString *debugLevel; + uint8_t parentLogLevel; GSRegisterCurrentThread(); @@ -170,6 +172,11 @@ sogo_backend_init (void) /* We force the plugin to base its configuration on the SOGo tree. */ ud = [NSUserDefaults standardUserDefaults]; + + /* Ensure imap4Connection calls raise Exception if + IMAP connection is not established. See NGImap4Connection.m */ + [ud setBool: YES forKey: @"SoIMAP4ExceptionsEnabled"]; + if (!leakDebugging && [ud boolForKey: @"SOGoDebugLeaks"]) { NSLog (@" leak debugging on"); @@ -178,6 +185,22 @@ sogo_backend_init (void) leakDebugging = YES; } + /* Set debug level according to samba */ + parentLogLevel = DEBUGLEVEL_CLASS[DBGC_ALL]; // FIXME: samba logger specific code + if (parentLogLevel >= 4) + debugLevel = @"DEBUG"; + else if (parentLogLevel >= 3) + debugLevel = @"INFO"; + else if (parentLogLevel >= 2) + debugLevel = @"WARN"; + else if (parentLogLevel >= 1) + debugLevel = @"ERROR"; + else + debugLevel = @"FATAL"; + OC_DEBUG(3, "[SOGo] Setting log level to %s", [debugLevel UTF8String]); + [ud setObject: debugLevel forKey: @"NGLogDefaultLogLevel"]; + [ud synchronize]; + registry = [SoProductRegistry sharedProductRegistry]; [registry scanForProductsInDirectory: SOGO_BUNDLES_DIR]; @@ -221,8 +244,13 @@ static void mapiapp_cleanup(void) \details Create a connection context to the sogo backend \param mem_ctx pointer to the memory context + \param conn_info pointer to the connection information available for this context + (database connection, connected user, replica server info) + \param indexing pointer to the indexing database connection \param uri pointer to the sogo path \param private_data pointer to the private backend context + + \note the developer must free allocated private_data */ static enum mapistore_error @@ -233,7 +261,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx, { NSAutoreleasePool *pool; MAPIStoreContext *context; - int rc; + enum mapistore_error rc; NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; @@ -268,7 +296,7 @@ sogo_backend_create_root_folder (const char *username, NSAutoreleasePool *pool; NSString *userName, *folderName; NSString *mapistoreUri; - int rc; + enum mapistore_error rc; NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; @@ -303,7 +331,7 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi { NSAutoreleasePool *pool; NSString *userName; - int rc; + enum mapistore_error rc; NS_CURRENT_THREAD_REGISTER(); pool = [NSAutoreleasePool new]; @@ -349,7 +377,7 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreContext *context; - int rc; + enum mapistore_error rc; if (backend_object) { @@ -381,7 +409,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx, NSAutoreleasePool *pool; MAPIStoreContext *context; MAPIStoreFolder *folder; - int rc; + enum mapistore_error rc; if (backend_object) { @@ -422,7 +450,7 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder, *childFolder; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -464,7 +492,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder, *childFolder; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -505,7 +533,7 @@ sogo_folder_delete(void *folder_object) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -535,7 +563,7 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -569,7 +597,7 @@ sogo_folder_open_message(void *folder_object, NSAutoreleasePool *pool; MAPIStoreFolder *folder; MAPIStoreMessage *message; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -609,7 +637,7 @@ sogo_folder_create_message(void *folder_object, NSAutoreleasePool *pool; MAPIStoreFolder *folder; MAPIStoreMessage *message; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -643,7 +671,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -680,7 +708,7 @@ sogo_folder_move_copy_messages(void *folder_object, MAPIStoreFolder *sourceFolder, *targetFolder; NSAutoreleasePool *pool; struct MAPIStoreTallocWrapper *wrapper; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -723,7 +751,7 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object, MAPIStoreFolder *moveFolder, *targetFolder; NSString *newFolderName; struct MAPIStoreTallocWrapper *wrapper; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -771,7 +799,7 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_ MAPIStoreFolder *copyFolder, *targetFolder; NSString *newFolderName; struct MAPIStoreTallocWrapper *wrapper; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -813,7 +841,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -850,7 +878,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx, NSAutoreleasePool *pool; MAPIStoreFolder *folder; MAPIStoreTable *table; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -887,7 +915,7 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -919,7 +947,7 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreFolder *folder; - int rc; + enum mapistore_error rc; if (folder_object) { @@ -952,7 +980,7 @@ sogo_message_get_message_data(void *message_object, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; - int rc; + enum mapistore_error rc; if (message_object) { @@ -985,7 +1013,7 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void NSAutoreleasePool *pool; MAPIStoreMessage *message; MAPIStoreAttachment *attachment; - int rc; + enum mapistore_error rc; if (message_object) { @@ -1019,7 +1047,7 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx, NSAutoreleasePool *pool; MAPIStoreMessage *message; MAPIStoreAttachment *attachment; - int rc; + enum mapistore_error rc; if (message_object) { @@ -1052,7 +1080,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo NSAutoreleasePool *pool; MAPIStoreMessage *message; MAPIStoreAttachmentTable *table; - int rc; + enum mapistore_error rc; if (message_object) { @@ -1088,7 +1116,7 @@ sogo_message_modify_recipients (void *message_object, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; - int rc; + enum mapistore_error rc; if (message_object) { @@ -1150,7 +1178,7 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMessage *message; - int rc; + enum mapistore_error rc; if (message_object) { @@ -1180,7 +1208,7 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreMailVolatileMessage *message; - int rc; + enum mapistore_error rc; if (message_object) { @@ -1215,7 +1243,7 @@ sogo_message_attachment_open_embedded_message (void *attachment_object, NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; MAPIStoreEmbeddedMessage *message; - int rc; + enum mapistore_error rc; if (attachment_object) { @@ -1254,7 +1282,7 @@ sogo_message_attachment_create_embedded_message (void *attachment_object, NSAutoreleasePool *pool; MAPIStoreAttachment *attachment; MAPIStoreEmbeddedMessage *message; - int rc; + enum mapistore_error rc; if (attachment_object) { @@ -1288,7 +1316,7 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; - int rc; + enum mapistore_error rc; if (table_object) { @@ -1318,7 +1346,7 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; - int rc; + enum mapistore_error rc; if (table_object) { @@ -1349,7 +1377,7 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; - int rc; + enum mapistore_error rc; if (table_object) { @@ -1382,7 +1410,7 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; - int rc; + enum mapistore_error rc; if (table_object) { @@ -1417,7 +1445,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; - int rc; + enum mapistore_error rc; if (table_object) { @@ -1450,7 +1478,7 @@ sogo_table_get_row_count (void *table_object, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; - int rc; + enum mapistore_error rc; if (table_object) { @@ -1481,7 +1509,7 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreTable *table; - int rc; + enum mapistore_error rc; if (table_object) { @@ -1513,7 +1541,7 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; - int rc; + enum mapistore_error rc; if (object) { @@ -1546,7 +1574,7 @@ sogo_properties_get_properties (void *object, struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; - int rc; + enum mapistore_error rc; if (object) { @@ -1578,7 +1606,7 @@ sogo_properties_set_properties (void *object, struct SRow *aRow) struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; MAPIStoreObject *propObject; - int rc; + enum mapistore_error rc; if (object) { @@ -1656,10 +1684,10 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx, \return MAPISTORE_SUCCESS on success, otherwise MAPISTORE error */ -int mapistore_init_backend(void) +enum mapistore_error mapistore_init_backend(void) { struct mapistore_backend backend; - int ret; + enum mapistore_error ret; static BOOL registered = NO; if (registered) diff --git a/OpenChange/MAPIStoreSOGoObject.h b/OpenChange/MAPIStoreSOGoObject.h index 411736718..dc9748371 100644 --- a/OpenChange/MAPIStoreSOGoObject.h +++ b/OpenChange/MAPIStoreSOGoObject.h @@ -65,18 +65,18 @@ - (uint64_t) objectId; /* implemented getters */ -- (int) getPidTagDisplayName: (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; +- (enum mapistore_error) getPidTagDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagSearchKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagGenerateExchangeViews: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagParentSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; /* subclasses */ - (uint64_t) objectVersion; diff --git a/OpenChange/MAPIStoreSOGoObject.m b/OpenChange/MAPIStoreSOGoObject.m index 7f1cc4b6a..497ee5116 100644 --- a/OpenChange/MAPIStoreSOGoObject.m +++ b/OpenChange/MAPIStoreSOGoObject.m @@ -136,16 +136,16 @@ static Class MAPIStoreFolderK; } /* getters */ -- (int) getPidTagDisplayName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagDisplayName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [[sogoObject displayName] asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidTagSearchKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSearchKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *stringValue; @@ -156,31 +156,31 @@ static Class MAPIStoreFolderK; return MAPISTORE_SUCCESS; } -- (int) getPidTagGenerateExchangeViews: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagGenerateExchangeViews: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidTagParentSourceKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagParentSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getReplicaKey: data fromGlobCnt: [container objectId] >> 16 inMemCtx: memCtx]; } -- (int) getPidTagSourceKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSourceKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getReplicaKey: data fromGlobCnt: [self objectId] >> 16 inMemCtx: memCtx]; } /* helper getters */ -- (int) getPidTagChangeKey: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagChangeKey: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; uint64_t obVersion; obVersion = [self objectVersion]; @@ -193,10 +193,10 @@ static Class MAPIStoreFolderK; return rc; } -- (int) getPidTagChangeNumber: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagChangeNumber: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc; + enum mapistore_error rc; struct mapistore_connection_info *connInfo; uint64_t obVersion; diff --git a/OpenChange/MAPIStoreSharingMessage.h b/OpenChange/MAPIStoreSharingMessage.h index 7db7f552f..101a64d6d 100644 --- a/OpenChange/MAPIStoreSharingMessage.h +++ b/OpenChange/MAPIStoreSharingMessage.h @@ -1,6 +1,6 @@ /* MAPIStoreSharingMessage.h - this file is part of SOGo-OpenChange * - * Copyright (C) 2015 Enrique J. Hernández + * Copyright (C) 2015-2016 Enrique J. Hernández * * Author: Enrique J. Hernández * @@ -39,58 +39,58 @@ fromMessage: (MAPIStoreMailMessage *) msg; /* getters */ -- (int) getPidLidSharingCapabilities: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingCapabilities: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingConfigurationUrl: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingConfigUrl: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingFlavor: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingFlavor: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingInitiatorEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingInitiatorName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingInitiatorSmtp: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingLocalType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingLocalType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingProviderGuid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingProviderGuid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingProviderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingProviderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingProviderUrl: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingProviderUrl: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingRemoteName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingRemoteName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingRemoteStoreUid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameXSharingRemoteStoreUid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingRemoteType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidTypeXSharingRemoteType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingResponseTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidLidSharingResponseType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getPidNameContentClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingCapabilities: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingCapabilities: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingConfigurationUrl: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingConfigUrl: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingFlavor: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingFlavor: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingInitiatorEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingInitiatorName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingInitiatorSmtp: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingLocalType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingLocalType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingProviderGuid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingProviderGuid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingProviderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingProviderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingProviderUrl: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingProviderUrl: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingRemoteName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingRemoteName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingRemoteStoreUid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameXSharingRemoteStoreUid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingRemoteType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidTypeXSharingRemoteType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingResponseTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidLidSharingResponseType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getPidNameContentClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; /* Save */ - (void) saveWithMessage: (MAPIStoreMailMessage *) msg diff --git a/OpenChange/MAPIStoreSharingMessage.m b/OpenChange/MAPIStoreSharingMessage.m index e1e0e79da..27ecbd47b 100644 --- a/OpenChange/MAPIStoreSharingMessage.m +++ b/OpenChange/MAPIStoreSharingMessage.m @@ -1,6 +1,6 @@ /* MAPIStoreSharingMessage.m - this file is part of SOGo-OpenChange * - * Copyright (C) 2015 Enrique J. Hernández + * Copyright (C) 2015-2016 Enrique J. Hernández * * Author: Enrique J. Hernández * @@ -108,8 +108,8 @@ } -- (int) getPidLidSharingCapabilities: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingCapabilities: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; @@ -125,8 +125,8 @@ return rc; } -- (int) getPidNameXSharingCapabilities: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingCapabilities: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; @@ -143,22 +143,22 @@ return rc; } -- (int) getPidLidSharingConfigurationUrl: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingConfigurationUrl: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidNameXSharingConfigUrl: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingConfigUrl: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidSharingConfigurationUrl: data inMemCtx: memCtx]; } -- (int) getPidLidSharingFlavor: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingFlavor: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* See [MS-OXSHARE] Section 2.2.2.5 for details */ enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; @@ -206,8 +206,8 @@ return rc; } -- (int) getPidNameXSharingFlavor: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingFlavor: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; id value; @@ -223,8 +223,8 @@ return rc; } -- (int) getPidLidSharingInitiatorEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingInitiatorEntryId: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; id value; @@ -244,38 +244,38 @@ return rc; } -- (int) getPidLidSharingInitiatorName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingInitiatorName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-initiatorname" inData: data inMemCtx: memCtx]; } -- (int) getPidLidSharingInitiatorSmtp: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingInitiatorSmtp: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-initiatorsmtp" inData: data inMemCtx: memCtx]; } -- (int) getPidLidSharingLocalType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingLocalType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-localtype" inData: data inMemCtx: memCtx]; } -- (int) getPidNameXSharingLocalType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingLocalType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidSharingLocalType: data inMemCtx: memCtx]; } -- (int) getPidLidSharingProviderGuid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingProviderGuid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { const unsigned char providerGuidBytes[] = {0xAE, 0xF0, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}; @@ -284,15 +284,15 @@ return MAPISTORE_SUCCESS; } -- (int) getPidNameXSharingProviderGuid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingProviderGuid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"AEF0060000000000C000000000000046" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getPidLidSharingProviderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingProviderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-providername" @@ -300,84 +300,84 @@ inMemCtx: memCtx]; } -- (int) getPidNameXSharingProviderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingProviderName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidSharingProviderName: data inMemCtx: memCtx]; } -- (int) getPidLidSharingProviderUrl: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingProviderUrl: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-providerurl" inData: data inMemCtx: memCtx]; } -- (int) getPidNameXSharingProviderUrl: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingProviderUrl: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidSharingProviderUrl: data inMemCtx: memCtx]; } -- (int) getPidLidSharingRemoteName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingRemoteName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-remotename" inData: data inMemCtx: memCtx]; } -- (int) getPidNameXSharingRemoteName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingRemoteName: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidSharingRemoteName: data inMemCtx: memCtx]; } -- (int) getPidLidSharingRemoteStoreUid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingRemoteStoreUid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-remotestoreuid" inData: data inMemCtx: memCtx]; } -- (int) getPidNameXSharingRemoteStoreUid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameXSharingRemoteStoreUid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidSharingRemoteStoreUid: data inMemCtx: memCtx]; } -- (int) getPidLidSharingRemoteType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingRemoteType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-remotetype" inData: data inMemCtx: memCtx]; } -- (int) getPidTypeXSharingRemoteType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTypeXSharingRemoteType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidSharingRemoteType: data inMemCtx: memCtx]; } -- (int) getPidLidSharingRemoteUid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingRemoteUid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getStringProperty: @"x-ms-sharing-remoteuid" inData: data inMemCtx: memCtx]; } -- (int) getPidUidXSharingRemoteUid: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidUidXSharingRemoteUid: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidLidSharingRemoteUid: data inMemCtx: memCtx]; } -- (int) getPidLidSharingResponseTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingResponseTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; id value; @@ -403,8 +403,8 @@ return rc; } -- (int) getPidLidSharingResponseType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidSharingResponseType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND; @@ -423,8 +423,8 @@ return rc; } -- (int) getPidNameContentClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidNameContentClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup (memCtx, "Sharing"); return MAPISTORE_SUCCESS; diff --git a/OpenChange/MAPIStoreTable.h b/OpenChange/MAPIStoreTable.h index 8c4b4718a..63e39dc79 100644 --- a/OpenChange/MAPIStoreTable.h +++ b/OpenChange/MAPIStoreTable.h @@ -88,17 +88,17 @@ typedef enum { - (void) cleanupCaches; -- (int) getAvailableProperties: (struct SPropTagArray **) propertiesP - inMemCtx: (TALLOC_CTX *) localMemCtx; +- (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) localMemCtx; - (void) setRestrictions: (const struct mapi_SRestriction *) res; -- (int) setColumns: (enum MAPITAGS *) newColumns - withCount: (uint16_t) newColumCount; -- (int) getRow: (struct mapistore_property_data **) dataP - withRowID: (uint32_t) rowId - andQueryType: (enum mapistore_query_type) queryType - inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getRowCount: (uint32_t *) countP - withQueryType: (enum mapistore_query_type) queryType; +- (enum mapistore_error) setColumns: (enum MAPITAGS *) newColumns + withCount: (uint16_t) newColumCount; +- (enum mapistore_error) getRow: (struct mapistore_property_data **) dataP + withRowID: (uint32_t) rowId + andQueryType: (enum mapistore_query_type) queryType + inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getRowCount: (uint32_t *) countP + withQueryType: (enum mapistore_query_type) queryType; /* helpers */ diff --git a/OpenChange/MAPIStoreTable.m b/OpenChange/MAPIStoreTable.m index 3b8270b6c..5bcba670e 100644 --- a/OpenChange/MAPIStoreTable.m +++ b/OpenChange/MAPIStoreTable.m @@ -366,8 +366,8 @@ static Class NSDataK, NSStringK; currentRow = (uint32_t) -1; } -- (int) getAvailableProperties: (struct SPropTagArray **) propertiesP - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP + inMemCtx: (TALLOC_CTX *) memCtx { return [[isa childObjectClass] getAvailableProperties: propertiesP inMemCtx: memCtx]; @@ -749,8 +749,8 @@ static Class NSDataK, NSStringK; } /* proof of concept */ -- (int) setColumns: (enum MAPITAGS *) newColumns - withCount: (uint16_t) newColumnsCount +- (enum mapistore_error) setColumns: (enum MAPITAGS *) newColumns + withCount: (uint16_t) newColumnsCount { NSUInteger count; @@ -831,15 +831,15 @@ static Class NSDataK, NSStringK; return nil; } -- (int) getRow: (struct mapistore_property_data **) dataP - withRowID: (uint32_t) rowId - andQueryType: (enum mapistore_query_type) queryType - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getRow: (struct mapistore_property_data **) dataP + withRowID: (uint32_t) rowId + andQueryType: (enum mapistore_query_type) queryType + inMemCtx: (TALLOC_CTX *) memCtx { NSUInteger count; MAPIStoreObject *child; struct mapistore_property_data *rowData; - int rc; + enum mapistore_error rc; child = [self childAtRowID: rowId forQueryType: queryType]; if (child) @@ -858,8 +858,8 @@ static Class NSDataK, NSStringK; return rc; } -- (int) getRowCount: (uint32_t *) countP - withQueryType: (enum mapistore_query_type) queryType +- (enum mapistore_error) getRowCount: (uint32_t *) countP + withQueryType: (enum mapistore_query_type) queryType { NSArray *children; diff --git a/OpenChange/MAPIStoreTasksFolder.h b/OpenChange/MAPIStoreTasksFolder.h index dc9b6791a..3d16a44ae 100644 --- a/OpenChange/MAPIStoreTasksFolder.h +++ b/OpenChange/MAPIStoreTasksFolder.h @@ -23,9 +23,9 @@ #ifndef MAPISTORETASKSFOLDER_H #define MAPISTORETASKSFOLDER_H -#import "MAPIStoreGCSFolder.h" +#import "MAPIStoreCalTaskFolder.h" -@interface MAPIStoreTasksFolder : MAPIStoreGCSFolder +@interface MAPIStoreTasksFolder : MAPIStoreCalTaskFolder @end diff --git a/OpenChange/MAPIStoreTasksFolder.m b/OpenChange/MAPIStoreTasksFolder.m index 9bc76def1..4b198d2d1 100644 --- a/OpenChange/MAPIStoreTasksFolder.m +++ b/OpenChange/MAPIStoreTasksFolder.m @@ -75,6 +75,10 @@ return newMessage; } +// -------------------------------------------- +// Permissions and sharing +// -------------------------------------------- + - (NSArray *) rolesForExchangeRights: (uint32_t) rights { NSMutableArray *roles; @@ -82,21 +86,34 @@ roles = [NSMutableArray arrayWithCapacity: 6]; if (rights & RightsCreateItems) [roles addObject: SOGoRole_ObjectCreator]; + if (rights & RightsDeleteAll) [roles addObject: SOGoRole_ObjectEraser]; + if (rights & RightsDeleteOwn) + [roles addObject: MAPIStoreRightDeleteOwn]; + if (rights & RightsEditAll) { [roles addObject: SOGoCalendarRole_PublicModifier]; [roles addObject: SOGoCalendarRole_PrivateModifier]; [roles addObject: SOGoCalendarRole_ConfidentialModifier]; } - else if (rights & RightsReadItems) + if (rights & RightsEditOwn) + [roles addObject: MAPIStoreRightEditOwn]; + + if (rights & RightsReadItems) { [roles addObject: SOGoCalendarRole_PublicViewer]; [roles addObject: SOGoCalendarRole_PrivateViewer]; [roles addObject: SOGoCalendarRole_ConfidentialViewer]; } + if (rights & RightsFolderOwner) + [roles addObject: MAPIStoreRightFolderOwner]; + + if (rights & RightsFolderContact) + [roles addObject: MAPIStoreRightFolderContact]; + return roles; } @@ -116,20 +133,65 @@ && [roles containsObject: SOGoCalendarRole_PrivateViewer] && [roles containsObject: SOGoCalendarRole_ConfidentialViewer]) rights |= RightsReadItems; + + if ([roles containsObject: MAPIStoreRightEditOwn]) + rights |= RightsEditOwn; + if ([roles containsObject: MAPIStoreRightDeleteOwn]) + rights |= RightsDeleteOwn; + if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ + if ([roles containsObject: MAPIStoreRightFolderOwner]) + rights |= RightsFolderOwner | RoleNone; + + if ([roles containsObject: MAPIStoreRightFolderContact]) + rights |= RightsFolderContact; + return rights; } +- (BOOL) subscriberCanModifyMessages +{ + static NSArray *modifierRoles = nil; + + if (!modifierRoles) + modifierRoles = [[NSArray alloc] initWithObjects: + SOGoCalendarRole_PublicModifier, + SOGoCalendarRole_PrivateModifier, + SOGoCalendarRole_ConfidentialModifier, + nil]; + + return ([[self activeUserRoles] firstObjectCommonWithArray: modifierRoles] + != nil); +} + +- (BOOL) subscriberCanReadMessages +{ + static NSArray *viewerRoles = nil; + + if (!viewerRoles) + viewerRoles = [[NSArray alloc] initWithObjects: + SOGoCalendarRole_PublicViewer, + SOGoCalendarRole_PrivateViewer, + SOGoCalendarRole_ConfidentialViewer, + nil]; + + return ([[self activeUserRoles] firstObjectCommonWithArray: viewerRoles] + != nil); +} + - (EOQualifier *) aclQualifier { return [EOQualifier qualifierWithQualifierFormat: [(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]]; } -- (int) getPidTagDefaultPostMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +// -------------------------------------------- +// Property getters +// -------------------------------------------- +- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Task" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreTasksMessage.h b/OpenChange/MAPIStoreTasksMessage.h index 3130b72a5..360c516ad 100644 --- a/OpenChange/MAPIStoreTasksMessage.h +++ b/OpenChange/MAPIStoreTasksMessage.h @@ -23,9 +23,9 @@ #ifndef MAPISTORETASKSMESSAGE_H #define MAPISTORETASKSMESSAGE_H -#import "MAPIStoreGCSMessage.h" +#import "MAPIStoreCalTaskMessage.h" -@interface MAPIStoreTasksMessage : MAPIStoreGCSMessage +@interface MAPIStoreTasksMessage : MAPIStoreCalTaskMessage @end diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index 12a348d4c..3cd3f1bfd 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -68,8 +68,8 @@ @implementation MAPIStoreTasksMessage -- (int) getPidTagIconIndex: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagIconIndex: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { /* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */ // Unassigned recurring task 0x00000501 @@ -83,16 +83,16 @@ return MAPISTORE_SUCCESS; } -- (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageClass: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = talloc_strdup(memCtx, "IPM.Task"); return MAPISTORE_SUCCESS; } -- (int) getPidTagNormalizedSubject: (void **) data // SUMMARY - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data // SUMMARY + inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; @@ -103,10 +103,10 @@ } /* FIXME: Should be combined somehow with the code in MAPIStoreAppointmentWrapper.m */ -- (int) getPidTagBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagBody: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSString *stringValue; iCalToDo *task; @@ -122,21 +122,32 @@ } /* FIXME: Should be combined somehow with the code in MAPIStoreAppointmentWrapper.m */ -- (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions + inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; task = [sogoObject component: NO secure: YES]; - if ([task symbolicAccessClass] == iCalAccessPublic) + if ([task isPublic]) return [self getNo: data inMemCtx: memCtx]; return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidTagImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagSensitivity: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + uint32_t v; + + v = (uint32_t) [self sensitivity]; + + *data = MAPILongValue (memCtx, v); + return MAPISTORE_SUCCESS; +} + +- (enum mapistore_error) getPidTagImportance: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; iCalToDo *task; @@ -154,8 +165,11 @@ return MAPISTORE_SUCCESS; } -- (int) getPidLidTaskComplete: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +//------------------------------------ +// Specific task related properties +//------------------------------------ +- (enum mapistore_error) getPidLidTaskComplete: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { iCalToDo *task; @@ -166,8 +180,8 @@ return MAPISTORE_SUCCESS; } -- (int) getPidLidPercentComplete: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidPercentComplete: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { double doubleValue; iCalToDo *task; @@ -180,10 +194,10 @@ return MAPISTORE_SUCCESS; } -- (int) getPidLidTaskDateCompleted: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskDateCompleted: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSCalendarDate *dateValue; iCalToDo *task; @@ -198,54 +212,54 @@ return rc; } -- (int) getPidLidTaskState: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskState: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x1); // not assigned return MAPISTORE_SUCCESS; } -- (int) getPidLidTaskMode: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskMode: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidLidTaskFRecurring: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskFRecurring: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidLidTaskAccepted: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskAccepted: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidLidTaskActualEffort: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskActualEffort: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidLidTaskEstimatedEffort: (void **) data // TODO - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskEstimatedEffort: (void **) data // TODO + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (int) getPidTagHasAttachments: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagHasAttachments: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getNo: data inMemCtx: memCtx]; } -- (int) getPidLidTaskDueDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskDueDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSCalendarDate *dateValue; iCalToDo *task; @@ -259,10 +273,10 @@ return rc; } -- (int) getPidLidTaskStartDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskStartDate: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; NSCalendarDate *dateValue; iCalToDo *task; @@ -277,26 +291,26 @@ } -- (int) getPidTagMessageDeliveryTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidTagMessageDeliveryTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } -- (int) getClientSubmitTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getClientSubmitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } -- (int) getLocalCommitTime: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getLocalCommitTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getPidTagLastModificationTime: data inMemCtx: memCtx]; } -- (int) getPidLidTaskStatus: (void **) data // status - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskStatus: (void **) data // status + inMemCtx: (TALLOC_CTX *) memCtx { NSString *status; uint32_t longValue; @@ -318,11 +332,12 @@ return MAPISTORE_SUCCESS; } -- (int) getPidLidTaskOwner: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskOwner: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { NSString *owner; + /* FIXME: This is wrong when setting task's request */ owner = [sogoObject ownerInContext: nil]; *data = [owner asUnicodeInMemCtx: memCtx]; @@ -330,31 +345,51 @@ return MAPISTORE_SUCCESS; } -- (int) getPidLidTaskOwnership: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getPidLidTaskOwnership: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { return [self getLongZero: data inMemCtx: memCtx]; } -- (BOOL) subscriberCanReadMessage +// ---------------------------------- +// Sharing +// ---------------------------------- +- (NSUInteger) sensitivity { - return ([[self activeUserRoles] - containsObject: SOGoCalendarRole_ComponentViewer] - || [self subscriberCanModifyMessage]); + iCalToDo *task; + NSUInteger v; + + task = [sogoObject component: NO secure: YES]; + /* FIXME: Use OpenChange constants names */ + switch ([task symbolicAccessClass]) + { + case iCalAccessPrivate: + v = 0x2; + break; + case iCalAccessConfidential: + v = 0x3; + break; + default: + v = 0x0; + break; + } + return v; } -- (BOOL) subscriberCanModifyMessage +- (NSString *) creator { - BOOL rc; - NSArray *roles = [self activeUserRoles]; + iCalToDo *task; - if (isNew) - rc = [roles containsObject: SOGoRole_ObjectCreator]; - else - rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier] - || [roles containsObject: SOGoCalendarRole_ComponentResponder]); + task = [sogoObject component: NO secure: YES]; + return [[task uniqueChildWithTag: @"x-sogo-component-created-by"] + flattenedValuesForKey: @""]; +} - return rc; +- (NSString *) owner +{ + /* This is not true but to allow a user edit its own tasks is required. + FIXME: When PidLidTaskOwner getter is properly implemented for Task Requests */ + return [self creator]; } - (void) save:(TALLOC_CTX *) memCtx @@ -524,10 +559,16 @@ [vToDo setAccessClass: @"PUBLIC"]; } + /* Creation */ now = [NSCalendarDate date]; if ([sogoObject isNew]) { [vToDo setCreated: now]; + /* Creator is used for sharing purposes */ + value = [properties objectForKey: MAPIPropertyKey (PidTagLastModifierName)]; + if (value) + [[vToDo uniqueChildWithTag: @"x-sogo-component-created-by"] setSingleValue: value + forKey: @""]; } [vToDo setTimeStampAsDate: now]; diff --git a/OpenChange/NSObject+MAPIStore.h b/OpenChange/NSObject+MAPIStore.h index ff5bed57d..52c276c00 100644 --- a/OpenChange/NSObject+MAPIStore.h +++ b/OpenChange/NSObject+MAPIStore.h @@ -41,16 +41,16 @@ struct MAPIStoreTallocWrapper @interface NSObject (MAPIStoreDataTypes) -- (int) getValue: (void **) data - forTag: (enum MAPITAGS) propTag - inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getValue: (void **) data + forTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx; /* getter helpers */ -- (int) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getLongZero: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getYes: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getNo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; -- (int) getSMTPAddrType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getLongZero: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getYes: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getNo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (enum mapistore_error) getSMTPAddrType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; @end diff --git a/OpenChange/NSObject+MAPIStore.m b/OpenChange/NSObject+MAPIStore.m index 9ed02b7ab..9962806c4 100644 --- a/OpenChange/NSObject+MAPIStore.m +++ b/OpenChange/NSObject+MAPIStore.m @@ -74,12 +74,12 @@ MAPIStoreTallocWrapperDestroy (void *data) @implementation NSObject (MAPIStoreDataTypes) -- (int) getValue: (void **) data - forTag: (enum MAPITAGS) propTag - inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getValue: (void **) data + forTag: (enum MAPITAGS) propTag + inMemCtx: (TALLOC_CTX *) memCtx { uint16_t valueType; - int rc = MAPISTORE_SUCCESS; + enum mapistore_error rc = MAPISTORE_SUCCESS; // [self logWithFormat: @"property %.8x found", propTag]; valueType = (propTag & 0xffff); @@ -139,35 +139,35 @@ MAPIStoreTallocWrapperDestroy (void *data) } /* helper getters */ -- (int) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getEmptyString: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"" asUnicodeInMemCtx: memCtx]; return MAPISTORE_SUCCESS; } -- (int) getLongZero: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getLongZero: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0); return MAPISTORE_SUCCESS; } -- (int) getYes: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getYes: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, YES); return MAPISTORE_SUCCESS; } -- (int) getNo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getNo: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, NO); return MAPISTORE_SUCCESS; } -- (int) getSMTPAddrType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (enum mapistore_error) getSMTPAddrType: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"SMTP" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/RTFHandler.m b/OpenChange/RTFHandler.m index d4f775b5d..c89f4c677 100644 --- a/OpenChange/RTFHandler.m +++ b/OpenChange/RTFHandler.m @@ -32,7 +32,7 @@ #define DEFAULT_CHARSET 1 #define FONTNAME_LEN_MAX 100 -#define UTF8_FIRST_BYTE_LAST_CODEPOINT 0x7F + // // Charset definitions. See http://msdn.microsoft.com/en-us/goglobal/bb964654 for all details. // @@ -608,7 +608,6 @@ static void _init_fontCws_table() word and is not part of the control word. */ end = _bytes; - *len = end-start-1; return start+1; @@ -1215,7 +1214,6 @@ inline static void parseUl(RTFHandler *self, BOOL hasArg, int arg, RTFFormatting unsigned char c; NSData *d; NSString *s; - unichar uch; stack = [[RTFStack alloc] init]; fontTable = nil; @@ -1223,7 +1221,7 @@ inline static void parseUl(RTFHandler *self, BOOL hasArg, int arg, RTFFormatting defaultCharset = ansicpg1252; formattingOptions = nil; - _html = [[NSMutableData alloc] init]; + _html = [[[NSMutableData alloc] init] autorelease]; [_html appendBytes: "" length: 34]; @@ -1251,10 +1249,10 @@ inline static void parseUl(RTFHandler *self, BOOL hasArg, int arg, RTFFormatting { // A hexadecimal value, based on the specified character set (may be used to identify 8-bit values). const char *b1, *b2; - unsigned short index; + short index; + short tmp; const unsigned short * active_charset; - if (formattingOptions && formattingOptions->charset) active_charset = formattingOptions->charset; else @@ -1267,8 +1265,21 @@ inline static void parseUl(RTFHandler *self, BOOL hasArg, int arg, RTFFormatting b1 = ADVANCE; b2 = ADVANCE; - index = (isdigit(*b1) ? *b1 - 48 : toupper(*b1) - 55) * 16; - index += (isdigit(*b2) ? *b2 - 48 : toupper(*b2) - 55); + tmp = (isdigit(*b1) ? *b1 - 48 : toupper(*b1) - 55); + if (tmp < 0 || tmp > 16) + { + // Incorrect first hexadecimal character. Skipping. + continue; + } + index = tmp*16; + + tmp = (isdigit(*b2) ? *b2 - 48 : toupper(*b2) - 55); + if (tmp < 0 || tmp > 16) + { + // Incorrect second hexadecimal character. Skipping. + continue; + } + index += tmp; s = [NSString stringWithCharacters: &(active_charset[index]) length: 1]; d = [s dataUsingEncoding: NSUTF8StringEncoding]; @@ -1437,20 +1448,17 @@ inline static void parseUl(RTFHandler *self, BOOL hasArg, int arg, RTFFormatting { c = *_bytes; // We avoid appending NULL bytes or endlines - if (c && (c != '\n')) + if (c && (c != '\n') && (c != '\r')) { - if (c <= UTF8_FIRST_BYTE_LAST_CODEPOINT) - { - // in this case utf8 and ascii encoding are the same - [_html appendBytes: &c length: 1]; - } - else - { - uch = c; - s = [NSString stringWithCharacters: &uch length: 1]; - d = [s dataUsingEncoding: NSUTF8StringEncoding]; - [_html appendData: d]; - } + const unsigned short * active_charset; + if (formattingOptions && formattingOptions->charset) + active_charset = formattingOptions->charset; + else + active_charset = defaultCharset; + + s = [NSString stringWithCharacters: &(active_charset[c]) length: 1]; + d = [s dataUsingEncoding: NSUTF8StringEncoding]; + [_html appendData: d]; } ADVANCE; } @@ -1459,7 +1467,7 @@ inline static void parseUl(RTFHandler *self, BOOL hasArg, int arg, RTFFormatting [_html appendBytes: "" length: 14]; [stack release]; - return [_html autorelease]; + return _html; } /* This method is for ease of testing and should not be used in normal operations */ diff --git a/OpenChange/code-MAPIStorePropertySelectors.h b/OpenChange/code-MAPIStorePropertySelectors.h index f338ebe62..cf2148e0d 100644 --- a/OpenChange/code-MAPIStorePropertySelectors.h +++ b/OpenChange/code-MAPIStorePropertySelectors.h @@ -20,8 +20,8 @@ * Boston, MA 02111-1307, USA. */ -typedef int (*MAPIStorePropertyGetter) (id inst, SEL _cmd, - void **data, TALLOC_CTX *memCtx); +typedef enum mapistore_error (*MAPIStorePropertyGetter) (id inst, SEL _cmd, + void **data, TALLOC_CTX *memCtx); const MAPIStorePropertyGetter *MAPIStorePropertyGettersForClass (Class klass); SEL MAPIStoreSelectorForPropertyGetter (uint16_t propertyId); diff --git a/OpenChange/gen-property-selectors.py b/OpenChange/gen-property-selectors.py index f009d6864..d0431784b 100755 --- a/OpenChange/gen-property-selectors.py +++ b/OpenChange/gen-property-selectors.py @@ -235,7 +235,7 @@ if __name__ == "__main__": highest_prop_idx = prop_idx getters.append(" @selector (get%s:inMemCtx:)" % name) # preferred_types.append(" 0x%.4x" % (prop_tag & 0xffff)) - prototypes.append("- (int) get%s: (void **) data inMemCtx: (TALLOC_CTX *) memCtx;" % name) + prototypes.append("- (enum mapistore_error) get%s: (void **) data inMemCtx: (TALLOC_CTX *) memCtx;" % name) current_getter_idx = current_getter_idx + 1 # setters[prop_idx] = " @selector (set%s:)" % name # prototypes.append("- (int) set%s: (void **) data;" % name) diff --git a/OpenChange/iCalEvent+MAPIStore.h b/OpenChange/iCalEvent+MAPIStore.h index 198526687..8d73923e1 100644 --- a/OpenChange/iCalEvent+MAPIStore.h +++ b/OpenChange/iCalEvent+MAPIStore.h @@ -37,6 +37,7 @@ - (void) updateFromMAPIProperties: (NSDictionary *) properties inUserContext: (MAPIStoreUserContext *) userContext withActiveUser: (SOGoUser *) activeUser + isNew: (BOOL) isNew inMemCtx: (TALLOC_CTX *) memCtx; @end diff --git a/OpenChange/iCalEvent+MAPIStore.m b/OpenChange/iCalEvent+MAPIStore.m index 25877029b..1bf0d261a 100644 --- a/OpenChange/iCalEvent+MAPIStore.m +++ b/OpenChange/iCalEvent+MAPIStore.m @@ -247,6 +247,7 @@ - (void) updateFromMAPIProperties: (NSDictionary *) properties inUserContext: (MAPIStoreUserContext *) userContext withActiveUser: (SOGoUser *) activeUser + isNew: (BOOL) isNew inMemCtx: (TALLOC_CTX *) memCtx { BOOL isAllDay; @@ -573,6 +574,14 @@ } } } + // Creator (with sharing purposes) + if (isNew) + { + value = [properties objectForKey: MAPIPropertyKey (PidTagLastModifierName)]; + if (value) + [[self uniqueChildWithTag: @"x-sogo-component-created-by"] setSingleValue: value + forKey: @""]; + } } @end diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 6ad5e22ba..17845a406 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -3387,12 +3387,60 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir } /* acls */ + +/* Compare two permissions to set first the highest access right, if unknown, then + do nothing */ +static NSComparisonResult _comparePermissions (id perm1, id perm2, void *context) +{ + static NSDictionary *permMap = nil; + NSNumber *num_1, *num_2; + + if (!permMap) + { + NSMutableArray *numberObjs; + NSUInteger i, max = 16; + + numberObjs = [NSMutableArray arrayWithCapacity: max]; + for (i = 0; i < max; i++) + [numberObjs addObject: [NSNumber numberWithInteger: i]]; + + /* Build the map to compare easily */ + permMap = [[NSDictionary alloc] initWithObjects: numberObjs + forKeys: [NSArray arrayWithObjects: + SOGoRole_ObjectEraser, + SOGoRole_ObjectCreator, + SOGoRole_ObjectEditor, + SOGoCalendarRole_ConfidentialModifier, + SOGoCalendarRole_ConfidentialResponder, + SOGoCalendarRole_ConfidentialViewer, + SOGoCalendarRole_ConfidentialDAndTViewer, + SOGoCalendarRole_PrivateModifier, + SOGoCalendarRole_PrivateResponder, + SOGoCalendarRole_PrivateViewer, + SOGoCalendarRole_PrivateDAndTViewer, + SOGoCalendarRole_PublicModifier, + SOGoCalendarRole_PublicResponder, + SOGoCalendarRole_PublicViewer, + SOGoCalendarRole_PublicDAndTViewer, + SOGoCalendarRole_FreeBusyReader, nil]]; + [permMap retain]; + } + + num_1 = [permMap objectForKey: perm1]; + if (!num_1) + num_1 = [NSNumber numberWithInteger: 255]; + num_2 = [permMap objectForKey: perm2]; + if (!num_2) + num_2 = [NSNumber numberWithInteger: 255]; + + return [num_1 compare: num_2]; +} + - (NSArray *) aclsForUser: (NSString *) uid forObjectAtPath: (NSArray *) objectPathArray { NSMutableArray *aclsForUser; NSArray *superAcls; - static NSArray *rolesClassifications = nil; superAcls = [super aclsForUser: uid forObjectAtPath: objectPathArray]; if ([uid isEqualToString: [self defaultUserID]]) @@ -3408,44 +3456,12 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir } else { - aclsForUser = [NSMutableArray array]; - if (!rolesClassifications) - { - rolesClassifications = - [NSArray arrayWithObjects: - [NSArray arrayWithObjects: - SOGoCalendarRole_PublicModifier, - SOGoCalendarRole_PublicResponder, - SOGoCalendarRole_PublicViewer, - SOGoCalendarRole_PublicDAndTViewer, - nil], - [NSArray arrayWithObjects: - SOGoCalendarRole_ConfidentialModifier, - SOGoCalendarRole_ConfidentialResponder, - SOGoCalendarRole_ConfidentialViewer, - SOGoCalendarRole_ConfidentialDAndTViewer, - nil], - [NSArray arrayWithObjects: - SOGoCalendarRole_PrivateModifier, - SOGoCalendarRole_PrivateResponder, - SOGoCalendarRole_PrivateViewer, - SOGoCalendarRole_PrivateDAndTViewer, - nil], - [NSArray arrayWithObject: SOGoRole_ObjectCreator], - [NSArray arrayWithObject: SOGoRole_ObjectEraser], - nil]; - [rolesClassifications retain]; - } - // When a user is a member of many groups for which there are access rights, multiple access rights - // can be returned for each classification. In this case, we only keep the highest access right. - int i, count = [rolesClassifications count]; - NSString *role; - for (i = 0; i < count; i++) - { - role = [[rolesClassifications objectAtIndex: i] firstObjectCommonWithArray: superAcls]; - if (role) - [aclsForUser addObject: role]; - } + /* Sort setting the highest access right first, so in the case + of a user member of several groups, the highest access right + is checked first, for instance, in + [SOGoAppointmentFolder:roleForComponentsWithAccessClass:forUser] */ + aclsForUser = (NSMutableArray *) [superAcls sortedArrayUsingFunction: _comparePermissions + context: NULL]; } return aclsForUser; diff --git a/SoObjects/Mailer/SOGoMailBaseObject.h b/SoObjects/Mailer/SOGoMailBaseObject.h index dcddaf876..8428c2a35 100644 --- a/SoObjects/Mailer/SOGoMailBaseObject.h +++ b/SoObjects/Mailer/SOGoMailBaseObject.h @@ -47,10 +47,13 @@ { NSURL *imap4URL; NGImap4Connection *imap4; + BOOL imap4ExceptionsEnabled; } - (BOOL) isFolderish; +- (id) init; + - (id) initWithImap4URL: (NSURL *) _url inContainer: (id) _container; diff --git a/SoObjects/Mailer/SOGoMailBaseObject.m b/SoObjects/Mailer/SOGoMailBaseObject.m index a1efa3548..ab257e2ec 100644 --- a/SoObjects/Mailer/SOGoMailBaseObject.m +++ b/SoObjects/Mailer/SOGoMailBaseObject.m @@ -40,11 +40,25 @@ @implementation SOGoMailBaseObject + +- (id)init +{ + if ((self = [super init])) + { + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + // With this to YES, imap4Connection will raise exception if a working + // connection cannot be provided + imap4ExceptionsEnabled = [ud boolForKey:@"SoIMAP4ExceptionsEnabled"]; + } + + return self; +} + - (id) initWithImap4URL: (NSURL *) _url inContainer: (id) _container { NSString *n; - + n = [[_url path] lastPathComponent]; if ((self = [self initWithName: n inContainer:_container])) { @@ -143,7 +157,10 @@ if (!newConnection) { newConnection = (NGImap4Connection *) [NSNull null]; - [self errorWithFormat:@"Could not connect IMAP4"]; + if (imap4ExceptionsEnabled) + [NSException raise: @"IOException" format: @"IMAP connection failed"]; + else + [self errorWithFormat:@"Could not connect IMAP4"]; } else { @@ -201,6 +218,22 @@ [imap4 retain]; } + // Connection broken, try to reconnect + if (![imap4 isKindOfClass: [NSNull class]] && ![[[imap4 client] isConnected] boolValue]) + { + [self warnWithFormat: @"IMAP connection is broken, trying to reconnect..."]; + [[imap4 client] reconnect]; + + // Still broken, give up + if (![[[imap4 client] isConnected] boolValue]) + { + if (imap4ExceptionsEnabled) + [NSException raise: @"IOException" format: @"IMAP connection failed"]; + else + [self errorWithFormat: @"Could not get a valid IMAP connection"]; + } + } + return [imap4 isKindOfClass: [NSNull class]] ? nil : imap4; } diff --git a/SoObjects/Mailer/SOGoMailObject.h b/SoObjects/Mailer/SOGoMailObject.h index af52334ee..8089bcf0b 100644 --- a/SoObjects/Mailer/SOGoMailObject.h +++ b/SoObjects/Mailer/SOGoMailObject.h @@ -129,9 +129,9 @@ NSArray *SOGoMailCoreInfoKeys; inContext: (id)_ctx; - (void) addRequiredKeysOfStructure: (NSDictionary *) info - path: (NSString *) p - toArray: (NSMutableArray *) keys - acceptedTypes: (NSArray *) types + path: (NSString *) p + toArray: (NSMutableArray *) keys + acceptedTypes: (NSArray *) types withPeek: (BOOL) withPeek; @end diff --git a/SoObjects/Mailer/SOGoMailObject.m b/SoObjects/Mailer/SOGoMailObject.m index e8155e958..38e9db674 100644 --- a/SoObjects/Mailer/SOGoMailObject.m +++ b/SoObjects/Mailer/SOGoMailObject.m @@ -507,12 +507,15 @@ static BOOL debugSoParts = NO; return s; } +/* This is defined before the public version without parentMimeType + argument to be able to call it recursively */ /* bulk fetching of plain/text content */ - (void) addRequiredKeysOfStructure: (NSDictionary *) info - path: (NSString *) p - toArray: (NSMutableArray *) keys - acceptedTypes: (NSArray *) types + path: (NSString *) p + toArray: (NSMutableArray *) keys + acceptedTypes: (NSArray *) types withPeek: (BOOL) withPeek + parentMultipart: (NSString *) parentMPart { /* This is used to collect the set of IMAP4 fetch-keys required to fetch @@ -527,6 +530,7 @@ static BOOL debugSoParts = NO; id body; NSString *bodyToken, *sp, *mimeType; id childInfo; + NSString *multipart; bodyToken = (withPeek ? @"body.peek" : @"body"); @@ -534,6 +538,12 @@ static BOOL debugSoParts = NO; [info valueForKey: @"type"], [info valueForKey: @"subtype"]] lowercaseString]; + + if ([[info valueForKey: @"type"] isEqualToString: @"multipart"]) + multipart = mimeType; + else + multipart = parentMPart; + if ([types containsObject: mimeType]) { if ([p length] > 0) @@ -548,7 +558,8 @@ static BOOL debugSoParts = NO; k = [NSString stringWithFormat: @"%@[text]", bodyToken]; } [keys addObject: [NSDictionary dictionaryWithObjectsAndKeys: k, @"key", - mimeType, @"mimeType", nil]]; + mimeType, @"mimeType", + multipart, @"multipart", nil]]; } parts = [info objectForKey: @"parts"]; @@ -562,9 +573,11 @@ static BOOL debugSoParts = NO; childInfo = [parts objectAtIndex: i]; [self addRequiredKeysOfStructure: childInfo - path: sp toArray: keys - acceptedTypes: types - withPeek: withPeek]; + path: sp + toArray: keys + acceptedTypes: types + withPeek: withPeek + parentMultipart: multipart]; } /* check body */ @@ -588,12 +601,28 @@ static BOOL debugSoParts = NO; else sp = [p length] > 0 ? (id)[p stringByAppendingString: @".1"] : (id)@"1"; [self addRequiredKeysOfStructure: body - path: sp toArray: keys - acceptedTypes: types - withPeek: withPeek]; + path: sp + toArray: keys + acceptedTypes: types + withPeek: withPeek + parentMultipart: multipart]; } } +- (void) addRequiredKeysOfStructure: (NSDictionary *) info + path: (NSString *) p + toArray: (NSMutableArray *) keys + acceptedTypes: (NSArray *) types + withPeek: (BOOL) withPeek +{ + [self addRequiredKeysOfStructure: (NSDictionary *) info + path: (NSString *) p + toArray: (NSMutableArray *) keys + acceptedTypes: (NSArray *) types + withPeek: (BOOL) withPeek + parentMultipart: @""]; +} + - (NSArray *) plainTextContentFetchKeys { /* diff --git a/SoObjects/SOGo/SOGoGroup.m b/SoObjects/SOGo/SOGoGroup.m index dc76593cf..eabd0ce34 100644 --- a/SoObjects/SOGo/SOGoGroup.m +++ b/SoObjects/SOGo/SOGoGroup.m @@ -57,6 +57,7 @@ #include "SOGoCache.h" #include "SOGoSource.h" +#include "SOGoSystemDefaults.h" #include "SOGoUserManager.h" #include "SOGoUser.h" @@ -102,13 +103,29 @@ + (id) groupWithIdentifier: (NSString *) theID inDomain: (NSString *) domain { - NSString *uid; + NSRange r; + NSString *uid, *inDomain; + SOGoSystemDefaults *sd; uid = [theID hasPrefix: @"@"] ? [theID substringFromIndex: 1] : theID; + inDomain = domain; + + sd = [SOGoSystemDefaults sharedSystemDefaults]; + if ([sd enableDomainBasedUID]) + { + /* Split domain from uid */ + r = [uid rangeOfString: @"@" options: NSBackwardsSearch]; + if (r.location != NSNotFound) + { + if (!domain) + inDomain = [uid substringFromIndex: r.location + 1]; + uid = [uid substringToIndex: r.location]; + } + } return [SOGoGroup groupWithValue: uid andSourceSelector: @selector (lookupGroupEntryByUID:inDomain:) - inDomain: domain]; + inDomain: inDomain]; } + (id) groupWithEmail: (NSString *) theEmail diff --git a/Tests/Unit/GNUmakefile b/Tests/Unit/GNUmakefile index 2c8b79a31..5b5bc82b1 100644 --- a/Tests/Unit/GNUmakefile +++ b/Tests/Unit/GNUmakefile @@ -24,6 +24,7 @@ $(TEST_TOOL)_OBJC_FILES += \ TestNGMimeAddressHeaderFieldGenerator.m \ TestNGMimeHeaderFieldGenerator.m \ TestNGMimeMessageGenerator.m \ + TestNGMimeType.m \ \ TestNSData+Crypto.m \ TestNSString+Crypto.m \ diff --git a/Tests/Unit/TestNGMimeHeaderFieldGenerator.m b/Tests/Unit/TestNGMimeHeaderFieldGenerator.m index 50c761e94..ca8babf01 100644 --- a/Tests/Unit/TestNGMimeHeaderFieldGenerator.m +++ b/Tests/Unit/TestNGMimeHeaderFieldGenerator.m @@ -83,6 +83,15 @@ @" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n" @" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n" @" =?utf-8?q?=D1=8C=D1=8C=D1=8C?=", nil], + [NSArray arrayWithObjects: + @"aжжжжжжжжжжж", + @"=?utf-8?q?a=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6?=\n" + @" =?utf-8?q?=D0=B6=D0=B6?=", nil], + [NSArray arrayWithObjects: + @"aжжжжжжжжжжжжжжжжжжжжж", + @"=?utf-8?q?a=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6?=\n" + @" =?utf-8?q?=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6=D0=B6?=\n" + @" =?utf-8?q?=D0=B6?=", nil], nil ]; NSArray *caseData; diff --git a/Tests/Unit/TestRTFHandler.m b/Tests/Unit/TestRTFHandler.m index 744abaa1b..1eeb3843f 100644 --- a/Tests/Unit/TestRTFHandler.m +++ b/Tests/Unit/TestRTFHandler.m @@ -43,26 +43,18 @@ return nil; RTFHandler *handler = [[RTFHandler alloc] initWithData: rtf]; - NSMutableData *data2 = [handler parse]; - if (data2 == nil) + NSMutableData *data = [handler parse]; + if (data == nil) { NSString *error = [NSString stringWithFormat: @"Couldn't parse RTF data:\n %s", (char *)[rtf bytes]]; testWithMessage(NO, error); } - html = [[NSString alloc] initWithData: data2 encoding: NSUTF8StringEncoding]; + html = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; if (html == nil) { - html = [[NSString alloc] initWithData: data2 encoding: NSASCIIStringEncoding]; - } - if (html == nil) - { - html = [[NSString alloc] initWithData: data2 encoding: NSISOLatin1StringEncoding]; - } - if (html == nil) - { - NSString *error = [NSString stringWithFormat: @"Couldn't convert parsed data"]; + NSString *error = [NSString stringWithFormat: @"Couldn't convert parsed data to UTF8 string"]; testWithMessage(NO, error); } return html; @@ -304,4 +296,22 @@ againstExpectedHTML: expected]; } +- (void) test_cyr_event_ru_editor +{ + NSString *file =@"cyr_event_ru_editor.rtf"; + NSString *expected=@"йчсмй
"; + + [self checkHTMLConversionOfRTFFile: file + againstExpectedHTML: expected]; +} + +- (void) test_bad_hex_and_cr +{ + NSString *file =@"bad_hex_and_cr.rtf"; + NSString *expected=@"Good hex:H Bad1Hex: Bad2Hex: Ignored Carriadge Return"; + + [self checkHTMLConversionOfRTFFile: file + againstExpectedHTML: expected]; +} + @end diff --git a/Tools/sogo-tool.m b/Tools/sogo-tool.m index e9c0e3c2a..2e6db71bc 100644 --- a/Tools/sogo-tool.m +++ b/Tools/sogo-tool.m @@ -26,6 +26,7 @@ #import #import +#import #import "SOGoTool.h" @@ -242,6 +243,9 @@ main (int argc, char **argv, char **env) pool = [NSAutoreleasePool new]; + /* load products */ + [[SOGoProductLoader productLoader] loadAllProducts]; + [SOGoSystemDefaults sharedSystemDefaults]; setupUserDefaults (); diff --git a/UI/Scheduler/UIxCalUserRightsEditor.m b/UI/Scheduler/UIxCalUserRightsEditor.m index 8682f8ead..bc2a0afc7 100644 --- a/UI/Scheduler/UIxCalUserRightsEditor.m +++ b/UI/Scheduler/UIxCalUserRightsEditor.m @@ -51,25 +51,24 @@ { NSEnumerator *roles, *types; NSString *role, *type; - unsigned int length; - roles = [userRights objectEnumerator]; - role = [roles nextObject]; - while (role) + types = [[self rightTypes] objectEnumerator]; + type = [types nextObject]; + while (type) { - types = [[self rightTypes] objectEnumerator]; - type = [types nextObject]; - while (type) - { - if ([role hasPrefix: type]) - { - length = [type length]; - [rights setObject: [role substringFromIndex: length] - forKey: type]; - } - type = [types nextObject]; - } + roles = [userRights objectEnumerator]; role = [roles nextObject]; + while (role) + { + if ([role hasPrefix: type]) + { + [rights setObject: [role substringFromIndex: [type length]] + forKey: type]; + break; + } + role = [roles nextObject]; + } + type = [types nextObject]; } }