commit
08501dacaa
|
@ -264,7 +264,7 @@ static NSCharacterSet *hexCharacterSet = nil;
|
||||||
|
|
||||||
if (contactInfos)
|
if (contactInfos)
|
||||||
{
|
{
|
||||||
username = [contactInfos objectForKey: @"c_uid"];
|
username = [contactInfos objectForKey: @"sAMAccountName"];
|
||||||
recipient->username = [username asUnicodeInMemCtx: msgData];
|
recipient->username = [username asUnicodeInMemCtx: msgData];
|
||||||
entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username);
|
entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username);
|
||||||
}
|
}
|
||||||
|
@ -273,7 +273,7 @@ static NSCharacterSet *hexCharacterSet = nil;
|
||||||
recipient->username = NULL;
|
recipient->username = NULL;
|
||||||
entryId = MAPIStoreExternalEntryId (cn, email);
|
entryId = MAPIStoreExternalEntryId (cn, email);
|
||||||
}
|
}
|
||||||
recipient->type = MAPI_TO;
|
recipient->type = [[person role] isEqualToString: @"OPT-PARTICIPANT"] ? MAPI_CC : MAPI_TO;
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
p = 0;
|
p = 0;
|
||||||
|
@ -283,7 +283,7 @@ static NSCharacterSet *hexCharacterSet = nil;
|
||||||
// PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE)
|
// PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE)
|
||||||
recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER);
|
recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER);
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
// PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI)
|
// PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI)
|
||||||
recipient->data[p] = MAPILongValue (msgData, 0);
|
recipient->data[p] = MAPILongValue (msgData, 0);
|
||||||
p++;
|
p++;
|
||||||
|
@ -365,7 +365,7 @@ static NSCharacterSet *hexCharacterSet = nil;
|
||||||
|
|
||||||
if (contactInfos)
|
if (contactInfos)
|
||||||
{
|
{
|
||||||
username = [contactInfos objectForKey: @"c_uid"];
|
username = [contactInfos objectForKey: @"sAMAccountName"];
|
||||||
recipient->username = [username asUnicodeInMemCtx: msgData];
|
recipient->username = [username asUnicodeInMemCtx: msgData];
|
||||||
entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username);
|
entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username);
|
||||||
}
|
}
|
||||||
|
@ -383,7 +383,7 @@ static NSCharacterSet *hexCharacterSet = nil;
|
||||||
// PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE)
|
// PR_OBJECT_TYPE = MAPI_MAILUSER (see MAPI_OBJTYPE)
|
||||||
recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER);
|
recipient->data[p] = MAPILongValue (msgData, MAPI_MAILUSER);
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
// PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI)
|
// PR_DISPLAY_TYPE = DT_MAILUSER (see MS-NSPI)
|
||||||
recipient->data[p] = MAPILongValue (msgData, 0);
|
recipient->data[p] = MAPILongValue (msgData, 0);
|
||||||
p++;
|
p++;
|
||||||
|
@ -931,7 +931,7 @@ static NSCharacterSet *hexCharacterSet = nil;
|
||||||
contactInfos = [mgr contactInfosForUserWithUIDorEmail: email];
|
contactInfos = [mgr contactInfosForUserWithUIDorEmail: email];
|
||||||
if (contactInfos)
|
if (contactInfos)
|
||||||
{
|
{
|
||||||
username = [contactInfos objectForKey: @"c_uid"];
|
username = [contactInfos objectForKey: @"sAMAccountName"];
|
||||||
entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username);
|
entryId = MAPIStoreInternalEntryId (connInfo->sam_ctx, username);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -182,6 +182,9 @@ static Class MAPIStoreCalendarMessageK = Nil;
|
||||||
forKey: MAPIPropertyKey (PR_CREATION_TIME)];
|
forKey: MAPIPropertyKey (PR_CREATION_TIME)];
|
||||||
[knownProperties setObject: @"c_uid"
|
[knownProperties setObject: @"c_uid"
|
||||||
forKey: MAPIPropertyKey (PR_OWNER_APPT_ID)];
|
forKey: MAPIPropertyKey (PR_OWNER_APPT_ID)];
|
||||||
|
/* Use by oxcfxics to sort the latest first */
|
||||||
|
[knownProperties setObject: @"c_lastmodified"
|
||||||
|
forKey: MAPIPropertyKey (PidTagMessageDeliveryTime)];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [knownProperties objectForKey: MAPIPropertyKey (property)];
|
return [knownProperties objectForKey: MAPIPropertyKey (property)];
|
||||||
|
|
|
@ -220,6 +220,9 @@ static Class MAPIStoreContactsMessageK, NGMailAddressK, NSDataK, NSStringK;
|
||||||
forKey: MAPIPropertyKey (PidTagSubject)];
|
forKey: MAPIPropertyKey (PidTagSubject)];
|
||||||
[knownProperties setObject: @"c_cn"
|
[knownProperties setObject: @"c_cn"
|
||||||
forKey: MAPIPropertyKey (PidTagNormalizedSubject)];
|
forKey: MAPIPropertyKey (PidTagNormalizedSubject)];
|
||||||
|
/* Use by oxcfxics to sort the latest first */
|
||||||
|
[knownProperties setObject: @"c_lastmodified"
|
||||||
|
forKey: MAPIPropertyKey (PidTagMessageDeliveryTime)];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [knownProperties objectForKey: MAPIPropertyKey (property)];
|
return [knownProperties objectForKey: MAPIPropertyKey (property)];
|
||||||
|
|
|
@ -185,12 +185,6 @@
|
||||||
/* subclass helpers */
|
/* subclass helpers */
|
||||||
- (void) setupVersionsMessage;
|
- (void) setupVersionsMessage;
|
||||||
- (void) ensureIDsForChildKeys: (NSArray *) keys;
|
- (void) ensureIDsForChildKeys: (NSArray *) keys;
|
||||||
- (void) postNotificationsForMoveCopyMessagesWithMIDs: (uint64_t *) srcMids
|
|
||||||
andMessageURLs: (NSArray *) oldMessageURLs
|
|
||||||
andCount: (uint32_t) midCount
|
|
||||||
fromFolder: (MAPIStoreFolder *) sourceFolder
|
|
||||||
withMIDs: (uint64_t *) targetMids
|
|
||||||
wantCopy: (uint8_t) wantCopy;
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -402,7 +402,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||||
withRow: (struct SRow *) aRow
|
withRow: (struct SRow *) aRow
|
||||||
andFID: (uint64_t) fid
|
andFID: (uint64_t) fid
|
||||||
{
|
{
|
||||||
int rc = MAPISTORE_SUCCESS;
|
BOOL mapped;
|
||||||
|
enum mapistore_error rc = MAPISTORE_SUCCESS;
|
||||||
MAPIStoreMapping *mapping;
|
MAPIStoreMapping *mapping;
|
||||||
NSString *baseURL, *childURL, *folderKey;
|
NSString *baseURL, *childURL, *folderKey;
|
||||||
MAPIStoreFolder *childFolder;
|
MAPIStoreFolder *childFolder;
|
||||||
|
@ -430,7 +431,12 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||||
childURL = [NSString stringWithFormat: @"%@%@/",
|
childURL = [NSString stringWithFormat: @"%@%@/",
|
||||||
baseURL,
|
baseURL,
|
||||||
[folderKey stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
|
[folderKey stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
|
||||||
[mapping registerURL: childURL withID: fid];
|
|
||||||
|
mapped = [mapping registerURL: childURL withID: fid];
|
||||||
|
if (!mapped)
|
||||||
|
/* Enforce the creation if the backend does know the fid */
|
||||||
|
[mapping updateURL: childURL withID: fid];
|
||||||
|
|
||||||
childFolder = [self lookupFolder: folderKey];
|
childFolder = [self lookupFolder: folderKey];
|
||||||
if (childFolder)
|
if (childFolder)
|
||||||
{
|
{
|
||||||
|
@ -581,8 +587,6 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||||
NSUInteger count, max;
|
NSUInteger count, max;
|
||||||
id msgObject;
|
id msgObject;
|
||||||
SOGoUser *ownerUser;
|
SOGoUser *ownerUser;
|
||||||
struct mapistore_connection_info *connInfo;
|
|
||||||
struct mapistore_object_notification_parameters *notif_parameters;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* flags that control the behaviour of the operation
|
/* flags that control the behaviour of the operation
|
||||||
|
@ -621,49 +625,6 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (![message isNew])
|
|
||||||
{
|
|
||||||
/* folder notification */
|
|
||||||
notif_parameters
|
|
||||||
= talloc_zero(NULL,
|
|
||||||
struct mapistore_object_notification_parameters);
|
|
||||||
notif_parameters->object_id = [self objectId];
|
|
||||||
notif_parameters->tag_count = 5;
|
|
||||||
notif_parameters->tags = talloc_array (notif_parameters,
|
|
||||||
enum MAPITAGS, 5);
|
|
||||||
notif_parameters->tags[0] = PR_CONTENT_COUNT;
|
|
||||||
notif_parameters->tags[1] = PR_DELETED_COUNT_TOTAL;
|
|
||||||
notif_parameters->tags[2] = PR_MESSAGE_SIZE;
|
|
||||||
notif_parameters->tags[3] = PR_NORMAL_MESSAGE_SIZE;
|
|
||||||
notif_parameters->tags[4] = PR_DELETED_MSG_COUNT;
|
|
||||||
notif_parameters->new_message_count = true;
|
|
||||||
notif_parameters->message_count = [[self messageKeys]
|
|
||||||
count] - 1;
|
|
||||||
connInfo = [[self context] connectionInfo];
|
|
||||||
mapistore_push_notification (connInfo->mstore_ctx,
|
|
||||||
MAPISTORE_FOLDER,
|
|
||||||
MAPISTORE_OBJECT_MODIFIED,
|
|
||||||
notif_parameters);
|
|
||||||
talloc_free(notif_parameters);
|
|
||||||
|
|
||||||
/* message notification */
|
|
||||||
notif_parameters
|
|
||||||
= talloc_zero(NULL,
|
|
||||||
struct mapistore_object_notification_parameters);
|
|
||||||
notif_parameters->object_id = mid;
|
|
||||||
notif_parameters->folder_id = [self objectId];
|
|
||||||
/* Exchange sends a fnevObjectCreated!! */
|
|
||||||
mapistore_push_notification (connInfo->mstore_ctx,
|
|
||||||
MAPISTORE_MESSAGE,
|
|
||||||
MAPISTORE_OBJECT_CREATED,
|
|
||||||
notif_parameters);
|
|
||||||
talloc_free(notif_parameters);
|
|
||||||
|
|
||||||
/* table notification */
|
|
||||||
for (count = 0; count < max; count++)
|
|
||||||
[[activeTables objectAtIndex: count]
|
|
||||||
notifyChangesForChild: message];
|
|
||||||
}
|
|
||||||
[self logWithFormat: @"successfully deleted object at URL: %@", childURL];
|
[self logWithFormat: @"successfully deleted object at URL: %@", childURL];
|
||||||
/* Ensure we are respecting flags parameter */
|
/* Ensure we are respecting flags parameter */
|
||||||
[mapping unregisterURLWithID: mid andFlags: flags];
|
[mapping unregisterURLWithID: mid andFlags: flags];
|
||||||
|
@ -790,13 +751,6 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||||
/* Notifications */
|
/* Notifications */
|
||||||
if (rc == MAPISTORE_SUCCESS)
|
if (rc == MAPISTORE_SUCCESS)
|
||||||
{
|
{
|
||||||
[self postNotificationsForMoveCopyMessagesWithMIDs: srcMids
|
|
||||||
andMessageURLs: oldMessageURLs
|
|
||||||
andCount: midCount
|
|
||||||
fromFolder: sourceFolder
|
|
||||||
withMIDs: targetMids
|
|
||||||
wantCopy: wantCopy];
|
|
||||||
|
|
||||||
// We cleanup cache of our source and destination folders
|
// We cleanup cache of our source and destination folders
|
||||||
[self cleanupCaches];
|
[self cleanupCaches];
|
||||||
[sourceFolder cleanupCaches];
|
[sourceFolder cleanupCaches];
|
||||||
|
@ -998,113 +952,6 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
|
||||||
withIDs: newIDs];
|
withIDs: newIDs];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) postNotificationsForMoveCopyMessagesWithMIDs: (uint64_t *) srcMids
|
|
||||||
andMessageURLs: (NSArray *) oldMessageURLs
|
|
||||||
andCount: (uint32_t) midCount
|
|
||||||
fromFolder: (MAPIStoreFolder *) sourceFolder
|
|
||||||
withMIDs: (uint64_t *) targetMids
|
|
||||||
wantCopy: (uint8_t) wantCopy
|
|
||||||
{
|
|
||||||
NSArray *activeTables;
|
|
||||||
NSUInteger count, tableCount, max;
|
|
||||||
MAPIStoreMessage *message;
|
|
||||||
NSString *messageURL;
|
|
||||||
MAPIStoreMapping *mapping;
|
|
||||||
struct mapistore_object_notification_parameters *notif_parameters;
|
|
||||||
struct mapistore_connection_info *connInfo;
|
|
||||||
|
|
||||||
connInfo = [[self context] connectionInfo];
|
|
||||||
|
|
||||||
// For the "source folder, we ensure the table caches are loaded so
|
|
||||||
// that old and new state can be compared
|
|
||||||
activeTables = [sourceFolder activeMessageTables];
|
|
||||||
max = [activeTables count];
|
|
||||||
for (count = 0; count < max; count++)
|
|
||||||
[[activeTables objectAtIndex: count] restrictedChildKeys];
|
|
||||||
|
|
||||||
if (!wantCopy)
|
|
||||||
{
|
|
||||||
// We notify the client. We start with the source folder.
|
|
||||||
notif_parameters = talloc_zero(NULL, struct mapistore_object_notification_parameters);
|
|
||||||
notif_parameters->object_id = [sourceFolder objectId];
|
|
||||||
notif_parameters->tag_count = 5;
|
|
||||||
notif_parameters->tags = talloc_array (notif_parameters, enum MAPITAGS, 5);
|
|
||||||
notif_parameters->tags[0] = PR_CONTENT_COUNT;
|
|
||||||
notif_parameters->tags[1] = PR_DELETED_COUNT_TOTAL;
|
|
||||||
notif_parameters->tags[2] = PR_MESSAGE_SIZE;
|
|
||||||
notif_parameters->tags[3] = PR_NORMAL_MESSAGE_SIZE;
|
|
||||||
notif_parameters->tags[4] = PR_RECIPIENT_ON_NORMAL_MSG_COUNT;
|
|
||||||
notif_parameters->new_message_count = true;
|
|
||||||
notif_parameters->message_count = [[sourceFolder messageKeys] count] - midCount;
|
|
||||||
mapistore_push_notification (connInfo->mstore_ctx,
|
|
||||||
MAPISTORE_FOLDER,
|
|
||||||
MAPISTORE_OBJECT_MODIFIED,
|
|
||||||
notif_parameters);
|
|
||||||
talloc_free(notif_parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
// move/copy notification of the copied/moved message
|
|
||||||
for (count = 0; count < midCount; count++)
|
|
||||||
{
|
|
||||||
notif_parameters = talloc_zero (NULL, struct mapistore_object_notification_parameters);
|
|
||||||
notif_parameters->tag_count = 0;
|
|
||||||
notif_parameters->new_message_count = true;
|
|
||||||
notif_parameters->message_count = 0;
|
|
||||||
notif_parameters->object_id = targetMids[count];
|
|
||||||
notif_parameters->folder_id = [self objectId];
|
|
||||||
notif_parameters->old_object_id = srcMids[count];
|
|
||||||
notif_parameters->old_folder_id = [sourceFolder objectId];
|
|
||||||
|
|
||||||
mapistore_push_notification (connInfo->mstore_ctx,
|
|
||||||
MAPISTORE_MESSAGE,
|
|
||||||
(wantCopy ? MAPISTORE_OBJECT_COPIED : MAPISTORE_OBJECT_MOVED),
|
|
||||||
notif_parameters);
|
|
||||||
talloc_free (notif_parameters);
|
|
||||||
|
|
||||||
message = [sourceFolder lookupMessageByURL: [oldMessageURLs objectAtIndex: count]];
|
|
||||||
// table notification
|
|
||||||
for (tableCount = 0; tableCount < max; tableCount++)
|
|
||||||
[[activeTables objectAtIndex: tableCount]
|
|
||||||
notifyChangesForChild: message];
|
|
||||||
}
|
|
||||||
|
|
||||||
// For the "destination folder, we ensure the table caches are loaded so
|
|
||||||
// that old and new state can be compared
|
|
||||||
activeTables = [self activeMessageTables];
|
|
||||||
max = [activeTables count];
|
|
||||||
for (count = 0; count < max; count++)
|
|
||||||
[[activeTables objectAtIndex: count] restrictedChildKeys];
|
|
||||||
|
|
||||||
notif_parameters = talloc_zero(NULL, struct mapistore_object_notification_parameters);
|
|
||||||
notif_parameters->object_id = [self objectId];
|
|
||||||
notif_parameters->tag_count = 5;
|
|
||||||
notif_parameters->tags = talloc_array (notif_parameters, enum MAPITAGS, 5);
|
|
||||||
notif_parameters->tags[0] = PR_CONTENT_COUNT;
|
|
||||||
notif_parameters->tags[1] = PR_DELETED_COUNT_TOTAL;
|
|
||||||
notif_parameters->tags[2] = PR_MESSAGE_SIZE;
|
|
||||||
notif_parameters->tags[3] = PR_NORMAL_MESSAGE_SIZE;
|
|
||||||
notif_parameters->tags[4] = PR_RECIPIENT_ON_NORMAL_MSG_COUNT;
|
|
||||||
notif_parameters->new_message_count = true;
|
|
||||||
notif_parameters->message_count = [[self messageKeys] count] + midCount;
|
|
||||||
connInfo = [[self context] connectionInfo];
|
|
||||||
mapistore_push_notification (connInfo->mstore_ctx,
|
|
||||||
MAPISTORE_FOLDER,
|
|
||||||
MAPISTORE_OBJECT_MODIFIED,
|
|
||||||
notif_parameters);
|
|
||||||
talloc_free(notif_parameters);
|
|
||||||
|
|
||||||
// table notification
|
|
||||||
mapping = [self mapping];
|
|
||||||
for (count = 0; count < midCount; count++)
|
|
||||||
{
|
|
||||||
messageURL = [mapping urlFromID: targetMids[count]];
|
|
||||||
message = [self lookupMessageByURL: messageURL];
|
|
||||||
for (tableCount = 0; tableCount < max; tableCount++)
|
|
||||||
[[activeTables objectAtIndex: tableCount]
|
|
||||||
notifyChangesForChild: message];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr
|
- (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr
|
||||||
andCN: (uint64_t *) cnPtr
|
andCN: (uint64_t *) cnPtr
|
||||||
fromChangeNumber: (uint64_t) changeNum
|
fromChangeNumber: (uint64_t) changeNum
|
||||||
|
|
|
@ -1295,13 +1295,6 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[self postNotificationsForMoveCopyMessagesWithMIDs: srcMids
|
|
||||||
andMessageURLs: oldMessageURLs
|
|
||||||
andCount: midCount
|
|
||||||
fromFolder: sourceFolder
|
|
||||||
withMIDs: targetMids
|
|
||||||
wantCopy: wantCopy];
|
|
||||||
|
|
||||||
// We cleanup cache of our source and destination folders
|
// We cleanup cache of our source and destination folders
|
||||||
[self cleanupCaches];
|
[self cleanupCaches];
|
||||||
[sourceFolder cleanupCaches];
|
[sourceFolder cleanupCaches];
|
||||||
|
|
|
@ -803,7 +803,7 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data)
|
||||||
contactInfos = [mgr contactInfosForUserWithUIDorEmail: email];
|
contactInfos = [mgr contactInfosForUserWithUIDorEmail: email];
|
||||||
if (contactInfos)
|
if (contactInfos)
|
||||||
{
|
{
|
||||||
username = [contactInfos objectForKey: @"c_uid"];
|
username = [contactInfos objectForKey: @"sAMAccountName"];
|
||||||
samCtx = [[self context] connectionInfo]->sam_ctx;
|
samCtx = [[self context] connectionInfo]->sam_ctx;
|
||||||
entryId = MAPIStoreInternalEntryId (samCtx, username);
|
entryId = MAPIStoreInternalEntryId (samCtx, username);
|
||||||
}
|
}
|
||||||
|
@ -1501,10 +1501,10 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data)
|
||||||
if ([cn length] == 0)
|
if ([cn length] == 0)
|
||||||
cn = email;
|
cn = email;
|
||||||
contactInfos = [mgr contactInfosForUserWithUIDorEmail: email];
|
contactInfos = [mgr contactInfosForUserWithUIDorEmail: email];
|
||||||
|
|
||||||
if (contactInfos)
|
if (contactInfos)
|
||||||
{
|
{
|
||||||
username = [contactInfos objectForKey: @"c_uid"];
|
username = [contactInfos objectForKey: @"sAMAccountName"];
|
||||||
recipient->username = [username asUnicodeInMemCtx: msgData];
|
recipient->username = [username asUnicodeInMemCtx: msgData];
|
||||||
entryId = MAPIStoreInternalEntryId (samCtx, username);
|
entryId = MAPIStoreInternalEntryId (samCtx, username);
|
||||||
}
|
}
|
||||||
|
|
|
@ -386,7 +386,7 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" };
|
||||||
contactInfos = [mgr contactInfosForUserWithUIDorEmail: email];
|
contactInfos = [mgr contactInfosForUserWithUIDorEmail: email];
|
||||||
if (contactInfos)
|
if (contactInfos)
|
||||||
{
|
{
|
||||||
username = [contactInfos objectForKey: @"c_uid"];
|
username = [contactInfos objectForKey: @"sAMAccountName"];
|
||||||
recipient->username = [username asUnicodeInMemCtx: msgData];
|
recipient->username = [username asUnicodeInMemCtx: msgData];
|
||||||
entryId = MAPIStoreInternalEntryId (samCtx, username);
|
entryId = MAPIStoreInternalEntryId (samCtx, username);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,8 @@
|
||||||
andFlags: (uint8_t) flags;
|
andFlags: (uint8_t) flags;
|
||||||
- (void) updateID: (uint64_t) idNbr
|
- (void) updateID: (uint64_t) idNbr
|
||||||
withURL: (NSString *) urlString;
|
withURL: (NSString *) urlString;
|
||||||
|
- (BOOL) updateURL: (NSString *) urlString
|
||||||
|
withID: (uint64_t) idNbr;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -227,12 +227,32 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL) updateURL: (NSString *) urlString
|
||||||
|
withID: (uint64_t) idNbr
|
||||||
|
{
|
||||||
|
BOOL rc = NO;
|
||||||
|
uint64_t oldIDNbr;
|
||||||
|
|
||||||
|
oldIDNbr = [self idFromURL: urlString];
|
||||||
|
if (oldIDNbr)
|
||||||
|
{
|
||||||
|
[self logWithFormat: @"Updating URL: %@ with id %.16"PRIx64" from old id %.16"PRIx64,
|
||||||
|
urlString, idNbr, oldIDNbr];
|
||||||
|
[self unregisterURLWithID: oldIDNbr];
|
||||||
|
[self registerURL: urlString
|
||||||
|
withID: idNbr];
|
||||||
|
rc = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
- (BOOL) registerURL: (NSString *) urlString
|
- (BOOL) registerURL: (NSString *) urlString
|
||||||
withID: (uint64_t) idNbr
|
withID: (uint64_t) idNbr
|
||||||
{
|
{
|
||||||
NSString *oldURL;
|
NSString *oldURL;
|
||||||
uint64_t oldIdNbr;
|
uint64_t oldIdNbr;
|
||||||
bool rc, softDeleted;
|
bool softDeleted;
|
||||||
|
|
||||||
oldURL = [self urlFromID: idNbr];
|
oldURL = [self urlFromID: idNbr];
|
||||||
if (oldURL != NULL)
|
if (oldURL != NULL)
|
||||||
|
@ -257,7 +277,6 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rc = YES;
|
|
||||||
// [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")",
|
// [self logWithFormat: @"registered url '%@' with id %lld (0x%.16"PRIx64")",
|
||||||
// urlString, idNbr, idNbr];
|
// urlString, idNbr, idNbr];
|
||||||
|
|
||||||
|
@ -266,7 +285,7 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr)
|
||||||
idNbr, [urlString UTF8String]);
|
idNbr, [urlString UTF8String]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) registerURLs: (NSArray *) urlStrings
|
- (void) registerURLs: (NSArray *) urlStrings
|
||||||
|
|
|
@ -465,9 +465,6 @@ rtf2html (NSData *compressedRTF)
|
||||||
enum mapistore_error rc;
|
enum mapistore_error rc;
|
||||||
NSArray *containerTables;
|
NSArray *containerTables;
|
||||||
NSUInteger count, max;
|
NSUInteger count, max;
|
||||||
struct mapistore_object_notification_parameters *notif_parameters;
|
|
||||||
uint64_t folderId;
|
|
||||||
struct mapistore_context *mstoreCtx;
|
|
||||||
MAPIStoreContext *context;
|
MAPIStoreContext *context;
|
||||||
SOGoUser *ownerUser;
|
SOGoUser *ownerUser;
|
||||||
BOOL userIsOwner;
|
BOOL userIsOwner;
|
||||||
|
@ -498,47 +495,6 @@ rtf2html (NSData *compressedRTF)
|
||||||
/* notifications */
|
/* notifications */
|
||||||
if ([container isKindOfClass: MAPIStoreFolderK])
|
if ([container isKindOfClass: MAPIStoreFolderK])
|
||||||
{
|
{
|
||||||
folderId = [(MAPIStoreFolder *) container objectId];
|
|
||||||
mstoreCtx = [[self context] connectionInfo]->mstore_ctx;
|
|
||||||
|
|
||||||
/* folder modified */
|
|
||||||
notif_parameters
|
|
||||||
= talloc_zero(memCtx, struct mapistore_object_notification_parameters);
|
|
||||||
notif_parameters->object_id = folderId;
|
|
||||||
if (isNew)
|
|
||||||
{
|
|
||||||
notif_parameters->tag_count = 3;
|
|
||||||
notif_parameters->tags = talloc_array (notif_parameters,
|
|
||||||
enum MAPITAGS, 3);
|
|
||||||
notif_parameters->tags[0] = PR_CONTENT_COUNT;
|
|
||||||
notif_parameters->tags[1] = PR_MESSAGE_SIZE;
|
|
||||||
notif_parameters->tags[2] = PR_NORMAL_MESSAGE_SIZE;
|
|
||||||
notif_parameters->new_message_count = true;
|
|
||||||
notif_parameters->message_count
|
|
||||||
= [[(MAPIStoreFolder *) container messageKeys] count] + 1;
|
|
||||||
}
|
|
||||||
mapistore_push_notification (mstoreCtx,
|
|
||||||
MAPISTORE_FOLDER,
|
|
||||||
MAPISTORE_OBJECT_MODIFIED,
|
|
||||||
notif_parameters);
|
|
||||||
talloc_free (notif_parameters);
|
|
||||||
|
|
||||||
/* message created */
|
|
||||||
if (isNew)
|
|
||||||
{
|
|
||||||
notif_parameters
|
|
||||||
= talloc_zero(memCtx,
|
|
||||||
struct mapistore_object_notification_parameters);
|
|
||||||
notif_parameters->object_id = [self objectId];
|
|
||||||
notif_parameters->folder_id = folderId;
|
|
||||||
|
|
||||||
notif_parameters->tag_count = 0xffff;
|
|
||||||
mapistore_push_notification (mstoreCtx,
|
|
||||||
MAPISTORE_MESSAGE, MAPISTORE_OBJECT_CREATED,
|
|
||||||
notif_parameters);
|
|
||||||
talloc_free (notif_parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we ensure the table caches are loaded so that old and new state
|
/* we ensure the table caches are loaded so that old and new state
|
||||||
can be compared */
|
can be compared */
|
||||||
containerTables = [self activeContainerMessageTables];
|
containerTables = [self activeContainerMessageTables];
|
||||||
|
|
|
@ -87,58 +87,7 @@
|
||||||
|
|
||||||
- (void) notifyChangesForChild: (MAPIStoreMessage *) child
|
- (void) notifyChangesForChild: (MAPIStoreMessage *) child
|
||||||
{
|
{
|
||||||
NSUInteger currentChildRow, newChildRow;
|
|
||||||
NSArray *list;
|
|
||||||
NSString *childName;
|
|
||||||
struct mapistore_table_notification_parameters notif_parameters;
|
|
||||||
struct mapistore_context *mstoreCtx;
|
|
||||||
|
|
||||||
mstoreCtx = [[(MAPIStoreFolder *) container context]
|
|
||||||
connectionInfo]->mstore_ctx;
|
|
||||||
|
|
||||||
notif_parameters.table_type = tableType;
|
|
||||||
notif_parameters.handle = handleId;
|
|
||||||
notif_parameters.folder_id = [(MAPIStoreFolder *) container objectId];
|
|
||||||
notif_parameters.object_id = [child objectId];
|
|
||||||
notif_parameters.instance_id = 0; /* TODO: always 0 ? */
|
|
||||||
|
|
||||||
childName = [child nameInContainer];
|
|
||||||
list = [self restrictedChildKeys];
|
|
||||||
currentChildRow = [list indexOfObject: childName];
|
|
||||||
notif_parameters.row_id = currentChildRow;
|
|
||||||
|
|
||||||
[self cleanupCaches];
|
|
||||||
list = [self restrictedChildKeys];
|
|
||||||
newChildRow = [list indexOfObject: childName];
|
|
||||||
|
|
||||||
if (currentChildRow == NSNotFound)
|
|
||||||
{
|
|
||||||
if (newChildRow != NSNotFound)
|
|
||||||
{
|
|
||||||
notif_parameters.row_id = newChildRow;
|
|
||||||
mapistore_push_notification (mstoreCtx,
|
|
||||||
MAPISTORE_TABLE,
|
|
||||||
MAPISTORE_OBJECT_CREATED,
|
|
||||||
¬if_parameters);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (newChildRow == NSNotFound)
|
|
||||||
mapistore_push_notification (mstoreCtx,
|
|
||||||
MAPISTORE_TABLE,
|
|
||||||
MAPISTORE_OBJECT_DELETED,
|
|
||||||
¬if_parameters);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* the fact that the row order has changed has no impact here */
|
|
||||||
notif_parameters.row_id = newChildRow;
|
|
||||||
mapistore_push_notification (mstoreCtx,
|
|
||||||
MAPISTORE_TABLE,
|
|
||||||
MAPISTORE_OBJECT_MODIFIED,
|
|
||||||
¬if_parameters);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -96,8 +96,11 @@ MAPIStoreInternalEntryId (struct ldb_context *samCtx, NSString *username)
|
||||||
[entryId appendUInt8: 0]; // end of string
|
[entryId appendUInt8: 0]; // end of string
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
entryId = nil;
|
{
|
||||||
|
NSLog (@"Error trying to generate EntryId for `%@`", username);
|
||||||
|
entryId = nil;
|
||||||
|
}
|
||||||
|
|
||||||
return entryId;
|
return entryId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,6 +157,9 @@ static Class MAPIStoreTasksMessageK = Nil;
|
||||||
forKey: MAPIPropertyKey (PidLidTaskDueDate)];
|
forKey: MAPIPropertyKey (PidLidTaskDueDate)];
|
||||||
[knownProperties setObject: @"c_creationdate"
|
[knownProperties setObject: @"c_creationdate"
|
||||||
forKey: MAPIPropertyKey (PidLidTaskOrdinal)];
|
forKey: MAPIPropertyKey (PidLidTaskOrdinal)];
|
||||||
|
/* Use by oxcfxics to sort the latest first */
|
||||||
|
[knownProperties setObject: @"c_lastmodified"
|
||||||
|
forKey: MAPIPropertyKey (PidTagMessageDeliveryTime)];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [knownProperties objectForKey: MAPIPropertyKey (property)];
|
return [knownProperties objectForKey: MAPIPropertyKey (property)];
|
||||||
|
|
|
@ -125,6 +125,11 @@ typedef BOOL (*EOComparator) (id, SEL, id);
|
||||||
finalKey = @"";
|
finalKey = @"";
|
||||||
|
|
||||||
propValue = [properties objectForKey: finalKey];
|
propValue = [properties objectForKey: finalKey];
|
||||||
|
/* sogo-openchange library stores the properties as NSString keys
|
||||||
|
and we have to check if the property exists using the NSString */
|
||||||
|
if (!propValue && [key isKindOfClass: [NSString class]])
|
||||||
|
propValue = [properties objectForKey: key];
|
||||||
|
|
||||||
comparator = (EOComparator) [propValue methodForSelector: operator];
|
comparator = (EOComparator) [propValue methodForSelector: operator];
|
||||||
|
|
||||||
return (comparator ? comparator (propValue, operator, value) : NO);
|
return (comparator ? comparator (propValue, operator, value) : NO);
|
||||||
|
|
|
@ -664,7 +664,7 @@ static Class NSNullK;
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
- (void) _fillContactInfosForUser: (NSMutableDictionary *) currentUser
|
- (void) _fillContactInfosForUser: (NSMutableDictionary *) currentUser
|
||||||
withUIDorEmail: (NSString *) uid
|
withUIDorEmail: (NSString *) uid
|
||||||
inDomain: (NSString *) domain
|
inDomain: (NSString *) domain
|
||||||
{
|
{
|
||||||
NSString *sourceID, *cn, *c_domain, *c_uid, *c_imaphostname, *c_imaplogin, *c_sievehostname;
|
NSString *sourceID, *cn, *c_domain, *c_uid, *c_imaphostname, *c_imaplogin, *c_sievehostname;
|
||||||
|
@ -685,12 +685,11 @@ static Class NSNullK;
|
||||||
c_sievehostname = nil;
|
c_sievehostname = nil;
|
||||||
|
|
||||||
[currentUser setObject: [NSNumber numberWithBool: YES]
|
[currentUser setObject: [NSNumber numberWithBool: YES]
|
||||||
forKey: @"CalendarAccess"];
|
forKey: @"CalendarAccess"];
|
||||||
[currentUser setObject: [NSNumber numberWithBool: YES]
|
[currentUser setObject: [NSNumber numberWithBool: YES]
|
||||||
forKey: @"MailAccess"];
|
forKey: @"MailAccess"];
|
||||||
|
|
||||||
sogoSources = [[self authenticationSourceIDsInDomain: domain]
|
sogoSources = [[self authenticationSourceIDsInDomain: domain] objectEnumerator];
|
||||||
objectEnumerator];
|
|
||||||
userEntry = nil;
|
userEntry = nil;
|
||||||
while (!userEntry && (sourceID = [sogoSources nextObject]))
|
while (!userEntry && (sourceID = [sogoSources nextObject]))
|
||||||
{
|
{
|
||||||
|
@ -698,44 +697,49 @@ static Class NSNullK;
|
||||||
userEntry = [currentSource lookupContactEntryWithUIDorEmail: uid
|
userEntry = [currentSource lookupContactEntryWithUIDorEmail: uid
|
||||||
inDomain: domain];
|
inDomain: domain];
|
||||||
if (userEntry)
|
if (userEntry)
|
||||||
{
|
{
|
||||||
[currentUser setObject: sourceID forKey: @"SOGoSource"];
|
[currentUser setObject: sourceID forKey: @"SOGoSource"];
|
||||||
if (!cn)
|
if (!cn)
|
||||||
cn = [userEntry objectForKey: @"c_cn"];
|
cn = [userEntry objectForKey: @"c_cn"];
|
||||||
if (!c_uid)
|
if (!c_uid)
|
||||||
c_uid = [userEntry objectForKey: @"c_uid"];
|
c_uid = [userEntry objectForKey: @"c_uid"];
|
||||||
if (!c_domain)
|
if (!c_domain)
|
||||||
c_domain = [userEntry objectForKey: @"c_domain"];
|
c_domain = [userEntry objectForKey: @"c_domain"];
|
||||||
c_emails = [userEntry objectForKey: @"c_emails"];
|
c_emails = [userEntry objectForKey: @"c_emails"];
|
||||||
if ([c_emails count])
|
if ([c_emails count])
|
||||||
[emails addObjectsFromArray: c_emails];
|
[emails addObjectsFromArray: c_emails];
|
||||||
if (!c_imaphostname)
|
if (!c_imaphostname)
|
||||||
c_imaphostname = [userEntry objectForKey: @"c_imaphostname"];
|
c_imaphostname = [userEntry objectForKey: @"c_imaphostname"];
|
||||||
if (!c_imaplogin)
|
if (!c_imaplogin)
|
||||||
c_imaplogin = [userEntry objectForKey: @"c_imaplogin"];
|
c_imaplogin = [userEntry objectForKey: @"c_imaplogin"];
|
||||||
if (!c_sievehostname)
|
if (!c_sievehostname)
|
||||||
c_sievehostname = [userEntry objectForKey: @"c_sievehostname"];
|
c_sievehostname = [userEntry objectForKey: @"c_sievehostname"];
|
||||||
access = [[userEntry objectForKey: @"CalendarAccess"] boolValue];
|
access = [[userEntry objectForKey: @"CalendarAccess"] boolValue];
|
||||||
if (!access)
|
if (!access)
|
||||||
[currentUser setObject: [NSNumber numberWithBool: NO]
|
[currentUser setObject: [NSNumber numberWithBool: NO]
|
||||||
forKey: @"CalendarAccess"];
|
forKey: @"CalendarAccess"];
|
||||||
access = [[userEntry objectForKey: @"MailAccess"] boolValue];
|
access = [[userEntry objectForKey: @"MailAccess"] boolValue];
|
||||||
if (!access)
|
if (!access)
|
||||||
[currentUser setObject: [NSNumber numberWithBool: NO]
|
[currentUser setObject: [NSNumber numberWithBool: NO]
|
||||||
forKey: @"MailAccess"];
|
forKey: @"MailAccess"];
|
||||||
|
|
||||||
// We check if it's a group
|
// We check if it's a group
|
||||||
isGroup = [userEntry objectForKey: @"isGroup"];
|
isGroup = [userEntry objectForKey: @"isGroup"];
|
||||||
if (isGroup)
|
if (isGroup)
|
||||||
[currentUser setObject: isGroup forKey: @"isGroup"];
|
[currentUser setObject: isGroup forKey: @"isGroup"];
|
||||||
|
|
||||||
// We also fill the resource attributes, if any
|
// We also fill the resource attributes, if any
|
||||||
if ([userEntry objectForKey: @"isResource"])
|
if ([userEntry objectForKey: @"isResource"])
|
||||||
[currentUser setObject: [userEntry objectForKey: @"isResource"]
|
[currentUser setObject: [userEntry objectForKey: @"isResource"]
|
||||||
forKey: @"isResource"];
|
forKey: @"isResource"];
|
||||||
if ([userEntry objectForKey: @"numberOfSimultaneousBookings"])
|
if ([userEntry objectForKey: @"numberOfSimultaneousBookings"])
|
||||||
[currentUser setObject: [userEntry objectForKey: @"numberOfSimultaneousBookings"]
|
[currentUser setObject: [userEntry objectForKey: @"numberOfSimultaneousBookings"]
|
||||||
forKey: @"numberOfSimultaneousBookings"];
|
forKey: @"numberOfSimultaneousBookings"];
|
||||||
|
|
||||||
|
// This is Active Directory specific attribute (needed on OpenChange/* layer)
|
||||||
|
if ([userEntry objectForKey: @"samaccountname"])
|
||||||
|
[currentUser setObject: [userEntry objectForKey: @"samaccountname"]
|
||||||
|
forKey: @"sAMAccountName"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -745,7 +749,7 @@ static Class NSNullK;
|
||||||
c_uid = @"";
|
c_uid = @"";
|
||||||
if (!c_domain)
|
if (!c_domain)
|
||||||
c_domain = @"";
|
c_domain = @"";
|
||||||
|
|
||||||
if (c_imaphostname)
|
if (c_imaphostname)
|
||||||
[currentUser setObject: c_imaphostname forKey: @"c_imaphostname"];
|
[currentUser setObject: c_imaphostname forKey: @"c_imaphostname"];
|
||||||
if (c_imaplogin)
|
if (c_imaplogin)
|
||||||
|
|
Loading…
Reference in New Issue