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

0001 /*
0002  *  SPDX-FileCopyrightText: 2021 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "KoResourceLoadResult.h"
0007 
0008 #include <boost/variant.hpp>
0009 
0010 #include <KoResource.h>
0011 
0012 struct KoResourceLoadResult::Private
0013 {
0014     // XXX: this should take a monostate for null resources
0015     boost::variant<KoResourceSP, KoEmbeddedResource, KoResourceSignature> value;
0016 };
0017 
0018 KoResourceLoadResult::KoResourceLoadResult(KoResourceSP resource)
0019     : m_d(new Private)
0020 {
0021     m_d->value = resource;
0022 }
0023 
0024 KoResourceLoadResult::KoResourceLoadResult(KoEmbeddedResource embeddedResource)
0025     : m_d(new Private)
0026 {
0027     m_d->value = embeddedResource;
0028 }
0029 
0030 KoResourceLoadResult::KoResourceLoadResult(KoResourceSignature signature)
0031     : m_d(new Private)
0032 {
0033     m_d->value = signature;
0034 }
0035 
0036 KoResourceLoadResult::KoResourceLoadResult(const KoResourceLoadResult &rhs)
0037     : m_d(new Private(*rhs.m_d))
0038 {
0039 }
0040 
0041 KoResourceLoadResult &KoResourceLoadResult::operator=(const KoResourceLoadResult &rhs)
0042 {
0043     m_d->value = rhs.m_d->value;
0044     return *this;
0045 }
0046 
0047 KoResourceLoadResult::~KoResourceLoadResult()
0048 {
0049 }
0050 
0051 KoResourceSP KoResourceLoadResult::resource() const
0052 {
0053     return m_d->value.which() == 0 ? boost::get<KoResourceSP>(m_d->value) : KoResourceSP();
0054 }
0055 
0056 KoEmbeddedResource KoResourceLoadResult::embeddedResource() const
0057 {
0058     return m_d->value.which() == 1 ? boost::get<KoEmbeddedResource>(m_d->value) : KoEmbeddedResource();
0059 }
0060 
0061 KoResourceSignature KoResourceLoadResult::signature() const
0062 {
0063     class SignatureVisitor : public boost::static_visitor<KoResourceSignature>
0064     {
0065     public:
0066         KoResourceSignature operator()(KoResourceSP resource) const
0067         {
0068             return resource->signature();
0069         }
0070 
0071         KoResourceSignature operator()(const KoEmbeddedResource &embeddedResource) const
0072         {
0073             return embeddedResource.signature();
0074         }
0075 
0076         KoResourceSignature operator()(const KoResourceSignature &signature) const
0077         {
0078             return signature;
0079         }
0080     };
0081 
0082     return boost::apply_visitor(SignatureVisitor(), m_d->value);
0083 }
0084 
0085 KoResourceLoadResult::Type KoResourceLoadResult::type() const
0086 {
0087     Type result = FailedLink;
0088 
0089     switch (m_d->value.which())
0090     {
0091     case 0:
0092         result = ExistingResource;
0093         break;
0094     case 1:
0095         result = EmbeddedResource;
0096         break;
0097     default:
0098         result = FailedLink;
0099     }
0100 
0101     return result;
0102 }