File indexing completed on 2024-05-12 05:22:26
0001 /* 0002 * This file is part of LibKGAPI library 0003 * 0004 * SPDX-FileCopyrightText: 2023 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 "contactgroupmodifyjob.h" 0010 #include "contactgroup.h" 0011 #include "peopleservice.h" 0012 #include "private/queuehelper_p.h" 0013 #include "utils.h" 0014 0015 #include <QNetworkRequest> 0016 #include <QNetworkReply> 0017 #include <QUrlQuery> 0018 #include <QJsonDocument> 0019 #include <QJsonObject> 0020 #include <QJsonArray> 0021 0022 namespace KGAPI2::People 0023 { 0024 0025 class Q_DECL_HIDDEN ContactGroupModifyJob::Private 0026 { 0027 public: 0028 explicit Private(ContactGroupModifyJob *parent); 0029 void processNextContactGroup(); 0030 0031 QueueHelper<ContactGroupPtr> groups; 0032 ContactGroupPtr lastGroup; 0033 0034 private: 0035 ContactGroupModifyJob * const q; 0036 }; 0037 0038 ContactGroupModifyJob::Private::Private(ContactGroupModifyJob *parent) 0039 : q(parent) 0040 { 0041 } 0042 0043 void ContactGroupModifyJob::Private::processNextContactGroup() 0044 { 0045 if (groups.atEnd()) { 0046 q->emitFinished(); 0047 return; 0048 } 0049 0050 const auto group = groups.current(); 0051 const auto modifyUrl = PeopleService::updateContactGroupUrl(group->resourceName()); 0052 QNetworkRequest request(modifyUrl); 0053 request.setRawHeader("Host", "people.googleapis.com"); 0054 0055 const auto groupJson = group->toJSON().toObject(); 0056 const QJsonObject rootObject { 0057 { QStringLiteral("contactGroup"), groupJson } 0058 }; 0059 const auto rawData = QJsonDocument(rootObject).toJson(); 0060 q->enqueueRequest(request, rawData, QStringLiteral("application/json")); 0061 } 0062 0063 ContactGroupModifyJob::ContactGroupModifyJob(const ContactGroupList &contactGroups, const AccountPtr &account, QObject* parent) 0064 : ModifyJob(account, parent) 0065 , d(std::make_unique<Private>(this)) 0066 { 0067 d->groups = contactGroups; 0068 } 0069 0070 ContactGroupModifyJob::ContactGroupModifyJob(const ContactGroupPtr &group, const AccountPtr &account, QObject* parent) 0071 : ModifyJob(account, parent) 0072 , d(std::make_unique<Private>(this)) 0073 { 0074 d->groups << group; 0075 } 0076 0077 ContactGroupModifyJob::~ContactGroupModifyJob() = default; 0078 0079 void ContactGroupModifyJob::start() 0080 { 0081 d->processNextContactGroup(); 0082 } 0083 0084 ObjectsList ContactGroupModifyJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) 0085 { 0086 const auto contentTypeString = reply->header(QNetworkRequest::ContentTypeHeader).toString(); 0087 const auto contentType = Utils::stringToContentType(contentTypeString); 0088 0089 if (contentType != KGAPI2::JSON) { 0090 setError(KGAPI2::InvalidResponse); 0091 setErrorString(tr("Invalid response content type")); 0092 emitFinished(); 0093 return {}; 0094 } 0095 0096 ObjectsList items; 0097 const auto json = QJsonDocument::fromJson(rawData); 0098 if (json.isObject()) { 0099 const auto group = ContactGroup::fromJSON(json.object()); 0100 items << group; 0101 } 0102 0103 d->groups.currentProcessed(); 0104 d->processNextContactGroup(); 0105 0106 return items; 0107 } 0108 0109 } 0110 0111 #include "moc_contactgroupmodifyjob.cpp"