1
2 /*
3 SPDX-FileCopyrightText: 2007 Volker Krause <vkrause@kde.org>
4 SPDX-FileCopyrightText: 2014 Daniel Vrátil <dvratil@redhat.com>
5
6 SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8
9 #include "searchcreatejob.h"
10
11 #include "job_p.h"
12 #include "protocolhelper_p.h"
13 #include "searchquery.h"
14
15 #include "private/protocol_p.h"
16
17 using namespace Akonadi;
18
19 class Akonadi::SearchCreateJobPrivate : public JobPrivate
20 {
21 public:
SearchCreateJobPrivate(const QString & name,const SearchQuery & query,SearchCreateJob * parent)22 SearchCreateJobPrivate(const QString &name, const SearchQuery &query, SearchCreateJob *parent)
23 : JobPrivate(parent)
24 , mName(name)
25 , mQuery(query)
26 {
27 }
28
29 const QString mName;
30 const SearchQuery mQuery;
31 QStringList mMimeTypes;
32 QVector<Collection> mCollections;
33 bool mRecursive = false;
34 bool mRemote = false;
35 Collection mCreatedCollection;
36
37 // JobPrivate interface
38 public:
39 QString jobDebuggingString() const override;
40 };
41
jobDebuggingString() const42 QString Akonadi::SearchCreateJobPrivate::jobDebuggingString() const
43 {
44 QString str = QStringLiteral("Name :%1 ").arg(mName);
45 if (mRecursive) {
46 str += QStringLiteral("Recursive ");
47 }
48 if (mRemote) {
49 str += QStringLiteral("Remote");
50 }
51 return str;
52 }
53
SearchCreateJob(const QString & name,const SearchQuery & searchQuery,QObject * parent)54 SearchCreateJob::SearchCreateJob(const QString &name, const SearchQuery &searchQuery, QObject *parent)
55 : Job(new SearchCreateJobPrivate(name, searchQuery, this), parent)
56 {
57 }
58
~SearchCreateJob()59 SearchCreateJob::~SearchCreateJob()
60 {
61 }
62
setSearchCollections(const QVector<Collection> & collections)63 void SearchCreateJob::setSearchCollections(const QVector<Collection> &collections)
64 {
65 Q_D(SearchCreateJob);
66
67 d->mCollections = collections;
68 }
69
searchCollections() const70 QVector<Collection> SearchCreateJob::searchCollections() const
71 {
72 return d_func()->mCollections;
73 }
74
setSearchMimeTypes(const QStringList & mimeTypes)75 void SearchCreateJob::setSearchMimeTypes(const QStringList &mimeTypes)
76 {
77 Q_D(SearchCreateJob);
78
79 d->mMimeTypes = mimeTypes;
80 }
81
searchMimeTypes() const82 QStringList SearchCreateJob::searchMimeTypes() const
83 {
84 return d_func()->mMimeTypes;
85 }
86
setRecursive(bool recursive)87 void SearchCreateJob::setRecursive(bool recursive)
88 {
89 Q_D(SearchCreateJob);
90
91 d->mRecursive = recursive;
92 }
93
isRecursive() const94 bool SearchCreateJob::isRecursive() const
95 {
96 return d_func()->mRecursive;
97 }
98
setRemoteSearchEnabled(bool enabled)99 void SearchCreateJob::setRemoteSearchEnabled(bool enabled)
100 {
101 Q_D(SearchCreateJob);
102
103 d->mRemote = enabled;
104 }
105
isRemoteSearchEnabled() const106 bool SearchCreateJob::isRemoteSearchEnabled() const
107 {
108 return d_func()->mRemote;
109 }
110
doStart()111 void SearchCreateJob::doStart()
112 {
113 Q_D(SearchCreateJob);
114
115 auto cmd = Protocol::StoreSearchCommandPtr::create();
116 cmd->setName(d->mName);
117 cmd->setQuery(QString::fromUtf8(d->mQuery.toJSON()));
118 cmd->setMimeTypes(d->mMimeTypes);
119 cmd->setRecursive(d->mRecursive);
120 cmd->setRemote(d->mRemote);
121 if (!d->mCollections.isEmpty()) {
122 QVector<qint64> ids;
123 ids.reserve(d->mCollections.size());
124 for (const Collection &col : std::as_const(d->mCollections)) {
125 ids << col.id();
126 }
127 cmd->setQueryCollections(ids);
128 }
129
130 d->sendCommand(cmd);
131 }
132
createdCollection() const133 Akonadi::Collection SearchCreateJob::createdCollection() const
134 {
135 Q_D(const SearchCreateJob);
136 return d->mCreatedCollection;
137 }
138
doHandleResponse(qint64 tag,const Protocol::CommandPtr & response)139 bool SearchCreateJob::doHandleResponse(qint64 tag, const Protocol::CommandPtr &response)
140 {
141 Q_D(SearchCreateJob);
142 if (response->isResponse() && response->type() == Protocol::Command::FetchCollections) {
143 d->mCreatedCollection = ProtocolHelper::parseCollection(Protocol::cmdCast<Protocol::FetchCollectionsResponse>(response));
144 return false;
145 }
146
147 if (response->isResponse() && response->type() == Protocol::Command::StoreSearch) {
148 return true;
149 }
150
151 return Job::doHandleResponse(tag, response);
152 }
153