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

0001 /*
0002     SPDX-FileCopyrightText: 2019 David Barchiesi <david@barchie.si>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "drives.h"
0008 #include "driveservice.h"
0009 #include "utils_p.h"
0010 
0011 #include <QJsonDocument>
0012 #include <QUrlQuery>
0013 #include <QVariant>
0014 
0015 namespace
0016 {
0017 static const QString ApiKind = QStringLiteral("drive#drive");
0018 static const QString ApiKindList = QStringLiteral("drive#driveList");
0019 }
0020 
0021 using namespace KGAPI2;
0022 using namespace KGAPI2::Drive;
0023 
0024 ///// Drives::Restrictions
0025 
0026 class Q_DECL_HIDDEN Drives::Restrictions::Private
0027 {
0028 public:
0029     Private() = default;
0030     Private(const Private &other) = default;
0031 
0032     bool adminManagedRestrictions = false;
0033     bool copyRequiresWriterPermission = false;
0034     bool domainUsersOnly = false;
0035     bool driveMembersOnly = false;
0036 };
0037 
0038 Drives::Restrictions::Restrictions()
0039     : d(new Private)
0040 {
0041 }
0042 
0043 Drives::Restrictions::Restrictions(const Drives::Restrictions &other)
0044     : d(new Private(*(other.d)))
0045 {
0046 }
0047 
0048 Drives::Restrictions::~Restrictions() = default;
0049 
0050 bool Drives::Restrictions::operator==(const Drives::Restrictions &other) const
0051 {
0052     GAPI_COMPARE(adminManagedRestrictions);
0053     GAPI_COMPARE(copyRequiresWriterPermission);
0054     GAPI_COMPARE(domainUsersOnly);
0055     GAPI_COMPARE(driveMembersOnly);
0056     return true;
0057 }
0058 
0059 bool Drives::Restrictions::adminManagedRestrictions() const
0060 {
0061     return d->adminManagedRestrictions;
0062 }
0063 
0064 void Drives::Restrictions::setAdminManagedRestrictions(bool adminManagedRestrictions) const
0065 {
0066     d->adminManagedRestrictions = adminManagedRestrictions;
0067 }
0068 
0069 bool Drives::Restrictions::copyRequiresWriterPermission() const
0070 {
0071     return d->copyRequiresWriterPermission;
0072 }
0073 
0074 void Drives::Restrictions::setCopyRequiresWriterPermission(bool copyRequiresWriterPermission) const
0075 {
0076     d->copyRequiresWriterPermission = copyRequiresWriterPermission;
0077 }
0078 
0079 bool Drives::Restrictions::domainUsersOnly() const
0080 {
0081     return d->domainUsersOnly;
0082 }
0083 
0084 void Drives::Restrictions::setDomainUsersOnly(bool domainUsersOnly) const
0085 {
0086     d->domainUsersOnly = domainUsersOnly;
0087 }
0088 
0089 bool Drives::Restrictions::driveMembersOnly() const
0090 {
0091     return d->driveMembersOnly;
0092 }
0093 
0094 void Drives::Restrictions::setDriveMembersOnly(bool driveMembersOnly) const
0095 {
0096     d->driveMembersOnly = driveMembersOnly;
0097 }
0098 
0099 ///// Drives::Capabilities
0100 
0101 class Q_DECL_HIDDEN Drives::Capabilities::Private
0102 {
0103 public:
0104     Private() = default;
0105     Private(const Private &other) = default;
0106 
0107     bool canAddChildren = false;
0108     bool canChangeCopyRequiresWriterPermissionRestriction = false;
0109     bool canChangeDomainUsersOnlyRestriction = false;
0110     bool canChangeDriveBackground = false;
0111     bool canChangeDriveMembersOnlyRestriction = false;
0112     bool canComment = false;
0113     bool canCopy = false;
0114     bool canDeleteChildren = false;
0115     bool canDeleteDrive = false;
0116     bool canDownload = false;
0117     bool canEdit = false;
0118     bool canListChildren = false;
0119     bool canManageMembers = false;
0120     bool canReadRevisions = false;
0121     bool canRename = false;
0122     bool canRenameDrive = false;
0123     bool canShare = false;
0124     bool canTrashChildren = false;
0125 };
0126 
0127 Drives::Capabilities::Capabilities()
0128     : d(new Private)
0129 {
0130 }
0131 
0132 Drives::Capabilities::Capabilities(const Drives::Capabilities &other)
0133     : d(new Private(*(other.d)))
0134 {
0135 }
0136 
0137 Drives::Capabilities::~Capabilities() = default;
0138 
0139 bool Drives::Capabilities::operator==(const Drives::Capabilities &other) const
0140 {
0141     GAPI_COMPARE(canAddChildren);
0142     GAPI_COMPARE(canChangeCopyRequiresWriterPermissionRestriction);
0143     GAPI_COMPARE(canChangeDomainUsersOnlyRestriction);
0144     GAPI_COMPARE(canChangeDriveBackground);
0145     GAPI_COMPARE(canChangeDriveMembersOnlyRestriction);
0146     GAPI_COMPARE(canComment);
0147     GAPI_COMPARE(canCopy);
0148     GAPI_COMPARE(canDeleteChildren);
0149     GAPI_COMPARE(canDeleteDrive);
0150     GAPI_COMPARE(canDownload);
0151     GAPI_COMPARE(canEdit);
0152     GAPI_COMPARE(canListChildren);
0153     GAPI_COMPARE(canManageMembers);
0154     GAPI_COMPARE(canReadRevisions);
0155     GAPI_COMPARE(canRename);
0156     GAPI_COMPARE(canRenameDrive);
0157     GAPI_COMPARE(canShare);
0158     GAPI_COMPARE(canTrashChildren);
0159     return true;
0160 }
0161 
0162 bool Drives::Capabilities::canAddChildren() const
0163 {
0164     return d->canAddChildren;
0165 }
0166 
0167 bool Drives::Capabilities::canChangeCopyRequiresWriterPermissionRestriction() const
0168 {
0169     return d->canChangeCopyRequiresWriterPermissionRestriction;
0170 }
0171 
0172 bool Drives::Capabilities::canChangeDomainUsersOnlyRestriction() const
0173 {
0174     return d->canChangeDomainUsersOnlyRestriction;
0175 }
0176 
0177 bool Drives::Capabilities::canChangeDriveBackground() const
0178 {
0179     return d->canChangeDriveBackground;
0180 }
0181 
0182 bool Drives::Capabilities::canChangeDriveMembersOnlyRestriction() const
0183 {
0184     return d->canChangeDriveMembersOnlyRestriction;
0185 }
0186 
0187 bool Drives::Capabilities::canComment() const
0188 {
0189     return d->canComment;
0190 }
0191 
0192 bool Drives::Capabilities::canCopy() const
0193 {
0194     return d->canCopy;
0195 }
0196 
0197 bool Drives::Capabilities::canDeleteChildren() const
0198 {
0199     return d->canDeleteChildren;
0200 }
0201 
0202 bool Drives::Capabilities::canDeleteDrive() const
0203 {
0204     return d->canDeleteDrive;
0205 }
0206 
0207 bool Drives::Capabilities::canDownload() const
0208 {
0209     return d->canDownload;
0210 }
0211 
0212 bool Drives::Capabilities::canEdit() const
0213 {
0214     return d->canEdit;
0215 }
0216 
0217 bool Drives::Capabilities::canListChildren() const
0218 {
0219     return d->canListChildren;
0220 }
0221 
0222 bool Drives::Capabilities::canManageMembers() const
0223 {
0224     return d->canManageMembers;
0225 }
0226 
0227 bool Drives::Capabilities::canReadRevisions() const
0228 {
0229     return d->canReadRevisions;
0230 }
0231 
0232 bool Drives::Capabilities::canRename() const
0233 {
0234     return d->canRename;
0235 }
0236 
0237 bool Drives::Capabilities::canRenameDrive() const
0238 {
0239     return d->canRenameDrive;
0240 }
0241 
0242 bool Drives::Capabilities::canShare() const
0243 {
0244     return d->canShare;
0245 }
0246 
0247 bool Drives::Capabilities::canTrashChildren() const
0248 {
0249     return d->canTrashChildren;
0250 }
0251 
0252 ///// Drives::BackgroundImageFile
0253 
0254 class Q_DECL_HIDDEN Drives::BackgroundImageFile::Private
0255 {
0256 public:
0257     Private() = default;
0258     Private(const Private &other) = default;
0259 
0260     QString id;
0261     float xCoordinate = 0.0f;
0262     float yCoordinate = 0.0f;
0263     float width = 0.0f;
0264 };
0265 
0266 Drives::BackgroundImageFile::BackgroundImageFile()
0267     : d(new Private)
0268 {
0269 }
0270 
0271 Drives::BackgroundImageFile::BackgroundImageFile(const Drives::BackgroundImageFile &other)
0272     : d(new Private(*(other.d)))
0273 {
0274 }
0275 
0276 Drives::BackgroundImageFile::~BackgroundImageFile() = default;
0277 
0278 bool Drives::BackgroundImageFile::operator==(const Drives::BackgroundImageFile &other) const
0279 {
0280     GAPI_COMPARE(id);
0281     GAPI_COMPARE(xCoordinate);
0282     GAPI_COMPARE(yCoordinate);
0283     GAPI_COMPARE(width);
0284     return true;
0285 }
0286 
0287 QString Drives::BackgroundImageFile::id() const
0288 {
0289     return d->id;
0290 }
0291 
0292 void Drives::BackgroundImageFile::setId(const QString &id) const
0293 {
0294     d->id = id;
0295 }
0296 
0297 float Drives::BackgroundImageFile::xCoordinate() const
0298 {
0299     return d->xCoordinate;
0300 }
0301 
0302 void Drives::BackgroundImageFile::setXCoordinate(const float xCoordinate) const
0303 {
0304     d->xCoordinate = xCoordinate;
0305 }
0306 
0307 float Drives::BackgroundImageFile::yCoordinate() const
0308 {
0309     return d->yCoordinate;
0310 }
0311 
0312 void Drives::BackgroundImageFile::setYCoordinate(const float yCoordinate) const
0313 {
0314     d->yCoordinate = yCoordinate;
0315 }
0316 
0317 float Drives::BackgroundImageFile::width() const
0318 {
0319     return d->width;
0320 }
0321 
0322 void Drives::BackgroundImageFile::setWidth(const float width) const
0323 {
0324     d->width = width;
0325 }
0326 
0327 ///// Drives
0328 
0329 class Q_DECL_HIDDEN Drives::Private
0330 {
0331 public:
0332     Private() = default;
0333     Private(const Private &other) = default;
0334 
0335     QString id;
0336     QString name;
0337     QString themeId;
0338     QString colorRgb;
0339     BackgroundImageFilePtr backgroundImageFile;
0340     QString backgroundImageLink;
0341     CapabilitiesPtr capabilities;
0342     QDateTime createdDate;
0343     bool hidden = false;
0344     RestrictionsPtr restrictions;
0345 
0346     static DrivesPtr fromJSON(const QVariantMap &map);
0347 };
0348 
0349 DrivesPtr Drives::Private::fromJSON(const QVariantMap &map)
0350 {
0351     if (!map.contains(Drives::Fields::Kind) || map[Drives::Fields::Kind].toString() != ApiKind) {
0352         return DrivesPtr();
0353     }
0354 
0355     auto drives = DrivesPtr::create();
0356     if (map.contains(Drives::Fields::Id)) {
0357         drives->d->id = map[Drives::Fields::Id].toString();
0358     }
0359     if (map.contains(Drives::Fields::Name)) {
0360         drives->d->name = map[Drives::Fields::Name].toString();
0361     }
0362     if (map.contains(Drives::Fields::ThemeId)) {
0363         drives->d->themeId = map[Drives::Fields::ThemeId].toString();
0364     }
0365     if (map.contains(Drives::Fields::ColorRgb)) {
0366         drives->d->colorRgb = map[Drives::Fields::ColorRgb].toString();
0367     }
0368     if (map.contains(Drives::Fields::BackgroundImageLink)) {
0369         drives->d->backgroundImageLink = map[Drives::Fields::BackgroundImageLink].toString();
0370     }
0371     if (map.contains(Drives::Fields::CreatedDate)) {
0372         drives->d->createdDate = QDateTime::fromString(map[Drives::Fields::CreatedDate].toString(), Qt::ISODate);
0373     }
0374     if (map.contains(Drives::Fields::Hidden)) {
0375         drives->d->hidden = map[Drives::Fields::Hidden].toBool();
0376     }
0377 
0378     if (map.contains(Drives::Fields::BackgroundImageFile)) {
0379         const QVariantMap backgroundImageFileMap = map[Drives::Fields::BackgroundImageFile].toMap();
0380         auto backgroundImageFile = BackgroundImageFilePtr::create();
0381         backgroundImageFile->d->id = backgroundImageFileMap[Drives::BackgroundImageFile::Fields::Id].toString();
0382         backgroundImageFile->d->xCoordinate = backgroundImageFileMap[Drives::BackgroundImageFile::Fields::XCoordinate].toReal();
0383         backgroundImageFile->d->yCoordinate = backgroundImageFileMap[Drives::BackgroundImageFile::Fields::YCoordinate].toReal();
0384         backgroundImageFile->d->width = backgroundImageFileMap[Drives::BackgroundImageFile::Fields::Width].toReal();
0385         drives->d->backgroundImageFile = backgroundImageFile;
0386     }
0387 
0388     if (map.contains(Drives::Fields::Capabilities)) {
0389         const QVariantMap capabilitiesMap = map[Drives::Fields::Capabilities].toMap();
0390         auto capabilities = CapabilitiesPtr::create();
0391         capabilities->d->canAddChildren = capabilitiesMap[Drives::Capabilities::Fields::CanAddChildren].toBool();
0392         capabilities->d->canChangeCopyRequiresWriterPermissionRestriction =
0393             capabilitiesMap[Drives::Capabilities::Fields::CanChangeCopyRequiresWriterPermissionRestriction].toBool();
0394         capabilities->d->canChangeDomainUsersOnlyRestriction = capabilitiesMap[Drives::Capabilities::Fields::CanChangeDomainUsersOnlyRestriction].toBool();
0395         capabilities->d->canChangeDriveBackground = capabilitiesMap[Drives::Capabilities::Fields::CanChangeDriveBackground].toBool();
0396         capabilities->d->canChangeDriveMembersOnlyRestriction = capabilitiesMap[Drives::Capabilities::Fields::CanChangeDriveMembersOnlyRestriction].toBool();
0397         capabilities->d->canComment = capabilitiesMap[Drives::Capabilities::Fields::CanComment].toBool();
0398         capabilities->d->canCopy = capabilitiesMap[Drives::Capabilities::Fields::CanCopy].toBool();
0399         capabilities->d->canDeleteChildren = capabilitiesMap[Drives::Capabilities::Fields::CanDeleteChildren].toBool();
0400         capabilities->d->canDeleteDrive = capabilitiesMap[Drives::Capabilities::Fields::CanDeleteDrive].toBool();
0401         capabilities->d->canDownload = capabilitiesMap[Drives::Capabilities::Fields::CanDownload].toBool();
0402         capabilities->d->canEdit = capabilitiesMap[Drives::Capabilities::Fields::CanEdit].toBool();
0403         capabilities->d->canListChildren = capabilitiesMap[Drives::Capabilities::Fields::CanListChildren].toBool();
0404         capabilities->d->canManageMembers = capabilitiesMap[Drives::Capabilities::Fields::CanManageMembers].toBool();
0405         capabilities->d->canReadRevisions = capabilitiesMap[Drives::Capabilities::Fields::CanReadRevisions].toBool();
0406         capabilities->d->canRename = capabilitiesMap[Drives::Capabilities::Fields::CanRename].toBool();
0407         capabilities->d->canRenameDrive = capabilitiesMap[Drives::Capabilities::Fields::CanRenameDrive].toBool();
0408         capabilities->d->canShare = capabilitiesMap[Drives::Capabilities::Fields::CanShare].toBool();
0409         capabilities->d->canTrashChildren = capabilitiesMap[Drives::Capabilities::Fields::CanTrashChildren].toBool();
0410         drives->d->capabilities = capabilities;
0411     }
0412 
0413     if (map.contains(Drives::Fields::Restrictions)) {
0414         const QVariantMap restrictionsMap = map[Drives::Fields::Restrictions].toMap();
0415         auto restrictions = RestrictionsPtr::create();
0416         restrictions->d->adminManagedRestrictions = restrictionsMap[Drives::Restrictions::Fields::AdminManagedRestrictions].toBool();
0417         restrictions->d->copyRequiresWriterPermission = restrictionsMap[Drives::Restrictions::Fields::CopyRequiresWriterPermission].toBool();
0418         restrictions->d->domainUsersOnly = restrictionsMap[Drives::Restrictions::Fields::DomainUsersOnly].toBool();
0419         restrictions->d->driveMembersOnly = restrictionsMap[Drives::Restrictions::Fields::DriveMembersOnly].toBool();
0420         drives->d->restrictions = restrictions;
0421     }
0422 
0423     return drives;
0424 }
0425 
0426 const QString Drives::Restrictions::Fields::AdminManagedRestrictions = QStringLiteral("adminManagedRestrictions");
0427 const QString Drives::Restrictions::Fields::CopyRequiresWriterPermission = QStringLiteral("copyRequiresWriterPermission");
0428 const QString Drives::Restrictions::Fields::DomainUsersOnly = QStringLiteral("domainUsersOnly");
0429 const QString Drives::Restrictions::Fields::DriveMembersOnly = QStringLiteral("driveMembersOnly");
0430 
0431 const QString Drives::Capabilities::Fields::CanAddChildren = QStringLiteral("canAddChildren");
0432 const QString Drives::Capabilities::Fields::CanChangeCopyRequiresWriterPermissionRestriction =
0433     QStringLiteral("canChangeCopyRequiresWriterPermissionRestriction");
0434 const QString Drives::Capabilities::Fields::CanChangeDomainUsersOnlyRestriction = QStringLiteral("canChangeDomainUsersOnlyRestriction");
0435 const QString Drives::Capabilities::Fields::CanChangeDriveBackground = QStringLiteral("canChangeDriveBackground");
0436 const QString Drives::Capabilities::Fields::CanChangeDriveMembersOnlyRestriction = QStringLiteral("canChangeDriveMembersOnlyRestriction");
0437 const QString Drives::Capabilities::Fields::CanComment = QStringLiteral("canComment");
0438 const QString Drives::Capabilities::Fields::CanCopy = QStringLiteral("canCopy");
0439 const QString Drives::Capabilities::Fields::CanDeleteChildren = QStringLiteral("canDeleteChildren");
0440 const QString Drives::Capabilities::Fields::CanDeleteDrive = QStringLiteral("canDeleteDrive");
0441 const QString Drives::Capabilities::Fields::CanDownload = QStringLiteral("canDownload");
0442 const QString Drives::Capabilities::Fields::CanEdit = QStringLiteral("canEdit");
0443 const QString Drives::Capabilities::Fields::CanListChildren = QStringLiteral("canListChildren");
0444 const QString Drives::Capabilities::Fields::CanManageMembers = QStringLiteral("canManageMembers");
0445 const QString Drives::Capabilities::Fields::CanReadRevisions = QStringLiteral("canReadRevisions");
0446 const QString Drives::Capabilities::Fields::CanRename = QStringLiteral("canRename");
0447 const QString Drives::Capabilities::Fields::CanRenameDrive = QStringLiteral("canRenameDrive");
0448 const QString Drives::Capabilities::Fields::CanShare = QStringLiteral("canShare");
0449 const QString Drives::Capabilities::Fields::CanTrashChildren = QStringLiteral("canTrashChildren");
0450 
0451 const QString Drives::BackgroundImageFile::Fields::Id = QStringLiteral("id");
0452 const QString Drives::BackgroundImageFile::Fields::XCoordinate = QStringLiteral("xCoordinate");
0453 const QString Drives::BackgroundImageFile::Fields::YCoordinate = QStringLiteral("yCoordinate");
0454 const QString Drives::BackgroundImageFile::Fields::Width = QStringLiteral("width");
0455 
0456 const QString Drives::Fields::Items = QStringLiteral("items");
0457 const QString Drives::Fields::KindDrive = QStringLiteral("kind");
0458 const QString Drives::Fields::PageToken = QStringLiteral("pageToken");
0459 const QString Drives::Fields::NextPageToken = QStringLiteral("nextPageToken");
0460 const QString Drives::Fields::Id = QStringLiteral("id");
0461 const QString Drives::Fields::Kind = QStringLiteral("kind");
0462 const QString Drives::Fields::Name = QStringLiteral("name");
0463 const QString Drives::Fields::ThemeId = QStringLiteral("themeId");
0464 const QString Drives::Fields::ColorRgb = QStringLiteral("colorRgb");
0465 const QString Drives::Fields::BackgroundImageFile = QStringLiteral("backgroundImageFile");
0466 const QString Drives::Fields::BackgroundImageLink = QStringLiteral("backgroundImageLink");
0467 const QString Drives::Fields::Capabilities = QStringLiteral("capabilities");
0468 const QString Drives::Fields::CreatedDate = QStringLiteral("createdDate");
0469 const QString Drives::Fields::Hidden = QStringLiteral("hidden");
0470 const QString Drives::Fields::Restrictions = QStringLiteral("restrictions");
0471 
0472 Drives::Drives()
0473     : KGAPI2::Object()
0474     , d(new Private)
0475 {
0476 }
0477 
0478 Drives::Drives(const Drives &other)
0479     : KGAPI2::Object(other)
0480     , d(new Private(*(other.d)))
0481 {
0482 }
0483 
0484 Drives::~Drives() = default;
0485 
0486 bool Drives::operator==(const Drives &other) const
0487 {
0488     if (!Object::operator==(other)) {
0489         return false;
0490     }
0491     GAPI_COMPARE(id);
0492     GAPI_COMPARE(name);
0493     GAPI_COMPARE(themeId);
0494     GAPI_COMPARE(colorRgb);
0495     GAPI_COMPARE_SHAREDPTRS(backgroundImageFile);
0496     GAPI_COMPARE(backgroundImageLink);
0497     GAPI_COMPARE_SHAREDPTRS(capabilities);
0498     GAPI_COMPARE(createdDate);
0499     GAPI_COMPARE(hidden);
0500     GAPI_COMPARE_SHAREDPTRS(restrictions);
0501     return true;
0502 }
0503 
0504 QString Drives::id() const
0505 {
0506     return d->id;
0507 }
0508 
0509 void Drives::setId(const QString &id) const
0510 {
0511     d->id = id;
0512 }
0513 
0514 QString Drives::name() const
0515 {
0516     return d->name;
0517 }
0518 
0519 void Drives::setName(const QString &name) const
0520 {
0521     d->name = name;
0522 }
0523 
0524 QString Drives::themeId() const
0525 {
0526     return d->themeId;
0527 }
0528 
0529 void Drives::setThemeId(const QString &themeId) const
0530 {
0531     d->themeId = themeId;
0532 }
0533 
0534 QString Drives::colorRgb() const
0535 {
0536     return d->colorRgb;
0537 }
0538 
0539 void Drives::setColorRgb(const QString &colorRgb) const
0540 {
0541     d->colorRgb = colorRgb;
0542 }
0543 
0544 Drives::BackgroundImageFilePtr Drives::backgroundImageFile() const
0545 {
0546     return d->backgroundImageFile;
0547 }
0548 
0549 void Drives::setBackgroundImageFile(const Drives::BackgroundImageFilePtr &backgroundImageFile) const
0550 {
0551     d->backgroundImageFile = backgroundImageFile;
0552 }
0553 
0554 QString Drives::backgroundImageLink() const
0555 {
0556     return d->backgroundImageLink;
0557 }
0558 
0559 Drives::CapabilitiesPtr Drives::capabilities() const
0560 {
0561     return d->capabilities;
0562 }
0563 
0564 QDateTime Drives::createdDate() const
0565 {
0566     return d->createdDate;
0567 }
0568 
0569 bool Drives::hidden() const
0570 {
0571     return d->hidden;
0572 }
0573 
0574 void Drives::setRestrictions(const Drives::RestrictionsPtr &restrictions) const
0575 {
0576     d->restrictions = restrictions;
0577 }
0578 
0579 Drives::RestrictionsPtr Drives::restrictions() const
0580 {
0581     return d->restrictions;
0582 }
0583 
0584 DrivesPtr Drives::fromJSON(const QByteArray &jsonData)
0585 {
0586     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0587     if (document.isNull()) {
0588         return DrivesPtr();
0589     }
0590 
0591     const QVariant data = document.toVariant();
0592     return Private::fromJSON(data.toMap());
0593 }
0594 
0595 DrivesList Drives::fromJSONFeed(const QByteArray &jsonData, FeedData &feedData)
0596 {
0597     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0598     if (document.isNull()) {
0599         return DrivesList();
0600     }
0601 
0602     const QVariant data = document.toVariant();
0603     const QVariantMap map = data.toMap();
0604     if (!map.contains(Drives::Fields::Kind) || map[Drives::Fields::Kind].toString() != ApiKindList) {
0605         return DrivesList();
0606     }
0607 
0608     if (map.contains(Drives::Fields::NextPageToken)) {
0609         feedData.nextPageUrl = DriveService::fetchDrivesUrl();
0610         QUrlQuery query(feedData.nextPageUrl);
0611         query.addQueryItem(Drives::Fields::PageToken, map.value(Drives::Fields::NextPageToken).toString());
0612         feedData.nextPageUrl.setQuery(query);
0613     }
0614 
0615     DrivesList list;
0616     const QVariantList items = map[Drives::Fields::Items].toList();
0617     for (const QVariant &item : items) {
0618         const DrivesPtr drives = Private::fromJSON(item.toMap());
0619 
0620         if (!drives.isNull()) {
0621             list << drives;
0622         }
0623     }
0624 
0625     return list;
0626 }
0627 
0628 QByteArray Drives::toJSON(const DrivesPtr &drives)
0629 {
0630     QVariantMap drivesMap;
0631     drivesMap[Drives::Fields::Kind] = ApiKind;
0632     if (!drives->id().isEmpty()) {
0633         drivesMap[Drives::Fields::Id] = drives->id();
0634     }
0635     if (!drives->name().isEmpty()) {
0636         drivesMap[Drives::Fields::Name] = drives->name();
0637     }
0638     if (!drives->themeId().isEmpty()) {
0639         drivesMap[Drives::Fields::ThemeId] = drives->themeId();
0640     }
0641     if (!drives->colorRgb().isEmpty()) {
0642         drivesMap[Drives::Fields::ColorRgb] = drives->colorRgb();
0643     }
0644     if (!drives->backgroundImageLink().isEmpty()) {
0645         drivesMap[Drives::Fields::BackgroundImageLink] = drives->backgroundImageLink();
0646     }
0647     if (drives->createdDate().isValid()) {
0648         drivesMap[Drives::Fields::CreatedDate] = drives->createdDate();
0649     }
0650     drivesMap[Drives::Fields::Hidden] = drives->hidden();
0651 
0652     if (drives->restrictions()) {
0653         QVariantMap restrictionsMap;
0654         restrictionsMap[Drives::Restrictions::Fields::AdminManagedRestrictions] = drives->restrictions()->adminManagedRestrictions();
0655         restrictionsMap[Drives::Restrictions::Fields::CopyRequiresWriterPermission] = drives->restrictions()->copyRequiresWriterPermission();
0656         restrictionsMap[Drives::Restrictions::Fields::DomainUsersOnly] = drives->restrictions()->domainUsersOnly();
0657         restrictionsMap[Drives::Restrictions::Fields::DriveMembersOnly] = drives->restrictions()->driveMembersOnly();
0658         drivesMap[Drives::Fields::Restrictions] = restrictionsMap;
0659     }
0660 
0661     if (drives->backgroundImageFile()) {
0662         QVariantMap backgroundImageFileMap;
0663         backgroundImageFileMap[Drives::BackgroundImageFile::Fields::Id] = drives->backgroundImageFile()->id();
0664         backgroundImageFileMap[Drives::BackgroundImageFile::Fields::XCoordinate] = drives->backgroundImageFile()->xCoordinate();
0665         backgroundImageFileMap[Drives::BackgroundImageFile::Fields::YCoordinate] = drives->backgroundImageFile()->yCoordinate();
0666         backgroundImageFileMap[Drives::BackgroundImageFile::Fields::Width] = drives->backgroundImageFile()->width();
0667         drivesMap[Drives::Fields::BackgroundImageFile] = backgroundImageFileMap;
0668     }
0669 
0670     if (drives->capabilities()) {
0671         QVariantMap capabilitiesMap;
0672         capabilitiesMap[Drives::Capabilities::Fields::CanAddChildren] = drives->capabilities()->canAddChildren();
0673         capabilitiesMap[Drives::Capabilities::Fields::CanChangeCopyRequiresWriterPermissionRestriction] =
0674             drives->capabilities()->canChangeCopyRequiresWriterPermissionRestriction();
0675         capabilitiesMap[Drives::Capabilities::Fields::CanChangeDomainUsersOnlyRestriction] = drives->capabilities()->canChangeDomainUsersOnlyRestriction();
0676         capabilitiesMap[Drives::Capabilities::Fields::CanChangeDriveBackground] = drives->capabilities()->canChangeDriveBackground();
0677         capabilitiesMap[Drives::Capabilities::Fields::CanChangeDriveMembersOnlyRestriction] = drives->capabilities()->canChangeDriveMembersOnlyRestriction();
0678         capabilitiesMap[Drives::Capabilities::Fields::CanComment] = drives->capabilities()->canComment();
0679         capabilitiesMap[Drives::Capabilities::Fields::CanCopy] = drives->capabilities()->canCopy();
0680         capabilitiesMap[Drives::Capabilities::Fields::CanDeleteChildren] = drives->capabilities()->canDeleteChildren();
0681         capabilitiesMap[Drives::Capabilities::Fields::CanDeleteDrive] = drives->capabilities()->canDeleteDrive();
0682         capabilitiesMap[Drives::Capabilities::Fields::CanDownload] = drives->capabilities()->canDownload();
0683         capabilitiesMap[Drives::Capabilities::Fields::CanEdit] = drives->capabilities()->canEdit();
0684         capabilitiesMap[Drives::Capabilities::Fields::CanListChildren] = drives->capabilities()->canListChildren();
0685         capabilitiesMap[Drives::Capabilities::Fields::CanManageMembers] = drives->capabilities()->canManageMembers();
0686         capabilitiesMap[Drives::Capabilities::Fields::CanReadRevisions] = drives->capabilities()->canReadRevisions();
0687         capabilitiesMap[Drives::Capabilities::Fields::CanRename] = drives->capabilities()->canRename();
0688         capabilitiesMap[Drives::Capabilities::Fields::CanRenameDrive] = drives->capabilities()->canRenameDrive();
0689         capabilitiesMap[Drives::Capabilities::Fields::CanShare] = drives->capabilities()->canShare();
0690         capabilitiesMap[Drives::Capabilities::Fields::CanTrashChildren] = drives->capabilities()->canTrashChildren();
0691         drivesMap[Drives::Fields::Capabilities] = capabilitiesMap;
0692     }
0693 
0694     QJsonDocument document = QJsonDocument::fromVariant(drivesMap);
0695     return document.toJson(QJsonDocument::Compact);
0696 }