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 }