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()21 ArchiveTemplateLoader* ArchiveTemplateLoader::self()
22 {
23     static auto* loader = new ArchiveTemplateLoader;
24     return loader;
25 }
26 
ArchiveTemplateLoader()27 ArchiveTemplateLoader::ArchiveTemplateLoader()
28     : d_ptr(new ArchiveTemplateLoaderPrivate)
29 {
30 }
31 
32 ArchiveTemplateLoader::~ArchiveTemplateLoader() = default;
33 
addLocation(ArchiveTemplateLocation * location)34 void ArchiveTemplateLoader::addLocation(ArchiveTemplateLocation* location)
35 {
36     Q_D(ArchiveTemplateLoader);
37 
38     d->locations.append(location);
39 }
40 
removeLocation(ArchiveTemplateLocation * location)41 void ArchiveTemplateLoader::removeLocation(ArchiveTemplateLocation* location)
42 {
43     Q_D(ArchiveTemplateLoader);
44 
45     d->locations.removeOne(location);
46 }
47 
canLoadTemplate(const QString & name) const48 bool 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) const57 Grantlee::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) const70 QPair<QString, QString> ArchiveTemplateLoader::getMediaUri(const QString& fileName) const
71 {
72     Q_UNUSED(fileName);
73     return QPair<QString, QString>();
74 }
75 
ArchiveTemplateLocation(const KArchiveDirectory * directory)76 ArchiveTemplateLocation::ArchiveTemplateLocation(const KArchiveDirectory* directory)
77     : m_directory(directory)
78 {
79     ArchiveTemplateLoader::self()->addLocation(this);
80 }
81 
~ArchiveTemplateLocation()82 ArchiveTemplateLocation::~ArchiveTemplateLocation()
83 {
84     ArchiveTemplateLoader::self()->removeLocation(this);
85 }
86 
hasTemplate(const QString & name) const87 bool ArchiveTemplateLocation::hasTemplate(const QString& name) const
88 {
89     return m_directory->entry(name) && m_directory->entry(name)->isFile();
90 }
91 
templateContents(const QString & name) const92 QString 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