swift
testservice.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QDBusArgument>
7 #include <QDBusError>
8 #include <QDBusObjectPath>
9 #include <QDebug>
10 #include <QVariant>
11 #include <QtDebug>
12 #include <QtGlobal>
13 
14 #include "misc/aviation/callsign.h"
16 #include "misc/aviation/track.h"
17 #include "misc/dbus.h"
18 #include "misc/dbusutils.h"
19 #include "misc/pq/frequency.h"
20 #include "misc/pq/units.h"
21 #include "misc/stringutils.h"
22 #include "misc/test/testing.h"
23 
24 using namespace swift::misc;
25 using namespace swift::misc::aviation;
26 using namespace swift::misc::simulation;
27 using namespace swift::misc::simulation::fscommon;
28 using namespace swift::misc::geo;
29 using namespace swift::misc::physical_quantities;
30 using namespace swift::misc::network;
31 
32 namespace swift::misc::test
33 {
34  CTestService::CTestService(QObject *parent) : QObject(parent) {}
35 
36  CTestService::CTestService(bool verbose, QObject *parent) : QObject(parent), m_verbose(verbose) {}
37 
38  bool CTestService::canRegisterTestService(QDBusConnection &connection)
39  {
40  const bool r = connection.registerService(CTestService::InterfaceName());
41  if (r) { connection.unregisterService(CTestService::InterfaceName()); }
42  return r;
43  }
44 
45  const QString &CTestService::InterfaceName()
46  {
47  static const QString i(SWIFT_MISC_TESTSERVICE_INTERFACENAME);
48  return i;
49  }
50 
51  const QString &CTestService::ObjectPath()
52  {
53  static const QString p("/ts");
54  return p;
55  }
56 
57  CTestService *CTestService::registerTestService(QDBusConnection &connection, bool verbose, QObject *parent)
58  {
59  CTestService *pTestService = new CTestService(
60  verbose,
61  parent); // just a QObject with signals / slots and Q_CLASSINFO("D-Bus Interface", some service name)
62  if (!connection.registerService(CTestService::InterfaceName()))
63  {
64  QDBusError error = connection.lastError();
65  err() << error.message();
66  err() << "Started dbus-daemon.exe --session (Windows)?" << Qt::endl;
67  err() << "Created directory session.d (e.g. ../Qt/5.8.0/qtbase/etc/dbus-1/session.d)?" << Qt::endl;
68  qFatal("Could not register service!");
69  }
70 
71  if (!connection.registerObject(CTestService::ObjectPath(), pTestService,
72  QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals |
73  QDBusConnection::ExportAdaptors))
74  {
75  qFatal("Could not register service object!");
76  }
77 
78  out() << "Registration running as pid: " << CTestService::getPid() << Qt::endl;
79  if (pTestService) { out() << "Service registered" << Qt::endl; }
80 
81  QString service; // service not needed
82  if (connection.connect(service, CTestService::ObjectPath(), CTestService::InterfaceName(), "sendStringMessage",
83  pTestService, SLOT(receiveStringMessage(const QString &))))
84  {
85  out() << "Connected object with DBus 'sendStringMessage'" << Qt::endl;
86  }
87  else { qFatal("Cannot connect service with DBus"); }
88  return pTestService;
89  }
90 
91  bool CTestService::unregisterTestService(QDBusConnection &connection)
92  {
93  return connection.unregisterService(CTestService::InterfaceName());
94  }
95 
96  QTextStream &CTestService::out()
97  {
98  static QTextStream out(stdout);
99  return out;
100  }
101 
102  QTextStream &CTestService::err()
103  {
104  static QTextStream err(stderr);
105  return err;
106  }
107 
108  void CTestService::receiveStringMessage(const QString &message) const
109  {
110  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received message: " << message << Qt::endl;
111  }
112 
113  void CTestService::receiveVariant(const CVariant &variant) const
114  {
115  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received variant: " << variant << Qt::endl;
116  }
117 
119  {
120  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received speed: " << speed << Qt::endl;
121  }
122 
123  void CTestService::receiveComUnit(const CComSystem &comUnit) const
124  {
125  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received COM: " << comUnit << Qt::endl;
126  }
127 
128  void CTestService::receiveAltitude(const CAltitude &altitude) const
129  {
130  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received altitude: " << altitude << Qt::endl;
131  }
132 
133  void CTestService::receiveList(const QList<double> &list) const
134  {
135  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received list: " << list.size() << Qt::endl;
136  }
137 
139  {
140  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received geo data: " << geo << Qt::endl;
141  }
142 
143  void CTestService::receiveTransponder(const CTransponder &transponder) const
144  {
145  if (m_verbose)
146  out() << "Pid: " << CTestService::getPid() << " Received transponder: " << transponder << Qt::endl;
147  }
148 
149  void CTestService::receiveTrack(const CTrack &track) const
150  {
151  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received track: " << track << Qt::endl;
152  }
153 
155  {
156  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received length: " << length << Qt::endl;
157  }
158 
159  void CTestService::receiveVariantList(const CVariantList &variantList) const
160  {
161  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " " << variantList.size() << Qt::endl;
162  for (const CVariant &lv : variantList)
163  {
164  if (m_verbose) out() << " Received variant: " << lv.toQString() << Qt::endl;
165  }
166  }
167 
168  void CTestService::receiveCallsign(const CCallsign &callsign) const
169  {
170  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received callsign: " << callsign << Qt::endl;
171  }
172 
173  void CTestService::receiveAtcStationList(const CAtcStationList &atcStationList) const
174  {
175  if (m_verbose)
176  out() << "Pid: " << CTestService::getPid() << " Received ATC list: " << atcStationList << Qt::endl;
177  }
178 
180  {
181  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received value map: " << valueMap << Qt::endl;
182  }
183 
184  void CTestService::receiveAtcStation(const CAtcStation &station) const
185  {
186  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " Received ATC station: " << station << Qt::endl;
187  }
188 
190  {
191  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping ATCs: " << atcStationList << Qt::endl;
192  return atcStationList;
193  }
194 
196  {
197  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping aircraft: " << aircraftList << Qt::endl;
198  return aircraftList;
199  }
200 
202  {
203  if (m_verbose)
204  out() << "Pid: " << CTestService::getPid() << " ping aircraft parts: " << aircraftParts << Qt::endl;
205  return aircraftParts;
206  }
207 
209  {
210  if (m_verbose)
211  out() << "Pid: " << CTestService::getPid() << " ping aircraft engine: " << aircraftEngine << Qt::endl;
212  return aircraftEngine;
213  }
214 
216  {
217  if (m_verbose)
218  out() << "Pid: " << CTestService::getPid() << " ping aircraft model: " << aircraftModel << Qt::endl;
219  return aircraftModel;
220  }
221 
223  {
224  if (m_verbose)
225  out() << "Pid: " << CTestService::getPid() << " ping aircraft modellist: " << aircraftModels << Qt::endl;
226  return aircraftModels;
227  }
228 
230  {
231  if (m_verbose)
232  out() << "Pid: " << CTestService::getPid() << " ping aircraft lights: " << aircraftLights << Qt::endl;
233  return aircraftLights;
234  }
235 
237  {
238  if (m_verbose)
239  out() << "Pid: " << CTestService::getPid() << " ping simulated aircraft: " << aircraft << Qt::endl;
240  return aircraft;
241  }
242 
244  {
245  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping airports: " << airportList << Qt::endl;
246  return airportList;
247  }
248 
250  {
251  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping properties: " << properties << Qt::endl;
252  return properties;
253  }
254 
256  {
257  if (m_verbose)
258  out() << "Pid: " << CTestService::getPid() << " ping properties: " << indexVariantMap << Qt::endl;
259  return indexVariantMap;
260  }
261 
263  {
264  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping client: " << client << Qt::endl;
265  return client;
266  }
267 
269  {
270  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping clients: " << clientList << Qt::endl;
271  return clientList;
272  }
273 
275  {
276  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping speed: " << speed << Qt::endl;
277  return speed;
278  }
279 
281  {
282  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping alt: " << altitude << Qt::endl;
283  return altitude;
284  }
285 
286  CUser CTestService::pingUser(const CUser &user) const
287  {
288  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping user: " << user << Qt::endl;
289  return user;
290  }
291 
293  {
294  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping situation: " << situation << Qt::endl;
295  return situation;
296  }
297 
299  {
300  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping transponder: " << transponder << Qt::endl;
301  return transponder;
302  }
303 
305  {
306  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping ATC: " << station << Qt::endl;
307  return station;
308  }
309 
311  {
312  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " ping ICAO data: " << icao << Qt::endl;
313  return icao;
314  }
315 
317  {
318  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " info: " << info << Qt::endl;
319  return info;
320  }
321 
323  {
324  if (m_verbose)
325  out() << "Pid: " << CTestService::getPid() << " client sent back as CVariant: " << variant.toQString()
326  << Qt::endl;
327  return variant;
328  }
329 
332  {
333  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " info: " << flightPlan << Qt::endl;
334  return flightPlan;
335  }
336 
338  {
339  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " getAtcStationList" << Qt::endl;
340  return CTesting::createAtcStations(n, false);
341  }
342 
344  {
345  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " getAircraftCfgEntriesList" << Qt::endl;
347  }
348 
349  QList<QDBusObjectPath> CTestService::getObjectPaths(int n) const
350  {
351  if (m_verbose) out() << "Pid: " << CTestService::getPid() << " getObjectPaths" << Qt::endl;
352  QList<QDBusObjectPath> paths;
353  paths.reserve(n);
354  for (int i = 0; i < n; i++) { paths.append(QDBusObjectPath(ObjectPath())); }
355  return paths;
356  }
357 } // namespace swift::misc::test
Specialized value object compliant map for variants, based on indexes.
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition: variant.h:66
Value object encapsulating a list of variants.
Definition: variantlist.h:29
Value object encapsulating information about aircraft's engines.
Value object for ICAO classification.
Value object encapsulating information about aircraft's lights.
Value object encapsulating information of aircraft's parts.
Definition: aircraftparts.h:26
Value object encapsulating information of an aircraft's situation.
Value object for a list of airports.
Definition: airportlist.h:29
Altitude as used in aviation, can be AGL or MSL altitude.
Definition: altitude.h:52
Value object encapsulating information about an ATC station.
Definition: atcstation.h:38
Value object for a list of ATC stations.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
COM system (aka "radio")
Definition: comsystem.h:37
Value object for a flight plan.
Definition: flightplan.h:148
Track as used in aviation, can be true or magnetic Track.
Definition: track.h:44
QString toQString(bool i18n=false) const
Cast as QString.
Definition: mixinstring.h:76
Another client software.
Definition: client.h:27
Value object encapsulating a list of voice rooms.
Definition: clientlist.h:27
Value object encapsulating information of a user.
Definition: user.h:28
Physical unit length (length)
Definition: length.h:18
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Value object encapsulating a list of aircraft models.
Comprehensive information of an aircraft.
Value object encapsulating a list of aircraft.
Testservice for PQ / CValueObject DBus tests. This part is the callee.
Definition: testservice.h:65
swift::misc::aviation::CAircraftLights pingAircraftLights(const swift::misc::aviation::CAircraftLights &aircraftLights) const
Ping aircraft lights.
swift::misc::network::CUser pingUser(const swift::misc::network::CUser &user) const
Ping user.
swift::misc::aviation::CAircraftIcaoCode pingAircraftIcaoData(const swift::misc::aviation::CAircraftIcaoCode &icao) const
Ping ICAO data object.
void receiveAltitude(const swift::misc::aviation::CAltitude &altitude) const
Receive altitude.
void receiveSpeed(const swift::misc::physical_quantities::CSpeed &speed) const
Receive speed.
swift::misc::aviation::CTransponder pingTransponder(const swift::misc::aviation::CTransponder &transponder) const
Ping transponder.
swift::misc::aviation::CAircraftParts pingAircraftParts(const swift::misc::aviation::CAircraftParts &aircraftParts) const
Ping parts.
void receiveTransponder(const swift::misc::aviation::CTransponder &transponder) const
Receive transponder.
void receiveValueMap(const swift::misc::CPropertyIndexVariantMap &valueMap) const
Receive an value map.
swift::misc::simulation::CAircraftModelList pingAircraftModelList(const swift::misc::simulation::CAircraftModelList &aircraftModels) const
Ping model.
swift::misc::aviation::CFlightPlan pingFlightPlan(const swift::misc::aviation::CFlightPlan &flightPlan) const
Ping flight plan.
static bool canRegisterTestService(QDBusConnection &connection)
Can the testservice be registered?
Definition: testservice.cpp:38
static const QString & InterfaceName()
DBus interface name.
Definition: testservice.cpp:45
swift::misc::physical_quantities::CSpeed pingSpeed(const swift::misc::physical_quantities::CSpeed &speed) const
Ping speed.
swift::misc::simulation::CSimulatedAircraftList pingAircraftList(const swift::misc::simulation::CSimulatedAircraftList &aircraftList) const
Ping aircraft list.
void receiveVariant(const swift::misc::CVariant &variant) const
Receive a QVariant.
swift::misc::simulation::fscommon::CAircraftCfgEntriesList getAircraftCfgEntriesList(int n) const
Return stations via DBus.
void receiveAtcStationList(const swift::misc::aviation::CAtcStationList &atcStationList) const
Receive ATC list.
swift::misc::simulation::CAircraftModel pingAircraftModel(const swift::misc::simulation::CAircraftModel &aircraftModel) const
Ping model.
swift::misc::CPropertyIndex pingPropertyIndex(const swift::misc::CPropertyIndex &properties) const
Ping property index.
void receiveLength(const swift::misc::physical_quantities::CLength &length) const
Receive a length.
void receiveVariantList(const swift::misc::CVariantList &variantList) const
Receive variant list.
static const QString & ObjectPath()
DBus object path.
Definition: testservice.cpp:51
swift::misc::aviation::CAtcStationList getAtcStationList(int n) const
Return stations via DBus.
swift::misc::simulation::CSimulatedAircraft pingSimulatedAircraft(const swift::misc::simulation::CSimulatedAircraft &aircraft) const
Ping simulated aircraft.
swift::misc::aviation::CAtcStationList pingAtcStationList(const swift::misc::aviation::CAtcStationList &atcStationList) const
Ping ATC list.
QList< QDBusObjectPath > getObjectPaths(int n) const
Return paths via DBus.
swift::misc::aviation::CAircraftSituation pingSituation(const swift::misc::aviation::CAircraftSituation &situation) const
Ping situation.
swift::misc::network::CClient pingClient(const swift::misc::network::CClient &client) const
Ping client.
swift::misc::simulation::CSimulatorPluginInfo pingPluginInfo(const swift::misc::simulation::CSimulatorPluginInfo &info) const
Ping plugin info.
void receiveTrack(const swift::misc::aviation::CTrack &track) const
Receive track.
swift::misc::aviation::CAtcStation pingAtcStation(const swift::misc::aviation::CAtcStation &station) const
Ping ATC station.
void receiveList(const QList< double > &list) const
Receive list.
swift::misc::network::CClientList pingClientList(const swift::misc::network::CClientList &clientList) const
Ping NW clients list.
swift::misc::aviation::CAirportList pingAirportList(const swift::misc::aviation::CAirportList &airportList) const
Ping airports list.
void receiveComUnit(const swift::misc::aviation::CComSystem &comUnit) const
Receive com unit.
swift::misc::aviation::CAltitude pingAltitude(const swift::misc::aviation::CAltitude &altitude) const
Ping altitude.
static CTestService * registerTestService(QDBusConnection &connection, bool verbose, QObject *parent=nullptr)
Register testservice with connection.
Definition: testservice.cpp:57
swift::misc::aviation::CAircraftEngine pingAircraftEngine(const swift::misc::aviation::CAircraftEngine &aircraftEngine) const
Ping engine.
void receiveStringMessage(const QString &message) const
Receive string message.
CTestService(QObject *parent=nullptr)
Constructor.
Definition: testservice.cpp:34
static bool unregisterTestService(QDBusConnection &connection)
Can the testservice be registered?
Definition: testservice.cpp:91
swift::misc::CPropertyIndexVariantMap pingIndexVariantMap(const swift::misc::CPropertyIndexVariantMap &indexVariantMap) const
Ping index variant map.
swift::misc::CVariant pingCVariant(const swift::misc::CVariant &variant) const
Ping CVariant.
void receiveCallsign(const swift::misc::aviation::CCallsign &callsign) const
Receive callsign.
void receiveGeoPosition(const swift::misc::geo::CCoordinateGeodetic &geo) const
Receive a geo position.
static qint64 getPid()
Process id.
Definition: testservice.h:89
void receiveAtcStation(const swift::misc::aviation::CAtcStation &station) const
Receive ATC station.
static swift::misc::simulation::fscommon::CAircraftCfgEntriesList getAircraftCfgEntries(int number)
Get aircraft cfg entries.
Definition: testing.cpp:80
static swift::misc::aviation::CAtcStationList createAtcStations(int number, bool byPropertyIndex=false)
Generate number of ATC stations.
Definition: testing.cpp:33
Generate data for testing purposes.
Definition: testdata.h:45
Free functions in swift::misc.
#define SWIFT_MISC_TESTSERVICE_INTERFACENAME
DBus interface for test service.
Definition: testservice.h:58