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 }