1 /* 2 SPDX-FileCopyrightText: 2012 Miha Čančula <miha@noughmad.eu> 3 4 SPDX-License-Identifier: LGPL-2.0-or-later 5 */ 6 7 #include "archivetemplateloader.h" 8 9 #include <grantlee/engine.h> 10 11 #include <KArchive> 12 13 using namespace KDevelop; 14 15 class KDevelop::ArchiveTemplateLoaderPrivate 16 { 17 public: 18 QList<ArchiveTemplateLocation*> locations; 19 }; 20 self()21ArchiveTemplateLoader* ArchiveTemplateLoader::self() 22 { 23 static auto* loader = new ArchiveTemplateLoader; 24 return loader; 25 } 26 ArchiveTemplateLoader()27ArchiveTemplateLoader::ArchiveTemplateLoader() 28 : d_ptr(new ArchiveTemplateLoaderPrivate) 29 { 30 } 31 32 ArchiveTemplateLoader::~ArchiveTemplateLoader() = default; 33 addLocation(ArchiveTemplateLocation * location)34void ArchiveTemplateLoader::addLocation(ArchiveTemplateLocation* location) 35 { 36 Q_D(ArchiveTemplateLoader); 37 38 d->locations.append(location); 39 } 40 removeLocation(ArchiveTemplateLocation * location)41void ArchiveTemplateLoader::removeLocation(ArchiveTemplateLocation* location) 42 { 43 Q_D(ArchiveTemplateLoader); 44 45 d->locations.removeOne(location); 46 } 47 canLoadTemplate(const QString & name) const48bool ArchiveTemplateLoader::canLoadTemplate(const QString& name) const 49 { 50 Q_D(const ArchiveTemplateLoader); 51 52 return std::any_of(d->locations.constBegin(), d->locations.constEnd(), [&](ArchiveTemplateLocation* location) { 53 return (location->hasTemplate(name)); 54 }); 55 } 56 loadByName(const QString & name,const Grantlee::Engine * engine) const57Grantlee::Template ArchiveTemplateLoader::loadByName(const QString& name, const Grantlee::Engine* engine) const 58 { 59 Q_D(const ArchiveTemplateLoader); 60 61 for (ArchiveTemplateLocation* location : qAsConst(d->locations)) { 62 if (location->hasTemplate(name)) { 63 return engine->newTemplate(location->templateContents(name), name); 64 } 65 } 66 67 return Grantlee::Template(); 68 } 69 getMediaUri(const QString & fileName) const70QPair<QString, QString> ArchiveTemplateLoader::getMediaUri(const QString& fileName) const 71 { 72 Q_UNUSED(fileName); 73 return QPair<QString, QString>(); 74 } 75 ArchiveTemplateLocation(const KArchiveDirectory * directory)76ArchiveTemplateLocation::ArchiveTemplateLocation(const KArchiveDirectory* directory) 77 : m_directory(directory) 78 { 79 ArchiveTemplateLoader::self()->addLocation(this); 80 } 81 ~ArchiveTemplateLocation()82ArchiveTemplateLocation::~ArchiveTemplateLocation() 83 { 84 ArchiveTemplateLoader::self()->removeLocation(this); 85 } 86 hasTemplate(const QString & name) const87bool ArchiveTemplateLocation::hasTemplate(const QString& name) const 88 { 89 return m_directory->entry(name) && m_directory->entry(name)->isFile(); 90 } 91 templateContents(const QString & name) const92QString ArchiveTemplateLocation::templateContents(const QString& name) const 93 { 94 const auto* file = dynamic_cast<const KArchiveFile*>(m_directory->entry(name)); 95 Q_ASSERT(file); 96 return QString::fromUtf8(file->data()); 97 } 98