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 }