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

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "hafasbackend.h"
0008 #include "logging.h"
0009 
0010 #include <KPublicTransport/Location>
0011 
0012 #include <QJsonObject>
0013 #include <QMetaEnum>
0014 
0015 using namespace KPublicTransport;
0016 
0017 void HafasBackend::setProductsMap(const QJsonArray& array)
0018 {
0019     m_lineModeMap.reserve(array.size());
0020     const auto me = QMetaEnum::fromType<Line::Mode>();
0021     for (const auto &prodV : array) {
0022         const auto prodObj = prodV.toObject();
0023         const auto bitmasks = prodObj.value(QLatin1String("bitmasks")).toArray();
0024         auto mode = static_cast<Line::Mode>(me.keyToValue(prodObj.value(QLatin1String("mode")).toString().toUtf8().constData()));
0025         if (mode == Line::Unknown || mode < 0) {
0026             qCWarning(Log) << "Invalid product mode:" << prodObj;
0027             mode = Line::Unknown;
0028         }
0029         for (const auto &bit : bitmasks) {
0030             m_lineModeMap.push_back({bit.toInt(), mode});
0031         }
0032     }
0033 
0034     std::sort(m_lineModeMap.begin(), m_lineModeMap.end(), [](const auto &lhs, const auto &rhs) {
0035         return lhs.productClass < rhs.productClass;
0036     });
0037 }
0038 
0039 QString HafasBackend::locationIdentifierType() const
0040 {
0041     return m_locationIdentifierType.isEmpty() ? backendId() : m_locationIdentifierType;
0042 }
0043 
0044 QString HafasBackend::standardLocationIdentifierType() const
0045 {
0046     return m_standardLocationIdentifierType;
0047 }
0048 
0049 QString HafasBackend::locationIdentifier(const Location &loc) const
0050 {
0051     const auto id = loc.identifier(locationIdentifierType());
0052     if (!id.isEmpty()) {
0053         return id;
0054     }
0055     return loc.identifier(standardLocationIdentifierType());
0056 }
0057 
0058 void HafasBackend::setStandardLocationIdentifierCountries(const QJsonArray &a)
0059 {
0060     m_uicCountryCodes.reserve(a.size());
0061     std::transform(a.begin(), a.end(), std::back_inserter(m_uicCountryCodes), [](const auto &v) { return v.toInt(); });
0062     std::sort(m_uicCountryCodes.begin(), m_uicCountryCodes.end());
0063 }