From 96aab54fcd65bd7702ff526342b343a1d50abbd1 Mon Sep 17 00:00:00 2001
From: root <root@example.com>
Date: Tue, 27 May 2014 20:02:32 +0200
Subject: [PATCH 3/3] sd2

---
 ActiveSync/SOGoActiveSyncDispatcher+Sync.m |   44 ++++++++++++++++++++++++++--
 ActiveSync/SOGoActiveSyncDispatcher.m      |   21 +++++++++++++
 2 files changed, 62 insertions(+), 3 deletions(-)

diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
index 91f5d5d..787fe9a 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
@@ -480,7 +480,47 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   NSMutableString *s;
   
   BOOL more_available;
-  int i, max;
+  int i, max, sd_count;
+  s = [NSMutableString string];
+
+  NSMutableDictionary *folderMetadata, *dateCache, *syncCache;
+  NSMutableArray *sdUids;
+
+  if (theFolderType == ActiveSyncMailFolder && !([theSyncKey isEqualToString: @"-1"])) {
+      if (theFilterType) {
+         sdUids =[[NSMutableArray alloc] init];
+         sd_count=0;
+
+         folderMetadata = [self _folderMetadataForKey: [theCollection nameInContainer]];
+         dateCache = [folderMetadata objectForKey: @"DateCache"];
+         syncCache = [folderMetadata objectForKey: @"SyncCache"];
+
+         for (NSString* key in [dateCache allKeys]) {
+             if ([[dateCache objectForKey:key] compare: theFilterType ] == NSOrderedAscending ) {
+                [s appendString: @"<SoftDelete xmlns=\"AirSync:\">"];
+                [s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", key];
+                [s appendString: @"</SoftDelete>"];
+NSLog(@"tfu softdelete %@ %@",key,syncCache);
+NSLog(@"tfu softdelete %@ %@",key,dateCache);
+                [syncCache removeObjectForKey: key];
+                [dateCache removeObjectForKey: key];
+
+                sd_count++;
+            }
+
+            if (sd_count >= theWindowSize) {
+               [folderMetadata setObject: [NSNumber numberWithBool: YES]  forKey: @"MoreAvailable"];
+               *theLastServerKey = theSyncKey;
+
+            [self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]]; 
+
+            return;
+            }
+         }
+
+         [self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]]; 
+      }
+  }
 
   //
   // No changes in the collection - 2.2.2.19.1.1 Empty Sync Request.
@@ -489,8 +529,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   if ([theSyncKey isEqualToString: [theCollection davCollectionTag]])
     return;
   
-  s = [NSMutableString string];
-  
   more_available = NO;
 
   switch (theFolderType)
diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m
index 48d5c53..fd99bab 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher.m
@@ -845,6 +845,27 @@ break;
                                               sortOrdering: @"REVERSE ARRIVAL"
                                                   threaded: NO];
       count = [uids count];
+
+      // count number of uids due to softdelete
+      NSMutableDictionary *dateCache;
+      SOGoCacheGCSObject *o;
+      NSMutableArray *sdUids;
+
+      sdUids =[[NSMutableArray alloc] init];
+
+      if (filter) {
+         o = [SOGoCacheGCSObject objectWithName: [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], realCollectionId] inContainer: nil];
+         [o setObjectType: ActiveSyncGlobalCacheObject];
+         [o setTableUrl: [self folderTableURL]];
+         [o reloadIfNeeded];
+         dateCache = [[o properties] objectForKey: @"DateCache"];
+         for (NSString* key in [dateCache allKeys]) {
+             if ([[dateCache objectForKey:key] compare: filter ] == NSOrderedAscending )
+               [sdUids addObject:[dateCache objectForKey:key]];
+         }
+
+         count+= [sdUids count];
+      }
     }
   else
     {
-- 
1.7.9.5

