From 4ab660a94c98924a1f30cbbbf16f43bef509c052 Mon Sep 17 00:00:00 2001
From: root <root@example.com>
Date: Sun, 18 May 2014 15:16:37 +0200
Subject: [PATCH] softDelete with dateCache

---
 ActiveSync/SOGoActiveSyncDispatcher+Sync.m |   40 +++++++++++++++++++++++++++-
 ActiveSync/SOGoActiveSyncDispatcher.h      |    1 +
 ActiveSync/SOGoActiveSyncDispatcher.m      |   25 +++++++++++++++++
 3 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
index 49cc21c..14fb5db 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m
@@ -483,7 +483,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   // 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]] && !([self checkSoftDeletes: [theCollection nameInContainer]]))
     return;
   
   s = [NSMutableString string];
@@ -642,6 +642,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         else
           folderMetadata = [self _folderMetadataForKey: [theCollection nameInContainer]];
 
+
         syncCache = [folderMetadata objectForKey: @"SyncCache"];
         dateCache = [folderMetadata objectForKey: @"DateCache"];
 
@@ -711,6 +712,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     [s appendString: @"</Delete>"];
                     
                     [syncCache removeObjectForKey: [aCacheObject uid]];
+                    [dateCache removeObjectForKey: [aCacheObject uid]];
                   }
                 else
                   {
@@ -773,6 +775,42 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     //NSLog(@"skipping old deleted UID: %@",  [aCacheObject uid]);
                   }
               }
+
+          }
+
+          // handle soft-deletes
+          if (theFilterType) {
+              for (NSString* key in [dateCache allKeys]) {
+                  if (return_count >= theWindowSize)
+                  {
+                      more_available = YES;
+
+                      if (!(*theLastServerKey)) 
+                         *theLastServerKey =  [theCollection davCollectionTag];
+
+                         // make sure that checkSoftDelets find some work
+                         NSString *cacheKey;
+                         cacheKey = [NSString stringWithFormat: @"%@+%@+%@",
+                                  [[context activeUser] login],
+                                  [context objectForKey: @"DeviceId"],
+                                  [theCollection nameInContainer]];
+
+                         [[SOGoCache sharedCache] setValue:  @"0" forKey: cacheKey];
+
+                      break;
+                  }
+
+                  if ([[dateCache objectForKey:key] compare: theFilterType ] == NSOrderedAscending ) 
+                  {
+                     [s appendString: @"<SoftDelete xmlns=\"AirSync:\">"];
+                     [s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", key];
+                     [s appendString: @"</SoftDelete>"];
+
+                     [dateCache removeObjectForKey: key];
+                     [syncCache removeObjectForKey: key];
+                     return_count++;
+                  } 
+              }
           }
         
         if (more_available)
diff --git a/ActiveSync/SOGoActiveSyncDispatcher.h b/ActiveSync/SOGoActiveSyncDispatcher.h
index eda6a3d..2dd7acd 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher.h
+++ b/ActiveSync/SOGoActiveSyncDispatcher.h
@@ -49,5 +49,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 - (NSURL *) folderTableURL;
 - (void) ensureFolderTableExists;
+- (BOOL) checkSoftDeletes: (NSString *) theFolder;
 
 @end
diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m
index d8c2807..b035cab 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher.m
@@ -165,6 +165,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   return [o properties];
 }
 
+- (BOOL) checkSoftDeletes: (NSString *) theFolder
+{
+
+   NSString *key, *value;
+
+   key = [NSString stringWithFormat: @"%@+%@+%@",
+                                  [[context activeUser] login],
+                                  [context objectForKey: @"DeviceId"],
+                                  theFolder];
+   value = [NSString stringWithFormat: @"%d", [[NSCalendarDate date] dayOfCommonEra]];
+
+   if ([[[SOGoCache sharedCache] valueForKey: key] isEqualToString: value])  {
+      return false;
+   }
+
+   [[SOGoCache sharedCache] setValue: value forKey: key];
+
+  return true;
+}
+
 //
 //
 //
@@ -668,6 +688,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                                               sortOrdering: @"REVERSE ARRIVAL"
                                                   threaded: NO];
       count = [uids count];
+
+      if (count == 0) {
+         if ( [self checkSoftDeletes: [currentCollection nameInContainer]] )
+            count = 1;
+      }
     }
   else
     {
-- 
1.7.9.5

