Warning, file /plasma/kdeplasma-addons/applets/comic/engine/cachedprovider.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002  *   SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
0003  *   SPDX-FileCopyrightText: 2022 Alexander Lohnau <alexander.lohnau@gmx.de>
0004  *
0005  *   SPDX-License-Identifier: LGPL-2.0-only
0006  */
0007 
0008 #include "cachedprovider.h"
0009 #include "comic_debug.h"
0010 
0011 #include <QDebug>
0012 #include <QDir>
0013 #include <QFile>
0014 #include <QImage>
0015 #include <QSettings>
0016 #include <QStandardPaths>
0017 #include <QTimer>
0018 #include <QUrl>
0019 
0020 const int CachedProvider::CACHE_DEFAULT = 20;
0021 
0022 static QString identifierToPath(const QString &identifier)
0023 {
0024     const QString dataDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/plasma_engine_comic/");
0025 
0026     return dataDir + QString::fromLatin1(QUrl::toPercentEncoding(identifier));
0027 }
0028 
0029 CachedProvider::CachedProvider(QObject *parent, const KPluginMetaData &data, IdentifierType type, const QString &identifier)
0030     : ComicProvider(parent, data, type, identifier)
0031 {
0032     QTimer::singleShot(0, this, &CachedProvider::triggerFinished);
0033 }
0034 
0035 CachedProvider::~CachedProvider()
0036 {
0037 }
0038 
0039 IdentifierType CachedProvider::identifierType() const
0040 {
0041     return IdentifierType::StringIdentifier;
0042 }
0043 
0044 QImage CachedProvider::image() const
0045 {
0046     if (!QFile::exists(identifierToPath(requestedString()))) {
0047         return QImage();
0048     }
0049 
0050     QImage img;
0051     img.load(identifierToPath(requestedString()), "PNG");
0052 
0053     return img;
0054 }
0055 
0056 QString CachedProvider::identifier() const
0057 {
0058     if (requestedString().lastIndexOf(QLatin1Char(':')) + 1 == requestedString().count()) {
0059         return requestedString() + lastCachedStripIdentifier();
0060     }
0061     return requestedString();
0062 }
0063 
0064 QString CachedProvider::nextIdentifier() const
0065 {
0066     QSettings settings(identifierToPath(requestedString()) + QLatin1String(".conf"), QSettings::IniFormat);
0067     return settings.value(QLatin1String("nextIdentifier"), QString()).toString();
0068 }
0069 
0070 QString CachedProvider::previousIdentifier() const
0071 {
0072     QSettings settings(identifierToPath(requestedString()) + QLatin1String(".conf"), QSettings::IniFormat);
0073     return settings.value(QLatin1String("previousIdentifier"), QString()).toString();
0074 }
0075 
0076 QString CachedProvider::firstStripIdentifier() const
0077 {
0078     QSettings settings(identifierToPath(requestedComicName()) + QLatin1String(".conf"), QSettings::IniFormat);
0079     return settings.value(QLatin1String("firstStripIdentifier"), QString()).toString();
0080 }
0081 
0082 QString CachedProvider::lastCachedStripIdentifier() const
0083 {
0084     QSettings settings(identifierToPath(requestedComicName()) + QLatin1String(".conf"), QSettings::IniFormat);
0085     return settings.value(QLatin1String("lastCachedStripIdentifier"), QString()).toString();
0086 }
0087 
0088 QString CachedProvider::comicAuthor() const
0089 {
0090     QSettings settings(identifierToPath(requestedString()) + QLatin1String(".conf"), QSettings::IniFormat);
0091     return settings.value(QLatin1String("comicAuthor"), QString()).toString();
0092 }
0093 
0094 QString CachedProvider::stripTitle() const
0095 {
0096     QSettings settings(identifierToPath(requestedString()) + QLatin1String(".conf"), QSettings::IniFormat);
0097     return settings.value(QLatin1String("stripTitle"), QString()).toString();
0098 }
0099 
0100 QString CachedProvider::additionalText() const
0101 {
0102     QSettings settings(identifierToPath(requestedString()) + QLatin1String(".conf"), QSettings::IniFormat);
0103     return settings.value(QLatin1String("additionalText"), QString()).toString();
0104 }
0105 
0106 QString CachedProvider::name() const
0107 {
0108     QSettings settings(identifierToPath(requestedComicName()) + QLatin1String(".conf"), QSettings::IniFormat);
0109     return settings.value(QLatin1String("title"), QString()).toString();
0110 }
0111 
0112 void CachedProvider::triggerFinished()
0113 {
0114     Q_EMIT finished(this);
0115 }
0116 
0117 bool CachedProvider::isCached(const QString &identifier)
0118 {
0119     return QFile::exists(identifierToPath(identifier));
0120 }
0121 
0122 bool CachedProvider::storeInCache(const QString &identifier, const QImage &comic, const ComicMetaData &data)
0123 {
0124     const QString path = identifierToPath(identifier);
0125 
0126     int index = identifier.indexOf(QLatin1Char(':'));
0127     const QString comicName = identifier.mid(0, index);
0128     const QString pathMain = identifierToPath(comicName);
0129     const QString dirPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/plasma_engine_comic/");
0130 
0131         QSettings settingsMain(pathMain + QLatin1String(".conf"), QSettings::IniFormat);
0132         settingsMain.setValue(QStringLiteral("firstStripIdentifier"), data.firstStripIdentifier);
0133         settingsMain.setValue(QStringLiteral("title"), data.providerName);
0134         settingsMain.setValue(QStringLiteral("lastCachedStripIdentifier"), data.lastCachedStripIdentifier);
0135         settingsMain.setValue(QStringLiteral("shopUrl"), data.shopUrl);
0136         settingsMain.setValue(QStringLiteral("isLeftToRight"), data.isLeftToRight);
0137         settingsMain.setValue(QStringLiteral("isTopToBottom"), data.isTopToBottom);
0138 
0139         QSettings settings(path + QLatin1String(".conf"), QSettings::IniFormat);
0140         settings.setValue(QStringLiteral("additionalText"), data.additionalText);
0141         settings.setValue(QStringLiteral("comicAuthor"), data.comicAuthor);
0142         settings.setValue(QStringLiteral("imageUrl"), data.imageUrl);
0143         settings.setValue(QStringLiteral("nextIdentifier"), data.nextIdentifier);
0144         settings.setValue(QStringLiteral("previousIdentifier"), data.previousIdentifier);
0145         settings.setValue(QStringLiteral("websiteUrl"), data.websiteUrl);
0146 
0147         QStringList comics;
0148         if (settingsMain.contains(QLatin1String("comics"))) {
0149             comics = settingsMain.value(QLatin1String("comics"), QStringList()).toStringList();
0150         } else {
0151             // existing strips haven't been stored in the conf-file yet, do that now, oldest first, newest last
0152             QDir dir(dirPath);
0153             comics = dir.entryList(QStringList() << QString::fromLatin1(QUrl::toPercentEncoding(comicName + QLatin1Char(':'))) + QLatin1Char('*'),
0154                                    QDir::Files,
0155                                    QDir::Time | QDir::Reversed);
0156             QStringList::iterator it = comics.begin();
0157             while (it != comics.end()) {
0158                 // only count images, not the conf files
0159                 if ((*it).endsWith(QLatin1String(".conf"))) {
0160                     it = comics.erase(it);
0161                 } else {
0162                     ++it;
0163                 }
0164             }
0165         }
0166         comics.append(QString::fromLatin1(QUrl::toPercentEncoding(identifier)));
0167 
0168         const int limit = CachedProvider::maxComicLimit();
0169         // limit is on
0170         if (limit > 0) {
0171             qCDebug(PLASMA_COMIC) << QLatin1String("MaxComicLimit on.");
0172             int comicsToRemove = comics.count() - limit;
0173             QStringList::iterator it = comics.begin();
0174             while (comicsToRemove > 0 && it != comics.end()) {
0175                 qCDebug(PLASMA_COMIC) << QLatin1String("Remove file") << (dirPath + (*it));
0176                 QFile::remove(dirPath + (*it));
0177                 QFile::remove(dirPath + (*it) + QLatin1String(".conf"));
0178                 it = comics.erase(it);
0179                 --comicsToRemove;
0180             }
0181         }
0182         settingsMain.setValue(QLatin1String("comics"), comics);
0183 
0184     return comic.save(path, "PNG");
0185 }
0186 
0187 QUrl CachedProvider::websiteUrl() const
0188 {
0189     QSettings settings(identifierToPath(requestedString()) + QLatin1String(".conf"), QSettings::IniFormat);
0190     return QUrl(settings.value(QLatin1String("websiteUrl")).toUrl());
0191 }
0192 
0193 QUrl CachedProvider::imageUrl() const
0194 {
0195     QSettings settings(identifierToPath(requestedString()) + QLatin1String(".conf"), QSettings::IniFormat);
0196     return QUrl(settings.value(QLatin1String("imageUrl")).toUrl());
0197 }
0198 
0199 QUrl CachedProvider::shopUrl() const
0200 {
0201     QSettings settings(identifierToPath(requestedComicName()) + QLatin1String(".conf"), QSettings::IniFormat);
0202     return QUrl(settings.value(QLatin1String("shopUrl")).toUrl());
0203 }
0204 
0205 bool CachedProvider::isLeftToRight() const
0206 {
0207     QSettings settings(identifierToPath(requestedComicName()) + QLatin1String(".conf"), QSettings::IniFormat);
0208     return settings.value(QLatin1String("isLeftToRight"), true).toBool();
0209 }
0210 
0211 bool CachedProvider::isTopToBottom() const
0212 {
0213     QSettings settings(identifierToPath(requestedComicName()) + QLatin1String(".conf"), QSettings::IniFormat);
0214     return settings.value(QLatin1String("isTopToBottom"), true).toBool();
0215 }
0216 
0217 int CachedProvider::maxComicLimit()
0218 {
0219     QSettings settings(identifierToPath(QLatin1String("comic_settings.conf")), QSettings::IniFormat);
0220     return qMax(settings.value(QLatin1String("maxComics"), CACHE_DEFAULT).toInt(), 0); // old value was -1, thus use qMax
0221 }
0222 
0223 void CachedProvider::setMaxComicLimit(int limit)
0224 {
0225     if (limit < 0) {
0226         qCDebug(PLASMA_COMIC) << "Wrong limit, setting to default.";
0227         limit = CACHE_DEFAULT;
0228     }
0229     QSettings settings(identifierToPath(QLatin1String("comic_settings.conf")), QSettings::IniFormat);
0230     settings.setValue(QLatin1String("maxComics"), limit);
0231 }