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

0001 /*
0002     SPDX-FileCopyrightText: 2018-2023 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include "navitiaphysicalmode.h"
0007 
0008 #include <QUrlQuery>
0009 
0010 #include <cstring>
0011 #include <vector>
0012 
0013 using namespace KPublicTransport;
0014 
0015 struct {
0016     const char *name;
0017     Line::Mode mode;
0018 } static constexpr const navitia_physical_modes[] = {
0019     { "Air", Line::Air },
0020     { "Boat", Line::Boat },
0021     { "Bus", Line::Bus },
0022     { "BusRapidTransit", Line::BusRapidTransit },
0023     { "Coach", Line::Coach },
0024     { "Ferry", Line::Ferry },
0025     { "Funicular", Line::Funicular },
0026     { "LocalTrain", Line::LocalTrain },
0027     { "LongDistanceTrain", Line::LongDistanceTrain },
0028     { "Metro", Line::Metro },
0029     { "RailShuttle", Line::RailShuttle },
0030     { "RapidTransit", Line::RapidTransit },
0031     { "Shuttle", Line::Shuttle },
0032     { "Taxi", Line::Taxi },
0033     { "Train", Line::Train },
0034     { "Tramway", Line::Tramway }
0035 };
0036 
0037 static constexpr const char pm_prefix[] = "physical_mode:";
0038 
0039 Line::Mode NavitiaPhysicalMode::parsePhysicalMode(QStringView mode)
0040 {
0041     if (!mode.startsWith(QLatin1String(pm_prefix))) {
0042         return Line::Unknown;
0043     }
0044     const auto modeStr = mode.mid(14).toLatin1();
0045     for (const auto &m : navitia_physical_modes) {
0046         if (std::strcmp(modeStr.constData(), m.name) == 0) {
0047             return m.mode;
0048         }
0049     }
0050 
0051     return Line::Unknown;
0052 }
0053 
0054 void NavitiaPhysicalMode::lineModesToQuery(const std::vector<Line::Mode> &lineModes, QUrlQuery &query)
0055 {
0056     if (lineModes.empty()) {
0057         return;
0058     }
0059 
0060     // Navitia wants this as exclusion rathe than inclusion list
0061     for (auto &m : navitia_physical_modes) {
0062         // lineModes is guaranteed to be sorted
0063         if (!std::binary_search(lineModes.begin(), lineModes.end(), m.mode)) {
0064             query.addQueryItem(QStringLiteral("forbidden_uris[]"), QLatin1String(pm_prefix) + QLatin1String(m.name));
0065         }
0066     }
0067 }