File indexing completed on 2024-05-12 04:42:42

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "backend.h"
0008 #include "backend_p.h"
0009 #include "backends/abstractbackend.h"
0010 #include "datatypes_p.h"
0011 #include "json_p.h"
0012 
0013 #include <QJsonObject>
0014 
0015 using namespace Qt::Literals::StringLiterals;
0016 using namespace KPublicTransport;
0017 
0018 KPUBLICTRANSPORT_MAKE_GADGET(Backend)
0019 
0020 QString Backend::identifier() const
0021 {
0022     return d->m_backendImpl ? d->m_backendImpl->backendId() : QString();
0023 }
0024 
0025 QString Backend::name() const
0026 {
0027     return d->name;
0028 }
0029 
0030 QString Backend::description() const
0031 {
0032     return d->description;
0033 }
0034 
0035 bool Backend::isSecure() const
0036 {
0037     return d->m_backendImpl && d->m_backendImpl->hasCapability(AbstractBackend::Secure);
0038 }
0039 
0040 CoverageArea Backend::coverageArea(CoverageArea::Type coverageType) const
0041 {
0042     return d->coverage[coverageType];
0043 }
0044 
0045 const AbstractBackend* BackendPrivate::impl(const Backend &b)
0046 {
0047     return b.d->m_backendImpl.get();
0048 }
0049 
0050 void BackendPrivate::setImpl(Backend &b, std::unique_ptr<AbstractBackend> &&impl)
0051 {
0052     b.d->m_backendImpl = std::move(impl);
0053 }
0054 
0055 struct {
0056     const char *name;
0057     CoverageArea::Type type;
0058 } static constexpr const coverage_area_map[] = {
0059     { "realtimeCoverage", CoverageArea::Realtime },
0060     { "regularCoverage", CoverageArea::Regular },
0061     { "anyCoverage", CoverageArea::Any },
0062 };
0063 
0064 Backend BackendPrivate::fromJson(const QJsonObject &obj)
0065 {
0066     Backend b;
0067     const auto jsonMetaData = obj.value(QLatin1String("KPlugin")).toObject();
0068     b.d->name = Json::translatedValue(jsonMetaData, QStringLiteral("Name"));
0069     b.d->description = Json::translatedValue(jsonMetaData, QStringLiteral("Description"));
0070 
0071     // untranslated files for development purposes only
0072     if (b.d->name.isEmpty() && b.d->description.isEmpty()) [[unlikely]] {
0073         b.d->name = obj.value("name"_L1).toString();
0074         b.d->description = obj.value("description"_L1).toString();
0075     }
0076 
0077     const auto coverage = obj.value(QLatin1String("coverage")).toObject();
0078     for (const auto &c : coverage_area_map) {
0079         const auto covObj = coverage.value(QLatin1String(c.name)).toObject();
0080         if (covObj.empty()) {
0081             continue;
0082         }
0083         b.d->coverage[c.type] = CoverageArea::fromJson(covObj);
0084         b.d->coverage[c.type].setType(c.type);
0085     }
0086 
0087     return b;
0088 }
0089 
0090 #include "moc_backend.cpp"