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 }