File indexing completed on 2024-05-12 04:42:36
0001 /* 0002 SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "hafasparser.h" 0008 #include "hafasbackend.h" 0009 #include "logging.h" 0010 #include "uic/uicstationcode.h" 0011 0012 #include <KPublicTransport/Location> 0013 0014 using namespace KPublicTransport; 0015 0016 HafasParser::HafasParser() = default; 0017 HafasParser::~HafasParser() = default; 0018 0019 void HafasParser::setLocationIdentifierTypes(const QString &idType, const QString &standardIdType) 0020 { 0021 m_locationIdentifierType = idType; 0022 m_standardLocationIdentifierType = standardIdType; 0023 } 0024 0025 void HafasParser::setLineModeMap(std::span<HafasLineModeMapEntry> modeMap) 0026 { 0027 m_lineModeMap = modeMap; 0028 } 0029 0030 Reply::Error HafasParser::error() const 0031 { 0032 return m_error; 0033 } 0034 0035 QString HafasParser::errorMessage() const 0036 { 0037 return m_errorMsg; 0038 } 0039 0040 void HafasParser::clearErrorState() 0041 { 0042 m_error = Reply::NoError; 0043 m_errorMsg.clear(); 0044 } 0045 0046 Line::Mode HafasParser::parseLineMode(const QString &modeId) const 0047 { 0048 bool ok = false; 0049 const auto modeNum = modeId.toInt(&ok); 0050 if (!ok) { 0051 return Line::Unknown; 0052 } 0053 return parseLineMode(modeNum); 0054 } 0055 0056 Line::Mode HafasParser::parseLineMode(const QStringView &modeId) const 0057 { 0058 bool ok = false; 0059 const auto modeNum = modeId.toInt(&ok); 0060 if (!ok) { 0061 return Line::Unknown; 0062 } 0063 return parseLineMode(modeNum); 0064 } 0065 0066 Line::Mode HafasParser::parseLineMode(int modeId) const 0067 { 0068 const auto lineModeIt = std::lower_bound(m_lineModeMap.begin(), m_lineModeMap.end(), modeId, [](const auto &lhs, int rhs) { return lhs.productClass < rhs; }); 0069 if (lineModeIt != m_lineModeMap.end() && (*lineModeIt).productClass == modeId) { 0070 return (*lineModeIt).mode; 0071 } 0072 qCDebug(Log) << "Encountered unknown line type:" << modeId; 0073 return Line::Unknown; 0074 } 0075 0076 void HafasParser::setLocationIdentifier(Location &loc, const QString &id) const 0077 { 0078 if (id.isEmpty()) { 0079 return; 0080 } 0081 if (!m_standardLocationIdentifierType.isEmpty() && UicStationCode::isValid(id, m_uicCountryCodes)) { 0082 loc.setIdentifier(m_standardLocationIdentifierType, id.right(7)); 0083 } 0084 loc.setIdentifier(m_locationIdentifierType, id); 0085 } 0086 0087 void HafasParser::setStandardLocationIdentfierCountries(std::vector<uint8_t> &&uicCountryCodes) 0088 { 0089 m_uicCountryCodes = std::move(uicCountryCodes); 0090 }