Fix for bug #2691
parent
633723a470
commit
6a39b48a37
|
@ -868,105 +868,116 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
{
|
{
|
||||||
NSString *srcMessageId, *srcFolderId, *dstFolderId, *dstMessageId;
|
NSString *srcMessageId, *srcFolderId, *dstFolderId, *dstMessageId;
|
||||||
SOGoMicrosoftActiveSyncFolderType srcFolderType, dstFolderType;
|
SOGoMicrosoftActiveSyncFolderType srcFolderType, dstFolderType;
|
||||||
|
id <DOMElement> aMoveOperation;
|
||||||
|
NSArray *moveOperations;
|
||||||
|
NSMutableString *s;
|
||||||
|
NSData *d;
|
||||||
|
int i;
|
||||||
|
|
||||||
srcMessageId = [[(id)[theDocumentElement getElementsByTagName: @"SrcMsgId"] lastObject] textValue];
|
moveOperations = (id)[theDocumentElement getElementsByTagName: @"Move"];
|
||||||
srcFolderId = [[[(id)[theDocumentElement getElementsByTagName: @"SrcFldId"] lastObject] textValue] realCollectionIdWithFolderType: &srcFolderType];
|
|
||||||
dstFolderId = [[[(id)[theDocumentElement getElementsByTagName: @"DstFldId"] lastObject] textValue] realCollectionIdWithFolderType: &dstFolderType];
|
s = [NSMutableString string];
|
||||||
|
|
||||||
// FIXME
|
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
|
||||||
if (srcFolderType == ActiveSyncMailFolder && dstFolderType == ActiveSyncMailFolder)
|
[s appendString: @"<!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\">"];
|
||||||
|
[s appendString: @"<MoveItems xmlns=\"Move:\">"];
|
||||||
|
|
||||||
|
for (i = 0; i < [moveOperations count]; i++)
|
||||||
{
|
{
|
||||||
NGImap4Client *client;
|
aMoveOperation = [moveOperations objectAtIndex: i];
|
||||||
id currentCollection;
|
|
||||||
|
|
||||||
NSDictionary *response;
|
|
||||||
NSString *v;
|
|
||||||
|
|
||||||
currentCollection = [self collectionFromId: srcFolderId type: srcFolderType];
|
srcMessageId = [[(id)[aMoveOperation getElementsByTagName: @"SrcMsgId"] lastObject] textValue];
|
||||||
|
srcFolderId = [[[(id)[aMoveOperation getElementsByTagName: @"SrcFldId"] lastObject] textValue] realCollectionIdWithFolderType: &srcFolderType];
|
||||||
|
dstFolderId = [[[(id)[aMoveOperation getElementsByTagName: @"DstFldId"] lastObject] textValue] realCollectionIdWithFolderType: &dstFolderType];
|
||||||
|
|
||||||
|
[s appendString: @"<Response>"];
|
||||||
|
|
||||||
// [currentFolder lookupName: [NSString stringWithFormat: @"folder%@", srcFolderId]
|
// FIXME - we should support moving events between calendars, for example, or
|
||||||
// inContext: context
|
// or contacts between address books.
|
||||||
// acquire: NO];
|
if (srcFolderType == ActiveSyncMailFolder && dstFolderType == ActiveSyncMailFolder)
|
||||||
|
|
||||||
client = [[currentCollection imap4Connection] client];
|
|
||||||
[client select: srcFolderId];
|
|
||||||
response = [client copyUid: [srcMessageId intValue]
|
|
||||||
toFolder: [NSString stringWithFormat: @"/%@", dstFolderId]];
|
|
||||||
|
|
||||||
// We extract the destionation message id
|
|
||||||
dstMessageId = nil;
|
|
||||||
|
|
||||||
if ([[response objectForKey: @"result"] boolValue]
|
|
||||||
&& (v = [[[response objectForKey: @"RawResponse"] objectForKey: @"ResponseResult"] objectForKey: @"flag"])
|
|
||||||
&& [v hasPrefix: @"COPYUID "])
|
|
||||||
{
|
{
|
||||||
dstMessageId = [[v componentsSeparatedByString: @" "] lastObject];
|
NGImap4Client *client;
|
||||||
|
id currentCollection;
|
||||||
|
|
||||||
|
NSDictionary *response;
|
||||||
|
NSString *v;
|
||||||
|
|
||||||
|
currentCollection = [self collectionFromId: srcFolderId type: srcFolderType];
|
||||||
|
|
||||||
|
client = [[currentCollection imap4Connection] client];
|
||||||
|
[client select: srcFolderId];
|
||||||
|
response = [client copyUid: [srcMessageId intValue]
|
||||||
|
toFolder: [NSString stringWithFormat: @"/%@", dstFolderId]];
|
||||||
|
|
||||||
|
// We extract the destionation message id
|
||||||
|
dstMessageId = nil;
|
||||||
|
|
||||||
|
if ([[response objectForKey: @"result"] boolValue]
|
||||||
|
&& (v = [[[response objectForKey: @"RawResponse"] objectForKey: @"ResponseResult"] objectForKey: @"flag"])
|
||||||
|
&& [v hasPrefix: @"COPYUID "])
|
||||||
|
{
|
||||||
|
dstMessageId = [[v componentsSeparatedByString: @" "] lastObject];
|
||||||
|
|
||||||
|
// We mark the original message as deleted
|
||||||
|
response = [client storeFlags: [NSArray arrayWithObject: @"Deleted"]
|
||||||
|
forUIDs: [NSArray arrayWithObject: srcMessageId]
|
||||||
|
addOrRemove: YES];
|
||||||
|
|
||||||
|
if ([[response valueForKey: @"result"] boolValue])
|
||||||
|
[(SOGoMailFolder *)currentCollection expunge];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dstMessageId)
|
||||||
|
{
|
||||||
|
// FIXME: should we return 1 or 2 here?
|
||||||
|
[s appendFormat: @"<Status>%d</Status>", 2];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// If the MoveItems operation is initiated by an Outlook client, we save the "deviceType+dstMessageId" to use it later in order to
|
||||||
|
// modify the Sync command from "add" to "change" (see SOGoActiveSyncDispatcher+Sync.m: -processSyncGetChanges: ...).
|
||||||
|
// This is to avoid Outlook creating dupes when moving messages across folfers.
|
||||||
|
//
|
||||||
|
if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"])
|
||||||
|
{
|
||||||
|
NSString *key;
|
||||||
|
|
||||||
|
// The key must be pretty verbose. We use the <uid>+<DeviceType>+<target folder>+<DstMsgId>
|
||||||
|
key = [NSString stringWithFormat: @"%@+%@+%@+%@",
|
||||||
|
[[context activeUser] login],
|
||||||
|
[context objectForKey: @"DeviceType"],
|
||||||
|
dstFolderId,
|
||||||
|
dstMessageId];
|
||||||
|
|
||||||
|
|
||||||
|
[[SOGoCache sharedCache] setValue: @"MovedItem"
|
||||||
|
forKey: key];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Everything is alright, lets return the proper response. "Status == 3" means success.
|
||||||
|
[s appendFormat: @"<SrcMsgId>%@</SrcMsgId>", srcMessageId];
|
||||||
|
[s appendFormat: @"<DstMsgId>%@</DstMsgId>", dstMessageId];
|
||||||
|
[s appendFormat: @"<Status>%d</Status>", 3];
|
||||||
|
}
|
||||||
|
|
||||||
// We mark the original message as deleted
|
|
||||||
response = [client storeFlags: [NSArray arrayWithObject: @"Deleted"]
|
|
||||||
forUIDs: [NSArray arrayWithObject: srcMessageId]
|
|
||||||
addOrRemove: YES];
|
|
||||||
|
|
||||||
if ([[response valueForKey: @"result"] boolValue])
|
|
||||||
[(SOGoMailFolder *)currentCollection expunge];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!dstMessageId)
|
|
||||||
{
|
|
||||||
[theResponse setStatus: 500];
|
|
||||||
[theResponse appendContentString: @"Unable to move message"];
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NSMutableString *s;
|
// Non-mail move operations - unsupported for now.
|
||||||
NSData *d;
|
[s appendFormat: @"<Status>%d</Status>", 1];
|
||||||
|
|
||||||
//
|
|
||||||
// If the MoveItems operation is initiated by an Outlook client, we save the "deviceType+dstMessageId" to use it later in order to
|
|
||||||
// modify the Sync command from "add" to "change" (see SOGoActiveSyncDispatcher+Sync.m: -processSyncGetChanges: ...).
|
|
||||||
// This is to avoid Outlook creating dupes when moving messages across folfers.
|
|
||||||
//
|
|
||||||
if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"])
|
|
||||||
{
|
|
||||||
NSString *key;
|
|
||||||
|
|
||||||
// The key must be pretty verbose. We use the <uid>+<DeviceType>+<target folder>+<DstMsgId>
|
|
||||||
key = [NSString stringWithFormat: @"%@+%@+%@+%@",
|
|
||||||
[[context activeUser] login],
|
|
||||||
[context objectForKey: @"DeviceType"],
|
|
||||||
dstFolderId,
|
|
||||||
dstMessageId];
|
|
||||||
|
|
||||||
|
|
||||||
[[SOGoCache sharedCache] setValue: @"MovedItem"
|
|
||||||
forKey: key];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Everything is alright, lets return the proper response. "Status == 3" means success.
|
|
||||||
s = [NSMutableString string];
|
|
||||||
|
|
||||||
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
|
|
||||||
[s appendString: @"<!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\">"];
|
|
||||||
[s appendString: @"<MoveItems xmlns=\"Move:\">"];
|
|
||||||
[s appendString: @"<Response>"];
|
|
||||||
[s appendFormat: @"<SrcMsgId>%@</SrcMsgId>", srcMessageId];
|
|
||||||
[s appendFormat: @"<DstMsgId>%@</DstMsgId>", dstMessageId];
|
|
||||||
[s appendFormat: @"<Status>%d</Status>", 3];
|
|
||||||
[s appendString: @"</Response>"];
|
|
||||||
[s appendString: @"</MoveItems>"];
|
|
||||||
|
|
||||||
d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml];
|
|
||||||
|
|
||||||
[theResponse setContent: d];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[s appendString: @"</Response>"];
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
[theResponse setStatus: 500];
|
[s appendString: @"</MoveItems>"];
|
||||||
[theResponse appendContentString: @"Unsupported move operation"];
|
|
||||||
}
|
d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml];
|
||||||
|
|
||||||
|
[theResponse setContent: d];
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
1
NEWS
1
NEWS
|
@ -9,6 +9,7 @@ Bug fixes
|
||||||
- fixed calling unescapeHTML on null variables to avoid JavaScript exceptions in Contacts module
|
- fixed calling unescapeHTML on null variables to avoid JavaScript exceptions in Contacts module
|
||||||
- fixed detection of IMAP flags support on the client side (#2664)
|
- fixed detection of IMAP flags support on the client side (#2664)
|
||||||
- fixed the ActiveSync issue marking all mails as read when downloading them
|
- fixed the ActiveSync issue marking all mails as read when downloading them
|
||||||
|
- fixed ActiveSync's move operations not working for multiple selections (#2691)
|
||||||
|
|
||||||
2.2.2 (2014-03-21)
|
2.2.2 (2014-03-21)
|
||||||
------------------
|
------------------
|
||||||
|
|
Loading…
Reference in New Issue