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 ¤tItem, } } 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 ¤tFlag, 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