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 "app.h"
0008 #include "utils_p.h"
0009 
0010 #include <QJsonDocument>
0011 #include <QVariantMap>
0012 
0013 using namespace KGAPI2;
0014 using namespace KGAPI2::Drive;
0015 
0016 class Q_DECL_HIDDEN App::Icon::Private
0017 {
0018 public:
0019     Private();
0020     Private(const Private &other);
0021 
0022     Category category;
0023     int size = -1;
0024     QUrl iconUrl;
0025 
0026     static Category categoryFromName(const QString &categoryName);
0027 };
0028 
0029 App::Icon::Private::Private()
0030 {
0031 }
0032 
0033 App::Icon::Private::Private(const Private &other)
0034     : category(other.category)
0035     , size(other.size)
0036     , iconUrl(other.iconUrl)
0037 {
0038 }
0039 
0040 App::Icon::Category App::Icon::Private::categoryFromName(const QString &categoryName)
0041 {
0042     if (categoryName == QLatin1StringView("application")) {
0043         return App::Icon::ApplicationCategory;
0044     } else if (categoryName == QLatin1StringView("document")) {
0045         return App::Icon::DocumentCategory;
0046     } else if (categoryName == QLatin1StringView("documentShared")) {
0047         return App::Icon::DocumentSharedCategory;
0048     } else {
0049         return App::Icon::UndefinedCategory;
0050     }
0051 }
0052 
0053 App::Icon::Icon()
0054     : d(new Private)
0055 {
0056 }
0057 
0058 App::Icon::Icon(const App::Icon &other)
0059     : d(new Private(*(other.d)))
0060 {
0061 }
0062 
0063 App::Icon::~Icon()
0064 {
0065     delete d;
0066 }
0067 
0068 bool App::Icon::operator==(const Icon &other) const
0069 {
0070     GAPI_COMPARE(category)
0071     GAPI_COMPARE(size)
0072     GAPI_COMPARE(iconUrl)
0073     return true;
0074 }
0075 
0076 App::Icon::Category App::Icon::category() const
0077 {
0078     return d->category;
0079 }
0080 
0081 int App::Icon::size() const
0082 {
0083     return d->size;
0084 }
0085 
0086 QUrl App::Icon::iconUrl() const
0087 {
0088     return d->iconUrl;
0089 }
0090 
0091 ///// DriveApp
0092 
0093 class Q_DECL_HIDDEN App::Private
0094 {
0095 public:
0096     Private();
0097     Private(const Private &other);
0098 
0099     QString id;
0100     QString name;
0101     QString objectType;
0102     bool supportsCreate;
0103     bool supportsImport;
0104     bool installed;
0105     bool authorized;
0106     bool useByDefault;
0107     QUrl productUrl;
0108     QStringList primaryMimeTypes;
0109     QStringList secondaryMimeTypes;
0110     QStringList primaryFileExtensions;
0111     QStringList secondaryFileExtensions;
0112     IconsList icons;
0113 
0114     static AppPtr fromJSON(const QVariantMap &map);
0115 };
0116 
0117 App::Private::Private()
0118     : supportsCreate(false)
0119     , supportsImport(false)
0120     , installed(false)
0121     , authorized(false)
0122     , useByDefault(false)
0123 {
0124 }
0125 
0126 App::Private::Private(const App::Private &other)
0127     : id(other.id)
0128     , name(other.name)
0129     , objectType(other.objectType)
0130     , supportsCreate(other.supportsCreate)
0131     , supportsImport(other.supportsImport)
0132     , installed(other.installed)
0133     , authorized(other.authorized)
0134     , useByDefault(other.useByDefault)
0135     , productUrl(other.productUrl)
0136     , primaryMimeTypes(other.primaryMimeTypes)
0137     , secondaryMimeTypes(other.secondaryMimeTypes)
0138     , primaryFileExtensions(other.primaryFileExtensions)
0139     , secondaryFileExtensions(other.secondaryFileExtensions)
0140     , icons(other.icons)
0141 {
0142 }
0143 
0144 AppPtr App::Private::fromJSON(const QVariantMap &map)
0145 {
0146     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#app")) {
0147         return AppPtr();
0148     }
0149 
0150     AppPtr app(new App);
0151     app->setEtag(map[QStringLiteral("etag")].toString());
0152     app->d->id = map[QStringLiteral("id")].toString();
0153     app->d->name = map[QStringLiteral("map")].toString();
0154     app->d->objectType = map[QStringLiteral("objectType")].toString();
0155     app->d->supportsCreate = map[QStringLiteral("supportsCreate")].toBool();
0156     app->d->supportsImport = map[QStringLiteral("supportsImport")].toBool();
0157     app->d->installed = map[QStringLiteral("installed")].toBool();
0158     app->d->authorized = map[QStringLiteral("authorized")].toBool();
0159     app->d->useByDefault = map[QStringLiteral("useByDefault")].toBool();
0160     app->d->productUrl = map[QStringLiteral("productUrl")].toUrl();
0161     app->d->primaryMimeTypes = map[QStringLiteral("primaryMimeTypes")].toStringList();
0162     app->d->secondaryMimeTypes = map[QStringLiteral("secondaryMimeTypes")].toStringList();
0163     app->d->primaryFileExtensions = map[QStringLiteral("primaryFileExtensions")].toStringList();
0164     app->d->secondaryFileExtensions = map[QStringLiteral("secondaryFileExtensions")].toStringList();
0165 
0166     const QVariantList icons = map[QStringLiteral("icons")].toList();
0167     for (const QVariant &i : icons) {
0168         const QVariantMap &iconData = i.toMap();
0169 
0170         IconPtr icon(new Icon());
0171         icon->d->category = Icon::Private::categoryFromName(iconData[QStringLiteral("category")].toString());
0172         icon->d->size = iconData[QStringLiteral("size")].toInt();
0173         icon->d->iconUrl = iconData[QStringLiteral("iconUrl")].toUrl();
0174 
0175         app->d->icons << icon;
0176     }
0177 
0178     return app;
0179 }
0180 
0181 App::App()
0182     : KGAPI2::Object()
0183     , d(new Private)
0184 {
0185 }
0186 
0187 App::App(const App &other)
0188     : KGAPI2::Object(other)
0189     , d(new Private(*(other.d)))
0190 {
0191 }
0192 
0193 App::~App()
0194 {
0195     delete d;
0196 }
0197 
0198 bool App::operator==(const App &other) const
0199 {
0200     if (!Object::operator==(other)) {
0201         return false;
0202     }
0203 
0204     GAPI_COMPARE(id)
0205     GAPI_COMPARE(name)
0206     GAPI_COMPARE(objectType)
0207     GAPI_COMPARE(supportsCreate)
0208     GAPI_COMPARE(supportsImport)
0209     GAPI_COMPARE(installed)
0210     GAPI_COMPARE(authorized)
0211     GAPI_COMPARE(useByDefault)
0212     GAPI_COMPARE(productUrl)
0213     GAPI_COMPARE(primaryMimeTypes)
0214     GAPI_COMPARE(secondaryMimeTypes)
0215     GAPI_COMPARE(primaryFileExtensions)
0216     GAPI_COMPARE(secondaryFileExtensions)
0217     GAPI_COMPARE_CONTAINERS(icons)
0218     return true;
0219 }
0220 
0221 QString App::id() const
0222 {
0223     return d->id;
0224 }
0225 
0226 QString App::name() const
0227 {
0228     return d->name;
0229 }
0230 
0231 QString App::objectType() const
0232 {
0233     return d->objectType;
0234 }
0235 
0236 bool App::supportsCreate() const
0237 {
0238     return d->supportsCreate;
0239 }
0240 
0241 bool App::supportsImport() const
0242 {
0243     return d->supportsImport;
0244 }
0245 
0246 bool App::installed() const
0247 {
0248     return d->installed;
0249 }
0250 
0251 bool App::authorized() const
0252 {
0253     return d->authorized;
0254 }
0255 
0256 bool App::useByDefault() const
0257 {
0258     return d->useByDefault;
0259 }
0260 
0261 QUrl App::productUrl() const
0262 {
0263     return d->productUrl;
0264 }
0265 
0266 QStringList App::primaryMimeTypes() const
0267 {
0268     return d->primaryMimeTypes;
0269 }
0270 
0271 QStringList App::secondaryMimeTypes() const
0272 {
0273     return d->secondaryMimeTypes;
0274 }
0275 
0276 QStringList App::primaryFileExtensions() const
0277 {
0278     return d->primaryFileExtensions;
0279 }
0280 
0281 QStringList App::secondaryFileExtensions() const
0282 {
0283     return d->secondaryFileExtensions;
0284 }
0285 
0286 App::IconsList App::icons() const
0287 {
0288     return d->icons;
0289 }
0290 
0291 AppPtr App::fromJSON(const QByteArray &jsonData)
0292 {
0293     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0294     if (document.isNull()) {
0295         return AppPtr();
0296     }
0297     const QVariant data = document.toVariant();
0298     return Private::fromJSON(data.toMap());
0299 }
0300 
0301 AppsList App::fromJSONFeed(const QByteArray &jsonData)
0302 {
0303     QJsonDocument document = QJsonDocument::fromJson(jsonData);
0304     if (document.isNull()) {
0305         return AppsList();
0306     }
0307     const QVariant data = document.toVariant();
0308     const QVariantMap map = data.toMap();
0309     if (!map.contains(QLatin1StringView("kind")) || map[QStringLiteral("kind")].toString() != QLatin1StringView("drive#appList")) {
0310         return AppsList();
0311     }
0312 
0313     AppsList list;
0314     const QVariantList items = map[QStringLiteral("items")].toList();
0315     for (const QVariant &item : items) {
0316         const AppPtr app = Private::fromJSON(item.toMap());
0317 
0318         if (!app.isNull()) {
0319             list << app;
0320         }
0321     }
0322 
0323     return list;
0324 }