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

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 "revision.h"
0008 #include "user.h"
0009 #include "utils_p.h"
0010 
0011 #include <QJsonDocument>
0012 
0013 using namespace KGAPI2;
0014 using namespace KGAPI2::Drive;
0015 
0016 class Q_DECL_HIDDEN Revision::Private
0017 {
0018 public:
0019     Private();
0020     Private(const Private &other);
0021 
0022     QString id;
0023     QUrl selfLink;
0024     QString mimeType;
0025     QDateTime modifiedDate;
0026     bool pinned;
0027     bool published;
0028     QUrl publishedLink;
0029     bool publishAuto;
0030     bool publishedOutsideDomain;
0031     QUrl downloadUrl;
0032     QMap<QString, QUrl> exportLinks;
0033     QString lastModifyingUserName;
0034     UserPtr lastModifyingUser;
0035     QString originalFilename;
0036     QString md5Checksum;
0037     qlonglong fileSize;
0038 
0039     static RevisionPtr fromJSON(const QVariantMap &map);
0040 };
0041 
0042 Revision::Private::Private()
0043     : pinned(false)
0044     , published(false)
0045     , publishAuto(false)
0046     , publishedOutsideDomain(false)
0047     , fileSize(-1)
0048 {
0049 }
0050 
0051 Revision::Private::Private(const Private &other)
0052     : id(other.id)
0053     , selfLink(other.selfLink)
0054     , mimeType(other.mimeType)
0055     , modifiedDate(other.modifiedDate)
0056     , pinned(other.pinned)
0057     , published(other.published)
0058     , publishedLink(other.publishedLink)
0059     , publishAuto(other.publishAuto)
0060     , publishedOutsideDomain(other.publishedOutsideDomain)
0061     , downloadUrl(other.downloadUrl)
0062     , exportLinks(other.exportLinks)
0063     , lastModifyingUserName(other.lastModifyingUserName)
0064     , lastModifyingUser(other.lastModifyingUser)
0065     , originalFilename(other.originalFilename)
0066     , md5Checksum(other.md5Checksum)
0067     , fileSize(other.fileSize)
0068 {
0069 }
0070 
0071 RevisionPtr Revision::Private::fromJSON(const QVariantMap &map)
0072 {
0073     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#revision")) {
0074         return RevisionPtr();
0075     }
0076 
0077     RevisionPtr revision(new Revision);
0078     revision->setEtag(map[QStringLiteral("etag")].toString());
0079     revision->d->id = map[QStringLiteral("id")].toString();
0080     revision->d->selfLink = map[QStringLiteral("selfLink")].toUrl();
0081     revision->d->mimeType = map[QStringLiteral("mimeType")].toString();
0082     revision->d->modifiedDate = QDateTime::fromString(map[QStringLiteral("modifiedDate")].toString(), Qt::ISODate);
0083     revision->d->pinned = map[QStringLiteral("pinned")].toBool();
0084     revision->d->published = map[QStringLiteral("published")].toBool();
0085     revision->d->publishedLink = map[QStringLiteral("publishedLink")].toUrl();
0086     revision->d->publishAuto = map[QStringLiteral("publishAuto")].toBool();
0087     revision->d->publishedOutsideDomain = map[QStringLiteral("publishedOutsideDomain")].toBool();
0088     revision->d->downloadUrl = map[QStringLiteral("downloadUrl")].toUrl();
0089     revision->d->lastModifyingUserName = map[QStringLiteral("lastModifyingUserName")].toString();
0090     revision->d->lastModifyingUser = User::fromJSON(map[QStringLiteral("lastModifyingUser")].toMap());
0091     revision->d->originalFilename = map[QStringLiteral("originalFilename")].toString();
0092     revision->d->md5Checksum = map[QStringLiteral("md5Checksum")].toString();
0093     revision->d->fileSize = map[QStringLiteral("fileSize")].toLongLong();
0094 
0095     const QVariantMap exportLinks = map[QStringLiteral("exportLinks")].toMap();
0096     QVariantMap::ConstIterator iter = exportLinks.constBegin();
0097     for (; iter != exportLinks.constEnd(); ++iter) {
0098         revision->d->exportLinks.insert(iter.key(), iter.value().toUrl());
0099     }
0100 
0101     return revision;
0102 }
0103 
0104 Revision::Revision()
0105     : KGAPI2::Object()
0106     , d(new Private)
0107 {
0108 }
0109 
0110 Revision::Revision(const Revision &other)
0111     : KGAPI2::Object(other)
0112     , d(new Private(*(other.d)))
0113 {
0114 }
0115 
0116 Revision::~Revision()
0117 {
0118     delete d;
0119 }
0120 
0121 bool Revision::operator==(const Revision &other) const
0122 {
0123     if (!Object::operator==(other)) {
0124         return false;
0125     }
0126     GAPI_COMPARE(id)
0127     GAPI_COMPARE(selfLink)
0128     GAPI_COMPARE(mimeType)
0129     GAPI_COMPARE(modifiedDate)
0130     GAPI_COMPARE(pinned)
0131     GAPI_COMPARE(published)
0132     GAPI_COMPARE(publishedLink)
0133     GAPI_COMPARE(publishAuto)
0134     GAPI_COMPARE(publishedOutsideDomain)
0135     GAPI_COMPARE(downloadUrl)
0136     GAPI_COMPARE(exportLinks)
0137     GAPI_COMPARE(lastModifyingUserName)
0138     GAPI_COMPARE_SHAREDPTRS(lastModifyingUser)
0139     GAPI_COMPARE(originalFilename)
0140     GAPI_COMPARE(md5Checksum)
0141     GAPI_COMPARE(fileSize)
0142     return true;
0143 }
0144 
0145 QString Revision::id() const
0146 {
0147     return d->id;
0148 }
0149 
0150 QUrl Revision::selfLink() const
0151 {
0152     return d->selfLink;
0153 }
0154 
0155 QString Revision::mimeType() const
0156 {
0157     return d->mimeType;
0158 }
0159 
0160 QDateTime Revision::modifiedDate() const
0161 {
0162     return d->modifiedDate;
0163 }
0164 
0165 bool Revision::pinned() const
0166 {
0167     return d->pinned;
0168 }
0169 
0170 void Revision::setPinned(bool pinned)
0171 {
0172     d->pinned = pinned;
0173 }
0174 
0175 bool Revision::published() const
0176 {
0177     return d->published;
0178 }
0179 
0180 void Revision::setPublished(bool published)
0181 {
0182     d->published = published;
0183 }
0184 
0185 QUrl Revision::publishedLink() const
0186 {
0187     return d->publishedLink;
0188 }
0189 
0190 bool Revision::publishAuto() const
0191 {
0192     return d->publishAuto;
0193 }
0194 
0195 void Revision::setPublishAuto(bool publishAuto)
0196 {
0197     d->publishAuto = publishAuto;
0198 }
0199 
0200 bool Revision::publishedOutsideDomain() const
0201 {
0202     return d->publishedOutsideDomain;
0203 }
0204 
0205 void Revision::setPublishedOutsideDomain(bool publishedOutsideDomain)
0206 {
0207     d->publishedOutsideDomain = publishedOutsideDomain;
0208 }
0209 
0210 QUrl Revision::downloadUrl() const
0211 {
0212     return d->downloadUrl;
0213 }
0214 
0215 QMap<QString, QUrl> Revision::exportLinks() const
0216 {
0217     return d->exportLinks;
0218 }
0219 
0220 QString Revision::lastModifyingUserName() const
0221 {
0222     return d->lastModifyingUserName;
0223 }
0224 
0225 UserPtr Revision::lastModifyingUser() const
0226 {
0227     return d->lastModifyingUser;
0228 }
0229 
0230 QString Revision::originalFilename() const
0231 {
0232     return d->originalFilename;
0233 }
0234 
0235 QString Revision::md5Checksum() const
0236 {
0237     return d->md5Checksum;
0238 }
0239 
0240 qlonglong Revision::fileSize() const
0241 {
0242     return d->fileSize;
0243 }
0244 
0245 RevisionPtr Revision::fromJSON(const QByteArray &jsonData)
0246 {
0247     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0248     if (document.isNull()) {
0249         return RevisionPtr();
0250     }
0251 
0252     const QVariant data = document.toVariant();
0253     return Private::fromJSON(data.toMap());
0254 }
0255 
0256 RevisionsList Revision::fromJSONFeed(const QByteArray &jsonData)
0257 {
0258     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0259     if (document.isNull()) {
0260         return RevisionsList();
0261     }
0262 
0263     const QVariant data = document.toVariant();
0264     const QVariantMap map = data.toMap();
0265 
0266     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#revisionList")) {
0267         return RevisionsList();
0268     }
0269 
0270     RevisionsList list;
0271     const QVariantList items = map[QStringLiteral("items")].toList();
0272     for (const QVariant &item : std::as_const(items)) {
0273         const RevisionPtr revision = Private::fromJSON(item.toMap());
0274 
0275         if (!revision.isNull()) {
0276             list << revision;
0277         }
0278     }
0279 
0280     return list;
0281 }
0282 
0283 QByteArray Revision::toJSON(const RevisionPtr &revision)
0284 {
0285     QVariantMap map;
0286 
0287     map[QStringLiteral("pinned")] = revision->pinned();
0288     map[QStringLiteral("published")] = revision->published();
0289     map[QStringLiteral("publishAuto")] = revision->publishAuto();
0290     map[QStringLiteral("publishedOutsideDomain")] = revision->publishedOutsideDomain();
0291 
0292     QJsonDocument document = QJsonDocument::fromVariant(map);
0293     return document.toJson(QJsonDocument::Compact);
0294 }