File delay-filtering.patch of Package kmail.10415

From 43f2cde61f98317eb13d98222a57bc6df323a308 Mon Sep 17 00:00:00 2001
From: Martin Koller <kollix@aon.at>
Date: Thu, 4 May 2017 19:47:53 +0200
Subject: delay filtering to the point when a new item gets its remote id

Differential Revision: https://phabricator.kde.org/D5667
---
 agents/mailfilteragent/mailfilteragent.cpp | 25 +++++++++++++++++++++++++
 agents/mailfilteragent/mailfilteragent.h   | 10 ++++++++++
 2 files changed, 35 insertions(+)

diff --git a/agents/mailfilteragent/mailfilteragent.cpp b/agents/mailfilteragent/mailfilteragent.cpp
index 498693e..6367a0e 100644
--- a/agents/mailfilteragent/mailfilteragent.cpp
+++ b/agents/mailfilteragent/mailfilteragent.cpp
@@ -121,6 +121,11 @@ MailFilterAgent::MailFilterAgent(const QString &id)
     mProgressCounter = 0;
     mProgressTimer = new QTimer(this);
     connect(mProgressTimer, SIGNAL(timeout()), this, SLOT(emitProgress()));
+
+    itemMonitor = new Akonadi::Monitor(this);
+    itemMonitor->itemFetchScope().setFetchRemoteIdentification(true);
+    itemMonitor->itemFetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::Parent);
+    connect(itemMonitor, &Akonadi::Monitor::itemChanged, this, &MailFilterAgent::slotItemChanged);
 }
 
 MailFilterAgent::~MailFilterAgent()
@@ -189,6 +194,26 @@ void MailFilterAgent::itemAdded(const Akonadi::Item &item, const Akonadi::Collec
         return;
     }
 
+    if (item.remoteId().isEmpty()) {
+        itemMonitor->setItemMonitored(item);
+    } else {
+        filterItem(item, collection);
+    }
+}
+
+void MailFilterAgent::slotItemChanged(const Akonadi::Item &item)
+{
+    if (item.remoteId().isEmpty()) {
+        return;
+    }
+
+    // now we have the remoteId
+    itemMonitor->setItemMonitored(item, false);
+    filterItem(item, item.parentCollection());
+}
+
+void MailFilterAgent::filterItem(const Akonadi::Item &item, const Akonadi::Collection &collection)
+{
     MailCommon::SearchRule::RequiredPart requiredPart = m_filterManager->requiredPart(collection.resource());
 
     Akonadi::ItemFetchJob *job = new Akonadi::ItemFetchJob(item);
diff --git a/agents/mailfilteragent/mailfilteragent.h b/agents/mailfilteragent/mailfilteragent.h
index c02f2cb..a8f58fc 100644
--- a/agents/mailfilteragent/mailfilteragent.h
+++ b/agents/mailfilteragent/mailfilteragent.h
@@ -33,6 +33,11 @@ class FilterManager;
 class KJob;
 class DummyKernel;
 
+namespace Akonadi
+{
+class Monitor;
+}
+
 class MailFilterAgent : public Akonadi::AgentBase, public Akonadi::AgentBase::ObserverV3
 {
     Q_OBJECT
@@ -70,6 +75,8 @@ private Q_SLOTS:
     void itemsReceiviedForFiltering(const Akonadi::Item::List &items);
     void clearMessage();
     void slotInstanceRemoved(const Akonadi::AgentInstance &instance);
+    void slotItemChanged(const Akonadi::Item &item);
+
 public Q_SLOTS:
     void configure(WId windowId) Q_DECL_OVERRIDE;
 
@@ -80,6 +87,9 @@ private:
     QTimer *mProgressTimer;
     DummyKernel *mMailFilterKernel;
     int mProgressCounter;
+    Akonadi::Monitor *itemMonitor;
+
+    void filterItem(const Akonadi::Item &item, const Akonadi::Collection &collection);
 };
 
 #endif
-- 
cgit v0.11.2

openSUSE Build Service is sponsored by