From 0c94f9b09d36fde0138a1ba5c6c9de38c2fe4a0f Mon Sep 17 00:00:00 2001
From: root <root@example.com>
Date: Tue, 11 Mar 2014 19:19:00 -0400
Subject: [PATCH] outlook moveitems dup messages

---
 ActiveSync/NSString+ActiveSync.h           |    1 +
 ActiveSync/NSString+ActiveSync.m           |   17 +++++++++++++++++
 ActiveSync/SOGoActiveSyncDispatcher+Sync.m |   18 ++++++++++++++++++
 ActiveSync/SOGoActiveSyncDispatcher.m      |   22 ++++++++++++++++++++++
 4 files changed, 58 insertions(+)

diff --git a/ActiveSync/NSString+ActiveSync.h b/ActiveSync/NSString+ActiveSync.h
index 6f0433d..f3f95b0 100644
--- a/ActiveSync/NSString+ActiveSync.h
+++ b/ActiveSync/NSString+ActiveSync.h
@@ -46,6 +46,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 - (NSString *) realCollectionIdWithFolderType: (SOGoMicrosoftActiveSyncFolderType *) folderType;
 - (NSCalendarDate *) calendarDate;
 - (NSString *) deviceId;
+- (NSString *) deviceType;
 - (NSString *) command;
 - (NSData *) convertHexStringToBytes;
 
diff --git a/ActiveSync/NSString+ActiveSync.m b/ActiveSync/NSString+ActiveSync.m
index 8b09c75..1c7a8ba 100644
--- a/ActiveSync/NSString+ActiveSync.m
+++ b/ActiveSync/NSString+ActiveSync.m
@@ -170,6 +170,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 }
 
 //
+// This method extracts the "DeviceType" from a URI:
+//
+// /SOGo/Microsoft-Server-ActiveSync?Cmd=FolderSync&User=sogo10&DeviceId=SEC17CD1A3E9E3F2&DeviceType=SAMSUNGSGHI317M
+//
+- (NSString *) deviceType
+{
+  NSString *s;
+
+  s = [self _valueForParameter: @"DEVICETYPE="];
+
+  if (!s)
+    s = @"Unknown";
+
+  return s;
+}
+
+//
 //
 //
 - (NSString *) command
diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
index b214984..0f9992b 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
@@ -103,6 +103,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include <unistd.h>
 
+//tfu
+#import <SOGo/SOGoCache.h>
+
+
 @implementation SOGoActiveSyncDispatcher (Sync)
 
 //
@@ -617,6 +621,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
             
             uid = [[[aMessage allKeys] lastObject] stringValue];
             command = [[aMessage allValues] lastObject];          
+
+//tfu
+
+
+            // if "deviceType+uid" found in cache it was saved by SOGoActiveSyncDispatcher.m (moveitem - outlook client) change the command = 'changed'
+            if ([[SOGoCache sharedCache] valueForKey: [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceType"], uid ]]) {
+               NSLog(@"tfu moveMessage %@ - %@", [context objectForKey: @"DeviceType"], uid );
+
+               [[SOGoCache sharedCache] removeValueForKey: [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceType"], uid ]];
+
+	       command = @"changed";
+            }
+
+//tfu
             
             if ([command isEqualToString: @"added"])
               [s appendString: @"<Add xmlns=\"AirSync:\">"];
diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m
index efb2013..9c18471 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher.m
@@ -114,6 +114,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "SOGoActiveSyncConstants.h"
 #include "SOGoMailObject+ActiveSync.h"
 
+//tfu
+#import <SOGo/SOGoCache.h>
+
 #include <unistd.h>
 
 @implementation SOGoActiveSyncDispatcher
@@ -924,6 +927,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         {
           NSMutableString *s;
           NSData *d;
+
+//tfu
+
+          NSLog(@"tfu MoveItem  %@ - %@", [context objectForKey: @"DeviceType"], dstMessageId );
+          NSLog(@"tfu MoveItem1 %@ - %@", [context objectForKey: @"DeviceId"], dstMessageId );
+
+          // if move is initiated by an outlook client save the "deviceType+dstMessageId" to use it later to modify the sync-command from add to change (SOGoActiveSyncDispatcher+Sync.m)
+          if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15" ] ) {
+              NSLog(@"tfu MoveItem 2 %@ - %@", [context objectForKey: @"DeviceType"], dstMessageId );
+
+              [[SOGoCache sharedCache] setValue: @"MovedItem" forKey: [NSString stringWithFormat: @"%@+%@",  [context objectForKey: @"DeviceType"], dstMessageId]];
+
+              NSLog(@"tfu MoveItem 3 %@ - %@", [context objectForKey: @"DeviceType"], dstMessageId );
+          }
+//tfu
+
           
           // Everything is alright, lets return the proper response. "Status == 3" means success.
           s = [NSMutableString string];
@@ -1526,6 +1545,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   deviceId = [[theRequest uri] deviceId];
   [context setObject: deviceId  forKey: @"DeviceId"];
 
+//tfu
+  [context setObject:  [[theRequest uri] deviceType]  forKey: @"DeviceType"];
+
   d = [[theRequest content] wbxml2xml];
   documentElement = nil;
 
-- 
1.7.9.5

