File indexing completed on 2024-05-05 17:33:03
0001 /* 0002 * SPDX-FileCopyrightText: 2016 Aleix Pol Gonzalez <aleixpol@blue-systems.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #include "FeaturedModel.h" 0008 0009 #include "discover_debug.h" 0010 #include <KConfigGroup> 0011 #include <KIO/StoredTransferJob> 0012 #include <KSharedConfig> 0013 #include <QDir> 0014 #include <QFile> 0015 #include <QJsonArray> 0016 #include <QJsonDocument> 0017 #include <QStandardPaths> 0018 #include <QtGlobal> 0019 0020 #include <resources/ResourcesModel.h> 0021 #include <resources/StoredResultsStream.h> 0022 #include <utils.h> 0023 0024 Q_GLOBAL_STATIC(QString, featuredCache) 0025 0026 static QString featuredFileName() 0027 { 0028 // kwriteconfig5 --file discoverrc --group Software --key FeaturedListingFileName featured-5.9.json 0029 KConfigGroup grp(KSharedConfig::openConfig(), "Software"); 0030 if (grp.hasKey("FeaturedListingFileName")) { 0031 return grp.readEntry("FeaturedListingFileName", QString()); 0032 } 0033 static const bool isMobile = QByteArrayList{"1", "true"}.contains(qgetenv("QT_QUICK_CONTROLS_MOBILE")); 0034 return isMobile ? QLatin1String("featured-mobile-5.9.json") : QLatin1String("featured-5.9.json"); 0035 } 0036 0037 FeaturedModel::FeaturedModel() 0038 { 0039 const QString dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); 0040 QDir().mkpath(dir); 0041 0042 static const QString fileName = featuredFileName(); 0043 *featuredCache = dir + '/' + fileName; 0044 const QUrl featuredUrl(QStringLiteral("https://autoconfig.kde.org/discover/") + fileName); 0045 auto *fetchJob = KIO::storedGet(featuredUrl, KIO::NoReload, KIO::HideProgressInfo); 0046 acquireFetching(true); 0047 connect(fetchJob, &KIO::StoredTransferJob::result, this, [this, fetchJob]() { 0048 const auto dest = qScopeGuard([this] { 0049 acquireFetching(false); 0050 refresh(); 0051 }); 0052 if (fetchJob->error() != 0) 0053 return; 0054 0055 QFile f(*featuredCache); 0056 if (!f.open(QIODevice::WriteOnly)) 0057 qCWarning(DISCOVER_LOG) << "could not open" << *featuredCache << f.errorString(); 0058 f.write(fetchJob->data()); 0059 f.close(); 0060 }); 0061 } 0062 0063 void FeaturedModel::refresh() 0064 { 0065 // usually only useful if launching just fwupd or kns backends 0066 if (!currentApplicationBackend()) 0067 return; 0068 0069 acquireFetching(true); 0070 const auto dest = qScopeGuard([this] { 0071 acquireFetching(false); 0072 }); 0073 QFile f(*featuredCache); 0074 if (!f.open(QIODevice::ReadOnly)) { 0075 qCWarning(DISCOVER_LOG) << "couldn't open file" << *featuredCache << f.errorString(); 0076 return; 0077 } 0078 QJsonParseError error; 0079 const auto array = QJsonDocument::fromJson(f.readAll(), &error).array(); 0080 if (error.error) { 0081 qCWarning(DISCOVER_LOG) << "couldn't parse" << *featuredCache << ". error:" << error.errorString(); 0082 return; 0083 } 0084 0085 const auto uris = kTransform<QVector<QUrl>>(array, [](const QJsonValue &uri) { 0086 return QUrl(uri.toString()); 0087 }); 0088 setUris(uris); 0089 }