6 #include <QElapsedTimer>
15 using namespace swift::misc::json;
16 using namespace swift::misc::aviation;
17 using namespace swift::misc::simulation;
21 const QStringList &CDatabaseUtils::getLogCategories()
30 bool myModified =
false;
31 CAircraftModel ownModel = CDatabaseUtils::consolidateModelWithDbData(model, force, &myModified);
40 if (ownModel.
getModelType() != CAircraftModel::TypeOwnSimulatorModel)
42 ownModel.
setModelType(CAircraftModel::TypeOwnSimulatorModel);
45 if (modified) { *modified = myModified; }
51 if (modified) { *modified =
false; }
53 if (!hasDbAircraftData()) {
return model; }
56 return CDatabaseUtils::consolidateModelWithDbData(model, dbModel, force, modified);
62 Q_ASSERT_X(
sApp, Q_FUNC_INFO,
"Missing application object");
65 if (modified) { *modified =
false; }
73 if (modified) { *modified =
true; }
78 return dbModelModified;
89 if (modified) { *modified =
true; }
100 if (modified) { *modified =
true; }
109 if (modified) { *modified =
true; }
114 return consolidatedModel;
119 return CDatabaseUtils::consolidateModelsWithDbDataAllowsGuiRefresh(models, force,
false);
128 bool changed =
false;
129 if (model.getLivery().hasValidDbKey() && !model.getLivery().hasCompleteData())
134 model.setLivery(livery);
138 if (model.getAircraftIcaoCode().hasValidDbKey() && !model.getAircraftIcaoCode().hasCompleteData())
144 model.setAircraftIcaoCode(icao);
148 if (model.getDistributor().hasValidDbKey() && !model.getDistributor().hasCompleteData())
154 model.setDistributor(distributor);
158 if (changed) { c++; }
167 if (models.
isEmpty() || simulatorModels.
isEmpty()) {
return models; }
171 const QSet<QString> allOwnModelsModelStrings = simulatorModels.
getModelStringSet();
173 removedModelStrings.
clear();
179 if (processEvents && c % 125 == 0)
185 const QString ms(model.getModelString());
186 if (ms.isEmpty()) {
continue; }
187 if (!allOwnModelsModelStrings.contains(ms))
189 removedModelStrings.push_back(ms);
195 CDatabaseUtils::consolidateModelWithDbData(consolidated,
true);
196 consolidatedModels.
push_back(consolidated);
198 else { consolidatedModels.
push_back(model); }
201 << models.
size() << simulatorModels.
size() << timer.elapsed() <<
"ms";
202 return consolidatedModels;
208 QStringList &removedModelStrings,
bool processEvents)
210 if (models.
isEmpty() || simulatorModels.
isEmpty()) {
return models; }
214 const QSet<QString> allOwnModelsModelStrings = simulatorModels.
getModelStringSet();
216 removedModelStrings.
clear();
222 if (processEvents && c % 125 == 0)
228 const QString ms(model.getModelString());
229 if (ms.isEmpty()) {
continue; }
230 if (!allOwnModelsModelStrings.contains(ms))
232 removedModelStrings.push_back(ms);
241 consolidatedModels.
push_back(consolidated);
249 else { consolidatedModels.
push_back(model); }
252 << models.
size() << simulatorModels.
size() << timer.elapsed() <<
"ms";
253 return consolidatedModels;
256 int CDatabaseUtils::consolidateModelsWithDbDataAllowsGuiRefresh(
CAircraftModelList &models,
bool force,
262 if (models.
isEmpty()) {
return c; }
265 if (!force && model.isLoadedFromDb()) {
continue; }
266 bool modified =
false;
267 model = CDatabaseUtils::consolidateModelWithDbData(model, force, &modified);
268 if (modified || model.hasValidDbKey())
275 << models.
size() << timer.elapsed();
282 if (dbModels.
isEmpty() || simulatorModels.
isEmpty()) {
return 0; }
291 const QString ms(model.getModelString());
292 if (ms.isEmpty()) {
continue; }
293 if (!dbModelsModelStrings.contains(ms)) {
continue; }
294 bool modified =
false;
295 const CAircraftModel consolidated = CDatabaseUtils::consolidateModelWithDbData(
297 if (!modified) {
continue; }
298 model = consolidated;
302 << simulatorModels.
size() << timer.elapsed();
306 int CDatabaseUtils::consolidateModelsWithDbModelAndDistributor(
CAircraftModelList &models,
bool force)
309 if (models.
isEmpty()) {
return c; }
312 if (!force && model.hasValidDbKey()) {
continue; }
322 if (distributor.
isLoadedFromDb()) { model.setDistributor(distributor); }
341 if (models.
isEmpty()) {
return c; }
344 if (model.hasValidDbKey() || model.getDistributor().hasValidDbKey()) {
continue; }
345 model = CDatabaseUtils::consolidateModelWithDbDistributor(model, force);
346 if (model.getDistributor().hasValidDbKey()) { c++; }
359 if (dbFsFamilyModels.
isEmpty() || ownModels.
isEmpty()) {
return stashModels; }
361 const int maxModelsCount = (maxToStash >= 0) ? maxToStash : ownModels.
size();
362 if (maxModelsCount < 1) {
return stashModels; }
370 if (processEvents && c % 500 == 0)
372 if (progressIndicator)
374 const int percentage = c * 100 / maxModelsCount;
381 if (maxToStash >= 0 && stashModels.
size() > maxToStash) {
break; }
382 if (!dbKeys.contains(ownModel.getModelString())) {
continue; }
383 if (ownModel.matchesSimulatorFlag(CSimulatorInfo::XPLANE)) {
continue; }
393 if (delta.
getSimulator() == CSimulatorInfo::None) {
continue; }
410 QJsonDocument CDatabaseUtils::databaseJsonToQJsonDocument(
const QString &content)
412 static const QString compressed(
"swift:");
413 if (content.isEmpty()) {
return QJsonDocument(); }
415 if (json::looksLikeJson(content))
418 byteData = content.toUtf8();
420 else if (content.startsWith(compressed) && content.length() > compressed.length() + 3)
424 const int cl = compressed.length();
425 const int contentIndex = content.indexOf(
':', cl);
426 if (contentIndex < cl)
break;
427 const QString ls = content.mid(cl, contentIndex - cl);
429 const qint32 size = ls.toInt(&ok);
434 ba.append(content.mid(contentIndex).toUtf8());
435 ba = QByteArray::fromBase64(ba);
437 byteData = qUncompress(ba);
442 if (byteData.isEmpty()) {
return QJsonDocument(); }
443 return QJsonDocument::fromJson(byteData);
446 QJsonDocument CDatabaseUtils::readQJsonDocumentFromDatabaseFile(
const QString &filename)
449 if (raw.isEmpty()) {
return QJsonDocument(); }
450 return CDatabaseUtils::databaseJsonToQJsonDocument(raw);
453 QJsonObject CDatabaseUtils::readQJsonObjectFromDatabaseFile(
const QString &filename)
456 if (raw.isEmpty()) {
return QJsonObject(); }
459 const QJsonDocument jsonDoc = CDatabaseUtils::databaseJsonToQJsonDocument(raw);
460 return jsonDoc.object();
463 QJsonObject CDatabaseUtils::readQJsonObjectFromDatabaseFile(
const QString &directory,
const QString &filename)
468 bool CDatabaseUtils::hasDbAircraftData()
473 const QUrlQuery &CDatabaseUtils::getCompressedQuery()
475 static const QUrlQuery q(
"compressed=true");
479 QHttpPart CDatabaseUtils::getJsonTextMultipart(
const QJsonObject &json,
bool compress)
481 const QByteArray bytes(QJsonDocument(json).toJson(QJsonDocument::Compact));
482 return CDatabaseUtils::getJsonTextMultipart(bytes, compress);
485 QHttpPart CDatabaseUtils::getJsonTextMultipart(
const QString &json,
bool compress)
487 const QByteArray bytes(json.toUtf8());
488 return CDatabaseUtils::getJsonTextMultipart(bytes, compress);
491 QHttpPart CDatabaseUtils::getJsonTextMultipart(
const QJsonArray &json,
bool compress)
493 const QByteArray bytes(QJsonDocument(json).toJson(QJsonDocument::Compact));
494 return CDatabaseUtils::getJsonTextMultipart(bytes, compress);
497 QHttpPart CDatabaseUtils::getJsonTextMultipart(
const QByteArray &bytes,
bool compress)
499 static const QString name(
"form-data; name=\"swiftjson\"");
500 static const QVariant header(name);
502 textPart.setHeader(QNetworkRequest::ContentDispositionHeader, header);
505 QByteArray ba = qCompress(bytes);
507 textPart.setBody(ba);
509 else { textPart.setBody(bytes); }
513 QHttpPart CDatabaseUtils::getMultipartWithDebugFlag()
515 QHttpPart textPartDebug;
516 textPartDebug.setHeader(QNetworkRequest::ContentDispositionHeader,
517 QVariant(
"form-data; name=\"XDEBUG_SESSION_START\""));
518 textPartDebug.setBody(QString(
"ECLIPSE_DBGP").toUtf8());
519 return textPartDebug;
529 return CDatabaseUtils::autoPublishDataChanged(model, cg, simulator);
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
static void processEventsFor(int milliseconds)
Process all events for some time.
bool hasWebDataServices() const
Web data services available?
bool isShuttingDown() const
Is application shutting down?
CWebDataServices * getWebDataServices() const
Get the web data services.
swift::misc::aviation::CAircraftIcaoCode smartAircraftIcaoSelector(const swift::misc::aviation::CAircraftIcaoCode &icao) const
Use an ICAO object to select the best complete ICAO object from DB for it.
swift::misc::simulation::CAircraftModelList getModels() const
Models.
swift::misc::simulation::CDistributorList getDistributors() const
Distributors.
swift::misc::simulation::CAircraftModel getModelForModelString(const QString &modelString) const
Model for model string if any.
swift::misc::aviation::CAircraftIcaoCode getAircraftIcaoCodeForDbKey(int key) const
ICAO code for id.
swift::misc::aviation::CLivery getLiveryForDbKey(int id) const
Livery for id.
bool hasDbAircraftData() const
Are all DB data for an aircraft entity available?
swift::misc::simulation::CDistributor getDistributorForDbKey(const QString &key) const
Distributor for key.
swift::misc::simulation::CDistributor smartDistributorSelector(const swift::misc::simulation::CDistributor &distributor) const
Use distributor object to select the best complete distributor from DB.
swift::misc::aviation::CLivery smartLiverySelector(const swift::misc::aviation::CLivery &livery) const
Use a livery as template and select the best complete livery from DB for it.
Implementing class features a progress bar or something similar.
void updateProgressIndicatorAndProcessEvents(int percentage)
Same as updateProgressIndicator but processing events.
Read information about data from Database.
static QByteArray lengthHeader(qint32 size)
Length header.
static QString appendFilePaths(const QString &path1, const QString &path2)
Append file paths.
static QString readFileToString(const QString &fileNameAndPath)
Read file into string.
static const QString & modelSetCache()
Model set cache.
static const QString & modelCache()
Model cache.
Class for emitting a log message.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
size_type size() const
Returns number of elements in the sequence.
void push_back(const T &value)
Appends an element at the end of the sequence.
void clear()
Removes all elements in the sequence.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
Status messages, e.g. from Core -> GUI.
Value object for ICAO classification.
Value object encapsulating information about an airpot.
bool isLoadedFromDb() const
Loaded from DB.
bool hasValidDbKey() const
Has valid DB key.
bool isLoadedFromDb() const
Loaded from DB.
QString toQString(bool i18n=false) const
Cast as QString.
Physical unit length (length)
Aircraft model (used by another pilot, my models on disk)
bool setDistributorOrder(int order)
Set the distributor order.
bool hasExistingCorrespondingFile() const
Does the corresponding file exist?
void setModelType(ModelType type)
Set type.
const aviation::CLivery & getLivery() const
Get livery.
void updateLocalFileNames(const CAircraftModel &model)
Update file names from local model.
CSimulatorInfo getSimulator() const
Simulator info.
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
void setFileName(const QString &fileName)
File name.
const physical_quantities::CLength & getCG() const
Get center of gravity.
bool hasAircraftDesignator() const
Has aircraft designator?
void setSimulator(const CSimulatorInfo &simulator)
Set simulator info.
int getDistributorOrder() const
Get distributor`s order value.
const CDistributor & getDistributor() const
Get distributor.
const aviation::CAircraftIcaoCode & getAircraftIcaoCode() const
Aircraft ICAO code.
ModelType getModelType() const
Model type.
QString getModelStringAndDbKey() const
Model string and DB key (if available)
bool hasModelString() const
Non empty model string?
void setLivery(const aviation::CLivery &livery)
Livery.
void setDistributor(const CDistributor &distributor)
Set distributor.
bool setAircraftIcaoCode(const aviation::CAircraftIcaoCode &aircraftIcaoCode)
Set aircraft ICAO code.
const QString & getFileName() const
File name (corresponding data for simulator, only available if representing simulator model.
void updateMissingParts(const CAircraftModel &otherModel, bool dbModelPriority=true)
Update missing parts from another model.
Value object encapsulating a list of aircraft models.
QSet< QString > getModelStringSet() const
Model strings as set.
CAircraftModel findFirstByModelStringAliasOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find first by model string.
CAircraftModelList findFsFamilyModels() const
All models of the FS (FSX, P3D, FS9, MSFS) family.
Value object encapsulating information of software distributor.
CDistributor smartDistributorSelector(const CDistributor &distributorPattern) const
Best match by given pattern.
Simple hardcoded info about the corresponding simulator.
CSimulatorInfo add(const CSimulatorInfo &other)
Add simulator.
bool matchesAll(const CSimulatorInfo &otherInfo) const
Matches all simulators.
Simulator getSimulator() const
Simulator.
Classes interacting with the swift database (aka "datastore").
Free functions in swift::misc.
bool changedCG
CG changed.
bool changedSim
simulator changed
bool modelKnown
model known in DB