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(
"testModelString2", CSimulatorInfo::xplane());
218 this->insert(
"testModelString3", CSimulatorInfo::fg());
219 this->insert(
"testModelString4", CSimulatorInfo::p3d());
220 this->insert(
"testModelString7", CSimulatorInfo::msfs());
221 this->insert(
"testModelString8", CSimulatorInfo::msfs2024());
224 const QString &CAutoPublishData::fileBaseName()
226 static const QString fn(
"autopublish");
230 const QString &CAutoPublishData::fileAppendix()
232 static const QString a(
".json");
236 bool CAutoPublishData::existAutoPublishFiles(
const QString &dirPath)
238 return findAndCleanupPublishFiles(dirPath).
size() > 0;
241 int CAutoPublishData::deleteAutoPublishFiles(
const QString &dirPath)
243 const QStringList fileList = findAndCleanupPublishFiles(dirPath);
244 if (fileList.
isEmpty()) {
return 0; }
247 for (
const QString &file : fileList)
251 if (!f.
exists()) {
continue; }
260 if (!dir.exists()) {
return {}; }
262 const QString filter = fileBaseName() % u
'*' % fileAppendix();
264 dir.setNameFilters(filters);
267 if (fileList.
isEmpty()) {
return fileList; }
272 for (
const QString &fn : fileList)
276 if (!fi.exists()) {
continue; }
278 if (deadline < created) { correctedList << fn; }
281 QFile deleteFile(fn);
286 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