swift
Loading...
Searching...
No Matches
afvmapreader.cpp
1// SPDX-FileCopyrightText: Copyright (C) 2019 swift Project Community / Contributors
2// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3
4#include "core/afv/model/afvmapreader.h"
5
6#include <algorithm>
7
8#include <QEventLoop>
9#include <QJsonArray>
10#include <QJsonDocument>
11#include <QJsonObject>
12#include <QNetworkReply>
13
14#include "core/afv/dto.h"
15#include "core/application.h"
17
18using namespace swift::misc::aviation;
19
20namespace swift::core::afv::model
21{
23 {
24 m_model = new CSampleAtcStationModel(this);
25 m_timer = new QTimer(this);
27 m_timer->start(3000);
28 }
29
31 {
32 if (!sApp || !sApp->getNetworkAccessManager() || sApp->isShuttingDown())
33 {
34 return;
35 }
36
37 QEventLoop loop(sApp);
38 connect(sApp->getNetworkAccessManager(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
40 const QUrl url =
41 sApp->getGlobalSetup().getAfvApiServerUrl().withAppendedPath("/api/v1/network/online/callsigns");
42 QNetworkReply *reply = sApp->getNetworkAccessManager()->get(QNetworkRequest(url));
43 while (reply && !reply->isFinished() && sApp && !sApp->isShuttingDown())
44 {
45 loop.exec();
46 }
47 const QByteArray jsonData = reply ? reply->readAll() : QByteArray {};
48 if (reply)
49 {
50 reply->deleteLater();
51 }
52
53 if (jsonData.isEmpty())
54 {
55 return;
56 }
57
58 QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
59 if (jsonDoc.isArray())
60 {
61 const QJsonArray rootArray = jsonDoc.array();
62 QVector<CSampleAtcStation> transceivers;
63 QString callsign;
64
65 for (auto it : rootArray)
66 {
67 if (it.isObject())
68 {
69 const QJsonObject stationObject = it.toObject();
70
71 if (stationObject.contains("callsign"))
72 {
73 callsign = stationObject.value("callsign").toString();
74 }
75
76 if (callsign.isEmpty() || !CCallsign::looksLikeAtcCallsign(callsign))
77 {
78 continue;
79 }
80
81 if (stationObject.contains("transceivers"))
82 {
83 QJsonArray txArray = stationObject.value("transceivers").toArray();
84 for (auto &&jt : txArray)
85 {
86 const TransceiverDto transceiver = TransceiverDto::fromJson(jt.toObject());
87 transceivers.push_back({ callsign, transceiver });
88 }
89 }
90 }
91 }
92
93 if (transceivers.isEmpty())
94 {
95 return;
96 }
97 transceivers.erase(
98 std::ranges::remove_if(transceivers,
99 [this](const CSampleAtcStation &s) { return s.callsign() == m_callsign; })
100 .begin(),
101 transceivers.end());
102 m_model->updateAtcStations(transceivers);
103 }
104 }
105} // namespace swift::core::afv::model
void aboutToShutdown()
About to shutdown.
CAfvMapReader(QObject *parent=nullptr)
Ctor.
void updateFromMap()
Update ATC stations in model.
const QString & callsign() const
Getter.
static bool looksLikeAtcCallsign(const QString &callsign)
Does this look like an ATC callsign.
Definition callsign.cpp:560
bool isEmpty() const const
int exec(QEventLoop::ProcessEventsFlags flags)
void quit()
QByteArray readAll()
QJsonArray array() const const
QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error)
bool isArray() const const
bool contains(QLatin1StringView key) const const
QJsonValue value(QLatin1StringView key) const const
QJsonArray toArray() const const
QString toString() const const
QList< T >::iterator end()
QList< T >::iterator erase(QList< T >::const_iterator begin, QList< T >::const_iterator end)
bool isEmpty() const const
void push_back(QList< T >::parameter_type value)
void finished(QNetworkReply *reply)
bool isFinished() const const
QObject(QObject *parent)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void deleteLater()
QObject * parent() const const
bool isEmpty() const const
void timeout()
static TransceiverDto fromJson(const QJsonObject &json)
From JSON.
Definition dto.h:143