File indexing completed on 2024-05-12 05:22:18
0001 /* 0002 * This file is part of LibKGAPI library 0003 * 0004 * SPDX-FileCopyrightText: 2019 David Barchiesi <david@barchie.si> 0005 * 0006 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #include "drivesfetchjob.h" 0010 #include "debug.h" 0011 #include "drives.h" 0012 #include "driveservice.h" 0013 #include "utils.h" 0014 0015 #include <QNetworkReply> 0016 #include <QNetworkRequest> 0017 #include <QUrlQuery> 0018 0019 namespace 0020 { 0021 static const QString MaxResultsAttr = QStringLiteral("maxResults"); 0022 static const QString UseDomainAdminAccessAttr = QStringLiteral("useDomainAdminAccess"); 0023 } 0024 using namespace KGAPI2; 0025 using namespace KGAPI2::Drive; 0026 0027 class Q_DECL_HIDDEN DrivesFetchJob::Private 0028 { 0029 public: 0030 Private(DrivesFetchJob *parent); 0031 0032 DrivesSearchQuery searchQuery; 0033 QString drivesId; 0034 0035 int maxResults = 0; 0036 QVariant useDomainAdminAccess; 0037 0038 QStringList fields; 0039 0040 private: 0041 DrivesFetchJob *const q; 0042 }; 0043 0044 DrivesFetchJob::Private::Private(DrivesFetchJob *parent) 0045 : q(parent) 0046 { 0047 } 0048 0049 DrivesFetchJob::DrivesFetchJob(const QString &drivesId, const AccountPtr &account, QObject *parent) 0050 : FetchJob(account, parent) 0051 , d(new Private(this)) 0052 { 0053 d->drivesId = drivesId; 0054 } 0055 0056 DrivesFetchJob::DrivesFetchJob(const DrivesSearchQuery &query, const AccountPtr &account, QObject *parent) 0057 : FetchJob(account, parent) 0058 , d(new Private(this)) 0059 { 0060 d->searchQuery = query; 0061 } 0062 0063 DrivesFetchJob::DrivesFetchJob(const AccountPtr &account, QObject *parent) 0064 : FetchJob(account, parent) 0065 , d(new Private(this)) 0066 { 0067 } 0068 0069 DrivesFetchJob::~DrivesFetchJob() = default; 0070 0071 void DrivesFetchJob::setMaxResults(int maxResults) 0072 { 0073 if (isRunning()) { 0074 qCWarning(KGAPIDebug) << "Can't modify maxResults property when job is running"; 0075 return; 0076 } 0077 0078 d->maxResults = maxResults; 0079 } 0080 0081 int DrivesFetchJob::maxResults() const 0082 { 0083 return d->maxResults; 0084 } 0085 0086 void DrivesFetchJob::setUseDomainAdminAccess(bool useDomainAdminAccess) 0087 { 0088 if (isRunning()) { 0089 qCWarning(KGAPIDebug) << "Can't modify useDomainAdminAccess property when job is running"; 0090 return; 0091 } 0092 0093 d->useDomainAdminAccess = useDomainAdminAccess; 0094 } 0095 0096 bool DrivesFetchJob::useDomainAdminAccess() const 0097 { 0098 return d->useDomainAdminAccess.toBool(); 0099 } 0100 0101 void DrivesFetchJob::setFields(const QStringList &fields) 0102 { 0103 if (isRunning()) { 0104 qCWarning(KGAPIDebug) << "Called setFields() on running job. Ignoring."; 0105 return; 0106 } 0107 0108 d->fields = fields; 0109 } 0110 0111 QStringList DrivesFetchJob::fields() const 0112 { 0113 return d->fields; 0114 } 0115 0116 void DrivesFetchJob::start() 0117 { 0118 QUrl url; 0119 if (d->drivesId.isEmpty()) { 0120 url = DriveService::fetchDrivesUrl(); 0121 applyRequestParameters(url); 0122 } else { 0123 url = DriveService::fetchDrivesUrl(d->drivesId); 0124 if (!d->fields.isEmpty()) { 0125 // Deserializing requires kind attribute, always force add it 0126 if (!d->fields.contains(Drives::Fields::Kind)) { 0127 d->fields << Drives::Fields::Kind; 0128 } 0129 Job::setFields(d->fields); 0130 } 0131 } 0132 0133 QNetworkRequest request(url); 0134 enqueueRequest(request); 0135 } 0136 0137 ObjectsList DrivesFetchJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) 0138 { 0139 FeedData feedData; 0140 feedData.requestUrl = reply->url(); 0141 0142 ObjectsList items; 0143 0144 const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); 0145 ContentType ct = Utils::stringToContentType(contentType); 0146 if (ct == KGAPI2::JSON) { 0147 if (d->drivesId.isEmpty()) { 0148 items << Drives::fromJSONFeed(rawData, feedData); 0149 } else { 0150 items << Drives::fromJSON(rawData); 0151 } 0152 } else { 0153 setError(KGAPI2::InvalidResponse); 0154 setErrorString(tr("Invalid response content type")); 0155 emitFinished(); 0156 return items; 0157 } 0158 0159 if (feedData.nextPageUrl.isValid()) { 0160 // Reapply query options 0161 applyRequestParameters(feedData.nextPageUrl); 0162 QNetworkRequest request(feedData.nextPageUrl); 0163 enqueueRequest(request); 0164 } 0165 0166 return items; 0167 } 0168 0169 void DrivesFetchJob::applyRequestParameters(QUrl &url) 0170 { 0171 QUrlQuery query(url); 0172 if (d->maxResults != 0) { 0173 query.addQueryItem(MaxResultsAttr, QString::number(d->maxResults)); 0174 } 0175 if (!d->useDomainAdminAccess.isNull()) { 0176 query.addQueryItem(UseDomainAdminAccessAttr, Utils::bool2Str(d->useDomainAdminAccess.toBool())); 0177 } 0178 if (!d->searchQuery.isEmpty()) { 0179 query.addQueryItem(QStringLiteral("q"), d->searchQuery.serialize()); 0180 } 0181 if (!d->fields.isEmpty()) { 0182 // Deserializing requires kind attribute, always force add it 0183 if (!d->fields.contains(Drives::Fields::Kind)) { 0184 d->fields << Drives::Fields::Kind; 0185 } 0186 QString itemFields = Job::buildSubfields(Drives::Fields::Items, d->fields); 0187 Job::setFields({Drives::Fields::Kind, Drives::Fields::NextPageToken, itemFields}); 0188 } 0189 url.setQuery(query); 0190 } 0191 0192 #include "moc_drivesfetchjob.cpp"