KItinerary

iatabcbpsections.cpp
1 /*
2  SPDX-FileCopyrightText: 2021 Volker Krause <[email protected]>
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 
11 using namespace KItinerary;
12 using namespace KItinerary::IataBcbpConstants;
13 
14 QString 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 
22 int 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 
31 IataBcbpUniqueMandatorySection::IataBcbpUniqueMandatorySection(QStringView data)
32 {
33  m_data = data;
34 }
35 
36 bool IataBcbpUniqueMandatorySection::isValid() const
37 {
38  const auto legCount = numberOfLegs();
39  return legCount >= 1 && legCount <= 4;
40 }
41 
42 IataBcbpUniqueConditionalSection::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 
51 bool 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 
62 QDate 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 
78 IataBcbpRepeatedMandatorySection::IataBcbpRepeatedMandatorySection(QStringView data)
79 {
80  m_data = data;
81 }
82 
83 static bool isValidAirportCode(QStringView s)
84 {
85  return std::all_of(s.begin(), s.end(), [](const QChar c) { return c.isLetter() && c.isUpper(); });
86 }
87 
88 bool 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 
113 IataBcbpRepeatedConditionalSection::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 
122 IataBcbpSecuritySection::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"
int year() const const
QString trimmed() const const
QStringView::const_iterator begin() const const
QStringView left(qsizetype length) const const
qsizetype size() const const
int toInt(bool *ok, int base) const const
QDate addDays(qint64 ndays) const const
Q_INVOKABLE QDate dateOfFlight(const QDateTime &contextDate=QDateTime::currentDateTime()) const
Date of the flight.
QStringView::const_iterator end() const const
QDate date() const const
QString mid(int position, int n) const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Thu Dec 7 2023 04:03:01 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.