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 #ifndef KPUBLICTRANSPORT_EFAXMLPARSER_H
0008 #define KPUBLICTRANSPORT_EFAXMLPARSER_H
0009 
0010 #include "efaparser.h"
0011 
0012 #include <KPublicTransport/Path>
0013 
0014 #include <QPointF>
0015 
0016 class QPolygonF;
0017 
0018 namespace KPublicTransport {
0019 
0020 class ScopedXmlStreamReader;
0021 
0022 /** Parser for full XML responses from EFA services.
0023  *  @internal only exported for unit tests
0024  */
0025 class KPUBLICTRANSPORT_EXPORT EfaXmlParser : public EfaParser
0026 {
0027 public:
0028     std::vector<Location> parseStopFinderResponse(const QByteArray &data) override;
0029     std::vector<Stopover> parseDmResponse(const QByteArray &data) override;
0030     std::vector<Journey> parseTripResponse(const QByteArray &data) override;
0031 
0032 private:
0033     void parseLocationCommon(Location &loc, const ScopedXmlStreamReader &reader) const;
0034     Location parseItdOdvAssignedStop(const ScopedXmlStreamReader &reader) const;
0035     Location parseOdvNameElem(ScopedXmlStreamReader &reader) const;
0036 
0037     Stopover parseDmDeparture(ScopedXmlStreamReader &&reader) const;
0038     void parseTripDeparture(ScopedXmlStreamReader &&reader, JourneySection &section) const;
0039     void parseTripArrival(ScopedXmlStreamReader &&reader, JourneySection &section) const;
0040 
0041     Stopover parsePartialTripIntermediateStop(ScopedXmlStreamReader &&reader) const;
0042     std::vector<Stopover> parsePartialTripStopSequence(ScopedXmlStreamReader &&reader) const;
0043 
0044     std::vector<JourneySection> parseTripPartialRoute(ScopedXmlStreamReader &&reader) const;
0045     Journey parseTripRoute(ScopedXmlStreamReader &&reader) const;
0046     QStringList parseInfoLink(ScopedXmlStreamReader &&reader) const;
0047     QPolygonF parsePathCoordinates(ScopedXmlStreamReader &&reader) const;
0048 
0049     struct PathDescription {
0050         QPointF point;
0051         int fromIndex = -1;
0052         int toIndex = -1;
0053         QString description;
0054         int travelTime = 0;
0055         int niveau = 0;
0056         int niveauDelta = 0;
0057         PathSection::Maneuver maneuver = PathSection::Move;
0058     };
0059 
0060     std::vector<PathDescription> parsePathDescriptionList(ScopedXmlStreamReader &&reader) const;
0061     void resolvePathDescription(std::vector<PathDescription> &descs) const;
0062     Path assemblePath(const std::vector<PathDescription> &descs, const QPolygonF &poly) const;
0063     QHash<QString, QString> parseGenericAttributeList(ScopedXmlStreamReader &&reader) const;
0064 
0065     mutable QHash<QString, Location> m_locations;
0066 };
0067 
0068 }
0069 
0070 #endif // KPUBLICTRANSPORT_EFAXMLPARSER_H