10 #include <QStringBuilder>
11 #include <QStringList>
19 using namespace swift::misc::physical_quantities;
21 namespace swift::misc::simulation
26 m_modelStringVsCG.insert(modelString.
toUpper(), cg);
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; }
79 const QString t = obj[
"type"].toString();
80 const QString m = obj[
"modelstring"].toString();
85 const QString simulator = obj[
"simulator"].toString();
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; }
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);
175 << unchangedCGList.
size());
176 for (
const QString &m : unchangedCGList) { m_modelStringVsCG.remove(m); }
183 << unchangedSimList.
size());
184 for (
const QString &m : unchangedSimList) { m_modelStringVsSimulatorInfo.remove(m); }
193 return QStringLiteral(
"Changed CGs: %1 | sim.entries: %2")
194 .
arg(m_modelStringVsCG.size())
195 .
arg(m_modelStringVsSimulatorInfo.size());
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; }
263 if (!dir.exists()) {
return {}; }
265 const QString filter = fileBaseName() % u
'*' % fileAppendix();
267 dir.setNameFilters(filters);
270 if (fileList.
isEmpty()) {
return fileList; }
275 for (
const QString &fn : fileList)
279 if (!fi.exists()) {
continue; }
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.
QDateTime addDays(qint64 ndays) const const
QDateTime currentDateTimeUtc()
QString toString(QStringView format) const const
QDateTime toUTC() const const
bool exists(const QString &fileName)
bool isEmpty() const const
bool isEmpty() const const
qsizetype size() const const
QSet< T > & unite(QSet< T > &&other)
QString arg(Args &&... args) const const
bool isEmpty() const const
qsizetype size() const const
bool startsWith(QChar c, Qt::CaseSensitivity cs) const const
QString toUpper() const const