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

0001 /*
0002  *  SPDX-FileCopyrightText: 2020 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisRequiredResourcesOperators.h"
0008 
0009 #include <QApplication>
0010 #include <QBuffer>
0011 #include <QThread>
0012 #include <KisLocalStrokeResources.h>
0013 #include <KisResourceLoaderRegistry.h>
0014 #include <KisMimeDatabase.h>
0015 
0016 
0017 bool KisRequiredResourcesOperators::detail::isLocalResourcesStorage(KisResourcesInterfaceSP resourcesInterface)
0018 {
0019     return resourcesInterface.dynamicCast<KisLocalStrokeResources>();
0020 }
0021 
0022 void KisRequiredResourcesOperators::detail::assertInGuiThread()
0023 {
0024     KIS_SAFE_ASSERT_RECOVER_RETURN(QThread::currentThread() == qApp->thread());
0025 }
0026 
0027 KisResourcesInterfaceSP KisRequiredResourcesOperators::detail::createLocalResourcesStorage(const QList<KoResourceSP> &resources)
0028 {
0029     return QSharedPointer<KisLocalStrokeResources>::create(resources);
0030 }
0031 
0032 void KisRequiredResourcesOperators::detail::addResourceOrWarnIfNotLoaded(KoResourceLoadResult loadedResource, QList<KoResourceSP> *resources, KisResourcesInterfaceSP resourcesInterface)
0033 {
0034     switch (loadedResource.type()) {
0035     case KoResourceLoadResult::ExistingResource:
0036         KIS_SAFE_ASSERT_RECOVER(loadedResource.resource())
0037         {
0038             // XXX: remove once KoResourceLoadResult takes std::monostate
0039             qWarning() << "Attempt to retrieve a resource that is null";
0040             return;
0041         }
0042         *resources << loadedResource.resource();
0043         break;
0044     case KoResourceLoadResult::EmbeddedResource: {
0045         /**
0046          * Some resources, like filter configurations may be assigned to the
0047          * layers without being loaded to the resource system. In such a case,
0048          * the embedded resources will be loaded here, when we make a snapshot.
0049          */
0050 
0051         const KoEmbeddedResource embeddedResource = loadedResource.embeddedResource();
0052         const KoResourceSignature sig = embeddedResource.signature();
0053 
0054         KisResourceLoaderBase *loader = KisResourceLoaderRegistry::instance()->loader(sig.type, KisMimeDatabase::mimeTypeForFile(sig.filename));
0055 
0056         if (!loader) {
0057             qWarning() << "createLocalResourcesSnapshot: Could not create a loader for resource" << sig;
0058             return;
0059         }
0060 
0061         QByteArray ba = embeddedResource.data();
0062         QBuffer buf(&ba);
0063         buf.open(QBuffer::ReadOnly);
0064 
0065         KoResourceSP resource = loader->load(sig.filename, buf, resourcesInterface);
0066 
0067         if (resource) {
0068             resource->setMD5Sum(sig.md5sum);
0069             resource->setVersion(0);
0070             resource->setDirty(false);
0071 
0072             *resources << resource;
0073         } else {
0074             qWarning() << "createLocalResourcesSnapshot: Could not import embedded resource" << sig;
0075         }
0076         break;
0077     }
0078     case KoResourceLoadResult::FailedLink:
0079         qWarning() << "createLocalResourcesSnapshot: failed to load a linked resource:" << loadedResource.signature();
0080         break;
0081     }
0082 }