File indexing completed on 2024-05-12 05:22:16

0001 /*
0002     SPDX-FileCopyrightText: 2012 Andrius da Costa Ribas <andriusmao@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "change.h"
0008 #include "file_p.h"
0009 #include "utils_p.h"
0010 
0011 #include <QJsonDocument>
0012 #include <QVariantMap>
0013 
0014 using namespace KGAPI2;
0015 using namespace KGAPI2::Drive;
0016 
0017 class Q_DECL_HIDDEN Change::Private
0018 {
0019 public:
0020     Private();
0021     Private(const Private &other);
0022 
0023     qlonglong id = -1;
0024     QString fileId;
0025     QUrl selfLink;
0026     bool deleted = false;
0027     FilePtr file;
0028 
0029     static ChangePtr fromJSON(const QVariantMap &map);
0030 };
0031 
0032 Change::Private::Private()
0033 {
0034 }
0035 
0036 Change::Private::Private(const Private &other)
0037     : id(other.id)
0038     , fileId(other.fileId)
0039     , selfLink(other.selfLink)
0040     , deleted(other.deleted)
0041     , file(other.file)
0042 {
0043 }
0044 
0045 ChangePtr Change::Private::fromJSON(const QVariantMap &map)
0046 {
0047     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#change")) {
0048         return ChangePtr();
0049     }
0050 
0051     ChangePtr change(new Change);
0052     change->d->id = map[QStringLiteral("id")].toLongLong();
0053     change->d->fileId = map[QStringLiteral("fileId")].toString();
0054     change->d->selfLink = map[QStringLiteral("selfLink")].toUrl();
0055     change->d->deleted = map[QStringLiteral("deleted")].toBool();
0056     change->d->file = File::Private::fromJSON(map[QStringLiteral("file")].toMap());
0057 
0058     return change;
0059 }
0060 
0061 Change::Change()
0062     : KGAPI2::Object()
0063     , d(new Private)
0064 {
0065 }
0066 
0067 Change::Change(const Change &other)
0068     : KGAPI2::Object(other)
0069     , d(new Private(*(other.d)))
0070 {
0071 }
0072 
0073 Change::~Change()
0074 {
0075     delete d;
0076 }
0077 
0078 bool Change::operator==(const Change &other) const
0079 {
0080     if (!Object::operator==(other)) {
0081         return false;
0082     }
0083 
0084     GAPI_COMPARE(id)
0085     GAPI_COMPARE(fileId)
0086     GAPI_COMPARE(selfLink)
0087     GAPI_COMPARE(deleted)
0088     GAPI_COMPARE_SHAREDPTRS(file)
0089     return true;
0090 }
0091 
0092 qlonglong Change::id() const
0093 {
0094     return d->id;
0095 }
0096 
0097 QString Change::fileId() const
0098 {
0099     return d->fileId;
0100 }
0101 
0102 QUrl Change::selfLink() const
0103 {
0104     return d->selfLink;
0105 }
0106 
0107 bool Change::deleted() const
0108 {
0109     return d->deleted;
0110 }
0111 
0112 FilePtr Change::file() const
0113 {
0114     return d->file;
0115 }
0116 
0117 ChangePtr Change::fromJSON(const QByteArray &jsonData)
0118 {
0119     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0120     if (document.isNull()) {
0121         return ChangePtr();
0122     }
0123 
0124     const QVariant data = document.toVariant();
0125     return Private::fromJSON(data.toMap());
0126 }
0127 
0128 ChangesList Change::fromJSONFeed(const QByteArray &jsonData, FeedData &feedData)
0129 {
0130     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0131     if (document.isNull()) {
0132         return ChangesList();
0133     }
0134 
0135     const QVariant data = document.toVariant();
0136     const QVariantMap map = data.toMap();
0137     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#changeList")) {
0138         return ChangesList();
0139     }
0140 
0141     if (map.contains(QLatin1StringView("nextLink"))) {
0142         feedData.nextPageUrl = map[QStringLiteral("nextLink")].toUrl();
0143     }
0144 
0145     ChangesList list;
0146     const QVariantList items = map[QStringLiteral("items")].toList();
0147     for (const QVariant &item : items) {
0148         const ChangePtr change = Private::fromJSON(item.toMap());
0149 
0150         if (!change.isNull()) {
0151             list << change;
0152         }
0153     }
0154 
0155     return list;
0156 }