Changeset View
Changeset View
Standalone View
Standalone View
src/drive/filefetchjob.cpp
Show All 34 Lines | |||||
35 | using namespace KGAPI2; | 35 | using namespace KGAPI2; | ||
36 | using namespace KGAPI2::Drive; | 36 | using namespace KGAPI2::Drive; | ||
37 | 37 | | |||
38 | class Q_DECL_HIDDEN FileFetchJob::Private | 38 | class Q_DECL_HIDDEN FileFetchJob::Private | ||
39 | { | 39 | { | ||
40 | public: | 40 | public: | ||
41 | Private(FileFetchJob *parent); | 41 | Private(FileFetchJob *parent); | ||
42 | void processNext(); | 42 | void processNext(); | ||
43 | QStringList fieldsToStrings(qulonglong fields); | | |||
44 | 43 | | |||
45 | FileSearchQuery searchQuery; | 44 | FileSearchQuery searchQuery; | ||
46 | QStringList filesIDs; | 45 | QStringList filesIDs; | ||
47 | bool isFeed; | 46 | bool isFeed; | ||
48 | bool includeItemsFromAllDrives; | 47 | bool includeItemsFromAllDrives; | ||
49 | bool supportsAllDrives; | 48 | bool supportsAllDrives; | ||
50 | 49 | | |||
51 | bool updateViewedDate; | 50 | bool updateViewedDate; | ||
52 | 51 | | |||
53 | qulonglong fields; | 52 | QStringList fields; | ||
54 | 53 | | |||
55 | private: | 54 | private: | ||
56 | FileFetchJob *const q; | 55 | FileFetchJob *const q; | ||
57 | }; | 56 | }; | ||
58 | 57 | | |||
59 | FileFetchJob::Private::Private(FileFetchJob *parent): | 58 | FileFetchJob::Private::Private(FileFetchJob *parent): | ||
60 | isFeed(false), | 59 | isFeed(false), | ||
61 | includeItemsFromAllDrives(true), | 60 | includeItemsFromAllDrives(true), | ||
62 | supportsAllDrives(true), | 61 | supportsAllDrives(true), | ||
63 | updateViewedDate(false), | 62 | updateViewedDate(false), | ||
64 | fields(FileFetchJob::AllFields), | | |||
65 | q(parent) | 63 | q(parent) | ||
66 | { | 64 | { | ||
67 | } | 65 | } | ||
68 | 66 | | |||
69 | | ||||
70 | QStringList FileFetchJob::Private::fieldsToStrings(qulonglong fields) | | |||
71 | { | | |||
72 | if (fields & AllFields) { | | |||
73 | return QStringList(); | | |||
74 | } | | |||
75 | | ||||
76 | QStringList fieldsStrings; | | |||
77 | // Always fetch kind | | |||
78 | fieldsStrings << QStringLiteral("kind"); | | |||
79 | | ||||
80 | // FIXME: Use QMetaEnum once it supports enums larger than int | | |||
81 | if (fields & Id) { | | |||
82 | fieldsStrings << QStringLiteral("id"); | | |||
83 | } | | |||
84 | if (fields & Title) { | | |||
85 | fieldsStrings << QStringLiteral("title"); | | |||
86 | } | | |||
87 | if (fields & MimeType) { | | |||
88 | fieldsStrings << QStringLiteral("mimeType"); | | |||
89 | } | | |||
90 | if (fields & Description) { | | |||
91 | fieldsStrings << QStringLiteral("description"); | | |||
92 | } | | |||
93 | if (fields & Labels) { | | |||
94 | fieldsStrings << QStringLiteral("labels"); | | |||
95 | } | | |||
96 | if (fields & CreatedDate) { | | |||
97 | fieldsStrings << QStringLiteral("createdDate"); | | |||
98 | } | | |||
99 | if (fields & ModifiedDate) { | | |||
100 | fieldsStrings << QStringLiteral("modifiedDate"); | | |||
101 | } | | |||
102 | if (fields & ModifiedByMeDate) { | | |||
103 | fieldsStrings << QStringLiteral("modifiedByMeDate"); | | |||
104 | } | | |||
105 | if (fields & DownloadUrl) { | | |||
106 | fieldsStrings << QStringLiteral("downloadUrl"); | | |||
107 | } | | |||
108 | if (fields & IndexableText) { | | |||
109 | fieldsStrings << QStringLiteral("indexableText"); | | |||
110 | } | | |||
111 | if (fields & UserPermission) { | | |||
112 | fieldsStrings << QStringLiteral("userPermission"); | | |||
113 | } | | |||
114 | if (fields & FileExtension) { | | |||
115 | fieldsStrings << QStringLiteral("fileExtension"); | | |||
116 | } | | |||
117 | if (fields & MD5Checksum) { | | |||
118 | fieldsStrings << QStringLiteral("md5Checksum"); | | |||
119 | } | | |||
120 | if (fields & FileSize) { | | |||
121 | fieldsStrings << QStringLiteral("fileSize"); | | |||
122 | } | | |||
123 | if (fields & AlternateLink) { | | |||
124 | fieldsStrings << QStringLiteral("alternateLink"); | | |||
125 | } | | |||
126 | if (fields & EmbedLink) { | | |||
127 | fieldsStrings << QStringLiteral("embedLink"); | | |||
128 | } | | |||
129 | if (fields & SharedWithMeDate) { | | |||
130 | fieldsStrings << QStringLiteral("sharedWithMeDate"); | | |||
131 | } | | |||
132 | if (fields & Parents) { | | |||
133 | fieldsStrings << QStringLiteral("parents"); | | |||
134 | } | | |||
135 | if (fields & ExportLinks) { | | |||
136 | fieldsStrings << QStringLiteral("exportLinks"); | | |||
137 | } | | |||
138 | if (fields & OriginalFilename) { | | |||
139 | fieldsStrings << QStringLiteral("originalFilename"); | | |||
140 | } | | |||
141 | if (fields & OwnerNames) { | | |||
142 | fieldsStrings << QStringLiteral("ownerNames"); | | |||
143 | } | | |||
144 | if (fields & LastModifiedByMeDate) { | | |||
145 | fieldsStrings << QStringLiteral("lastModifiedByMeDate"); | | |||
146 | } | | |||
147 | if (fields & Editable) { | | |||
148 | fieldsStrings << QStringLiteral("editable"); | | |||
149 | } | | |||
150 | if (fields & WritersCanShare) { | | |||
151 | fieldsStrings << QStringLiteral("writersCanShare"); | | |||
152 | } | | |||
153 | if (fields & ThumbnailLink) { | | |||
154 | fieldsStrings << QStringLiteral("thumbnailLink"); | | |||
155 | } | | |||
156 | if (fields & LastViewedByMeDate) { | | |||
157 | fieldsStrings << QStringLiteral("lastViewedByMeDate"); | | |||
158 | } | | |||
159 | if (fields & WebContentLink) { | | |||
160 | fieldsStrings << QStringLiteral("webContentLink"); | | |||
161 | } | | |||
162 | if (fields & ExplicitlyTrashed) { | | |||
163 | fieldsStrings << QStringLiteral("explicitlyTrashed"); | | |||
164 | } | | |||
165 | if (fields & ImageMediaMetadata) { | | |||
166 | fieldsStrings << QStringLiteral("imageMediaMetadata"); | | |||
167 | } | | |||
168 | if (fields & Thumbnail) { | | |||
169 | fieldsStrings << QStringLiteral("thumbnail"); | | |||
170 | } | | |||
171 | if (fields & WebViewLink) { | | |||
172 | fieldsStrings << QStringLiteral("webViewLink"); | | |||
173 | } | | |||
174 | if (fields & IconLink) { | | |||
175 | fieldsStrings << QStringLiteral("iconLink"); | | |||
176 | } | | |||
177 | if (fields & Shared) { | | |||
178 | fieldsStrings << QStringLiteral("shared"); | | |||
179 | } | | |||
180 | if (fields & Owners) { | | |||
181 | fieldsStrings << QStringLiteral("owners"); | | |||
182 | } | | |||
183 | if (fields & LastModifyingUser) { | | |||
184 | fieldsStrings << QStringLiteral("lastModifyingUser"); | | |||
185 | } | | |||
186 | if (fields & AppDataContents) { | | |||
187 | fieldsStrings << QStringLiteral("appDataContents"); | | |||
188 | } | | |||
189 | if (fields & OpenWithLinks) { | | |||
190 | fieldsStrings << QStringLiteral("openWithLinks"); | | |||
191 | } | | |||
192 | if (fields & DefaultOpenWithLink) { | | |||
193 | fieldsStrings << QStringLiteral("defaultOpenWithLink"); | | |||
194 | } | | |||
195 | if (fields & HeadRevisionId) { | | |||
196 | fieldsStrings << QStringLiteral("headRevisionId"); | | |||
197 | } | | |||
198 | if (fields & Copyable) { | | |||
199 | fieldsStrings << QStringLiteral("copyable"); | | |||
200 | } | | |||
201 | if (fields & Properties) { | | |||
202 | fieldsStrings << QStringLiteral("properties"); | | |||
203 | } | | |||
204 | if (fields & MarkedViewedByMeDate) { | | |||
205 | fieldsStrings << QStringLiteral("markedViewedByMeDate"); | | |||
206 | } | | |||
207 | if (fields & Version) { | | |||
208 | fieldsStrings << QStringLiteral("version"); | | |||
209 | } | | |||
210 | if (fields & SharingUser) { | | |||
211 | fieldsStrings << QStringLiteral("sharingUser"); | | |||
212 | } | | |||
213 | if (fields & Permissions) { | | |||
214 | fieldsStrings << QStringLiteral("permissions"); | | |||
215 | } | | |||
216 | | ||||
217 | return fieldsStrings; | | |||
218 | } | | |||
219 | | ||||
220 | | ||||
221 | void FileFetchJob::Private::processNext() | 67 | void FileFetchJob::Private::processNext() | ||
222 | { | 68 | { | ||
223 | QUrl url; | 69 | QUrl url; | ||
224 | 70 | | |||
225 | if (isFeed) { | 71 | if (isFeed) { | ||
226 | url = DriveService::fetchFilesUrl(); | 72 | url = DriveService::fetchFilesUrl(); | ||
73 | | ||||
227 | QUrlQuery query(url); | 74 | QUrlQuery query(url); | ||
228 | if (!searchQuery.isEmpty()) { | 75 | if (!searchQuery.isEmpty()) { | ||
229 | query.addQueryItem(QStringLiteral("q"), searchQuery.serialize()); | 76 | query.addQueryItem(QStringLiteral("q"), searchQuery.serialize()); | ||
230 | } | 77 | } | ||
231 | if (fields != FileFetchJob::AllFields) { | | |||
232 | const QStringList fieldsStrings = fieldsToStrings(fields); | | |||
233 | query.addQueryItem(QStringLiteral("fields"), | | |||
234 | QStringLiteral("etag,kind,nextLink,nextPageToken,selfLink,items(%1)").arg(fieldsStrings.join(QStringLiteral(",")))); | | |||
235 | } | | |||
236 | 78 | | |||
237 | query.addQueryItem(QStringLiteral("includeItemsFromAllDrives"), includeItemsFromAllDrives ? QStringLiteral("true") : QStringLiteral("false")); | 79 | query.addQueryItem(QStringLiteral("includeItemsFromAllDrives"), includeItemsFromAllDrives ? QStringLiteral("true") : QStringLiteral("false")); | ||
238 | 80 | | |||
239 | url.setQuery(query); | 81 | url.setQuery(query); | ||
82 | | ||||
83 | if (!fields.isEmpty()) { | ||||
84 | // Deserializing requires kind attribute, always force add it | ||||
85 | if (!fields.contains(File::Fields::Kind)) { | ||||
86 | fields << File::Fields::Kind; | ||||
87 | } | ||||
88 | Job *baseJob = dynamic_cast<Job *>(q); | ||||
89 | baseJob->setFields({ | ||||
90 | File::Fields::Etag, | ||||
91 | File::Fields::Kind, | ||||
92 | File::Fields::NextLink, | ||||
93 | File::Fields::NextPageToken, | ||||
94 | File::Fields::SelfLink, | ||||
95 | Job::buildSubfields(File::Fields::Items, fields) | ||||
96 | }); | ||||
97 | } | ||||
240 | } else { | 98 | } else { | ||
241 | if (filesIDs.isEmpty()) { | 99 | if (filesIDs.isEmpty()) { | ||
242 | q->emitFinished(); | 100 | q->emitFinished(); | ||
243 | return; | 101 | return; | ||
244 | } | 102 | } | ||
245 | 103 | | |||
246 | const QString fileId = filesIDs.takeFirst(); | 104 | const QString fileId = filesIDs.takeFirst(); | ||
247 | url = DriveService::fetchFileUrl(fileId); | 105 | url = DriveService::fetchFileUrl(fileId); | ||
248 | if (fields != FileFetchJob::AllFields) { | 106 | | ||
249 | const QStringList fieldsStrings = fieldsToStrings(fields); | 107 | if (!fields.isEmpty()) { | ||
250 | QUrlQuery query(url); | 108 | // Deserializing requires kind attribute, always force add it | ||
251 | query.addQueryItem(QStringLiteral("fields"), fieldsStrings.join(QStringLiteral(","))); | 109 | if (!fields.contains(File::Fields::Kind)) { | ||
252 | url.setQuery(query); | 110 | fields << File::Fields::Kind; | ||
111 | } | ||||
112 | Job *baseJob = dynamic_cast<Job *>(q); | ||||
113 | baseJob->setFields(fields); | ||||
253 | } | 114 | } | ||
254 | } | 115 | } | ||
255 | 116 | | |||
256 | QUrlQuery withDriveSupportQuery(url); | 117 | QUrlQuery withDriveSupportQuery(url); | ||
257 | withDriveSupportQuery.addQueryItem(QStringLiteral("supportsAllDrives"), supportsAllDrives ? QStringLiteral("true") : QStringLiteral("false")); | 118 | withDriveSupportQuery.addQueryItem(QStringLiteral("supportsAllDrives"), supportsAllDrives ? QStringLiteral("true") : QStringLiteral("false")); | ||
258 | url.setQuery(withDriveSupportQuery); | 119 | url.setQuery(withDriveSupportQuery); | ||
259 | 120 | | |||
260 | QNetworkRequest request(url); | 121 | QNetworkRequest request(url); | ||
▲ Show 20 Lines • Show All 53 Lines • ▼ Show 20 Line(s) | 169 | { | |||
314 | d->updateViewedDate = updateViewedDate; | 175 | d->updateViewedDate = updateViewedDate; | ||
315 | } | 176 | } | ||
316 | 177 | | |||
317 | void FileFetchJob::start() | 178 | void FileFetchJob::start() | ||
318 | { | 179 | { | ||
319 | d->processNext(); | 180 | d->processNext(); | ||
320 | } | 181 | } | ||
321 | 182 | | |||
322 | void FileFetchJob::setFields(qulonglong fields) | 183 | void FileFetchJob::setFields(const QStringList &fields) | ||
323 | { | 184 | { | ||
185 | if (isRunning()) { | ||||
186 | qCWarning(KGAPIDebug) << "Called setFields() on running job. Ignoring."; | ||||
187 | return; | ||||
188 | } | ||||
189 | | ||||
324 | d->fields = fields; | 190 | d->fields = fields; | ||
325 | } | 191 | } | ||
326 | 192 | | |||
327 | qulonglong FileFetchJob::fields() const | 193 | QStringList FileFetchJob::fields() const | ||
328 | { | 194 | { | ||
329 | return d->fields; | 195 | return d->fields; | ||
330 | } | 196 | } | ||
331 | 197 | | |||
332 | bool FileFetchJob::includeItemsFromAllDrives() const | 198 | bool FileFetchJob::includeItemsFromAllDrives() const | ||
333 | { | 199 | { | ||
334 | return d->includeItemsFromAllDrives; | 200 | return d->includeItemsFromAllDrives; | ||
335 | } | 201 | } | ||
336 | 202 | | |||
337 | void FileFetchJob::setIncludeItemsFromAllDrives(bool includeItemsFromAllDrives) | 203 | void FileFetchJob::setIncludeItemsFromAllDrives(bool includeItemsFromAllDrives) | ||
338 | { | 204 | { | ||
339 | d->includeItemsFromAllDrives = includeItemsFromAllDrives; | 205 | d->includeItemsFromAllDrives = includeItemsFromAllDrives; | ||
340 | } | 206 | } | ||
341 | 207 | | |||
342 | bool FileFetchJob::supportsAllDrives() const | 208 | bool FileFetchJob::supportsAllDrives() const | ||
343 | { | 209 | { | ||
344 | return d->supportsAllDrives; | 210 | return d->supportsAllDrives; | ||
345 | } | 211 | } | ||
346 | 212 | | |||
347 | void FileFetchJob::setSupportsAllDrives(bool supportsAllDrives) | 213 | void FileFetchJob::setSupportsAllDrives(bool supportsAllDrives) | ||
348 | { | 214 | { | ||
349 | d->supportsAllDrives = supportsAllDrives; | 215 | d->supportsAllDrives = supportsAllDrives; | ||
350 | } | 216 | } | ||
351 | 217 | | |||
218 | const QStringList FileFetchJob::FieldShorthands::BasicFields = { | ||||
219 | File::Fields::Id, | ||||
220 | File::Fields::Title, | ||||
221 | File::Fields::MimeType, | ||||
222 | File::Fields::CreatedDate, | ||||
223 | File::Fields::ModifiedDate, | ||||
224 | File::Fields::FileSize, | ||||
225 | File::Fields::DownloadUrl, | ||||
226 | File::Fields::Permissions | ||||
227 | }; | ||||
228 | | ||||
229 | const QStringList FileFetchJob::FieldShorthands::AccessFields = { | ||||
230 | File::Fields::CreatedDate, | ||||
231 | File::Fields::ModifiedDate, | ||||
232 | File::Fields::ModifiedByMeDate, | ||||
233 | File::Fields::LastModifiedByMeDate, | ||||
234 | File::Fields::LastViewedByMeDate, | ||||
235 | File::Fields::MarkedViewedByMeDate | ||||
236 | }; | ||||
237 | | ||||
238 | const QStringList FileFetchJob::FieldShorthands::SharingFields = { | ||||
239 | File::Fields::SharedWithMeDate, | ||||
240 | File::Fields::WritersCanShare, | ||||
241 | File::Fields::Shared, | ||||
242 | File::Fields::Owners, | ||||
243 | File::Fields::SharingUser, | ||||
244 | File::Fields::OwnerNames | ||||
245 | }; | ||||
352 | 246 | | |||
353 | ObjectsList FileFetchJob::handleReplyWithItems(const QNetworkReply *reply, | 247 | ObjectsList FileFetchJob::handleReplyWithItems(const QNetworkReply *reply, | ||
354 | const QByteArray &rawData) | 248 | const QByteArray &rawData) | ||
355 | { | 249 | { | ||
356 | ObjectsList items; | 250 | ObjectsList items; | ||
357 | 251 | | |||
358 | const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); | 252 | const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); | ||
359 | ContentType ct = Utils::stringToContentType(contentType); | 253 | ContentType ct = Utils::stringToContentType(contentType); | ||
Show All 27 Lines |