From 82cf481afec0dc1503d6d732be63f96173c7dbf6 Mon Sep 17 00:00:00 2001
From: root <root@poldi.hopto.org>
Date: Fri, 20 Jun 2014 15:56:05 +0200
Subject: [PATCH 1/2] softDelete

---
 ActiveSync/SOGoActiveSyncDispatcher+Sync.m |   58 ++++++++++++++++++++++++----
 ActiveSync/SOGoActiveSyncDispatcher.m      |   30 ++++++++++++++
 2 files changed, 81 insertions(+), 7 deletions(-)

diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
index 8c206ba..5259da6 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
@@ -477,21 +477,64 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                  lastServerKey: (NSString **) theLastServerKey
 
 {
-  NSMutableDictionary *folderMetadata;
+  //NSMutableDictionary *folderMetadata;
   NSMutableString *s;
   
   BOOL more_available;
-  int i, max;
+  int i, max, sd_count;
+  s = [NSMutableString string];
+
+  NSMutableDictionary *folderMetadata, *dateCache, *syncCache;
+
+  more_available = NO;
+
+  if (theFolderType == ActiveSyncMailFolder && !([theSyncKey isEqualToString: @"-1"])) {
+      if (theFilterType) {
+         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>"];
+
+                [syncCache removeObjectForKey: key];
+                [dateCache removeObjectForKey: key];
+
+                sd_count++;
+            }
+
+            if (sd_count >= theWindowSize) {
+               [folderMetadata setObject: [NSNumber numberWithBool: YES]  forKey: @"MoreAvailable"];
+               more_available = YES;
+               *theLastServerKey = theSyncKey;
+
+               [self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]];
+
+               goto return_response;
+            }
+         }
+
+         if (more_available)
+           [folderMetadata setObject: [NSNumber numberWithBool: YES]  forKey: @"MoreAvailable"];
+         else
+           [folderMetadata removeObjectForKey: @"MoreAvailable"];
+
+         [self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]];
+      }
+  }
 
   //
   // No changes in the collection - 2.2.2.19.1.1 Empty Sync Request.
   // We check this and we don't generate any commands if we don't have to.
   //
-  if ([theSyncKey isEqualToString: [theCollection davCollectionTag]])
+  if ([theSyncKey isEqualToString: [theCollection davCollectionTag]] && !([s length]))
     return;
   
-  s = [NSMutableString string];
-  
   more_available = NO;
 
   switch (theFolderType)
@@ -777,7 +820,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     [s appendString: @"</Add>"];
                     
                     [syncCache setObject: [aCacheObject sequence]  forKey: [aCacheObject uid]];
-                    [dateCache setObject: [NSCalendarDate date]  forKey: [aCacheObject uid]];
+                    [dateCache setObject: [mailObject date]  forKey: [aCacheObject uid]];
                     return_count++;
                   }
                 else
@@ -805,6 +848,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       break;
     } // switch (folderType) ...
   
+return_response:
+
   if ([s length])
     {
       [theBuffer appendString: @"<Commands>"];
@@ -1008,7 +1053,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         davCollectionTag = [collection davCollectionTag];
     }
 
-
   // Generate the response buffer
   [theBuffer appendString: @"<Collection>"];
   
diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m
index b98ce3b..35ae9d0 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher.m
@@ -919,6 +919,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                                               sortOrdering: @"REVERSE ARRIVAL"
                                                   threaded: NO];
       count = [uids count];
+      // add number of uids due to softDelete
+      count+= [[self softDeleteUids: filter collectionId: realCollectionId] count];
+
     }
   else
     {
@@ -2216,4 +2219,31 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   [cm releaseChannel: channel]; 
 }
 
+- (NSArray *) softDeleteUids: (NSCalendarDate *) theFilter
+                collectionId: (NSString *) theCollectionId
+{
+
+      // count number of uids due to softdelete
+      NSMutableDictionary *dateCache;
+      SOGoCacheGCSObject *o;
+      NSMutableArray *sdUids;
+
+      sdUids =[[NSMutableArray alloc] init];
+
+      if (theFilter) {
+         o = [SOGoCacheGCSObject objectWithName: [NSString stringWithFormat: @"%@+folder%@", [context objectForKey: @"DeviceId"], theCollectionId] 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: theFilter ] == NSOrderedAscending ) {
+               [sdUids addObject:[dateCache objectForKey:key]];
+             }
+         }
+      }
+
+       return sdUids;
+
+}
 @end
-- 
1.7.10.4

