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