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 }