File indexing completed on 2024-05-12 05:22:29
0001 /* 0002 * This file is part of LibKGAPI library 0003 * 0004 * SPDX-FileCopyrightText: 2022 Claudio Cambra <claudio.cambra@kde.org> 0005 * 0006 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #include "personfetchjob.h" 0010 #include "peopleservice.h" 0011 #include "person.h" 0012 #include "../debug.h" 0013 #include "utils.h" 0014 #include "account.h" 0015 0016 #include <QNetworkRequest> 0017 #include <QNetworkReply> 0018 #include <QUrlQuery> 0019 #include <QJsonDocument> 0020 #include <QJsonObject> 0021 #include <QJsonArray> 0022 0023 namespace KGAPI2::People 0024 { 0025 0026 class Q_DECL_HIDDEN PersonFetchJob::Private 0027 { 0028 public: 0029 explicit Private(PersonFetchJob *parent); 0030 0031 QNetworkRequest createRequest(const QUrl &url); 0032 ObjectsList processReceivedData(const QByteArray &rawData); 0033 0034 QString personResourceName; 0035 QString syncToken; 0036 QString receivedSyncToken; 0037 0038 public Q_SLOTS: 0039 void startFetch(); 0040 0041 private: 0042 PersonFetchJob * const q; 0043 }; 0044 0045 PersonFetchJob::Private::Private(PersonFetchJob *parent) 0046 : q(parent) 0047 { 0048 } 0049 0050 QNetworkRequest PersonFetchJob::Private::createRequest(const QUrl& url) 0051 { 0052 QNetworkRequest request(url); 0053 request.setRawHeader("Host", "people.googleapis.com"); 0054 return request; 0055 } 0056 0057 void PersonFetchJob::Private::startFetch() 0058 { 0059 QUrl url; 0060 if (personResourceName.isEmpty()) { 0061 url = PeopleService::fetchAllContactsUrl(syncToken); 0062 } else { 0063 url = PeopleService::fetchContactUrl(personResourceName); 0064 } 0065 0066 const QNetworkRequest request = createRequest(url); 0067 q->enqueueRequest(request); 0068 } 0069 0070 ObjectsList PersonFetchJob::Private::processReceivedData(const QByteArray &rawData) 0071 { 0072 FeedData feedData; 0073 ObjectsList items; 0074 0075 if (personResourceName.isEmpty()) { 0076 items = PeopleService::parseConnectionsJSONFeed(feedData, rawData, syncToken); 0077 } else { 0078 const auto jsonDocumentFromData = QJsonDocument::fromJson(rawData); 0079 if(jsonDocumentFromData.isObject()) { 0080 items << People::Person::fromJSON(jsonDocumentFromData.object()); 0081 } else { 0082 qCDebug(KGAPIDebug) << "JSON document does not have object"; 0083 } 0084 } 0085 0086 if (feedData.nextPageUrl.isValid()) { 0087 q->emitProgress(feedData.startIndex, feedData.totalResults); 0088 0089 const QNetworkRequest request = createRequest(feedData.nextPageUrl); 0090 q->enqueueRequest(request); 0091 } else { 0092 receivedSyncToken = feedData.syncToken; 0093 q->emitFinished(); 0094 } 0095 0096 return items; 0097 } 0098 0099 PersonFetchJob::PersonFetchJob(const AccountPtr& account, QObject* parent) 0100 : FetchJob(account, parent) 0101 , d(std::make_unique<Private>(this)) 0102 { 0103 } 0104 0105 PersonFetchJob::PersonFetchJob(const QString &resourceName, const AccountPtr &account, QObject* parent) 0106 : FetchJob(account, parent) 0107 , d(std::make_unique<Private>(this)) 0108 { 0109 d->personResourceName = resourceName; 0110 } 0111 0112 PersonFetchJob::~PersonFetchJob() = default; 0113 0114 QString PersonFetchJob::syncToken() const 0115 { 0116 return d->syncToken; 0117 } 0118 0119 void PersonFetchJob::setSyncToken(const QString &syncToken) 0120 { 0121 if (syncToken == d->syncToken) { 0122 return; 0123 } 0124 0125 d->syncToken = syncToken; 0126 Q_EMIT syncTokenChanged(); 0127 } 0128 0129 QString PersonFetchJob::receivedSyncToken() const 0130 { 0131 return d->receivedSyncToken; 0132 } 0133 0134 void PersonFetchJob::start() 0135 { 0136 d->startFetch(); 0137 } 0138 0139 ObjectsList PersonFetchJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) 0140 { 0141 const auto contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); 0142 const auto ct = Utils::stringToContentType(contentType); 0143 0144 if (ct == KGAPI2::JSON) { 0145 return d->processReceivedData(rawData); 0146 } 0147 0148 return ObjectsList(); 0149 } 0150 0151 } 0152 0153 #include "moc_personfetchjob.cpp"