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 "about.h"
0008 #include "debug.h"
0009 #include "user.h"
0010 #include "utils.h"
0011 #include "utils_p.h"
0012 
0013 #include <QJsonDocument>
0014 
0015 using namespace KGAPI2;
0016 using namespace KGAPI2::Drive;
0017 
0018 ///// DriveAbout::Format
0019 
0020 class Q_DECL_HIDDEN About::Format::Private
0021 {
0022 public:
0023     Private();
0024     Private(const Private &other);
0025 
0026     QString source;
0027     QStringList targets;
0028 };
0029 
0030 About::Format::Private::Private()
0031 {
0032 }
0033 
0034 About::Format::Private::Private(const Private &other)
0035     : source(other.source)
0036     , targets(other.targets)
0037 {
0038 }
0039 
0040 About::Format::Format()
0041     : d(new Private)
0042 {
0043 }
0044 
0045 About::Format::Format(const About::Format &other)
0046     : d(new Private(*(other.d)))
0047 {
0048 }
0049 
0050 About::Format::~Format()
0051 {
0052     delete d;
0053 }
0054 
0055 bool About::Format::operator==(const About::Format &other) const
0056 {
0057     GAPI_COMPARE(source)
0058     GAPI_COMPARE(targets)
0059     return true;
0060 }
0061 
0062 QString About::Format::source() const
0063 {
0064     return d->source;
0065 }
0066 
0067 QStringList About::Format::targets() const
0068 {
0069     return d->targets;
0070 }
0071 
0072 ///// DriveAbout::AdditionalRoleInfo::RoleSet
0073 
0074 class Q_DECL_HIDDEN About::AdditionalRoleInfo::RoleSet::Private
0075 {
0076 public:
0077     Private();
0078     Private(const Private &other);
0079 
0080     QString primaryRole;
0081     QStringList additionalRoles;
0082 };
0083 
0084 About::AdditionalRoleInfo::RoleSet::Private::Private()
0085 {
0086 }
0087 
0088 About::AdditionalRoleInfo::RoleSet::Private::Private(const Private &other)
0089     : primaryRole(other.primaryRole)
0090     , additionalRoles(other.additionalRoles)
0091 {
0092 }
0093 
0094 About::AdditionalRoleInfo::RoleSet::RoleSet()
0095     : d(new Private)
0096 {
0097 }
0098 
0099 About::AdditionalRoleInfo::RoleSet::RoleSet(const About::AdditionalRoleInfo::RoleSet &other)
0100     : d(new Private(*(other.d)))
0101 {
0102 }
0103 
0104 About::AdditionalRoleInfo::RoleSet::~RoleSet()
0105 {
0106     delete d;
0107 }
0108 
0109 bool About::AdditionalRoleInfo::RoleSet::operator==(const RoleSet &other) const
0110 {
0111     GAPI_COMPARE(primaryRole)
0112     GAPI_COMPARE(additionalRoles)
0113     return true;
0114 }
0115 
0116 QString About::AdditionalRoleInfo::RoleSet::primaryRole() const
0117 {
0118     return d->primaryRole;
0119 }
0120 
0121 QStringList About::AdditionalRoleInfo::RoleSet::additionalRoles() const
0122 {
0123     return d->additionalRoles;
0124 }
0125 
0126 ///// DriveAbout::AdditionalRoleInfo
0127 
0128 class Q_DECL_HIDDEN About::AdditionalRoleInfo::Private
0129 {
0130 public:
0131     Private();
0132     Private(const Private &other);
0133 
0134     QString type;
0135     RoleSetsList roleSets;
0136 };
0137 
0138 About::AdditionalRoleInfo::Private::Private()
0139 {
0140 }
0141 
0142 About::AdditionalRoleInfo::Private::Private(const Private &other)
0143     : type(other.type)
0144     , roleSets(other.roleSets)
0145 {
0146 }
0147 
0148 About::AdditionalRoleInfo::AdditionalRoleInfo()
0149     : d(new Private)
0150 {
0151 }
0152 
0153 About::AdditionalRoleInfo::AdditionalRoleInfo(const About::AdditionalRoleInfo &other)
0154     : d(new Private(*(other.d)))
0155 {
0156 }
0157 
0158 About::AdditionalRoleInfo::~AdditionalRoleInfo()
0159 {
0160     delete d;
0161 }
0162 
0163 bool About::AdditionalRoleInfo::operator==(const AdditionalRoleInfo &other) const
0164 {
0165     GAPI_COMPARE(type)
0166     GAPI_COMPARE_CONTAINERS(roleSets)
0167     return true;
0168 }
0169 
0170 QString About::AdditionalRoleInfo::type() const
0171 {
0172     return d->type;
0173 }
0174 
0175 About::AdditionalRoleInfo::RoleSetsList About::AdditionalRoleInfo::roleSets() const
0176 {
0177     return d->roleSets;
0178 }
0179 
0180 ///// DriveAbout::Feature
0181 
0182 class Q_DECL_HIDDEN About::Feature::Private
0183 {
0184 public:
0185     Private();
0186     Private(const Private &other);
0187 
0188     QString featureName;
0189     qreal featureRate;
0190 };
0191 
0192 About::Feature::Private::Private()
0193     : featureRate(-1)
0194 {
0195 }
0196 
0197 About::Feature::Private::Private(const Private &other)
0198     : featureName(other.featureName)
0199     , featureRate(other.featureRate)
0200 {
0201 }
0202 
0203 About::Feature::Feature()
0204     : d(new Private)
0205 {
0206 }
0207 
0208 About::Feature::Feature(const About::Feature &other)
0209     : d(new Private(*(other.d)))
0210 {
0211 }
0212 
0213 About::Feature::~Feature()
0214 {
0215     delete d;
0216 }
0217 
0218 bool About::Feature::operator==(const Feature &other) const
0219 {
0220     GAPI_COMPARE(featureName)
0221     GAPI_COMPARE(featureRate)
0222     return true;
0223 }
0224 
0225 QString About::Feature::featureName() const
0226 {
0227     return d->featureName;
0228 }
0229 
0230 qreal About::Feature::featureRate() const
0231 {
0232     return d->featureRate;
0233 }
0234 
0235 ///// DriveAbout::MaxUploadSize
0236 
0237 class Q_DECL_HIDDEN About::MaxUploadSize::Private
0238 {
0239 public:
0240     Private();
0241     Private(const Private &other);
0242 
0243     QString type;
0244     qlonglong size;
0245 };
0246 
0247 About::MaxUploadSize::Private::Private()
0248     : size(-1)
0249 {
0250 }
0251 
0252 About::MaxUploadSize::Private::Private(const Private &other)
0253     : type(other.type)
0254     , size(other.size)
0255 {
0256 }
0257 
0258 About::MaxUploadSize::MaxUploadSize()
0259     : d(new Private)
0260 {
0261 }
0262 
0263 About::MaxUploadSize::MaxUploadSize(const About::MaxUploadSize &other)
0264     : d(new Private(*(other.d)))
0265 {
0266 }
0267 
0268 About::MaxUploadSize::~MaxUploadSize()
0269 {
0270     delete d;
0271 }
0272 
0273 bool About::MaxUploadSize::operator==(const MaxUploadSize &other) const
0274 {
0275     GAPI_COMPARE(type)
0276     GAPI_COMPARE(size)
0277     return true;
0278 }
0279 
0280 QString About::MaxUploadSize::type() const
0281 {
0282     return d->type;
0283 }
0284 
0285 qlonglong About::MaxUploadSize::size() const
0286 {
0287     return d->size;
0288 }
0289 
0290 ///// DriveAbout
0291 
0292 class Q_DECL_HIDDEN About::Private
0293 {
0294 public:
0295     Private();
0296     Private(const Private &other);
0297 
0298     QUrl selfLink;
0299     QString name;
0300     qlonglong quotaBytesTotal;
0301     qlonglong quotaBytesUsed;
0302     qlonglong quotaBytesUsedInTrash;
0303     qlonglong quotaBytesUsedAggregate;
0304     qlonglong largestChangeId;
0305     qlonglong remainingChangeIds;
0306     QString rootFolderId;
0307     QString domainSharingPolicy;
0308     FormatsList importFormats;
0309     FormatsList exportFormats;
0310     AdditionalRoleInfosList additionalRoleInfo;
0311     FeaturesList features;
0312     MaxUploadSizesList maxUploadSizes;
0313     QString permissionId;
0314     bool isCurrentAppInstalled;
0315     bool canCreateDrives;
0316     UserPtr user;
0317 };
0318 
0319 About::Private::Private()
0320     : quotaBytesTotal(-1)
0321     , quotaBytesUsed(-1)
0322     , quotaBytesUsedInTrash(-1)
0323     , quotaBytesUsedAggregate(-1)
0324     , largestChangeId(-1)
0325     , remainingChangeIds(-1)
0326     , isCurrentAppInstalled(false)
0327     , canCreateDrives(false)
0328 {
0329 }
0330 
0331 About::Private::Private(const About::Private &other)
0332     : selfLink(other.selfLink)
0333     , name(other.name)
0334     , quotaBytesTotal(other.quotaBytesTotal)
0335     , quotaBytesUsed(other.quotaBytesUsed)
0336     , quotaBytesUsedInTrash(other.quotaBytesUsedInTrash)
0337     , quotaBytesUsedAggregate(other.quotaBytesUsedAggregate)
0338     , largestChangeId(other.largestChangeId)
0339     , remainingChangeIds(other.remainingChangeIds)
0340     , rootFolderId(other.rootFolderId)
0341     , domainSharingPolicy(other.domainSharingPolicy)
0342     , importFormats(other.importFormats)
0343     , exportFormats(other.exportFormats)
0344     , additionalRoleInfo(other.additionalRoleInfo)
0345     , features(other.features)
0346     , maxUploadSizes(other.maxUploadSizes)
0347     , permissionId(other.permissionId)
0348     , isCurrentAppInstalled(other.isCurrentAppInstalled)
0349     , canCreateDrives(other.canCreateDrives)
0350     , user(other.user)
0351 {
0352 }
0353 
0354 const QString About::Fields::AdditionalRoleInfo = QStringLiteral("additionalRoleInfo");
0355 const QString About::Fields::AdditionalRoles = QStringLiteral("additionalRoles");
0356 const QString About::Fields::BackgroundImageLink = QStringLiteral("backgroundImageLink");
0357 const QString About::Fields::BytesUsed = QStringLiteral("bytesUsed");
0358 const QString About::Fields::CanCreateDrives = QStringLiteral("canCreateDrives");
0359 const QString About::Fields::ColorRgb = QStringLiteral("colorRgb");
0360 const QString About::Fields::DisplayName = QStringLiteral("displayName");
0361 const QString About::Fields::DomainSharingPolicy = QStringLiteral("domainSharingPolicy");
0362 const QString About::Fields::EmailAddress = QStringLiteral("emailAddress");
0363 const QString About::Fields::Etag = QStringLiteral("etag");
0364 const QString About::Fields::ExportFormats = QStringLiteral("exportFormats");
0365 const QString About::Fields::FeatureName = QStringLiteral("featureName");
0366 const QString About::Fields::FeatureRate = QStringLiteral("featureRate");
0367 const QString About::Fields::Features = QStringLiteral("features");
0368 const QString About::Fields::FolderColorPalette = QStringLiteral("folderColorPalette");
0369 const QString About::Fields::Id = QStringLiteral("id");
0370 const QString About::Fields::ImportFormats = QStringLiteral("importFormats");
0371 const QString About::Fields::IsAuthenticatedUser = QStringLiteral("isAuthenticatedUser");
0372 const QString About::Fields::IsCurrentAppInstalled = QStringLiteral("isCurrentAppInstalled");
0373 const QString About::Fields::Kind = QStringLiteral("kind");
0374 const QString About::Fields::LanguageCode = QStringLiteral("languageCode");
0375 const QString About::Fields::LargestChangeId = QStringLiteral("largestChangeId");
0376 const QString About::Fields::MaxUploadSizes = QStringLiteral("maxUploadSizes");
0377 const QString About::Fields::Name = QStringLiteral("name");
0378 const QString About::Fields::PermissionId = QStringLiteral("permissionId");
0379 const QString About::Fields::Picture = QStringLiteral("picture");
0380 const QString About::Fields::PrimaryRole = QStringLiteral("primaryRole");
0381 const QString About::Fields::QuotaBytesByService = QStringLiteral("quotaBytesByService");
0382 const QString About::Fields::QuotaBytesTotal = QStringLiteral("quotaBytesTotal");
0383 const QString About::Fields::QuotaBytesUsedAggregate = QStringLiteral("quotaBytesUsedAggregate");
0384 const QString About::Fields::QuotaBytesUsedInTrash = QStringLiteral("quotaBytesUsedInTrash");
0385 const QString About::Fields::QuotaBytesUsed = QStringLiteral("quotaBytesUsed");
0386 const QString About::Fields::QuotaType = QStringLiteral("quotaType");
0387 const QString About::Fields::RemainingChangeIds = QStringLiteral("remainingChangeIds");
0388 const QString About::Fields::RoleSets = QStringLiteral("roleSets");
0389 const QString About::Fields::RootFolderId = QStringLiteral("rootFolderId");
0390 const QString About::Fields::SelfLink = QStringLiteral("selfLink");
0391 const QString About::Fields::ServiceName = QStringLiteral("serviceName");
0392 const QString About::Fields::Size = QStringLiteral("size");
0393 const QString About::Fields::Source = QStringLiteral("source");
0394 const QString About::Fields::Targets = QStringLiteral("targets");
0395 const QString About::Fields::TeamDriveThemes = QStringLiteral("teamDriveThemes");
0396 const QString About::Fields::Type = QStringLiteral("type");
0397 const QString About::Fields::Url = QStringLiteral("url");
0398 const QString About::Fields::User = QStringLiteral("user");
0399 
0400 About::About()
0401     : KGAPI2::Object()
0402     , d(new Private)
0403 {
0404 }
0405 
0406 About::About(const About &other)
0407     : KGAPI2::Object(other)
0408     , d(new Private(*(other.d)))
0409 {
0410 }
0411 
0412 About::~About() = default;
0413 
0414 bool About::operator==(const About &other) const
0415 {
0416     if (!Object::operator==(other)) {
0417         return false;
0418     }
0419 
0420     GAPI_COMPARE(selfLink)
0421     GAPI_COMPARE(name)
0422     GAPI_COMPARE(quotaBytesTotal)
0423     GAPI_COMPARE(quotaBytesUsed)
0424     GAPI_COMPARE(quotaBytesUsedInTrash)
0425     GAPI_COMPARE(quotaBytesUsedInTrash)
0426     GAPI_COMPARE(largestChangeId)
0427     GAPI_COMPARE(remainingChangeIds)
0428     GAPI_COMPARE(rootFolderId)
0429     GAPI_COMPARE(domainSharingPolicy)
0430     GAPI_COMPARE_CONTAINERS(importFormats)
0431     GAPI_COMPARE_CONTAINERS(exportFormats)
0432     GAPI_COMPARE_CONTAINERS(additionalRoleInfo)
0433     GAPI_COMPARE_CONTAINERS(features)
0434     GAPI_COMPARE_CONTAINERS(maxUploadSizes)
0435     GAPI_COMPARE(permissionId)
0436     GAPI_COMPARE(isCurrentAppInstalled)
0437     GAPI_COMPARE(canCreateDrives)
0438     GAPI_COMPARE_SHAREDPTRS(user)
0439     return true;
0440 }
0441 
0442 QUrl About::selfLink() const
0443 {
0444     return d->selfLink;
0445 }
0446 
0447 QString About::name() const
0448 {
0449     return d->name;
0450 }
0451 
0452 qlonglong About::quotaBytesTotal() const
0453 {
0454     return d->quotaBytesTotal;
0455 }
0456 
0457 qlonglong About::quotaBytesUsed() const
0458 {
0459     return d->quotaBytesUsed;
0460 }
0461 
0462 qlonglong About::quotaBytesUsedInTrash() const
0463 {
0464     return d->quotaBytesUsedInTrash;
0465 }
0466 
0467 qlonglong About::quotaBytesUsedAggregate() const
0468 {
0469     return d->quotaBytesUsedAggregate;
0470 }
0471 
0472 #ifndef KGAPIDRIVE_NO_DEPRECATED
0473 qlonglong About::quotaBytesUserAggregate() const
0474 {
0475     return quotaBytesUsedAggregate();
0476 }
0477 #endif
0478 
0479 qlonglong About::largestChangeId() const
0480 {
0481     return d->largestChangeId;
0482 }
0483 qlonglong About::remainingChangeIds() const
0484 {
0485     return d->remainingChangeIds;
0486 }
0487 
0488 QString About::rootFolderId() const
0489 {
0490     return d->rootFolderId;
0491 }
0492 
0493 QString About::domainSharingPolicy() const
0494 {
0495     return d->domainSharingPolicy;
0496 }
0497 
0498 About::FormatsList About::importFormats() const
0499 {
0500     return d->importFormats;
0501 }
0502 
0503 About::FormatsList About::exportFormats() const
0504 {
0505     return d->exportFormats;
0506 }
0507 
0508 About::AdditionalRoleInfosList About::additionalRoleInfo() const
0509 {
0510     return d->additionalRoleInfo;
0511 }
0512 
0513 About::FeaturesList About::features() const
0514 {
0515     return d->features;
0516 }
0517 
0518 About::MaxUploadSizesList About::maxUploadSizes() const
0519 {
0520     return d->maxUploadSizes;
0521 }
0522 
0523 QString About::permissionId() const
0524 {
0525     return d->permissionId;
0526 }
0527 
0528 bool About::isCurrentAppInstalled() const
0529 {
0530     return d->isCurrentAppInstalled;
0531 }
0532 
0533 UserPtr About::user() const
0534 {
0535     return d->user;
0536 }
0537 
0538 bool About::canCreateDrives() const
0539 {
0540     return d->canCreateDrives;
0541 }
0542 
0543 AboutPtr About::fromJSON(const QByteArray &jsonData)
0544 {
0545     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0546     if (document.isNull()) {
0547         return AboutPtr();
0548     }
0549     const QVariantMap map = document.toVariant().toMap();
0550 
0551     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#about")) {
0552         return AboutPtr();
0553     }
0554 
0555     AboutPtr about(new About());
0556     about->setEtag(map.value(QStringLiteral("etag")).toString());
0557     about->d->selfLink = map.value(QStringLiteral("selfLink")).toUrl();
0558     about->d->name = map.value(QStringLiteral("name")).toString();
0559     about->d->quotaBytesTotal = map.value(QStringLiteral("quotaBytesTotal")).toLongLong();
0560     about->d->quotaBytesUsed = map.value(QStringLiteral("quotaBytesUsed")).toLongLong();
0561     about->d->quotaBytesUsedInTrash = map.value(QStringLiteral("quotaBytesUsedInTrash")).toLongLong();
0562     about->d->quotaBytesUsedAggregate = map.value(QStringLiteral("quotaBytesUsedAggregate")).toLongLong();
0563     about->d->largestChangeId = map.value(QStringLiteral("largestChangeId")).toLongLong();
0564     about->d->remainingChangeIds = map.value(QStringLiteral("remainingChangeIds")).toLongLong();
0565     about->d->rootFolderId = map.value(QStringLiteral("rootFolderId")).toString();
0566     about->d->domainSharingPolicy = map.value(QStringLiteral("domainSharingPolicy")).toString();
0567     about->d->permissionId = map.value(QStringLiteral("permissionId")).toString();
0568     about->d->isCurrentAppInstalled = map.value(QStringLiteral("isCurrentAppInstalled")).toBool();
0569     about->d->canCreateDrives = map.value(QStringLiteral("canCreateDrives")).toBool();
0570 
0571     const QVariantList importFormats = map.value(QStringLiteral("importFormats")).toList();
0572     for (const QVariant &v : importFormats) {
0573         const QVariantMap importFormat = v.toMap();
0574         FormatPtr format(new Format());
0575         format->d->source = importFormat.value(QStringLiteral("source")).toString();
0576         format->d->targets = importFormat.value(QStringLiteral("targets")).toStringList();
0577 
0578         about->d->importFormats << format;
0579     }
0580 
0581     const QVariantList exportFormats = map.value(QStringLiteral("exportFormats")).toList();
0582     for (const QVariant &v : exportFormats) {
0583         const QVariantMap exportFormat = v.toMap();
0584         FormatPtr format(new Format());
0585         format->d->source = exportFormat.value(QStringLiteral("source")).toString();
0586         format->d->targets = exportFormat.value(QStringLiteral("targets")).toStringList();
0587 
0588         about->d->exportFormats << format;
0589     }
0590 
0591     const QVariantList additionalRoleInfos = map.value(QStringLiteral("additionalRoleInfo")).toList();
0592     for (const QVariant &v : additionalRoleInfos) {
0593         const QVariantMap additionalRoleInfo = v.toMap();
0594         AdditionalRoleInfoPtr info(new AdditionalRoleInfo());
0595         info->d->type = additionalRoleInfo.value(QStringLiteral("type")).toString();
0596 
0597         const QVariantList roleSets = additionalRoleInfo.value(QStringLiteral("roleSets")).toList();
0598         for (const QVariant &vv : roleSets) {
0599             const QVariantMap roleSetData = vv.toMap();
0600             AdditionalRoleInfo::RoleSetPtr roleSet(new AdditionalRoleInfo::RoleSet());
0601             roleSet->d->primaryRole = roleSetData.value(QStringLiteral("primaryRole")).toString();
0602             roleSet->d->additionalRoles = roleSetData.value(QStringLiteral("additionalRoles")).toStringList();
0603 
0604             info->d->roleSets << roleSet;
0605         }
0606 
0607         about->d->additionalRoleInfo << info;
0608     }
0609 
0610     const QVariantList features = map.value(QStringLiteral("features")).toList();
0611     for (const QVariant &v : features) {
0612         const QVariantMap featureData = v.toMap();
0613         FeaturePtr feature(new Feature());
0614         feature->d->featureName = featureData.value(QStringLiteral("featureName")).toString();
0615         feature->d->featureRate = featureData.value(QStringLiteral("featureRate")).toReal();
0616 
0617         about->d->features << feature;
0618     }
0619 
0620     const QVariantList maxUploadSizes = map.value(QStringLiteral("maxUploadSizes")).toList();
0621     for (const QVariant &v : maxUploadSizes) {
0622         const QVariantMap maxUploadSizeData = v.toMap();
0623         MaxUploadSizePtr maxUploadSize(new MaxUploadSize());
0624         maxUploadSize->d->type = maxUploadSizeData.value(QStringLiteral("type")).toString();
0625         maxUploadSize->d->size = maxUploadSizeData.value(QStringLiteral("size")).toLongLong();
0626 
0627         about->d->maxUploadSizes << maxUploadSize;
0628     }
0629 
0630     about->d->user = User::fromJSON(map.value(QStringLiteral("user")).toMap());
0631 
0632     return about;
0633 }