KItinerary

iatabcbpsections.cpp
1/*
2 SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "iatabcbpsections.h"
8#include "iatabcbpconstants_p.h"
9#include "logging.h"
10
11using namespace KItinerary;
12using namespace KItinerary::IataBcbpConstants;
13
14QString IataBcbpSectionBase::readString(int offset, int length) const
15{
16 if (m_data.size() >= offset + length) {
17 return m_data.mid(offset, length).trimmed().toString();
18 }
19 return {};
20}
21
22int IataBcbpSectionBase::readNumericValue(int offset, int length, int base) const
23{
24 if (m_data.size() >= offset + length) {
25 return m_data.mid(offset, length).toInt(nullptr, base);
26 }
27 return 0;
28}
29
30
31IataBcbpUniqueMandatorySection::IataBcbpUniqueMandatorySection(QStringView data)
32{
33 m_data = data;
34}
35
36bool IataBcbpUniqueMandatorySection::isValid() const
37{
38 const auto legCount = numberOfLegs();
39 return legCount >= 1 && legCount <= 4;
40}
41
42IataBcbpUniqueConditionalSection::IataBcbpUniqueConditionalSection(QStringView data)
43{
44 if (data.size() < MinimumUniqueConditionalSize) {
45 return;
46 }
47 m_data = data;
48 m_data = data.left(MinimumUniqueConditionalSize + fieldSize());
49}
50
51bool IataBcbpUniqueConditionalSection::isValid() const
52{
53 if (m_data.size() >= 11) {
54 // issue date
55 if (std::any_of(m_data.begin() + 8, m_data.begin() + 11, [](auto c) { return !c.isDigit() && c != QLatin1Char(' '); }) || dayOfIssue() > 366) {
56 return false;
57 }
58 }
59 return true;
60}
61
62QDate IataBcbpUniqueConditionalSection::dateOfIssue(const QDateTime &contextDate) const
63{
64 const auto day = dayOfIssue() - 1;
65 if (m_data.size() < 11 || day < 0) {
66 return {};
67 }
68
69 const auto year = contextDate.date().year() - contextDate.date().year() % 10 + yearOfIssue();
70 const auto d = QDate(year, 1, 1).addDays(day);
71 // TODO shouldn't this rather be d > contextDate?
72 if (year > contextDate.date().year()) {
73 return QDate(year - 10, 1, 1).addDays(day);
74 }
75 return d;
76}
77
78IataBcbpRepeatedMandatorySection::IataBcbpRepeatedMandatorySection(QStringView data)
79{
80 m_data = data;
81}
82
83static bool isValidAirportCode(QStringView s)
84{
85 return std::all_of(s.begin(), s.end(), [](const QChar c) { return c.isLetter() && c.isUpper(); });
86}
87
88bool IataBcbpRepeatedMandatorySection::isValid() const
89{
90 if (m_data.size() < RepeatedMandatoryMinimalViableSize) {
91 return false;
92 }
93
94 return isValidAirportCode(m_data.mid(7, 3))
95 && isValidAirportCode(m_data.mid(10, 3))
96 && std::all_of(m_data.begin() + 21, m_data.begin() + 24, [](auto c) { return c.isDigit() || c == QLatin1Char(' '); })
97 && dayOfFlight() <= 366;
98}
99
101{
102 const auto day = dayOfFlight() - 1;
103 if (day < 0) {
104 return {}; // no set
105 }
106 const auto d = QDate(contextDate.date().year(), 1, 1).addDays(day);
107 if (d < contextDate.date()) {
108 return QDate(d.year() + 1, 1, 1).addDays(day);
109 }
110 return d;
111}
112
113IataBcbpRepeatedConditionalSection::IataBcbpRepeatedConditionalSection(QStringView data)
114{
115 if (data.size() < 2) {
116 return;
117 }
118 m_data = data;
119 m_data = data.left(conditionalFieldSize() + 2);
120}
121
122IataBcbpSecuritySection::IataBcbpSecuritySection(QStringView data)
123{
124 if (data.size() < MinimumSecuritySectionSize) {
125 return;
126 }
127 m_data = data;
128 m_data = data.left(size() + MinimumSecuritySectionSize);
129}
130
131#include "moc_iatabcbpsections.cpp"
Q_INVOKABLE QDate dateOfFlight(const QDateTime &contextDate=QDateTime::currentDateTime()) const
Date of the flight.
Classes for reservation/travel data models, data extraction and data augmentation.
Definition berelement.h:17
QDate addDays(qint64 ndays) const const
int year() const const
QDate date() const const
QStringView left(qsizetype length) const const
QStringView mid(qsizetype start, qsizetype length) const const
const_iterator begin() const const
const_iterator end() const const
qsizetype size() const const
int toInt(bool *ok, int base) const const
QString toString() const const
QStringView trimmed() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:14:49 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.