Sophie

Sophie

distrib > Mageia > 5 > i586 > media > core-updates-src > by-pkgid > 5c0256c7d518acfb46629b5e68a44699 > files > 35

akonadi-1.13.0-4.1.mga5.src.rpm

From f026087216137d3a833309212de8b4dd3fda8773 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Vr=C3=A1til?= <daniel.vratil@kdab.com>
Date: Fri, 24 Jun 2016 15:52:29 +0200
Subject: [PATCH 35/40] Preserve local-only flags during MERGE

Backported from master.
---
 server/src/handler/merge.cpp | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/server/src/handler/merge.cpp b/server/src/handler/merge.cpp
index 514991686..28372e5de 100644
--- a/server/src/handler/merge.cpp
+++ b/server/src/handler/merge.cpp
@@ -39,6 +39,12 @@
 using namespace Akonadi;
 using namespace Akonadi::Server;
 
+static QVector<QByteArray> localFlagsToPreserve = QVector<QByteArray>() << "$ATTACHMENT"
+                                                                        << "$INVITATION"
+                                                                        << "$ENCRYPTED"
+                                                                        << "$SIGNED"
+                                                                        << "$WATCHED";
+
 Merge::Merge()
   : AkAppend()
 {
@@ -96,7 +102,20 @@ bool Merge::mergeItem( PimItem &newItem, PimItem &currentItem,
       }
     } else if ( !itemFlags.added.isEmpty() ) {
       bool flagsChanged = false;
-      const Flag::List flags = HandlerHelper::resolveFlags( itemFlags.added );
+
+      QVector<QByteArray> flagNames = itemFlags.added;
+      // Make sure we don't overwrite some local-only flags that can't come
+      // through from Resource during ItemSync, like $ATTACHMENT, because the
+      // resource is not aware of them (they are usually assigned by client
+      // upon inspecting the payload)
+      Q_FOREACH (const Flag &currentFlag, currentItem.flags()) {
+          const QByteArray flagName = currentFlag.name().toLatin1();
+          if (localFlagsToPreserve.contains(flagName) && !flagNames.contains(flagName)) {
+              flagNames.push_back(flagName);
+          }
+      }
+      const Flag::List flags = HandlerHelper::resolveFlags( flagNames );
+
       DataStore::self()->setItemsFlags( PimItem::List() << currentItem, flags,
                                         &flagsChanged, col, true );
       if ( flagsChanged ) {
-- 
2.14.1