From f83454d02eb3e79d2d7fa53b5fcdfd02ca6b33f8 Mon Sep 17 00:00:00 2001
From: root <root@example.com>
Date: Sat, 7 Jun 2014 23:57:12 +0200
Subject: [PATCH] Signal6onUnflag

---
 ActiveSync/SOGoActiveSyncDispatcher.m  |    1 +
 ActiveSync/SOGoMailObject+ActiveSync.m |   22 ++++++++++++++++------
 SoObjects/Mailer/SOGoMailObject.h      |    1 +
 SoObjects/Mailer/SOGoMailObject.m      |    5 +++++
 4 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m
index 63e4b54..9c52d79 100644
--- a/ActiveSync/SOGoActiveSyncDispatcher.m
+++ b/ActiveSync/SOGoActiveSyncDispatcher.m
@@ -848,6 +848,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       uids = [currentCollection fetchUIDsMatchingQualifier: qualifier
                                               sortOrdering: @"REVERSE ARRIVAL"
                                                   threaded: NO];
+
       count = [uids count];
     }
   else
diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m
index 7b0a008..e5c5790 100644
--- a/ActiveSync/SOGoMailObject+ActiveSync.m
+++ b/ActiveSync/SOGoMailObject+ActiveSync.m
@@ -761,7 +761,7 @@ struct GlobalObjectId {
   
   // Flags
   [s appendString: @"<Flag xmlns=\"Email:\">"];
-  [s appendFormat: @"<FlagStatus>%d</FlagStatus>", 0];
+  [s appendFormat: @"<FlagStatus>%d</FlagStatus>", ([self flagged] ? 2 : 0)];
   [s appendString: @"</Flag>"];
   
   // FIXME - support these in the future
@@ -799,12 +799,22 @@ struct GlobalObjectId {
 
   if ((o = [theValues objectForKey: @"Flag"]))
     {
-      o = [o objectForKey: @"FlagStatus"];
-      
-      if ([o intValue])
-        [self addFlags: @"\\Flagged"];
+      // handle empty flags -> {Flag = ""; }
+      if (([o isKindOfClass: [NSMutableDictionary class]])) {
+         if ((o = [o objectForKey: @"FlagStatus"])) {
+            // 0 = The flag is cleared.
+            // 1 = The status is set to complete.
+            // 2 = The status is set to active.
+            if (([o isEqualToString: @"2"])) {
+               [self addFlags: @"\\Flagged"];
+            }
+            else {
+              [self removeFlags: @"\\Flagged"];
+            }
+         }
+      }
       else
-        [self removeFlags: @"\\Flagged"]; 
+         [self removeFlags: @"\\Flagged"]; 
     }
   
   if ((o = [theValues objectForKey: @"Read"]))
diff --git a/SoObjects/Mailer/SOGoMailObject.h b/SoObjects/Mailer/SOGoMailObject.h
index 46c1d7c..af52334 100644
--- a/SoObjects/Mailer/SOGoMailObject.h
+++ b/SoObjects/Mailer/SOGoMailObject.h
@@ -114,6 +114,7 @@ NSArray *SOGoMailCoreInfoKeys;
 - (NSException *) removeFlags:(id)_f;
 
 - (BOOL) isNewMail;  /* \Recent */
+- (BOOL) flagged;    /* \Flagged */
 - (BOOL) read;       /* \Unseen */
 - (BOOL) replied;    /* \Answered */
 - (BOOL) forwarded;  /* $forwarded */
diff --git a/SoObjects/Mailer/SOGoMailObject.m b/SoObjects/Mailer/SOGoMailObject.m
index f2fa35e..f99bcf4 100644
--- a/SoObjects/Mailer/SOGoMailObject.m
+++ b/SoObjects/Mailer/SOGoMailObject.m
@@ -1464,6 +1464,11 @@ static BOOL debugSoParts       = NO;
   return [self _hasFlag: @"seen"];
 }
 
+- (BOOL) flagged
+{
+  return [self _hasFlag: @"flagged"];
+}
+
 - (BOOL) replied
 {
   return [self _hasFlag: @"answered"];
-- 
1.7.9.5

