10 #include <QStringBuilder>
11 #include <QStringList>
19 using namespace swift::misc::physical_quantities;
21 namespace swift::misc::simulation
25 if (cg.
isNull() || modelString.isEmpty()) {
return; }
26 m_modelStringVsCG.insert(modelString.toUpper(), cg);
29 void CAutoPublishData::insert(
const QString &modelString,
const CSimulatorInfo &simulator)
32 m_modelStringVsSimulatorInfo.insert(modelString.toUpper(), simulator);
35 void CAutoPublishData::clear()
37 m_modelStringVsCG.clear();
38 m_modelStringVsSimulatorInfo.clear();
41 bool CAutoPublishData::isEmpty()
const
43 return m_modelStringVsCG.isEmpty() && m_modelStringVsSimulatorInfo.isEmpty();
46 QString CAutoPublishData::toDatabaseJson()
const
53 json += QStringLiteral(
"{ \"type\": \"cg\", \"modelstring\": \"%1\", \"cgft\": %2 },\n")
57 for (
const auto [
string, sim] :
makePairsRange(m_modelStringVsSimulatorInfo))
60 QStringLiteral(
"{ \"type\": \"simulatorupdate\", \"modelstring\": \"%1\", \"simulator\": \"%2\" },\n")
61 .arg(
string, sim.toQString(
false));
64 if (json.isEmpty()) {
return {}; }
66 return u
"[\n" % json % u
"\n]\n";
69 int CAutoPublishData::fromDatabaseJson(
const QString &jsonData,
bool clear)
71 if (clear) { this->clear(); }
72 if (jsonData.isEmpty()) {
return 0; }
74 if (array.isEmpty()) {
return 0; }
76 for (
const QJsonValue &value : array)
78 const QJsonObject obj = value.toObject();
79 const QString t = obj[
"type"].toString();
80 const QString m = obj[
"modelstring"].toString();
81 if (m.isEmpty()) {
continue; }
83 if (t.startsWith(
"simulator", Qt::CaseInsensitive))
85 const QString simulator = obj[
"simulator"].toString();
89 else if (t.startsWith(
"cg", Qt::CaseInsensitive))
91 const double cgFt = obj[
"cgft"].toDouble(-1);
92 if (cgFt < 0) {
continue; }
97 return m_modelStringVsCG.size() + m_modelStringVsSimulatorInfo.size();
100 bool CAutoPublishData::writeJsonToFile()
const
102 if (this->isEmpty()) {
return false; }
104 fileBaseName() % u
'_' % QDateTime::currentDateTimeUtc().toString(
"yyyyMMddHHmmss") % fileAppendix();
108 bool CAutoPublishData::writeJsonToFile(
const QString &pathAndFile)
const
110 if (this->isEmpty()) {
return false; }
111 const QString json = this->toDatabaseJson();
115 bool CAutoPublishData::readFromJsonFile(
const QString &fileAndPath,
bool clear)
118 if (json.isEmpty()) {
return false; }
119 this->fromDatabaseJson(json, clear);
123 int CAutoPublishData::readFromJsonFiles(
const QString &dirPath)
125 const QStringList fileList = findAndCleanupPublishFiles(dirPath);
126 if (fileList.isEmpty()) {
return 0; }
130 for (
const QString &file : fileList)
148 for (
const QString &modelString : m_modelStringVsCG.keys())
153 if (dbModel.
getCG() == m_modelStringVsCG[modelString]) { unchangedCG.
insert(modelString); }
158 for (
const QString &modelString : m_modelStringVsSimulatorInfo.keys())
165 unchangedSim.
insert(modelString);
173 QList<QString> unchangedCGList = std::move(unchangedCG);
175 << unchangedCGList.size());
176 for (
const QString &m : unchangedCGList) { m_modelStringVsCG.remove(m); }
181 QList<QString> unchangedSimList = std::move(unchangedSim);
183 << unchangedSimList.size());
184 for (
const QString &m : unchangedSimList) { m_modelStringVsSimulatorInfo.remove(m); }
191 QString CAutoPublishData::getSummary()
const
193 return QStringLiteral(
"Changed CGs: %1 | sim.entries: %2")
194 .arg(m_modelStringVsCG.size())
195 .arg(m_modelStringVsSimulatorInfo.size());
198 QSet<QString> CAutoPublishData::allModelStrings()
const
200 QSet<QString> allStrings(m_modelStringVsCG.keyBegin(), m_modelStringVsCG.keyEnd());
201 allStrings.unite(QSet<QString>(m_modelStringVsSimulatorInfo.keyBegin(), m_modelStringVsSimulatorInfo.keyEnd()));
205 void CAutoPublishData::testData()
213 this->insert(
"testModelString1", cg1);
214 this->insert(
"testModelString2", cg2);
215 this->insert(
"testModelString3", cg3);
217 this->insert(
"testModelString1", CSimulatorInfo::fs9());
218 this->insert(
"testModelString2", CSimulatorInfo::xplane());
219 this->insert(
"testModelString3", CSimulatorInfo::fg());
220 this->insert(
"testModelString4", CSimulatorInfo::p3d());
221 this->insert(
"testModelString5", CSimulatorInfo::fsx());
222 this->insert(
"testModelString6", CSimulatorInfo::fsx());
223 this->insert(
"testModelString7", CSimulatorInfo::msfs());
224 this->insert(
"testModelString8", CSimulatorInfo::msfs2024());
227 const QString &CAutoPublishData::fileBaseName()
229 static const QString fn(
"autopublish");
233 const QString &CAutoPublishData::fileAppendix()
235 static const QString a(
".json");
239 bool CAutoPublishData::existAutoPublishFiles(
const QString &dirPath)
241 return findAndCleanupPublishFiles(dirPath).size() > 0;
244 int CAutoPublishData::deleteAutoPublishFiles(
const QString &dirPath)
246 const QStringList fileList = findAndCleanupPublishFiles(dirPath);
247 if (fileList.isEmpty()) {
return 0; }
250 for (
const QString &file : fileList)
254 if (!f.exists()) {
continue; }
255 if (f.remove()) { c++; }
260 QStringList CAutoPublishData::findAndCleanupPublishFiles(
const QString &dirPath)
263 if (!dir.exists()) {
return {}; }
265 const QString filter = fileBaseName() % u
'*' % fileAppendix();
266 const QStringList filters({ filter });
267 dir.setNameFilters(filters);
268 dir.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);
269 const QStringList fileList = dir.entryList();
270 if (fileList.isEmpty()) {
return fileList; }
273 QStringList correctedList;
274 const QDateTime deadline = QDateTime::currentDateTimeUtc().addDays(-30);
275 for (
const QString &fn : fileList)
279 if (!fi.exists()) {
continue; }
280 const QDateTime created = fi.birthTime().toUTC();
281 if (deadline < created) { correctedList << fn; }
284 QFile deleteFile(fn);
289 return correctedList;
static bool writeStringToFile(const QString &content, const QString &fileNameAndPath)
Write string to text file.
static QString appendFilePathsAndFixUnc(const QString &path1, const QString &path2)
Append file paths.
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 & webservice()
Webservice.
static const QString & mapping()
Mapping.
A sequence of log categories.
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
Derived & validationWarning(const char16_t(&format)[N])
Set the severity to warning, providing a format string, and adding the validation category.
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.
bool isEmpty() const
Synonym for empty.
Build a QSet more efficiently when calling insert() in a for loop.
bool isEmpty() const
True if no elements have been inserted.
void insert(const T &value)
Add an element to the set. Runs in amortized constant time.
Streamable status message, e.g.
Status messages, e.g. from Core -> GUI.
static const QString & logDirectory()
Directory for log files.
bool hasValidDbKey() const
Has valid DB key.
Physical unit length (length)
static CLengthUnit ft()
Foot ft.
bool isNull() const
Is quantity null?
Aircraft model (used by another pilot, my models on disk)
CSimulatorInfo getSimulator() const
Simulator info.
const physical_quantities::CLength & getCG() const
Get center of gravity.
Value object encapsulating a list of aircraft models.
CAircraftModel findFirstByModelStringOrDefault(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find first by model string.
Simple hardcoded info about the corresponding simulator.
bool isSingleSimulator() const
Single simulator selected.
bool matchesAny(const CSimulatorInfo &otherInfo) const
Matches any simulator.
QJsonArray jsonArrayFromString(const QString &json)
JSON Array from string.
auto makePairsRange(const T &container)
Returns a const CRange for iterating over the keys and values of a Qt associative container.