File indexing completed on 2024-05-12 15:59:50

0001 /*
0002  * SPDX-FileCopyrightText: 2018 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #include "KisResourceLoaderRegistry.h"
0008 
0009 #include <QApplication>
0010 #include <QString>
0011 #include <QDebug>
0012 
0013 #include <KisResourceCacheDb.h>
0014 #include <KisMimeDatabase.h>
0015 
0016 struct KisResourceLoaderRegistry::Private
0017 {
0018     QMap<int, ResourceCacheFixup*> fixups;
0019 };
0020 
0021 KisResourceLoaderRegistry::KisResourceLoaderRegistry(QObject *parent)
0022     : QObject(parent),
0023       m_d(new Private)
0024 {
0025 }
0026 
0027 KisResourceLoaderRegistry::~KisResourceLoaderRegistry()
0028 {
0029     qDeleteAll(values());
0030     qDeleteAll(m_d->fixups);
0031 }
0032 
0033 KisResourceLoaderRegistry* KisResourceLoaderRegistry::instance()
0034 {
0035     KisResourceLoaderRegistry *reg = qApp->findChild<KisResourceLoaderRegistry *>(QString());
0036     if (!reg) {
0037         reg = new KisResourceLoaderRegistry(qApp);
0038     }
0039     return reg;
0040 }
0041 
0042 void KisResourceLoaderRegistry::registerLoader(KisResourceLoaderBase *loader)
0043 {
0044     add(loader);
0045 }
0046 
0047 KisResourceLoaderBase *KisResourceLoaderRegistry::loader(const QString &resourceType, const QString &mimetype) const
0048 {
0049     Q_FOREACH(KisResourceLoaderBase *loader, resourceTypeLoaders(resourceType)) {
0050 
0051         if (loader->mimetypes().contains(mimetype)) {
0052             return loader;
0053         }
0054     }
0055     return 0;
0056 }
0057 
0058 QVector<KisResourceLoaderBase *> KisResourceLoaderRegistry::resourceTypeLoaders(const QString &resourceType) const
0059 {
0060     QVector<KisResourceLoaderBase *> r;
0061     Q_FOREACH(KisResourceLoaderBase *loader, values()) {
0062         if (loader->resourceType() == resourceType) {
0063             r << loader;
0064         }
0065     }
0066     return r;
0067 }
0068 
0069 void KisResourceLoaderRegistry::registerFixup(int priority, ResourceCacheFixup *fixup)
0070 {
0071     m_d->fixups.insert(priority, fixup);
0072 }
0073 
0074 QStringList KisResourceLoaderRegistry::executeAllFixups()
0075 {
0076     QStringList errorMessages;
0077 
0078     Q_FOREACH (ResourceCacheFixup *fixup, m_d->fixups) {
0079         errorMessages << fixup->executeFix();
0080     }
0081 
0082     return errorMessages;
0083 }
0084 
0085 QStringList KisResourceLoaderRegistry::filters(const QString &resourceType) const
0086 {
0087     QStringList r;
0088     Q_FOREACH(KisResourceLoaderBase *loader, resourceTypeLoaders(resourceType)) {
0089         r.append(loader->filters());
0090     }
0091     r.removeDuplicates();
0092     r.sort();
0093     return r;
0094 }
0095 
0096 QStringList KisResourceLoaderRegistry::mimeTypes(const QString &resourceType) const
0097 {
0098     QStringList extensions = KisResourceLoaderRegistry::instance()->filters(resourceType);
0099     QStringList mimeTypes;
0100     Q_FOREACH(const QString &extension, extensions) {
0101         mimeTypes << KisMimeDatabase::mimeTypeForSuffix(extension);
0102     }
0103     mimeTypes.removeDuplicates();
0104     mimeTypes.sort();
0105 
0106     return mimeTypes;
0107 }
0108 
0109 
0110 
0111 QStringList KisResourceLoaderRegistry::resourceTypes() const
0112 {
0113     QStringList r;
0114     Q_FOREACH(KisResourceLoaderBase *loader, values()) {
0115         r << loader->resourceType();
0116     }
0117     r.removeDuplicates();
0118     r.sort();
0119 
0120     return r;
0121 }