KItinerary

dosipasdocumentprocessor.cpp
1/*
2 SPDX-FileCopyrightText: 2025 Volker Krause <vkrause@kde.org>
3 SPDX-License-Identifier: LGPL-2.0-or-later
4*/
5
6#include "dosipasdocumentprocessor.h"
7
8#include "variantvisitor_p.h"
9
10#include "era/dosipas1.h"
11#include "era/dosipas2.h"
12#include "era/fcbextractor_p.h"
13
14#include <KItinerary/ExtractorResult>
15#include <KItinerary/Ticket>
16
17using namespace Qt::Literals;
18using namespace KItinerary;
19
20bool DosipasDocumentProcessor::canHandleData(const QByteArray &encodedData, [[maybe_unused]] QStringView fileName) const
21{
22 return encodedData.startsWith("\x01Uc") || encodedData.startsWith("\x01Ue")
23 || encodedData.startsWith("\x81Uc") || encodedData.startsWith("\x81Ue");
24}
25
27{
29 if (auto container = Dosipas::v2::UicBarcodeHeader(encodedData); container.isValid()) {
30 node.setContent(container);
31 } else if (auto container = Dosipas::v1::UicBarcodeHeader(encodedData); container.isValid()) {
32 node.setContent(container);
33 }
34 return node;
35}
36
37void DosipasDocumentProcessor::preExtract(ExtractorDocumentNode &node, [[maybe_unused]] const ExtractorEngine *engine) const
38{
39 Ticket ticket;
40 const auto rawData = VariantVisitor([](auto &&dosipas) {
41 return dosipas.rawData();
42 }).visit<Dosipas::v1::UicBarcodeHeader, Dosipas::v2::UicBarcodeHeader>(node.content());
43 ticket.setTicketToken("aztecbin:"_L1 + QString::fromLatin1(rawData.toBase64()));
44
45 const auto fcb = VariantVisitor([](auto &&dosipas) -> std::optional<Fcb::UicRailTicketData> {
46 for (const auto &payload : dosipas.level2SignedData.level1Data.dataSequence) {
47 if (auto fcb = payload.fcb(); fcb) {
48 return fcb;
49 }
50 }
51 return std::nullopt;
52 }).visit<Dosipas::v1::UicBarcodeHeader, Dosipas::v2::UicBarcodeHeader>(node.content());
53
54 if (!fcb) {
55 node.addResult(QList<QVariant>({ticket}));
56 return;
57 }
58
59 QList<QVariant> results;
60 std::visit([&results, &fcb, ticket](auto &&fcbV) {
61 // TODO IRT/RES/NRT documents
62 for (const auto &doc : fcbV.transportDocument) {
63 FcbExtractor::extractCustomerCard(doc.ticket, *fcb, ticket, results);
64 }
65 }, *fcb);
66
67 if (!results.isEmpty()) {
68 node.addResult(results);
69 return;
70 }
71
72 ticket.setName(FcbExtractor::ticketName(*fcb));
73 Seat seat;
74 seat.setSeatingType(FcbExtractor::seatingType(*fcb));
75 ticket.setTicketedSeat(seat);
76 ticket.setIssuedBy(FcbExtractor::issuer(*fcb));
77 ticket.setTicketNumber(FcbExtractor::pnr(*fcb));
78 ticket.setUnderName(FcbExtractor::person(*fcb));
79 ticket.setValidFrom(FcbExtractor::validFrom(*fcb));
80 ticket.setValidUntil(FcbExtractor::validUntil(*fcb));
81 FcbExtractor::applyPrice(ticket, *fcb);
82
83 node.addResult(QList<QVariant>({ticket}));
84}
ExtractorDocumentNode createNodeFromData(const QByteArray &encodedData) const override
Create a document node from raw data.
void preExtract(ExtractorDocumentNode &node, const ExtractorEngine *engine) const override
Called before extractors are applied to node.
bool canHandleData(const QByteArray &encodedData, QStringView fileName) const override
Fast check whether the given encoded data can possibly be processed by this instance.
A node in the extracted document object tree.
QJSValue content
The decoded content of this node.
void addResult(ExtractorResult &&result)
Add additional results from an extraction step.
void setContent(const QVariant &content)
Set decoded content.
Semantic data extraction engine.
A reserved seat.
Definition ticket.h:23
A booked ticket.
Definition ticket.h:41
Classes for reservation/travel data models, data extraction and data augmentation.
Definition berelement.h:17
bool startsWith(QByteArrayView bv) const const
bool isEmpty() const const
QString fromLatin1(QByteArrayView str)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Mar 28 2025 11:59:50 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.