File indexing completed on 2024-05-12 05:22:29
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 "personcreatejob.h" 0010 #include "peopleservice.h" 0011 #include "person.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 #include <KContacts/Picture> 0023 0024 namespace KGAPI2::People 0025 { 0026 0027 class Q_DECL_HIDDEN PersonCreateJob::Private 0028 { 0029 public: 0030 explicit Private(PersonCreateJob *parent); 0031 void processNextPerson(); 0032 0033 QueueHelper<PersonPtr> people; 0034 0035 private: 0036 PersonCreateJob * const q; 0037 }; 0038 0039 PersonCreateJob::Private::Private(PersonCreateJob *parent) 0040 : q(parent) 0041 { 0042 } 0043 0044 void PersonCreateJob::Private::processNextPerson() 0045 { 0046 if (people.atEnd()) { 0047 q->emitFinished(); 0048 return; 0049 } 0050 0051 const auto person = people.current(); 0052 static const auto createUrl = PeopleService::createContactUrl(); 0053 QNetworkRequest request(createUrl); 0054 request.setRawHeader("Host", "people.googleapis.com"); 0055 0056 const auto personJson = QJsonDocument(person->toJSON().toObject()); 0057 const auto rawData = personJson.toJson(); 0058 q->enqueueRequest(request, rawData, QStringLiteral("application/json")); 0059 } 0060 0061 PersonCreateJob::PersonCreateJob(const PersonList &people, const AccountPtr &account, QObject* parent) 0062 : CreateJob(account, parent) 0063 , d(std::make_unique<Private>(this)) 0064 { 0065 d->people = people; 0066 } 0067 0068 PersonCreateJob::PersonCreateJob(const PersonPtr &person, const AccountPtr &account, QObject* parent) 0069 : CreateJob(account, parent) 0070 , d(std::make_unique<Private>(this)) 0071 { 0072 d->people << person; 0073 } 0074 0075 PersonCreateJob::~PersonCreateJob() = default; 0076 0077 void PersonCreateJob::start() 0078 { 0079 d->processNextPerson(); 0080 } 0081 0082 ObjectsList PersonCreateJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) 0083 { 0084 const auto contentTypeString = reply->header(QNetworkRequest::ContentTypeHeader).toString(); 0085 const auto contentType = Utils::stringToContentType(contentTypeString); 0086 0087 if (contentType != KGAPI2::JSON) { 0088 setError(KGAPI2::InvalidResponse); 0089 setErrorString(tr("Invalid response content type")); 0090 emitFinished(); 0091 return {}; 0092 } 0093 0094 ObjectsList items; 0095 const auto json = QJsonDocument::fromJson(rawData); 0096 if (json.isObject()) { 0097 const auto person = Person::fromJSON(json.object()); 0098 items << person; 0099 } 0100 0101 d->people.currentProcessed(); 0102 d->processNextPerson(); 0103 0104 return items; 0105 } 0106 0107 } 0108 0109 #include "moc_personcreatejob.cpp"