swift
aircraftmodel.h
Go to the documentation of this file.
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 #ifndef SWIFT_MISC_SIMULATION_AIRCRAFTMODEL_H
7 #define SWIFT_MISC_SIMULATION_AIRCRAFTMODEL_H
8 
9 #include <tuple>
10 
11 #include <QDir>
12 #include <QFileInfo>
13 #include <QFlags>
14 #include <QHash>
15 #include <QJsonDocument>
16 #include <QJsonObject>
17 #include <QMetaType>
18 #include <QStringList>
19 #include <Qt>
20 
23 #include "misc/aviation/callsign.h"
24 #include "misc/aviation/livery.h"
25 #include "misc/db/datastore.h"
26 #include "misc/dictionary.h"
27 #include "misc/memotable.h"
28 #include "misc/metaclass.h"
29 #include "misc/orderable.h"
30 #include "misc/pixmap.h"
31 #include "misc/pq/length.h"
32 #include "misc/propertyindexref.h"
36 #include "misc/statusmessagelist.h"
37 #include "misc/swiftmiscexport.h"
38 #include "misc/valueobject.h"
39 
40 SWIFT_DECLARE_VALUEOBJECT_MIXINS(swift::misc::Simulation, CAircraftModel)
41 
42 namespace swift::misc
43 {
44  class CIcon;
45 
46  namespace simulation
47  {
49  struct DBTripleIds
50  {
51  int model = -1;
52  int livery = -1;
53  int aircraft = -1;
54 
56  bool hasAnyId() const { return model >= 0 || livery >= 0 || aircraft >= 0; }
57 
59  QString toQString() const
60  {
61  return QStringLiteral("Model: %1 Livery: %2 Aircraft: %3").arg(model).arg(livery).arg(aircraft);
62  }
63  };
64 
68  public CValueObject<CAircraftModel>,
69  public db::IDatastoreObjectWithIntegerKey, // also ITimestampBased
70  public IOrderable
71  {
72  public:
74  enum ModelType
75  {
76  TypeUnknown,
86  TypeTerrainProbe
87  };
88 
91  enum ModelMode
92  {
93  Undefined = 0,
94  Include = 1 << 0,
95  Exclude = 1 << 1,
96  All = Include | Exclude
97  };
98 
100  Q_DECLARE_FLAGS(ModelModeFilter, ModelMode)
101 
102 
104  {
105  IndexModelString = CPropertyIndexRef::GlobalIndexCAircraftModel,
106  IndexModelStringAlias,
108  IndexCallsign,
109  IndexName,
110  IndexDescription,
111  IndexSimulatorInfo,
112  IndexSimulatorInfoAsString,
113  IndexAircraftIcaoCode,
114  IndexLivery,
115  IndexCG,
116  IndexDistributor,
117  IndexFileName,
118  IndexFileTimestamp,
119  IndexFileTimestampFormattedYmdhms,
120  IndexModelType,
121  IndexModelTypeAsString,
122  IndexModelMode,
123  IndexModelModeAsString,
124  IndexSupportedParts,
125  IndexModelModeAsIcon,
126  IndexHasQueriedModelString,
127  IndexMembersDbStatus
128  };
129 
131  static void registerMetadata();
132 
135 
137  CAircraftModel(const QString &model, ModelType type);
138 
140  CAircraftModel(const QString &model, ModelType type, const aviation::CAircraftIcaoCode &icao,
141  const aviation::CLivery &livery);
142 
144  CAircraftModel(const QString &model, ModelType type, const QString &description,
145  const aviation::CAircraftIcaoCode &icao,
146  const aviation::CLivery &livery = aviation::CLivery());
147 
149  CAircraftModel(const QString &model, ModelType type, const CSimulatorInfo &simulator, const QString &name,
150  const QString &description);
151 
153  CAircraftModel(const QString &model, ModelType type, const CSimulatorInfo &simulator, const QString &name,
154  const QString &description, const aviation::CAircraftIcaoCode &icao,
155  const aviation::CLivery &livery = aviation::CLivery());
156 
158  QVariant propertyByIndex(CPropertyIndexRef index) const;
159 
161  void setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant);
162 
164  int comparePropertyByIndex(CPropertyIndexRef index, const CAircraftModel &compareValue) const;
165 
167  QString convertToQString(bool i18n = false) const;
168 
170  bool canInitializeFromFsd() const;
171 
173  const aviation::CCallsign &getCallsign() const { return m_callsign; }
174 
176  void setCallsign(const aviation::CCallsign &callsign);
177 
179  bool isCallsignEmpty() const { return m_callsign.isEmpty(); }
180 
182  const QString &getModelString() const { return m_modelString; }
183 
185  QString getModelStringAndDbKey() const;
186 
188  void setModelString(const QString &modelString) { m_modelString = modelString.trimmed().toUpper(); }
189 
191  const QString &getModelStringAlias() const { return m_modelStringAlias; }
192 
194  QString getAllModelStringsAndAliases() const;
195 
197  QString getAllModelStringsAliasesAndDbKey() const;
198 
200  void setModelStringAlias(const QString &alias) { m_modelStringAlias = alias.trimmed().toUpper(); }
201 
203  const QString &getDescription() const { return m_description; }
204 
206  void setDescription(const QString &description) { m_description = description.trimmed(); }
207 
209  void setQueriedModelString(const QString &model)
210  {
211  m_modelString = model;
212  m_modelType = TypeQueriedFromNetwork;
213  }
214 
216  const aviation::CAircraftIcaoCode &getAircraftIcaoCode() const { return m_aircraftIcao; }
217 
219  int getEngineCount() const { return m_aircraftIcao.getEnginesCount(); }
220 
222  const QString &getAircraftIcaoCodeDesignator() const { return m_aircraftIcao.getDesignator(); }
223 
225  bool isVtol() const;
226 
228  const aviation::CAirlineIcaoCode &getAirlineIcaoCode() const { return m_livery.getAirlineIcaoCode(); }
229 
231  bool setAirlineIcaoDesignator(const QString &designator)
232  {
233  return m_livery.setAirlineIcaoCodeDesignator(designator);
234  }
235 
237  const QString &getAirlineIcaoCodeDesignator() const
238  {
239  return m_livery.getAirlineIcaoCode().getDesignator();
240  }
241 
243  const QString getAirlineIcaoCodeVDesignator() const
244  {
245  return m_livery.getAirlineIcaoCode().getVDesignator();
246  }
247 
249  bool setAircraftIcaoCode(const aviation::CAircraftIcaoCode &aircraftIcaoCode);
250 
252  void setAircraftIcaoDesignator(const QString &designator);
253 
255  void setAircraftIcaoCodes(const aviation::CAircraftIcaoCode &aircraftIcaoCode,
256  const aviation::CAirlineIcaoCode &airlineIcaoCode);
257 
259  bool hasValidAircraftAndAirlineDesignator() const;
260 
262  bool hasAircraftDesignator() const;
263 
265  bool hasKnownAircraftDesignator() const;
266 
268  bool hasCategory() const;
269 
271  bool hasAirlineDesignator() const;
272 
274  bool hasAircraftAndAirlineDesignator() const;
275 
277  bool isMilitary() const;
278 
280  bool isCivilian() const;
281 
283  const aviation::CLivery &getLivery() const { return m_livery; }
284 
286  void setLivery(const aviation::CLivery &livery) { m_livery = livery; }
287 
289  bool hasLivery() const { return m_livery.hasCompleteData(); }
290 
292  const CDistributor &getDistributor() const { return m_distributor; }
293 
295  int getDistributorOrder() const { return m_distributor.getOrder(); }
296 
298  void setDistributor(const CDistributor &distributor) { m_distributor = distributor; }
299 
301  bool setDistributorOrder(int order);
302 
304  bool setDistributorOrder(const CDistributorList &distributors);
305 
307  bool hasDbDistributor() const;
308 
310  bool hasDistributor() const;
311 
313  bool matchesDbDistributor(const CDistributor &distributor) const;
314 
316  bool matchesAnyDbDistributor(const CDistributorList &distributors) const;
317 
319  const QString &getName() const { return m_name; }
320 
322  void setName(const QString &name) { m_name = name.trimmed(); }
323 
325  const physical_quantities::CLength &getCG() const { return m_cg; }
326 
328  void setCG(const physical_quantities::CLength &cg) { m_cg = cg; }
329 
331  bool hasCG() const { return !m_cg.isNull(); }
332 
334  const QString &getSupportedParts() const { return m_supportedParts; }
335 
337  void setSupportedParts(const QString &supportedParts);
338 
340  ModelType getModelType() const { return m_modelType; }
341 
343  bool isTerrainProbe() const { return m_modelType == TypeTerrainProbe; }
344 
346  const QString &getModelTypeAsString() const { return modelTypeToString(getModelType()); }
347 
349  void setModelType(ModelType type) { m_modelType = type; }
350 
352  ModelMode getModelMode() const { return m_modelMode; }
353 
355  bool matchesMode(simulation::CAircraftModel::ModelModeFilter mode) const;
356 
358  const QString &getModelModeAsString() const { return modelModeToString(getModelMode()); }
359 
361  const CIcon &getModelModeAsIcon() const;
362 
364  void setModelMode(ModelMode mode) { m_modelMode = mode; }
365 
367  void setModelModeAsString(const QString &mode);
368 
370  CSimulatorInfo getSimulator() const { return m_simulator; }
371 
373  void setSimulator(const CSimulatorInfo &simulator) { m_simulator = simulator; }
374 
376  bool matchesSimulator(const CSimulatorInfo &simulator) const;
377 
379  bool matchesSimulatorFlag(CSimulatorInfo::Simulator simulator) const;
380 
383  QString getSwiftLiveryString(bool aircraftIcao = true, bool livery = true, bool model = true) const;
384 
386  QString getSwiftLiveryString(const CSimulatorInfo &sim) const;
387 
389  void updateMissingParts(const CAircraftModel &otherModel, bool dbModelPriority = true);
390 
393  void updateByExistingDirectories(const CAircraftModel &otherModel);
394 
396  bool hasQueriedModelString() const;
397 
399  bool hasManuallySetString() const;
400 
402  bool hasModelString() const { return !m_modelString.isEmpty(); }
403 
405  bool hasModelStringAlias() const { return !m_modelStringAlias.isEmpty(); }
406 
408  bool hasAnyModelString() const { return this->hasModelString() || this->hasModelStringAlias(); }
409 
411  bool hasDescription(bool ignoreAutoGenerated = false) const;
412 
414  bool hasValidSimulator() const;
415 
417  QString getMembersDbStatus() const;
418 
420  bool matchesModelString(const QString &modelString, Qt::CaseSensitivity sensitivity) const;
421 
423  bool matchesModelStringOrAlias(const QString &modelString, Qt::CaseSensitivity sensitivity) const;
424 
426  int calculateScore(const CAircraftModel &compareModel, bool preferColorLiveries,
427  CStatusMessageList *log = nullptr) const;
428 
430  CStatusMessageList validate(bool withNestedObjects) const;
431 
433  bool isEqualForPublishing(const CAircraftModel &dbModel, CStatusMessageList *details = nullptr) const;
434 
437 
439  QJsonObject toMemoizedJson(MemoHelper::CMemoizer &) const;
440 
442  void convertFromMemoizedJson(const QJsonObject &json, const MemoHelper::CUnmemoizer &);
443 
445  QJsonObject toDatabaseJson() const;
446 
448  QString toDatabaseJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Compact) const;
449 
451  QString asHtmlSummary(const QString &separator = "<br>") const;
452 
453  // ---------------- simulator file related functions -------------------
454 
457  const QString &getFileName() const { return m_fileName; }
458 
460  QString getFileNameLowerCase() const { return m_fileName.toLower(); }
461 
463  bool hasFileName() const { return !m_fileName.isEmpty(); }
464 
466  bool matchesFileName(const QString &fileName) const;
467 
469  bool hasExistingCorrespondingFile() const;
470 
472  QDir getFileDirectory() const;
473 
475  QString getFileDirectoryPath() const;
476 
478  bool isInPath(const QString &path, Qt::CaseSensitivity cs) const;
479 
481  void setFileName(const QString &fileName) { m_fileName = fileName; }
482 
484  QDateTime getFileTimestamp() const;
485 
487  QString getFormattedFileTimestampYmdhms() const;
488 
490  bool hasValidFileTimestamp() const;
491 
493  void setFileTimestamp(const QDateTime &timestampUtc);
494 
496  void setFileTimestamp(qint64 timestamp);
497 
499  void setFileDetailsAndTimestamp(const QFileInfo &fileInfo);
500 
502  void normalizeFileNameForDb();
503 
506  void updateLocalFileNames(const CAircraftModel &model);
507 
509  bool adjustLocalFileNames(const QString &newModelDir, const QString &stripModelDirIndicator = {});
510 
511  // ---------------- end file related functions --------------
512 
514  CStatusMessageList verifyModelData() const;
515 
517  static const QString &modelTypeToString(ModelType type);
518 
520  static QString normalizeFileNameForDb(const QString &filePath);
521 
523  static ModelMode modelModeFromString(const QString &mode);
524 
526  static const QString &modelModeToString(ModelMode mode);
527 
529  static CAircraftModel fromDatabaseJson(const QJsonObject &json, const QString &prefix = QString("mod_"));
530 
532  static CAircraftModel
533  fromDatabaseJsonCaching(const QJsonObject &json, aviation::AircraftIcaoIdMap &aircraftIcaos,
534  const aviation::AircraftCategoryIdMap &categories, aviation::LiveryIdMap &liveries,
535  DistributorIdMap &distributors, const QString &prefix = QString("mod_"));
536 
538  static const QString &liveryStringPrefix();
539 
541  static bool isSwiftLiveryString(const QString &liveryString);
542 
545  static DBTripleIds parseNetworkLiveryString(const QString &liveryString);
546 
548  static const QString &autoGenerated();
549 
551  static QString cleanUpPartsString(const QString &p);
552 
555  static const QString &supportedParts();
556 
557  private:
559  static CAircraftModel fromDatabaseJsonBaseImpl(const QJsonObject &json, const QString &prefix,
560  const aviation::CAircraftIcaoCode &aircraftIcao,
561  const aviation::CLivery &livery,
562  const CDistributor &distributor);
563 
564  aviation::CCallsign m_callsign;
565  aviation::CAircraftIcaoCode m_aircraftIcao;
566  aviation::CLivery m_livery;
567  CSimulatorInfo m_simulator;
568  CDistributor m_distributor;
569  QString m_modelString;
570  QString m_modelStringAlias;
571  QString m_name;
572  QString m_description;
573  QString m_fileName;
574  QString m_supportedParts;
575  qint64 m_fileTimestamp = -1;
576  ModelType m_modelType = TypeUnknown;
577  ModelMode m_modelMode = Include;
579 
581  CAircraftModel,
582  SWIFT_METAMEMBER(dbKey),
583  SWIFT_METAMEMBER(timestampMSecsSinceEpoch),
584  SWIFT_METAMEMBER(order),
585  SWIFT_METAMEMBER(callsign),
586  SWIFT_METAMEMBER(aircraftIcao),
587  SWIFT_METAMEMBER(livery),
588  SWIFT_METAMEMBER(simulator),
589  SWIFT_METAMEMBER(distributor),
590  SWIFT_METAMEMBER(cg),
591  SWIFT_METAMEMBER(supportedParts),
593  SWIFT_METAMEMBER(modelStringAlias, 0, CaseInsensitiveComparison),
594  SWIFT_METAMEMBER(name),
595  SWIFT_METAMEMBER(description, 0, DisabledForComparison),
597  SWIFT_METAMEMBER(fileTimestamp, 0, DisabledForComparison),
598  SWIFT_METAMEMBER(modelType),
599  SWIFT_METAMEMBER(modelMode));
600  };
601  } // namespace simulation
602 } // namespace swift::misc
603 
604 Q_DECLARE_METATYPE(swift::misc::simulation::CAircraftModel)
607 Q_DECLARE_METATYPE(swift::misc::simulation::CAircraftModel::ModelModeFilter)
608 Q_DECLARE_OPERATORS_FOR_FLAGS(swift::misc::simulation::CAircraftModel::ModelModeFilter)
609 
610 #endif // SWIFT_MISC_SIMULATION_AIRCRAFTMODEL_H
Value object for icons. An icon is stored in the global icon repository and identified by its index....
Definition: icon.h:39
Memoizer for Ts. Other types are passed through.
Definition: memotable.h:49
Unmemoizer for Ts. Other types are passed through.
Definition: memotable.h:69
Non-owning reference to a CPropertyIndex with a subset of its features.
Status messages, e.g. from Core -> GUI.
Mix of the most commonly used mixin classes.
Definition: valueobject.h:114
Entity with order attribute (can be manually ordered in views)
Definition: orderable.h:19
Value object for ICAO classification.
Value object for ICAO classification.
Value object encapsulating information of a callsign.
Definition: callsign.h:30
Value object encapsulating information about an airpot.
Definition: livery.h:29
Class from which a derived class can inherit datastore-related functions.
Definition: datastore.h:70
Physical unit length (length)
Definition: length.h:18
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
bool isTerrainProbe() const
Terrain probe?
const aviation::CCallsign & getCallsign() const
Corresponding callsign if applicable.
void setName(const QString &name)
Name.
ModelMode getModelMode() const
Model mode.
const aviation::CAirlineIcaoCode & getAirlineIcaoCode() const
Airline ICAO code.
const QString & getSupportedParts() const
Supported parts.
void setModelType(ModelType type)
Set type.
bool hasModelStringAlias() const
Non empty model string alias?
void setModelStringAlias(const QString &alias)
Model string alias.
const aviation::CLivery & getLivery() const
Get livery.
void setQueriedModelString(const QString &model)
Set queried model string.
ModelMode
Mode, decides if a model is supposed to be used in the model set for model matching or not....
Definition: aircraftmodel.h:92
void setModelString(const QString &modelString)
Model string.
const QString & getAircraftIcaoCodeDesignator() const
Aircraft ICAO code designator.
CSimulatorInfo getSimulator() const
Simulator info.
@ TypeModelMatchingDefaultModel
a default model assigned by model matching
Definition: aircraftmodel.h:81
@ TypeFSInnData
model based on FSD ICAO data
Definition: aircraftmodel.h:78
@ TypeVPilotRuleBased
based on a vPilot rule
Definition: aircraftmodel.h:85
@ TypeQueriedFromNetwork
model was queried by network protocol (ICAO data)
Definition: aircraftmodel.h:77
@ TypeOwnSimulatorModel
represents own simulator model (AI model, model on disk)
Definition: aircraftmodel.h:84
@ TypeDatabaseEntry
used along with mapping definition
Definition: aircraftmodel.h:82
@ TypeReverseLookup
reverse lookup model
Definition: aircraftmodel.h:79
@ TypeModelMatching
model is result of model matching
Definition: aircraftmodel.h:80
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
bool isCallsignEmpty() const
Callsign empty.
void setFileName(const QString &fileName)
File name.
const physical_quantities::CLength & getCG() const
Get center of gravity.
const QString & getName() const
Name.
const QString & getModelModeAsString() const
Model mode as string.
const QString & getDescription() const
Descriptive text.
void setDescription(const QString &description)
Descriptive text.
void setSimulator(const CSimulatorInfo &simulator)
Set simulator info.
void setCG(const physical_quantities::CLength &cg)
Get center of gravity.
bool hasLivery() const
Livery available?
int getDistributorOrder() const
Get distributor`s order value.
const CDistributor & getDistributor() const
Get distributor.
const aviation::CAircraftIcaoCode & getAircraftIcaoCode() const
Aircraft ICAO code.
int getEngineCount() const
Engine count if any, -1 if no value is set.
ModelType getModelType() const
Model type.
const QString & getModelTypeAsString() const
Model type.
const QString & getModelStringAlias() const
Model key, either queried or loaded from simulator model.
const QString getAirlineIcaoCodeVDesignator() const
Airline ICAO code designator.
QString getFileNameLowerCase() const
File name as lower case.
const QString & getAirlineIcaoCodeDesignator() const
Airline ICAO code designator.
void setModelMode(ModelMode mode)
Set model mode.
bool setAirlineIcaoDesignator(const QString &designator)
Set airline ICAO code designator.
bool hasCG() const
CG value available?
bool hasAnyModelString() const
Any model string or alias?
bool hasModelString() const
Non empty model string?
void setLivery(const aviation::CLivery &livery)
Livery.
void setDistributor(const CDistributor &distributor)
Set distributor.
const QString & getFileName() const
File name (corresponding data for simulator, only available if representing simulator model.
Value object encapsulating information of software distributor.
Definition: distributor.h:33
Value object encapsulating a list of distributors.
Simple hardcoded info about the corresponding simulator.
Definition: simulatorinfo.h:41
#define SWIFT_METAMEMBER(MEMBER,...)
Macro to define an element within a metaclass.
Definition: metaclass.h:73
#define SWIFT_METACLASS(CLASS,...)
Macro to define a nested metaclass that describes the attributes of its enclosing class.
Definition: metaclass.h:53
@ CaseInsensitiveComparison
Element will be compared case insensitively (must be a QString)
Definition: metaclass.h:207
@ DisabledForComparison
Element will be ignored by compare() and comparison operators.
Definition: metaclass.h:202
Free functions in swift::misc.
void registerMetadata()
Register all relevant metadata in Misc.
Helper class for memoizing members of a value object.
Definition: memotable.h:46
QString toQString() const
Return as string.
Definition: aircraftmodel.h:59
int livery
livery id, by that I have airline id
Definition: aircraftmodel.h:52
bool hasAnyId() const
Any valid id?
Definition: aircraftmodel.h:56
#define SWIFT_MISC_EXPORT
Export a class or function from the library.
#define SWIFT_DECLARE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template declaration of mixins for a CValueObject subclass to be placed near the top of the ...
Definition: valueobject.h:65