swift
webdataservices.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_CORE_WEBDATASERVICES_H
7 #define SWIFT_CORE_WEBDATASERVICES_H
8 
9 #include <atomic>
10 
11 #include <QDateTime>
12 #include <QList>
13 #include <QObject>
14 #include <QSet>
15 #include <QString>
16 #include <QStringList>
17 
18 #include "core/db/databasereader.h"
19 #include "core/swiftcoreexport.h"
20 #include "core/webreaderflags.h"
27 #include "misc/countrylist.h"
30 #include "misc/network/url.h"
31 #include "misc/network/userlist.h"
37 #include "misc/statusmessagelist.h"
38 #include "misc/weather/metar.h"
39 #include "misc/weather/metarlist.h"
40 
41 namespace swift::misc
42 {
43  class CLogCategoryList;
44 
45  namespace aviation
46  {
47  class CCallsign;
48  }
49  namespace simulation
50  {
51  class CSimulatedAircraft;
52  class CAutoPublishData;
53  } // namespace simulation
54 } // namespace swift::misc
55 
56 namespace swift::core
57 {
58  namespace vatsim
59  {
60  class CVatsimDataFileReader;
61  class CVatsimMetarReader;
62  class CVatsimStatusFileReader;
63  class CVatsimServerFileReader;
64  } // namespace vatsim
65 
66  namespace db
67  {
68  class CAirportDataReader;
69  class CDatabaseWriter;
70  class CDatabaseReader;
71  class CIcaoDataReader;
72  class CModelDataReader;
73  class CInfoDataReader;
74  } // namespace db
75 
79  class SWIFT_CORE_EXPORT CWebDataServices : public QObject
80  {
81  Q_OBJECT
82 
83  public:
85  static const QStringList &getLogCategories();
86 
88  CWebDataServices(CWebReaderFlags::WebReader readerFlags,
89  const swift::core::db::CDatabaseReaderConfigList &dbReaderConfig, QObject *parent = nullptr);
90 
92  virtual ~CWebDataServices() override;
93 
95  void gracefulShutdown();
96 
98  vatsim::CVatsimDataFileReader *getVatsimDataFileReader() const { return m_vatsimDataFileReader; }
99 
101  vatsim::CVatsimMetarReader *getMetarReader() const { return m_vatsimMetarReader; }
102 
104  swift::core::db::CInfoDataReader *getDbInfoDataReader() const { return m_dbInfoDataReader; }
105 
107  swift::core::db::CInfoDataReader *getSharedInfoDataReader() const { return m_sharedInfoDataReader; }
108 
110  db::CDatabaseWriter *getDatabaseWriter() const { return m_databaseWriter; }
111 
113  swift::misc::network::CEntityFlags::Entity allDbEntitiesForUsedReaders() const;
114 
117  swift::misc::network::CServerList getVatsimFsdServers() const;
118 
121  swift::misc::network::CUrl getVatsimMetarUrl() const;
122 
125  swift::misc::network::CUrl getVatsimDataFileUrl() const;
126 
129  swift::misc::network::CUserList getUsersForCallsign(const swift::misc::aviation::CCallsign &callsign) const;
130 
134  getAtcStationsForCallsign(const swift::misc::aviation::CCallsign &callsign) const;
135 
139  getVoiceCapabilityForCallsign(const swift::misc::aviation::CCallsign &callsign) const;
140 
143  void updateWithVatsimDataFileData(swift::misc::simulation::CSimulatedAircraft &aircraftToBeUdpated) const;
144 
147  swift::misc::simulation::CDistributorList getDistributors() const;
148 
151  int getDistributorsCount() const;
152 
155  swift::misc::simulation::CDistributor getDistributorForDbKey(const QString &key) const;
156 
160  smartDistributorSelector(const swift::misc::simulation::CDistributor &distributor) const;
161 
165 
169  smartDistributorSelector(const swift::misc::simulation::CDistributor &distributor,
170  const swift::misc::simulation::CAircraftModel &model) const;
171 
174  swift::misc::aviation::CLiveryList getLiveries() const;
175 
178  int getLiveriesCount() const;
179 
182  swift::misc::aviation::CLivery getLiveryForCombinedCode(const QString &combinedCode) const;
183 
186  swift::misc::aviation::CLivery getTempLiveryOrDefault() const;
187 
191  getStdLiveryForAirlineCode(const swift::misc::aviation::CAirlineIcaoCode &icao) const;
192 
195  swift::misc::aviation::CLivery getLiveryForDbKey(int id) const;
196 
199  swift::misc::aviation::CLivery smartLiverySelector(const swift::misc::aviation::CLivery &livery) const;
200 
204 
207  int getModelsCount() const;
208 
211  QSet<int> getModelDbKeys() const;
212 
215  QStringList getModelStrings(bool sort = false) const;
216 
219  QStringList getModelCompleterStrings(bool sorted = true,
220  const swift::misc::simulation::CSimulatorInfo &simulator = {
221  swift::misc::simulation::CSimulatorInfo::All }) const;
222 
226  getModelsForAircraftDesignatorAndLiveryCombinedCode(const QString &aircraftDesignator,
227  const QString &combinedCode) const;
228 
231  swift::misc::simulation::CAircraftModel getModelForModelString(const QString &modelString) const;
232 
235  bool containsModelString(const QString &modelString) const;
236 
239  swift::misc::simulation::CAircraftModel getModelForDbKey(int dbKey) const;
240 
243  swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodes() const;
244 
247  int getAircraftIcaoCodesCount() const;
248 
251  swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDesignator(const QString &designator) const;
252 
255  int getAircraftIcaoCodesForDesignatorCount(const QString &designator) const;
256 
259  QSet<QString> getAircraftDesignatorsForAirline(const swift::misc::aviation::CAirlineIcaoCode &airline) const;
260 
264  getAircraftIcaoCodesForAirline(const swift::misc::aviation::CAirlineIcaoCode &airline) const;
265 
268  swift::misc::aviation::CAircraftCategoryList getAircraftCategories() const;
269 
272  int getAircraftCategoriesCount() const;
273 
276  bool containsAircraftIcaoDesignator(const QString &designator) const;
277 
280  swift::misc::aviation::CAircraftIcaoCodeList getAircraftIcaoCodesForDesignator(const QString &designator) const;
281 
284  swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int id) const;
285 
289  smartAircraftIcaoSelector(const swift::misc::aviation::CAircraftIcaoCode &icao) const;
290 
293  swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodes() const;
294 
297  bool containsAirlineIcaoDesignator(const QString &designator) const;
298 
302  getAirlineIcaoCodeForUniqueDesignatorOrDefault(const QString &designator, bool preferOperatingAirlines) const;
303 
307  getAirlineIcaoCodeForUniqueIataCodeOrDefault(const QString &iataCode) const;
308 
311  QStringList getAirlineNames() const;
312 
315  QStringList getTelephonyDesignators() const;
316 
319  int getAirlineIcaoCodesCount() const;
320 
323  swift::misc::aviation::CAirlineIcaoCodeList getAirlineIcaoCodesForDesignator(const QString &designator) const;
324 
327  int getAirlineIcaoCodesForDesignatorCount(const QString &designator) const;
328 
331  swift::misc::aviation::CAirlineIcaoCode getAirlineIcaoCodeForDbKey(int id) const;
332 
335  swift::misc::aviation::CAirlineIcaoCode smartAirlineIcaoSelector(
338 
342  findBestMatchByCallsign(const swift::misc::aviation::CCallsign &callsign) const;
343 
346  swift::misc::CCountryList getCountries() const;
347 
350  int getCountriesCount() const;
351 
354  swift::misc::CCountry getCountryForIsoCode(const QString &iso) const;
355 
358  swift::misc::CCountry getCountryForName(const QString &name) const;
359 
362  swift::misc::aviation::CAirportList getAirports() const;
363 
366  int getAirportsCount() const;
367 
370  swift::misc::aviation::CAirport getAirportForIcaoDesignator(const QString &icao) const;
371 
374  swift::misc::aviation::CAirport getAirportForNameOrLocation(const QString &nameOrLocation) const;
375 
378  swift::misc::weather::CMetarList getMetars() const;
379 
382  swift::misc::weather::CMetar getMetarForAirport(const swift::misc::aviation::CAirportIcaoCode &icao) const;
383 
387  validateForPublishing(const swift::misc::simulation::CAircraftModelList &modelsToBePublished, bool ignoreEqual,
389  swift::misc::simulation::CAircraftModelList &invalidModels) const;
390 
392  bool isDbModelEqualForPublishing(const swift::misc::simulation::CAircraftModel &modelToBeChecked,
393  swift::misc::CStatusMessageList *details = nullptr) const;
394 
397  asyncPublishModels(const swift::misc::simulation::CAircraftModelList &modelsToBePublished) const;
398 
401 
403  void triggerReadOfDbInfoObjects();
404 
406  void triggerReadOfSharedInfoObjects();
407 
410  swift::misc::network::CEntityFlags::Entity triggerRead(swift::misc::network::CEntityFlags::Entity whatToRead,
411  const QDateTime &newerThan = QDateTime());
412 
414  swift::misc::network::CEntityFlags::Entity
415  triggerLoadingDirectlyFromDb(swift::misc::network::CEntityFlags::Entity whatToRead,
416  const QDateTime &newerThan = QDateTime());
417 
419  swift::misc::network::CEntityFlags::Entity
420  triggerLoadingDirectlyFromSharedFiles(swift::misc::network::CEntityFlags::Entity whatToRead,
421  bool checkCacheTsUpfront);
422 
425  QDateTime getCacheTimestamp(swift::misc::network::CEntityFlags::Entity entity) const;
426 
429  QDateTime getLatestDbEntityCacheTimestamp() const;
430 
434  QDateTime getLatestDbEntityTimestamp(swift::misc::network::CEntityFlags::Entity entity) const;
435 
439  QDateTime getLatestSharedInfoObjectTimestamp(swift::misc::network::CEntityFlags::Entity entity) const;
440 
443  swift::misc::network::CEntityFlags::Entity
444  getEntitiesWithNewerSharedFile(swift::misc::network::CEntityFlags::Entity entities) const;
445 
449  swift::misc::network::CEntityFlags::Entity
450  getEmptyEntities(swift::misc::network::CEntityFlags::Entity entities =
452 
456  swift::misc::network::CEntityFlags::Entity getSynchronizedEntitiesWithNewerSharedFileOrEmpty(
457  bool syncData = true,
458  swift::misc::network::CEntityFlags::Entity entities = swift::misc::network::CEntityFlags::AllDbEntities);
459 
462  int getCacheCount(swift::misc::network::CEntityFlags::Entity entity) const;
463 
466  int getDbInfoObjectCount(swift::misc::network::CEntityFlags::Entity entity) const;
467 
470  int getDbInfoObjectsCount(swift::misc::network::CEntityFlags::Entity entities,
471  bool stopIfNotFound = true) const;
472 
475  int getSharedInfoObjectCount(swift::misc::network::CEntityFlags::Entity entity) const;
476 
478  QString getDbReadersLog(const QString &separator = "\n") const;
479 
481  QString getReadersLog(const QString &separator = "\n") const;
482 
484  bool hasSuccesfullyConnectedSwiftDb() const;
485 
487  bool hasDbAircraftData() const;
488 
490  bool hasDbModelData() const;
491 
493  bool hasDbIcaoData() const;
494 
496  void admitDbCaches(swift::misc::network::CEntityFlags::Entity entities);
497 
500  void synchronizeDbCaches(swift::misc::network::CEntityFlags::Entity entities);
501 
503  bool writeDbDataToDisk(const QString &dir);
504 
508  bool readDbDataFromDisk(const QString &dir, bool inBackground, bool overrideNewerOnly);
509 
512  swift::misc::CStatusMessageList initDbCachesFromLocalResourceFiles(bool inBackground);
513 
517  initDbCachesFromLocalResourceFiles(swift::misc::network::CEntityFlags::Entity entities, bool inBackground);
518 
519  signals:
521  void dataRead(swift::misc::network::CEntityFlags::Entity entity,
522  swift::misc::network::CEntityFlags::ReadState state, int number, const QUrl &url);
523 
525  void entityDownloadProgress(swift::misc::network::CEntityFlags::Entity entity, int logId, int progress,
526  qint64 current, qint64 max, const QUrl &url);
527 
531 
533  void swiftDbDataRead(bool success);
534 
535  // simplified signals follow
536  // 1) simple signature
537  // 2) fired directly after read, no need to wait for other entities
538 
541 
544 
547 
550 
553 
556 
559 
562 
566 
567  public slots:
569  void readDeferredInBackground(swift::misc::network::CEntityFlags::Entity entities, int delayMs);
570 
573  void readInBackground(
574  swift::misc::network::CEntityFlags::Entity entities = swift::misc::network::CEntityFlags::AllEntities);
575 
576  private:
578  void receivedMetars(const swift::misc::weather::CMetarList &metars);
579 
581  void vatsimDataFileRead(int kB);
582 
584  void vatsimStatusFileRead(int bytes);
585 
587  void vatsimServerFileRead(int bytes);
588 
590  void startVatsimServerFileReader();
591 
593  void readFromSwiftReader(swift::misc::network::CEntityFlags::Entity entities,
594  swift::misc::network::CEntityFlags::ReadState state, int number, const QUrl &url);
595 
597  void initReaders(CWebReaderFlags::WebReader readersNeeded, swift::misc::network::CEntityFlags::Entity entities);
598 
600  void initDbInfoObjectReaderAndTriggerRead();
601 
603  void initSharedInfoObjectReaderAndTriggerRead();
604 
606  db::CDatabaseReader *getDbReader(swift::misc::network::CEntityFlags::Entity entity) const;
607 
609  void initWriters();
610 
612  bool signalEntitiesAlreadyRead(swift::misc::network::CEntityFlags::Entity entities);
613 
615  int getInfoObjectCount(swift::misc::network::CEntityFlags::Entity entity,
616  swift::core::db::CInfoDataReader *reader) const;
617 
620  swift::misc::network::CEntityFlags::Entity getDbEntitiesWithCachedData() const;
621 
624  swift::misc::network::CEntityFlags::Entity
625  getDbEntitiesWithTimestampNewerThan(const QDateTime &threshold) const;
626 
628  bool waitForDbInfoObjectsThenRead(swift::misc::network::CEntityFlags::Entity entities);
629 
632  bool waitForSharedInfoObjectsThenRead(swift::misc::network::CEntityFlags::Entity entities);
633 
636  bool waitForInfoObjectsThenRead(swift::misc::network::CEntityFlags::Entity entities, const QString &info,
637  swift::core::db::CInfoDataReader *infoReader, QDateTime &timeOut);
638 
639  swift::misc::network::CEntityFlags::Entity m_entitiesPeriodicallyRead =
641  swift::misc::network::CEntityFlags::Entity m_swiftDbEntitiesRead =
644  std::atomic_bool m_shuttingDown { false };
645  QDateTime m_dbInfoObjectTimeout;
646  QDateTime m_sharedInfoObjectsTimeout;
647  QSet<swift::misc::network::CEntityFlags::Entity> m_signalledEntities;
648 
649  // for reading XML and VATSIM data files
650  vatsim::CVatsimStatusFileReader *m_vatsimStatusReader = nullptr;
651  vatsim::CVatsimDataFileReader *m_vatsimDataFileReader = nullptr;
652  vatsim::CVatsimMetarReader *m_vatsimMetarReader = nullptr;
653  vatsim::CVatsimServerFileReader *m_vatsimServerFileReader = nullptr;
654  db::CIcaoDataReader *m_icaoDataReader = nullptr;
655  db::CModelDataReader *m_modelDataReader = nullptr;
656  db::CAirportDataReader *m_airportDataReader = nullptr;
657  db::CInfoDataReader *m_dbInfoDataReader = nullptr;
658  db::CInfoDataReader *m_sharedInfoDataReader = nullptr;
659 
660  // writing objects directly into DB
661  db::CDatabaseWriter *m_databaseWriter = nullptr;
662  };
663 } // namespace swift::core
664 
665 #endif // SWIFT_CORE_WEBDATASERVICES_H
Encapsulates reading data from web sources.
void databaseReaderMessages(const swift::misc::CStatusMessageList &messages)
Database reader messages.
void swiftDbAirportsRead()
Airports read.
void sharedInfoObjectsRead()
Shared info objects read.
vatsim::CVatsimMetarReader * getMetarReader() const
Metar reader.
void swiftDbModelsRead()
All models read.
db::CDatabaseWriter * getDatabaseWriter() const
DB writer class.
swift::core::db::CInfoDataReader * getDbInfoDataReader() const
DB info data reader.
swift::misc::CStatusMessageList initDbCachesFromLocalResourceFiles(swift::misc::network::CEntityFlags::Entity entities, bool inBackground)
Init caches from local DB files per given entities.
void entityDownloadProgress(swift::misc::network::CEntityFlags::Entity entity, int logId, int progress, qint64 current, qint64 max, const QUrl &url)
Download progress for an entity.
swift::core::db::CInfoDataReader * getSharedInfoDataReader() const
Shared info data reader.
void dataRead(swift::misc::network::CEntityFlags::Entity entity, swift::misc::network::CEntityFlags::ReadState state, int number, const QUrl &url)
Combined read signal.
void swiftDbModelMatchingEntitiesRead()
All entities needed for model matching.
swift::misc::simulation::CDistributor smartDistributorSelector() const
Use distributor object to select the best complete distributor from DB.
void swiftDbAirlineIcaoRead()
Airline ICAO data read.
void swiftDbDataRead(bool success)
DB data read.
vatsim::CVatsimDataFileReader * getVatsimDataFileReader() const
Data file reader.
void swiftDbAllIcaoEntitiesRead()
All ICAO entities.
void swiftDbAircraftIcaoRead()
Aircraft ICAO data read.
void swiftDbAllDataRead()
All swift DB data have been read.
Reader for airport database data.
Value object encapsulating a list of reader configs.
Specialized version of threaded reader for DB data.
Write to the swift DB.
Read ICAO data from Database.
Read information about data from Database or shared files such as when updated and number of entries.
Read model related data from Database.
Sole purpose is to read the URLs where VATSIM data can be downloaded.
Value object encapsulating a list of countries.
Definition: countrylist.h:32
Status messages, e.g. from Core -> GUI.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
Value object encapsulating a list of ICAO codes.
Value object for ICAO classification.
Value object encapsulating a list of ICAO codes.
Value object encapsulating information about an airpot.
Definition: airport.h:36
Value object encapsulating information of airport ICAO data.
Value object for a list of airports.
Definition: airportlist.h:29
Value object for a list of ATC stations.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object encapsulating information about an airpot.
Definition: livery.h:29
Value object for a list of airports.
Definition: liverylist.h:29
Value object encapsulating a list of servers.
Definition: serverlist.h:23
Value object encapsulating information of a location, kind of simplified CValueObject compliant versi...
Definition: url.h:27
Value object encapsulating a list of voice rooms.
Definition: userlist.h:26
Value object encapsulating information for voice capabilities.
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Value object encapsulating a list of aircraft models.
Objects that can be use for auto-publishing. Auto publishing means we sent those data to the DB.
Value object encapsulating information of software distributor.
Definition: distributor.h:33
Value object encapsulating a list of distributors.
Comprehensive information of an aircraft.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
Value object encapsulating information about METAR FIXME: runway visibilities FIXME: runway wind shea...
Definition: metar.h:38
Sequence of Metars.
Definition: metarlist.h:24
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
Free functions in swift::misc.
#define SWIFT_CORE_EXPORT
Export a class or function from the library.