File indexing completed on 2024-05-12 04:37:46

0001 /*
0002     SPDX-FileCopyrightText: 2012 Miha Čančula <miha@noughmad.eu>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "archivetemplateloader.h"
0008 
0009 #include <grantlee/engine.h>
0010 
0011 #include <KArchive>
0012 
0013 using namespace KDevelop;
0014 
0015 class KDevelop::ArchiveTemplateLoaderPrivate
0016 {
0017 public:
0018     QList<ArchiveTemplateLocation*> locations;
0019 };
0020 
0021 ArchiveTemplateLoader* ArchiveTemplateLoader::self()
0022 {
0023     static auto* loader = new ArchiveTemplateLoader;
0024     return loader;
0025 }
0026 
0027 ArchiveTemplateLoader::ArchiveTemplateLoader()
0028     : d_ptr(new ArchiveTemplateLoaderPrivate)
0029 {
0030 }
0031 
0032 ArchiveTemplateLoader::~ArchiveTemplateLoader() = default;
0033 
0034 void ArchiveTemplateLoader::addLocation(ArchiveTemplateLocation* location)
0035 {
0036     Q_D(ArchiveTemplateLoader);
0037 
0038     d->locations.append(location);
0039 }
0040 
0041 void ArchiveTemplateLoader::removeLocation(ArchiveTemplateLocation* location)
0042 {
0043     Q_D(ArchiveTemplateLoader);
0044 
0045     d->locations.removeOne(location);
0046 }
0047 
0048 bool ArchiveTemplateLoader::canLoadTemplate(const QString& name) const
0049 {
0050     Q_D(const ArchiveTemplateLoader);
0051 
0052     return std::any_of(d->locations.constBegin(), d->locations.constEnd(), [&](ArchiveTemplateLocation* location) {
0053         return (location->hasTemplate(name));
0054     });
0055 }
0056 
0057 Grantlee::Template ArchiveTemplateLoader::loadByName(const QString& name, const Grantlee::Engine* engine) const
0058 {
0059     Q_D(const ArchiveTemplateLoader);
0060 
0061     for (ArchiveTemplateLocation* location : qAsConst(d->locations)) {
0062         if (location->hasTemplate(name)) {
0063             return engine->newTemplate(location->templateContents(name), name);
0064         }
0065     }
0066 
0067     return Grantlee::Template();
0068 }
0069 
0070 QPair<QString, QString> ArchiveTemplateLoader::getMediaUri(const QString& fileName) const
0071 {
0072     Q_UNUSED(fileName);
0073     return QPair<QString, QString>();
0074 }
0075 
0076 ArchiveTemplateLocation::ArchiveTemplateLocation(const KArchiveDirectory* directory)
0077     : m_directory(directory)
0078 {
0079     ArchiveTemplateLoader::self()->addLocation(this);
0080 }
0081 
0082 ArchiveTemplateLocation::~ArchiveTemplateLocation()
0083 {
0084     ArchiveTemplateLoader::self()->removeLocation(this);
0085 }
0086 
0087 bool ArchiveTemplateLocation::hasTemplate(const QString& name) const
0088 {
0089     return m_directory->entry(name) && m_directory->entry(name)->isFile();
0090 }
0091 
0092 QString ArchiveTemplateLocation::templateContents(const QString& name) const
0093 {
0094     const auto* file = dynamic_cast<const KArchiveFile*>(m_directory->entry(name));
0095     Q_ASSERT(file);
0096     return QString::fromUtf8(file->data());
0097 }