File indexing completed on 2024-05-12 05:22:25
0001 /* 0002 * This file is part of LibKGAPI library 0003 * 0004 * SPDX-FileCopyrightText: 2022 Claudio Cambra <claudio.cambra@kde.org> 0005 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0006 * 0007 */ 0008 0009 #include "contactgroupfetchjob.h" 0010 #include "peopleservice.h" 0011 #include "contactgroup.h" 0012 #include "utils.h" 0013 0014 #include <QNetworkRequest> 0015 #include <QNetworkReply> 0016 #include <QUrlQuery> 0017 #include <QJsonDocument> 0018 #include <QJsonObject> 0019 #include <QJsonArray> 0020 0021 namespace KGAPI2::People 0022 { 0023 0024 class Q_DECL_HIDDEN ContactGroupFetchJob::Private 0025 { 0026 public: 0027 explicit Private(ContactGroupFetchJob *parent); 0028 0029 QNetworkRequest createRequest(const QUrl &url); 0030 0031 QString resourceName; 0032 0033 private: 0034 ContactGroupFetchJob * const q; 0035 }; 0036 0037 ContactGroupFetchJob::Private::Private(ContactGroupFetchJob *parent) 0038 : q(parent) 0039 { 0040 } 0041 0042 ContactGroupFetchJob::ContactGroupFetchJob(const AccountPtr& account, QObject* parent) 0043 : FetchJob(account, parent) 0044 , d(std::make_unique<Private>(this)) 0045 { 0046 } 0047 0048 QNetworkRequest ContactGroupFetchJob::Private::createRequest(const QUrl& url) 0049 { 0050 QNetworkRequest request(url); 0051 request.setRawHeader("Host", "people.googleapis.com"); 0052 return request; 0053 } 0054 0055 ContactGroupFetchJob::ContactGroupFetchJob(const QString &resourceName, 0056 const AccountPtr &account, 0057 QObject* parent) 0058 : FetchJob(account, parent) 0059 , d(std::make_unique<Private>(this)) 0060 { 0061 d->resourceName = resourceName; 0062 } 0063 0064 ContactGroupFetchJob::~ContactGroupFetchJob() = default; 0065 0066 void ContactGroupFetchJob::start() 0067 { 0068 QUrl url; 0069 if (d->resourceName.isEmpty()) { 0070 url = PeopleService::fetchAllContactGroupsUrl(); 0071 } else { 0072 url = PeopleService::fetchContactGroupUrl(d->resourceName); 0073 } 0074 0075 const QNetworkRequest request = d->createRequest(url); 0076 enqueueRequest(request); 0077 } 0078 0079 0080 ObjectsList ContactGroupFetchJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) 0081 { 0082 FeedData feedData; 0083 ObjectsList items; 0084 0085 const auto contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); 0086 ContentType ct = Utils::stringToContentType(contentType); 0087 0088 if (ct != KGAPI2::JSON) { 0089 return ObjectsList(); 0090 } 0091 0092 if (d->resourceName.isEmpty()) { 0093 items = PeopleService::parseContactGroupsJSONFeed(feedData, rawData); 0094 } else { 0095 const auto jsonDocumentFromData = QJsonDocument::fromJson(rawData); 0096 if(jsonDocumentFromData.isObject()) { 0097 items << People::ContactGroup::fromJSON(jsonDocumentFromData.object()); 0098 } else { 0099 qDebug() << "JSON document does not have object"; 0100 } 0101 } 0102 0103 if (feedData.nextPageUrl.isValid()) { 0104 emitProgress(feedData.startIndex, feedData.totalResults); 0105 0106 const auto request = d->createRequest(feedData.nextPageUrl); 0107 enqueueRequest(request); 0108 } else { 0109 emitFinished(); 0110 } 0111 0112 return items; 0113 } 0114 0115 } 0116 0117 #include "moc_contactgroupfetchjob.cpp"