1 /* 2 SPDX-FileCopyrightText: 2013, 2014 Daniel Vrátil <dvratil@redhat.com> 3 4 SPDX-License-Identifier: LGPL-2.0-or-later 5 */ 6 7 #pragma once 8 9 #include "akthread.h" 10 11 #include "agentmanagerinterface.h" 12 #include "exception.h" 13 #include <QMap> 14 #include <QMutex> 15 #include <QSet> 16 #include <QStringList> 17 #include <QVector> 18 #include <QWaitCondition> 19 20 namespace Akonadi 21 { 22 namespace Server 23 { 24 class Connection; 25 class AgentSearchInstance; 26 27 class SearchTask 28 { 29 public: 30 QByteArray id; 31 QString query; 32 QStringList mimeTypes; 33 QVector<qint64> collections; 34 bool complete; 35 36 QMutex sharedLock; 37 QWaitCondition notifier; 38 39 QVector<QPair<QString /* resource */, qint64 /* collection */>> queries; 40 QSet<qint64> pendingResults; 41 }; 42 43 class SearchTaskManager : public AkThread 44 { 45 Q_OBJECT 46 47 public: 48 explicit SearchTaskManager(); 49 ~SearchTaskManager() override; 50 51 void registerInstance(const QString &id); 52 void unregisterInstance(const QString &id); 53 54 void addTask(SearchTask *task); 55 56 void pushResults(const QByteArray &searchId, const QSet<qint64> &ids, Connection *connection); 57 58 private Q_SLOTS: 59 void searchLoop(); 60 61 private: 62 class ResourceTask 63 { 64 public: 65 QString resourceId; 66 qint64 collectionId; 67 SearchTask *parentTask; 68 QSet<qint64> results; 69 70 qint64 timestamp; 71 }; 72 73 using TasksMap = QMap<QString, ResourceTask *>; 74 75 bool mShouldStop; 76 77 TasksMap::Iterator cancelRunningTask(TasksMap::Iterator &iter); 78 bool allResourceTasksCompleted(SearchTask *agentSearchTask) const; 79 80 QMap<QString, AgentSearchInstance *> mInstances; 81 QMutex mInstancesLock; 82 83 QWaitCondition mWait; 84 QMutex mLock; 85 86 QVector<SearchTask *> mTasklist; 87 88 QMap<QString /* resource */, ResourceTask *> mRunningTasks; 89 QVector<ResourceTask *> mPendingResults; 90 }; 91 92 AKONADI_EXCEPTION_MAKE_INSTANCE(SearchException); 93 94 } // namespace Server 95 } // namespace Akonadi 96 97