Formats minimally release source files based on former clang-format

This commit is contained in:
torsten committed 2026-10-14 13:28:01 +00:00
1 parent b662e4daf9
commit 5644914fe3
381 files changed
+12667 -13418

No files matched your search

@@ -1,11 +1,13 @@
// Stub GTest smoke test for coordTrans // Stub GTest smoke test for coordTrans
#include <gtest/gtest.h> #include <gtest/gtest.h>
TEST(CoordTransSmokeTest, StubTest) { TEST(CoordTransSmokeTest, StubTest)
{
EXPECT_TRUE(true); EXPECT_TRUE(true);
} }
int main(int argc, char **argv) { int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv); ::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS(); return RUN_ALL_TESTS();
} }
@@ -6,9 +6,7 @@ class CoordTransSmokeTest : public QObject
Q_OBJECT Q_OBJECT
private slots: private slots:
void stubTest() { void stubTest() { QVERIFY(true); }
QVERIFY(true);
}
}; };
QTEST_APPLESS_MAIN(CoordTransSmokeTest) QTEST_APPLESS_MAIN(CoordTransSmokeTest)
@@ -8,10 +8,12 @@
#include <QtCore/QPointF> #include <QtCore/QPointF>
// Minimal stub to satisfy linker requirements // Minimal stub to satisfy linker requirements
namespace LtsCoordTrans { namespace LtsCoordTrans
{
// Placeholder types // Placeholder types
struct UtmCoordinate { struct UtmCoordinate
static UtmCoordinate fromMgrs(const QString&) { return UtmCoordinate(); } {
static UtmCoordinate fromMgrs(const QString &) { return UtmCoordinate(); }
QPointF geographic() const { return QPointF(); } QPointF geographic() const { return QPointF(); }
}; };
} }
@@ -9,7 +9,7 @@
#include <cstdio> #include <cstdio>
#include <utility> #include <utility>
int main(int argc, char* argv[]) int main(int argc, char *argv[])
{ {
QCoreApplication a(argc, argv); QCoreApplication a(argc, argv);
@@ -28,8 +28,7 @@ int main(int argc, char* argv[])
if (!f.open(QFile::ReadOnly)) if (!f.open(QFile::ReadOnly))
{ {
printf("LtsAppDescriptorChecker: cannot open apps.json at %s: %s\n", appsJsonFilePath.toStdString().c_str(), printf("LtsAppDescriptorChecker: cannot open apps.json at %s: %s\n", appsJsonFilePath.toStdString().c_str(), f.errorString().toStdString().c_str());
f.errorString().toStdString().c_str());
return -2; return -2;
} }
@@ -38,12 +37,12 @@ int main(int argc, char* argv[])
QStringList lastErrors; QStringList lastErrors;
QStringList dummy1; QStringList dummy1;
QString dummy2; QString dummy2;
LtsAppDescriptor::AppDescriptionVector adv = LtsAppDescriptor::AppDescriptionVector adv = LtsAppDescriptor::LtsAppDescriptor::getAppDescriptionVector(f.readAll(), lastErrors, dummy1, dummy2);
LtsAppDescriptor::LtsAppDescriptor::getAppDescriptionVector(f.readAll(), lastErrors, dummy1, dummy2);
if (!lastErrors.isEmpty()) if (!lastErrors.isEmpty())
{ {
printf("LtsAppDescriptorChecker: apps.json at %s invalid:\n%s\n", appsJsonFilePath.toStdString().c_str(), printf("LtsAppDescriptorChecker: apps.json at %s invalid:\n%s\n",
appsJsonFilePath.toStdString().c_str(),
lastErrors.join(QStringLiteral("\r\n\r\n")).toStdString().c_str()); lastErrors.join(QStringLiteral("\r\n\r\n")).toStdString().c_str());
return 1; return 1;
} }
@@ -65,13 +64,13 @@ int main(int argc, char* argv[])
QStringList filenames; QStringList filenames;
filenames.reserve(guiPluginFiles.size()); filenames.reserve(guiPluginFiles.size());
for (const QFileInfo& fi : std::as_const(guiPluginFiles)) for (const QFileInfo &fi : std::as_const(guiPluginFiles))
{ {
filenames += fi.absoluteFilePath(); filenames += fi.absoluteFilePath();
} }
QStringList guiPluginIIDs; QStringList guiPluginIIDs;
for (const QFileInfo& fi : std::as_const(guiPluginFiles)) for (const QFileInfo &fi : std::as_const(guiPluginFiles))
{ {
QFile f2(fi.absoluteFilePath()); QFile f2(fi.absoluteFilePath());
@@ -101,14 +100,13 @@ int main(int argc, char* argv[])
bool ok = true; bool ok = true;
for (const LtsAppDescriptor::AppDescription& appdesc : std::as_const(adv)) for (const LtsAppDescriptor::AppDescription &appdesc : std::as_const(adv))
{ {
for (const LtsAppDescriptor::PluginInfo& pi : std::as_const(appdesc.pluginInfos)) for (const LtsAppDescriptor::PluginInfo &pi : std::as_const(appdesc.pluginInfos))
{ {
if (!guiPluginIIDs.contains(pi.iid)) if (!guiPluginIIDs.contains(pi.iid))
{ {
printf("LtsAppDescriptorChecker: apps.json at '%s' uses unknown IID '%s'\n", printf("LtsAppDescriptorChecker: apps.json at '%s' uses unknown IID '%s'\n", appsJsonFilePath.toStdString().c_str(), pi.iid.toStdString().c_str());
appsJsonFilePath.toStdString().c_str(), pi.iid.toStdString().c_str());
ok = false; ok = false;
} }
} }
@@ -11,14 +11,14 @@
namespace LtsAppDescriptor namespace LtsAppDescriptor
{ {
static void addOptionToPlugin(PluginInfo& pluginInfo, const PluginInfo::Flag& flag) static void addOptionToPlugin(PluginInfo &pluginInfo, const PluginInfo::Flag &flag)
{ {
pluginInfo.flags |= flag; pluginInfo.flags |= flag;
} }
static void addOptionToPlugin(QVector<PluginInfo>& pluginInfos, const PluginInfo::Flag& flag, const QString& pluginName) static void addOptionToPlugin(QVector<PluginInfo> &pluginInfos, const PluginInfo::Flag &flag, const QString &pluginName)
{ {
for (PluginInfo& pi : pluginInfos) for (PluginInfo &pi : pluginInfos)
{ {
if (pi.iid == pluginName) if (pi.iid == pluginName)
{ {
@@ -32,19 +32,23 @@ static void addOptionToPlugin(QVector<PluginInfo>& pluginInfos, const PluginInfo
pi.type = PluginInfo::PluginType::GUI; pi.type = PluginInfo::PluginType::GUI;
addOptionToPlugin(pi, flag); addOptionToPlugin(pi, flag);
pluginInfos.append(pi); pluginInfos.append(pi);
} }
static bool addOptionsToPlugin(AppDescription& appDesc, const QString& optionIdentifier, static bool addOptionsToPlugin(AppDescription &appDesc,
const QStringList& ignoredPlugins, const QJsonObject& optionsObject, const QString &optionIdentifier,
const PluginInfo::Flag flag, QStringList& lastErrors, bool atLeastOnePluginNeeded) const QStringList &ignoredPlugins,
{ const QJsonObject &optionsObject,
const PluginInfo::Flag flag,
QStringList &lastErrors,
bool atLeastOnePluginNeeded)
{
bool hasPlugins = false; bool hasPlugins = false;
auto optionsObjectIt = optionsObject.constFind(optionIdentifier); auto optionsObjectIt = optionsObject.constFind(optionIdentifier);
if (optionsObjectIt != optionsObject.constEnd()) if (optionsObjectIt != optionsObject.constEnd())
{ {
const QJsonArray plugins((*optionsObjectIt).toObject()[QStringLiteral("Plugins")].toArray()); const QJsonArray plugins((*optionsObjectIt).toObject()[QStringLiteral("Plugins")].toArray());
for (const auto& pluginElem : plugins) for (const auto &pluginElem : plugins)
{ {
const QString pluginName = pluginElem.toString(); const QString pluginName = pluginElem.toString();
if (!ignoredPlugins.contains(pluginName)) if (!ignoredPlugins.contains(pluginName))
@@ -57,16 +61,15 @@ static bool addOptionsToPlugin(AppDescription& appDesc, const QString& optionIde
if (atLeastOnePluginNeeded && !hasPlugins) if (atLeastOnePluginNeeded && !hasPlugins)
{ {
lastErrors.append(QCoreApplication::tr("No plugins specified for '%1' option for app '%2'") lastErrors.append(QCoreApplication::tr("No plugins specified for '%1' option for app '%2'").arg(optionIdentifier, appDesc.appName));
.arg(optionIdentifier, appDesc.appName));
return false; return false;
} }
return true; return true;
} }
App LtsAppDescriptor::appFromInteger(int i) App LtsAppDescriptor::appFromInteger(int i)
{ {
switch (i) switch (i)
{ {
case int(App::Login): case int(App::Login):
@@ -94,12 +97,13 @@ App LtsAppDescriptor::appFromInteger(int i)
} }
Q_ASSERT_X(false, "LtsAppDescriptor::appFromInteger", qPrintable(QStringLiteral("Unknown app id: %1").arg(i))); Q_ASSERT_X(false, "LtsAppDescriptor::appFromInteger", qPrintable(QStringLiteral("Unknown app id: %1").arg(i)));
return App::Login; return App::Login;
} }
AppDescriptionVector LtsAppDescriptor::getAppDescriptionVector(const QByteArray& jsonDocument, QStringList& lastErrors, AppDescriptionVector LtsAppDescriptor::getAppDescriptionVector(const QByteArray &jsonDocument,
const QStringList& ignoredPlugins, QStringList &lastErrors,
QString& loginPluginIid) const QStringList &ignoredPlugins,
{ QString &loginPluginIid)
{
AppDescriptionVector appDescriptions; AppDescriptionVector appDescriptions;
@@ -129,10 +133,7 @@ AppDescriptionVector LtsAppDescriptor::getAppDescriptionVector(const QByteArray&
} }
} }
lastErrors.append(QCoreApplication::tr("JSON: %1<br>Row: %2, Column: %3") lastErrors.append(QCoreApplication::tr("JSON: %1<br>Row: %2, Column: %3").arg(parseError.errorString()).arg(row + 1).arg(column + 1));
.arg(parseError.errorString())
.arg(row + 1)
.arg(column + 1));
return appDescriptions; return appDescriptions;
} }
@@ -147,7 +148,7 @@ AppDescriptionVector LtsAppDescriptor::getAppDescriptionVector(const QByteArray&
return appDescriptions; return appDescriptions;
} }
for (const auto& appElem : appArray) for (const auto &appElem : appArray)
{ {
AppDescription appDesc; AppDescription appDesc;
const QJsonObject appObject = appElem.toObject(); const QJsonObject appObject = appElem.toObject();
@@ -166,9 +167,7 @@ AppDescriptionVector LtsAppDescriptor::getAppDescriptionVector(const QByteArray&
{ {
if (valueActive.type() != QJsonValue::Type::Bool) if (valueActive.type() != QJsonValue::Type::Bool)
{ {
lastErrors.append(QCoreApplication::tr("App '%1': value App.Active is not a bool (%2)") lastErrors.append(QCoreApplication::tr("App '%1': value App.Active is not a bool (%2)").arg(appDesc.appName).arg((int)valueActive.type()));
.arg(appDesc.appName)
.arg((int)valueActive.type()));
return appDescriptions; return appDescriptions;
} }
} }
@@ -177,30 +176,25 @@ AppDescriptionVector LtsAppDescriptor::getAppDescriptionVector(const QByteArray&
const QJsonValue valueVisible = appObject.value(QStringLiteral("Visible")); const QJsonValue valueVisible = appObject.value(QStringLiteral("Visible"));
if (!valueVisible.isUndefined() && valueVisible.type() != QJsonValue::Type::Bool) if (!valueVisible.isUndefined() && valueVisible.type() != QJsonValue::Type::Bool)
{ {
lastErrors.append(QCoreApplication::tr("App '%1': value App.Visible is not a bool (%2)") lastErrors.append(QCoreApplication::tr("App '%1': value App.Visible is not a bool (%2)").arg(appDesc.appName).arg((int)valueVisible.type()));
.arg(appDesc.appName)
.arg((int)valueVisible.type()));
return appDescriptions; return appDescriptions;
} }
appDesc.visible = valueVisible.toBool(true); appDesc.visible = valueVisible.toBool(true);
const QJsonArray array(appObject.value(QStringLiteral("ACLs")).toArray()); const QJsonArray array(appObject.value(QStringLiteral("ACLs")).toArray());
for (const QJsonValue& value : array) for (const QJsonValue &value : array)
appDesc.requiredAcls.append(value.toInt()); appDesc.requiredAcls.append(value.toInt());
const QJsonObject optionsObject(appObject.value(QStringLiteral("Options")).toObject()); const QJsonObject optionsObject(appObject.value(QStringLiteral("Options")).toObject());
addOptionsToPlugin(appDesc, QStringLiteral("Payloads"), ignoredPlugins, optionsObject, addOptionsToPlugin(appDesc, QStringLiteral("Payloads"), ignoredPlugins, optionsObject, PluginInfo::Flag::PAYLOAD, lastErrors, false);
PluginInfo::Flag::PAYLOAD, lastErrors, false); addOptionsToPlugin(appDesc, QStringLiteral("Actions"), ignoredPlugins, optionsObject, PluginInfo::Flag::ACTIONS, lastErrors, true);
addOptionsToPlugin(appDesc, QStringLiteral("Actions"), ignoredPlugins, optionsObject, PluginInfo::Flag::ACTIONS, addOptionsToPlugin(appDesc, QStringLiteral("Main"), ignoredPlugins, optionsObject, PluginInfo::Flag::MAIN, lastErrors, false);
lastErrors, true);
addOptionsToPlugin(appDesc, QStringLiteral("Main"), ignoredPlugins, optionsObject, PluginInfo::Flag::MAIN,
lastErrors, false);
appDescriptions.append(appDesc); appDescriptions.append(appDesc);
} }
return appDescriptions; return appDescriptions;
} }
} // namespace LtsAppDescriptor } // namespace LtsAppDescriptor
@@ -14,23 +14,23 @@
#include <QStringList> #include <QStringList>
#ifndef LTSAPPDESCRIPTOR_EXPORT #ifndef LTSAPPDESCRIPTOR_EXPORT
# ifdef BUILD_STATIC_LIBRARIES #ifdef BUILD_STATIC_LIBRARIES
# define LTSAPPDESCRIPTOR_EXPORT #define LTSAPPDESCRIPTOR_EXPORT
# else #else
# if defined(MAKE_LTSAPPDESCRIPTOR_LIB) #if defined(MAKE_LTSAPPDESCRIPTOR_LIB)
# define LTSAPPDESCRIPTOR_EXPORT Q_DECL_EXPORT #define LTSAPPDESCRIPTOR_EXPORT Q_DECL_EXPORT
# else #else
# define LTSAPPDESCRIPTOR_EXPORT Q_DECL_IMPORT #define LTSAPPDESCRIPTOR_EXPORT Q_DECL_IMPORT
# endif #endif
# endif #endif
#endif #endif
namespace LtsAppDescriptor namespace LtsAppDescriptor
{ {
enum class App enum class App
{ {
Login = -1, Login = -1,
Situation = 0, Situation = 0,
ResourceManager = 1, ResourceManager = 1,
@@ -52,10 +52,10 @@ enum class App
SilhouetteEditor = 18, // for L400P2 SilhouetteEditor = 18, // for L400P2
Shootback = 19, // for L400P2 Shootback = 19, // for L400P2
SAAs = 20, //Schnittstelle Adapter Adler SAAs = 20, //Schnittstelle Adapter Adler
}; };
struct PluginInfo struct PluginInfo
{ {
enum class PluginType enum class PluginType
{ {
UNKNOWN, UNKNOWN,
@@ -77,10 +77,10 @@ struct PluginInfo
QString iid; QString iid;
QFlags<Flag> flags; QFlags<Flag> flags;
QStringList options; QStringList options;
}; };
struct AppDescription struct AppDescription
{ {
App id = App::Login; App id = App::Login;
bool active = false; bool active = false;
bool visible = true; bool visible = true;
@@ -89,16 +89,18 @@ struct AppDescription
QVector<PluginInfo> pluginInfos; QVector<PluginInfo> pluginInfos;
bool isValid() const { return !appName.isEmpty(); } bool isValid() const { return !appName.isEmpty(); }
}; };
typedef QVector<AppDescription> AppDescriptionVector; typedef QVector<AppDescription> AppDescriptionVector;
namespace LtsAppDescriptor // TODO: make qobject class singleton - for tr namespace LtsAppDescriptor // TODO: make qobject class singleton - for tr
{ {
LTSAPPDESCRIPTOR_EXPORT App appFromInteger(int i); LTSAPPDESCRIPTOR_EXPORT App appFromInteger(int i);
LTSAPPDESCRIPTOR_EXPORT AppDescriptionVector getAppDescriptionVector(const QByteArray &jsonDocument, QStringList &lastErrors, LTSAPPDESCRIPTOR_EXPORT AppDescriptionVector getAppDescriptionVector(const QByteArray &jsonDocument,
const QStringList &ignoredPlugins, QString &loginPluginIid); QStringList &lastErrors,
} const QStringList &ignoredPlugins,
QString &loginPluginIid);
}
} // namespace LtsAppDescriptor } // namespace LtsAppDescriptor
@@ -13,7 +13,9 @@
#include <QtWidgets/QLineEdit> #include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton> #include <QtWidgets/QPushButton>
LtsAppDescriptorEditor::LtsAppDescriptorEditor(QWidget* parent) : QWidget(parent), m_ui(new Ui_LtsAppDescriptionEditor) LtsAppDescriptorEditor::LtsAppDescriptorEditor(QWidget *parent)
: QWidget(parent)
, m_ui(new Ui_LtsAppDescriptionEditor)
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
m_vector = LtsAppDescriptor::AppDescriptionVector(); m_vector = LtsAppDescriptor::AppDescriptionVector();
@@ -53,9 +55,8 @@ LtsAppDescriptorEditor::~LtsAppDescriptorEditor()
void LtsAppDescriptorEditor::getAppDescriptionVector() void LtsAppDescriptorEditor::getAppDescriptionVector()
{ {
m_fileName = QFileDialog::getOpenFileName( m_fileName =
this, tr("Open JSON"), QLatin1Literal("/shd/CTC/TOOLS/TDS/TDS-source/Lts/Projects/Legatus/resources/"), QFileDialog::getOpenFileName(this, tr("Open JSON"), QLatin1Literal("/shd/CTC/TOOLS/TDS/TDS-source/Lts/Projects/Legatus/resources/"), tr("JSON File (*.json)"));
tr("JSON File (*.json)"));
if (m_fileName.isEmpty()) if (m_fileName.isEmpty())
return; return;
@@ -71,7 +72,7 @@ void LtsAppDescriptorEditor::getAppDescriptionVector()
updateAppModel(); updateAppModel();
} }
void LtsAppDescriptorEditor::onAppsClicked(const QModelIndex& index) void LtsAppDescriptorEditor::onAppsClicked(const QModelIndex &index)
{ {
m_ui->gbPlugins->setEnabled(true); m_ui->gbPlugins->setEnabled(true);
m_ui->pbDeleteApp->setEnabled(true); m_ui->pbDeleteApp->setEnabled(true);
@@ -80,7 +81,7 @@ void LtsAppDescriptorEditor::onAppsClicked(const QModelIndex& index)
m_appIndex = index; m_appIndex = index;
QStringList pluginList; QStringList pluginList;
Q_FOREACH (const LtsAppDescriptor::PluginInfo& reqPlugin, m_vector.at(m_appIndex.row()).requiredPlugins) Q_FOREACH (const LtsAppDescriptor::PluginInfo &reqPlugin, m_vector.at(m_appIndex.row()).requiredPlugins)
{ {
LtsAppDescriptor::PluginInfo::PluginType pluginType = reqPlugin.type; LtsAppDescriptor::PluginInfo::PluginType pluginType = reqPlugin.type;
QString type; QString type;
@@ -111,8 +112,7 @@ void LtsAppDescriptorEditor::onAppsClicked(const QModelIndex& index)
if (optionalFlag) if (optionalFlag)
strFlags.append(QLatin1String("optional ")); strFlags.append(QLatin1String("optional "));
pluginList << QString(type + QLatin1String(": ") + reqPlugin.iid + QLatin1String(" [ ") + strFlags + pluginList << QString(type + QLatin1String(": ") + reqPlugin.iid + QLatin1String(" [ ") + strFlags + QLatin1String("]"));
QLatin1String("]"));
} }
} }
updatePluginModel(pluginList); updatePluginModel(pluginList);
@@ -121,7 +121,7 @@ void LtsAppDescriptorEditor::onAppsClicked(const QModelIndex& index)
m_ui->leAppName->setText(m_vector.at(m_appIndex.row()).appName); m_ui->leAppName->setText(m_vector.at(m_appIndex.row()).appName);
} }
void LtsAppDescriptorEditor::onPluginsClicked(const QModelIndex& index) void LtsAppDescriptorEditor::onPluginsClicked(const QModelIndex &index)
{ {
m_pluginIndex = index; m_pluginIndex = index;
m_ui->pbDeletePlugin->setEnabled(true); m_ui->pbDeletePlugin->setEnabled(true);
@@ -189,8 +189,7 @@ void LtsAppDescriptorEditor::pluginTypeChanged()
} }
else else
{ {
QMessageBox msgBox(QMessageBox::Information, tr("Error"), QMessageBox msgBox(QMessageBox::Information, tr("Error"), tr("Plugin Type must either be \"gui\" or \"data\"."));
tr("Plugin Type must either be \"gui\" or \"data\"."));
msgBox.exec(); msgBox.exec();
m_ui->lePluginType->setText(QString()); m_ui->lePluginType->setText(QString());
} }
@@ -208,15 +207,14 @@ void LtsAppDescriptorEditor::onAppAddClicked()
} }
QStringList appList; QStringList appList;
Q_FOREACH (const LtsAppDescriptor::AppDescription& appDesc, m_vector) Q_FOREACH (const LtsAppDescriptor::AppDescription &appDesc, m_vector)
{ {
appList << appDesc.appName; appList << appDesc.appName;
} }
if (appList.contains(m_ui->leAppName->text(), Qt::CaseInsensitive)) if (appList.contains(m_ui->leAppName->text(), Qt::CaseInsensitive))
{ {
QMessageBox msgBox(QMessageBox::Critical, tr("Error"), QMessageBox msgBox(QMessageBox::Critical, tr("Error"), tr("There already exists an app named \"%1\".").arg(m_ui->leAppName->text()));
tr("There already exists an app named \"%1\".").arg(m_ui->leAppName->text()));
msgBox.exec(); msgBox.exec();
return; return;
} }
@@ -247,15 +245,14 @@ void LtsAppDescriptorEditor::onPluginAddClicked()
} }
QStringList pluginList; QStringList pluginList;
Q_FOREACH (const LtsAppDescriptor::PluginInfo& pluginDesc, m_vector.at(m_appIndex.row()).requiredPlugins) Q_FOREACH (const LtsAppDescriptor::PluginInfo &pluginDesc, m_vector.at(m_appIndex.row()).requiredPlugins)
{ {
pluginList << pluginDesc.iid; pluginList << pluginDesc.iid;
} }
if (pluginList.contains(m_ui->lePluginName->text(), Qt::CaseInsensitive)) if (pluginList.contains(m_ui->lePluginName->text(), Qt::CaseInsensitive))
{ {
QMessageBox msgBox(QMessageBox::Critical, tr("Error"), QMessageBox msgBox(QMessageBox::Critical, tr("Error"), tr("There already exists an plugin named \"%1\".").arg(m_ui->lePluginName->text()));
tr("There already exists an plugin named \"%1\".").arg(m_ui->lePluginName->text()));
msgBox.exec(); msgBox.exec();
return; return;
} }
@@ -293,8 +290,10 @@ void LtsAppDescriptorEditor::onAppDeleteClicked()
QMessageBox msgBox(tr("Warning"), QMessageBox msgBox(tr("Warning"),
tr("The App \n\"%1\" \nwill be removed. Continue?").arg(m_appIndex.data().toString()), tr("The App \n\"%1\" \nwill be removed. Continue?").arg(m_appIndex.data().toString()),
QMessageBox::Warning, QMessageBox::Yes | QMessageBox::Default, QMessageBox::Warning,
QMessageBox::No | QMessageBox::Escape, QMessageBox::NoButton); QMessageBox::Yes | QMessageBox::Default,
QMessageBox::No | QMessageBox::Escape,
QMessageBox::NoButton);
if (msgBox.exec() == QMessageBox::No) if (msgBox.exec() == QMessageBox::No)
return; return;
@@ -313,8 +312,10 @@ void LtsAppDescriptorEditor::onPluginDeletedClicked()
QMessageBox msgBox(tr("Warning"), QMessageBox msgBox(tr("Warning"),
tr("The Plugin \n\"%1\" \nwill be removed. Continue?").arg(m_pluginIndex.data().toString()), tr("The Plugin \n\"%1\" \nwill be removed. Continue?").arg(m_pluginIndex.data().toString()),
QMessageBox::Warning, QMessageBox::Yes | QMessageBox::Default, QMessageBox::Warning,
QMessageBox::No | QMessageBox::Escape, QMessageBox::NoButton); QMessageBox::Yes | QMessageBox::Default,
QMessageBox::No | QMessageBox::Escape,
QMessageBox::NoButton);
if (msgBox.exec() == QMessageBox::No) if (msgBox.exec() == QMessageBox::No)
return; return;
@@ -354,27 +355,20 @@ void LtsAppDescriptorEditor::onUpdateClicked()
m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].iid = m_ui->lePluginName->text(); m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].iid = m_ui->lePluginName->text();
if (m_ui->lePluginType->text() == QLatin1String("gui")) if (m_ui->lePluginType->text() == QLatin1String("gui"))
m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].type = m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].type = LtsAppDescriptor::PluginInfo::PluginType::GUI;
LtsAppDescriptor::PluginInfo::PluginType::GUI;
else if (m_ui->lePluginType->text() == QLatin1String("data")) else if (m_ui->lePluginType->text() == QLatin1String("data"))
m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].type = m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].type = LtsAppDescriptor::PluginInfo::PluginType::DATA;
LtsAppDescriptor::PluginInfo::PluginType::DATA;
else else
m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].type = m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].type = LtsAppDescriptor::PluginInfo::PluginType::UNKNOWN;
LtsAppDescriptor::PluginInfo::PluginType::UNKNOWN;
m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].flags = m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].flags = QFlags<LtsAppDescriptor::PluginInfo::Flag>();
QFlags<LtsAppDescriptor::PluginInfo::Flag>();
if (m_ui->chbActions->isChecked()) if (m_ui->chbActions->isChecked())
m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].flags |= m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].flags |= LtsAppDescriptor::PluginInfo::Flag::ACTIONS;
LtsAppDescriptor::PluginInfo::Flag::ACTIONS;
if (m_ui->chbMain->isChecked()) if (m_ui->chbMain->isChecked())
m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].flags |= m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].flags |= LtsAppDescriptor::PluginInfo::Flag::MAIN;
LtsAppDescriptor::PluginInfo::Flag::MAIN;
if (m_ui->chbPayload->isChecked()) if (m_ui->chbPayload->isChecked())
m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].flags |= m_vector[m_appIndex.row()].requiredPlugins[m_pluginIndex.row()].flags |= LtsAppDescriptor::PluginInfo::Flag::PAYLOAD;
LtsAppDescriptor::PluginInfo::Flag::PAYLOAD;
onAppsClicked(m_appIndex); onAppsClicked(m_appIndex);
onNewpluginClicked(); onNewpluginClicked();
@@ -427,24 +421,24 @@ void LtsAppDescriptorEditor::updateAppModel()
{ {
onNewAppClicked(); onNewAppClicked();
QStringList appList; QStringList appList;
Q_FOREACH (const LtsAppDescriptor::AppDescription& appDesc, m_vector) Q_FOREACH (const LtsAppDescriptor::AppDescription &appDesc, m_vector)
{ {
appList << appDesc.appName; appList << appDesc.appName;
} }
if (!m_ui->lvApps->model()) if (!m_ui->lvApps->model())
m_ui->lvApps->setModel(new QStringListModel(this)); m_ui->lvApps->setModel(new QStringListModel(this));
QStringListModel* m = qobject_cast<QStringListModel*>(m_ui->lvApps->model()); QStringListModel *m = qobject_cast<QStringListModel *>(m_ui->lvApps->model());
if (!m) if (!m)
return; return;
m->setStringList(appList); m->setStringList(appList);
} }
void LtsAppDescriptorEditor::updatePluginModel(const QStringList& list) void LtsAppDescriptorEditor::updatePluginModel(const QStringList &list)
{ {
if (!m_ui->lvPlugins->model()) if (!m_ui->lvPlugins->model())
m_ui->lvPlugins->setModel(new QStringListModel(this)); m_ui->lvPlugins->setModel(new QStringListModel(this));
QStringListModel* m = qobject_cast<QStringListModel*>(m_ui->lvPlugins->model()); QStringListModel *m = qobject_cast<QStringListModel *>(m_ui->lvPlugins->model());
if (!m) if (!m)
return; return;
m->setStringList(list); m->setStringList(list);
@@ -454,9 +448,12 @@ void LtsAppDescriptorEditor::checkSave()
{ {
if (m_changed) if (m_changed)
{ {
QMessageBox msgBox(tr("Warning"), tr("The Data has been modified.\nDo you want to save your changes?"), QMessageBox msgBox(tr("Warning"),
QMessageBox::Warning, QMessageBox::Yes | QMessageBox::Default, tr("The Data has been modified.\nDo you want to save your changes?"),
QMessageBox::No | QMessageBox::Escape, QMessageBox::NoButton); QMessageBox::Warning,
QMessageBox::Yes | QMessageBox::Default,
QMessageBox::No | QMessageBox::Escape,
QMessageBox::NoButton);
if (msgBox.exec() == QMessageBox::Yes) if (msgBox.exec() == QMessageBox::Yes)
onSaveAsClicked(); onSaveAsClicked();
@@ -465,9 +462,8 @@ void LtsAppDescriptorEditor::checkSave()
void LtsAppDescriptorEditor::onSaveAsClicked() void LtsAppDescriptorEditor::onSaveAsClicked()
{ {
QString fileName = QFileDialog::getSaveFileName( QString fileName =
this, tr("Save JSON"), QLatin1Literal("/shd/CTC/TOOLS/TDS/TDS-source/Lts/Projects/Legatus/resources/"), QFileDialog::getSaveFileName(this, tr("Save JSON"), QLatin1Literal("/shd/CTC/TOOLS/TDS/TDS-source/Lts/Projects/Legatus/resources/"), tr("JSON File (*.json)"));
tr("JSON File (*.json)"));
if (fileName.isEmpty()) if (fileName.isEmpty())
return; return;
@@ -23,12 +23,12 @@ class LTSAPPDESCRIPTOREDITOR_EXPORT LtsAppDescriptorEditor : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LtsAppDescriptorEditor(QWidget* parent = 0); explicit LtsAppDescriptorEditor(QWidget *parent = 0);
~LtsAppDescriptorEditor(); ~LtsAppDescriptorEditor();
private: private:
Ui_LtsAppDescriptionEditor* m_ui; Ui_LtsAppDescriptionEditor *m_ui;
LtsAppDescriptor::AppDescriptionVector m_vector; LtsAppDescriptor::AppDescriptionVector m_vector;
QModelIndex m_appIndex; QModelIndex m_appIndex;
QModelIndex m_pluginIndex; QModelIndex m_pluginIndex;
@@ -40,12 +40,12 @@ class LTSAPPDESCRIPTOREDITOR_EXPORT LtsAppDescriptorEditor : public QWidget
void getAppDescriptionVector(); void getAppDescriptionVector();
void setupMainWindow(); void setupMainWindow();
void updateAppModel(); void updateAppModel();
void updatePluginModel(const QStringList& list); void updatePluginModel(const QStringList &list);
void checkSave(); void checkSave();
private slots: private slots:
void onAppsClicked(const QModelIndex& index); void onAppsClicked(const QModelIndex &index);
void onPluginsClicked(const QModelIndex& index); void onPluginsClicked(const QModelIndex &index);
void pluginTypeChanged(); void pluginTypeChanged();
void onAppAddClicked(); void onAppAddClicked();
void onPluginAddClicked(); void onPluginAddClicked();
@@ -56,7 +56,7 @@ class LTSAPPDESCRIPTOREDITOR_EXPORT LtsAppDescriptorEditor : public QWidget
void onNewAppClicked(); void onNewAppClicked();
void enableNewPlugin(); void enableNewPlugin();
public slots: public slots:
void onSaveClicked(); void onSaveClicked();
void onSaveAsClicked(); void onSaveAsClicked();
void onOpenClicked(); void onOpenClicked();
@@ -7,39 +7,39 @@
#include <QtWidgets/QMainWindow> #include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar> #include <QtWidgets/QMenuBar>
int main(int argc, char* argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
QMainWindow* mainWindow = new QMainWindow(); QMainWindow *mainWindow = new QMainWindow();
QMenu* fileMenu = mainWindow->menuBar()->addMenu(QObject::tr("&File")); QMenu *fileMenu = mainWindow->menuBar()->addMenu(QObject::tr("&File"));
QAction* openAct = new QAction(QObject::tr("&Open"), mainWindow); QAction *openAct = new QAction(QObject::tr("&Open"), mainWindow);
openAct->setShortcuts(QKeySequence::Open); openAct->setShortcuts(QKeySequence::Open);
openAct->setStatusTip(QObject::tr("Open an existing file")); openAct->setStatusTip(QObject::tr("Open an existing file"));
fileMenu->addAction(openAct); fileMenu->addAction(openAct);
QAction* newAct = new QAction(QObject::tr("&New"), mainWindow); QAction *newAct = new QAction(QObject::tr("&New"), mainWindow);
newAct->setShortcuts(QKeySequence::New); newAct->setShortcuts(QKeySequence::New);
newAct->setStatusTip(QObject::tr("Create a new App")); newAct->setStatusTip(QObject::tr("Create a new App"));
fileMenu->addAction(newAct); fileMenu->addAction(newAct);
QAction* saveAct = new QAction(QObject::tr("&Save"), mainWindow); QAction *saveAct = new QAction(QObject::tr("&Save"), mainWindow);
saveAct->setShortcuts(QKeySequence::Save); saveAct->setShortcuts(QKeySequence::Save);
saveAct->setStatusTip(QObject::tr("Save modified file")); saveAct->setStatusTip(QObject::tr("Save modified file"));
fileMenu->addAction(saveAct); fileMenu->addAction(saveAct);
QAction* saveAsAct = new QAction(QObject::tr("&SaveAs"), mainWindow); QAction *saveAsAct = new QAction(QObject::tr("&SaveAs"), mainWindow);
saveAsAct->setShortcuts(QKeySequence::SaveAs); saveAsAct->setShortcuts(QKeySequence::SaveAs);
saveAsAct->setStatusTip(QObject::tr("Save modified file as")); saveAsAct->setStatusTip(QObject::tr("Save modified file as"));
fileMenu->addAction(saveAsAct); fileMenu->addAction(saveAsAct);
QAction* quitAct = new QAction(QObject::tr("&Quit"), mainWindow); QAction *quitAct = new QAction(QObject::tr("&Quit"), mainWindow);
quitAct->setShortcuts(QKeySequence::Quit); quitAct->setShortcuts(QKeySequence::Quit);
quitAct->setStatusTip(QObject::tr("Quit the Application")); quitAct->setStatusTip(QObject::tr("Quit the Application"));
fileMenu->addAction(quitAct); fileMenu->addAction(quitAct);
LtsAppDescriptorEditor* editor = new LtsAppDescriptorEditor(mainWindow); LtsAppDescriptorEditor *editor = new LtsAppDescriptorEditor(mainWindow);
mainWindow->setCentralWidget(editor); mainWindow->setCentralWidget(editor);
QObject::connect(openAct, &QAction::triggered, editor, &LtsAppDescriptorEditor::onOpenClicked); QObject::connect(openAct, &QAction::triggered, editor, &LtsAppDescriptorEditor::onOpenClicked);
QObject::connect(newAct, &QAction::triggered, editor, &LtsAppDescriptorEditor::onNewClicked); QObject::connect(newAct, &QAction::triggered, editor, &LtsAppDescriptorEditor::onNewClicked);
@@ -10,15 +10,16 @@
namespace LtsCommandLineParser namespace LtsCommandLineParser
{ {
static constexpr int s_maxDomainId = 232; static constexpr int s_maxDomainId = 232;
LtsCommandLineParser::LtsCommandLineParser(ProvideCommandLineParameterOptions opts) LtsCommandLineParser::LtsCommandLineParser(ProvideCommandLineParameterOptions opts)
: QCommandLineParser(), m_enabledOptions(opts) : QCommandLineParser()
{ , m_enabledOptions(opts)
{
if (NGL::isAppInBuildBasePath() || m_enabledOptions.testFlag(CreateDomainIdFromIp)) if (NGL::isAppInBuildBasePath() || m_enabledOptions.testFlag(CreateDomainIdFromIp))
{ {
const QList<QHostAddress> addresses = QNetworkInterface::allAddresses(); const QList<QHostAddress> addresses = QNetworkInterface::allAddresses();
for (const QHostAddress& address : addresses) for (const QHostAddress &address : addresses)
{ {
if (address.isLoopback() || address.isNull()) if (address.isLoopback() || address.isNull())
continue; continue;
@@ -45,27 +46,21 @@ LtsCommandLineParser::LtsCommandLineParser(ProvideCommandLineParameterOptions op
if (m_enabledOptions.testFlag(CustomConfigFile)) if (m_enabledOptions.testFlag(CustomConfigFile))
{ {
const QString cf(NGL::findProjectConfigFile()); const QString cf(NGL::findProjectConfigFile());
addOption({{QStringLiteral("i"), QStringLiteral("ini")}, addOption({{QStringLiteral("i"), QStringLiteral("ini")}, QStringLiteral("Default: ") + cf, QStringLiteral("filename"), cf});
QStringLiteral("Default: ") + cf,
QStringLiteral("filename"),
cf});
} }
if (m_enabledOptions.testFlag(TcpConnectionUrl)) if (m_enabledOptions.testFlag(TcpConnectionUrl))
{ {
const QString defaultTcpUrl(QStringLiteral("EXCTDS01:7400")); const QString defaultTcpUrl(QStringLiteral("EXCTDS01:7400"));
addOption({{QStringLiteral("t"), QStringLiteral("tcpurl")}, addOption({{QStringLiteral("t"), QStringLiteral("tcpurl")}, QStringLiteral("Default: ") + defaultTcpUrl, QStringLiteral("hostname:port"), defaultTcpUrl});
QStringLiteral("Default: ") + defaultTcpUrl,
QStringLiteral("hostname:port"),
defaultTcpUrl});
} }
addHelpOption(); addHelpOption();
if (!m_enabledOptions.testFlag(NoVersion)) if (!m_enabledOptions.testFlag(NoVersion))
addVersionOption(); addVersionOption();
} }
int LtsCommandLineParser::domainId() const int LtsCommandLineParser::domainId() const
{ {
if (m_domainId == 0 && m_generatedDomainId != 0 && !m_domainIdSetByFunction) if (m_domainId == 0 && m_generatedDomainId != 0 && !m_domainIdSetByFunction)
{ {
#ifdef WIN32 #ifdef WIN32
@@ -83,30 +78,30 @@ int LtsCommandLineParser::domainId() const
return m_generatedDomainId; return m_generatedDomainId;
} }
return m_domainId; return m_domainId;
} }
void LtsCommandLineParser::setDomainId(int id) void LtsCommandLineParser::setDomainId(int id)
{ {
m_domainIdSetByFunction = true; m_domainIdSetByFunction = true;
m_domainId = id; m_domainId = id;
} }
bool LtsCommandLineParser::iniFileSet() const bool LtsCommandLineParser::iniFileSet() const
{ {
if (!m_enabledOptions.testFlag(CustomConfigFile)) if (!m_enabledOptions.testFlag(CustomConfigFile))
return false; return false;
return isSet(QStringLiteral("i")); return isSet(QStringLiteral("i"));
} }
bool LtsCommandLineParser::useTcpConnection() const bool LtsCommandLineParser::useTcpConnection() const
{ {
if (!m_enabledOptions.testFlag(TcpConnectionUrl)) if (!m_enabledOptions.testFlag(TcpConnectionUrl))
return false; return false;
return isSet(QStringLiteral("t")); return isSet(QStringLiteral("t"));
} }
QUrl LtsCommandLineParser::tcpConnectionUrl() const QUrl LtsCommandLineParser::tcpConnectionUrl() const
{ {
if (!m_enabledOptions.testFlag(TcpConnectionUrl)) if (!m_enabledOptions.testFlag(TcpConnectionUrl))
return QUrl(); return QUrl();
if (!useTcpConnection()) if (!useTcpConnection())
@@ -118,10 +113,10 @@ QUrl LtsCommandLineParser::tcpConnectionUrl() const
if (url.scheme() == QLatin1String("http") || url.scheme() == QLatin1String("file")) if (url.scheme() == QLatin1String("http") || url.scheme() == QLatin1String("file"))
url.setScheme(QStringLiteral("tcpv4lan")); url.setScheme(QStringLiteral("tcpv4lan"));
return url; return url;
} }
bool LtsCommandLineParser::init(bool bParseHelp) bool LtsCommandLineParser::init(bool bParseHelp)
{ {
if (!parse(QCoreApplication::arguments())) if (!parse(QCoreApplication::arguments()))
{ {
fprintf(stdout, "\nBad option: %s \n", qPrintable(errorText())); fprintf(stdout, "\nBad option: %s \n", qPrintable(errorText()));
@@ -153,28 +148,28 @@ bool LtsCommandLineParser::init(bool bParseHelp)
} }
} }
return true; return true;
} }
void LtsCommandLineParser::showHelp(int exitCode) void LtsCommandLineParser::showHelp(int exitCode)
{ {
if (!m_additionalHelpStr.isEmpty()) if (!m_additionalHelpStr.isEmpty())
fprintf(stdout, "%s", qPrintable(m_additionalHelpStr)); fprintf(stdout, "%s", qPrintable(m_additionalHelpStr));
QCommandLineParser::showHelp(exitCode); QCommandLineParser::showHelp(exitCode);
} }
bool LtsCommandLineParser::domainIdProvided() const bool LtsCommandLineParser::domainIdProvided() const
{ {
if (!m_enabledOptions.testFlag(DomainId)) if (!m_enabledOptions.testFlag(DomainId))
return false; return false;
return isSet(QStringLiteral("d")); return isSet(QStringLiteral("d"));
} }
bool LtsCommandLineParser::exerciseIdProvided() const bool LtsCommandLineParser::exerciseIdProvided() const
{ {
if (!m_enabledOptions.testFlag(ExerciseId)) if (!m_enabledOptions.testFlag(ExerciseId))
return false; return false;
return isSet(QStringLiteral("e")); return isSet(QStringLiteral("e"));
} }
} // namespace LtsCommandLineParser } // namespace LtsCommandLineParser
@@ -10,10 +10,11 @@ class QUrl;
namespace LtsCommandLineParser namespace LtsCommandLineParser
{ {
class LTSCOMMANDLINEPARSER_EXPORT LtsCommandLineParser : public QCommandLineParser class LTSCOMMANDLINEPARSER_EXPORT LtsCommandLineParser : public QCommandLineParser
{ {
public: public:
enum ProvideCommandLineParameterOptions { enum ProvideCommandLineParameterOptions
{
None = 0x0000, None = 0x0000,
CreateDomainIdFromIp = 0x0001, CreateDomainIdFromIp = 0x0001,
DomainId = 0x0002, DomainId = 0x0002,
@@ -23,21 +24,15 @@ class LTSCOMMANDLINEPARSER_EXPORT LtsCommandLineParser : public QCommandLinePars
NoVersion = 0x0020 NoVersion = 0x0020
}; };
explicit LtsCommandLineParser(ProvideCommandLineParameterOptions opts = ProvideCommandLineParameterOptions( explicit LtsCommandLineParser(ProvideCommandLineParameterOptions opts = ProvideCommandLineParameterOptions(CreateDomainIdFromIp | DomainId | ExerciseId |
CreateDomainIdFromIp | DomainId | ExerciseId | CustomConfigFile)); CustomConfigFile));
virtual ~LtsCommandLineParser() = default; virtual ~LtsCommandLineParser() = default;
int domainId() const; int domainId() const;
void setDomainId(int id); void setDomainId(int id);
int exerciseId() const int exerciseId() const { return m_exerciseId; }
{
return m_exerciseId;
}
QString iniFile() const QString iniFile() const { return m_iniFile; }
{
return m_iniFile;
}
bool iniFileSet() const; bool iniFileSet() const;
bool useTcpConnection() const; bool useTcpConnection() const;
@@ -48,10 +43,7 @@ class LTSCOMMANDLINEPARSER_EXPORT LtsCommandLineParser : public QCommandLinePars
bool domainIdProvided() const; bool domainIdProvided() const;
bool exerciseIdProvided() const; bool exerciseIdProvided() const;
void setUnitModuleTestMode(bool onOff) void setUnitModuleTestMode(bool onOff) { m_unitModuleTestMode = onOff; }
{
m_unitModuleTestMode = onOff;
}
protected: protected:
QString m_additionalHelpStr; QString m_additionalHelpStr;
@@ -64,6 +56,6 @@ class LTSCOMMANDLINEPARSER_EXPORT LtsCommandLineParser : public QCommandLinePars
bool m_domainIdSetByFunction{false}; bool m_domainIdSetByFunction{false};
bool m_unitModuleTestMode{false}; bool m_unitModuleTestMode{false};
QString m_iniFile; QString m_iniFile;
}; };
} // namespace LtsCommandLineParser } // namespace LtsCommandLineParser
@@ -5,7 +5,7 @@
#include <cstring> #include <cstring>
#include <string> #include <string>
int main(int argc, char** argv) int main(int argc, char **argv)
{ {
if (argc < 3 || argc > 5) if (argc < 3 || argc > 5)
{ {
@@ -58,7 +58,17 @@ int main(int argc, char** argv)
part3 = mgrs.substr(5, prec); part3 = mgrs.substr(5, prec);
part4 = mgrs.substr(5 + prec, prec); part4 = mgrs.substr(5 + prec, prec);
} }
fprintf(stdout, "%13.10f, %13.10f = %s %s %s %s (UTM: %d %.2f, %.2f %c)\n", lon, lat, part1.c_str(), part2.c_str(), fprintf(stdout,
part3.c_str(), part4.c_str(), zone, x, y, northp ? 'N' : 'S'); "%13.10f, %13.10f = %s %s %s %s (UTM: %d %.2f, %.2f %c)\n",
lon,
lat,
part1.c_str(),
part2.c_str(),
part3.c_str(),
part4.c_str(),
zone,
x,
y,
northp ? 'N' : 'S');
return 0; return 0;
} }
@@ -15,24 +15,24 @@
namespace LtsCoordTrans namespace LtsCoordTrans
{ {
static long s_conversion_counter_MGRS_Forward = 0; static long s_conversion_counter_MGRS_Forward = 0;
static long s_conversion_counter_MGRS_Reverse = 0; static long s_conversion_counter_MGRS_Reverse = 0;
static long s_conversion_counter_WGS84_Forward = 0; static long s_conversion_counter_WGS84_Forward = 0;
static long s_conversion_counter_WGS84_Reverse = 0; static long s_conversion_counter_WGS84_Reverse = 0;
static long s_conversion_counter_UTMUPS_Forward = 0; static long s_conversion_counter_UTMUPS_Forward = 0;
static long s_conversion_counter_UTMUPS_Reverse = 0; static long s_conversion_counter_UTMUPS_Reverse = 0;
inline void incrementCounter(long& counterRef) inline void incrementCounter(long &counterRef)
{ {
#ifdef LTS_DEBUG #ifdef LTS_DEBUG
++counterRef; ++counterRef;
#endif #endif
} }
static inline std::string cleanupMgrsString(const QString& in) static inline std::string cleanupMgrsString(const QString &in)
{ {
const QByteArray ba(in.toLatin1()); const QByteArray ba(in.toLatin1());
std::string ret; std::string ret;
ret.reserve(ba.size()); ret.reserve(ba.size());
@@ -42,10 +42,10 @@ static inline std::string cleanupMgrsString(const QString& in)
ret += c; ret += c;
} }
return ret; return ret;
} }
QString UtmCoordinate::mgrs(int prec, bool withSpaces) const QString UtmCoordinate::mgrs(int prec, bool withSpaces) const
{ {
if (prec < 0) if (prec < 0)
prec = 0; prec = 0;
if (prec > 11) if (prec > 11)
@@ -57,7 +57,7 @@ QString UtmCoordinate::mgrs(int prec, bool withSpaces) const
GeographicLib::MGRS::Forward(zone, northp, x, y, prec, mgrs); GeographicLib::MGRS::Forward(zone, northp, x, y, prec, mgrs);
incrementCounter(s_conversion_counter_MGRS_Forward); incrementCounter(s_conversion_counter_MGRS_Forward);
} }
catch (const std::exception& e) catch (const std::exception &e)
{ {
fprintf(stderr, "Error while calculating mgrs from utm %d, %9.6f, %9.6f: %s\n", zone, x, y, e.what()); fprintf(stderr, "Error while calculating mgrs from utm %d, %9.6f, %9.6f: %s\n", zone, x, y, e.what());
mgrs.clear(); mgrs.clear();
@@ -67,58 +67,56 @@ QString UtmCoordinate::mgrs(int prec, bool withSpaces) const
if (withSpaces && mgrs.size() == static_cast<size_t>(5 + 2 * prec)) if (withSpaces && mgrs.size() == static_cast<size_t>(5 + 2 * prec))
{ {
const char* ptr = mgrs.c_str(); const char *ptr = mgrs.c_str();
ret = QString::fromLatin1(ptr, 3) + QLatin1Char(' ') + QString::fromLatin1(ptr + 3, 2); ret = QString::fromLatin1(ptr, 3) + QLatin1Char(' ') + QString::fromLatin1(ptr + 3, 2);
if (prec > 0) if (prec > 0)
{ {
ret += QLatin1Char(' ') + QString::fromLatin1(ptr + 5, prec) + QLatin1Char(' ') + ret += QLatin1Char(' ') + QString::fromLatin1(ptr + 5, prec) + QLatin1Char(' ') + QString::fromLatin1(ptr + 5 + prec, prec);
QString::fromLatin1(ptr + 5 + prec, prec);
} }
} }
else else
ret = QString::fromLatin1(mgrs.c_str(), mgrs.size()); ret = QString::fromLatin1(mgrs.c_str(), mgrs.size());
return ret; return ret;
} }
QPointF UtmCoordinate::toPoint() const QPointF UtmCoordinate::toPoint() const
{ {
return {x, y}; return {x, y};
} }
QPointF UtmCoordinate::geographic(double offsetX, double offsetY) const QPointF UtmCoordinate::geographic(double offsetX, double offsetY) const
{ {
QPointF ret; QPointF ret;
try try
{ {
GeographicLib::UTMUPS::Reverse(zone, northp, x + offsetX, y + offsetY, ret.ry(), ret.rx()); GeographicLib::UTMUPS::Reverse(zone, northp, x + offsetX, y + offsetY, ret.ry(), ret.rx());
incrementCounter(s_conversion_counter_UTMUPS_Reverse); incrementCounter(s_conversion_counter_UTMUPS_Reverse);
} }
catch (const std::exception& e) catch (const std::exception &e)
{ {
fprintf(stderr, "Error while calculating geographic from utm %d, %9.6f, %9.6f: %s\n", zone, x + offsetX, fprintf(stderr, "Error while calculating geographic from utm %d, %9.6f, %9.6f: %s\n", zone, x + offsetX, y + offsetY, e.what());
y + offsetY, e.what());
ret = QPointF(); ret = QPointF();
} }
return ret * deg2rad(); return ret * deg2rad();
} }
QPointF UtmCoordinate::geographic(const QPointF& offset) const QPointF UtmCoordinate::geographic(const QPointF &offset) const
{ {
return geographic(offset.x(), offset.y()); return geographic(offset.x(), offset.y());
} }
QPointF UtmCoordinate::relativeTo(const UtmCoordinate& other) const QPointF UtmCoordinate::relativeTo(const UtmCoordinate &other) const
{ {
if (zone == other.zone) if (zone == other.zone)
return QPointF(x - other.x, y - other.y); return QPointF(x - other.x, y - other.y);
UtmCoordinate otherInMyZone = fromGeographic(other.geographic(), zone); UtmCoordinate otherInMyZone = fromGeographic(other.geographic(), zone);
return QPointF(x - otherInMyZone.x, y - otherInMyZone.y); return QPointF(x - otherInMyZone.x, y - otherInMyZone.y);
} }
UtmCoordinate UtmCoordinate::fromGeographic(double lon, double lat, int setZone) UtmCoordinate UtmCoordinate::fromGeographic(double lon, double lat, int setZone)
{ {
lon *= rad2deg(); lon *= rad2deg();
lat *= rad2deg(); lat *= rad2deg();
@@ -130,21 +128,21 @@ UtmCoordinate UtmCoordinate::fromGeographic(double lon, double lat, int setZone)
GeographicLib::UTMUPS::Forward(lat, lon, ret.zone, ret.northp, ret.x, ret.y, setZone); GeographicLib::UTMUPS::Forward(lat, lon, ret.zone, ret.northp, ret.x, ret.y, setZone);
incrementCounter(s_conversion_counter_UTMUPS_Forward); incrementCounter(s_conversion_counter_UTMUPS_Forward);
} }
catch (const std::exception& e) catch (const std::exception &e)
{ {
fprintf(stderr, "Error while calculating mgrs base point from %9.6f, %9.6f: %s\n", lat, lon, e.what()); fprintf(stderr, "Error while calculating mgrs base point from %9.6f, %9.6f: %s\n", lat, lon, e.what());
ret = UtmCoordinate(); ret = UtmCoordinate();
} }
return ret; return ret;
} }
UtmCoordinate UtmCoordinate::fromGeographic(const QPointF& lonLat, int setZone) UtmCoordinate UtmCoordinate::fromGeographic(const QPointF &lonLat, int setZone)
{ {
return fromGeographic(lonLat.x(), lonLat.y(), setZone); return fromGeographic(lonLat.x(), lonLat.y(), setZone);
} }
UtmCoordinate UtmCoordinate::fromMgrs(const QString& mgrs) UtmCoordinate UtmCoordinate::fromMgrs(const QString &mgrs)
{ {
UtmCoordinate utm; UtmCoordinate utm;
try try
{ {
@@ -153,44 +151,44 @@ UtmCoordinate UtmCoordinate::fromMgrs(const QString& mgrs)
GeographicLib::MGRS::Reverse(cleanupMgrsString(mgrs), utm.zone, utm.northp, utm.x, utm.y, prec, true); GeographicLib::MGRS::Reverse(cleanupMgrsString(mgrs), utm.zone, utm.northp, utm.x, utm.y, prec, true);
incrementCounter(s_conversion_counter_MGRS_Reverse); incrementCounter(s_conversion_counter_MGRS_Reverse);
} }
catch (const std::exception& e) catch (const std::exception &e)
{ {
fprintf(stderr, "Error while converting mgrs coordinate %s to utm: %s\n", qPrintable(mgrs), e.what()); fprintf(stderr, "Error while converting mgrs coordinate %s to utm: %s\n", qPrintable(mgrs), e.what());
utm = UtmCoordinate(); utm = UtmCoordinate();
} }
return utm; return utm;
} }
QString mgrsFromGeographic(double lon, double lat, int prec, bool withSpaces) QString mgrsFromGeographic(double lon, double lat, int prec, bool withSpaces)
{ {
return UtmCoordinate::fromGeographic(lon, lat, -1).mgrs(prec, withSpaces); return UtmCoordinate::fromGeographic(lon, lat, -1).mgrs(prec, withSpaces);
} }
QPointF geographicFromMgrs(const QString& mgrs) QPointF geographicFromMgrs(const QString &mgrs)
{ {
return UtmCoordinate::fromMgrs(mgrs).geographic(); return UtmCoordinate::fromMgrs(mgrs).geographic();
} }
QVector<UtmCoordinate>& staticDefaultSquaresHelper() QVector<UtmCoordinate> &staticDefaultSquaresHelper()
{ {
static QVector<UtmCoordinate> s_defaultMgrsSquares; static QVector<UtmCoordinate> s_defaultMgrsSquares;
return s_defaultMgrsSquares; return s_defaultMgrsSquares;
} }
UtmCoordinate& staticPreferedMgrsSquareHelper() UtmCoordinate &staticPreferedMgrsSquareHelper()
{ {
static UtmCoordinate s_preferedMgrsSquare; static UtmCoordinate s_preferedMgrsSquare;
return s_preferedMgrsSquare; return s_preferedMgrsSquare;
} }
QVector<UtmCoordinate>& staticMgrsSquaresWithOffsetsHelper() QVector<UtmCoordinate> &staticMgrsSquaresWithOffsetsHelper()
{ {
static QVector<UtmCoordinate> s_mgrsSquaresWithOffsets; static QVector<UtmCoordinate> s_mgrsSquaresWithOffsets;
return s_mgrsSquaresWithOffsets; return s_mgrsSquaresWithOffsets;
} }
QRectF addMarginToArea(const QRectF& rect_LatLon_radiant, const QSize& marginMeter) QRectF addMarginToArea(const QRectF &rect_LatLon_radiant, const QSize &marginMeter)
{ {
double lonMin, lonMax, latMin, latMmax; double lonMin, lonMax, latMin, latMmax;
rect_LatLon_radiant.normalized().getCoords(&lonMin, &latMin, &lonMax, &latMmax); rect_LatLon_radiant.normalized().getCoords(&lonMin, &latMin, &lonMax, &latMmax);
@@ -215,11 +213,10 @@ QRectF addMarginToArea(const QRectF& rect_LatLon_radiant, const QSize& marginMet
QRectF res = QRectF(topLeft, bottomRight); QRectF res = QRectF(topLeft, bottomRight);
return res; return res;
} }
QVector<UtmCoordinate> getMgrsSquares(const QRectF& rect, bool setAsDefaultSquares, bool setAsPreferedSquare, QVector<UtmCoordinate> getMgrsSquares(const QRectF &rect, bool setAsDefaultSquares, bool setAsPreferedSquare, bool setAsSquareWithMargin)
bool setAsSquareWithMargin) {
{
QVector<UtmCoordinate> ret = getMgrsSquaresInternal(rect); QVector<UtmCoordinate> ret = getMgrsSquaresInternal(rect);
if (setAsDefaultSquares) if (setAsDefaultSquares)
@@ -232,10 +229,10 @@ QVector<UtmCoordinate> getMgrsSquares(const QRectF& rect, bool setAsDefaultSquar
staticMgrsSquaresWithOffsetsHelper() = ret; staticMgrsSquaresWithOffsetsHelper() = ret;
return ret; return ret;
} }
QVector<UtmCoordinate> getMgrsSquaresInternal(const QRectF& rect) QVector<UtmCoordinate> getMgrsSquaresInternal(const QRectF &rect)
{ {
QVector<UtmCoordinate> ret; QVector<UtmCoordinate> ret;
QVector<QString> tmpMgrsSquares; QVector<QString> tmpMgrsSquares;
@@ -284,15 +281,15 @@ QVector<UtmCoordinate> getMgrsSquaresInternal(const QRectF& rect)
} }
} }
return ret; return ret;
} }
QStringList getMgrsSurroundingSquares(const QRectF& geoRect, const QSize& offsetMeter) QStringList getMgrsSurroundingSquares(const QRectF &geoRect, const QSize &offsetMeter)
{ {
const QVector<UtmCoordinate> mainUtms = getMgrsSquaresInternal(geoRect); const QVector<UtmCoordinate> mainUtms = getMgrsSquaresInternal(geoRect);
QStringList mainSquares; QStringList mainSquares;
mainSquares.reserve(mainUtms.count()); mainSquares.reserve(mainUtms.count());
for (const auto& utm : mainUtms) for (const auto &utm : mainUtms)
mainSquares.append(utm.mgrs(0)); mainSquares.append(utm.mgrs(0));
const QRectF rectWithOffset = addMarginToArea(geoRect, offsetMeter); const QRectF rectWithOffset = addMarginToArea(geoRect, offsetMeter);
@@ -300,46 +297,46 @@ QStringList getMgrsSurroundingSquares(const QRectF& geoRect, const QSize& offset
QVector<UtmCoordinate> mainUtmsWithOffset = getMgrsSquaresInternal(rectWithOffset); QVector<UtmCoordinate> mainUtmsWithOffset = getMgrsSquaresInternal(rectWithOffset);
QStringList mainSquaresWithOffset; QStringList mainSquaresWithOffset;
mainSquaresWithOffset.reserve(mainUtmsWithOffset.count()); mainSquaresWithOffset.reserve(mainUtmsWithOffset.count());
for (const auto& utm : std::as_const(mainUtmsWithOffset)) for (const auto &utm : std::as_const(mainUtmsWithOffset))
mainSquaresWithOffset.append(utm.mgrs(0)); mainSquaresWithOffset.append(utm.mgrs(0));
QStringList surroundingSquares; QStringList surroundingSquares;
surroundingSquares.reserve(mainSquaresWithOffset.count()); surroundingSquares.reserve(mainSquaresWithOffset.count());
for (const auto& mgrs0 : mainSquaresWithOffset) for (const auto &mgrs0 : mainSquaresWithOffset)
{ {
if (!mainSquares.contains(mgrs0)) if (!mainSquares.contains(mgrs0))
surroundingSquares.append(mgrs0); surroundingSquares.append(mgrs0);
} }
return surroundingSquares; return surroundingSquares;
} }
QVector<UtmCoordinate> defaultMgrsSquareWithOffsets() QVector<UtmCoordinate> defaultMgrsSquareWithOffsets()
{ {
return staticMgrsSquaresWithOffsetsHelper(); return staticMgrsSquaresWithOffsetsHelper();
} }
void setDefaultMgrsSquares(const QVector<QString>& squares) void setDefaultMgrsSquares(const QVector<QString> &squares)
{ {
QVector<UtmCoordinate> coords; QVector<UtmCoordinate> coords;
coords.reserve(squares.size()); coords.reserve(squares.size());
for (const QString& s : squares) for (const QString &s : squares)
coords += UtmCoordinate::fromMgrs(s + QStringLiteral("00000000000000")); coords += UtmCoordinate::fromMgrs(s + QStringLiteral("00000000000000"));
staticDefaultSquaresHelper() = coords; staticDefaultSquaresHelper() = coords;
} }
QVector<UtmCoordinate> defaultMgrsSquares() QVector<UtmCoordinate> defaultMgrsSquares()
{ {
return staticDefaultSquaresHelper(); return staticDefaultSquaresHelper();
} }
UtmCoordinate preferedMgrsSquare() UtmCoordinate preferedMgrsSquare()
{ {
return staticPreferedMgrsSquareHelper(); return staticPreferedMgrsSquareHelper();
} }
bool lonLatAltToGeocentric(double lon, double lat, double altitude, double& xOut, double& yOut, double& zOut) bool lonLatAltToGeocentric(double lon, double lat, double altitude, double &xOut, double &yOut, double &zOut)
{ {
lon *= rad2deg(); lon *= rad2deg();
lat *= rad2deg(); lat *= rad2deg();
@@ -357,10 +354,10 @@ bool lonLatAltToGeocentric(double lon, double lat, double altitude, double& xOut
return false; return false;
} }
return true; return true;
} }
bool geocentric2LonLatAlt(double x, double y, double z, double& lon, double& lat, double& altitude) bool geocentric2LonLatAlt(double x, double y, double z, double &lon, double &lat, double &altitude)
{ {
try try
{ {
@@ -378,70 +375,63 @@ bool geocentric2LonLatAlt(double x, double y, double z, double& lon, double& lat
lon *= deg2rad(); lon *= deg2rad();
lat *= deg2rad(); lat *= deg2rad();
return true; return true;
} }
double distance(const QPointF& p1, const QPointF& p2) double distance(const QPointF &p1, const QPointF &p2)
{ {
return distance(p1.x(), p1.y(), p2.x(), p2.y()); return distance(p1.x(), p1.y(), p2.x(), p2.y());
} }
double squareDistance(const QPointF& p1, const QPointF& p2) double squareDistance(const QPointF &p1, const QPointF &p2)
{ {
return squareDistance(p1.x(), p1.y(), p2.x(), p2.y()); return squareDistance(p1.x(), p1.y(), p2.x(), p2.y());
} }
std::ostream& operator<<(std::ostream& stream, const UtmCoordinate& coord) std::ostream &operator<<(std::ostream &stream, const UtmCoordinate &coord)
{ {
stream << "UtmCoordinate(" << std::setprecision(8) << coord.x << "#" << std::setprecision(8) << coord.y stream << "UtmCoordinate(" << std::setprecision(8) << coord.x << "#" << std::setprecision(8) << coord.y << " zone=" << coord.zone << ")";
<< " zone=" << coord.zone << ")";
return stream; return stream;
} }
void dumpConversionCounter() void dumpConversionCounter()
{ {
fprintf(stderr, "LtsCoordTrans: s_conversion_counter_MGRS_Forward : - mgrs : %ld\n", fprintf(stderr, "LtsCoordTrans: s_conversion_counter_MGRS_Forward : - mgrs : %ld\n", s_conversion_counter_MGRS_Forward);
s_conversion_counter_MGRS_Forward); fprintf(stderr, "LtsCoordTrans: s_conversion_counter_MGRS_Reverse - fromMgrs : %ld\n", s_conversion_counter_MGRS_Reverse);
fprintf(stderr, "LtsCoordTrans: s_conversion_counter_MGRS_Reverse - fromMgrs : %ld\n", fprintf(stderr, "LtsCoordTrans: s_conversion_counter_WGS84_Forward - lonLatAltToGeocentric : %ld\n", s_conversion_counter_WGS84_Forward);
s_conversion_counter_MGRS_Reverse); fprintf(stderr, "LtsCoordTrans: s_conversion_counter_WGS84_Reverse - geocentric2LonLatAlt : %ld\n", s_conversion_counter_WGS84_Reverse);
fprintf(stderr, "LtsCoordTrans: s_conversion_counter_WGS84_Forward - lonLatAltToGeocentric : %ld\n", fprintf(stderr, "LtsCoordTrans: s_conversion_counter_UTMUPS_Forward - fromGeographic : %ld\n", s_conversion_counter_UTMUPS_Forward);
s_conversion_counter_WGS84_Forward); fprintf(stderr, "LtsCoordTrans: s_conversion_counter_UTMUPS_Reverse - geographic : %ld\n", s_conversion_counter_UTMUPS_Reverse);
fprintf(stderr, "LtsCoordTrans: s_conversion_counter_WGS84_Reverse - geocentric2LonLatAlt : %ld\n", }
s_conversion_counter_WGS84_Reverse);
fprintf(stderr, "LtsCoordTrans: s_conversion_counter_UTMUPS_Forward - fromGeographic : %ld\n",
s_conversion_counter_UTMUPS_Forward);
fprintf(stderr, "LtsCoordTrans: s_conversion_counter_UTMUPS_Reverse - geographic : %ld\n",
s_conversion_counter_UTMUPS_Reverse);
}
long getConversionCounter_MGRS_Forward() long getConversionCounter_MGRS_Forward()
{ {
return s_conversion_counter_MGRS_Forward; return s_conversion_counter_MGRS_Forward;
} }
long getConversionCounter_MGRS_Reverse() long getConversionCounter_MGRS_Reverse()
{ {
return s_conversion_counter_MGRS_Reverse; return s_conversion_counter_MGRS_Reverse;
} }
long getConversionCounter_WGS84_Forward() long getConversionCounter_WGS84_Forward()
{ {
return s_conversion_counter_WGS84_Forward; return s_conversion_counter_WGS84_Forward;
} }
long getConversionCounter_WGS84_Reverse() long getConversionCounter_WGS84_Reverse()
{ {
return s_conversion_counter_WGS84_Reverse; return s_conversion_counter_WGS84_Reverse;
} }
long getConversionCounter_UTMUPS_Forward() long getConversionCounter_UTMUPS_Forward()
{ {
return s_conversion_counter_UTMUPS_Forward; return s_conversion_counter_UTMUPS_Forward;
} }
long getConversionCounter_UTMUPS_Reverse() long getConversionCounter_UTMUPS_Reverse()
{ {
return s_conversion_counter_UTMUPS_Reverse; return s_conversion_counter_UTMUPS_Reverse;
} }
} // namespace LtsCoordTrans } // namespace LtsCoordTrans
@@ -14,23 +14,23 @@ class QString;
namespace LtsCoordTrans namespace LtsCoordTrans
{ {
inline Q_CONSTEXPR double pi() inline Q_CONSTEXPR double pi()
{ {
return M_PI; return M_PI;
} }
inline Q_CONSTEXPR double deg2rad() inline Q_CONSTEXPR double deg2rad()
{ {
return pi() / 180.; return pi() / 180.;
} }
inline Q_CONSTEXPR double rad2deg() inline Q_CONSTEXPR double rad2deg()
{ {
return 1. / deg2rad(); return 1. / deg2rad();
} }
struct LTSCOORDTRANS_EXPORT UtmCoordinate struct LTSCOORDTRANS_EXPORT UtmCoordinate
{ {
int zone = -1; int zone = -1;
bool northp = true; bool northp = true;
double x = 0.; double x = 0.;
@@ -38,127 +38,124 @@ struct LTSCOORDTRANS_EXPORT UtmCoordinate
UtmCoordinate() = default; UtmCoordinate() = default;
UtmCoordinate(int zone_, double x_, double y_, bool northp_ = true) : zone(zone_), northp(northp_), x(x_), y(y_) {} UtmCoordinate(int zone_, double x_, double y_, bool northp_ = true)
: zone(zone_)
bool isValid() const , northp(northp_)
, x(x_)
, y(y_)
{ {
return zone > 0 && zone <= 60;
} }
bool isValid() const { return zone > 0 && zone <= 60; }
QString mgrs(int prec = 5, bool withSpaces = true) const; QString mgrs(int prec = 5, bool withSpaces = true) const;
QPointF toPoint() const; QPointF toPoint() const;
QPointF geographic(double offsetX = 0., double offsetY = 0.) const; QPointF geographic(double offsetX = 0., double offsetY = 0.) const;
QPointF geographic(const QPointF& offset) const; QPointF geographic(const QPointF &offset) const;
QPointF relativeTo(const UtmCoordinate& other) const; QPointF relativeTo(const UtmCoordinate &other) const;
static UtmCoordinate fromGeographic(double lon, double lat, int setZone = -1); static UtmCoordinate fromGeographic(double lon, double lat, int setZone = -1);
static UtmCoordinate fromGeographic(const QPointF& lonLat, int setZone = -1); static UtmCoordinate fromGeographic(const QPointF &lonLat, int setZone = -1);
static UtmCoordinate fromMgrs(const QString& mgrs); static UtmCoordinate fromMgrs(const QString &mgrs);
}; };
LTSCOORDTRANS_EXPORT QString mgrsFromGeographic(double lon, double lat, int prec = 5, bool withSpaces = true); LTSCOORDTRANS_EXPORT QString mgrsFromGeographic(double lon, double lat, int prec = 5, bool withSpaces = true);
LTSCOORDTRANS_EXPORT QPointF geographicFromMgrs(const QString& mgrs); LTSCOORDTRANS_EXPORT QPointF geographicFromMgrs(const QString &mgrs);
LTSCOORDTRANS_EXPORT QRectF addMarginToArea(const QRectF& rect_LatLon_radiant, const QSize& marginMeter); LTSCOORDTRANS_EXPORT QRectF addMarginToArea(const QRectF &rect_LatLon_radiant, const QSize &marginMeter);
LTSCOORDTRANS_EXPORT QVector<UtmCoordinate> getMgrsSquares(const QRectF& rect, bool setAsDefaultSquares, LTSCOORDTRANS_EXPORT QVector<UtmCoordinate> getMgrsSquares(const QRectF &rect, bool setAsDefaultSquares, bool setAsPreferedSquare, bool setAsSquareWithMargin = false);
bool setAsPreferedSquare,
bool setAsSquareWithMargin = false);
QVector<UtmCoordinate> getMgrsSquaresInternal(const QRectF& rect); QVector<UtmCoordinate> getMgrsSquaresInternal(const QRectF &rect);
QStringList getMgrsSurroundingSquares(const QRectF& geoRect, const QSize& offsetMeter); QStringList getMgrsSurroundingSquares(const QRectF &geoRect, const QSize &offsetMeter);
LTSCOORDTRANS_EXPORT QVector<UtmCoordinate> defaultMgrsSquareWithOffsets(); LTSCOORDTRANS_EXPORT QVector<UtmCoordinate> defaultMgrsSquareWithOffsets();
LTSCOORDTRANS_EXPORT void setDefaultMgrsSquares(const QVector<QString>& squares); LTSCOORDTRANS_EXPORT void setDefaultMgrsSquares(const QVector<QString> &squares);
LTSCOORDTRANS_EXPORT QVector<UtmCoordinate> defaultMgrsSquares(); LTSCOORDTRANS_EXPORT QVector<UtmCoordinate> defaultMgrsSquares();
LTSCOORDTRANS_EXPORT UtmCoordinate preferedMgrsSquare(); LTSCOORDTRANS_EXPORT UtmCoordinate preferedMgrsSquare();
LTSCOORDTRANS_EXPORT bool lonLatAltToGeocentric(double lon, double lat, double altitude, double& xOut, double& yOut, LTSCOORDTRANS_EXPORT bool lonLatAltToGeocentric(double lon, double lat, double altitude, double &xOut, double &yOut, double &zOut);
double& zOut);
LTSCOORDTRANS_EXPORT bool geocentric2LonLatAlt(double x, double y, double z, double& lon, double& lat, LTSCOORDTRANS_EXPORT bool geocentric2LonLatAlt(double x, double y, double z, double &lon, double &lat, double &altitude);
double& altitude);
inline double squareDistance(const UtmCoordinate& p1, const UtmCoordinate& p2) inline double squareDistance(const UtmCoordinate &p1, const UtmCoordinate &p2)
{ {
if (p1.zone != p2.zone) if (p1.zone != p2.zone)
{ {
Q_ASSERT(false); Q_ASSERT(false);
return std::nan(""); return std::nan("");
} }
return std::pow(p1.x - p2.x, 2) + std::pow(p1.y - p2.y, 2); return std::pow(p1.x - p2.x, 2) + std::pow(p1.y - p2.y, 2);
} }
LTSCOORDTRANS_EXPORT double squareDistance(const QPointF& p1, const QPointF& p2); LTSCOORDTRANS_EXPORT double squareDistance(const QPointF &p1, const QPointF &p2);
inline double squareDistance(const double lon1, const double lat1, const double lon2, const double lat2) inline double squareDistance(const double lon1, const double lat1, const double lon2, const double lat2)
{ {
const auto p1(UtmCoordinate::fromGeographic(lon1, lat1)); const auto p1(UtmCoordinate::fromGeographic(lon1, lat1));
const auto p2(UtmCoordinate::fromGeographic(lon2, lat2, p1.zone)); const auto p2(UtmCoordinate::fromGeographic(lon2, lat2, p1.zone));
return squareDistance(p1, p2); return squareDistance(p1, p2);
} }
inline double squareDistance(const UtmCoordinate& p1, const double lon2, const double lat2) inline double squareDistance(const UtmCoordinate &p1, const double lon2, const double lat2)
{ {
const auto p2(UtmCoordinate::fromGeographic(lon2, lat2, p1.zone)); const auto p2(UtmCoordinate::fromGeographic(lon2, lat2, p1.zone));
return squareDistance(p1, p2); return squareDistance(p1, p2);
} }
inline double distance(const UtmCoordinate& p1, const UtmCoordinate& p2) inline double distance(const UtmCoordinate &p1, const UtmCoordinate &p2)
{ {
if (p1.zone != p2.zone) if (p1.zone != p2.zone)
{ {
Q_ASSERT(false); Q_ASSERT(false);
return std::nan(""); return std::nan("");
} }
return sqrt(squareDistance(p1, p2)); return sqrt(squareDistance(p1, p2));
} }
LTSCOORDTRANS_EXPORT double distance(const QPointF& p1, const QPointF& p2); LTSCOORDTRANS_EXPORT double distance(const QPointF &p1, const QPointF &p2);
inline double distance(const double lon1, const double lat1, const double lon2, const double lat2) inline double distance(const double lon1, const double lat1, const double lon2, const double lat2)
{ {
return sqrt(squareDistance(lon1, lat1, lon2, lat2)); return sqrt(squareDistance(lon1, lat1, lon2, lat2));
} }
inline double distance(const UtmCoordinate& p1, const double lon2, const double lat2) inline double distance(const UtmCoordinate &p1, const double lon2, const double lat2)
{ {
return sqrt(squareDistance(p1, lon2, lat2)); return sqrt(squareDistance(p1, lon2, lat2));
} }
LTSCOORDTRANS_EXPORT void dumpConversionCounter(); LTSCOORDTRANS_EXPORT void dumpConversionCounter();
LTSCOORDTRANS_EXPORT long getConversionCounter_MGRS_Forward(); LTSCOORDTRANS_EXPORT long getConversionCounter_MGRS_Forward();
LTSCOORDTRANS_EXPORT long getConversionCounter_MGRS_Reverse(); LTSCOORDTRANS_EXPORT long getConversionCounter_MGRS_Reverse();
LTSCOORDTRANS_EXPORT long getConversionCounter_WGS84_Forward(); LTSCOORDTRANS_EXPORT long getConversionCounter_WGS84_Forward();
LTSCOORDTRANS_EXPORT long getConversionCounter_WGS84_Reverse(); LTSCOORDTRANS_EXPORT long getConversionCounter_WGS84_Reverse();
LTSCOORDTRANS_EXPORT long getConversionCounter_UTMUPS_Forward(); LTSCOORDTRANS_EXPORT long getConversionCounter_UTMUPS_Forward();
LTSCOORDTRANS_EXPORT long getConversionCounter_UTMUPS_Reverse(); LTSCOORDTRANS_EXPORT long getConversionCounter_UTMUPS_Reverse();
LTSCOORDTRANS_EXPORT std::ostream& operator<<(std::ostream& stream, const UtmCoordinate& coord); LTSCOORDTRANS_EXPORT std::ostream &operator<<(std::ostream &stream, const UtmCoordinate &coord);
class LTSCOORDTRANS_EXPORT UtmCoordinate3D : public LtsCoordTrans::UtmCoordinate class LTSCOORDTRANS_EXPORT UtmCoordinate3D : public LtsCoordTrans::UtmCoordinate
{ {
using BaseClass = LtsCoordTrans::UtmCoordinate; using BaseClass = LtsCoordTrans::UtmCoordinate;
public: public:
UtmCoordinate3D() UtmCoordinate3D() { reset(); }
{
reset();
}
explicit UtmCoordinate3D(const LtsCoordTrans::UtmCoordinate& utm2d, double _zValue = std::nan("")) : BaseClass() explicit UtmCoordinate3D(const LtsCoordTrans::UtmCoordinate &utm2d, double _zValue = std::nan(""))
: BaseClass()
{ {
zone = utm2d.zone; zone = utm2d.zone;
northp = utm2d.northp; northp = utm2d.northp;
@@ -177,13 +174,10 @@ class LTSCOORDTRANS_EXPORT UtmCoordinate3D : public LtsCoordTrans::UtmCoordinate
zValue = std::nan(""); zValue = std::nan("");
} }
double z() const double z() const { return zValue; }
{
return zValue;
}
protected: protected:
double zValue{std::nan("")}; double zValue{std::nan("")};
}; };
} // namespace LtsCoordTrans } // namespace LtsCoordTrans
@@ -77,8 +77,7 @@ void coordtrans_test::testRelativeMetricalOffet()
QFETCH(QPoint, offset); QFETCH(QPoint, offset);
QFETCH(QString, correctMgrs); QFETCH(QString, correctMgrs);
const LtsCoordTrans::UtmCoordinate& utmRef = const LtsCoordTrans::UtmCoordinate &utmRef = LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U PD 99990 99990"));
LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U PD 99990 99990"));
qDebug() << "utmRef = " << utmRef.mgrs(); qDebug() << "utmRef = " << utmRef.mgrs();
{ {
@@ -99,12 +98,11 @@ void coordtrans_test::testRelativeMetricalOffet()
} }
} }
QRectF createArea(const QString& base, int xCenter, int yCenter, int width, int height) QRectF createArea(const QString &base, int xCenter, int yCenter, int width, int height)
{ {
QRectF areaRect = QRectF(xCenter - width / 2, yCenter - height / 2, width, height); QRectF areaRect = QRectF(xCenter - width / 2, yCenter - height / 2, width, height);
LtsCoordTrans::UtmCoordinate utmBase( LtsCoordTrans::UtmCoordinate utmBase(LtsCoordTrans::UtmCoordinate::fromGeographic(LtsCoordTrans::geographicFromMgrs(base)));
LtsCoordTrans::UtmCoordinate::fromGeographic(LtsCoordTrans::geographicFromMgrs(base)));
const QPointF topLeft(utmBase.geographic(areaRect.left(), areaRect.top())); const QPointF topLeft(utmBase.geographic(areaRect.left(), areaRect.top()));
const QPointF bottomRight(utmBase.geographic(areaRect.right(), areaRect.bottom())); const QPointF bottomRight(utmBase.geographic(areaRect.right(), areaRect.bottom()));
@@ -120,13 +118,10 @@ void coordtrans_test::testAddMarginToArea()
QRectF area = createArea(QStringLiteral("32U PD 0000000000"), 50000, 10000, 30000, 30000); QRectF area = createArea(QStringLiteral("32U PD 0000000000"), 50000, 10000, 30000, 30000);
QRectF area1Increased = LtsCoordTrans::addMarginToArea(area, QSize(5000, 20000)); QRectF area1Increased = LtsCoordTrans::addMarginToArea(area, QSize(5000, 20000));
qDebug() << "topLeft : " << qSetRealNumberPrecision(15) << area.topLeft() qDebug() << "topLeft : " << qSetRealNumberPrecision(15) << area.topLeft() << " - degree:" << area.topLeft() * LtsCoordTrans::rad2deg();
<< " - degree:" << area.topLeft() * LtsCoordTrans::rad2deg(); qDebug() << "topLeftInc : " << qSetRealNumberPrecision(15) << area1Increased.topLeft() << " - degree:" << area1Increased.topLeft() * LtsCoordTrans::rad2deg();
qDebug() << "topLeftInc : " << qSetRealNumberPrecision(15) << area1Increased.topLeft()
<< " - degree:" << area1Increased.topLeft() * LtsCoordTrans::rad2deg();
qDebug() << "bottomRight : " << qSetRealNumberPrecision(15) << area.bottomRight() qDebug() << "bottomRight : " << qSetRealNumberPrecision(15) << area.bottomRight() << " - degree:" << area.bottomRight() * LtsCoordTrans::rad2deg();
<< " - degree:" << area.bottomRight() * LtsCoordTrans::rad2deg();
qDebug() << "bottomRightInc : " << qSetRealNumberPrecision(15) << area1Increased.bottomRight() qDebug() << "bottomRightInc : " << qSetRealNumberPrecision(15) << area1Increased.bottomRight()
<< " - degree:" << area1Increased.bottomRight() * LtsCoordTrans::rad2deg(); << " - degree:" << area1Increased.bottomRight() * LtsCoordTrans::rad2deg();
@@ -142,13 +137,10 @@ void coordtrans_test::testAddMarginToArea()
QRectF area = createArea(QStringLiteral("32U LA 0000000000"), 100, 100, 5000, 5000); QRectF area = createArea(QStringLiteral("32U LA 0000000000"), 100, 100, 5000, 5000);
QRectF area1Increased = LtsCoordTrans::addMarginToArea(area, QSize(50000, 20000)); QRectF area1Increased = LtsCoordTrans::addMarginToArea(area, QSize(50000, 20000));
qDebug() << "topLeft : " << qSetRealNumberPrecision(15) << area.topLeft() qDebug() << "topLeft : " << qSetRealNumberPrecision(15) << area.topLeft() << " - degree:" << area.topLeft() * LtsCoordTrans::rad2deg();
<< " - degree:" << area.topLeft() * LtsCoordTrans::rad2deg(); qDebug() << "topLeftInc : " << qSetRealNumberPrecision(15) << area1Increased.topLeft() << " - degree:" << area1Increased.topLeft() * LtsCoordTrans::rad2deg();
qDebug() << "topLeftInc : " << qSetRealNumberPrecision(15) << area1Increased.topLeft()
<< " - degree:" << area1Increased.topLeft() * LtsCoordTrans::rad2deg();
qDebug() << "bottomRight : " << qSetRealNumberPrecision(15) << area.bottomRight() qDebug() << "bottomRight : " << qSetRealNumberPrecision(15) << area.bottomRight() << " - degree:" << area.bottomRight() * LtsCoordTrans::rad2deg();
<< " - degree:" << area.bottomRight() * LtsCoordTrans::rad2deg();
qDebug() << "bottomRightInc : " << qSetRealNumberPrecision(15) << area1Increased.bottomRight() qDebug() << "bottomRightInc : " << qSetRealNumberPrecision(15) << area1Increased.bottomRight()
<< " - degree:" << area1Increased.bottomRight() * LtsCoordTrans::rad2deg(); << " - degree:" << area1Increased.bottomRight() * LtsCoordTrans::rad2deg();
@@ -167,8 +159,7 @@ void coordtrans_test::testIncreaseRect()
QString mgrs = LtsCoordTrans::mgrsFromGeographic(lonlat.x(), lonlat.y(), 9); QString mgrs = LtsCoordTrans::mgrsFromGeographic(lonlat.x(), lonlat.y(), 9);
QCOMPARE(mgrs, QStringLiteral("32U MD 745000000 840000000")); QCOMPARE(mgrs, QStringLiteral("32U MD 745000000 840000000"));
const LtsCoordTrans::UtmCoordinate centerPoint = const LtsCoordTrans::UtmCoordinate centerPoint = LtsCoordTrans::UtmCoordinate::fromGeographic(lonlat.x(), lonlat.y());
LtsCoordTrans::UtmCoordinate::fromGeographic(lonlat.x(), lonlat.y());
LtsCoordTrans::UtmCoordinate topLeftUtm; LtsCoordTrans::UtmCoordinate topLeftUtm;
LtsCoordTrans::UtmCoordinate topLeftUtm2; LtsCoordTrans::UtmCoordinate topLeftUtm2;
@@ -178,11 +169,9 @@ void coordtrans_test::testIncreaseRect()
QPointF bottomRightGeo = centerPoint.geographic(3000, -4000); QPointF bottomRightGeo = centerPoint.geographic(3000, -4000);
topLeftUtm = LtsCoordTrans::UtmCoordinate::fromGeographic(topLeftGeo); topLeftUtm = LtsCoordTrans::UtmCoordinate::fromGeographic(topLeftGeo);
const LtsCoordTrans::UtmCoordinate bottomRightUtm = const LtsCoordTrans::UtmCoordinate bottomRightUtm = LtsCoordTrans::UtmCoordinate::fromGeographic(bottomRightGeo);
LtsCoordTrans::UtmCoordinate::fromGeographic(bottomRightGeo);
qDebug() << "topLeftUtm: " << topLeftUtm.x << " - " << qSetRealNumberPrecision(15) << topLeftUtm.y; qDebug() << "topLeftUtm: " << topLeftUtm.x << " - " << qSetRealNumberPrecision(15) << topLeftUtm.y;
qDebug() << "bottomRightUtm: " << bottomRightUtm.x << " - " << qSetRealNumberPrecision(15) qDebug() << "bottomRightUtm: " << bottomRightUtm.x << " - " << qSetRealNumberPrecision(15) << bottomRightUtm.y;
<< bottomRightUtm.y;
} }
{ {
@@ -194,8 +183,7 @@ void coordtrans_test::testIncreaseRect()
bottomRightUtm2.y = centerPoint.y - 4000; bottomRightUtm2.y = centerPoint.y - 4000;
qDebug() << "topLeftUtm2: " << topLeftUtm2.x << " - " << qSetRealNumberPrecision(15) << topLeftUtm2.y; qDebug() << "topLeftUtm2: " << topLeftUtm2.x << " - " << qSetRealNumberPrecision(15) << topLeftUtm2.y;
qDebug() << "bottomRightUtm2: " << bottomRightUtm2.x << " - " << qSetRealNumberPrecision(15) qDebug() << "bottomRightUtm2: " << bottomRightUtm2.x << " - " << qSetRealNumberPrecision(15) << bottomRightUtm2.y;
<< bottomRightUtm2.y;
} }
QVERIFY2(qFuzzyCompare(topLeftUtm.x, topLeftUtm2.x), "testIncreaseRect x failed"); QVERIFY2(qFuzzyCompare(topLeftUtm.x, topLeftUtm2.x), "testIncreaseRect x failed");
@@ -213,8 +201,7 @@ void coordtrans_test::testIncreaseRect2()
QRectF myRectIncreased; QRectF myRectIncreased;
{ {
const LtsCoordTrans::UtmCoordinate centerPoint = const LtsCoordTrans::UtmCoordinate centerPoint = LtsCoordTrans::UtmCoordinate::fromGeographic(lonlat.x(), lonlat.y());
LtsCoordTrans::UtmCoordinate::fromGeographic(lonlat.x(), lonlat.y());
QPointF topLeftGeo = centerPoint.geographic(-3000, 2000); QPointF topLeftGeo = centerPoint.geographic(-3000, 2000);
QPointF bottomRightGeo = centerPoint.geographic(3000, -2000); QPointF bottomRightGeo = centerPoint.geographic(3000, -2000);
@@ -239,10 +226,8 @@ void coordtrans_test::testIncreaseRect2()
qDebug() << "myRectIncreased height: " << myRectIncreased.height(); qDebug() << "myRectIncreased height: " << myRectIncreased.height();
} }
QVERIFY2((int)(myRectIncreased.center().x() * 10000) == (int)(myRect.center().x() * 10000), QVERIFY2((int)(myRectIncreased.center().x() * 10000) == (int)(myRect.center().x() * 10000), "testIncreaseRect2 centerX failed");
"testIncreaseRect2 centerX failed"); QVERIFY2((int)(myRectIncreased.center().y() * 10000) == (int)(myRect.center().y() * 10000), "testIncreaseRect2 centerY failed");
QVERIFY2((int)(myRectIncreased.center().y() * 10000) == (int)(myRect.center().y() * 10000),
"testIncreaseRect2 centerY failed");
QVERIFY2(myRectIncreased.width() > myRect.width(), "testIncreaseRect2 width failed"); QVERIFY2(myRectIncreased.width() > myRect.width(), "testIncreaseRect2 width failed");
QVERIFY2(myRectIncreased.height() > myRect.height(), "testIncreaseRect2 height failed"); QVERIFY2(myRectIncreased.height() > myRect.height(), "testIncreaseRect2 height failed");
@@ -260,50 +245,84 @@ void coordtrans_test::testGeographicFromMgrs()
void coordtrans_test::testMgrsSquares() void coordtrans_test::testMgrsSquares()
{ {
checkArea(QStringLiteral("32U PD 0000000000"), 50000, 10000, 30000, 30000, checkArea(QStringLiteral("32U PD 0000000000"), 50000, 10000, 30000, 30000, {QStringLiteral("32U PC"), QStringLiteral("32U PD")});
{QStringLiteral("32U PC"), QStringLiteral("32U PD")}); checkArea(QStringLiteral("32U MD 0000000000"), 50000, 10000, 30000, 30000, {QStringLiteral("32U MC"), QStringLiteral("32U MD")});
checkArea(QStringLiteral("32U MD 0000000000"), 50000, 10000, 30000, 30000, checkArea(QStringLiteral("32U MD 0000000000"),
{QStringLiteral("32U MC"), QStringLiteral("32U MD")}); 89999,
checkArea(QStringLiteral("32U MD 0000000000"), 89999, 89999, 21000, 21000, 89999,
21000,
21000,
{QStringLiteral("32U MD"), QStringLiteral("32U ME"), QStringLiteral("32U ND"), QStringLiteral("32U NE")}); {QStringLiteral("32U MD"), QStringLiteral("32U ME"), QStringLiteral("32U ND"), QStringLiteral("32U NE")});
checkArea(QStringLiteral("39Q XG 0000000000"), 40000, 35000, 60000, 70000, checkArea(QStringLiteral("39Q XG 0000000000"), 40000, 35000, 60000, 70000, {QStringLiteral("39Q XG"), QStringLiteral("39R XG")});
{QStringLiteral("39Q XG"), QStringLiteral("39R XG")});
checkArea(QStringLiteral("40R CP 0000000000"), 94000, 9000, 7000, 16000, {QStringLiteral("40R CP")}); checkArea(QStringLiteral("40R CP 0000000000"), 94000, 9000, 7000, 16000, {QStringLiteral("40R CP")});
checkArea(QStringLiteral("40R DN 0000000000"), 500, 95500, 12000, 7000, checkArea(QStringLiteral("40R DN 0000000000"), 500, 95500, 12000, 7000, {QStringLiteral("40R CN"), QStringLiteral("40R DN")});
{QStringLiteral("40R CN"), QStringLiteral("40R DN")}); checkArea(QStringLiteral("40R DN 0000000000"),
checkArea(QStringLiteral("40R DN 0000000000"), 500, 96760, 30000, 30000, 500,
96760,
30000,
30000,
{QStringLiteral("40R CN"), QStringLiteral("40R CP"), QStringLiteral("40R DN"), QStringLiteral("40R DP")}); {QStringLiteral("40R CN"), QStringLiteral("40R CP"), QStringLiteral("40R DN"), QStringLiteral("40R DP")});
checkArea(QStringLiteral("40R BM 0000000000"), 59000, 59500, 46000, 40000, checkArea(QStringLiteral("40R BM 0000000000"), 59000, 59500, 46000, 40000, {QStringLiteral("40Q BM"), QStringLiteral("40R BM")});
{QStringLiteral("40Q BM"), QStringLiteral("40R BM")});
checkArea(QStringLiteral("32U LA 0000000000"), 10000, 10000, 5000, 5000, checkArea(QStringLiteral("32U LA 0000000000"),
10000,
10000,
5000,
5000,
{ {
QStringLiteral("32U LA"), QStringLiteral("32U LA"),
}); });
checkArea(QStringLiteral("32U LA 0000000000"), 100, 100, 60000, 60000, checkArea(QStringLiteral("32U LA 0000000000"),
{QStringLiteral("31U GQ"), QStringLiteral("31U GR"), QStringLiteral("32U KA"), QStringLiteral("32U KV"), 100,
QStringLiteral("32U LA"), QStringLiteral("32U LV")}); 100,
60000,
60000,
{QStringLiteral("31U GQ"), QStringLiteral("31U GR"), QStringLiteral("32U KA"), QStringLiteral("32U KV"), QStringLiteral("32U LA"), QStringLiteral("32U LV")});
checkArea(QStringLiteral("32U LA 0000000000"), 100, 100, 150000, 150000, checkArea(QStringLiteral("32U LA 0000000000"),
{QStringLiteral("31U FQ"), QStringLiteral("31U FR"), QStringLiteral("31U GQ"), QStringLiteral("31U GR"), 100,
QStringLiteral("32U KA"), QStringLiteral("32U KV"), QStringLiteral("32U LA"), QStringLiteral("32U LV")}); 100,
150000,
150000,
{QStringLiteral("31U FQ"),
QStringLiteral("31U FR"),
QStringLiteral("31U GQ"),
QStringLiteral("31U GR"),
QStringLiteral("32U KA"),
QStringLiteral("32U KV"),
QStringLiteral("32U LA"),
QStringLiteral("32U LV")});
checkArea(QStringLiteral("32U LA 0000000000"), 100, 100, 200000, 200000, checkArea(QStringLiteral("32U LA 0000000000"),
{QStringLiteral("31U FP"), QStringLiteral("31U FQ"), QStringLiteral("31U FR"), QStringLiteral("31U GP"), 100,
QStringLiteral("31U GQ"), QStringLiteral("31U GR"), QStringLiteral("31U GS"), QStringLiteral("32U KA"), 100,
QStringLiteral("32U KB"), QStringLiteral("32U KV"), QStringLiteral("32U LA"), QStringLiteral("32U LB"), 200000,
QStringLiteral("32U LV"), QStringLiteral("32U MA"), QStringLiteral("32U MB"), QStringLiteral("32U MV")}); 200000,
{QStringLiteral("31U FP"),
QStringLiteral("31U FQ"),
QStringLiteral("31U FR"),
QStringLiteral("31U GP"),
QStringLiteral("31U GQ"),
QStringLiteral("31U GR"),
QStringLiteral("31U GS"),
QStringLiteral("32U KA"),
QStringLiteral("32U KB"),
QStringLiteral("32U KV"),
QStringLiteral("32U LA"),
QStringLiteral("32U LB"),
QStringLiteral("32U LV"),
QStringLiteral("32U MA"),
QStringLiteral("32U MB"),
QStringLiteral("32U MV")});
} }
QVector<LtsCoordTrans::UtmCoordinate> checkAreaGetMgrsSquares(const QString& base, int xCenter, int yCenter, int width, QVector<LtsCoordTrans::UtmCoordinate> checkAreaGetMgrsSquares(const QString &base, int xCenter, int yCenter, int width, int height)
int height)
{ {
QRectF areaRect = QRectF(xCenter - width / 2, yCenter - height / 2, width, height); QRectF areaRect = QRectF(xCenter - width / 2, yCenter - height / 2, width, height);
LtsCoordTrans::UtmCoordinate utmBase( LtsCoordTrans::UtmCoordinate utmBase(LtsCoordTrans::UtmCoordinate::fromGeographic(LtsCoordTrans::geographicFromMgrs(base)));
LtsCoordTrans::UtmCoordinate::fromGeographic(LtsCoordTrans::geographicFromMgrs(base)));
const QPointF topLeft(utmBase.geographic(areaRect.left(), areaRect.top())); const QPointF topLeft(utmBase.geographic(areaRect.left(), areaRect.top()));
const QPointF bottomRight(utmBase.geographic(areaRect.right(), areaRect.bottom())); const QPointF bottomRight(utmBase.geographic(areaRect.right(), areaRect.bottom()));
@@ -311,7 +330,7 @@ QVector<LtsCoordTrans::UtmCoordinate> checkAreaGetMgrsSquares(const QString& bas
QStringList src; QStringList src;
src.reserve(squares.size()); src.reserve(squares.size());
for (const auto& utm : squares) for (const auto &utm : squares)
src += utm.mgrs(0); src += utm.mgrs(0);
src.sort(); src.sort();
@@ -323,42 +342,39 @@ void coordtrans_test::testMgrsSquaresWithSurrounding()
int initialSize = 5000; int initialSize = 5000;
QVector<LtsCoordTrans::UtmCoordinate> squares1 = QVector<LtsCoordTrans::UtmCoordinate> squares1 = checkAreaGetMgrsSquares(QStringLiteral("32U NC 0000000000"), 50000, 50000, initialSize, initialSize);
checkAreaGetMgrsSquares(QStringLiteral("32U NC 0000000000"), 50000, 50000, initialSize, initialSize);
QVERIFY2(squares1.size() == 1, "checkAreaGetMgrsSquares failed"); QVERIFY2(squares1.size() == 1, "checkAreaGetMgrsSquares failed");
int biggerSize = initialSize + (1 * 110000); int biggerSize = initialSize + (1 * 110000);
QVector<LtsCoordTrans::UtmCoordinate> squares9 = QVector<LtsCoordTrans::UtmCoordinate> squares9 = checkAreaGetMgrsSquares(QStringLiteral("32U NC 0000000000"), 50000, 50000, biggerSize, biggerSize);
checkAreaGetMgrsSquares(QStringLiteral("32U NC 0000000000"), 50000, 50000, biggerSize, biggerSize);
QVERIFY2(squares9.size() == 9, "checkAreaGetMgrsSquares biggerSize failed"); QVERIFY2(squares9.size() == 9, "checkAreaGetMgrsSquares biggerSize failed");
int muchBiggerSize = initialSize + (3 * 110000); int muchBiggerSize = initialSize + (3 * 110000);
QVector<LtsCoordTrans::UtmCoordinate> square33 = QVector<LtsCoordTrans::UtmCoordinate> square33 = checkAreaGetMgrsSquares(QStringLiteral("32U NC 0000000000"), 50000, 50000, muchBiggerSize, muchBiggerSize);
checkAreaGetMgrsSquares(QStringLiteral("32U NC 0000000000"), 50000, 50000, muchBiggerSize, muchBiggerSize);
QVERIFY2(square33.size() == 33, "checkAreaGetMgrsSquares muchBiggerSize failed"); QVERIFY2(square33.size() == 33, "checkAreaGetMgrsSquares muchBiggerSize failed");
QStringList string1; QStringList string1;
string1.reserve(squares1.size()); string1.reserve(squares1.size());
for (const LtsCoordTrans::UtmCoordinate& item : std::as_const(squares1)) for (const LtsCoordTrans::UtmCoordinate &item : std::as_const(squares1))
string1.append(item.mgrs(0)); string1.append(item.mgrs(0));
QStringList string9; QStringList string9;
string9.reserve(squares9.size()); string9.reserve(squares9.size());
for (const LtsCoordTrans::UtmCoordinate& item : std::as_const(squares9)) for (const LtsCoordTrans::UtmCoordinate &item : std::as_const(squares9))
string9.append(item.mgrs(0)); string9.append(item.mgrs(0));
QStringList string33; QStringList string33;
string33.reserve(square33.size()); string33.reserve(square33.size());
for (const LtsCoordTrans::UtmCoordinate& item : std::as_const(square33)) for (const LtsCoordTrans::UtmCoordinate &item : std::as_const(square33))
string33.append(item.mgrs(0)); string33.append(item.mgrs(0));
{ {
QStringList surroundingStrings; QStringList surroundingStrings;
surroundingStrings.reserve(squares9.size()); surroundingStrings.reserve(squares9.size());
for (const QString& str : std::as_const(string9)) for (const QString &str : std::as_const(string9))
if (!string1.contains(str)) if (!string1.contains(str))
surroundingStrings.append(str); surroundingStrings.append(str);
@@ -368,7 +384,7 @@ void coordtrans_test::testMgrsSquaresWithSurrounding()
{ {
QStringList surroundingStrings; QStringList surroundingStrings;
surroundingStrings.reserve(string33.size()); surroundingStrings.reserve(string33.size());
for (const QString& str : std::as_const(string33)) for (const QString &str : std::as_const(string33))
if (!string1.contains(str)) if (!string1.contains(str))
surroundingStrings.append(str); surroundingStrings.append(str);
@@ -376,13 +392,11 @@ void coordtrans_test::testMgrsSquaresWithSurrounding()
} }
} }
void coordtrans_test::checkArea(const QString& base, int xCenter, int yCenter, int width, int height, void coordtrans_test::checkArea(const QString &base, int xCenter, int yCenter, int width, int height, const QStringList &coords)
const QStringList& coords)
{ {
qDebug() << "checkArea : base: " << base; qDebug() << "checkArea : base: " << base;
QRectF areaRect = QRectF(xCenter - width / 2, yCenter - height / 2, width, height); QRectF areaRect = QRectF(xCenter - width / 2, yCenter - height / 2, width, height);
LtsCoordTrans::UtmCoordinate utmBase( LtsCoordTrans::UtmCoordinate utmBase(LtsCoordTrans::UtmCoordinate::fromGeographic(LtsCoordTrans::geographicFromMgrs(base)));
LtsCoordTrans::UtmCoordinate::fromGeographic(LtsCoordTrans::geographicFromMgrs(base)));
const QPointF topLeft(utmBase.geographic(areaRect.left(), areaRect.top())); const QPointF topLeft(utmBase.geographic(areaRect.left(), areaRect.top()));
const QPointF bottomRight(utmBase.geographic(areaRect.right(), areaRect.bottom())); const QPointF bottomRight(utmBase.geographic(areaRect.right(), areaRect.bottom()));
qDebug() << "TopLeft: " << topLeft * LtsCoordTrans::rad2deg(); qDebug() << "TopLeft: " << topLeft * LtsCoordTrans::rad2deg();
@@ -392,7 +406,7 @@ void coordtrans_test::checkArea(const QString& base, int xCenter, int yCenter, i
QStringList src; QStringList src;
src.reserve(squares.size()); src.reserve(squares.size());
for (const auto& utm : squares) for (const auto &utm : squares)
src += utm.mgrs(0); src += utm.mgrs(0);
src.sort(); src.sort();
qDebug() << "src: '" << src << "' expected: '" << coords << "'"; qDebug() << "src: '" << src << "' expected: '" << coords << "'";
@@ -8,7 +8,7 @@
class coordtrans_test : public QObject class coordtrans_test : public QObject
{ {
Q_OBJECT Q_OBJECT
private Q_SLOTS: private Q_SLOTS:
void initTestCase(); void initTestCase();
void cleanupTestCase(); void cleanupTestCase();
void testFromGeographic(); void testFromGeographic();
@@ -26,6 +26,6 @@ class coordtrans_test : public QObject
void testMgrsSquaresWithSurrounding(); void testMgrsSquaresWithSurrounding();
private: private:
void checkArea(const QString& base, int xCenter, int yCenter, int width, int height, const QStringList& coords); void checkArea(const QString &base, int xCenter, int yCenter, int width, int height, const QStringList &coords);
}; };
@@ -10,116 +10,118 @@
namespace LtsCoordWidget namespace LtsCoordWidget
{ {
LtsCoordWidget::LtsCoordWidget(DisplayType dt, QWidget* parent) : QWidget(parent), m_displayType(dt) LtsCoordWidget::LtsCoordWidget(DisplayType dt, QWidget *parent)
{ : QWidget(parent)
, m_displayType(dt)
{
setFocusPolicy(Qt::StrongFocus); setFocusPolicy(Qt::StrongFocus);
rebuildUi(); rebuildUi();
} }
void LtsCoordWidget::setCoordinate(const QPointF& geoCoord, bool bUseAsDefaultValue) void LtsCoordWidget::setCoordinate(const QPointF &geoCoord, bool bUseAsDefaultValue)
{ {
if (m_coordinate != geoCoord) if (m_coordinate != geoCoord)
emit coordinateChanged(geoCoord); emit coordinateChanged(geoCoord);
if (bUseAsDefaultValue) if (bUseAsDefaultValue)
m_defaultCoordinate = geoCoord; m_defaultCoordinate = geoCoord;
if (m_inputWidgetHandler) if (m_inputWidgetHandler)
m_inputWidgetHandler->setCoordinate(geoCoord); m_inputWidgetHandler->setCoordinate(geoCoord);
} }
void LtsCoordWidget::clear() void LtsCoordWidget::clear()
{ {
if (m_inputWidgetHandler) if (m_inputWidgetHandler)
m_inputWidgetHandler->clear(); m_inputWidgetHandler->clear();
} }
void LtsCoordWidget::setCoordinate(double lon, double lat, bool bUseAsDefaultValue) void LtsCoordWidget::setCoordinate(double lon, double lat, bool bUseAsDefaultValue)
{ {
setCoordinate(QPointF(lon, lat), bUseAsDefaultValue); setCoordinate(QPointF(lon, lat), bUseAsDefaultValue);
} }
QPointF LtsCoordWidget::coordinate() const QPointF LtsCoordWidget::coordinate() const
{ {
if (!m_inputWidgetHandler) if (!m_inputWidgetHandler)
return QPointF(); return QPointF();
return m_inputWidgetHandler->coordinate(); return m_inputWidgetHandler->coordinate();
} }
LtsCoordWidget::DisplayType LtsCoordWidget::displayType() const LtsCoordWidget::DisplayType LtsCoordWidget::displayType() const
{ {
return m_displayType; return m_displayType;
} }
void LtsCoordWidget::setDisplayType(LtsCoordWidget::DisplayType dt) void LtsCoordWidget::setDisplayType(LtsCoordWidget::DisplayType dt)
{ {
if (m_displayType == dt) if (m_displayType == dt)
return; return;
m_displayType = dt; m_displayType = dt;
rebuildUi(); rebuildUi();
} }
bool LtsCoordWidget::withResetButton() const bool LtsCoordWidget::withResetButton() const
{ {
return m_bWithResetButton; return m_bWithResetButton;
} }
void LtsCoordWidget::setWithResetButton(bool bWith) void LtsCoordWidget::setWithResetButton(bool bWith)
{ {
if (m_bWithResetButton == bWith) if (m_bWithResetButton == bWith)
return; return;
m_bWithResetButton = bWith; m_bWithResetButton = bWith;
if (m_inputWidgetHandler) if (m_inputWidgetHandler)
m_inputWidgetHandler->resetButton()->setVisible(m_bWithResetButton); m_inputWidgetHandler->resetButton()->setVisible(m_bWithResetButton);
} }
bool LtsCoordWidget::showToolTip() const bool LtsCoordWidget::showToolTip() const
{ {
return m_bShowToolTip; return m_bShowToolTip;
} }
void LtsCoordWidget::setShowToolTip(bool bShow) void LtsCoordWidget::setShowToolTip(bool bShow)
{ {
if (m_bShowToolTip == bShow) if (m_bShowToolTip == bShow)
return; return;
m_bShowToolTip = bShow; m_bShowToolTip = bShow;
updateToolTip(); updateToolTip();
} }
bool LtsCoordWidget::mgrsSquareEditable() const bool LtsCoordWidget::mgrsSquareEditable() const
{ {
return m_bMgrsSquareEditable; return m_bMgrsSquareEditable;
} }
void LtsCoordWidget::setMgrsSquareEditable(bool bEditable) void LtsCoordWidget::setMgrsSquareEditable(bool bEditable)
{ {
if (m_bMgrsSquareEditable == bEditable) if (m_bMgrsSquareEditable == bEditable)
return; return;
m_bMgrsSquareEditable = bEditable; m_bMgrsSquareEditable = bEditable;
if (m_inputWidgetHandler) if (m_inputWidgetHandler)
m_inputWidgetHandler->setSquaresEditable(bEditable); m_inputWidgetHandler->setSquaresEditable(bEditable);
} }
void LtsCoordWidget::setWithSurroundingMgrsSquares(bool bEnable) void LtsCoordWidget::setWithSurroundingMgrsSquares(bool bEnable)
{ {
if (m_inputWidgetHandler) if (m_inputWidgetHandler)
m_inputWidgetHandler->setWithSurroundingSquare(bEnable); m_inputWidgetHandler->setWithSurroundingSquare(bEnable);
} }
void LtsCoordWidget::setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate>& geoCoords) void LtsCoordWidget::setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate> &geoCoords)
{ {
if (m_inputWidgetHandler) if (m_inputWidgetHandler)
m_inputWidgetHandler->setMgrsSquares(geoCoords); m_inputWidgetHandler->setMgrsSquares(geoCoords);
} }
bool LtsCoordWidget::event(QEvent* event) bool LtsCoordWidget::event(QEvent *event)
{ {
if (event->type() == QEvent::ToolTip) if (event->type() == QEvent::ToolTip)
updateToolTip(); updateToolTip();
return QWidget::event(event); return QWidget::event(event);
} }
void LtsCoordWidget::rebuildUi() void LtsCoordWidget::rebuildUi()
{ {
if (m_inputWidgetHandler) if (m_inputWidgetHandler)
{ {
@@ -149,18 +151,15 @@ void LtsCoordWidget::rebuildUi()
m_inputWidgetHandler->setSquaresEditable(m_bMgrsSquareEditable); m_inputWidgetHandler->setSquaresEditable(m_bMgrsSquareEditable);
m_inputWidgetHandler->resetButton()->setVisible(m_bWithResetButton); m_inputWidgetHandler->resetButton()->setVisible(m_bWithResetButton);
connect(m_inputWidgetHandler->resetButton(), &QToolButton::clicked, this, connect(m_inputWidgetHandler->resetButton(), &QToolButton::clicked, this, &LtsCoordWidget::onResetToDefaultCoordinate);
&LtsCoordWidget::onResetToDefaultCoordinate); connect(m_inputWidgetHandler, &LtsCoordInputWidgetHandler::coordinateChanged, this, &LtsCoordWidget::coordinateChanged);
connect(m_inputWidgetHandler, &LtsCoordInputWidgetHandler::coordinateChanged, this, connect(m_inputWidgetHandler, &LtsCoordInputWidgetHandler::invalidCoordinate, this, &LtsCoordWidget::invalidCoordinate);
&LtsCoordWidget::coordinateChanged);
connect(m_inputWidgetHandler, &LtsCoordInputWidgetHandler::invalidCoordinate, this,
&LtsCoordWidget::invalidCoordinate);
if (!m_defaultCoordinate.isNull()) if (!m_defaultCoordinate.isNull())
m_inputWidgetHandler->setCoordinate(m_defaultCoordinate); m_inputWidgetHandler->setCoordinate(m_defaultCoordinate);
} }
void LtsCoordWidget::updateToolTip() void LtsCoordWidget::updateToolTip()
{ {
QString tt; QString tt;
if (m_bShowToolTip) if (m_bShowToolTip)
{ {
@@ -173,15 +172,15 @@ void LtsCoordWidget::updateToolTip()
} }
} }
setToolTip(tt); setToolTip(tt);
} }
void LtsCoordWidget::onResetToDefaultCoordinate() void LtsCoordWidget::onResetToDefaultCoordinate()
{ {
if (!m_inputWidgetHandler) if (!m_inputWidgetHandler)
return; return;
if (m_defaultCoordinate.isNull()) if (m_defaultCoordinate.isNull())
m_inputWidgetHandler->clear(); m_inputWidgetHandler->clear();
m_inputWidgetHandler->setCoordinate(m_defaultCoordinate); m_inputWidgetHandler->setCoordinate(m_defaultCoordinate);
} }
} // namespace LtsCoordWidget } // namespace LtsCoordWidget
@@ -10,43 +10,53 @@ class QToolButton;
namespace LtsCoordWidget namespace LtsCoordWidget
{ {
class LtsCoordInputWidgetHandler; class LtsCoordInputWidgetHandler;
class LTSCOORDWIDGET_EXPORT LtsCoordWidget : public QWidget class LTSCOORDWIDGET_EXPORT LtsCoordWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
enum class DisplayType { MGRS5, MGRS7, UTM, WGS84, MGRS = DisplayType::MGRS5 }; enum class DisplayType
{
MGRS5,
MGRS7,
UTM,
WGS84,
MGRS = DisplayType::MGRS5
};
Q_ENUM(DisplayType) Q_ENUM(DisplayType)
Q_PROPERTY(DisplayType displayType READ displayType WRITE setDisplayType) Q_PROPERTY(DisplayType displayType READ displayType WRITE setDisplayType)
Q_PROPERTY(bool withResetButton READ withResetButton WRITE setWithResetButton) Q_PROPERTY(bool withResetButton READ withResetButton WRITE setWithResetButton)
Q_PROPERTY(bool showToolTip READ showToolTip WRITE setShowToolTip) Q_PROPERTY(bool showToolTip READ showToolTip WRITE setShowToolTip)
Q_PROPERTY(bool mgrsSquareEditable READ mgrsSquareEditable WRITE setMgrsSquareEditable) Q_PROPERTY(bool mgrsSquareEditable READ mgrsSquareEditable WRITE setMgrsSquareEditable)
explicit LtsCoordWidget(QWidget* parent = nullptr) : LtsCoordWidget(LtsCoordWidget::DisplayType::MGRS, parent) {} explicit LtsCoordWidget(QWidget *parent = nullptr)
: LtsCoordWidget(LtsCoordWidget::DisplayType::MGRS, parent)
{
}
explicit LtsCoordWidget(DisplayType dt, QWidget* parent = nullptr); explicit LtsCoordWidget(DisplayType dt, QWidget *parent = nullptr);
QPointF coordinate() const; QPointF coordinate() const;
DisplayType displayType() const; DisplayType displayType() const;
bool withResetButton() const; bool withResetButton() const;
bool showToolTip() const; bool showToolTip() const;
bool mgrsSquareEditable() const; bool mgrsSquareEditable() const;
bool event(QEvent* event) override; bool event(QEvent *event) override;
public Q_SLOTS: public Q_SLOTS:
void setCoordinate(const QPointF& geoCoord, bool bUseAsDefaultValue = true); void setCoordinate(const QPointF &geoCoord, bool bUseAsDefaultValue = true);
void setCoordinate(double lon, double lat, bool bUseAsDefaultValue = true); void setCoordinate(double lon, double lat, bool bUseAsDefaultValue = true);
void setDisplayType(LtsCoordWidget::DisplayType dt); void setDisplayType(LtsCoordWidget::DisplayType dt);
void setWithResetButton(bool bWith); void setWithResetButton(bool bWith);
void setShowToolTip(bool bShow); void setShowToolTip(bool bShow);
void setMgrsSquareEditable(bool bEditable); void setMgrsSquareEditable(bool bEditable);
void setWithSurroundingMgrsSquares(bool bEnable); void setWithSurroundingMgrsSquares(bool bEnable);
void setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate>& geoCoords); void setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate> &geoCoords);
void clear(); void clear();
Q_SIGNALS: Q_SIGNALS:
void coordinateChanged(const QPointF& newGeoCoord); void coordinateChanged(const QPointF &newGeoCoord);
void invalidCoordinate(); void invalidCoordinate();
private: private:
@@ -60,8 +70,8 @@ class LTSCOORDWIDGET_EXPORT LtsCoordWidget : public QWidget
bool m_bShowToolTip = true; bool m_bShowToolTip = true;
bool m_bMgrsSquareEditable = false; bool m_bMgrsSquareEditable = false;
LtsCoordWidget::DisplayType m_displayType = LtsCoordWidget::DisplayType::MGRS; LtsCoordWidget::DisplayType m_displayType = LtsCoordWidget::DisplayType::MGRS;
LtsCoordInputWidgetHandler* m_inputWidgetHandler = nullptr; LtsCoordInputWidgetHandler *m_inputWidgetHandler = nullptr;
QPointF m_coordinate; QPointF m_coordinate;
QPointF m_defaultCoordinate; QPointF m_defaultCoordinate;
}; };
} // namespace LtsCoordWidget } // namespace LtsCoordWidget
@@ -7,8 +7,8 @@
namespace LtsCoordWidget namespace LtsCoordWidget
{ {
void LtsCoordInputWidgetHandler::onCoordinateDataChanged() void LtsCoordInputWidgetHandler::onCoordinateDataChanged()
{ {
const QPointF coord(coordinate()); const QPointF coord(coordinate());
if (coord.isNull()) if (coord.isNull())
{ {
@@ -16,11 +16,13 @@ void LtsCoordInputWidgetHandler::onCoordinateDataChanged()
return; return;
} }
emit coordinateChanged(coord); emit coordinateChanged(coord);
} }
MgrsEdit::MgrsEdit(int precision, QWidget* widget) MgrsEdit::MgrsEdit(int precision, QWidget *widget)
: LtsCoordInputWidgetHandler(widget), m_precision(precision), m_ui(new Ui::Mgrs) : LtsCoordInputWidgetHandler(widget)
{ , m_precision(precision)
, m_ui(new Ui::Mgrs)
{
m_ui->setupUi(widget); m_ui->setupUi(widget);
if (m_precision < 0) if (m_precision < 0)
@@ -32,25 +34,24 @@ MgrsEdit::MgrsEdit(int precision, QWidget* widget)
m_ui->leNorth->setValidator(new QIntValidator(0, upperLimit, m_ui->leNorth)); m_ui->leNorth->setValidator(new QIntValidator(0, upperLimit, m_ui->leNorth));
setDefaultMgrsSquares(); setDefaultMgrsSquares();
connect(m_ui->cbxZone, QOverload<int>::of(&QComboBox::currentIndexChanged), this, connect(m_ui->cbxZone, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &MgrsEdit::onCoordinateDataChanged);
&MgrsEdit::onCoordinateDataChanged);
connect(m_ui->leEast, &QLineEdit::editingFinished, this, &MgrsEdit::onCoordinateDataChanged); connect(m_ui->leEast, &QLineEdit::editingFinished, this, &MgrsEdit::onCoordinateDataChanged);
connect(m_ui->leNorth, &QLineEdit::editingFinished, this, &MgrsEdit::onCoordinateDataChanged); connect(m_ui->leNorth, &QLineEdit::editingFinished, this, &MgrsEdit::onCoordinateDataChanged);
} }
MgrsEdit::~MgrsEdit() MgrsEdit::~MgrsEdit()
{ {
delete m_ui; delete m_ui;
} }
bool MgrsEdit::isValid() bool MgrsEdit::isValid()
{ {
const QString& east = m_ui->leEast->text(); const QString &east = m_ui->leEast->text();
if (east.size() != m_precision) if (east.size() != m_precision)
return false; return false;
const QString& north = m_ui->leNorth->text(); const QString &north = m_ui->leNorth->text();
if (north.size() != m_precision) if (north.size() != m_precision)
return false; return false;
@@ -61,10 +62,10 @@ bool MgrsEdit::isValid()
return false; return false;
return true; return true;
} }
void MgrsEdit::setCoordinate(const QPointF& geoCoord) void MgrsEdit::setCoordinate(const QPointF &geoCoord)
{ {
const QString mgrsString = LtsCoordTrans::mgrsFromGeographic(geoCoord.x(), geoCoord.y(), m_precision, false); const QString mgrsString = LtsCoordTrans::mgrsFromGeographic(geoCoord.x(), geoCoord.y(), m_precision, false);
if (mgrsString.isEmpty()) if (mgrsString.isEmpty())
{ {
@@ -88,10 +89,10 @@ void MgrsEdit::setCoordinate(const QPointF& geoCoord)
m_ui->cbxZone->setCurrentIndex(idx); m_ui->cbxZone->setCurrentIndex(idx);
m_ui->leEast->setText(east); m_ui->leEast->setText(east);
m_ui->leNorth->setText(north); m_ui->leNorth->setText(north);
} }
static inline QString getMgrsCoord(QLineEdit* le, int prec) static inline QString getMgrsCoord(QLineEdit *le, int prec)
{ {
QString ret = le->text(); QString ret = le->text();
if (ret.isEmpty()) if (ret.isEmpty())
return ret; return ret;
@@ -99,10 +100,10 @@ static inline QString getMgrsCoord(QLineEdit* le, int prec)
ret += QLatin1Char('0'); ret += QLatin1Char('0');
le->setText(ret); le->setText(ret);
return ret; return ret;
} }
QPointF MgrsEdit::coordinate() const QPointF MgrsEdit::coordinate() const
{ {
const QString east = getMgrsCoord(m_ui->leEast, m_precision); const QString east = getMgrsCoord(m_ui->leEast, m_precision);
const QString north = getMgrsCoord(m_ui->leNorth, m_precision); const QString north = getMgrsCoord(m_ui->leNorth, m_precision);
if (east.isEmpty() || north.isEmpty() || m_ui->cbxZone->currentIndex() < 0) if (east.isEmpty() || north.isEmpty() || m_ui->cbxZone->currentIndex() < 0)
@@ -110,93 +111,93 @@ QPointF MgrsEdit::coordinate() const
const QString mgrsString(m_ui->cbxZone->currentText() + east + north); const QString mgrsString(m_ui->cbxZone->currentText() + east + north);
return LtsCoordTrans::geographicFromMgrs(mgrsString); return LtsCoordTrans::geographicFromMgrs(mgrsString);
} }
QToolButton* MgrsEdit::resetButton() QToolButton *MgrsEdit::resetButton()
{ {
return m_ui->tbReset; return m_ui->tbReset;
} }
void MgrsEdit::cleanup() void MgrsEdit::cleanup()
{ {
delete m_ui->horizontalLayout; delete m_ui->horizontalLayout;
delete m_ui->cbxZone; delete m_ui->cbxZone;
delete m_ui->leEast; delete m_ui->leEast;
delete m_ui->leNorth; delete m_ui->leNorth;
delete m_ui->tbReset; delete m_ui->tbReset;
} }
void MgrsEdit::clear() void MgrsEdit::clear()
{ {
m_ui->cbxZone->clear(); m_ui->cbxZone->clear();
m_ui->leEast->clear(); m_ui->leEast->clear();
m_ui->leNorth->clear(); m_ui->leNorth->clear();
setDefaultMgrsSquares(); setDefaultMgrsSquares();
} }
void MgrsEdit::setSquaresEditable(bool bEditable) void MgrsEdit::setSquaresEditable(bool bEditable)
{ {
m_ui->cbxZone->setEditable(bEditable); m_ui->cbxZone->setEditable(bEditable);
} }
void MgrsEdit::setWithSurroundingSquare(bool bEnabled) void MgrsEdit::setWithSurroundingSquare(bool bEnabled)
{ {
m_withMgrsSquareOffset = bEnabled; m_withMgrsSquareOffset = bEnabled;
} }
static QStringList defaultMgrsSquares() static QStringList defaultMgrsSquares()
{ {
const QVector<LtsCoordTrans::UtmCoordinate> squares(LtsCoordTrans::defaultMgrsSquares()); const QVector<LtsCoordTrans::UtmCoordinate> squares(LtsCoordTrans::defaultMgrsSquares());
QStringList sl; QStringList sl;
sl.reserve(squares.size()); sl.reserve(squares.size());
for (const LtsCoordTrans::UtmCoordinate& c : squares) for (const LtsCoordTrans::UtmCoordinate &c : squares)
sl += c.mgrs(0); sl += c.mgrs(0);
std::sort(sl.begin(), sl.end()); std::sort(sl.begin(), sl.end());
return sl; return sl;
} }
static QString preferedMgrsSquare() static QString preferedMgrsSquare()
{ {
const LtsCoordTrans::UtmCoordinate c(LtsCoordTrans::preferedMgrsSquare()); const LtsCoordTrans::UtmCoordinate c(LtsCoordTrans::preferedMgrsSquare());
return c.mgrs(0); return c.mgrs(0);
} }
void MgrsEdit::setDefaultMgrsSquares() void MgrsEdit::setDefaultMgrsSquares()
{ {
m_ui->cbxZone->addItems(defaultMgrsSquares()); m_ui->cbxZone->addItems(defaultMgrsSquares());
m_ui->cbxZone->setCurrentIndex(m_ui->cbxZone->findText(preferedMgrsSquare())); m_ui->cbxZone->setCurrentIndex(m_ui->cbxZone->findText(preferedMgrsSquare()));
} }
void MgrsEdit::addMgrsSquare(const QString& newMgrsSquare) void MgrsEdit::addMgrsSquare(const QString &newMgrsSquare)
{ {
QStringList sl = defaultMgrsSquares(); QStringList sl = defaultMgrsSquares();
sl += newMgrsSquare; sl += newMgrsSquare;
if (m_withMgrsSquareOffset) if (m_withMgrsSquareOffset)
{ {
QStringList squares = utmCoordsToList(LtsCoordTrans::defaultMgrsSquareWithOffsets()); QStringList squares = utmCoordsToList(LtsCoordTrans::defaultMgrsSquareWithOffsets());
for (const auto& sq : std::as_const(squares)) for (const auto &sq : std::as_const(squares))
if (!sl.contains(sq)) if (!sl.contains(sq))
sl.append(sq); sl.append(sq);
} }
std::sort(sl.begin(), sl.end()); std::sort(sl.begin(), sl.end());
m_ui->cbxZone->clear(); m_ui->cbxZone->clear();
m_ui->cbxZone->addItems(sl); m_ui->cbxZone->addItems(sl);
} }
QStringList MgrsEdit::utmCoordsToList(const QVector<LtsCoordTrans::UtmCoordinate>& coords) QStringList MgrsEdit::utmCoordsToList(const QVector<LtsCoordTrans::UtmCoordinate> &coords)
{ {
QStringList list; QStringList list;
list.reserve(coords.count()); list.reserve(coords.count());
for (const auto& utm : coords) for (const auto &utm : coords)
list.append(utm.mgrs(0)); list.append(utm.mgrs(0));
return list; return list;
} }
void MgrsEdit::setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate>& geoCoords) void MgrsEdit::setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate> &geoCoords)
{ {
QStringList sl = utmCoordsToList(geoCoords); QStringList sl = utmCoordsToList(geoCoords);
if (sl.isEmpty()) if (sl.isEmpty())
return; return;
@@ -204,13 +205,15 @@ void MgrsEdit::setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate>& geoCo
std::sort(sl.begin(), sl.end()); std::sort(sl.begin(), sl.end());
m_ui->cbxZone->clear(); m_ui->cbxZone->clear();
m_ui->cbxZone->addItems(sl); m_ui->cbxZone->addItems(sl);
} }
Wgs84Edit::Wgs84Edit(QWidget* widget) : LtsCoordInputWidgetHandler(widget), m_ui(new Ui::Wgs84) Wgs84Edit::Wgs84Edit(QWidget *widget)
{ : LtsCoordInputWidgetHandler(widget)
, m_ui(new Ui::Wgs84)
{
m_ui->setupUi(widget); m_ui->setupUi(widget);
DoubleValidator* v = new DoubleValidator(-180, 180, 9, m_ui->leLon); DoubleValidator *v = new DoubleValidator(-180, 180, 9, m_ui->leLon);
v->setNotation(QDoubleValidator::StandardNotation); v->setNotation(QDoubleValidator::StandardNotation);
m_ui->leLon->setValidator(v); m_ui->leLon->setValidator(v);
@@ -220,29 +223,29 @@ Wgs84Edit::Wgs84Edit(QWidget* widget) : LtsCoordInputWidgetHandler(widget), m_ui
connect(m_ui->leLon, &QLineEdit::editingFinished, this, &Wgs84Edit::onCoordinateDataChanged); connect(m_ui->leLon, &QLineEdit::editingFinished, this, &Wgs84Edit::onCoordinateDataChanged);
connect(m_ui->leLat, &QLineEdit::editingFinished, this, &Wgs84Edit::onCoordinateDataChanged); connect(m_ui->leLat, &QLineEdit::editingFinished, this, &Wgs84Edit::onCoordinateDataChanged);
} }
Wgs84Edit::~Wgs84Edit() Wgs84Edit::~Wgs84Edit()
{ {
delete m_ui; delete m_ui;
} }
bool Wgs84Edit::isValid() bool Wgs84Edit::isValid()
{ {
return (!m_ui->leLon->text().isEmpty()) && (!m_ui->leLat->text().isEmpty()); return (!m_ui->leLon->text().isEmpty()) && (!m_ui->leLat->text().isEmpty());
} }
void Wgs84Edit::setCoordinate(const QPointF& geoCoord) void Wgs84Edit::setCoordinate(const QPointF &geoCoord)
{ {
const QPointF coord(geoCoord * LtsCoordTrans::rad2deg()); const QPointF coord(geoCoord * LtsCoordTrans::rad2deg());
const QLocale l; const QLocale l;
m_ui->leLon->setText(l.toString(coord.x(), 'f', 9)); m_ui->leLon->setText(l.toString(coord.x(), 'f', 9));
m_ui->leLat->setText(l.toString(coord.y(), 'f', 9)); m_ui->leLat->setText(l.toString(coord.y(), 'f', 9));
} }
QPointF Wgs84Edit::coordinate() const QPointF Wgs84Edit::coordinate() const
{ {
QPointF ret; QPointF ret;
const QLocale l; const QLocale l;
@@ -255,15 +258,15 @@ QPointF Wgs84Edit::coordinate() const
ret.ry() = l.toDouble(latStr); ret.ry() = l.toDouble(latStr);
return ret * LtsCoordTrans::deg2rad(); return ret * LtsCoordTrans::deg2rad();
} }
QToolButton* Wgs84Edit::resetButton() QToolButton *Wgs84Edit::resetButton()
{ {
return m_ui->tbReset; return m_ui->tbReset;
} }
void Wgs84Edit::cleanup() void Wgs84Edit::cleanup()
{ {
delete m_ui->horizontalLayout; delete m_ui->horizontalLayout;
delete m_ui->leLon; delete m_ui->leLon;
@@ -271,21 +274,21 @@ void Wgs84Edit::cleanup()
delete m_ui->tbReset; delete m_ui->tbReset;
delete m_ui->lblLon; delete m_ui->lblLon;
delete m_ui->lblLat; delete m_ui->lblLat;
} }
void Wgs84Edit::clear() void Wgs84Edit::clear()
{ {
m_ui->leLon->clear(); m_ui->leLon->clear();
m_ui->leLat->clear(); m_ui->leLat->clear();
} }
DoubleValidator::DoubleValidator(double bottom, double top, int decimals, QObject* parent) DoubleValidator::DoubleValidator(double bottom, double top, int decimals, QObject *parent)
: QDoubleValidator(bottom, top, decimals, parent) : QDoubleValidator(bottom, top, decimals, parent)
{ {
} }
QValidator::State DoubleValidator::validate(QString& input, int& pos) const QValidator::State DoubleValidator::validate(QString &input, int &pos) const
{ {
const QValidator::State ret = QDoubleValidator::validate(input, pos); const QValidator::State ret = QDoubleValidator::validate(input, pos);
if (ret != QValidator::Acceptable) if (ret != QValidator::Acceptable)
return ret; return ret;
@@ -296,6 +299,6 @@ QValidator::State DoubleValidator::validate(QString& input, int& pos) const
if (input.contains(gs)) if (input.contains(gs))
return QValidator::Invalid; return QValidator::Invalid;
return ret; return ret;
} }
} // namespace LtsCoordWidget } // namespace LtsCoordWidget
@@ -13,95 +13,89 @@
namespace LtsCoordWidget namespace LtsCoordWidget
{ {
class LtsCoordInputWidgetHandler : public QObject class LtsCoordInputWidgetHandler : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LtsCoordInputWidgetHandler(QObject* parent) : QObject(parent) {} explicit LtsCoordInputWidgetHandler(QObject *parent)
: QObject(parent)
{
}
virtual bool isValid() = 0; virtual bool isValid() = 0;
virtual void setCoordinate(const QPointF& geoCoord) = 0; virtual void setCoordinate(const QPointF &geoCoord) = 0;
virtual QPointF coordinate() const = 0; virtual QPointF coordinate() const = 0;
virtual QToolButton* resetButton() = 0; virtual QToolButton *resetButton() = 0;
virtual void cleanup() = 0; virtual void cleanup() = 0;
virtual void clear() = 0; virtual void clear() = 0;
virtual void setSquaresEditable(bool bEditable) = 0; virtual void setSquaresEditable(bool bEditable) = 0;
virtual void setWithSurroundingSquare(bool bEnabled) = 0; virtual void setWithSurroundingSquare(bool bEnabled) = 0;
virtual void setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate>& geoCoords) = 0; virtual void setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate> &geoCoords) = 0;
protected Q_SLOTS: protected Q_SLOTS:
void onCoordinateDataChanged(); void onCoordinateDataChanged();
Q_SIGNALS: Q_SIGNALS:
void coordinateChanged(const QPointF& newGeoCoord); void coordinateChanged(const QPointF &newGeoCoord);
void invalidCoordinate(); void invalidCoordinate();
}; };
class MgrsEdit final : public LtsCoordInputWidgetHandler class MgrsEdit final : public LtsCoordInputWidgetHandler
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit MgrsEdit(int precision, QWidget* widget); explicit MgrsEdit(int precision, QWidget *widget);
~MgrsEdit(); ~MgrsEdit();
bool isValid() override; bool isValid() override;
void setCoordinate(const QPointF& geoCoord) override; void setCoordinate(const QPointF &geoCoord) override;
QPointF coordinate() const override; QPointF coordinate() const override;
QToolButton* resetButton() override; QToolButton *resetButton() override;
void cleanup() override; void cleanup() override;
void clear() override; void clear() override;
void setSquaresEditable(bool bEditable) override; void setSquaresEditable(bool bEditable) override;
void setWithSurroundingSquare(bool bEnabled) override; void setWithSurroundingSquare(bool bEnabled) override;
void setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate>& geoCoords) override; void setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate> &geoCoords) override;
private: private:
void setDefaultMgrsSquares(); void setDefaultMgrsSquares();
void addMgrsSquare(const QString& newMgrsSquare); void addMgrsSquare(const QString &newMgrsSquare);
QStringList utmCoordsToList(const QVector<LtsCoordTrans::UtmCoordinate>& coords); QStringList utmCoordsToList(const QVector<LtsCoordTrans::UtmCoordinate> &coords);
private: private:
int m_precision; int m_precision;
bool m_withMgrsSquareOffset = false; bool m_withMgrsSquareOffset = false;
Ui::Mgrs* m_ui; Ui::Mgrs *m_ui;
}; };
class Wgs84Edit final : public LtsCoordInputWidgetHandler class Wgs84Edit final : public LtsCoordInputWidgetHandler
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit Wgs84Edit(QWidget* widget); explicit Wgs84Edit(QWidget *widget);
~Wgs84Edit(); ~Wgs84Edit();
bool isValid() override; bool isValid() override;
void setCoordinate(const QPointF& geoCoord) override; void setCoordinate(const QPointF &geoCoord) override;
QPointF coordinate() const override; QPointF coordinate() const override;
QToolButton* resetButton() override; QToolButton *resetButton() override;
void cleanup() override; void cleanup() override;
void clear() override; void clear() override;
void setSquaresEditable(bool bEditable) override void setSquaresEditable(bool bEditable) override { Q_UNUSED(bEditable); }
{
Q_UNUSED(bEditable);
}
void setWithSurroundingSquare(bool bEnabled) override void setWithSurroundingSquare(bool bEnabled) override { Q_UNUSED(bEnabled); }
{
Q_UNUSED(bEnabled);
}
void setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate>& geoCoords) override void setMgrsSquares(const QVector<LtsCoordTrans::UtmCoordinate> &geoCoords) override { Q_UNUSED(geoCoords); }
{
Q_UNUSED(geoCoords);
}
private: private:
Ui::Wgs84* m_ui; Ui::Wgs84 *m_ui;
}; };
class DoubleValidator final : public QDoubleValidator class DoubleValidator final : public QDoubleValidator
{ {
Q_OBJECT Q_OBJECT
public: public:
DoubleValidator(double bottom, double top, int decimals, QObject* parent = nullptr); DoubleValidator(double bottom, double top, int decimals, QObject *parent = nullptr);
QValidator::State validate(QString& input, int& pos) const override; QValidator::State validate(QString &input, int &pos) const override;
}; };
} // namespace LtsCoordWidget } // namespace LtsCoordWidget
@@ -9,17 +9,15 @@
#include <QtWidgets/QPushButton> #include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout> #include <QtWidgets/QVBoxLayout>
static void updateLabel(const QPointF& coord, QLabel* lbl, int prec) static void updateLabel(const QPointF &coord, QLabel *lbl, int prec)
{ {
QString mgrs = LtsCoordTrans::mgrsFromGeographic(coord.x(), coord.y(), prec); QString mgrs = LtsCoordTrans::mgrsFromGeographic(coord.x(), coord.y(), prec);
QString str = QStringLiteral("mgrs: %1, lon: %2, lat: %3") QString str =
.arg(mgrs) QStringLiteral("mgrs: %1, lon: %2, lat: %3").arg(mgrs).arg(coord.x() * LtsCoordTrans::rad2deg(), 0, 'f', 10).arg(coord.y() * LtsCoordTrans::rad2deg(), 0, 'f', 10);
.arg(coord.x() * LtsCoordTrans::rad2deg(), 0, 'f', 10)
.arg(coord.y() * LtsCoordTrans::rad2deg(), 0, 'f', 10);
lbl->setText(str); lbl->setText(str);
} }
int main(int argc, char** argv) int main(int argc, char **argv)
{ {
QApplication app(argc, argv); QApplication app(argc, argv);
@@ -28,55 +26,51 @@ int main(int argc, char** argv)
QPointF bottomRight(base.geographic(-50000, 50000)); QPointF bottomRight(base.geographic(-50000, 50000));
LtsCoordTrans::getMgrsSquares(QRectF(topLeft, bottomRight), true, true); LtsCoordTrans::getMgrsSquares(QRectF(topLeft, bottomRight), true, true);
QDialog* dialog(new QDialog); QDialog *dialog(new QDialog);
QVBoxLayout* lay(new QVBoxLayout(dialog)); QVBoxLayout *lay(new QVBoxLayout(dialog));
const QPointF defCoord(QPointF(53.0, 8.0) * LtsCoordTrans::deg2rad()); const QPointF defCoord(QPointF(53.0, 8.0) * LtsCoordTrans::deg2rad());
LtsCoordWidget::LtsCoordWidget* wMgrs5( LtsCoordWidget::LtsCoordWidget *wMgrs5(new LtsCoordWidget::LtsCoordWidget(LtsCoordWidget::LtsCoordWidget::DisplayType::MGRS, dialog));
new LtsCoordWidget::LtsCoordWidget(LtsCoordWidget::LtsCoordWidget::DisplayType::MGRS, dialog));
wMgrs5->setWithResetButton(true); wMgrs5->setWithResetButton(true);
wMgrs5->setCoordinate(defCoord, true); wMgrs5->setCoordinate(defCoord, true);
lay->addWidget(wMgrs5); lay->addWidget(wMgrs5);
QLabel* lbl5(new QLabel(dialog)); QLabel *lbl5(new QLabel(dialog));
lay->addWidget(lbl5); lay->addWidget(lbl5);
QObject::connect(wMgrs5, &LtsCoordWidget::LtsCoordWidget::coordinateChanged, lbl5, QObject::connect(wMgrs5, &LtsCoordWidget::LtsCoordWidget::coordinateChanged, lbl5, [lbl5](const QPointF &coord) { updateLabel(coord, lbl5, 5); });
[lbl5](const QPointF& coord) { updateLabel(coord, lbl5, 5); });
LtsCoordWidget::LtsCoordWidget* wMgrs7( LtsCoordWidget::LtsCoordWidget *wMgrs7(new LtsCoordWidget::LtsCoordWidget(LtsCoordWidget::LtsCoordWidget::DisplayType::MGRS7, dialog));
new LtsCoordWidget::LtsCoordWidget(LtsCoordWidget::LtsCoordWidget::DisplayType::MGRS7, dialog));
wMgrs7->setWithResetButton(true); wMgrs7->setWithResetButton(true);
wMgrs7->setCoordinate(defCoord, true); wMgrs7->setCoordinate(defCoord, true);
lay->addWidget(wMgrs7); lay->addWidget(wMgrs7);
QLabel* lbl7(new QLabel(dialog)); QLabel *lbl7(new QLabel(dialog));
lay->addWidget(lbl7); lay->addWidget(lbl7);
QObject::connect(wMgrs7, &LtsCoordWidget::LtsCoordWidget::coordinateChanged, wMgrs7, QObject::connect(wMgrs7, &LtsCoordWidget::LtsCoordWidget::coordinateChanged, wMgrs7, [lbl7](const QPointF &coord) { updateLabel(coord, lbl7, 7); });
[lbl7](const QPointF& coord) { updateLabel(coord, lbl7, 7); });
LtsCoordWidget::LtsCoordWidget* w84( LtsCoordWidget::LtsCoordWidget *w84(new LtsCoordWidget::LtsCoordWidget(LtsCoordWidget::LtsCoordWidget::DisplayType::WGS84, dialog));
new LtsCoordWidget::LtsCoordWidget(LtsCoordWidget::LtsCoordWidget::DisplayType::WGS84, dialog));
w84->setWithResetButton(true); w84->setWithResetButton(true);
w84->setCoordinate(defCoord, true); w84->setCoordinate(defCoord, true);
lay->addWidget(w84); lay->addWidget(w84);
QLabel* lbl84(new QLabel(dialog)); QLabel *lbl84(new QLabel(dialog));
lay->addWidget(lbl84); lay->addWidget(lbl84);
QObject::connect(w84, &LtsCoordWidget::LtsCoordWidget::coordinateChanged, w84, QObject::connect(w84, &LtsCoordWidget::LtsCoordWidget::coordinateChanged, w84, [lbl84](const QPointF &coord) { updateLabel(coord, lbl84, 11); });
[lbl84](const QPointF& coord) { updateLabel(coord, lbl84, 11); });
QHBoxLayout* hLay = new QHBoxLayout; QHBoxLayout *hLay = new QHBoxLayout;
lay->addLayout(hLay); lay->addLayout(hLay);
LtsCoordWidget::LtsCoordWidget* wChange( LtsCoordWidget::LtsCoordWidget *wChange(new LtsCoordWidget::LtsCoordWidget(LtsCoordWidget::LtsCoordWidget::DisplayType::WGS84, dialog));
new LtsCoordWidget::LtsCoordWidget(LtsCoordWidget::LtsCoordWidget::DisplayType::WGS84, dialog));
wChange->setWithResetButton(true); wChange->setWithResetButton(true);
wChange->setCoordinate(defCoord, true); wChange->setCoordinate(defCoord, true);
hLay->addWidget(wChange); hLay->addWidget(wChange);
QPushButton* pbReset(new QPushButton(QStringLiteral("With Reset"), dialog)); QPushButton *pbReset(new QPushButton(QStringLiteral("With Reset"), dialog));
hLay->addWidget(pbReset); hLay->addWidget(pbReset);
QObject::connect(pbReset, &QPushButton::clicked, wChange, QObject::connect(pbReset, &QPushButton::clicked, wChange, [wChange]() { wChange->setWithResetButton(!wChange->withResetButton()); });
[wChange]() { wChange->setWithResetButton(!wChange->withResetButton()); }); QPushButton *pbNext(new QPushButton(QStringLiteral("Next Type"), dialog));
QPushButton* pbNext(new QPushButton(QStringLiteral("Next Type"), dialog));
hLay->addWidget(pbNext); hLay->addWidget(pbNext);
QObject::connect(pbNext, &QPushButton::clicked, wChange, [wChange]() { QObject::connect(pbNext,
&QPushButton::clicked,
wChange,
[wChange]()
{
LtsCoordWidget::LtsCoordWidget::DisplayType dt = wChange->displayType(); LtsCoordWidget::LtsCoordWidget::DisplayType dt = wChange->displayType();
switch (dt) switch (dt)
{ {
@@ -95,7 +89,7 @@ int main(int argc, char** argv)
wChange->setDisplayType(dt); wChange->setDisplayType(dt);
}); });
QPushButton* pb(new QPushButton(QStringLiteral("Quit"), dialog)); QPushButton *pb(new QPushButton(QStringLiteral("Quit"), dialog));
lay->addWidget(pb); lay->addWidget(pb);
QObject::connect(pb, &QPushButton::clicked, qApp, QCoreApplication::quit); QObject::connect(pb, &QPushButton::clicked, qApp, QCoreApplication::quit);
@@ -4,7 +4,7 @@
#include <GeographicLib/UTMUPS.hpp> #include <GeographicLib/UTMUPS.hpp>
#include <string> #include <string>
int main(int argc, char** argv) int main(int argc, char **argv)
{ {
if (argc != 2) if (argc != 2)
{ {
@@ -38,7 +38,15 @@ int main(int argc, char** argv)
part2 = mgrs.substr(3, 2); part2 = mgrs.substr(3, 2);
part3 = mgrs.substr(5, prec); part3 = mgrs.substr(5, prec);
part4 = mgrs.substr(5 + prec, prec); part4 = mgrs.substr(5 + prec, prec);
fprintf(stdout, "%s %s %s %s = %13.10f, %13.10f ( %13.10f, %13.10f )\n", part1.c_str(), part2.c_str(), fprintf(stdout,
part3.c_str(), part4.c_str(), lonDeg, latDeg, lonDeg / 180. * M_PI, latDeg / 180. * M_PI); "%s %s %s %s = %13.10f, %13.10f ( %13.10f, %13.10f )\n",
part1.c_str(),
part2.c_str(),
part3.c_str(),
part4.c_str(),
lonDeg,
latDeg,
lonDeg / 180. * M_PI,
latDeg / 180. * M_PI);
return 0; return 0;
} }
@@ -10,11 +10,11 @@
namespace LtsLicence namespace LtsLicence
{ {
struct AesCryptPrivate struct AesCryptPrivate
{ {
AesCryptPrivate() AesCryptPrivate()
: passPhrase(QLatin1String("LTS " LTS_VERSION_MAJOR "." LTS_VERSION_MINOR)), : passPhrase(QLatin1String("LTS " LTS_VERSION_MAJOR "." LTS_VERSION_MINOR))
logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("LtsLicenceLib.AesCrypt")) , logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("LtsLicenceLib.AesCrypt"))
{ {
#if OPENSSL_VERSION_NUMBER < 0x1010000fL #if OPENSSL_VERSION_NUMBER < 0x1010000fL
ERR_load_crypto_strings(); ERR_load_crypto_strings();
@@ -29,22 +29,22 @@ struct AesCryptPrivate
} }
QString passPhrase; QString passPhrase;
NGL::INGLLogger& logger; NGL::INGLLogger &logger;
}; };
Q_GLOBAL_STATIC(AesCryptPrivate, s_Private) Q_GLOBAL_STATIC(AesCryptPrivate, s_Private)
void setPassPhrase(const QString& passPhrase) void setPassPhrase(const QString &passPhrase)
{ {
s_Private->passPhrase = passPhrase; s_Private->passPhrase = passPhrase;
} }
QString passPhrase() QString passPhrase()
{ {
return s_Private->passPhrase; return s_Private->passPhrase;
} }
QByteArray decryptData(const QByteArray& dataToDecrypt, const QString& pw, bool* bOk) QByteArray decryptData(const QByteArray &dataToDecrypt, const QString &pw, bool *bOk)
{ {
if (bOk) if (bOk)
*bOk = false; *bOk = false;
@@ -54,7 +54,7 @@ QByteArray decryptData(const QByteArray& dataToDecrypt, const QString& pw, bool*
unsigned char key[32]; unsigned char key[32];
const QByteArray baPassword = pw.toUtf8(); const QByteArray baPassword = pw.toUtf8();
const unsigned char* dataPw = reinterpret_cast<const unsigned char*>(baPassword.data()); const unsigned char *dataPw = reinterpret_cast<const unsigned char *>(baPassword.data());
int i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), nullptr, dataPw, baPassword.size(), 5, key, nullptr); int i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), nullptr, dataPw, baPassword.size(), 5, key, nullptr);
if (i != 32) if (i != 32)
{ {
@@ -63,11 +63,11 @@ QByteArray decryptData(const QByteArray& dataToDecrypt, const QString& pw, bool*
} }
const QByteArray baSalt = dataToDecrypt.left(EVP_MAX_IV_LENGTH); const QByteArray baSalt = dataToDecrypt.left(EVP_MAX_IV_LENGTH);
const unsigned char* salt = reinterpret_cast<const unsigned char*>(baSalt.data()); const unsigned char *salt = reinterpret_cast<const unsigned char *>(baSalt.data());
const QByteArray bufEncrypted = dataToDecrypt.mid(EVP_MAX_IV_LENGTH); const QByteArray bufEncrypted = dataToDecrypt.mid(EVP_MAX_IV_LENGTH);
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
ret = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key, salt); ret = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key, salt);
if (ret == 0) if (ret == 0)
{ {
@@ -80,8 +80,8 @@ QByteArray decryptData(const QByteArray& dataToDecrypt, const QString& pw, bool*
QByteArray bufDecrypted; QByteArray bufDecrypted;
bufDecrypted.resize(bufEncrypted.size() + EVP_CIPHER_CTX_block_size(ctx)); bufDecrypted.resize(bufEncrypted.size() + EVP_CIPHER_CTX_block_size(ctx));
const unsigned char* dataIn = reinterpret_cast<const unsigned char*>(bufEncrypted.data()); const unsigned char *dataIn = reinterpret_cast<const unsigned char *>(bufEncrypted.data());
unsigned char* dataOut = reinterpret_cast<unsigned char*>(bufDecrypted.data()); unsigned char *dataOut = reinterpret_cast<unsigned char *>(bufDecrypted.data());
ret = EVP_DecryptUpdate(ctx, dataOut, &outSize1, dataIn, bufEncrypted.size()); ret = EVP_DecryptUpdate(ctx, dataOut, &outSize1, dataIn, bufEncrypted.size());
if (ret == 0) if (ret == 0)
@@ -110,10 +110,10 @@ QByteArray decryptData(const QByteArray& dataToDecrypt, const QString& pw, bool*
if (bOk) if (bOk)
*bOk = true; *bOk = true;
return bufDecrypted; return bufDecrypted;
} }
QByteArray encryptData(const QByteArray& dataToEncrypt, const QString& pw, bool* bOk) QByteArray encryptData(const QByteArray &dataToEncrypt, const QString &pw, bool *bOk)
{ {
if (bOk) if (bOk)
*bOk = false; *bOk = false;
@@ -124,7 +124,7 @@ QByteArray encryptData(const QByteArray& dataToEncrypt, const QString& pw, bool*
QByteArray bufEncrypted; QByteArray bufEncrypted;
const QByteArray baPassword = pw.toUtf8(); const QByteArray baPassword = pw.toUtf8();
const unsigned char* dataPw = reinterpret_cast<const unsigned char*>(baPassword.data()); const unsigned char *dataPw = reinterpret_cast<const unsigned char *>(baPassword.data());
int i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), nullptr, dataPw, baPassword.size(), 5, key, nullptr); int i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), nullptr, dataPw, baPassword.size(), 5, key, nullptr);
if (i != 32) if (i != 32)
{ {
@@ -135,9 +135,9 @@ QByteArray encryptData(const QByteArray& dataToEncrypt, const QString& pw, bool*
QByteArray baSalt(EVP_MAX_IV_LENGTH, 0); QByteArray baSalt(EVP_MAX_IV_LENGTH, 0);
for (int i = 0; i < EVP_MAX_IV_LENGTH; ++i) for (int i = 0; i < EVP_MAX_IV_LENGTH; ++i)
baSalt[i] = static_cast<char>(QRandomGenerator::global()->bounded(256)); baSalt[i] = static_cast<char>(QRandomGenerator::global()->bounded(256));
const unsigned char* salt = reinterpret_cast<const unsigned char*>(baSalt.data()); const unsigned char *salt = reinterpret_cast<const unsigned char *>(baSalt.data());
EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
ret = EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key, salt); ret = EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key, salt);
if (ret == 0) if (ret == 0)
{ {
@@ -148,10 +148,10 @@ QByteArray encryptData(const QByteArray& dataToEncrypt, const QString& pw, bool*
return QByteArray(); return QByteArray();
} }
bufEncrypted = QByteArray::fromRawData(reinterpret_cast<const char*>(salt), EVP_MAX_IV_LENGTH); bufEncrypted = QByteArray::fromRawData(reinterpret_cast<const char *>(salt), EVP_MAX_IV_LENGTH);
bufEncrypted.resize(bufEncrypted.size() + dataToEncrypt.size() + EVP_CIPHER_CTX_block_size(ctx)); bufEncrypted.resize(bufEncrypted.size() + dataToEncrypt.size() + EVP_CIPHER_CTX_block_size(ctx));
const unsigned char* dataIn = reinterpret_cast<const unsigned char*>(dataToEncrypt.data()); const unsigned char *dataIn = reinterpret_cast<const unsigned char *>(dataToEncrypt.data());
unsigned char* dataOut = reinterpret_cast<unsigned char*>(bufEncrypted.data()); unsigned char *dataOut = reinterpret_cast<unsigned char *>(bufEncrypted.data());
dataOut += baSalt.size(); dataOut += baSalt.size();
ret = EVP_EncryptUpdate(ctx, dataOut, &outSize1, dataIn, dataToEncrypt.size()); ret = EVP_EncryptUpdate(ctx, dataOut, &outSize1, dataIn, dataToEncrypt.size());
if (ret == 0) if (ret == 0)
@@ -180,6 +180,6 @@ QByteArray encryptData(const QByteArray& dataToEncrypt, const QString& pw, bool*
if (bOk) if (bOk)
*bOk = true; *bOk = true;
return bufEncrypted; return bufEncrypted;
} }
} // namespace LtsLicence } // namespace LtsLicence
@@ -9,12 +9,10 @@
namespace LtsLicence namespace LtsLicence
{ {
LTSLICENCE_EXPORT void setPassPhrase(const QString& passPhrase); LTSLICENCE_EXPORT void setPassPhrase(const QString &passPhrase);
LTSLICENCE_EXPORT QString passPhrase(); LTSLICENCE_EXPORT QString passPhrase();
LTSLICENCE_EXPORT QByteArray decryptData(const QByteArray& dataToDecrypt, const QString& pw = passPhrase(), LTSLICENCE_EXPORT QByteArray decryptData(const QByteArray &dataToDecrypt, const QString &pw = passPhrase(), bool *bOk = nullptr);
bool* bOk = nullptr);
LTSLICENCE_EXPORT QByteArray encryptData(const QByteArray& dataToEncrypt, const QString& pw = passPhrase(), LTSLICENCE_EXPORT QByteArray encryptData(const QByteArray &dataToEncrypt, const QString &pw = passPhrase(), bool *bOk = nullptr);
bool* bOk = nullptr);
} // namespace LtsLicence } // namespace LtsLicence
@@ -7,7 +7,7 @@
class aes_crypt_test : public QObject class aes_crypt_test : public QObject
{ {
Q_OBJECT Q_OBJECT
private Q_SLOTS: private Q_SLOTS:
void initTestCase(); void initTestCase();
void truePassTest(); void truePassTest();
void falsePassTest(); void falsePassTest();
@@ -8,15 +8,15 @@
namespace LtsLicence namespace LtsLicence
{ {
static bool extractLicence(const QDomElement& licenceElement, QVector<Licence>& licenceVec); static bool extractLicence(const QDomElement &licenceElement, QVector<Licence> &licenceVec);
static NGL::INGLLogger& getLogger() static NGL::INGLLogger &getLogger()
{ {
return NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("LtsLicence"); return NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("LtsLicence");
} }
QVector<Licence> readLicences(const QByteArray& unencryptedXmlData) QVector<Licence> readLicences(const QByteArray &unencryptedXmlData)
{ {
QVector<Licence> licenceVec; QVector<Licence> licenceVec;
QDomDocument xmlDoc; QDomDocument xmlDoc;
@@ -45,14 +45,13 @@ QVector<Licence> readLicences(const QByteArray& unencryptedXmlData)
licenceElement = licenceElement.nextSiblingElement(QLatin1String("licence")); licenceElement = licenceElement.nextSiblingElement(QLatin1String("licence"));
} }
return licenceVec; return licenceVec;
} }
QByteArray writeUnencryptedLicences(const QVector<Licence>& licences) QByteArray writeUnencryptedLicences(const QVector<Licence> &licences)
{ {
QDomDocument xmlDoc; QDomDocument xmlDoc;
QDomProcessingInstruction instr = xmlDoc.createProcessingInstruction( QDomProcessingInstruction instr = xmlDoc.createProcessingInstruction(QLatin1String("xml"), QLatin1String("version='1.0' encoding='UTF-8' standalone='yes'"));
QLatin1String("xml"), QLatin1String("version='1.0' encoding='UTF-8' standalone='yes'"));
xmlDoc.appendChild(instr); xmlDoc.appendChild(instr);
QDomElement root = xmlDoc.createElement(QLatin1String("licences")); QDomElement root = xmlDoc.createElement(QLatin1String("licences"));
@@ -93,10 +92,10 @@ QByteArray writeUnencryptedLicences(const QVector<Licence>& licences)
} }
INFO_LOG(getLogger()) << "Generated XML Data...\n" << xmlDoc.toByteArray(); INFO_LOG(getLogger()) << "Generated XML Data...\n" << xmlDoc.toByteArray();
return xmlDoc.toByteArray(); return xmlDoc.toByteArray();
} }
bool extractLicence(const QDomElement& licenceElement, QVector<Licence>& licenceVec) bool extractLicence(const QDomElement &licenceElement, QVector<Licence> &licenceVec)
{ {
Licence licence; Licence licence;
QDomElement tag = licenceElement.firstChildElement(QLatin1String("name")); QDomElement tag = licenceElement.firstChildElement(QLatin1String("name"));
@@ -126,23 +125,22 @@ bool extractLicence(const QDomElement& licenceElement, QVector<Licence>& licence
licence.expiration = qdt; licence.expiration = qdt;
INFO_LOG(getLogger()) << "Read licence for:'" << licence.name << "'" INFO_LOG(getLogger()) << "Read licence for:'" << licence.name << "'"
<< " IgnoreMaxCount: " << licence.ignoreMaxCount << " IgnoreMaxCount: " << licence.ignoreMaxCount << " IgnoreExpiration: " << licence.ignoreExpiration << " MaxCount: " << licence.maxCount
<< " IgnoreExpiration: " << licence.ignoreExpiration << " MaxCount: " << licence.maxCount << " Expiration: " << licence.expiration.date().toString() << " " << licence.expiration.time().toString()
<< " Expiration: " << licence.expiration.date().toString() << " " << " RefCount: " << licence.licenceRefCount;
<< licence.expiration.time().toString() << " RefCount: " << licence.licenceRefCount;
licenceVec.append(licence); licenceVec.append(licence);
return true; return true;
} }
QString Licence::toString() const QString Licence::toString() const
{ {
return QObject::tr("Name: %1, Count: %2, ExpireDate: %3, Expires: %4, UseMaxCount: %5") return QObject::tr("Name: %1, Count: %2, ExpireDate: %3, Expires: %4, UseMaxCount: %5")
.arg(name) .arg(name)
.arg(maxCount) .arg(maxCount)
.arg(expiration.toString()) .arg(expiration.toString())
.arg(ignoreExpiration) .arg(ignoreExpiration)
.arg(ignoreMaxCount); .arg(ignoreMaxCount);
} }
} // namespace LtsLicence } // namespace LtsLicence
@@ -11,8 +11,8 @@
namespace LtsLicence namespace LtsLicence
{ {
struct LTSLICENCE_EXPORT Licence struct LTSLICENCE_EXPORT Licence
{ {
QString name; QString name;
bool ignoreMaxCount = false; bool ignoreMaxCount = false;
bool ignoreExpiration = false; bool ignoreExpiration = false;
@@ -21,9 +21,9 @@ struct LTSLICENCE_EXPORT Licence
int licenceRefCount = 0; int licenceRefCount = 0;
QString toString() const; QString toString() const;
}; };
LTSLICENCE_EXPORT QVector<Licence> readLicences(const QByteArray& unencryptedXmlData); LTSLICENCE_EXPORT QVector<Licence> readLicences(const QByteArray &unencryptedXmlData);
LTSLICENCE_EXPORT QByteArray writeUnencryptedLicences(const QVector<Licence>& licences); LTSLICENCE_EXPORT QByteArray writeUnencryptedLicences(const QVector<Licence> &licences);
} // namespace LtsLicence } // namespace LtsLicence
@@ -9,56 +9,58 @@
namespace LtsNotification namespace LtsNotification
{ {
LtsNotification::LtsNotification(LtsNotificationController* ctl) : QObject(), m_controller(ctl) LtsNotification::LtsNotification(LtsNotificationController *ctl)
{ : QObject()
, m_controller(ctl)
{
connect(ctl, &LtsNotificationController::destroyed, this, &LtsNotification::slotCtlDestroyed); connect(ctl, &LtsNotificationController::destroyed, this, &LtsNotification::slotCtlDestroyed);
} }
LtsNotification::~LtsNotification() LtsNotification::~LtsNotification()
{ {
delete m_controller; delete m_controller;
} }
void LtsNotification::setIcon(const QIcon& icon) void LtsNotification::setIcon(const QIcon &icon)
{ {
m_controller->setIcon(icon); m_controller->setIcon(icon);
} }
void LtsNotification::setAction(const std::function<void(void)>& action) void LtsNotification::setAction(const std::function<void(void)> &action)
{ {
m_controller->setAction(action); m_controller->setAction(action);
} }
void LtsNotification::setToolTip(const QString& toolTip) void LtsNotification::setToolTip(const QString &toolTip)
{ {
m_controller->setToolTip(toolTip); m_controller->setToolTip(toolTip);
} }
const QString& LtsNotification::tooltip() const const QString &LtsNotification::tooltip() const
{ {
return m_controller->tooltip(); return m_controller->tooltip();
} }
void LtsNotification::setCount(const int count) void LtsNotification::setCount(const int count)
{ {
m_controller->setCount(count); m_controller->setCount(count);
} }
void LtsNotification::setEnabled(bool enable) void LtsNotification::setEnabled(bool enable)
{ {
m_controller->setEnabled(enable); m_controller->setEnabled(enable);
} }
void LtsNotification::setBackground(const int r, const int g, const int b) void LtsNotification::setBackground(const int r, const int g, const int b)
{ {
m_controller->setBackground(r, g, b); m_controller->setBackground(r, g, b);
} }
void LtsNotification::slotCtlDestroyed(QObject* obj) void LtsNotification::slotCtlDestroyed(QObject *obj)
{ {
(void)obj; (void)obj;
m_controller = nullptr; m_controller = nullptr;
} }
} // namespace LtsNotification } // namespace LtsNotification
@@ -11,35 +11,35 @@
namespace LtsSession namespace LtsSession
{ {
class LtsSession; class LtsSession;
} }
namespace LtsNotification namespace LtsNotification
{ {
class LtsNotificationController; class LtsNotificationController;
class LTSNOTIFICATION_EXPORT LtsNotification : public QObject class LTSNOTIFICATION_EXPORT LtsNotification : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LtsNotification(LtsNotificationController* ctl); explicit LtsNotification(LtsNotificationController *ctl);
~LtsNotification(); ~LtsNotification();
void setIcon(const QIcon& icon); void setIcon(const QIcon &icon);
void setAction(const std::function<void(void)>& action); void setAction(const std::function<void(void)> &action);
void setToolTip(const QString& toolTip); void setToolTip(const QString &toolTip);
void setCount(const int count); void setCount(const int count);
void setEnabled(bool enable); void setEnabled(bool enable);
void setBackground(const int r, const int g, const int b); void setBackground(const int r, const int g, const int b);
const QString& tooltip() const; const QString &tooltip() const;
private: private:
LtsNotificationController* m_controller; LtsNotificationController *m_controller;
private slots: private slots:
void slotCtlDestroyed(QObject* obj); void slotCtlDestroyed(QObject *obj);
}; };
} // namespace LtsNotification } // namespace LtsNotification
@@ -13,34 +13,36 @@
namespace LtsNotification namespace LtsNotification
{ {
LtsNotificationController::LtsNotificationController(const QString& identifier) LtsNotificationController::LtsNotificationController(const QString &identifier)
: QObject(), m_count(0), m_identifier(QStringLiteral("LtsNotification%1").arg(identifier)) : QObject()
{ , m_count(0)
} , m_identifier(QStringLiteral("LtsNotification%1").arg(identifier))
{
}
LtsNotificationController::~LtsNotificationController() LtsNotificationController::~LtsNotificationController()
{ {
qDeleteAll(m_notiList); qDeleteAll(m_notiList);
} }
void LtsNotificationController::setIcon(const QIcon& icon) void LtsNotificationController::setIcon(const QIcon &icon)
{ {
m_icon = icon; m_icon = icon;
setAllIcons(); setAllIcons();
} }
void LtsNotificationController::setCount(const int count) void LtsNotificationController::setCount(const int count)
{ {
m_count = count; m_count = count;
setAllIcons(); setAllIcons();
} }
void LtsNotificationController::setBackground(const int r, const int g, const int b) void LtsNotificationController::setBackground(const int r, const int g, const int b)
{ {
for (QToolButton* tb : std::as_const(m_notiList)) for (QToolButton *tb : std::as_const(m_notiList))
{ {
QString stylesheet; QString stylesheet;
@@ -48,56 +50,55 @@ void LtsNotificationController::setBackground(const int r, const int g, const in
if (r == -1 && g == -1 && b == -1) if (r == -1 && g == -1 && b == -1)
stylesheet = QStringLiteral(""); stylesheet = QStringLiteral("");
else else
stylesheet = QStringLiteral("QToolButton {background-color: rgb(") + QString::number(r) + stylesheet = QStringLiteral("QToolButton {background-color: rgb(") + QString::number(r) + QStringLiteral(",") + QString::number(g) + QStringLiteral(",") +
QStringLiteral(",") + QString::number(g) + QStringLiteral(",") + QString::number(b) + QString::number(b) + QStringLiteral(");}");
QStringLiteral(");}");
tb->setStyleSheet(stylesheet); tb->setStyleSheet(stylesheet);
} }
} }
void LtsNotificationController::setEnabled(bool enable) void LtsNotificationController::setEnabled(bool enable)
{ {
m_enable = enable; m_enable = enable;
setAllIcons(); setAllIcons();
} }
void LtsNotificationController::setAction(const std::function<void(void)>& action) void LtsNotificationController::setAction(const std::function<void(void)> &action)
{ {
m_action = action; m_action = action;
} }
void LtsNotificationController::setToolTip(const QString& toolTip) void LtsNotificationController::setToolTip(const QString &toolTip)
{ {
m_toolTip = toolTip; m_toolTip = toolTip;
for (QToolButton* tb : std::as_const(m_notiList)) for (QToolButton *tb : std::as_const(m_notiList))
{ {
tb->setToolTip(toolTip); tb->setToolTip(toolTip);
tb->setIconSize(QSize(30, 30)); tb->setIconSize(QSize(30, 30));
} }
} }
void LtsNotificationController::setAllIcons() void LtsNotificationController::setAllIcons()
{ {
if (m_icon.isNull()) if (m_icon.isNull())
return; return;
QIcon icon = modifyIcon(m_icon); QIcon icon = modifyIcon(m_icon);
for (QToolButton* tb : std::as_const(m_notiList)) for (QToolButton *tb : std::as_const(m_notiList))
{ {
tb->setIcon(icon); tb->setIcon(icon);
tb->setIconSize(QSize(30, 30)); tb->setIconSize(QSize(30, 30));
tb->setEnabled(m_enable); tb->setEnabled(m_enable);
} }
} }
#define SIZE 40 #define SIZE 40
QIcon LtsNotificationController::modifyIcon(const QIcon& icon) QIcon LtsNotificationController::modifyIcon(const QIcon &icon)
{ {
if (m_count < 1) if (m_count < 1)
return icon; return icon;
@@ -121,11 +122,11 @@ QIcon LtsNotificationController::modifyIcon(const QIcon& icon)
painter.restore(); painter.restore();
return iconImage; return iconImage;
} }
QToolButton* LtsNotificationController::createWidget() QToolButton *LtsNotificationController::createWidget()
{ {
QToolButton* b = new QToolButton(); QToolButton *b = new QToolButton();
b->setToolButtonStyle(Qt::ToolButtonIconOnly); b->setToolButtonStyle(Qt::ToolButtonIconOnly);
b->setObjectName(m_identifier); b->setObjectName(m_identifier);
@@ -133,7 +134,11 @@ QToolButton* LtsNotificationController::createWidget()
b->setMaximumSize(SIZE, SIZE); b->setMaximumSize(SIZE, SIZE);
connect(b, &QToolButton::destroyed, this, &LtsNotificationController::slotNotiWidgetDestroyed); connect(b, &QToolButton::destroyed, this, &LtsNotificationController::slotNotiWidgetDestroyed);
connect(b, &QToolButton::clicked, this, [this]() { connect(b,
&QToolButton::clicked,
this,
[this]()
{
if (m_action) if (m_action)
m_action(); m_action();
}); });
@@ -145,11 +150,11 @@ QToolButton* LtsNotificationController::createWidget()
m_notiList.append(b); m_notiList.append(b);
return b; return b;
} }
void LtsNotificationController::slotNotiWidgetDestroyed(QObject* obj) void LtsNotificationController::slotNotiWidgetDestroyed(QObject *obj)
{ {
m_notiList.removeAll(static_cast<QToolButton*>(obj)); m_notiList.removeAll(static_cast<QToolButton *>(obj));
} }
} // namespace LtsNotification } // namespace LtsNotification
@@ -14,43 +14,37 @@ class QToolButton;
namespace LtsSession namespace LtsSession
{ {
class LtsSession; class LtsSession;
} }
namespace LtsNotification namespace LtsNotification
{ {
class LtsNotificationWidget; class LtsNotificationWidget;
class LTSNOTIFICATION_EXPORT LtsNotificationController : public QObject class LTSNOTIFICATION_EXPORT LtsNotificationController : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LtsNotificationController(const QString& identifier); explicit LtsNotificationController(const QString &identifier);
~LtsNotificationController(); ~LtsNotificationController();
QToolButton* createWidget(); QToolButton *createWidget();
void setIcon(const QIcon& icon); void setIcon(const QIcon &icon);
void setAction(const std::function<void(void)>& action); void setAction(const std::function<void(void)> &action);
void setToolTip(const QString& toolTip); void setToolTip(const QString &toolTip);
void setCount(const int count); void setCount(const int count);
void setBackground(const int r, const int g, const int b); void setBackground(const int r, const int g, const int b);
const QString& identifier() const const QString &identifier() const { return m_identifier; }
{
return m_identifier;
}
const QString& tooltip() const const QString &tooltip() const { return m_toolTip; }
{
return m_toolTip;
}
void setEnabled(bool enable); void setEnabled(bool enable);
private: private:
QList<QToolButton*> m_notiList; QList<QToolButton *> m_notiList;
QIcon m_icon; QIcon m_icon;
std::function<void(void)> m_action; std::function<void(void)> m_action;
@@ -60,10 +54,10 @@ class LTSNOTIFICATION_EXPORT LtsNotificationController : public QObject
QString m_identifier; QString m_identifier;
void setAllIcons(); void setAllIcons();
QIcon modifyIcon(const QIcon& icon); QIcon modifyIcon(const QIcon &icon);
private slots: private slots:
void slotNotiWidgetDestroyed(QObject* obj); void slotNotiWidgetDestroyed(QObject *obj);
}; };
} // namespace LtsNotification } // namespace LtsNotification
@@ -16,15 +16,15 @@
namespace LtsCommon namespace LtsCommon
{ {
LtsRestClient::LtsRestClient(const QString &baseUrl, QObject *parent) LtsRestClient::LtsRestClient(const QString &baseUrl, QObject *parent)
: QObject(parent) : QObject(parent)
, m_baseUrl(baseUrl) , m_baseUrl(baseUrl)
, m_manager(new QNetworkAccessManager(this)) , m_manager(new QNetworkAccessManager(this))
{ {
} }
void LtsRestClient::ping(PingSuccessCallback onSuccess, ErrorCallback onError, int timeoutMs) void LtsRestClient::ping(PingSuccessCallback onSuccess, ErrorCallback onError, int timeoutMs)
{ {
const QNetworkRequest request((QUrl(m_baseUrl))); const QNetworkRequest request((QUrl(m_baseUrl)));
QNetworkReply *reply = m_manager->head(request); QNetworkReply *reply = m_manager->head(request);
@@ -41,7 +41,10 @@ void LtsRestClient::ping(PingSuccessCallback onSuccess, ErrorCallback onError, i
timeoutTimer->setSingleShot(true); timeoutTimer->setSingleShot(true);
// 2. Connect the timeout signal to abort the request // 2. Connect the timeout signal to abort the request
connect(timeoutTimer, &QTimer::timeout, this, [reply]() connect(timeoutTimer,
&QTimer::timeout,
this,
[reply]()
{ {
if (reply && reply->isRunning()) if (reply && reply->isRunning())
reply->abort(); // Triggers finished() with OperationCanceledError reply->abort(); // Triggers finished() with OperationCanceledError
@@ -77,30 +80,30 @@ void LtsRestClient::ping(PingSuccessCallback onSuccess, ErrorCallback onError, i
// 4. Start the timer only after all connections are successfully established // 4. Start the timer only after all connections are successfully established
timeoutTimer->start(timeoutMs); timeoutTimer->start(timeoutMs);
} }
void LtsRestClient::get(const QString &endpoint, SuccessCallback onSuccess, ErrorCallback onError) void LtsRestClient::get(const QString &endpoint, SuccessCallback onSuccess, ErrorCallback onError)
{ {
sendRequest(QStringLiteral("GET"), endpoint, QByteArray(), onSuccess, onError); sendRequest(QStringLiteral("GET"), endpoint, QByteArray(), onSuccess, onError);
} }
void LtsRestClient::post(const QString &endpoint, const QJsonDocument &json, SuccessCallback onSuccess, ErrorCallback onError) void LtsRestClient::post(const QString &endpoint, const QJsonDocument &json, SuccessCallback onSuccess, ErrorCallback onError)
{ {
sendRequest(QStringLiteral("POST"), endpoint, json.toJson(), onSuccess, onError); sendRequest(QStringLiteral("POST"), endpoint, json.toJson(), onSuccess, onError);
} }
void LtsRestClient::put(const QString &endpoint, const QJsonDocument &json, SuccessCallback onSuccess, ErrorCallback onError) void LtsRestClient::put(const QString &endpoint, const QJsonDocument &json, SuccessCallback onSuccess, ErrorCallback onError)
{ {
sendRequest(QStringLiteral("PUT"), endpoint, json.toJson(), onSuccess, onError); sendRequest(QStringLiteral("PUT"), endpoint, json.toJson(), onSuccess, onError);
} }
void LtsRestClient::del(const QString &endpoint, SuccessCallback onSuccess, ErrorCallback onError) void LtsRestClient::del(const QString &endpoint, SuccessCallback onSuccess, ErrorCallback onError)
{ {
sendRequest(QStringLiteral("DELETE"), endpoint, QByteArray(), onSuccess, onError); sendRequest(QStringLiteral("DELETE"), endpoint, QByteArray(), onSuccess, onError);
} }
void LtsRestClient::sendRequest(const QString &method, const QString &endpoint, const QByteArray &data, SuccessCallback onSuccess, ErrorCallback onError) void LtsRestClient::sendRequest(const QString &method, const QString &endpoint, const QByteArray &data, SuccessCallback onSuccess, ErrorCallback onError)
{ {
QUrl url(m_baseUrl); QUrl url(m_baseUrl);
url.setPath(url.path() + endpoint); url.setPath(url.path() + endpoint);
@@ -167,6 +170,6 @@ void LtsRestClient::sendRequest(const QString &method, const QString &endpoint,
if (onSuccess) if (onSuccess)
onSuccess(doc); onSuccess(doc);
}); });
} }
} // namespace LtsCommon } // namespace LtsCommon
@@ -21,8 +21,8 @@ class QNetworkAccessManager;
namespace LtsCommon namespace LtsCommon
{ {
class LTSRESTCLIENT_EXPORT LtsRestClient : public QObject class LTSRESTCLIENT_EXPORT LtsRestClient : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
@@ -47,5 +47,5 @@ class LTSRESTCLIENT_EXPORT LtsRestClient : public QObject
QString m_baseUrl; QString m_baseUrl;
QNetworkAccessManager *m_manager; QNetworkAccessManager *m_manager;
}; // class RestClient }; // class RestClient
} // namespace LtsCommon } // namespace LtsCommon
@@ -7,8 +7,8 @@
namespace LtsSerialPortQuerry namespace LtsSerialPortQuerry
{ {
LOGGER_T getLogger(const char* name) LOGGER_T getLogger(const char *name)
{ {
static const char ns[] = "SPQ."; static const char ns[] = "SPQ.";
std::string loggerName; std::string loggerName;
const size_t len = strlen(name); const size_t len = strlen(name);
@@ -20,11 +20,11 @@ LOGGER_T getLogger(const char* name)
{ {
return NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger(loggerName); return NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger(loggerName);
} }
catch (const std::exception& ex) catch (const std::exception &ex)
{ {
fprintf(stderr, "Error retrieving logger: %s", ex.what()); fprintf(stderr, "Error retrieving logger: %s", ex.what());
abort(); abort();
} }
} }
} // namespace LtsSerialPortQuerry } // namespace LtsSerialPortQuerry
@@ -6,12 +6,12 @@
namespace LtsSerialPortQuerry namespace LtsSerialPortQuerry
{ {
typedef NGL::INGLLogger& LOGGER_T; typedef NGL::INGLLogger &LOGGER_T;
LOGGER_T getLogger(const char* name); LOGGER_T getLogger(const char *name);
inline LOGGER_T getLogger(const QString& loggerName) inline LOGGER_T getLogger(const QString &loggerName)
{ {
return getLogger(loggerName.toUtf8().constData()); return getLogger(loggerName.toUtf8().constData());
} }
} // namespace LtsSerialPortQuerry } // namespace LtsSerialPortQuerry
@@ -9,24 +9,27 @@
namespace LtsSerialPortQuerry namespace LtsSerialPortQuerry
{ {
class LTSSERIALPORTQUERRY_EXPORT LtsSerialPortQuerry : public QObject class LTSSERIALPORTQUERRY_EXPORT LtsSerialPortQuerry : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LtsSerialPortQuerry(QObject* parent = nullptr); explicit LtsSerialPortQuerry(QObject *parent = nullptr);
void setSerialPortSettings(const QSerialPort::BaudRate& baudRate, const QSerialPort::OpenModeFlag& openModeFlag, void setSerialPortSettings(const QSerialPort::BaudRate &baudRate,
const QSerialPort::DataBits& dataBits, const QSerialPort::FlowControl& flowControll, const QSerialPort::OpenModeFlag &openModeFlag,
const QSerialPort::Parity& parity, const QSerialPort::StopBits& stopBits); const QSerialPort::DataBits &dataBits,
const QSerialPort::FlowControl &flowControll,
const QSerialPort::Parity &parity,
const QSerialPort::StopBits &stopBits);
void continueQuerry(); void continueQuerry();
void restartQuerry(); void restartQuerry();
QSerialPort* currentSerialPort(); QSerialPort *currentSerialPort();
signals: signals:
void connectionEstablished(); void connectionEstablished();
private: private:
void querrySerialPort(const QSerialPortInfo& info); void querrySerialPort(const QSerialPortInfo &info);
void closeAndDeleteCurrentPort(); void closeAndDeleteCurrentPort();
private: private:
@@ -41,7 +44,7 @@ class LTSSERIALPORTQUERRY_EXPORT LtsSerialPortQuerry : public QObject
QSerialPort::FlowControl m_flowControll; QSerialPort::FlowControl m_flowControll;
QSerialPort::Parity m_parity; QSerialPort::Parity m_parity;
QSerialPort::StopBits m_stopBits; QSerialPort::StopBits m_stopBits;
QSerialPort* m_currentSerialPort; QSerialPort *m_currentSerialPort;
}; };
} // namespace LtsSerialPortQuerry } // namespace LtsSerialPortQuerry
@@ -5,31 +5,37 @@
namespace LtsSerialPortQuerry namespace LtsSerialPortQuerry
{ {
LtsSerialPortQuerry::LtsSerialPortQuerry(QObject* parent) LtsSerialPortQuerry::LtsSerialPortQuerry(QObject *parent)
: QObject(parent), m_logger(getLogger("LtsSerialPortQuerry")), m_currentQuerry(0), : QObject(parent)
m_baudRate(QSerialPort::Baud115200), m_openModeFlag(QSerialPort::ReadWrite), m_dataBits(QSerialPort::Data8), , m_logger(getLogger("LtsSerialPortQuerry"))
m_flowControll(QSerialPort::NoFlowControl), m_parity(QSerialPort::NoParity), m_stopBits(QSerialPort::OneStop), , m_currentQuerry(0)
m_currentSerialPort(nullptr) , m_baudRate(QSerialPort::Baud115200)
{ , m_openModeFlag(QSerialPort::ReadWrite)
} , m_dataBits(QSerialPort::Data8)
, m_flowControll(QSerialPort::NoFlowControl)
, m_parity(QSerialPort::NoParity)
, m_stopBits(QSerialPort::OneStop)
, m_currentSerialPort(nullptr)
{
}
void LtsSerialPortQuerry::setSerialPortSettings(const QSerialPort::BaudRate& baudRate, void LtsSerialPortQuerry::setSerialPortSettings(const QSerialPort::BaudRate &baudRate,
const QIODevice::OpenModeFlag& openModeFlag, const QIODevice::OpenModeFlag &openModeFlag,
const QSerialPort::DataBits& dataBits, const QSerialPort::DataBits &dataBits,
const QSerialPort::FlowControl& flowControll, const QSerialPort::FlowControl &flowControll,
const QSerialPort::Parity& parity, const QSerialPort::Parity &parity,
const QSerialPort::StopBits& stopBits) const QSerialPort::StopBits &stopBits)
{ {
m_baudRate = baudRate; m_baudRate = baudRate;
m_openModeFlag = openModeFlag; m_openModeFlag = openModeFlag;
m_dataBits = dataBits; m_dataBits = dataBits;
m_flowControll = flowControll; m_flowControll = flowControll;
m_parity = parity; m_parity = parity;
m_stopBits = stopBits; m_stopBits = stopBits;
} }
void LtsSerialPortQuerry::continueQuerry() void LtsSerialPortQuerry::continueQuerry()
{ {
m_currentQuerry++; m_currentQuerry++;
if (m_currentQuerry >= m_serialPortInfos.size()) if (m_currentQuerry >= m_serialPortInfos.size())
{ {
@@ -38,10 +44,10 @@ void LtsSerialPortQuerry::continueQuerry()
return; return;
} }
querrySerialPort(m_serialPortInfos.at(m_currentQuerry)); querrySerialPort(m_serialPortInfos.at(m_currentQuerry));
} }
void LtsSerialPortQuerry::restartQuerry() void LtsSerialPortQuerry::restartQuerry()
{ {
DEBUG_LOG(m_logger) << "restart querry "; DEBUG_LOG(m_logger) << "restart querry ";
m_serialPortInfos = QSerialPortInfo::availablePorts(); m_serialPortInfos = QSerialPortInfo::availablePorts();
m_currentQuerry = 0; m_currentQuerry = 0;
@@ -49,15 +55,15 @@ void LtsSerialPortQuerry::restartQuerry()
querrySerialPort(m_serialPortInfos.at(m_currentQuerry)); querrySerialPort(m_serialPortInfos.at(m_currentQuerry));
else else
QTimer::singleShot(1000, this, &LtsSerialPortQuerry::restartQuerry); QTimer::singleShot(1000, this, &LtsSerialPortQuerry::restartQuerry);
} }
QSerialPort* LtsSerialPortQuerry::currentSerialPort() QSerialPort *LtsSerialPortQuerry::currentSerialPort()
{ {
return m_currentSerialPort; return m_currentSerialPort;
} }
void LtsSerialPortQuerry::querrySerialPort(const QSerialPortInfo& info) void LtsSerialPortQuerry::querrySerialPort(const QSerialPortInfo &info)
{ {
closeAndDeleteCurrentPort(); closeAndDeleteCurrentPort();
m_currentSerialPort = new QSerialPort(info, this); m_currentSerialPort = new QSerialPort(info, this);
m_currentSerialPort->setBaudRate(m_baudRate); m_currentSerialPort->setBaudRate(m_baudRate);
@@ -66,8 +72,7 @@ void LtsSerialPortQuerry::querrySerialPort(const QSerialPortInfo& info)
m_currentSerialPort->setStopBits(m_stopBits); m_currentSerialPort->setStopBits(m_stopBits);
m_currentSerialPort->setFlowControl(m_flowControll); m_currentSerialPort->setFlowControl(m_flowControll);
DEBUG_LOG(m_logger) << "Try opening Comport:" << m_currentSerialPort->portName() DEBUG_LOG(m_logger) << "Try opening Comport:" << m_currentSerialPort->portName() << " index is: " << m_currentQuerry;
<< " index is: " << m_currentQuerry;
if (!m_currentSerialPort->open(QSerialPort::ReadWrite)) if (!m_currentSerialPort->open(QSerialPort::ReadWrite))
{ {
@@ -78,15 +83,14 @@ void LtsSerialPortQuerry::querrySerialPort(const QSerialPortInfo& info)
} }
else else
{ {
connect(m_currentSerialPort, &QSerialPort::errorOccurred, this, &LtsSerialPortQuerry::onSerialPortError, connect(m_currentSerialPort, &QSerialPort::errorOccurred, this, &LtsSerialPortQuerry::onSerialPortError, Qt::UniqueConnection);
Qt::UniqueConnection);
DEBUG_LOG(m_logger) << "Oppened comport" << m_currentSerialPort->portName(); DEBUG_LOG(m_logger) << "Oppened comport" << m_currentSerialPort->portName();
emit connectionEstablished(); emit connectionEstablished();
} }
} }
void LtsSerialPortQuerry::closeAndDeleteCurrentPort() void LtsSerialPortQuerry::closeAndDeleteCurrentPort()
{ {
if (m_currentSerialPort) if (m_currentSerialPort)
{ {
m_currentSerialPort->disconnect(); m_currentSerialPort->disconnect();
@@ -96,22 +100,22 @@ void LtsSerialPortQuerry::closeAndDeleteCurrentPort()
m_currentSerialPort = nullptr; m_currentSerialPort = nullptr;
} }
} }
void LtsSerialPortQuerry::onSerialPortError(QSerialPort::SerialPortError serialPortError) void LtsSerialPortQuerry::onSerialPortError(QSerialPort::SerialPortError serialPortError)
{ {
if (!m_currentSerialPort) if (!m_currentSerialPort)
return; return;
DEBUG_LOG(m_logger) << "Spontaneous error " << serialPortError << " doesn't have to be an error ..."; DEBUG_LOG(m_logger) << "Spontaneous error " << serialPortError << " doesn't have to be an error ...";
const QString errStr(QStringLiteral("QSerialPort::SerialPortError ") + QString::number(serialPortError) + const QString errStr(QStringLiteral("QSerialPort::SerialPortError ") + QString::number(serialPortError) + QStringLiteral(" from serial port ") +
QStringLiteral(" from serial port ") + m_currentSerialPort->portName() + m_currentSerialPort->portName() + QStringLiteral(" error: ") + m_currentSerialPort->errorString());
QStringLiteral(" error: ") + m_currentSerialPort->errorString());
switch (serialPortError) switch (serialPortError)
{ {
case QSerialPort::SerialPortError::NoError: { case QSerialPort::SerialPortError::NoError:
{
break; break;
} }
@@ -119,22 +123,25 @@ void LtsSerialPortQuerry::onSerialPortError(QSerialPort::SerialPortError serialP
case QSerialPort::SerialPortError::PermissionError: case QSerialPort::SerialPortError::PermissionError:
case QSerialPort::SerialPortError::OpenError: case QSerialPort::SerialPortError::OpenError:
case QSerialPort::SerialPortError::NotOpenError: case QSerialPort::SerialPortError::NotOpenError:
case QSerialPort::SerialPortError::UnknownError: { case QSerialPort::SerialPortError::UnknownError:
{
ERROR_LOG(m_logger) << "Closing port and try to reopen it. " << m_currentSerialPort->portName(); ERROR_LOG(m_logger) << "Closing port and try to reopen it. " << m_currentSerialPort->portName();
continueQuerry(); continueQuerry();
Q_FALLTHROUGH(); Q_FALLTHROUGH();
} }
case QSerialPort::SerialPortError::UnsupportedOperationError: { case QSerialPort::SerialPortError::UnsupportedOperationError:
{
ERROR_LOG(m_logger) << errStr; ERROR_LOG(m_logger) << errStr;
break; break;
} }
default: { default:
{
ERROR_LOG(m_logger) << "Got an Error> " << errStr << "restarting"; ERROR_LOG(m_logger) << "Got an Error> " << errStr << "restarting";
continueQuerry(); continueQuerry();
break; break;
} }
} }
} }
} // namespace LtsSerialPortQuerry } // namespace LtsSerialPortQuerry
@@ -9,18 +9,21 @@
namespace LtsSerialPortQuerry namespace LtsSerialPortQuerry
{ {
class LTSSERIALPORTQUERRY_EXPORT LtsSerialPortQuerry : public QObject class LTSSERIALPORTQUERRY_EXPORT LtsSerialPortQuerry : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LtsSerialPortQuerry(QObject* parent = nullptr); explicit LtsSerialPortQuerry(QObject *parent = nullptr);
void setSerialPortSettings(const QSerialPort::BaudRate& baudRate, const QSerialPort::OpenModeFlag& openModeFlag, void setSerialPortSettings(const QSerialPort::BaudRate &baudRate,
const QSerialPort::DataBits& dataBits, const QSerialPort::FlowControl& flowControll, const QSerialPort::OpenModeFlag &openModeFlag,
const QSerialPort::Parity& parity, const QSerialPort::StopBits& stopBits); const QSerialPort::DataBits &dataBits,
const QSerialPort::FlowControl &flowControll,
const QSerialPort::Parity &parity,
const QSerialPort::StopBits &stopBits);
void restartQuerry(); void restartQuerry();
QSerialPort* currentSerialPort(); QSerialPort *currentSerialPort();
public slots: public slots:
void continueQuerry(); void continueQuerry();
@@ -29,8 +32,8 @@ class LTSSERIALPORTQUERRY_EXPORT LtsSerialPortQuerry : public QObject
void connectionEstablished(); void connectionEstablished();
private: private:
NGL::INGLLogger& m_logger; NGL::INGLLogger &m_logger;
void querrySerialPort(const QSerialPortInfo& info); void querrySerialPort(const QSerialPortInfo &info);
void closeAndDeleteCurrentPort(); void closeAndDeleteCurrentPort();
void onSerialPortError(QSerialPort::SerialPortError serialPortError); void onSerialPortError(QSerialPort::SerialPortError serialPortError);
QList<QSerialPortInfo> m_serialPortInfos; QList<QSerialPortInfo> m_serialPortInfos;
@@ -41,7 +44,7 @@ class LTSSERIALPORTQUERRY_EXPORT LtsSerialPortQuerry : public QObject
QSerialPort::FlowControl m_flowControll; QSerialPort::FlowControl m_flowControll;
QSerialPort::Parity m_parity; QSerialPort::Parity m_parity;
QSerialPort::StopBits m_stopBits; QSerialPort::StopBits m_stopBits;
QSerialPort* m_currentSerialPort; QSerialPort *m_currentSerialPort;
}; };
} // namespace LtsSerialPortQuerry } // namespace LtsSerialPortQuerry
@@ -34,25 +34,23 @@ using namespace LtsUtils;
namespace QTest namespace QTest
{ {
template <> char* toString(const QVector<int>& vec) template <> char *toString(const QVector<int> &vec)
{ {
QStringList sl; QStringList sl;
sl.reserve(vec.size()); sl.reserve(vec.size());
for (int i : vec) for (int i : vec)
sl += QString::number(i); sl += QString::number(i);
return qstrdup(sl.join(QLatin1Char(',')).toLatin1().constData()); return qstrdup(sl.join(QLatin1Char(',')).toLatin1().constData());
} }
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) #if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
template <typename T1, typename T2> template <typename T1, typename T2> inline bool qCompare(const T1 &t1, const T2 &t2, const char *actual, const char *expected, const char *file, int line)
inline bool qCompare(const T1& t1, const T2& t2, const char* actual, const char* expected, const char* file, int line) {
{ return compare_helper(t1 == t2, "Compared values are not the same", toString(t1), toString(t2), actual, expected, file, line);
return compare_helper(t1 == t2, "Compared values are not the same", toString(t1), toString(t2), actual, expected, }
file, line);
}
#endif #endif
} // namespace QTest } // namespace QTest
int main(int argc, char* argv[]) int main(int argc, char *argv[])
{ {
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
LtsUtilsTest tc; LtsUtilsTest tc;
@@ -65,7 +63,9 @@ void LtsUtilsTest::test_promise()
results.append(1); results.append(1);
LtsUtils::Promise p([&results](LtsUtils::ResultFunction resolve, LtsUtils::ResultFunction) { LtsUtils::Promise p(
[&results](LtsUtils::ResultFunction resolve, LtsUtils::ResultFunction)
{
results.append(4); results.append(4);
qDebug() << "LtsUtils Promise: Promise executed! Resolving now"; qDebug() << "LtsUtils Promise: Promise executed! Resolving now";
@@ -75,13 +75,17 @@ void LtsUtilsTest::test_promise()
results.append(2); results.append(2);
bool resolved = false; bool resolved = false;
p.resolved([&resolved, &results](const QVariant& value) { p.resolved(
[&resolved, &results](const QVariant &value)
{
results.append(5); results.append(5);
qDebug() << "LtsUtils Promise: Promise was resolved with value" << value; qDebug() << "LtsUtils Promise: Promise was resolved with value" << value;
resolved = true; resolved = true;
}); });
p.rejected([](const QVariant& val) { p.rejected(
[](const QVariant &val)
{
qCritical() << "rejected with val" << val; qCritical() << "rejected with val" << val;
QFAIL("Promise unexpectedly rejected"); QFAIL("Promise unexpectedly rejected");
}); });
@@ -260,8 +264,7 @@ void LtsUtilsTest::test_fromIntArray2D()
{ {
qDebug("LtsUtils: test_fromIntArray2D"); qDebug("LtsUtils: test_fromIntArray2D");
QString str = LtsUtils::IntArray2D({{0, 2}, {1, 3}, {2, 999999999}, {3, -2147483647}, {4, 2147483647}, {5, 123456}}) QString str = LtsUtils::IntArray2D({{0, 2}, {1, 3}, {2, 999999999}, {3, -2147483647}, {4, 2147483647}, {5, 123456}}).toPgString();
.toPgString();
qDebug() << "LtsUtils: Result " << str; qDebug() << "LtsUtils: Result " << str;
QCOMPARE(str, QLatin1String("{{0,2},{1,3},{2,999999999},{3,-2147483647},{4,2147483647},{5,123456}}")); QCOMPARE(str, QLatin1String("{{0,2},{1,3},{2,999999999},{3,-2147483647},{4,2147483647},{5,123456}}"));
@@ -295,9 +298,7 @@ void LtsUtilsTest::test_fromBigintArray2D()
{ {
qDebug("LtsUtils: test_fromBigintArray2D"); qDebug("LtsUtils: test_fromBigintArray2D");
QString str = QString str = LtsUtils::BigintArray2D({{0, -123456789}, {1, -2147483647}, {2, 999999999999}, {3, 123456789}, {4, 2147483647}}).toPgString();
LtsUtils::BigintArray2D({{0, -123456789}, {1, -2147483647}, {2, 999999999999}, {3, 123456789}, {4, 2147483647}})
.toPgString();
qDebug() << "LtsUtils: Result " << str; qDebug() << "LtsUtils: Result " << str;
QCOMPARE(str, QLatin1String("{{0,-123456789},{1,-2147483647},{2,999999999999},{3,123456789},{4,2147483647}}")); QCOMPARE(str, QLatin1String("{{0,-123456789},{1,-2147483647},{2,999999999999},{3,123456789},{4,2147483647}}"));
@@ -336,14 +337,10 @@ void LtsUtilsTest::test_bitArray()
qDebug("LtsUtils: test_bitArray"); qDebug("LtsUtils: test_bitArray");
{ {
QVERIFY2(LtsUtils::BitArray::convert<std::vector<uint8_t>>(QBitArray(8)).size() == 1, QVERIFY2(LtsUtils::BitArray::convert<std::vector<uint8_t>>(QBitArray(8)).size() == 1, " wrong size of underlying data");
" wrong size of underlying data"); QVERIFY2(LtsUtils::BitArray::convert<std::vector<uint8_t>>(QBitArray(9)).size() == 2, " wrong size of underlying data");
QVERIFY2(LtsUtils::BitArray::convert<std::vector<uint8_t>>(QBitArray(9)).size() == 2, QVERIFY2(LtsUtils::BitArray::convert<std::vector<uint8_t>>(QBitArray(16)).size() == 2, " wrong size of underlying data");
" wrong size of underlying data"); QVERIFY2(LtsUtils::BitArray::convert<std::vector<uint8_t>>(QBitArray(17)).size() == 3, " wrong size of underlying data");
QVERIFY2(LtsUtils::BitArray::convert<std::vector<uint8_t>>(QBitArray(16)).size() == 2,
" wrong size of underlying data");
QVERIFY2(LtsUtils::BitArray::convert<std::vector<uint8_t>>(QBitArray(17)).size() == 3,
" wrong size of underlying data");
} }
{ {
@@ -486,7 +483,7 @@ void LtsUtilsTest::test_convert()
const auto resultQVec = LtsUtils::convert<QVector<std::vector<uint8_t>>>(resultVec); const auto resultQVec = LtsUtils::convert<QVector<std::vector<uint8_t>>>(resultVec);
QCOMPARE(resultVec.size(), containerLen); QCOMPARE(resultVec.size(), containerLen);
QCOMPARE(resultQVec.size(), containerLen); QCOMPARE(resultQVec.size(), containerLen);
for (const auto& inner : resultQVec) for (const auto &inner : resultQVec)
{ {
for (int i = 0; i < containerLen; ++i) for (int i = 0; i < containerLen; ++i)
QCOMPARE(inner.at(i), i + 1); QCOMPARE(inner.at(i), i + 1);
@@ -502,7 +499,7 @@ class Emitter : public QObject
{ {
Q_OBJECT Q_OBJECT
signals: signals:
void signal1(); void signal1();
void signal2(int i); void signal2(int i);
}; };
@@ -511,14 +508,11 @@ class Spy : public QObject
{ {
Q_OBJECT Q_OBJECT
public slots: public slots:
void slot1() void slot1() { ++m_slot1Count; }
{
++m_slot1Count;
}
public: public:
int m_slot1Count{0}; int m_slot1Count{0};
}; };
@@ -526,8 +520,7 @@ void LtsUtilsTest::test_connection()
{ {
Emitter emitter; Emitter emitter;
Spy spy; Spy spy;
std::unique_ptr<LtsUtils::IConnection> conn( std::unique_ptr<LtsUtils::IConnection> conn(LtsUtils::createConnection(&emitter, &Emitter::signal1, &spy, &Spy::slot1));
LtsUtils::createConnection(&emitter, &Emitter::signal1, &spy, &Spy::slot1));
emit emitter.signal1(); emit emitter.signal1();
QCOMPARE(spy.m_slot1Count, 0); QCOMPARE(spy.m_slot1Count, 0);
@@ -544,8 +537,7 @@ void LtsUtilsTest::test_queuedConnection()
{ {
Emitter emitter; Emitter emitter;
Spy spy; Spy spy;
std::unique_ptr<LtsUtils::IConnection> conn( std::unique_ptr<LtsUtils::IConnection> conn(LtsUtils::createConnection(&emitter, &Emitter::signal2, &spy, &Spy::slot1));
LtsUtils::createConnection(&emitter, &Emitter::signal2, &spy, &Spy::slot1));
emit emitter.signal2(42); emit emitter.signal2(42);
QCOMPARE(spy.m_slot1Count, 0); QCOMPARE(spy.m_slot1Count, 0);
@@ -560,10 +552,8 @@ void LtsUtilsTest::test_signalSignalConnection()
{ {
Emitter emitter; Emitter emitter;
Spy spy; Spy spy;
std::unique_ptr<LtsUtils::IConnection> signalSignalConn( std::unique_ptr<LtsUtils::IConnection> signalSignalConn(LtsUtils::createConnection(&emitter, &Emitter::signal2, &emitter, &Emitter::signal1));
LtsUtils::createConnection(&emitter, &Emitter::signal2, &emitter, &Emitter::signal1)); std::unique_ptr<LtsUtils::IConnection> signalSlotConn(LtsUtils::createConnection(&emitter, &Emitter::signal1, &spy, &Spy::slot1));
std::unique_ptr<LtsUtils::IConnection> signalSlotConn(
LtsUtils::createConnection(&emitter, &Emitter::signal1, &spy, &Spy::slot1));
signalSignalConn->connect(); signalSignalConn->connect();
signalSlotConn->connect(); signalSlotConn->connect();
@@ -961,12 +951,10 @@ void LtsUtilsTest::test_byteStreamFromSfmMessage()
msg.setId(16); msg.setId(16);
msg.setRtr(true); msg.setRtr(true);
const quint8 payloadArray[] = {0x11, 0x02, 0x03, 0x04, 0x50}; const quint8 payloadArray[] = {0x11, 0x02, 0x03, 0x04, 0x50};
msg.setPayload(QByteArray(reinterpret_cast<const char*>(payloadArray), sizeof(payloadArray))); msg.setPayload(QByteArray(reinterpret_cast<const char *>(payloadArray), sizeof(payloadArray)));
const quint8 expectedResultArray[] = {0x02, 0x80, 0x00, 0x10, 0x05, 0x80, 0x91, 0x80, const quint8 expectedResultArray[] = {0x02, 0x80, 0x00, 0x10, 0x05, 0x80, 0x91, 0x80, 0x82, 0x80, 0x83, 0x04, 0x50, 0x00, 0x03};
0x82, 0x80, 0x83, 0x04, 0x50, 0x00, 0x03}; QByteArray expectedResult = QByteArray(reinterpret_cast<const char *>(expectedResultArray), sizeof(expectedResultArray));
QByteArray expectedResult =
QByteArray(reinterpret_cast<const char*>(expectedResultArray), sizeof(expectedResultArray));
QByteArray byteMessage = byteStreamFromSfmMessage(msg); QByteArray byteMessage = byteStreamFromSfmMessage(msg);
@@ -988,18 +976,17 @@ void LtsUtilsTest::test_byteStreamToSfmMessage()
msgComplete.setRtr(true); msgComplete.setRtr(true);
const quint8 payloadArray[] = {0x11, 0x02, 0x03, 0x04, 0x50, 0x00}; const quint8 payloadArray[] = {0x11, 0x02, 0x03, 0x04, 0x50, 0x00};
msgComplete.setPayload(QByteArray(reinterpret_cast<const char*>(payloadArray), sizeof(payloadArray))); msgComplete.setPayload(QByteArray(reinterpret_cast<const char *>(payloadArray), sizeof(payloadArray)));
const quint8 dataArray[] = {0x02, 0x80, 0x00, 0x10, 0x06, 0x80, 0x91, 0x80, const quint8 dataArray[] = {0x02, 0x80, 0x00, 0x10, 0x06, 0x80, 0x91, 0x80, 0x82, 0x80, 0x83, 0x04, 0x50, 0x00, 0xFF, 0x03};
0x82, 0x80, 0x83, 0x04, 0x50, 0x00, 0xFF, 0x03}; QByteArray dataComplete = QByteArray(reinterpret_cast<const char *>(dataArray), sizeof(dataArray));
QByteArray dataComplete = QByteArray(reinterpret_cast<const char*>(dataArray), sizeof(dataArray));
SfmMessage result; SfmMessage result;
try try
{ {
result = byteStreamToSfmMessage(dataComplete); result = byteStreamToSfmMessage(dataComplete);
} }
catch (const ConversionError& ex) catch (const ConversionError &ex)
{ {
qDebug() << ex.what(); qDebug() << ex.what();
} }
@@ -7,7 +7,7 @@
class LtsUtilsTest : public QObject class LtsUtilsTest : public QObject
{ {
Q_OBJECT Q_OBJECT
private Q_SLOTS: private Q_SLOTS:
void test_toIntArray(); void test_toIntArray();
void test_fromIntArray(); void test_fromIntArray();
@@ -7,28 +7,25 @@
namespace LtsUtils namespace LtsUtils
{ {
template <typename Func> template <typename Func> void addConnect(QEventLoop &x, bool &success, const typename QtPrivate::FunctionPointer<Func>::Object *sender, Func signal, bool isSuccess)
void addConnect(QEventLoop& x, bool& success, const typename QtPrivate::FunctionPointer<Func>::Object* sender, {
Func signal, bool isSuccess)
{
if (isSuccess) if (isSuccess)
{ {
QObject::connect(sender, signal, &x, [&success]() { success = true; }); QObject::connect(sender, signal, &x, [&success]() { success = true; });
} }
QObject::connect(sender, signal, &x, &QEventLoop::quit, Qt::QueuedConnection); QObject::connect(sender, signal, &x, &QEventLoop::quit, Qt::QueuedConnection);
} }
template <typename Func, typename... Connect> template <typename Func, typename... Connect>
void addConnect(QEventLoop& x, bool& success, const typename QtPrivate::FunctionPointer<Func>::Object* sender, void addConnect(QEventLoop &x, bool &success, const typename QtPrivate::FunctionPointer<Func>::Object *sender, Func signal, bool isSuccess, Connect... connects)
Func signal, bool isSuccess, Connect... connects) {
{
addConnect(x, success, sender, signal, isSuccess); addConnect(x, success, sender, signal, isSuccess);
addConnect(x, success, connects...); addConnect(x, success, connects...);
} }
template <typename... Connect> void await(Connect... connects) noexcept(false) template <typename... Connect> void await(Connect... connects) noexcept(false)
{ {
QEventLoop x; QEventLoop x;
bool success = false; bool success = false;
@@ -41,10 +38,10 @@ template <typename... Connect> void await(Connect... connects) noexcept(false)
throw std::runtime_error("Failed."); throw std::runtime_error("Failed.");
} }
} }
template <typename... Connect> void awaitTimeout(const int timeoutMs, Connect... connects) noexcept(false) template <typename... Connect> void awaitTimeout(const int timeoutMs, Connect... connects) noexcept(false)
{ {
std::unique_ptr<QTimer> t(new QTimer); std::unique_ptr<QTimer> t(new QTimer);
bool timeout = false; bool timeout = false;
@@ -52,7 +49,11 @@ template <typename... Connect> void awaitTimeout(const int timeoutMs, Connect...
{ {
t->setInterval(timeoutMs); t->setInterval(timeoutMs);
t->setSingleShot(true); t->setSingleShot(true);
QObject::connect(t.get(), &QTimer::timeout, t.get(), [&timeout]() { QObject::connect(t.get(),
&QTimer::timeout,
t.get(),
[&timeout]()
{
fprintf(stderr, "awaitTimeout: timed out!\n"); fprintf(stderr, "awaitTimeout: timed out!\n");
timeout = true; timeout = true;
}); });
@@ -66,13 +67,15 @@ template <typename... Connect> void awaitTimeout(const int timeoutMs, Connect...
throw std::runtime_error("Timeout."); throw std::runtime_error("Timeout.");
} }
} }
template <typename Func1, typename Func2> template <typename Func1, typename Func2>
void awaitWithCancelationSignal(const typename QtPrivate::FunctionPointer<Func1>::Object* sender1, Func1 signal1, void awaitWithCancelationSignal(const typename QtPrivate::FunctionPointer<Func1>::Object *sender1,
const typename QtPrivate::FunctionPointer<Func2>::Object* sender2, Func2 signal2, Func1 signal1,
const typename QtPrivate::FunctionPointer<Func2>::Object *sender2,
Func2 signal2,
const int timeoutMs = 0) noexcept(false) const int timeoutMs = 0) noexcept(false)
{ {
if (timeoutMs > 0) if (timeoutMs > 0)
{ {
awaitTimeout(timeoutMs, sender1, signal1, true, sender2, signal2, false); awaitTimeout(timeoutMs, sender1, signal1, true, sender2, signal2, false);
@@ -80,5 +83,5 @@ void awaitWithCancelationSignal(const typename QtPrivate::FunctionPointer<Func1>
} }
await(sender1, signal1, true, sender2, signal2, false); await(sender1, signal1, true, sender2, signal2, false);
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -11,36 +11,36 @@
namespace LtsUtils namespace LtsUtils
{ {
class IConnection class IConnection
{ {
public: public:
virtual ~IConnection() = default; virtual ~IConnection() = default;
virtual void connect(Qt::ConnectionType = Qt::AutoConnection) = 0; virtual void connect(Qt::ConnectionType = Qt::AutoConnection) = 0;
virtual void disconnect() = 0; virtual void disconnect() = 0;
}; };
class DummyConnection : public IConnection class DummyConnection : public IConnection
{ {
public: public:
void connect(Qt::ConnectionType = Qt::AutoConnection) override {} void connect(Qt::ConnectionType = Qt::AutoConnection) override {}
void disconnect() override {} void disconnect() override {}
}; };
namespace detail namespace detail
{ {
template <class T> struct ExtractClass; template <class T> struct ExtractClass;
template <class T, class Member> struct ExtractClass<Member T::*> template <class T, class Member> struct ExtractClass<Member T::*>
{ {
using type = T; using type = T;
}; };
} // namespace detail } // namespace detail
template <class Signal, class Slot> class Connection : public IConnection template <class Signal, class Slot> class Connection : public IConnection
{ {
static_assert(std::is_member_function_pointer_v<Signal>, "Must be a pointer to method"); static_assert(std::is_member_function_pointer_v<Signal>, "Must be a pointer to method");
static_assert(std::is_member_function_pointer_v<Slot>, "Must be a pointer to method"); static_assert(std::is_member_function_pointer_v<Slot>, "Must be a pointer to method");
@@ -51,8 +51,11 @@ template <class Signal, class Slot> class Connection : public IConnection
static_assert(std::is_base_of_v<QObject, Target>, "Must be derived from QObject"); static_assert(std::is_base_of_v<QObject, Target>, "Must be derived from QObject");
public: public:
Connection(Emitter* emitter, Signal signal, Target* target, Slot slot) Connection(Emitter *emitter, Signal signal, Target *target, Slot slot)
: m_emitter(emitter), m_signal(signal), m_target(target), m_slot(slot) : m_emitter(emitter)
, m_signal(signal)
, m_target(target)
, m_slot(slot)
{ {
Q_ASSERT(emitter); Q_ASSERT(emitter);
Q_ASSERT(signal); Q_ASSERT(signal);
@@ -90,13 +93,15 @@ template <class Signal, class Slot> class Connection : public IConnection
QPointer<Target> m_target; QPointer<Target> m_target;
Slot m_slot; Slot m_slot;
QMetaObject::Connection m_conn; QMetaObject::Connection m_conn;
}; };
template <class Signal, class Slot> template <class Signal, class Slot>
Connection<Signal, Slot>* createConnection(typename detail::ExtractClass<Signal>::type* emitter, Signal signal, Connection<Signal, Slot> *createConnection(typename detail::ExtractClass<Signal>::type *emitter,
typename detail::ExtractClass<Slot>::type* target, Slot slot) Signal signal,
{ typename detail::ExtractClass<Slot>::type *target,
Slot slot)
{
return new Connection<Signal, Slot>(emitter, signal, target, slot); return new Connection<Signal, Slot>(emitter, signal, target, slot);
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -4,9 +4,14 @@
#include <ostream> #include <ostream>
enum class DataModification { eAdded, eModified, eRemoved }; enum class DataModification
{
eAdded,
eModified,
eRemoved
};
inline std::ostream& operator<<(std::ostream& str, DataModification mod) inline std::ostream &operator<<(std::ostream &str, DataModification mod)
{ {
switch (mod) switch (mod)
{ {
@@ -9,15 +9,15 @@
namespace LtsUtils namespace LtsUtils
{ {
namespace BitArray namespace BitArray
{ {
constexpr inline int bitNumber(int position) constexpr inline int bitNumber(int position)
{ {
return 7 - (position % 8); return 7 - (position % 8);
} }
template <typename T> inline bool testBit(const T& bitField, int position, bool* oob = nullptr) template <typename T> inline bool testBit(const T &bitField, int position, bool *oob = nullptr)
{ {
const size_t byteNum = position / 8; const size_t byteNum = position / 8;
if (byteNum >= bitField.size()) if (byteNum >= bitField.size())
{ {
@@ -30,10 +30,10 @@ template <typename T> inline bool testBit(const T& bitField, int position, bool*
const typename T::value_type mask = 1 << bitNumber(position); const typename T::value_type mask = 1 << bitNumber(position);
return ((bitField.at(byteNum) & mask) == mask); return ((bitField.at(byteNum) & mask) == mask);
} }
template <typename T> inline bool setBit(T& bitField, int position, bool set = true) template <typename T> inline bool setBit(T &bitField, int position, bool set = true)
{ {
const size_t byteNum = position / 8; const size_t byteNum = position / 8;
if (byteNum >= bitField.size()) if (byteNum >= bitField.size())
return false; return false;
@@ -45,16 +45,16 @@ template <typename T> inline bool setBit(T& bitField, int position, bool set = t
bitField[byteNum] &= ~mask; bitField[byteNum] &= ~mask;
return true; return true;
} }
template <typename T> inline bool clearBit(T& bitField, int position) template <typename T> inline bool clearBit(T &bitField, int position)
{ {
return setBit(bitField, position, false); return setBit(bitField, position, false);
} }
#ifdef SUPPORT_QBITARRAY #ifdef SUPPORT_QBITARRAY
template <typename T> inline T convert(const QBitArray& bitArray) template <typename T> inline T convert(const QBitArray &bitArray)
{ {
T ret; T ret;
ret.resize((bitArray.size() + 7) / 8, 0); ret.resize((bitArray.size() + 7) / 8, 0);
@@ -68,10 +68,10 @@ template <typename T> inline T convert(const QBitArray& bitArray)
ret[byteNum] &= ~mask; ret[byteNum] &= ~mask;
} }
return ret; return ret;
} }
template <typename T> inline QBitArray convert(T& bitField, int realSize) template <typename T> inline QBitArray convert(T &bitField, int realSize)
{ {
QBitArray ba(realSize); QBitArray ba(realSize);
for (int32_t i = 0; i < realSize; ++i) for (int32_t i = 0; i < realSize; ++i)
{ {
@@ -81,10 +81,10 @@ template <typename T> inline QBitArray convert(T& bitField, int realSize)
ba[i] = bit; ba[i] = bit;
} }
return ba; return ba;
} }
#endif #endif
} // namespace BitArray } // namespace BitArray
} // namespace LtsUtils } // namespace LtsUtils
@@ -8,30 +8,30 @@
namespace LtsUtils namespace LtsUtils
{ {
template <typename T, typename S> inline void convert(const S& in, T& out) template <typename T, typename S> inline void convert(const S &in, T &out)
{ {
static_assert(!std::is_same_v<S, T>, "Try to convert a type to the same type - is useless"); static_assert(!std::is_same_v<S, T>, "Try to convert a type to the same type - is useless");
out.reserve(static_cast<int>(in.size())); out.reserve(static_cast<int>(in.size()));
std::copy(in.begin(), in.end(), std::back_inserter(out)); std::copy(in.begin(), in.end(), std::back_inserter(out));
} }
template <typename T, typename S> inline T convert(const S& in) template <typename T, typename S> inline T convert(const S &in)
{ {
static_assert(!std::is_same_v<S, T>, "Try to convert a type to the same type - is useless"); static_assert(!std::is_same_v<S, T>, "Try to convert a type to the same type - is useless");
T out; T out;
convert(in, out); convert(in, out);
return out; return out;
} }
template <typename T> inline QByteArray toQByteArray(const T& in) template <typename T> inline QByteArray toQByteArray(const T &in)
{ {
return convert<QByteArray>(in); return convert<QByteArray>(in);
} }
template <typename T, typename V = typename T::value_type> bool isInVector(const T& vec, const V& valueToSearch) template <typename T, typename V = typename T::value_type> bool isInVector(const T &vec, const V &valueToSearch)
{ {
const auto end = vec.end(); const auto end = vec.end();
return std::find(vec.begin(), end, valueToSearch) != end; return std::find(vec.begin(), end, valueToSearch) != end;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -14,11 +14,11 @@ class QImage;
namespace LtsUtils namespace LtsUtils
{ {
LTSUTILSCORE_EXPORT QPixmap getPixmap(const std::vector<uint8_t>& data); LTSUTILSCORE_EXPORT QPixmap getPixmap(const std::vector<uint8_t> &data);
LTSUTILSCORE_EXPORT QPixmap getPixmap(const QByteArray& data); LTSUTILSCORE_EXPORT QPixmap getPixmap(const QByteArray &data);
LTSUTILSCORE_EXPORT QImage getImage(const std::vector<uint8_t>& data); LTSUTILSCORE_EXPORT QImage getImage(const std::vector<uint8_t> &data);
LTSUTILSCORE_EXPORT QImage getImage(const QByteArray& data); LTSUTILSCORE_EXPORT QImage getImage(const QByteArray &data);
LTSUTILSCORE_EXPORT std::vector<uint8_t> fromPixmap(const QPixmap& pixmap, bool* bIsPng = nullptr); LTSUTILSCORE_EXPORT std::vector<uint8_t> fromPixmap(const QPixmap &pixmap, bool *bIsPng = nullptr);
LTSUTILSCORE_EXPORT std::vector<uint8_t> fromImage(const QImage& image, bool* bIsPng = nullptr); LTSUTILSCORE_EXPORT std::vector<uint8_t> fromImage(const QImage &image, bool *bIsPng = nullptr);
} // namespace LtsUtils } // namespace LtsUtils
@@ -21,95 +21,81 @@
namespace LtsUtils namespace LtsUtils
{ {
class JsonParseError : public std::runtime_error class JsonParseError : public std::runtime_error
{ {
public: public:
JsonParseError(const QJsonParseError& err) JsonParseError(const QJsonParseError &err)
: std::runtime_error("json parse error: " + err.errorString().toStdString() + " - at offset " + : std::runtime_error("json parse error: " + err.errorString().toStdString() + " - at offset " + std::to_string(err.offset))
std::to_string(err.offset))
{ {
} }
}; };
class JsonError : public std::runtime_error class JsonError : public std::runtime_error
{ {
public: public:
using std::runtime_error::runtime_error; using std::runtime_error::runtime_error;
}; };
class JsonKeyError : public JsonError class JsonKeyError : public JsonError
{ {
public: public:
using JsonError::JsonError; using JsonError::JsonError;
}; };
class JsonRangeError : public JsonError class JsonRangeError : public JsonError
{ {
public: public:
using JsonError::JsonError; using JsonError::JsonError;
}; };
class JsonTypeError : public JsonError class JsonTypeError : public JsonError
{ {
public: public:
using JsonError::JsonError; using JsonError::JsonError;
}; };
class JsonObject class JsonObject
{ {
public: public:
class Key; class Key;
JsonObject() = default; JsonObject() = default;
explicit JsonObject(const QJsonObject& json) : m_json(json), m_jsonIsSet(true) {} explicit JsonObject(const QJsonObject &json)
: m_json(json)
explicit JsonObject(QJsonObject&& json) : m_json(std::move(json)), m_jsonIsSet(true) {} , m_jsonIsSet(true)
static inline JsonObject fromJson(const char* json, int len = -1);
static inline JsonObject fromJson(const QByteArray& json)
{ {
return fromJson(json.data(), json.size());
} }
static inline JsonObject fromJson(const std::string& json) explicit JsonObject(QJsonObject &&json)
: m_json(std::move(json))
, m_jsonIsSet(true)
{ {
return fromJson(json.c_str(), json.size());
} }
static inline JsonObject fromJsonSafe(const char* json, int len = -1) noexcept(false); static inline JsonObject fromJson(const char *json, int len = -1);
static inline JsonObject fromJsonSafe(const QByteArray& json) noexcept(false) static inline JsonObject fromJson(const QByteArray &json) { return fromJson(json.data(), json.size()); }
{
return fromJsonSafe(json.data(), json.size());
}
static inline JsonObject fromJsonSafe(const std::string& json) noexcept(false) static inline JsonObject fromJson(const std::string &json) { return fromJson(json.c_str(), json.size()); }
{
return fromJsonSafe(json.c_str(), json.size());
}
template <class T> [[nodiscard]] bool contains(const Key& key) const; static inline JsonObject fromJsonSafe(const char *json, int len = -1) noexcept(false);
[[nodiscard]] bool isNull(const Key& key) const static inline JsonObject fromJsonSafe(const QByteArray &json) noexcept(false) { return fromJsonSafe(json.data(), json.size()); }
{
return contains<void>(key);
}
[[nodiscard]] bool isEmpty() const static inline JsonObject fromJsonSafe(const std::string &json) noexcept(false) { return fromJsonSafe(json.c_str(), json.size()); }
{
return m_json.isEmpty();
}
[[nodiscard]] bool isValid() const template <class T> [[nodiscard]] bool contains(const Key &key) const;
{
return m_jsonIsSet;
}
template <class T> T value(const Key& key) const noexcept(false); [[nodiscard]] bool isNull(const Key &key) const { return contains<void>(key); }
template <class T> T valueOr(const Key& key, const T& defaultValue) const noexcept(false); [[nodiscard]] bool isEmpty() const { return m_json.isEmpty(); }
[[nodiscard]] bool isValid() const { return m_jsonIsSet; }
template <class T> T value(const Key &key) const noexcept(false);
template <class T> T valueOr(const Key &key, const T &defaultValue) const noexcept(false);
template <class T> [[nodiscard]] bool isMap() const; template <class T> [[nodiscard]] bool isMap() const;
@@ -117,56 +103,47 @@ class JsonObject
template <class T> std::map<std::string, T> toStdMap() const; template <class T> std::map<std::string, T> toStdMap() const;
bool operator==(const JsonObject& other) const bool operator==(const JsonObject &other) const { return m_json == other.m_json; }
{
return m_json == other.m_json;
}
bool operator!=(const JsonObject& other) const bool operator!=(const JsonObject &other) const { return !(*this == other); }
{
return !(*this == other);
}
class Key class Key
{ {
public: public:
Key(QString s) : m_s(std::move(s)) {} Key(QString s)
: m_s(std::move(s))
Key(const std::string& s) : m_s(QString::fromStdString(s)) {}
Key(const char* s) : m_s(QString::fromUtf8(s)) {}
operator const QString&() const
{ {
return m_s;
} }
Key(const std::string &s)
: m_s(QString::fromStdString(s))
{
}
Key(const char *s)
: m_s(QString::fromUtf8(s))
{
}
operator const QString &() const { return m_s; }
private: private:
const QString m_s; const QString m_s;
}; };
operator const QJsonObject&() const operator const QJsonObject &() const { return m_json; }
{
return m_json;
}
[[nodiscard]] const QJsonObject& object() const [[nodiscard]] const QJsonObject &object() const { return m_json; }
{
return m_json;
}
private: private:
[[nodiscard]] bool containsAny(const QString& key) const [[nodiscard]] bool containsAny(const QString &key) const { return m_json.contains(key); }
{
return m_json.contains(key);
}
QJsonObject m_json; QJsonObject m_json;
bool m_jsonIsSet = false; bool m_jsonIsSet = false;
}; };
JsonObject JsonObject::fromJson(const char* json, int len) JsonObject JsonObject::fromJson(const char *json, int len)
{ {
if (len < 0) if (len < 0)
len = strlen(json); len = strlen(json);
QJsonParseError error; QJsonParseError error;
@@ -178,10 +155,10 @@ JsonObject JsonObject::fromJson(const char* json, int len)
return {}; return {};
return JsonObject(doc.object()); return JsonObject(doc.object());
} }
JsonObject JsonObject::fromJsonSafe(const char* json, int len) noexcept(false) JsonObject JsonObject::fromJsonSafe(const char *json, int len) noexcept(false)
{ {
if (len < 0) if (len < 0)
len = strlen(json); len = strlen(json);
QJsonParseError error; QJsonParseError error;
@@ -193,62 +170,46 @@ JsonObject JsonObject::fromJsonSafe(const char* json, int len) noexcept(false)
throw JsonTypeError("JSON root is not an object"); throw JsonTypeError("JSON root is not an object");
return JsonObject(doc.object()); return JsonObject(doc.object());
} }
class JsonArray class JsonArray
{ {
public: public:
JsonArray() = default; JsonArray() = default;
explicit JsonArray(const QJsonArray& json) : m_json(json), m_jsonIsSet(true) {} explicit JsonArray(const QJsonArray &json)
: m_json(json)
explicit JsonArray(QJsonArray&& json) : m_json(std::move(json)), m_jsonIsSet(true) {} , m_jsonIsSet(true)
static inline JsonArray fromJson(const char* json, int len = -1);
static inline JsonArray fromJson(const QByteArray& json)
{ {
return fromJson(json.data(), json.size());
} }
static inline JsonArray fromJson(const std::string& json) explicit JsonArray(QJsonArray &&json)
: m_json(std::move(json))
, m_jsonIsSet(true)
{ {
return fromJson(json.c_str(), json.size());
} }
static inline JsonArray fromJsonSafe(const char* json, int len = -1) noexcept(false); static inline JsonArray fromJson(const char *json, int len = -1);
static inline JsonArray fromJsonSafe(const QByteArray& json) noexcept(false) static inline JsonArray fromJson(const QByteArray &json) { return fromJson(json.data(), json.size()); }
{
return fromJson(json.data(), json.size());
}
static inline JsonArray fromJsonSafe(const std::string& json) noexcept(false) static inline JsonArray fromJson(const std::string &json) { return fromJson(json.c_str(), json.size()); }
{
return fromJson(json.c_str(), json.size());
}
[[nodiscard]] int size() const static inline JsonArray fromJsonSafe(const char *json, int len = -1) noexcept(false);
{
return m_json.size();
}
[[nodiscard]] bool isEmpty() const static inline JsonArray fromJsonSafe(const QByteArray &json) noexcept(false) { return fromJson(json.data(), json.size()); }
{
return m_json.isEmpty();
}
[[nodiscard]] bool isValid() const static inline JsonArray fromJsonSafe(const std::string &json) noexcept(false) { return fromJson(json.c_str(), json.size()); }
{
return m_jsonIsSet; [[nodiscard]] int size() const { return m_json.size(); }
}
[[nodiscard]] bool isEmpty() const { return m_json.isEmpty(); }
[[nodiscard]] bool isValid() const { return m_jsonIsSet; }
template <class T> [[nodiscard]] bool contains(int index) const noexcept(false); template <class T> [[nodiscard]] bool contains(int index) const noexcept(false);
[[nodiscard]] bool isNull(int index) const noexcept(false) [[nodiscard]] bool isNull(int index) const noexcept(false) { return contains<void>(index); }
{
return contains<void>(index);
}
template <class T> T at(int index) const noexcept(false); template <class T> T at(int index) const noexcept(false);
@@ -258,28 +219,19 @@ class JsonArray
template <class T> std::vector<T> toStdVector() const; template <class T> std::vector<T> toStdVector() const;
bool operator==(const JsonArray& other) const bool operator==(const JsonArray &other) const { return m_json == other.m_json; }
{
return m_json == other.m_json;
}
bool operator!=(const JsonArray& other) const bool operator!=(const JsonArray &other) const { return !(*this == other); }
{
return !(*this == other);
}
const QJsonArray& operator()() const const QJsonArray &operator()() const { return m_json; }
{
return m_json;
}
private: private:
QJsonArray m_json; QJsonArray m_json;
bool m_jsonIsSet = false; bool m_jsonIsSet = false;
}; };
JsonArray JsonArray::fromJson(const char* json, int len) JsonArray JsonArray::fromJson(const char *json, int len)
{ {
if (len < 0) if (len < 0)
len = strlen(json); len = strlen(json);
QJsonParseError error; QJsonParseError error;
@@ -291,10 +243,10 @@ JsonArray JsonArray::fromJson(const char* json, int len)
return {}; return {};
return JsonArray(doc.array()); return JsonArray(doc.array());
} }
JsonArray JsonArray::fromJsonSafe(const char* json, int len) noexcept(false) JsonArray JsonArray::fromJsonSafe(const char *json, int len) noexcept(false)
{ {
if (len < 0) if (len < 0)
len = strlen(json); len = strlen(json);
QJsonParseError error; QJsonParseError error;
@@ -306,52 +258,34 @@ JsonArray JsonArray::fromJsonSafe(const char* json, int len) noexcept(false)
throw JsonTypeError("JSON root is not an array"); throw JsonTypeError("JSON root is not an array");
return JsonArray(doc.array()); return JsonArray(doc.array());
}
template <class T> struct JsonValue;
template <class Int> struct JsonLimits
{
static constexpr Int lowest()
{
return std::numeric_limits<Int>::lowest();
} }
static constexpr Int max() template <class T> struct JsonValue;
{
return std::numeric_limits<Int>::max();
}
};
template <> struct JsonLimits<int64_t> template <class Int> struct JsonLimits
{
static constexpr int64_t lowest()
{ {
return -(static_cast<int64_t>(1) << 53) + 1; static constexpr Int lowest() { return std::numeric_limits<Int>::lowest(); }
}
static constexpr int64_t max() static constexpr Int max() { return std::numeric_limits<Int>::max(); }
};
template <> struct JsonLimits<int64_t>
{ {
return (static_cast<int64_t>(1) << 53) - 1; static constexpr int64_t lowest() { return -(static_cast<int64_t>(1) << 53) + 1; }
}
};
template <> struct JsonLimits<uint64_t> static constexpr int64_t max() { return (static_cast<int64_t>(1) << 53) - 1; }
{ };
static constexpr uint64_t lowest()
template <> struct JsonLimits<uint64_t>
{ {
return 0; static constexpr uint64_t lowest() { return 0; }
}
static constexpr uint64_t max() static constexpr uint64_t max() { return JsonLimits<int64_t>::max(); }
};
template <class Int> struct JsonIntValue
{ {
return JsonLimits<int64_t>::max(); static bool matchesType(const QJsonValue &value)
}
};
template <class Int> struct JsonIntValue
{
static bool matchesType(const QJsonValue& value)
{ {
if (!value.isDouble()) if (!value.isDouble())
return false; return false;
@@ -366,163 +300,127 @@ template <class Int> struct JsonIntValue
return val == wholeInt; return val == wholeInt;
} }
static Int value(const QJsonValue& value) noexcept(false) static Int value(const QJsonValue &value) noexcept(false)
{ {
if (!matchesType(value)) if (!matchesType(value))
throw JsonTypeError("JSON value not of type Int"); throw JsonTypeError("JSON value not of type Int");
return static_cast<Int>(value.toDouble()); return static_cast<Int>(value.toDouble());
} }
}; };
template <> struct JsonValue<int16_t> : JsonIntValue<int16_t> template <> struct JsonValue<int16_t> : JsonIntValue<int16_t>
{
};
template <> struct JsonValue<uint16_t> : JsonIntValue<uint16_t>
{
};
template <> struct JsonValue<int32_t> : JsonIntValue<int32_t>
{
};
template <> struct JsonValue<uint32_t> : JsonIntValue<uint32_t>
{
};
template <> struct JsonValue<int64_t> : JsonIntValue<int64_t>
{
};
template <> struct JsonValue<uint64_t> : JsonIntValue<uint64_t>
{
};
template <> struct JsonValue<double>
{
static bool matchesType(const QJsonValue& value)
{ {
return value.isDouble(); };
}
static double value(const QJsonValue& value) noexcept(false) template <> struct JsonValue<uint16_t> : JsonIntValue<uint16_t>
{
};
template <> struct JsonValue<int32_t> : JsonIntValue<int32_t>
{
};
template <> struct JsonValue<uint32_t> : JsonIntValue<uint32_t>
{
};
template <> struct JsonValue<int64_t> : JsonIntValue<int64_t>
{
};
template <> struct JsonValue<uint64_t> : JsonIntValue<uint64_t>
{
};
template <> struct JsonValue<double>
{
static bool matchesType(const QJsonValue &value) { return value.isDouble(); }
static double value(const QJsonValue &value) noexcept(false)
{ {
if (!matchesType(value)) if (!matchesType(value))
throw JsonTypeError("JSON value not of type Double"); throw JsonTypeError("JSON value not of type Double");
return value.toDouble(); return value.toDouble();
} }
}; };
template <> struct JsonValue<bool> template <> struct JsonValue<bool>
{
static bool matchesType(const QJsonValue& value)
{ {
return value.isBool(); static bool matchesType(const QJsonValue &value) { return value.isBool(); }
}
static bool value(const QJsonValue& value) noexcept(false) static bool value(const QJsonValue &value) noexcept(false)
{ {
if (!matchesType(value)) if (!matchesType(value))
throw JsonTypeError("JSON value not of type Bool"); throw JsonTypeError("JSON value not of type Bool");
return value.toBool(); return value.toBool();
} }
}; };
template <> struct JsonValue<QString> template <> struct JsonValue<QString>
{
static bool matchesType(const QJsonValue& value)
{ {
return value.isString(); static bool matchesType(const QJsonValue &value) { return value.isString(); }
}
static QString value(const QJsonValue& value) noexcept(false) static QString value(const QJsonValue &value) noexcept(false)
{ {
if (!matchesType(value)) if (!matchesType(value))
throw JsonTypeError("JSON value not of type String"); throw JsonTypeError("JSON value not of type String");
return value.toString(); return value.toString();
} }
}; };
template <> struct JsonValue<std::string> template <> struct JsonValue<std::string>
{
static bool matchesType(const QJsonValue& value)
{ {
return value.isString(); static bool matchesType(const QJsonValue &value) { return value.isString(); }
}
static std::string value(const QJsonValue& value) static std::string value(const QJsonValue &value) { return JsonValue<QString>::value(value).toStdString(); }
};
template <> struct JsonValue<QJsonObject>
{ {
return JsonValue<QString>::value(value).toStdString(); static bool matchesType(const QJsonValue &value) { return value.isObject(); }
}
};
template <> struct JsonValue<QJsonObject> static QJsonObject value(const QJsonValue &value) noexcept(false)
{
static bool matchesType(const QJsonValue& value)
{
return value.isObject();
}
static QJsonObject value(const QJsonValue& value) noexcept(false)
{ {
if (!matchesType(value)) if (!matchesType(value))
throw JsonTypeError("JSON value not of type Object"); throw JsonTypeError("JSON value not of type Object");
return value.toObject(); return value.toObject();
} }
}; };
template <> struct JsonValue<JsonObject> template <> struct JsonValue<JsonObject>
{
static bool matchesType(const QJsonValue& value)
{ {
return value.isObject(); static bool matchesType(const QJsonValue &value) { return value.isObject(); }
}
static JsonObject value(const QJsonValue& value) static JsonObject value(const QJsonValue &value) { return JsonObject(JsonValue<QJsonObject>::value(value)); }
};
template <> struct JsonValue<void>
{ {
return JsonObject(JsonValue<QJsonObject>::value(value)); static bool matchesType(const QJsonValue &value) { return value.isNull(); }
} };
};
template <> struct JsonValue<void> template <> struct JsonValue<QJsonArray>
{
static bool matchesType(const QJsonValue& value)
{ {
return value.isNull(); static bool matchesType(const QJsonValue &value) { return value.isArray(); }
}
};
template <> struct JsonValue<QJsonArray> static QJsonArray value(const QJsonValue &value) noexcept(false)
{
static bool matchesType(const QJsonValue& value)
{
return value.isArray();
}
static QJsonArray value(const QJsonValue& value) noexcept(false)
{ {
if (!matchesType(value)) if (!matchesType(value))
throw JsonTypeError("JSON value not of type Array"); throw JsonTypeError("JSON value not of type Array");
return value.toArray(); return value.toArray();
} }
}; };
template <> struct JsonValue<JsonArray> template <> struct JsonValue<JsonArray>
{
static bool matchesType(const QJsonValue& value)
{ {
return value.isArray(); static bool matchesType(const QJsonValue &value) { return value.isArray(); }
}
static JsonArray value(const QJsonValue& value) static JsonArray value(const QJsonValue &value) { return JsonArray(JsonValue<QJsonArray>::value(value)); }
};
template <class T> struct JsonValue<QVector<T>>
{ {
return JsonArray(JsonValue<QJsonArray>::value(value)); static bool matchesType(const QJsonValue &value)
}
};
template <class T> struct JsonValue<QVector<T>>
{
static bool matchesType(const QJsonValue& value)
{ {
if (!value.isArray()) if (!value.isArray())
return false; return false;
@@ -531,30 +429,27 @@ template <class T> struct JsonValue<QVector<T>>
return array.isVector<T>(); return array.isVector<T>();
} }
static QVector<T> value(const QJsonValue& value) static QVector<T> value(const QJsonValue &value)
{ {
const JsonArray array(JsonValue<QJsonArray>::value(value)); const JsonArray array(JsonValue<QJsonArray>::value(value));
return array.toVector<T>(); return array.toVector<T>();
} }
}; };
template <class T> struct JsonValue<std::vector<T>> template <class T> struct JsonValue<std::vector<T>>
{
static bool matchesType(const QJsonValue& value)
{ {
return JsonValue<QVector<T>>::matchesType(value); static bool matchesType(const QJsonValue &value) { return JsonValue<QVector<T>>::matchesType(value); }
}
static std::vector<T> value(const QJsonValue& value) static std::vector<T> value(const QJsonValue &value)
{ {
const JsonArray array(JsonValue<QJsonArray>::value(value)); const JsonArray array(JsonValue<QJsonArray>::value(value));
return array.toStdVector<T>(); return array.toStdVector<T>();
} }
}; };
template <class T> struct JsonValue<QMap<QString, T>> template <class T> struct JsonValue<QMap<QString, T>>
{ {
static bool matchesType(const QJsonValue& value) static bool matchesType(const QJsonValue &value)
{ {
if (!value.isObject()) if (!value.isObject())
return false; return false;
@@ -563,126 +458,122 @@ template <class T> struct JsonValue<QMap<QString, T>>
return obj.isMap<T>(); return obj.isMap<T>();
} }
static QMap<QString, T> value(const QJsonValue& value) static QMap<QString, T> value(const QJsonValue &value)
{ {
const JsonObject obj(JsonValue<QJsonObject>::value(value)); const JsonObject obj(JsonValue<QJsonObject>::value(value));
return obj.toMap<T>(); return obj.toMap<T>();
} }
}; };
template <class T> struct JsonValue<std::map<std::string, T>> template <class T> struct JsonValue<std::map<std::string, T>>
{
static bool matchesType(const QJsonValue& value)
{ {
return JsonValue<QMap<QString, T>>::matchesType(value); static bool matchesType(const QJsonValue &value) { return JsonValue<QMap<QString, T>>::matchesType(value); }
}
static std::map<std::string, T> value(const QJsonValue& value) static std::map<std::string, T> value(const QJsonValue &value)
{ {
const JsonObject obj(JsonValue<QJsonObject>::value(value)); const JsonObject obj(JsonValue<QJsonObject>::value(value));
return obj.toStdMap<T>(); return obj.toStdMap<T>();
} }
}; };
template <class T> bool JsonObject::contains(const Key& key) const template <class T> bool JsonObject::contains(const Key &key) const
{ {
if (!m_json.contains(key)) if (!m_json.contains(key))
return false; return false;
return JsonValue<T>::matchesType(m_json.value(key)); return JsonValue<T>::matchesType(m_json.value(key));
} }
template <class T> T JsonObject::value(const Key& key) const noexcept(false) template <class T> T JsonObject::value(const Key &key) const noexcept(false)
{ {
if (!containsAny(key)) if (!containsAny(key))
throw JsonKeyError("no element with key: " + static_cast<const QString&>(key).toStdString()); throw JsonKeyError("no element with key: " + static_cast<const QString &>(key).toStdString());
try try
{ {
return JsonValue<T>::value(m_json.value(key)); return JsonValue<T>::value(m_json.value(key));
} }
catch (const JsonTypeError& typeError) catch (const JsonTypeError &typeError)
{ {
throw JsonTypeError(std::string(typeError.what()) + throw JsonTypeError(std::string(typeError.what()) + " - key: " + static_cast<const QString &>(key).toStdString());
" - key: " + static_cast<const QString&>(key).toStdString()); }
} }
}
template <class T> T JsonObject::valueOr(const Key& key, const T& defaultValue) const template <class T> T JsonObject::valueOr(const Key &key, const T &defaultValue) const
{ {
try try
{ {
return value<T>(key); return value<T>(key);
} }
catch (const JsonKeyError&) catch (const JsonKeyError &)
{ {
return defaultValue; return defaultValue;
} }
} }
template <class T> bool JsonObject::isMap() const template <class T> bool JsonObject::isMap() const
{ {
const QStringList keys = m_json.keys(); const QStringList keys = m_json.keys();
for (const auto& key : keys) for (const auto &key : keys)
if (!JsonValue<T>::matchesType(m_json.value(key))) if (!JsonValue<T>::matchesType(m_json.value(key)))
return false; return false;
return true; return true;
} }
template <class T> QMap<QString, T> JsonObject::toMap() const template <class T> QMap<QString, T> JsonObject::toMap() const
{ {
QMap<QString, T> result; QMap<QString, T> result;
for (auto current = m_json.begin(); current != m_json.end(); ++current) for (auto current = m_json.begin(); current != m_json.end(); ++current)
result.insert(current.key(), JsonValue<T>::value(current.value())); result.insert(current.key(), JsonValue<T>::value(current.value()));
return result; return result;
} }
template <class T> std::map<std::string, T> JsonObject::toStdMap() const template <class T> std::map<std::string, T> JsonObject::toStdMap() const
{ {
std::map<std::string, T> result; std::map<std::string, T> result;
for (auto current = m_json.begin(); current != m_json.end(); ++current) for (auto current = m_json.begin(); current != m_json.end(); ++current)
result.insert({current.key().toStdString(), JsonValue<T>::value(current.value())}); result.insert({current.key().toStdString(), JsonValue<T>::value(current.value())});
return result; return result;
} }
template <class T> bool JsonArray::contains(int index) const noexcept(false) template <class T> bool JsonArray::contains(int index) const noexcept(false)
{ {
if (index < 0 || index >= m_json.size()) if (index < 0 || index >= m_json.size())
throw JsonRangeError("index out of range: " + std::to_string(index)); throw JsonRangeError("index out of range: " + std::to_string(index));
return JsonValue<T>::matchesType(m_json.at(index)); return JsonValue<T>::matchesType(m_json.at(index));
} }
template <class T> T JsonArray::at(int index) const noexcept(false) template <class T> T JsonArray::at(int index) const noexcept(false)
{ {
if (index < 0 || index >= m_json.size()) if (index < 0 || index >= m_json.size())
throw JsonRangeError("index out of range: " + std::to_string(index)); throw JsonRangeError("index out of range: " + std::to_string(index));
return JsonValue<T>::value(m_json.at(index)); return JsonValue<T>::value(m_json.at(index));
} }
template <class T> bool JsonArray::isVector() const template <class T> bool JsonArray::isVector() const
{ {
for (const QJsonValue& value : m_json) for (const QJsonValue &value : m_json)
if (!JsonValue<T>::matchesType(value)) if (!JsonValue<T>::matchesType(value))
return false; return false;
return true; return true;
} }
template <class T> QVector<T> JsonArray::toVector() const template <class T> QVector<T> JsonArray::toVector() const
{ {
QVector<T> result; QVector<T> result;
result.reserve(m_json.size()); result.reserve(m_json.size());
for (const QJsonValue& value : m_json) for (const QJsonValue &value : m_json)
result.push_back(JsonValue<T>::value(value)); result.push_back(JsonValue<T>::value(value));
return result; return result;
} }
template <class T> std::vector<T> JsonArray::toStdVector() const template <class T> std::vector<T> JsonArray::toStdVector() const
{ {
std::vector<T> result; std::vector<T> result;
result.reserve(m_json.size()); result.reserve(m_json.size());
for (const QJsonValue& value : m_json) for (const QJsonValue &value : m_json)
result.push_back(JsonValue<T>::value(value)); result.push_back(JsonValue<T>::value(value));
return result; return result;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -3,12 +3,12 @@
namespace LtsUtils namespace LtsUtils
{ {
LtsUtils::LtsPortRange fromQPoint(const QPoint& point) LtsUtils::LtsPortRange fromQPoint(const QPoint &point)
{ {
if (point.x() < 1025 || point.y() > 65535 || point.x() > point.y()) if (point.x() < 1025 || point.y() > 65535 || point.x() > point.y())
return {}; return {};
return {static_cast<quint16>(point.x()), static_cast<quint16>(point.y())}; return {static_cast<quint16>(point.x()), static_cast<quint16>(point.y())};
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -7,7 +7,7 @@
namespace LtsUtils namespace LtsUtils
{ {
typedef QPair<quint16, quint16> LtsPortRange; typedef QPair<quint16, quint16> LtsPortRange;
LTSUTILSCORE_EXPORT LtsPortRange fromQPoint(const QPoint& point); LTSUTILSCORE_EXPORT LtsPortRange fromQPoint(const QPoint &point);
} // namespace LtsUtils } // namespace LtsUtils
@@ -6,17 +6,17 @@
namespace LtsUtils namespace LtsUtils
{ {
LtsTranslatableIdentifier::LtsTranslatableIdentifier(const QString& identifier, const QObject* context, LtsTranslatableIdentifier::LtsTranslatableIdentifier(const QString &identifier, const QObject *context, const char *translatableText)
const char* translatableText) : m_identifier(identifier)
: m_identifier(identifier), m_translationContext(context->metaObject()->className()), , m_translationContext(context->metaObject()->className())
m_translatableText(translatableText) , m_translatableText(translatableText)
{ {
} }
const QString LtsTranslatableIdentifier::translatedText(const char* disambiguation, int n) const const QString LtsTranslatableIdentifier::translatedText(const char *disambiguation, int n) const
{ {
if (m_identifier.isEmpty() || m_translationContext == nullptr || m_translatableText == nullptr) if (m_identifier.isEmpty() || m_translationContext == nullptr || m_translatableText == nullptr)
return {}; return {};
return QCoreApplication::translate(m_translationContext, m_translatableText, disambiguation, n); return QCoreApplication::translate(m_translationContext, m_translatableText, disambiguation, n);
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -7,29 +7,27 @@
namespace LtsUtils namespace LtsUtils
{ {
class LTSUTILSCORE_EXPORT LtsTranslatableIdentifier class LTSUTILSCORE_EXPORT LtsTranslatableIdentifier
{ {
public: public:
LtsTranslatableIdentifier() : m_translationContext(nullptr), m_translatableText("") {} LtsTranslatableIdentifier()
: m_translationContext(nullptr)
LtsTranslatableIdentifier(const QString& identifier, const QObject* context, const char* translatableText); , m_translatableText("")
const QString& identifier() const
{ {
return m_identifier;
} }
const QString translatedText(const char* disambiguation = nullptr, int n = -1) const; LtsTranslatableIdentifier(const QString &identifier, const QObject *context, const char *translatableText);
const QString _context() const const QString &identifier() const { return m_identifier; }
{
return QString::fromUtf8(m_translationContext); const QString translatedText(const char *disambiguation = nullptr, int n = -1) const;
}
const QString _context() const { return QString::fromUtf8(m_translationContext); }
private: private:
QString m_identifier; QString m_identifier;
const char* m_translationContext; const char *m_translationContext;
const char* m_translatableText; const char *m_translatableText;
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -6,9 +6,9 @@
namespace LtsUtils namespace LtsUtils
{ {
inline bool isPositionTimeOutdated(qint64 curTime, qint64 posTime) inline bool isPositionTimeOutdated(qint64 curTime, qint64 posTime)
{ {
return curTime > posTime + 11 * 60 * 1000; return curTime > posTime + 11 * 60 * 1000;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -11,8 +11,8 @@
namespace LtsUtils namespace LtsUtils
{ {
template <typename T> static inline QString convertToPgString(const std::vector<T>& data) template <typename T> static inline QString convertToPgString(const std::vector<T> &data)
{ {
if (data.size() == 0) if (data.size() == 0)
return QLatin1String("{}"); return QLatin1String("{}");
QString ret(QLatin1Char('{')); QString ret(QLatin1Char('{'));
@@ -21,22 +21,20 @@ template <typename T> static inline QString convertToPgString(const std::vector<
ret.chop(1); ret.chop(1);
ret += QLatin1Char('}'); ret += QLatin1Char('}');
return ret; return ret;
} }
template <> LTSUTILSCORE_EXPORT QString IntArray::toPgString() const template <> LTSUTILSCORE_EXPORT QString IntArray::toPgString() const
{ {
return convertToPgString(m_data); return convertToPgString(m_data);
} }
template <> LTSUTILSCORE_EXPORT QString BigintArray::toPgString() const template <> LTSUTILSCORE_EXPORT QString BigintArray::toPgString() const
{ {
return convertToPgString(m_data); return convertToPgString(m_data);
} }
template <typename T> template <typename T> static inline T convertFromPgString(const QString &str, const std::function<typename T::Type(QStringView val, bool *bOk)> &convertFunc)
static inline T convertFromPgString(const QString& str, {
const std::function<typename T::Type(QStringView val, bool* bOk)>& convertFunc)
{
typename T::ContainerType result; typename T::ContainerType result;
int idxStart = str.indexOf(QLatin1Char('{')); int idxStart = str.indexOf(QLatin1Char('{'));
@@ -53,7 +51,7 @@ static inline T convertFromPgString(const QString& str,
const QStringView strRef = QStringView(str).mid(idxStart + 1, idxEnd - idxStart - 1); const QStringView strRef = QStringView(str).mid(idxStart + 1, idxEnd - idxStart - 1);
const QVector<QStringView> vec = strRef.split(QLatin1Char(','), Qt::SkipEmptyParts); const QVector<QStringView> vec = strRef.split(QLatin1Char(','), Qt::SkipEmptyParts);
result.reserve(vec.size()); result.reserve(vec.size());
for (const QStringView& s : vec) for (const QStringView &s : vec)
{ {
bool ok = false; bool ok = false;
const typename T::Type i = convertFunc(s, &ok); const typename T::Type i = convertFunc(s, &ok);
@@ -62,48 +60,44 @@ static inline T convertFromPgString(const QString& str,
} }
return T(result); return T(result);
} }
template <> LTSUTILSCORE_EXPORT IntArray IntArray::fromPgString(const QString& str) template <> LTSUTILSCORE_EXPORT IntArray IntArray::fromPgString(const QString &str)
{ {
return convertFromPgString<IntArray>(str, [](QStringView val, bool* bOk) { return val.toString().toInt(bOk); }); return convertFromPgString<IntArray>(str, [](QStringView val, bool *bOk) { return val.toString().toInt(bOk); });
} }
template <> LTSUTILSCORE_EXPORT BigintArray BigintArray::fromPgString(const QString& str) template <> LTSUTILSCORE_EXPORT BigintArray BigintArray::fromPgString(const QString &str)
{ {
return convertFromPgString<BigintArray>(str, return convertFromPgString<BigintArray>(str, [](QStringView val, bool *bOk) { return val.toString().toLongLong(bOk); });
[](QStringView val, bool* bOk) { return val.toString().toLongLong(bOk); }); }
}
template <typename T> static inline QString convertToPgString(const std::map<T, T>& data) template <typename T> static inline QString convertToPgString(const std::map<T, T> &data)
{ {
if (data.size() == 0) if (data.size() == 0)
return QLatin1String("{}"); return QLatin1String("{}");
QString ret(QLatin1Char('{')); QString ret(QLatin1Char('{'));
for (const auto& it : data) for (const auto &it : data)
{ {
ret += QLatin1Char('{') + QString::number(it.first) + QLatin1Char(',') + QString::number(it.second) + ret += QLatin1Char('{') + QString::number(it.first) + QLatin1Char(',') + QString::number(it.second) + QLatin1String("},");
QLatin1String("},");
} }
ret.chop(1); ret.chop(1);
ret += QLatin1Char('}'); ret += QLatin1Char('}');
return ret; return ret;
} }
template <> LTSUTILSCORE_EXPORT QString IntArray2D::toPgString() const template <> LTSUTILSCORE_EXPORT QString IntArray2D::toPgString() const
{ {
return convertToPgString<IntArray2D::Type>(m_data); return convertToPgString<IntArray2D::Type>(m_data);
} }
template <> LTSUTILSCORE_EXPORT QString BigintArray2D::toPgString() const template <> LTSUTILSCORE_EXPORT QString BigintArray2D::toPgString() const
{ {
return convertToPgString<BigintArray2D::Type>(m_data); return convertToPgString<BigintArray2D::Type>(m_data);
} }
template <typename T> template <typename T> static inline T convertFromPgString2D(const QString &str, const std::function<typename T::Type(QStringView val)> &convertFunc)
static inline T convertFromPgString2D(const QString& str, {
const std::function<typename T::Type(QStringView val)>& convertFunc)
{
typename T::ContainerType ret; typename T::ContainerType ret;
int idxStart = str.indexOf(QLatin1Char('{')); int idxStart = str.indexOf(QLatin1Char('{'));
int idxEnd = str.lastIndexOf(QLatin1Char('}')); int idxEnd = str.lastIndexOf(QLatin1Char('}'));
@@ -136,16 +130,16 @@ static inline T convertFromPgString2D(const QString& str,
} }
return T(ret); return T(ret);
} }
template <> LTSUTILSCORE_EXPORT IntArray2D IntArray2D::fromPgString(const QString& str) template <> LTSUTILSCORE_EXPORT IntArray2D IntArray2D::fromPgString(const QString &str)
{ {
return convertFromPgString2D<IntArray2D>(str, [](QStringView val) { return val.toString().toInt(); }); return convertFromPgString2D<IntArray2D>(str, [](QStringView val) { return val.toString().toInt(); });
} }
template <> LTSUTILSCORE_EXPORT BigintArray2D BigintArray2D::fromPgString(const QString& str) template <> LTSUTILSCORE_EXPORT BigintArray2D BigintArray2D::fromPgString(const QString &str)
{ {
return convertFromPgString2D<BigintArray2D>(str, [](QStringView val) { return val.toString().toLongLong(); }); return convertFromPgString2D<BigintArray2D>(str, [](QStringView val) { return val.toString().toLongLong(); });
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -9,32 +9,32 @@
namespace LtsUtils namespace LtsUtils
{ {
template <typename T, typename C> class PgArray template <typename T, typename C> class PgArray
{ {
public: public:
using Type = T; using Type = T;
using ContainerType = C; using ContainerType = C;
PgArray() = default; PgArray() = default;
Q_DECL_CONSTEXPR explicit PgArray(const C& data) : m_data(data) {} Q_DECL_CONSTEXPR explicit PgArray(const C &data)
: m_data(data)
Q_DECL_CONSTEXPR C operator()() const
{ {
return m_data;
} }
Q_DECL_CONSTEXPR C operator()() const { return m_data; }
[[nodiscard]] QString toPgString() const; [[nodiscard]] QString toPgString() const;
static PgArray fromPgString(const QString& str); static PgArray fromPgString(const QString &str);
private: private:
C m_data; C m_data;
}; };
using IntArray = PgArray<int, std::vector<int>>; using IntArray = PgArray<int, std::vector<int>>;
using BigintArray = PgArray<int64_t, std::vector<int64_t>>; using BigintArray = PgArray<int64_t, std::vector<int64_t>>;
using IntArray2D = PgArray<int, std::map<int, int>>; using IntArray2D = PgArray<int, std::map<int, int>>;
using BigintArray2D = PgArray<int64_t, std::map<int64_t, int64_t>>; using BigintArray2D = PgArray<int64_t, std::map<int64_t, int64_t>>;
} // namespace LtsUtils } // namespace LtsUtils
@@ -7,16 +7,20 @@
namespace LtsUtils namespace LtsUtils
{ {
Promise::Promise(const std::function<void(ResultFunction resolve, ResultFunction reject)>& function, QObject* parent) Promise::Promise(const std::function<void(ResultFunction resolve, ResultFunction reject)> &function, QObject *parent)
: QObject(parent), m_functionAlreadySet(false), m_timeout(new QTimer(this)), m_resultSet(false), m_timeoutSet(false) : QObject(parent)
{ , m_functionAlreadySet(false)
, m_timeout(new QTimer(this))
, m_resultSet(false)
, m_timeoutSet(false)
{
m_timeout->setSingleShot(true); m_timeout->setSingleShot(true);
connect(m_timeout, &QTimer::timeout, this, &Promise::slotTimeout); connect(m_timeout, &QTimer::timeout, this, &Promise::slotTimeout);
setFunction(function); setFunction(function);
} }
void Promise::setFunction(const std::function<void(ResultFunction resolve, ResultFunction reject)>& function) void Promise::setFunction(const std::function<void(ResultFunction resolve, ResultFunction reject)> &function)
{ {
if (!function || m_functionAlreadySet) if (!function || m_functionAlreadySet)
return; return;
@@ -25,56 +29,54 @@ void Promise::setFunction(const std::function<void(ResultFunction resolve, Resul
if (m_timeoutSet) if (m_timeoutSet)
m_timeout->start(); m_timeout->start();
QTimer::singleShot(0, this, [this, function]() { QTimer::singleShot(0, this, [this, function]() { function([this](const QVariant &value) { resolve(value); }, [this](const QVariant &value) { reject(value); }); });
function([this](const QVariant& value) { resolve(value); }, [this](const QVariant& value) { reject(value); }); }
});
}
void Promise::setTimeout(int interval) void Promise::setTimeout(int interval)
{ {
m_timeout->stop(); m_timeout->stop();
m_timeout->setInterval(interval); m_timeout->setInterval(interval);
m_timeoutSet = (interval != 0); m_timeoutSet = (interval != 0);
if (interval != 0 && m_functionAlreadySet) if (interval != 0 && m_functionAlreadySet)
m_timeout->start(); m_timeout->start();
} }
void Promise::slotTimeout() void Promise::slotTimeout()
{ {
reject(QStringLiteral("timeout")); reject(QStringLiteral("timeout"));
} }
void Promise::resolve(const QVariant& value) void Promise::resolve(const QVariant &value)
{ {
if (m_resultSet) if (m_resultSet)
return; return;
m_resultSet = true; m_resultSet = true;
m_timeout->stop(); m_timeout->stop();
m_resolveFn(value); m_resolveFn(value);
} }
void Promise::reject(const QVariant& value) void Promise::reject(const QVariant &value)
{ {
if (m_resultSet) if (m_resultSet)
return; return;
m_resultSet = true; m_resultSet = true;
m_timeout->stop(); m_timeout->stop();
m_rejectFn(value); m_rejectFn(value);
} }
Promise& Promise::resolved(ResultFunction resolveFn) Promise &Promise::resolved(ResultFunction resolveFn)
{ {
m_resolveFn = resolveFn; m_resolveFn = resolveFn;
return *this; return *this;
} }
Promise& Promise::rejected(ResultFunction rejectFn) Promise &Promise::rejected(ResultFunction rejectFn)
{ {
m_rejectFn = rejectFn; m_rejectFn = rejectFn;
return *this; return *this;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -10,39 +10,38 @@ class QTimer;
namespace LtsUtils namespace LtsUtils
{ {
typedef std::function<void(const QVariant& value)> RawResultFunction; typedef std::function<void(const QVariant &value)> RawResultFunction;
typedef const RawResultFunction& ResultFunction; typedef const RawResultFunction &ResultFunction;
class LTSUTILSCORE_EXPORT Promise : public QObject class LTSUTILSCORE_EXPORT Promise : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
Promise(const std::function<void(ResultFunction resolve, ResultFunction reject)>& function, Promise(const std::function<void(ResultFunction resolve, ResultFunction reject)> &function, QObject *parent = nullptr);
QObject* parent = nullptr);
void setFunction(const std::function<void(ResultFunction resolve, ResultFunction reject)>& function); void setFunction(const std::function<void(ResultFunction resolve, ResultFunction reject)> &function);
void resolve(const QVariant& value = QVariant()); void resolve(const QVariant &value = QVariant());
void reject(const QVariant& value = QVariant()); void reject(const QVariant &value = QVariant());
void setTimeout(int interval); void setTimeout(int interval);
Promise& resolved(ResultFunction resolveFn); Promise &resolved(ResultFunction resolveFn);
Promise& rejected(ResultFunction rejectFn); Promise &rejected(ResultFunction rejectFn);
private: private:
RawResultFunction m_resolveFn; RawResultFunction m_resolveFn;
RawResultFunction m_rejectFn; RawResultFunction m_rejectFn;
bool m_functionAlreadySet; bool m_functionAlreadySet;
QTimer* m_timeout; QTimer *m_timeout;
bool m_resultSet; bool m_resultSet;
bool m_timeoutSet; bool m_timeoutSet;
private slots: private slots:
void slotTimeout(); void slotTimeout();
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -9,23 +9,30 @@
namespace LtsUtils namespace LtsUtils
{ {
void PromiseExample1_Class::doSomethingAsync1() void PromiseExample1_Class::doSomethingAsync1()
{ {
QTimer::singleShot(200, this, [this]() { emit signalDone1(true); }); QTimer::singleShot(200, this, [this]() { emit signalDone1(true); });
} }
void PromiseExample1_Class::doSomethingAsync2() void PromiseExample1_Class::doSomethingAsync2()
{ {
QTimer::singleShot(450, this, [this]() { emit signalDone2(true, 1234); }); QTimer::singleShot(450, this, [this]() { emit signalDone2(true, 1234); });
} }
PromiseExample1::PromiseExample1(QObject* parent) : QObject(parent), m_success(false) PromiseExample1::PromiseExample1(QObject *parent)
{ : QObject(parent)
, m_success(false)
{
auto func = [this](ResultFunction resolve, ResultFunction reject) { auto func = [this](ResultFunction resolve, ResultFunction reject)
PromiseExample1_Class* c = new PromiseExample1_Class(this); {
PromiseExample1_Class *c = new PromiseExample1_Class(this);
connect(c, &PromiseExample1_Class::signalDone1, this, [this, c, resolve, reject](bool didThisWork) { connect(c,
&PromiseExample1_Class::signalDone1,
this,
[this, c, resolve, reject](bool didThisWork)
{
if (!didThisWork) if (!didThisWork)
{ {
@@ -35,8 +42,11 @@ PromiseExample1::PromiseExample1(QObject* parent) : QObject(parent), m_success(f
else else
{ {
connect(c, &PromiseExample1_Class::signalDone2, this, connect(c,
[resolve, reject](bool didThisWork, int someNumberThatReturns) { &PromiseExample1_Class::signalDone2,
this,
[resolve, reject](bool didThisWork, int someNumberThatReturns)
{
if (didThisWork) if (didThisWork)
resolve(someNumberThatReturns); resolve(someNumberThatReturns);
else else
@@ -49,17 +59,22 @@ PromiseExample1::PromiseExample1(QObject* parent) : QObject(parent), m_success(f
c->doSomethingAsync1(); c->doSomethingAsync1();
}; };
Promise* p = new Promise(func, this); Promise *p = new Promise(func, this);
p->resolved([this](const QVariant& value) { p->resolved(
[this](const QVariant &value)
{
qDebug() << "example1 promise succeeded! 'someNumberThatReturns' was" << value; qDebug() << "example1 promise succeeded! 'someNumberThatReturns' was" << value;
m_success = true; m_success = true;
}).rejected([](const QVariant& value) { qDebug() << "example1 promise failed.." << value; }); })
} .rejected([](const QVariant &value) { qDebug() << "example1 promise failed.." << value; });
}
PromiseExample2::PromiseExample2(QObject* parent) : QObject(parent), m_success(false) PromiseExample2::PromiseExample2(QObject *parent)
{ : QObject(parent)
, m_success(false)
{
Promise* p = new Promise( Promise* p = new Promise(
[](ResultFunction, ResultFunction) { [](ResultFunction, ResultFunction) {
@@ -69,25 +84,32 @@ PromiseExample2::PromiseExample2(QObject* parent) : QObject(parent), m_success(f
p->setTimeout(1000); p->setTimeout(1000);
p->resolved([](const QVariant&) { QFAIL("This test case's promise should never resolve"); }); p->resolved([](const QVariant &) { QFAIL("This test case's promise should never resolve"); });
p->rejected([this](const QVariant& val) { p->rejected(
[this](const QVariant &val)
{
QVERIFY2(val == QStringLiteral("timeout"), "Promise didn't reject with string \"timeout\""); QVERIFY2(val == QStringLiteral("timeout"), "Promise didn't reject with string \"timeout\"");
qDebug() << "Promise rejected as expected"; qDebug() << "Promise rejected as expected";
m_success = true; m_success = true;
}); });
} }
PromiseExample3::PromiseExample3(QObject* parent) : QObject(parent), m_success(true), m_alreadyRejected(false) PromiseExample3::PromiseExample3(QObject *parent)
{ : QObject(parent)
, m_success(true)
, m_alreadyRejected(false)
{
Promise* p = new Promise([](ResultFunction, ResultFunction reject) { reject(QString()); }, this); Promise *p = new Promise([](ResultFunction, ResultFunction reject) { reject(QString()); }, this);
p->setTimeout(1000); p->setTimeout(1000);
p->resolved([](const QVariant&) { QFAIL("This test case's promise should never resolve"); }); p->resolved([](const QVariant &) { QFAIL("This test case's promise should never resolve"); });
p->rejected([this](const QVariant& val) { p->rejected(
[this](const QVariant &val)
{
qDebug() << "rejected with val" << val; qDebug() << "rejected with val" << val;
QVERIFY2(val == QString(), "Promise didn't reject with an expected empty string."); QVERIFY2(val == QString(), "Promise didn't reject with an expected empty string.");
QVERIFY2(!m_alreadyRejected, "Promise rejected more than once"); QVERIFY2(!m_alreadyRejected, "Promise rejected more than once");
@@ -95,6 +117,6 @@ PromiseExample3::PromiseExample3(QObject* parent) : QObject(parent), m_success(t
m_alreadyRejected = true; m_alreadyRejected = true;
qDebug() << "Promise rejected as expected"; qDebug() << "Promise rejected as expected";
}); });
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -5,8 +5,8 @@
namespace LtsUtils namespace LtsUtils
{ {
class PromiseExample1_Class : public QObject class PromiseExample1_Class : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
using QObject::QObject; using QObject::QObject;
@@ -17,52 +17,43 @@ class PromiseExample1_Class : public QObject
signals: signals:
void signalDone1(bool didThisWork); void signalDone1(bool didThisWork);
void signalDone2(bool didThisWork, int someNumberThatReturns); void signalDone2(bool didThisWork, int someNumberThatReturns);
}; };
class PromiseExample1 : public QObject class PromiseExample1 : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PromiseExample1(QObject* parent = nullptr); explicit PromiseExample1(QObject *parent = nullptr);
[[nodiscard]] bool isSuccess() const [[nodiscard]] bool isSuccess() const { return m_success; }
{
return m_success;
}
private: private:
bool m_success; bool m_success;
}; };
class PromiseExample2 : public QObject class PromiseExample2 : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PromiseExample2(QObject* parent = nullptr); explicit PromiseExample2(QObject *parent = nullptr);
[[nodiscard]] bool isSuccess() const [[nodiscard]] bool isSuccess() const { return m_success; }
{
return m_success;
}
private: private:
bool m_success; bool m_success;
}; };
class PromiseExample3 : public QObject class PromiseExample3 : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PromiseExample3(QObject* parent = nullptr); explicit PromiseExample3(QObject *parent = nullptr);
[[nodiscard]] bool isSuccess() const [[nodiscard]] bool isSuccess() const { return m_success; }
{
return m_success;
}
private: private:
bool m_success; bool m_success;
bool m_alreadyRejected; bool m_alreadyRejected;
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -8,8 +8,8 @@
namespace LtsUtils namespace LtsUtils
{ {
template <typename T> void inline set8Byte(const T in, QByteArray& out) template <typename T> void inline set8Byte(const T in, QByteArray &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
out += (in & 0xFF00000000000000UL) >> 56; out += (in & 0xFF00000000000000UL) >> 56;
out += (in & 0x00FF000000000000UL) >> 48; out += (in & 0x00FF000000000000UL) >> 48;
@@ -19,21 +19,22 @@ template <typename T> void inline set8Byte(const T in, QByteArray& out)
out += (in & 0x0000000000FF0000UL) >> 16; out += (in & 0x0000000000FF0000UL) >> 16;
out += (in & 0x000000000000FF00UL) >> 8; out += (in & 0x000000000000FF00UL) >> 8;
out += (in & 0x00000000000000FFUL); out += (in & 0x00000000000000FFUL);
} }
template <> void inline set8Byte(const double in, QByteArray& out) template <> void inline set8Byte(const double in, QByteArray &out)
{ {
union hack { union hack
{
double d; double d;
int64_t i; int64_t i;
} h; } h;
h.d = in; h.d = in;
set8Byte(h.i, out); set8Byte(h.i, out);
} }
template <typename T> bool inline get8Byte(const QByteArray& baData, size_t& pos, T& out) template <typename T> bool inline get8Byte(const QByteArray &baData, size_t &pos, T &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
static_assert(sizeof(T) >= 8, "sizeof(out) is smaller than 8 bytes - will not fit"); static_assert(sizeof(T) >= 8, "sizeof(out) is smaller than 8 bytes - will not fit");
out = T(); out = T();
@@ -41,7 +42,7 @@ template <typename T> bool inline get8Byte(const QByteArray& baData, size_t& pos
if (size_t(baData.size()) < pos + 8) if (size_t(baData.size()) < pos + 8)
return false; return false;
const char* data = baData.data() + pos; const char *data = baData.data() + pos;
if (std::numeric_limits<T>::is_signed) if (std::numeric_limits<T>::is_signed)
out |= static_cast<signed long long>(data[0]) << 56; out |= static_cast<signed long long>(data[0]) << 56;
@@ -58,13 +59,14 @@ template <typename T> bool inline get8Byte(const QByteArray& baData, size_t& pos
pos += 8; pos += 8;
return true; return true;
} }
template <> bool inline get8Byte(const QByteArray& baData, size_t& pos, double& out) template <> bool inline get8Byte(const QByteArray &baData, size_t &pos, double &out)
{ {
out = 0.; out = 0.;
union hack { union hack
{
double d; double d;
int64_t i; int64_t i;
} h; } h;
@@ -73,31 +75,31 @@ template <> bool inline get8Byte(const QByteArray& baData, size_t& pos, double&
return false; return false;
out = h.d; out = h.d;
return true; return true;
} }
template <typename T> bool inline get8Byte(const QByteArray& data, T& out) template <typename T> bool inline get8Byte(const QByteArray &data, T &out)
{ {
size_t pos = 0; size_t pos = 0;
return get8Byte(data, pos, out); return get8Byte(data, pos, out);
} }
template <typename T> void inline set4Byte(const T in, QByteArray& out) template <typename T> void inline set4Byte(const T in, QByteArray &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
out += (in & 0xFF000000) >> 24; out += (in & 0xFF000000) >> 24;
out += (in & 0x00FF0000) >> 16; out += (in & 0x00FF0000) >> 16;
out += (in & 0x0000FF00) >> 8; out += (in & 0x0000FF00) >> 8;
out += (in & 0x000000FF); out += (in & 0x000000FF);
} }
template <> void inline set4Byte(const double in, QByteArray& out) template <> void inline set4Byte(const double in, QByteArray &out)
{ {
int tmp = qRound(in); int tmp = qRound(in);
return set4Byte(tmp, out); return set4Byte(tmp, out);
} }
template <typename T> bool inline get4Byte(const QByteArray& baData, size_t& pos, T& out) template <typename T> bool inline get4Byte(const QByteArray &baData, size_t &pos, T &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
static_assert(sizeof(T) >= 4, "sizeof(out) is smaller than 4 bytes - will not fit"); static_assert(sizeof(T) >= 4, "sizeof(out) is smaller than 4 bytes - will not fit");
out = T(); out = T();
@@ -105,7 +107,7 @@ template <typename T> bool inline get4Byte(const QByteArray& baData, size_t& pos
if (size_t(baData.size()) < pos + 4) if (size_t(baData.size()) < pos + 4)
return false; return false;
const char* data = baData.data() + pos; const char *data = baData.data() + pos;
if (std::numeric_limits<T>::is_signed) if (std::numeric_limits<T>::is_signed)
out |= data[0] << 24; out |= data[0] << 24;
@@ -118,34 +120,34 @@ template <typename T> bool inline get4Byte(const QByteArray& baData, size_t& pos
pos += 4; pos += 4;
return true; return true;
} }
template <> bool inline get4Byte(const QByteArray& baData, size_t& pos, double& out) template <> bool inline get4Byte(const QByteArray &baData, size_t &pos, double &out)
{ {
out = 0.; out = 0.;
int tmp; int tmp;
if (!get4Byte(baData, pos, tmp)) if (!get4Byte(baData, pos, tmp))
return false; return false;
out = tmp; out = tmp;
return true; return true;
} }
template <typename T> bool inline get4Byte(const QByteArray& data, T& out) template <typename T> bool inline get4Byte(const QByteArray &data, T &out)
{ {
size_t pos = 0; size_t pos = 0;
return get4Byte(data, pos, out); return get4Byte(data, pos, out);
} }
template <typename T> void inline set3Byte(const T in, QByteArray& out) template <typename T> void inline set3Byte(const T in, QByteArray &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
out += (in & 0x00FF0000) >> 16; out += (in & 0x00FF0000) >> 16;
out += (in & 0x0000FF00) >> 8; out += (in & 0x0000FF00) >> 8;
out += (in & 0x000000FF); out += (in & 0x000000FF);
} }
template <typename T> bool inline get3Byte(const QByteArray& baData, size_t& pos, T& out) template <typename T> bool inline get3Byte(const QByteArray &baData, size_t &pos, T &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
static_assert(sizeof(T) >= 3, "sizeof(out) is smaller than 3 bytes - will not fit"); static_assert(sizeof(T) >= 3, "sizeof(out) is smaller than 3 bytes - will not fit");
out = T(); out = T();
@@ -153,7 +155,7 @@ template <typename T> bool inline get3Byte(const QByteArray& baData, size_t& pos
if (size_t(baData.size()) < pos + 3) if (size_t(baData.size()) < pos + 3)
return false; return false;
const char* data = baData.data() + pos; const char *data = baData.data() + pos;
if (std::numeric_limits<T>::is_signed) if (std::numeric_limits<T>::is_signed)
out |= data[0] << 16; out |= data[0] << 16;
@@ -165,23 +167,23 @@ template <typename T> bool inline get3Byte(const QByteArray& baData, size_t& pos
pos += 3; pos += 3;
return true; return true;
} }
template <typename T> bool inline get3Byte(const QByteArray& data, T& out) template <typename T> bool inline get3Byte(const QByteArray &data, T &out)
{ {
size_t pos = 0; size_t pos = 0;
return get3Byte(data, pos, out); return get3Byte(data, pos, out);
} }
template <typename T> void inline set2Byte(const T in, QByteArray& out) template <typename T> void inline set2Byte(const T in, QByteArray &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
out += (in & 0x0000FF00) >> 8; out += (in & 0x0000FF00) >> 8;
out += (in & 0x000000FF); out += (in & 0x000000FF);
} }
template <typename T> bool inline get2Byte(const QByteArray& baData, size_t& pos, T& out) template <typename T> bool inline get2Byte(const QByteArray &baData, size_t &pos, T &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
static_assert(sizeof(T) >= 2, "sizeof(out) is smaller than 2 bytes - will not fit"); static_assert(sizeof(T) >= 2, "sizeof(out) is smaller than 2 bytes - will not fit");
out = T(); out = T();
@@ -189,7 +191,7 @@ template <typename T> bool inline get2Byte(const QByteArray& baData, size_t& pos
if (size_t(baData.size()) < pos + 2) if (size_t(baData.size()) < pos + 2)
return false; return false;
const char* data = baData.data() + pos; const char *data = baData.data() + pos;
if (std::numeric_limits<T>::is_signed) if (std::numeric_limits<T>::is_signed)
out |= data[0] << 8; out |= data[0] << 8;
@@ -200,23 +202,23 @@ template <typename T> bool inline get2Byte(const QByteArray& baData, size_t& pos
pos += 2; pos += 2;
return true; return true;
} }
template <typename T> bool inline get2Byte(const QByteArray& data, T& out) template <typename T> bool inline get2Byte(const QByteArray &data, T &out)
{ {
size_t pos = 0; size_t pos = 0;
return get2Byte(data, pos, out); return get2Byte(data, pos, out);
} }
template <typename T> void inline set1Byte(const T in, QByteArray& out) template <typename T> void inline set1Byte(const T in, QByteArray &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
unsigned char c = static_cast<unsigned char>(in); unsigned char c = static_cast<unsigned char>(in);
out += c; out += c;
} }
template <typename T> bool inline get1Byte(const QByteArray& baData, size_t& pos, T& out) template <typename T> bool inline get1Byte(const QByteArray &baData, size_t &pos, T &out)
{ {
static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd"); static_assert(std::is_integral_v<T> || std::is_enum_v<T>, "Only integrals allowed for raw byte accessd");
out = T(); out = T();
@@ -231,11 +233,11 @@ template <typename T> bool inline get1Byte(const QByteArray& baData, size_t& pos
pos += 1; pos += 1;
return true; return true;
} }
template <typename T> bool inline get1Byte(const QByteArray& data, T& out) template <typename T> bool inline get1Byte(const QByteArray &data, T &out)
{ {
size_t pos = 0; size_t pos = 0;
return get1Byte(data, pos, out); return get1Byte(data, pos, out);
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -5,51 +5,54 @@
namespace LtsUtils namespace LtsUtils
{ {
QPlane3D::QPlane3D(const QPoint3D& pos, const QPoint3D& vec1, const QPoint3D& vec2) QPlane3D::QPlane3D(const QPoint3D &pos, const QPoint3D &vec1, const QPoint3D &vec2)
: m_pos(pos), m_vec1(vec1), m_vec2(vec2) : m_pos(pos)
{ , m_vec1(vec1)
, m_vec2(vec2)
{
m_normal = QPoint3D::crossProduct(m_vec1, m_vec2); m_normal = QPoint3D::crossProduct(m_vec1, m_vec2);
m_planeC = QPoint3D::dotProduct(m_pos, m_normal); m_planeC = QPoint3D::dotProduct(m_pos, m_normal);
} }
QPoint3D QPlane3D::intersection(const QPoint3D& point, const QPoint3D& direction) const QPoint3D QPlane3D::intersection(const QPoint3D &point, const QPoint3D &direction) const
{ {
const double dotProduct = QPoint3D::dotProduct(direction, m_normal); const double dotProduct = QPoint3D::dotProduct(direction, m_normal);
if (qFuzzyIsNull(dotProduct)) if (qFuzzyIsNull(dotProduct))
return inPlane(point) ? point : QPoint3D(); return inPlane(point) ? point : QPoint3D();
const double distance = distanceTo(point) / std::abs(dotProduct); const double distance = distanceTo(point) / std::abs(dotProduct);
return point + distance * direction; return point + distance * direction;
} }
bool QPlane3D::intersects(const QPoint3D& direction) const bool QPlane3D::intersects(const QPoint3D &direction) const
{ {
return !isParallel(direction); return !isParallel(direction);
} }
bool QPlane3D::isParallel(const QPoint3D& direction) const bool QPlane3D::isParallel(const QPoint3D &direction) const
{ {
return qFuzzyIsNull(QPoint3D::dotProduct(m_normal, direction)); return qFuzzyIsNull(QPoint3D::dotProduct(m_normal, direction));
} }
bool QPlane3D::inPlane(const QPoint3D& point) const bool QPlane3D::inPlane(const QPoint3D &point) const
{ {
if (point == m_pos) if (point == m_pos)
return true; return true;
return qFuzzyIsNull(QPoint3D::dotProduct(m_normal, point - m_pos)); return qFuzzyIsNull(QPoint3D::dotProduct(m_normal, point - m_pos));
} }
double QPlane3D::distanceTo(const QPoint3D& point) const double QPlane3D::distanceTo(const QPoint3D &point) const
{ {
return QPoint3D::dotProduct(point - m_pos, m_normal); return QPoint3D::dotProduct(point - m_pos, m_normal);
} }
QPolygon3D::QPolygon3D(const QVector<QPoint3D>& vertices) QPolygon3D::QPolygon3D(const QVector<QPoint3D> &vertices)
: QPlane3D(vertices[0], vertices[1], vertices[2]), m_vertices(vertices) : QPlane3D(vertices[0], vertices[1], vertices[2])
{ , m_vertices(vertices)
} {
}
bool QPolygon3D::containsPoint(const QPoint3D& point) const bool QPolygon3D::containsPoint(const QPoint3D &point) const
{ {
if (!inPlane(point)) if (!inPlane(point))
return false; return false;
@@ -61,13 +64,13 @@ bool QPolygon3D::containsPoint(const QPoint3D& point) const
const int numberOfVertices = m_vertices.size(); const int numberOfVertices = m_vertices.size();
for (int i = 0; i < m_vertices.size(); ++i) for (int i = 0; i < m_vertices.size(); ++i)
{ {
const QPoint3D& first = m_vertices[i % numberOfVertices] - point; const QPoint3D &first = m_vertices[i % numberOfVertices] - point;
const QPoint3D& second = m_vertices[(i + 1) % numberOfVertices] - point; const QPoint3D &second = m_vertices[(i + 1) % numberOfVertices] - point;
cosTheta = QPoint3D::dotProduct(first, second) / (first.length() * second.length()); cosTheta = QPoint3D::dotProduct(first, second) / (first.length() * second.length());
angleSum += acos(cosTheta); angleSum += acos(cosTheta);
} }
return qFuzzyIsNull(M_2_PI - angleSum); return qFuzzyIsNull(M_2_PI - angleSum);
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -11,42 +11,27 @@
namespace LtsUtils namespace LtsUtils
{ {
class LTSUTILSCORE_EXPORT QPlane3D class LTSUTILSCORE_EXPORT QPlane3D
{ {
public: public:
QPlane3D(const QPoint3D& pos, const QPoint3D& vec1, const QPoint3D& vec2); QPlane3D(const QPoint3D &pos, const QPoint3D &vec1, const QPoint3D &vec2);
QPoint3D intersection(const QPoint3D& point, const QPoint3D& direction) const; QPoint3D intersection(const QPoint3D &point, const QPoint3D &direction) const;
bool intersects(const QPoint3D& direction) const; bool intersects(const QPoint3D &direction) const;
bool isParallel(const QPoint3D& direction) const; bool isParallel(const QPoint3D &direction) const;
bool inPlane(const QPoint3D& point) const; bool inPlane(const QPoint3D &point) const;
double distanceTo(const QPoint3D& point) const; double distanceTo(const QPoint3D &point) const;
const QPoint3D& pos() const const QPoint3D &pos() const { return m_pos; }
{
return m_pos;
}
const QPoint3D& vec1() const const QPoint3D &vec1() const { return m_vec1; }
{
return m_vec1;
}
const QPoint3D& vec2() const const QPoint3D &vec2() const { return m_vec2; }
{
return m_vec2;
}
const QPoint3D& normal() const const QPoint3D &normal() const { return m_normal; }
{
return m_normal;
}
double planeC() const double planeC() const { return m_planeC; }
{
return m_planeC;
}
protected: protected:
QPoint3D m_pos; QPoint3D m_pos;
@@ -54,23 +39,20 @@ class LTSUTILSCORE_EXPORT QPlane3D
QPoint3D m_vec2; QPoint3D m_vec2;
QPoint3D m_normal; QPoint3D m_normal;
double m_planeC; double m_planeC;
}; };
class LTSUTILSCORE_EXPORT QPolygon3D : public QPlane3D class LTSUTILSCORE_EXPORT QPolygon3D : public QPlane3D
{ {
public: public:
QPolygon3D(const QVector<QPoint3D>& vertices); QPolygon3D(const QVector<QPoint3D> &vertices);
bool contains(const QPoint3D& point) const bool contains(const QPoint3D &point) const { return m_vertices.contains(point); }
{
return m_vertices.contains(point);
}
bool containsPoint(const QPoint3D& point) const; bool containsPoint(const QPoint3D &point) const;
private: private:
QVector<QPoint3D> m_vertices; QVector<QPoint3D> m_vertices;
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -7,14 +7,14 @@
namespace LtsUtils namespace LtsUtils
{ {
QDataStream& operator<<(QDataStream& s, const QPoint3D& p) QDataStream &operator<<(QDataStream &s, const QPoint3D &p)
{ {
s << p.x() << p.y() << p.z(); s << p.x() << p.y() << p.z();
return s; return s;
} }
QDataStream& operator>>(QDataStream& s, QPoint3D& p) QDataStream &operator>>(QDataStream &s, QPoint3D &p)
{ {
double x, y, z; double x, y, z;
s >> x; s >> x;
p.rx() = x; p.rx() = x;
@@ -23,6 +23,6 @@ QDataStream& operator>>(QDataStream& s, QPoint3D& p)
s >> z; s >> z;
p.rz() = z; p.rz() = z;
return s; return s;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -13,15 +13,24 @@
namespace LtsUtils namespace LtsUtils
{ {
class QPoint3D class QPoint3D
{ {
public: public:
enum class Axis { X, Y, Z }; enum class Axis
{
X,
Y,
Z
};
constexpr QPoint3D() = default; constexpr QPoint3D() = default;
constexpr QPoint3D(double xpos, double ypos, double zpos); constexpr QPoint3D(double xpos, double ypos, double zpos);
template <typename T> explicit QPoint3D(const T& data) : xp(data.offsetX()), yp(data.offsetY()), zp(data.offsetZ()) template <typename T>
explicit QPoint3D(const T &data)
: xp(data.offsetX())
, yp(data.offsetY())
, zp(data.offsetZ())
{ {
} }
@@ -34,26 +43,17 @@ class QPoint3D
constexpr inline void setY(double ypos); constexpr inline void setY(double ypos);
constexpr inline void setZ(double zpos); constexpr inline void setZ(double zpos);
constexpr inline double& rx(); constexpr inline double &rx();
constexpr inline double& ry(); constexpr inline double &ry();
constexpr inline double& rz(); constexpr inline double &rz();
constexpr inline QPointF toPointF() const; constexpr inline QPointF toPointF() const;
static QPoint3D fromQPointF(const QPointF& p) static QPoint3D fromQPointF(const QPointF &p) { return QPoint3D(p.x(), p.y(), .0); }
{
return QPoint3D(p.x(), p.y(), .0);
}
inline double lengthSquared() const inline double lengthSquared() const { return (xp * xp) + (yp * yp) + (zp * zp); }
{
return (xp * xp) + (yp * yp) + (zp * zp);
}
inline double length() const inline double length() const { return std::sqrt(lengthSquared()); }
{
return std::sqrt(lengthSquared());
}
inline void normalize() inline void normalize()
{ {
@@ -79,27 +79,30 @@ class QPoint3D
return QPoint3D(*this); return QPoint3D(*this);
} }
inline void rotate(const double& phi, const Axis& axis) inline void rotate(const double &phi, const Axis &axis)
{ {
const double sin = std::sin(phi); const double sin = std::sin(phi);
const double cos = std::cos(phi); const double cos = std::cos(phi);
switch (axis) switch (axis)
{ {
case Axis::X: { case Axis::X:
{
const double _yp = (cos * yp) - (sin * zp); const double _yp = (cos * yp) - (sin * zp);
const double _zp = (sin * yp) + (cos * zp); const double _zp = (sin * yp) + (cos * zp);
yp = _yp; yp = _yp;
zp = _zp; zp = _zp;
break; break;
} }
case Axis::Y: { case Axis::Y:
{
const double _xp = (cos * xp) + (sin * zp); const double _xp = (cos * xp) + (sin * zp);
const double _zp = (-sin * xp) + (cos * zp); const double _zp = (-sin * xp) + (cos * zp);
xp = _xp; xp = _xp;
zp = _zp; zp = _zp;
break; break;
} }
case Axis::Z: { case Axis::Z:
{
const double _xp = (cos * xp) - (sin * yp); const double _xp = (cos * xp) - (sin * yp);
const double _yp = (sin * xp) + (cos * yp); const double _yp = (sin * xp) + (cos * yp);
xp = _xp; xp = _xp;
@@ -109,63 +112,42 @@ class QPoint3D
} }
} }
inline QPoint3D rotated(const double& phi, const Axis& axis) const inline QPoint3D rotated(const double &phi, const Axis &axis) const
{ {
QPoint3D p(*this); QPoint3D p(*this);
p.rotate(phi, axis); p.rotate(phi, axis);
return p; return p;
} }
inline double distanceToLine(const QPoint3D& point, const QPoint3D& direction) const inline double distanceToLine(const QPoint3D &point, const QPoint3D &direction) const
{ {
if (direction.isNull()) if (direction.isNull())
return (*this - point).length(); return (*this - point).length();
QPoint3D p = point + dotProduct(*this - point, direction) * direction; QPoint3D p = point + dotProduct(*this - point, direction) * direction;
return (*this - p).length(); return (*this - p).length();
} }
inline double distanceToPlane(const QPoint3D& plane, const QPoint3D& normal) const inline double distanceToPlane(const QPoint3D &plane, const QPoint3D &normal) const { return dotProduct(*this - plane, normal); }
{ inline double distanceToPlane(const QPoint3D &plane1, const QPoint3D &plane2, const QPoint3D &plane3) const
return dotProduct(*this - plane, normal);
}
inline double distanceToPlane(const QPoint3D& plane1, const QPoint3D& plane2, const QPoint3D& plane3) const
{ {
QPoint3D n = normal(plane2 - plane1, plane3 - plane1); QPoint3D n = normal(plane2 - plane1, plane3 - plane1);
return dotProduct(*this - plane1, n); return dotProduct(*this - plane1, n);
} }
inline double distanceToPoint(const QPoint3D& point) const inline double distanceToPoint(const QPoint3D &point) const { return (*this - point).length(); }
{
return (*this - point).length();
}
friend constexpr inline bool operator==(const QPoint3D& p1, const QPoint3D& p2); friend constexpr inline bool operator==(const QPoint3D &p1, const QPoint3D &p2);
friend constexpr inline bool operator!=(const QPoint3D& p1, const QPoint3D& p2); friend constexpr inline bool operator!=(const QPoint3D &p1, const QPoint3D &p2);
friend constexpr inline QPoint3D operator+(const QPoint3D& p1, const QPoint3D& p2) friend constexpr inline QPoint3D operator+(const QPoint3D &p1, const QPoint3D &p2) { return QPoint3D(p1.xp + p2.xp, p1.yp + p2.yp, p1.zp + p2.zp); }
{
return QPoint3D(p1.xp + p2.xp, p1.yp + p2.yp, p1.zp + p2.zp);
}
friend constexpr inline QPoint3D operator-(const QPoint3D& p1, const QPoint3D& p2) friend constexpr inline QPoint3D operator-(const QPoint3D &p1, const QPoint3D &p2) { return QPoint3D(p1.xp - p2.xp, p1.yp - p2.yp, p1.zp - p2.zp); }
{
return QPoint3D(p1.xp - p2.xp, p1.yp - p2.yp, p1.zp - p2.zp);
}
friend constexpr inline QPoint3D operator*(const QPoint3D& p1, double factor) friend constexpr inline QPoint3D operator*(const QPoint3D &p1, double factor) { return QPoint3D(p1.xp * factor, p1.yp * factor, p1.zp * factor); }
{
return QPoint3D(p1.xp * factor, p1.yp * factor, p1.zp * factor);
}
friend constexpr inline QPoint3D operator*(double factor, const QPoint3D& p1) friend constexpr inline QPoint3D operator*(double factor, const QPoint3D &p1) { return QPoint3D(p1.xp * factor, p1.yp * factor, p1.zp * factor); }
{
return QPoint3D(p1.xp * factor, p1.yp * factor, p1.zp * factor);
}
friend constexpr inline QPoint3D operator/(const QPoint3D& p1, double factor) friend constexpr inline QPoint3D operator/(const QPoint3D &p1, double factor) { return QPoint3D(p1.xp / factor, p1.yp / factor, p1.zp / factor); }
{
return QPoint3D(p1.xp / factor, p1.yp / factor, p1.zp / factor);
}
constexpr inline QPoint3D& operator+=(const QPoint3D& o) constexpr inline QPoint3D &operator+=(const QPoint3D &o)
{ {
xp += o.xp; xp += o.xp;
yp += o.yp; yp += o.yp;
@@ -173,7 +155,7 @@ class QPoint3D
return *this; return *this;
} }
constexpr inline QPoint3D& operator-=(const QPoint3D& o) constexpr inline QPoint3D &operator-=(const QPoint3D &o)
{ {
xp -= o.xp; xp -= o.xp;
yp -= o.yp; yp -= o.yp;
@@ -181,7 +163,7 @@ class QPoint3D
return *this; return *this;
} }
constexpr inline QPoint3D& operator*=(double factor) constexpr inline QPoint3D &operator*=(double factor)
{ {
xp *= factor; xp *= factor;
yp *= factor; yp *= factor;
@@ -189,7 +171,7 @@ class QPoint3D
return *this; return *this;
} }
constexpr inline QPoint3D& operator/=(double divisor) constexpr inline QPoint3D &operator/=(double divisor)
{ {
xp /= divisor; xp /= divisor;
yp /= divisor; yp /= divisor;
@@ -197,27 +179,18 @@ class QPoint3D
return *this; return *this;
} }
constexpr static inline double dotProduct(const QPoint3D& v1, const QPoint3D& v2) constexpr static inline double dotProduct(const QPoint3D &v1, const QPoint3D &v2) { return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp; }
{
return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp;
}
constexpr static inline QPoint3D crossProduct(const QPoint3D& v1, const QPoint3D& v2) constexpr static inline QPoint3D crossProduct(const QPoint3D &v1, const QPoint3D &v2)
{ {
return QPoint3D(v1.yp * v2.zp - v1.zp * v2.yp, v1.zp * v2.xp - v1.xp * v2.zp, v1.xp * v2.yp - v1.yp * v2.xp); return QPoint3D(v1.yp * v2.zp - v1.zp * v2.yp, v1.zp * v2.xp - v1.xp * v2.zp, v1.xp * v2.yp - v1.yp * v2.xp);
} }
static inline QPoint3D normal(const QPoint3D& v1, const QPoint3D& v2) static inline QPoint3D normal(const QPoint3D &v1, const QPoint3D &v2) { return crossProduct(v1, v2).normalized(); }
{
return crossProduct(v1, v2).normalized();
}
static inline QPoint3D normal(const QPoint3D& v1, const QPoint3D& v2, const QPoint3D& v3) static inline QPoint3D normal(const QPoint3D &v1, const QPoint3D &v2, const QPoint3D &v3) { return crossProduct((v2 - v1), (v3 - v1)).normalized(); }
{
return crossProduct((v2 - v1), (v3 - v1)).normalized();
}
friend inline bool qFuzzyCompare(const QPoint3D& v1, const QPoint3D& v2) friend inline bool qFuzzyCompare(const QPoint3D &v1, const QPoint3D &v2)
{ {
return ::qFuzzyCompare(v1.xp, v2.xp) && ::qFuzzyCompare(v1.yp, v2.yp) && ::qFuzzyCompare(v1.zp, v2.zp); return ::qFuzzyCompare(v1.xp, v2.xp) && ::qFuzzyCompare(v1.yp, v2.yp) && ::qFuzzyCompare(v1.zp, v2.zp);
} }
@@ -226,83 +199,88 @@ class QPoint3D
double xp = 0; double xp = 0;
double yp = 0; double yp = 0;
double zp = 0; double zp = 0;
}; };
// QDataStream& operator<<(QDataStream& s, const QPoint3D& p); // QDataStream& operator<<(QDataStream& s, const QPoint3D& p);
// QDataStream& operator>>(QDataStream& s, QPoint3D& p); // QDataStream& operator>>(QDataStream& s, QPoint3D& p);
constexpr inline QPoint3D::QPoint3D(double xpos, double ypos, double zpos) : xp(xpos), yp(ypos), zp(zpos) {} constexpr inline QPoint3D::QPoint3D(double xpos, double ypos, double zpos)
: xp(xpos)
, yp(ypos)
, zp(zpos)
{
}
inline bool QPoint3D::isNull() const inline bool QPoint3D::isNull() const
{ {
return qIsNull(xp) && qIsNull(yp) && qIsNull(zp); return qIsNull(xp) && qIsNull(yp) && qIsNull(zp);
} }
constexpr inline double QPoint3D::x() const constexpr inline double QPoint3D::x() const
{ {
return xp; return xp;
} }
constexpr inline double QPoint3D::y() const constexpr inline double QPoint3D::y() const
{ {
return yp; return yp;
} }
constexpr inline double QPoint3D::z() const constexpr inline double QPoint3D::z() const
{ {
return zp; return zp;
} }
constexpr inline void QPoint3D::setX(double xpos) constexpr inline void QPoint3D::setX(double xpos)
{ {
xp = xpos; xp = xpos;
} }
constexpr inline void QPoint3D::setY(double ypos) constexpr inline void QPoint3D::setY(double ypos)
{ {
yp = ypos; yp = ypos;
} }
constexpr inline void QPoint3D::setZ(double zpos) constexpr inline void QPoint3D::setZ(double zpos)
{ {
zp = zpos; zp = zpos;
} }
constexpr inline double& QPoint3D::rx() constexpr inline double &QPoint3D::rx()
{ {
return xp; return xp;
} }
constexpr inline double& QPoint3D::ry() constexpr inline double &QPoint3D::ry()
{ {
return yp; return yp;
} }
constexpr inline double& QPoint3D::rz() constexpr inline double &QPoint3D::rz()
{ {
return zp; return zp;
} }
constexpr inline QPointF QPoint3D::toPointF() const constexpr inline QPointF QPoint3D::toPointF() const
{ {
return QPointF(xp, yp); return QPointF(xp, yp);
} }
constexpr inline bool operator==(const QPoint3D& p1, const QPoint3D& p2) constexpr inline bool operator==(const QPoint3D &p1, const QPoint3D &p2)
{ {
return p1.xp == p2.xp && p1.yp == p2.yp && p1.zp == p2.zp; return p1.xp == p2.xp && p1.yp == p2.yp && p1.zp == p2.zp;
} }
constexpr inline bool operator!=(const QPoint3D& p1, const QPoint3D& p2) constexpr inline bool operator!=(const QPoint3D &p1, const QPoint3D &p2)
{ {
return p1.xp != p2.xp || p1.yp != p2.yp || p1.zp != p2.zp; return p1.xp != p2.xp || p1.yp != p2.yp || p1.zp != p2.zp;
} }
inline std::ostream& operator<<(std::ostream& stream, const QPoint3D& pos) inline std::ostream &operator<<(std::ostream &stream, const QPoint3D &pos)
{ {
stream << "(" << pos.x() << "," << pos.y() << "," << pos.z() << ")"; stream << "(" << pos.x() << "," << pos.y() << "," << pos.z() << ")";
return stream; return stream;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -7,15 +7,16 @@
namespace LtsUtils namespace LtsUtils
{ {
ScopedConnection::ScopedConnection(IConnection* connection, Qt::ConnectionType connType) : m_conn(connection) ScopedConnection::ScopedConnection(IConnection *connection, Qt::ConnectionType connType)
{ : m_conn(connection)
{
Q_ASSERT(connection); Q_ASSERT(connection);
m_conn->connect(connType); m_conn->connect(connType);
} }
ScopedConnection::~ScopedConnection() ScopedConnection::~ScopedConnection()
{ {
m_conn->disconnect(); m_conn->disconnect();
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -9,16 +9,16 @@
namespace LtsUtils namespace LtsUtils
{ {
class IConnection; class IConnection;
class LTSUTILSCORE_EXPORT ScopedConnection class LTSUTILSCORE_EXPORT ScopedConnection
{ {
public: public:
explicit ScopedConnection(IConnection* connection, Qt::ConnectionType = Qt::AutoConnection); explicit ScopedConnection(IConnection *connection, Qt::ConnectionType = Qt::AutoConnection);
~ScopedConnection(); ~ScopedConnection();
private: private:
IConnection* m_conn; IConnection *m_conn;
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -5,24 +5,24 @@
namespace LtsUtils namespace LtsUtils
{ {
static constexpr unsigned char XON = 0x11; static constexpr unsigned char XON = 0x11;
static constexpr unsigned char XOFF = 0x13; static constexpr unsigned char XOFF = 0x13;
static constexpr unsigned char STX = 0x02; static constexpr unsigned char STX = 0x02;
static constexpr unsigned char ETX = 0x03; static constexpr unsigned char ETX = 0x03;
static constexpr unsigned char SUBST = 0x80; static constexpr unsigned char SUBST = 0x80;
static constexpr unsigned char SUB_XON = 0x91; static constexpr unsigned char SUB_XON = 0x91;
static constexpr unsigned char SUB_XOFF = 0x93; static constexpr unsigned char SUB_XOFF = 0x93;
static constexpr unsigned char SUB_STX = 0x82; static constexpr unsigned char SUB_STX = 0x82;
static constexpr unsigned char SUB_ETX = 0x83; static constexpr unsigned char SUB_ETX = 0x83;
static constexpr unsigned char SUB_SUBST = 0x00; static constexpr unsigned char SUB_SUBST = 0x00;
static constexpr int HEADER_SIZE = 3; static constexpr int HEADER_SIZE = 3;
static constexpr int CHECKSUM_SIZE = 1; static constexpr int CHECKSUM_SIZE = 1;
static constexpr int MINIMUM_BYTE_SIZE = 1 + HEADER_SIZE + CHECKSUM_SIZE + 1; static constexpr int MINIMUM_BYTE_SIZE = 1 + HEADER_SIZE + CHECKSUM_SIZE + 1;
static SfmMessage getSfmMessage(const QByteArray& p_data) static SfmMessage getSfmMessage(const QByteArray &p_data)
{ {
unsigned short id = 0; unsigned short id = 0;
id |= (((unsigned short)p_data[0]) & 0x7F) << 8; id |= (((unsigned short)p_data[0]) & 0x7F) << 8;
@@ -34,10 +34,10 @@ static SfmMessage getSfmMessage(const QByteArray& p_data)
msg.setPayload(p_data.right(p_data.size() - HEADER_SIZE)); msg.setPayload(p_data.right(p_data.size() - HEADER_SIZE));
return msg; return msg;
} }
static QByteArray getHeader(const SfmMessage& p_msg) static QByteArray getHeader(const SfmMessage &p_msg)
{ {
QByteArray header(2, Qt::Uninitialized); QByteArray header(2, Qt::Uninitialized);
header[0] = ((p_msg.id() >> 8) & 0x7f) | (p_msg.rtr() << 7); header[0] = ((p_msg.id() >> 8) & 0x7f) | (p_msg.rtr() << 7);
@@ -45,20 +45,20 @@ static QByteArray getHeader(const SfmMessage& p_msg)
header[1] = (p_msg.id() >> 0) & 0xff; header[1] = (p_msg.id() >> 0) & 0xff;
return header; return header;
} }
static inline char getChecksum(const QByteArray& p_data) static inline char getChecksum(const QByteArray &p_data)
{ {
char sum = 0; char sum = 0;
for (const char c : p_data) for (const char c : p_data)
sum += c; sum += c;
return sum ^ 0xff; return sum ^ 0xff;
} }
static QByteArray removeChecksum(const QByteArray& p_data) static QByteArray removeChecksum(const QByteArray &p_data)
{ {
QByteArray withoutChecksum(p_data); QByteArray withoutChecksum(p_data);
ConversionError error("Checksum error"); ConversionError error("Checksum error");
@@ -73,10 +73,10 @@ static QByteArray removeChecksum(const QByteArray& p_data)
throw error; throw error;
return withoutChecksum; return withoutChecksum;
} }
static QByteArray maskData(const QByteArray& p_data) static QByteArray maskData(const QByteArray &p_data)
{ {
QByteArray maskData; QByteArray maskData;
maskData.reserve(p_data.size() * 8 / 6); maskData.reserve(p_data.size() * 8 / 6);
@@ -111,10 +111,10 @@ static QByteArray maskData(const QByteArray& p_data)
} }
return maskData; return maskData;
} }
static bool mustBeMasked(const unsigned char byte) static bool mustBeMasked(const unsigned char byte)
{ {
switch (byte) switch (byte)
{ {
case XON: case XON:
@@ -127,10 +127,10 @@ static bool mustBeMasked(const unsigned char byte)
break; break;
} }
return false; return false;
} }
int lenMaskedData(const QByteArray& data) int lenMaskedData(const QByteArray &data)
{ {
int ret = data.length(); int ret = data.length();
const unsigned char upperLen = ((data.length() & 0xff00) >> 8); const unsigned char upperLen = ((data.length() & 0xff00) >> 8);
const unsigned char lowerLen = ((data.length() & 0x00ff) >> 0); const unsigned char lowerLen = ((data.length() & 0x00ff) >> 0);
@@ -147,10 +147,10 @@ int lenMaskedData(const QByteArray& data)
++ret; ++ret;
return ret; return ret;
} }
static QByteArray unmaskData(const QByteArray& p_data) static QByteArray unmaskData(const QByteArray &p_data)
{ {
QByteArray unmaskData; QByteArray unmaskData;
unmaskData.reserve(p_data.size()); unmaskData.reserve(p_data.size());
@@ -187,20 +187,20 @@ static QByteArray unmaskData(const QByteArray& p_data)
unmaskData.append(byte); unmaskData.append(byte);
} }
return unmaskData; return unmaskData;
} }
static QByteArray addFrame(const QByteArray& p_data) static QByteArray addFrame(const QByteArray &p_data)
{ {
QByteArray ret; QByteArray ret;
ret.reserve(2 + p_data.size()); ret.reserve(2 + p_data.size());
ret.append(STX); ret.append(STX);
ret.append(p_data); ret.append(p_data);
ret.append(ETX); ret.append(ETX);
return ret; return ret;
} }
static QByteArray removeFrame(const QByteArray& p_data) static QByteArray removeFrame(const QByteArray &p_data)
{ {
if (p_data[0] == STX && p_data[p_data.size() - 1] == ETX) if (p_data[0] == STX && p_data[p_data.size() - 1] == ETX)
{ {
@@ -209,20 +209,20 @@ static QByteArray removeFrame(const QByteArray& p_data)
} }
else else
throw ConversionError("Framing Error"); throw ConversionError("Framing Error");
} }
static void checkLength(const QByteArray& p_data) static void checkLength(const QByteArray &p_data)
{ {
if (p_data.size() < HEADER_SIZE) if (p_data.size() < HEADER_SIZE)
throw ConversionError("Telegram too short"); throw ConversionError("Telegram too short");
unsigned char length = p_data[HEADER_SIZE - 1]; unsigned char length = p_data[HEADER_SIZE - 1];
if (length != p_data.size() - HEADER_SIZE) if (length != p_data.size() - HEADER_SIZE)
throw ConversionError("Telegram length does not match"); throw ConversionError("Telegram length does not match");
} }
QByteArray byteStreamFromSfmMessage(const SfmMessage& message) QByteArray byteStreamFromSfmMessage(const SfmMessage &message)
{ {
QByteArray byteData(getHeader(message)); QByteArray byteData(getHeader(message));
byteData.append(message.payload().size()); byteData.append(message.payload().size());
@@ -230,10 +230,10 @@ QByteArray byteStreamFromSfmMessage(const SfmMessage& message)
byteData.append(getChecksum(byteData)); byteData.append(getChecksum(byteData));
return addFrame(maskData(byteData)); return addFrame(maskData(byteData));
} }
SfmMessage byteStreamToSfmMessage(const QByteArray& datastream) SfmMessage byteStreamToSfmMessage(const QByteArray &datastream)
{ {
if (datastream.size() < MINIMUM_BYTE_SIZE) if (datastream.size() < MINIMUM_BYTE_SIZE)
throw ConversionError("Can't convert an QByteArray that hasn't the minimum size!"); throw ConversionError("Can't convert an QByteArray that hasn't the minimum size!");
@@ -247,10 +247,10 @@ SfmMessage byteStreamToSfmMessage(const QByteArray& datastream)
checkLength(checkMsg); checkLength(checkMsg);
return getSfmMessage(checkMsg); return getSfmMessage(checkMsg);
} }
QByteArray byteStreamFromEscMessage(const QByteArray& message) QByteArray byteStreamFromEscMessage(const QByteArray &message)
{ {
QByteArray byteData = message; QByteArray byteData = message;
if (message.size() == 1) if (message.size() == 1)
{ {
@@ -264,10 +264,10 @@ QByteArray byteStreamFromEscMessage(const QByteArray& message)
byteData = addFrame(byteData); byteData = addFrame(byteData);
return byteData; return byteData;
} }
QByteArray byteStreamToEscMessage(const QByteArray& datastream) QByteArray byteStreamToEscMessage(const QByteArray &datastream)
{ {
if (datastream.size() < 2) if (datastream.size() < 2)
return QByteArray("ERROR"); return QByteArray("ERROR");
@@ -278,6 +278,6 @@ QByteArray byteStreamToEscMessage(const QByteArray& datastream)
checkMsg.chop(1); checkMsg.chop(1);
return checkMsg; return checkMsg;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -9,64 +9,43 @@
namespace LtsUtils namespace LtsUtils
{ {
class LTSUTILSCORE_EXPORT SfmMessage class LTSUTILSCORE_EXPORT SfmMessage
{ {
public: public:
unsigned int id() const unsigned int id() const { return m_id; }
{
return m_id;
}
void setId(unsigned int id) void setId(unsigned int id) { m_id = id; }
{
m_id = id;
}
bool rtr() const bool rtr() const { return m_rtr; }
{
return m_rtr;
}
void setRtr(bool rtr) void setRtr(bool rtr) { m_rtr = rtr; }
{
m_rtr = rtr;
}
QByteArray payload() const QByteArray payload() const { return m_payload; }
{
return m_payload;
}
void setPayload(const QByteArray& payload) void setPayload(const QByteArray &payload) { m_payload = payload; }
{
m_payload = payload;
}
bool operator==(const SfmMessage& msg) const bool operator==(const SfmMessage &msg) const { return (m_id == msg.id() && m_rtr == msg.rtr() && m_payload == msg.payload()); }
{
return (m_id == msg.id() && m_rtr == msg.rtr() && m_payload == msg.payload());
}
protected: protected:
unsigned int m_id = 0; unsigned int m_id = 0;
bool m_rtr = false; bool m_rtr = false;
QByteArray m_payload; QByteArray m_payload;
}; };
class ConversionError : public std::runtime_error class ConversionError : public std::runtime_error
{ {
public: public:
using std::runtime_error::runtime_error; using std::runtime_error::runtime_error;
}; };
LTSUTILSCORE_EXPORT QByteArray byteStreamFromSfmMessage(const SfmMessage& message); LTSUTILSCORE_EXPORT QByteArray byteStreamFromSfmMessage(const SfmMessage &message);
LTSUTILSCORE_EXPORT SfmMessage byteStreamToSfmMessage(const QByteArray& datastream); LTSUTILSCORE_EXPORT SfmMessage byteStreamToSfmMessage(const QByteArray &datastream);
LTSUTILSCORE_EXPORT QByteArray byteStreamFromEscMessage(const QByteArray& message); LTSUTILSCORE_EXPORT QByteArray byteStreamFromEscMessage(const QByteArray &message);
LTSUTILSCORE_EXPORT QByteArray byteStreamToEscMessage(const QByteArray& datastream); LTSUTILSCORE_EXPORT QByteArray byteStreamToEscMessage(const QByteArray &datastream);
LTSUTILSCORE_EXPORT int lenMaskedData(const QByteArray& data); LTSUTILSCORE_EXPORT int lenMaskedData(const QByteArray &data);
} // namespace LtsUtils } // namespace LtsUtils
@@ -7,8 +7,8 @@
namespace LtsUtils namespace LtsUtils
{ {
inline bool lessThan(const QVariant& var1, const QVariant& var2) inline bool lessThan(const QVariant &var1, const QVariant &var2)
{ {
if (var1.canConvert<QString>() && var2.canConvert<QString>()) if (var1.canConvert<QString>() && var2.canConvert<QString>())
{ {
QString str1(var1.toString()); QString str1(var1.toString());
@@ -32,6 +32,6 @@ inline bool lessThan(const QVariant& var1, const QVariant& var2)
return var1.toDouble() < var2.toDouble(); return var1.toDouble() < var2.toDouble();
return false; return false;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -8,21 +8,24 @@
namespace LtsUtils namespace LtsUtils
{ {
int ConnectingDialog::s_waitForHistoricalDataWaitTime = 10000; int ConnectingDialog::s_waitForHistoricalDataWaitTime = 10000;
void ConnectingDialog::reset() void ConnectingDialog::reset()
{ {
m_ui->label->setText(QStringLiteral("<font color='orange'>%1</font>") m_ui->label->setText(QStringLiteral("<font color='orange'>%1</font>").arg(tr("Connecting to %1 on %2 ...").arg(m_serviceName, m_exerciseName)));
.arg(tr("Connecting to %1 on %2 ...").arg(m_serviceName, m_exerciseName))); }
}
void ConnectingDialog::setup() void ConnectingDialog::setup()
{ {
m_ui = new Ui::ConnectingDialog; m_ui = new Ui::ConnectingDialog;
m_ui->setupUi(this); m_ui->setupUi(this);
reset(); reset();
setMinimumSize(sizeHint()); setMinimumSize(sizeHint());
connect(m_ui->pbRetry, &QPushButton::clicked, this, [this]() { connect(m_ui->pbRetry,
&QPushButton::clicked,
this,
[this]()
{
m_ui->pbRetry->setEnabled(false); m_ui->pbRetry->setEnabled(false);
m_ui->pbIgnore->setEnabled(false); m_ui->pbIgnore->setEnabled(false);
@@ -30,7 +33,11 @@ void ConnectingDialog::setup()
emit signalStopLoop(); emit signalStopLoop();
}); });
connect(m_ui->pbIgnore, &QPushButton::clicked, this, [this]() { connect(m_ui->pbIgnore,
&QPushButton::clicked,
this,
[this]()
{
m_ui->pbIgnore->setEnabled(false); m_ui->pbIgnore->setEnabled(false);
m_ui->pbRetry->setEnabled(false); m_ui->pbRetry->setEnabled(false);
m_ui->pbIgnore->setText(tr("continuing..")); m_ui->pbIgnore->setText(tr("continuing.."));
@@ -38,22 +45,21 @@ void ConnectingDialog::setup()
deleteLater(); deleteLater();
return; return;
}); });
} }
ConnectingDialog::~ConnectingDialog() ConnectingDialog::~ConnectingDialog()
{ {
delete m_ui; delete m_ui;
} }
void ConnectingDialog::failed() void ConnectingDialog::failed()
{ {
m_ui->label->setText(QStringLiteral("<font color='red'>%1</font>") m_ui->label->setText(QStringLiteral("<font color='red'>%1</font>").arg(tr("Could not connect to %1 on %2 !").arg(m_serviceName, m_exerciseName)));
.arg(tr("Could not connect to %1 on %2 !").arg(m_serviceName, m_exerciseName)));
m_ui->pbRetry->setEnabled(true); m_ui->pbRetry->setEnabled(true);
m_ui->pbIgnore->setEnabled(true); m_ui->pbIgnore->setEnabled(true);
raise(); raise();
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -11,24 +11,29 @@
namespace Ui namespace Ui
{ {
class ConnectingDialog; class ConnectingDialog;
} }
namespace LtsUtils namespace LtsUtils
{ {
class LTSUTILSGUICONNECTDIALOG_EXPORT ConnectingDialog : public LtsWidgets::LtsFramelessDialog class LTSUTILSGUICONNECTDIALOG_EXPORT ConnectingDialog : public LtsWidgets::LtsFramelessDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
static int s_waitForHistoricalDataWaitTime; static int s_waitForHistoricalDataWaitTime;
template <typename DtcType, typename WaitForHistoricalDataFunction> template <typename DtcType, typename WaitForHistoricalDataFunction>
explicit ConnectingDialog(DtcType dtc, WaitForHistoricalDataFunction waitForHistoricalDataFunction, explicit ConnectingDialog(DtcType dtc,
const QString& serviceName, const QString& exerciseName, QWidget* parent = nullptr) WaitForHistoricalDataFunction waitForHistoricalDataFunction,
: LtsWidgets::LtsFramelessDialog(parent, LtsWidgets::Behaviour::Modal), m_serviceName(serviceName), const QString &serviceName,
m_exerciseName(exerciseName), m_ui(nullptr) const QString &exerciseName,
QWidget *parent = nullptr)
: LtsWidgets::LtsFramelessDialog(parent, LtsWidgets::Behaviour::Modal)
, m_serviceName(serviceName)
, m_exerciseName(exerciseName)
, m_ui(nullptr)
{ {
setWindowTitle(tr("Connecting ..")); setWindowTitle(tr("Connecting .."));
setup(); setup();
@@ -61,13 +66,13 @@ class LTSUTILSGUICONNECTDIALOG_EXPORT ConnectingDialog : public LtsWidgets::LtsF
private: private:
QString m_serviceName; QString m_serviceName;
QString m_exerciseName; QString m_exerciseName;
Ui::ConnectingDialog* m_ui; Ui::ConnectingDialog *m_ui;
void reset(); void reset();
void setup(); void setup();
signals: signals:
void signalStopLoop(); void signalStopLoop();
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -12,16 +12,23 @@
namespace LtsUtils namespace LtsUtils
{ {
ConnectingDialogNT::ConnectingDialogNT(const std::function<bool(int)>& checkFn, const QString& serviceName, ConnectingDialogNT::ConnectingDialogNT(const std::function<bool(int)> &checkFn, const QString &serviceName, const QString &exerciseName, QWidget *parent)
const QString& exerciseName, QWidget* parent) : LtsWidgets::LtsFramelessDialog(parent, LtsWidgets::Behaviour::Modal)
: LtsWidgets::LtsFramelessDialog(parent, LtsWidgets::Behaviour::Modal), m_serviceName(serviceName), , m_serviceName(serviceName)
m_exerciseName(exerciseName), m_checkFn(checkFn), m_go(false), m_autoRetryTimer(new QTimer(this)), , m_exerciseName(exerciseName)
m_ui(new Ui::ConnectingDialog) , m_checkFn(checkFn)
{ , m_go(false)
, m_autoRetryTimer(new QTimer(this))
, m_ui(new Ui::ConnectingDialog)
{
m_ui->setupUi(this); m_ui->setupUi(this);
m_autoRetryTimer->setInterval(1000); m_autoRetryTimer->setInterval(1000);
connect(m_autoRetryTimer, &QTimer::timeout, this, [this]() { connect(m_autoRetryTimer,
&QTimer::timeout,
this,
[this]()
{
if (m_autoRetryTick < 1) if (m_autoRetryTick < 1)
{ {
slotRetry(); slotRetry();
@@ -36,7 +43,11 @@ ConnectingDialogNT::ConnectingDialogNT(const std::function<bool(int)>& checkFn,
setMinimumSize(sizeHint()); setMinimumSize(sizeHint());
connect(m_ui->pbRetry, &QPushButton::clicked, this, &ConnectingDialogNT::slotRetry); connect(m_ui->pbRetry, &QPushButton::clicked, this, &ConnectingDialogNT::slotRetry);
connect(m_ui->pbIgnore, &QPushButton::clicked, this, [this]() { connect(m_ui->pbIgnore,
&QPushButton::clicked,
this,
[this]()
{
m_ui->pbIgnore->setEnabled(false); m_ui->pbIgnore->setEnabled(false);
m_ui->pbRetry->setEnabled(false); m_ui->pbRetry->setEnabled(false);
m_ui->pbIgnore->setText(tr("continuing..")); m_ui->pbIgnore->setText(tr("continuing.."));
@@ -52,19 +63,19 @@ ConnectingDialogNT::ConnectingDialogNT(const std::function<bool(int)>& checkFn,
m_go = true; m_go = true;
m_ui->pbRetry->setEnabled(false); m_ui->pbRetry->setEnabled(false);
} }
int ConnectingDialogNT::random(int min, int max) int ConnectingDialogNT::random(int min, int max)
{ {
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
return QRandomGenerator::global()->bounded(min, max); return QRandomGenerator::global()->bounded(min, max);
#else #else
return (qrand() % (((max + 1) - min) + min)); return (qrand() % (((max + 1) - min) + min));
#endif #endif
} }
bool ConnectingDialogNT::event(QEvent* event) bool ConnectingDialogNT::event(QEvent *event)
{ {
bool result = LtsWidgets::LtsFramelessDialog::event(event); bool result = LtsWidgets::LtsFramelessDialog::event(event);
if (event->type() == QEvent::Paint && m_go) if (event->type() == QEvent::Paint && m_go)
@@ -74,10 +85,10 @@ bool ConnectingDialogNT::event(QEvent* event)
} }
return result; return result;
} }
void ConnectingDialogNT::slotRetry() void ConnectingDialogNT::slotRetry()
{ {
m_autoRetryTimer->stop(); m_autoRetryTimer->stop();
m_ui->pbRetry->setText(tr("Retry")); m_ui->pbRetry->setText(tr("Retry"));
@@ -86,10 +97,10 @@ void ConnectingDialogNT::slotRetry()
reset(); reset();
QTimer::singleShot(1, this, &ConnectingDialogNT::slotGo); QTimer::singleShot(1, this, &ConnectingDialogNT::slotGo);
} }
void ConnectingDialogNT::slotGo() void ConnectingDialogNT::slotGo()
{ {
if (m_checkFn(ConnectingDialog::s_waitForHistoricalDataWaitTime)) if (m_checkFn(ConnectingDialog::s_waitForHistoricalDataWaitTime))
{ {
@@ -99,23 +110,21 @@ void ConnectingDialogNT::slotGo()
} }
failed(); failed();
} }
void ConnectingDialogNT::reset() void ConnectingDialogNT::reset()
{ {
m_ui->label->setText(QStringLiteral("<font color='orange'>%1</font>") m_ui->label->setText(QStringLiteral("<font color='orange'>%1</font>").arg(tr("Connecting to %1 on %2 ...").arg(m_serviceName, m_exerciseName)));
.arg(tr("Connecting to %1 on %2 ...").arg(m_serviceName, m_exerciseName))); }
}
ConnectingDialogNT::~ConnectingDialogNT() ConnectingDialogNT::~ConnectingDialogNT()
{ {
delete m_ui; delete m_ui;
} }
void ConnectingDialogNT::failed() void ConnectingDialogNT::failed()
{ {
m_ui->label->setText(QStringLiteral("<font color='red'>%1</font>") m_ui->label->setText(QStringLiteral("<font color='red'>%1</font>").arg(tr("Could not connect to %1 on %2 !").arg(m_serviceName, m_exerciseName)));
.arg(tr("Could not connect to %1 on %2 !").arg(m_serviceName, m_exerciseName)));
m_ui->pbRetry->setEnabled(true); m_ui->pbRetry->setEnabled(true);
m_ui->pbIgnore->setEnabled(true); m_ui->pbIgnore->setEnabled(true);
@@ -124,6 +133,6 @@ void ConnectingDialogNT::failed()
m_autoRetryTimer->start(); m_autoRetryTimer->start();
raise(); raise();
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -11,19 +11,18 @@ class QTimer;
namespace Ui namespace Ui
{ {
class ConnectingDialog; class ConnectingDialog;
} }
namespace LtsUtils namespace LtsUtils
{ {
class LTSUTILSGUICONNECTDIALOG_EXPORT ConnectingDialogNT : public LtsWidgets::LtsFramelessDialog class LTSUTILSGUICONNECTDIALOG_EXPORT ConnectingDialogNT : public LtsWidgets::LtsFramelessDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ConnectingDialogNT(const std::function<bool(int)>& checkFn, const QString& serviceName, explicit ConnectingDialogNT(const std::function<bool(int)> &checkFn, const QString &serviceName, const QString &exerciseName, QWidget *parent);
const QString& exerciseName, QWidget* parent);
~ConnectingDialogNT(); ~ConnectingDialogNT();
void failed(); void failed();
@@ -43,14 +42,14 @@ class LTSUTILSGUICONNECTDIALOG_EXPORT ConnectingDialogNT : public LtsWidgets::Lt
std::function<bool(int)> m_checkFn; std::function<bool(int)> m_checkFn;
bool m_go; bool m_go;
QTimer* m_autoRetryTimer; QTimer *m_autoRetryTimer;
int m_autoRetryTick{0}; int m_autoRetryTick{0};
Ui::ConnectingDialog* m_ui; Ui::ConnectingDialog *m_ui;
int random(int min, int max); int random(int min, int max);
bool event(QEvent* event) override; bool event(QEvent *event) override;
void reset(); void reset();
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -13,8 +13,8 @@
namespace LtsUtils namespace LtsUtils
{ {
QIcon iconFromSvg(const QByteArray& svgData, QSize iconSize) QIcon iconFromSvg(const QByteArray &svgData, QSize iconSize)
{ {
QSvgRenderer renderer(svgData); QSvgRenderer renderer(svgData);
QPixmap p(iconSize); QPixmap p(iconSize);
p.fill(Qt::transparent); p.fill(Qt::transparent);
@@ -23,60 +23,60 @@ QIcon iconFromSvg(const QByteArray& svgData, QSize iconSize)
painter.end(); painter.end();
return {p}; return {p};
} }
QIcon iconFromSvg(const QString& svgFilename, QSize iconSize) QIcon iconFromSvg(const QString &svgFilename, QSize iconSize)
{ {
QFile f(svgFilename); QFile f(svgFilename);
if (!f.open(QIODevice::ReadOnly)) if (!f.open(QIODevice::ReadOnly))
return {}; return {};
return iconFromSvg(f.readAll(), iconSize); return iconFromSvg(f.readAll(), iconSize);
} }
QPixmap pixmapFromIcon(const QIcon& icon, QSize iconSize) QPixmap pixmapFromIcon(const QIcon &icon, QSize iconSize)
{ {
return icon.pixmap(iconSize).scaled(100, 100, Qt::AspectRatioMode::IgnoreAspectRatio); return icon.pixmap(iconSize).scaled(100, 100, Qt::AspectRatioMode::IgnoreAspectRatio);
} }
QPixmap pixmapFromSvg(const QString& svgFilename, QSize iconSize) QPixmap pixmapFromSvg(const QString &svgFilename, QSize iconSize)
{ {
return pixmapFromIcon(iconFromSvg(svgFilename, iconSize), iconSize); return pixmapFromIcon(iconFromSvg(svgFilename, iconSize), iconSize);
} }
QPixmap getPixmap(const std::vector<uint8_t>& data) QPixmap getPixmap(const std::vector<uint8_t> &data)
{ {
if (data.size() == 0) if (data.size() == 0)
return QPixmap(); return QPixmap();
return getPixmap(QByteArray(reinterpret_cast<const char*>(&data.at(0)), data.size())); return getPixmap(QByteArray(reinterpret_cast<const char *>(&data.at(0)), data.size()));
} }
QPixmap getPixmap(const QByteArray& data) QPixmap getPixmap(const QByteArray &data)
{ {
return QPixmap::fromImage(QImage::fromData(data)); return QPixmap::fromImage(QImage::fromData(data));
} }
QImage getImage(const std::vector<uint8_t>& data) QImage getImage(const std::vector<uint8_t> &data)
{ {
if (data.size() == 0) if (data.size() == 0)
return QImage(); return QImage();
return getImage(QByteArray(reinterpret_cast<const char*>(&data.at(0)), data.size())); return getImage(QByteArray(reinterpret_cast<const char *>(&data.at(0)), data.size()));
} }
QImage getImage(const QByteArray& data) QImage getImage(const QByteArray &data)
{ {
return QImage::fromData(data); return QImage::fromData(data);
} }
static inline void setIf(bool* boolPtr, bool val) static inline void setIf(bool *boolPtr, bool val)
{ {
if (boolPtr) if (boolPtr)
*boolPtr = val; *boolPtr = val;
} }
std::vector<uint8_t> fromPixmap(const QPixmap& pixmap, bool* bIsPng) std::vector<uint8_t> fromPixmap(const QPixmap &pixmap, bool *bIsPng)
{ {
QBuffer buf; QBuffer buf;
buf.open(QIODevice::WriteOnly); buf.open(QIODevice::WriteOnly);
pixmap.save(&buf, "PNG"); pixmap.save(&buf, "PNG");
@@ -99,10 +99,10 @@ std::vector<uint8_t> fromPixmap(const QPixmap& pixmap, bool* bIsPng)
} }
return convert<std::vector<uint8_t>>(ba); return convert<std::vector<uint8_t>>(ba);
} }
std::vector<uint8_t> fromImage(const QImage& image, bool* bIsPng) std::vector<uint8_t> fromImage(const QImage &image, bool *bIsPng)
{ {
QBuffer buf; QBuffer buf;
buf.open(QIODevice::WriteOnly); buf.open(QIODevice::WriteOnly);
image.save(&buf, "PNG"); image.save(&buf, "PNG");
@@ -124,6 +124,6 @@ std::vector<uint8_t> fromImage(const QImage& image, bool* bIsPng)
} }
return convert<std::vector<uint8_t>>(ba); return convert<std::vector<uint8_t>>(ba);
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -17,15 +17,15 @@ class QIcon;
namespace LtsUtils namespace LtsUtils
{ {
LTSUTILSCORE_EXPORT QPixmap getPixmap(const std::vector<uint8_t>& data); LTSUTILSCORE_EXPORT QPixmap getPixmap(const std::vector<uint8_t> &data);
LTSUTILSCORE_EXPORT QPixmap getPixmap(const QByteArray& data); LTSUTILSCORE_EXPORT QPixmap getPixmap(const QByteArray &data);
LTSUTILSCORE_EXPORT QImage getImage(const std::vector<uint8_t>& data); LTSUTILSCORE_EXPORT QImage getImage(const std::vector<uint8_t> &data);
LTSUTILSCORE_EXPORT QImage getImage(const QByteArray& data); LTSUTILSCORE_EXPORT QImage getImage(const QByteArray &data);
LTSUTILSCORE_EXPORT QIcon iconFromSvg(const QByteArray& svgData, QSize iconSize = QSize(100, 100)); LTSUTILSCORE_EXPORT QIcon iconFromSvg(const QByteArray &svgData, QSize iconSize = QSize(100, 100));
LTSUTILSCORE_EXPORT QIcon iconFromSvg(const QString& svgFilename, QSize iconSize = QSize(100, 100)); LTSUTILSCORE_EXPORT QIcon iconFromSvg(const QString &svgFilename, QSize iconSize = QSize(100, 100));
LTSUTILSCORE_EXPORT QPixmap pixmapFromIcon(const QIcon& icon, QSize iconSize = QSize(100, 100)); LTSUTILSCORE_EXPORT QPixmap pixmapFromIcon(const QIcon &icon, QSize iconSize = QSize(100, 100));
LTSUTILSCORE_EXPORT QPixmap pixmapFromSvg(const QString& svgFilename, QSize iconSize = QSize(100, 100)); LTSUTILSCORE_EXPORT QPixmap pixmapFromSvg(const QString &svgFilename, QSize iconSize = QSize(100, 100));
LTSUTILSCORE_EXPORT std::vector<uint8_t> fromPixmap(const QPixmap& pixmap, bool* bIsPng = nullptr); LTSUTILSCORE_EXPORT std::vector<uint8_t> fromPixmap(const QPixmap &pixmap, bool *bIsPng = nullptr);
LTSUTILSCORE_EXPORT std::vector<uint8_t> fromImage(const QImage& image, bool* bIsPng = nullptr); LTSUTILSCORE_EXPORT std::vector<uint8_t> fromImage(const QImage &image, bool *bIsPng = nullptr);
} // namespace LtsUtils } // namespace LtsUtils
@@ -18,20 +18,27 @@
namespace LtsUtils namespace LtsUtils
{ {
bool RequestHelper::s_debug = false; bool RequestHelper::s_debug = false;
RequestHelper::RequestHelper(QObject* parent, bool quiet, RequestHelper::RequestHelper(QObject *parent,
bool quiet,
const std::function<void(void)>& success, const std::function<void(void)>& failure) const std::function<void(void)> &success,
: QObject(parent), m_failed(false), m_repliedId(-1), m_quiet(quiet), m_blockingCall(true), m_successFn(success), const std::function<void(void)> &failure)
m_failureFn(failure) : QObject(parent)
{ , m_failed(false)
, m_repliedId(-1)
, m_quiet(quiet)
, m_blockingCall(true)
, m_successFn(success)
, m_failureFn(failure)
{
connect(this, &RequestHelper::signalSuccess, this, m_successFn, Qt::QueuedConnection); connect(this, &RequestHelper::signalSuccess, this, m_successFn, Qt::QueuedConnection);
connect(this, &RequestHelper::signalFailed, this, m_failureFn, Qt::QueuedConnection); connect(this, &RequestHelper::signalFailed, this, m_failureFn, Qt::QueuedConnection);
if (s_debug) if (s_debug)
{ {
QTimer* t = new QTimer(this); QTimer *t = new QTimer(this);
t->setInterval(2000); t->setInterval(2000);
t->setSingleShot(true); t->setSingleShot(true);
connect(this, &RequestHelper::signalNextRequest, t, static_cast<void (QTimer::*)(void)>(&QTimer::start)); connect(this, &RequestHelper::signalNextRequest, t, static_cast<void (QTimer::*)(void)>(&QTimer::start));
@@ -43,28 +50,27 @@ RequestHelper::RequestHelper(QObject* parent, bool quiet,
); );
} }
} }
void RequestHelper::addRequest(const std::function<int64_t()>& requestFunction, void RequestHelper::addRequest(const std::function<int64_t()> &requestFunction, const std::function<void(const Core::FunctionReply &baseReply)> &baseReplyHandler)
const std::function<void(const Core::FunctionReply& baseReply)>& baseReplyHandler) {
{
m_requestFunctions.append(RequestFunctionContainer(requestFunction, baseReplyHandler)); m_requestFunctions.append(RequestFunctionContainer(requestFunction, baseReplyHandler));
} }
bool RequestHelper::requestReply(const Core::FunctionReply& baseReply) bool RequestHelper::requestReply(const Core::FunctionReply &baseReply)
{ {
// rtiddsgen 7.7 generates plain public members (no getters/setters) // rtiddsgen 7.7 generates plain public members (no getters/setters)
const Core::FunctionReplyObject fro(baseReply.id, baseReply.errorString, baseReply.errorParams); const Core::FunctionReplyObject fro(baseReply.id, baseReply.errorString, baseReply.errorParams);
return _requestReply(fro, &baseReply); return _requestReply(fro, &baseReply);
} }
bool RequestHelper::requestReply(const Core::FunctionReplyObject& replyObject) bool RequestHelper::requestReply(const Core::FunctionReplyObject &replyObject)
{ {
return _requestReply(replyObject, nullptr); return _requestReply(replyObject, nullptr);
} }
bool RequestHelper::_requestReply(const Core::FunctionReplyObject& fro, const Core::FunctionReply* baseReply) bool RequestHelper::_requestReply(const Core::FunctionReplyObject &fro, const Core::FunctionReply *baseReply)
{ {
m_errorString = fro.translated(); m_errorString = fro.translated();
#ifdef REQUEST_HELPER_WITH_GUI #ifdef REQUEST_HELPER_WITH_GUI
@@ -75,13 +81,11 @@ bool RequestHelper::_requestReply(const Core::FunctionReplyObject& fro, const Co
{ {
if (m_blockingCall) if (m_blockingCall)
{ {
LtsWidgets::LtsMessageDialog::showMessage(qobject_cast<QWidget*>(parent()), m_errorString, LtsWidgets::LtsMessageDialog::showMessage(qobject_cast<QWidget *>(parent()), m_errorString, tr("Request failed"));
tr("Request failed"));
} }
else else
{ {
new LtsWidgets::LtsMessageDialogNew(qobject_cast<QWidget*>(parent()), m_errorString, new LtsWidgets::LtsMessageDialogNew(qobject_cast<QWidget *>(parent()), m_errorString, tr("Request failed"));
tr("Request failed"));
} }
} }
} }
@@ -94,8 +98,7 @@ bool RequestHelper::_requestReply(const Core::FunctionReplyObject& fro, const Co
if (baseReply) if (baseReply)
m_singleRequestCustomFunctionReply(*baseReply); m_singleRequestCustomFunctionReply(*baseReply);
else else
m_singleRequestCustomFunctionReply( m_singleRequestCustomFunctionReply(Core::FunctionReply(fro.id(), fro.str(), fro.args(), fro.additionalInfo()));
Core::FunctionReply(fro.id(), fro.str(), fro.args(), fro.additionalInfo()));
} }
if (fro.error()) if (fro.error())
@@ -106,25 +109,24 @@ bool RequestHelper::_requestReply(const Core::FunctionReplyObject& fro, const Co
emit signalNextRequest(); emit signalNextRequest();
return true; return true;
} }
bool RequestHelper::startSingleRequest( bool RequestHelper::startSingleRequest(const std::function<int64_t()> &requestFunction,
const std::function<int64_t()>& requestFunction, const std::function<void(const Core::FunctionReply &baseReply)> &baseReplyHandler)
const std::function<void(const Core::FunctionReply& baseReply)>& baseReplyHandler) {
{
addRequest(requestFunction, baseReplyHandler); addRequest(requestFunction, baseReplyHandler);
return startRequests(); return startRequests();
} }
void RequestHelper::failure() void RequestHelper::failure()
{ {
m_failed = true; m_failed = true;
emit signalFailed(); emit signalFailed();
done(); done();
} }
void RequestHelper::done() void RequestHelper::done()
{ {
#ifdef REQUEST_HELPER_WITH_GUI #ifdef REQUEST_HELPER_WITH_GUI
if (!m_quiet) if (!m_quiet)
LtsWidgets::LtsGlobalWaitDialog::getInstance()->done(); LtsWidgets::LtsGlobalWaitDialog::getInstance()->done();
@@ -140,10 +142,10 @@ void RequestHelper::done()
if (!m_blockingCall) if (!m_blockingCall)
deleteLater(); deleteLater();
} }
void RequestHelper::slotNextRequest() void RequestHelper::slotNextRequest()
{ {
if (m_requestFunctions.isEmpty()) if (m_requestFunctions.isEmpty())
{ {
if (!m_blockingCall) if (!m_blockingCall)
@@ -166,12 +168,14 @@ void RequestHelper::slotNextRequest()
{ {
if (m_blockingCall) if (m_blockingCall)
{ {
LtsWidgets::LtsMessageDialog::showMessage(qobject_cast<QWidget*>(parent()), tr("Request failed")); LtsWidgets::LtsMessageDialog::showMessage(qobject_cast<QWidget *>(parent()), tr("Request failed"));
} }
else else
{ {
connect(new LtsWidgets::LtsMessageDialogNew(qobject_cast<QWidget*>(parent()), tr("Request failed")), connect(new LtsWidgets::LtsMessageDialogNew(qobject_cast<QWidget *>(parent()), tr("Request failed")),
&LtsWidgets::LtsMessageDialogNew::destroyed, this, [this]() { failure(); }); &LtsWidgets::LtsMessageDialogNew::destroyed,
this,
[this]() { failure(); });
return; return;
} }
@@ -179,29 +183,28 @@ void RequestHelper::slotNextRequest()
#endif #endif
failure(); failure();
} }
} }
void RequestHelper::startSingleBackgroundRequest( void RequestHelper::startSingleBackgroundRequest(const std::function<int64_t()> &requestFunction,
const std::function<int64_t()>& requestFunction, const std::function<void(const Core::FunctionReply &)> &baseReplyHandler)
const std::function<void(const Core::FunctionReply&)>& baseReplyHandler) {
{
m_blockingCall = false; m_blockingCall = false;
startSingleRequest(requestFunction, baseReplyHandler); startSingleRequest(requestFunction, baseReplyHandler);
} }
void RequestHelper::startBackgroundRequests() void RequestHelper::startBackgroundRequests()
{ {
m_blockingCall = false; m_blockingCall = false;
startRequests(); startRequests();
} }
void RequestHelper::setCustomWaitMessage(const QString& customWaitMessage) void RequestHelper::setCustomWaitMessage(const QString &customWaitMessage)
{ {
m_customWaitMessage = (customWaitMessage + QStringLiteral(" ...")); m_customWaitMessage = (customWaitMessage + QStringLiteral(" ..."));
} }
bool RequestHelper::startRequests() bool RequestHelper::startRequests()
{ {
if (m_requestFunctions.isEmpty()) if (m_requestFunctions.isEmpty())
{ {
#ifdef LTS_DEBUG #ifdef LTS_DEBUG
@@ -223,7 +226,7 @@ bool RequestHelper::startRequests()
if (s_debug) if (s_debug)
{ {
QTimer* t = new QTimer(this); QTimer *t = new QTimer(this);
t->setInterval(2000); t->setInterval(2000);
connect(t, &QTimer::timeout, this, &RequestHelper::slotNextRequest, Qt::QueuedConnection); connect(t, &QTimer::timeout, this, &RequestHelper::slotNextRequest, Qt::QueuedConnection);
connect(t, &QTimer::timeout, t, &QTimer::deleteLater); connect(t, &QTimer::timeout, t, &QTimer::deleteLater);
@@ -242,6 +245,6 @@ bool RequestHelper::startRequests()
} }
return (!m_failed); return (!m_failed);
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -27,41 +27,41 @@
namespace LtsUtils namespace LtsUtils
{ {
template<typename T> template <typename T> dds::core::optional<T> toOptional(T inVal)
dds::core::optional<T> toOptional(T inVal) {
{
return inVal != T() ? dds::core::optional<T>(inVal) : dds::core::optional<T>(); return inVal != T() ? dds::core::optional<T>(inVal) : dds::core::optional<T>();
} }
template<typename T> template <typename T> dds::core::optional<T> optional()
dds::core::optional<T> optional() {
{
return dds::core::optional<T>(); return dds::core::optional<T>();
} }
class LTSUTILSGUIDDS_INTERNAL_EXPORT RequestHelper : public QObject // TODO: DOC !!! class LTSUTILSGUIDDS_INTERNAL_EXPORT RequestHelper : public QObject // TODO: DOC !!!
{ {
Q_OBJECT Q_OBJECT
public: public:
static bool s_debug; static bool s_debug;
explicit RequestHelper(QObject *parent = nullptr, bool quiet = false, explicit RequestHelper(
QObject *parent = nullptr,
bool quiet = false,
// for non-blocking // for non-blocking
const std::function<void (void)> &success = [](){}, const std::function<void(void)> &success = []() {},
const std::function<void (void)> &failure = [](){}); const std::function<void(void)> &failure = []() {});
~RequestHelper() = default; ~RequestHelper() = default;
bool quiet() const { return m_quiet; } bool quiet() const { return m_quiet; }
void setQuiet(bool quiet) { m_quiet = quiet; } void setQuiet(bool quiet) { m_quiet = quiet; }
void addRequest(const std::function<int64_t()> &requestFunction, void addRequest(const std::function<int64_t()> &requestFunction, const std::function<void(const Core::FunctionReply &baseReply)> &baseReplyHandler = nullptr);
const std::function<void(const Core::FunctionReply &baseReply)> &baseReplyHandler = nullptr);
bool startRequests(); // blocks! bool startRequests(); // blocks!
// do not throw a message if this method fails, as this method does this already // blocks! // do not throw a message if this method fails, as this method does this already // blocks!
bool startSingleRequest(const std::function<int64_t(void)> &requestFunction, bool startSingleRequest(const std::function<int64_t(void)> &requestFunction,
const std::function<void(const Core::FunctionReply &baseReply)> &baseReplyHandler = nullptr // for replies that return a custom FunctionReply, which has to be handled >>after successful execution<< const std::function<void(const Core::FunctionReply &baseReply)> &baseReplyHandler =
nullptr // for replies that return a custom FunctionReply, which has to be handled >>after successful execution<<
); );
// non-blocking ! // non-blocking !
@@ -109,7 +109,7 @@ public:
bool failed() const { return m_failed; } bool failed() const { return m_failed; }
void failure(); void failure();
private: private:
using RequestFunctionContainer = QPair<std::function<int64_t()>, std::function<void(const Core::FunctionReply &)>>; using RequestFunctionContainer = QPair<std::function<int64_t()>, std::function<void(const Core::FunctionReply &)>>;
QVector<RequestFunctionContainer> m_requestFunctions; QVector<RequestFunctionContainer> m_requestFunctions;
@@ -118,23 +118,22 @@ private:
std::function<void(const Core::FunctionReply &)> m_singleRequestCustomFunctionReply; std::function<void(const Core::FunctionReply &)> m_singleRequestCustomFunctionReply;
bool m_quiet; bool m_quiet;
bool m_blockingCall; bool m_blockingCall;
std::function<void (void)> m_successFn; std::function<void(void)> m_successFn;
std::function<void (void)> m_failureFn; std::function<void(void)> m_failureFn;
QString m_errorString; QString m_errorString;
QString m_customWaitMessage; QString m_customWaitMessage;
void done(); void done();
bool _requestReply(const Core::FunctionReplyObject &fro, const Core::FunctionReply *baseReply); bool _requestReply(const Core::FunctionReplyObject &fro, const Core::FunctionReply *baseReply);
signals: signals:
void signalNextRequest(); void signalNextRequest();
void signalQuitLoop(); void signalQuitLoop();
void signalSuccess(); void signalSuccess();
void signalFailed(); void signalFailed();
private slots: private slots:
void slotNextRequest(); void slotNextRequest();
};
};
} // namespace LtsUtils } // namespace LtsUtils
@@ -10,29 +10,28 @@
namespace LtsUtils namespace LtsUtils
{ {
struct StyleManagerHandler struct StyleManagerHandler
{ {
StyleManager styleManager; StyleManager styleManager;
}; };
Q_GLOBAL_STATIC(StyleManagerHandler, s_styleManagerHandler) Q_GLOBAL_STATIC(StyleManagerHandler, s_styleManagerHandler)
StyleManager* StyleManager::getInstance() StyleManager *StyleManager::getInstance()
{ {
return &s_styleManagerHandler->styleManager; return &s_styleManagerHandler->styleManager;
} }
bool StyleManager::loadStyle(const QString& stylePluginName, bool highDpi) bool StyleManager::loadStyle(const QString &stylePluginName, bool highDpi)
{ {
if (m_currentStylePluginLoader != nullptr) if (m_currentStylePluginLoader != nullptr)
{ {
QObject* pluginInstance = m_currentStylePluginLoader->instance(); QObject *pluginInstance = m_currentStylePluginLoader->instance();
StylePlugin::Plugin* sp = qobject_cast<StylePlugin::Plugin*>(pluginInstance); StylePlugin::Plugin *sp = qobject_cast<StylePlugin::Plugin *>(pluginInstance);
if (sp == nullptr) if (sp == nullptr)
{ {
qWarning() << "StyleManager::loadStyle: could not unload style plugin - wrong type (" qWarning() << "StyleManager::loadStyle: could not unload style plugin - wrong type (" << pluginInstance->metaObject()->className() << ") - new style not loaded";
<< pluginInstance->metaObject()->className() << ") - new style not loaded";
return false; return false;
} }
@@ -41,13 +40,13 @@ bool StyleManager::loadStyle(const QString& stylePluginName, bool highDpi)
m_currentStylePluginLoader = nullptr; m_currentStylePluginLoader = nullptr;
} }
LtsPluginManager::LtsPluginLoader* pluginLoader = LtsPluginManager::LtsPluginLoader::getInstance(); LtsPluginManager::LtsPluginLoader *pluginLoader = LtsPluginManager::LtsPluginLoader::getInstance();
QPluginLoader* stylePluginLoader = nullptr; QPluginLoader *stylePluginLoader = nullptr;
int pluginsLoaded = 0; int pluginsLoaded = 0;
std::function<bool(const LtsPluginManager::PluginInstance& pi)> loadPluginFn = std::function<bool(const LtsPluginManager::PluginInstance &pi)> loadPluginFn = [&stylePluginLoader, &pluginsLoaded](const LtsPluginManager::PluginInstance &pi)
[&stylePluginLoader, &pluginsLoaded](const LtsPluginManager::PluginInstance& pi) { {
stylePluginLoader = pi.pluginLoader; stylePluginLoader = pi.pluginLoader;
pluginsLoaded++; pluginsLoaded++;
return true; return true;
@@ -61,15 +60,13 @@ bool StyleManager::loadStyle(const QString& stylePluginName, bool highDpi)
if (pluginsLoaded == 0) if (pluginsLoaded == 0)
{ {
qWarning() << "StyleManager::loadStyle: Could not find Style Plugin" << stylePluginName qWarning() << "StyleManager::loadStyle: Could not find Style Plugin" << stylePluginName << "- using default Qt style";
<< "- using default Qt style";
return false; return false;
} }
if (pluginsLoaded > 1) if (pluginsLoaded > 1)
{ {
qWarning() << "StyleManager::loadStyle: Style Plugin" << stylePluginName qWarning() << "StyleManager::loadStyle: Style Plugin" << stylePluginName << " is ambiguous - using default Qt style";
<< " is ambiguous - using default Qt style";
return false; return false;
} }
@@ -79,12 +76,12 @@ bool StyleManager::loadStyle(const QString& stylePluginName, bool highDpi)
return false; return false;
} }
StylePlugin::Plugin* sp = qobject_cast<StylePlugin::Plugin*>(stylePluginLoader->instance()); StylePlugin::Plugin *sp = qobject_cast<StylePlugin::Plugin *>(stylePluginLoader->instance());
if (sp == nullptr) if (sp == nullptr)
{ {
qWarning() << "StyleManager::loadStyle: could not load style plugin - wrong type (" qWarning() << "StyleManager::loadStyle: could not load style plugin - wrong type (" << stylePluginLoader->instance()->metaObject()->className()
<< stylePluginLoader->instance()->metaObject()->className() << ") - new style not loaded"; << ") - new style not loaded";
return false; return false;
} }
@@ -95,6 +92,6 @@ bool StyleManager::loadStyle(const QString& stylePluginName, bool highDpi)
emit signalStyleChanged(stylePluginName); emit signalStyleChanged(stylePluginName);
return true; return true;
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -10,29 +10,26 @@ class QPluginLoader;
namespace LtsUtils namespace LtsUtils
{ {
class LTSUTILSGUISTYLEMANAGER_EXPORT StyleManager : public QObject class LTSUTILSGUISTYLEMANAGER_EXPORT StyleManager : public QObject
{ {
Q_OBJECT Q_OBJECT
using QObject::QObject; using QObject::QObject;
~StyleManager() = default; ~StyleManager() = default;
public: public:
static StyleManager* getInstance(); static StyleManager *getInstance();
bool loadStyle(const QString& stylePluginName, bool highDpi = false); bool loadStyle(const QString &stylePluginName, bool highDpi = false);
const QString& currentStyleName() const const QString &currentStyleName() const { return m_stylePluginName; }
{
return m_stylePluginName;
}
private: private:
friend struct StyleManagerHandler; friend struct StyleManagerHandler;
QPluginLoader* m_currentStylePluginLoader = nullptr; QPluginLoader *m_currentStylePluginLoader = nullptr;
QString m_stylePluginName; QString m_stylePluginName;
signals: signals:
void signalStyleChanged(const QString& stylePluginName); void signalStyleChanged(const QString &stylePluginName);
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -16,16 +16,17 @@
namespace LtsUtils namespace LtsUtils
{ {
enum class SettingType { enum class SettingType
{
String = 1, String = 1,
StringList = 2, StringList = 2,
Json = 3, Json = 3,
FunctionKeys = 4, FunctionKeys = 4,
Boolean = 5, Boolean = 5,
}; };
QString typeToString(SettingType t) QString typeToString(SettingType t)
{ {
switch (t) switch (t)
{ {
case SettingType::String: case SettingType::String:
@@ -41,10 +42,10 @@ QString typeToString(SettingType t)
} }
Q_ASSERT(false); Q_ASSERT(false);
return QStringLiteral("Unknown SettingType (%1)").arg(int(t)); return QStringLiteral("Unknown SettingType (%1)").arg(int(t));
} }
SettingType stringToType(const QString& s) SettingType stringToType(const QString &s)
{ {
if (s == typeToString(SettingType::String)) if (s == typeToString(SettingType::String))
return SettingType::String; return SettingType::String;
if (s == typeToString(SettingType::StringList)) if (s == typeToString(SettingType::StringList))
@@ -57,51 +58,51 @@ SettingType stringToType(const QString& s)
return SettingType::Boolean; return SettingType::Boolean;
Q_ASSERT(false); Q_ASSERT(false);
return SettingType::String; return SettingType::String;
} }
static QString craftKey(const QString& group, const QString& identifier) static QString craftKey(const QString &group, const QString &identifier)
{ {
return group + QLatin1Char('.') + identifier; return group + QLatin1Char('.') + identifier;
} }
static OperatorSettings* s_operatorSettings = nullptr; static OperatorSettings *s_operatorSettings = nullptr;
static void cleanupOperatorSettings() static void cleanupOperatorSettings()
{ {
delete s_operatorSettings; delete s_operatorSettings;
s_operatorSettings = nullptr; s_operatorSettings = nullptr;
} }
OperatorSettings* OperatorSettings::getInstance() OperatorSettings *OperatorSettings::getInstance()
{ {
if (!s_operatorSettings) if (!s_operatorSettings)
{ {
s_operatorSettings = new OperatorSettings; s_operatorSettings = new OperatorSettings;
qAddPostRoutine(&cleanupOperatorSettings); qAddPostRoutine(&cleanupOperatorSettings);
} }
return s_operatorSettings; return s_operatorSettings;
} }
static ProjectSettings* s_projectSettings = nullptr; static ProjectSettings *s_projectSettings = nullptr;
static void cleanupProjectSettings() static void cleanupProjectSettings()
{ {
delete s_projectSettings; delete s_projectSettings;
s_projectSettings = nullptr; s_projectSettings = nullptr;
} }
ProjectSettings* ProjectSettings::getInstance() ProjectSettings *ProjectSettings::getInstance()
{ {
if (!s_projectSettings) if (!s_projectSettings)
{ {
s_projectSettings = new ProjectSettings; s_projectSettings = new ProjectSettings;
qAddPostRoutine(&cleanupProjectSettings); qAddPostRoutine(&cleanupProjectSettings);
} }
return s_projectSettings; return s_projectSettings;
} }
bool ProjectSettings::initFromFile(const QString& filename) bool ProjectSettings::initFromFile(const QString &filename)
{ {
QFile f(filename); QFile f(filename);
if (!f.open(QIODevice::ReadOnly)) if (!f.open(QIODevice::ReadOnly))
return false; return false;
@@ -116,12 +117,12 @@ bool ProjectSettings::initFromFile(const QString& filename)
return false; return false;
QHash<QString, QVariant> newData; QHash<QString, QVariant> newData;
const QStringList& groupKeys(psObj.keys()); const QStringList &groupKeys(psObj.keys());
for (const auto& gKey : groupKeys) for (const auto &gKey : groupKeys)
{ {
const QJsonObject objGroup(psObj[gKey].toObject()); const QJsonObject objGroup(psObj[gKey].toObject());
const QStringList& itemKeys(objGroup.keys()); const QStringList &itemKeys(objGroup.keys());
for (const auto& key : itemKeys) for (const auto &key : itemKeys)
{ {
const QJsonObject obj(objGroup[key].toObject()); const QJsonObject obj(objGroup[key].toObject());
const auto strType(obj[QStringLiteral("Type")].toString()); const auto strType(obj[QStringLiteral("Type")].toString());
@@ -133,11 +134,12 @@ bool ProjectSettings::initFromFile(const QString& filename)
case SettingType::Json: case SettingType::Json:
val = QJsonDocument(jVal.toObject()).toJson(); val = QJsonDocument(jVal.toObject()).toJson();
break; break;
case SettingType::StringList: { case SettingType::StringList:
{
const QJsonArray arr(jVal.toArray()); const QJsonArray arr(jVal.toArray());
QStringList sl; QStringList sl;
sl.reserve(arr.size()); sl.reserve(arr.size());
for (const auto& ele : arr) for (const auto &ele : arr)
sl.push_back(ele.toString()); sl.push_back(ele.toString());
val = sl; val = sl;
break; break;
@@ -157,18 +159,17 @@ bool ProjectSettings::initFromFile(const QString& filename)
} }
getInstance()->m_data = newData; getInstance()->m_data = newData;
return true; return true;
} }
bool ProjectSettings::isFunctionEnabled(const QString& group, const QString& function) bool ProjectSettings::isFunctionEnabled(const QString &group, const QString &function)
{ {
const QStringList functionNames = const QStringList functionNames = getInstance()->value(QStringLiteral("Functionalities"), QStringLiteral("IdentifierList")).toStringList();
getInstance()->value(QStringLiteral("Functionalities"), QStringLiteral("IdentifierList")).toStringList();
return functionNames.contains(group + QLatin1Char(':') + function); return functionNames.contains(group + QLatin1Char(':') + function);
} }
void Settings::init(const QByteArray& settings) void Settings::init(const QByteArray &settings)
{ {
QByteArray uncompressed; QByteArray uncompressed;
try try
{ {
@@ -183,10 +184,10 @@ void Settings::init(const QByteArray& settings)
QDataStream stream(uncompressed); QDataStream stream(uncompressed);
stream >> m_data; stream >> m_data;
} }
QByteArray Settings::exportSettings() const QByteArray Settings::exportSettings() const
{ {
if (m_data.isEmpty()) if (m_data.isEmpty())
return QByteArray(); return QByteArray();
@@ -194,15 +195,15 @@ QByteArray Settings::exportSettings() const
QDataStream stream(&ba, QIODevice::WriteOnly); QDataStream stream(&ba, QIODevice::WriteOnly);
stream << m_data; stream << m_data;
return qCompress(ba); return qCompress(ba);
} }
void Settings::clear() void Settings::clear()
{ {
m_data.clear(); m_data.clear();
} }
void Settings::dump() void Settings::dump()
{ {
qWarning() << "Settings::m_data: keys=" << m_data.keys(); qWarning() << "Settings::m_data: keys=" << m_data.keys();
QHashIterator<QString, QVariant> it(m_data); QHashIterator<QString, QVariant> it(m_data);
int i = 0; int i = 0;
@@ -213,23 +214,23 @@ void Settings::dump()
<< " - key='" << it.key() << "' value -> '" << it.value() << "'"; << " - key='" << it.key() << "' value -> '" << it.value() << "'";
} }
qWarning() << "Settings::m_data: ------------------"; qWarning() << "Settings::m_data: ------------------";
} }
void Settings::setValue(const QString& group, const QString& identifier, const QVariant& value) void Settings::setValue(const QString &group, const QString &identifier, const QVariant &value)
{ {
m_data.insert(craftKey(group, identifier), value); m_data.insert(craftKey(group, identifier), value);
emit valueChanged(group, identifier, value); emit valueChanged(group, identifier, value);
} }
void Settings::removeValue(const QString& group, const QString& identifier) void Settings::removeValue(const QString &group, const QString &identifier)
{ {
if (m_data.remove(craftKey(group, identifier))) if (m_data.remove(craftKey(group, identifier)))
emit valueRemoved(group, identifier); emit valueRemoved(group, identifier);
} }
QStringList Settings::identifiers(const QString& group) const QStringList Settings::identifiers(const QString &group) const
{ {
QStringList result; QStringList result;
for (auto it = m_data.begin(); it != m_data.end(); ++it) for (auto it = m_data.begin(); it != m_data.end(); ++it)
{ {
@@ -238,11 +239,11 @@ QStringList Settings::identifiers(const QString& group) const
result.append(decrafted.at(0).mid(1)); result.append(decrafted.at(0).mid(1));
} }
return result; return result;
} }
QVariant Settings::value(const QString& group, const QString& identifier, const QVariant& defaultValue) const QVariant Settings::value(const QString &group, const QString &identifier, const QVariant &defaultValue) const
{ {
return m_data.value(craftKey(group, identifier), defaultValue); return m_data.value(craftKey(group, identifier), defaultValue);
} }
} // namespace LtsUtils } // namespace LtsUtils
@@ -12,22 +12,22 @@ class QJsonObject;
namespace LtsUtils namespace LtsUtils
{ {
class LTSUTILSSETTINGS_EXPORT Settings : public QObject class LTSUTILSSETTINGS_EXPORT Settings : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
~Settings() = default; ~Settings() = default;
void setValue(const QString& group, const QString& identifier, const QVariant& value); void setValue(const QString &group, const QString &identifier, const QVariant &value);
void removeValue(const QString& group, const QString& identifier); void removeValue(const QString &group, const QString &identifier);
QVariant value(const QString& group, const QString& identifier, const QVariant& defaultValue = QVariant()) const; QVariant value(const QString &group, const QString &identifier, const QVariant &defaultValue = QVariant()) const;
QStringList identifiers(const QString& group) const; QStringList identifiers(const QString &group) const;
void init(const QByteArray& settings); void init(const QByteArray &settings);
QByteArray exportSettings() const; QByteArray exportSettings() const;
void clear(); void clear();
@@ -37,28 +37,28 @@ class LTSUTILSSETTINGS_EXPORT Settings : public QObject
Settings() = default; Settings() = default;
signals: signals:
void valueChanged(const QString& group, const QString& identifier, const QVariant& value); void valueChanged(const QString &group, const QString &identifier, const QVariant &value);
void valueRemoved(const QString& group, const QString& identifier); void valueRemoved(const QString &group, const QString &identifier);
protected: protected:
QHash<QString, QVariant> m_data; QHash<QString, QVariant> m_data;
}; };
class LTSUTILSSETTINGS_EXPORT OperatorSettings : public Settings class LTSUTILSSETTINGS_EXPORT OperatorSettings : public Settings
{ {
Q_OBJECT Q_OBJECT
public: public:
static OperatorSettings* getInstance(); static OperatorSettings *getInstance();
}; };
class LTSUTILSSETTINGS_EXPORT ProjectSettings : public Settings class LTSUTILSSETTINGS_EXPORT ProjectSettings : public Settings
{ {
Q_OBJECT Q_OBJECT
public: public:
static ProjectSettings* getInstance(); static ProjectSettings *getInstance();
static bool initFromFile(const QString& filename); static bool initFromFile(const QString &filename);
static bool isFunctionEnabled(const QString& group, const QString& function); static bool isFunctionEnabled(const QString &group, const QString &function);
}; };
} // namespace LtsUtils } // namespace LtsUtils
@@ -10,21 +10,23 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
ClientConnection::ClientConnection(QWebSocket* socket, QObject* parent) ClientConnection::ClientConnection(QWebSocket *socket, QObject *parent)
: QThread(parent), m_logger(getLogger("LtsWebSocket.ClientConnection")), m_socket(socket ? socket : new QWebSocket) : QThread(parent)
{ , m_logger(getLogger("LtsWebSocket.ClientConnection"))
} , m_socket(socket ? socket : new QWebSocket)
{
}
ClientConnection::~ClientConnection() ClientConnection::~ClientConnection()
{ {
DEBUG_LOG(m_logger) << "Thread closed" << this; DEBUG_LOG(m_logger) << "Thread closed" << this;
delete m_socket; delete m_socket;
qDeleteAll(m_messageQueue); qDeleteAll(m_messageQueue);
} }
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
bool ClientConnection::init() bool ClientConnection::init()
{ {
if (m_socket == nullptr) if (m_socket == nullptr)
{ {
ERROR_LOG(m_logger) << "Initialisation failed due to an invalid socket"; ERROR_LOG(m_logger) << "Initialisation failed due to an invalid socket";
@@ -32,16 +34,15 @@ bool ClientConnection::init()
} }
DEBUG_LOG(m_logger) << "Started new thread" << this; DEBUG_LOG(m_logger) << "Started new thread" << this;
connect(m_socket, &QWebSocket::textMessageReceived, this, &ClientConnection::onNewTextMessageFromSocket, connect(m_socket, &QWebSocket::textMessageReceived, this, &ClientConnection::onNewTextMessageFromSocket, Qt::DirectConnection);
Qt::DirectConnection);
connect(m_socket, &QWebSocket::connected, this, &ClientConnection::sendMessagesFromQueue); connect(m_socket, &QWebSocket::connected, this, &ClientConnection::sendMessagesFromQueue);
connect(m_socket, &QWebSocket::disconnected, this, &ClientConnection::onSocketDisconnect); connect(m_socket, &QWebSocket::disconnected, this, &ClientConnection::onSocketDisconnect);
return true; return true;
} }
void ClientConnection::addReply(ReplyMessage* message) void ClientConnection::addReply(ReplyMessage *message)
{ {
if (!m_socket || m_socket->state() != QAbstractSocket::ConnectedState) if (!m_socket || m_socket->state() != QAbstractSocket::ConnectedState)
{ {
m_messageQueue.enqueue(message); m_messageQueue.enqueue(message);
@@ -52,38 +53,37 @@ void ClientConnection::addReply(ReplyMessage* message)
DEBUG_LOG(m_logger) << "Sending message: " << msg; DEBUG_LOG(m_logger) << "Sending message: " << msg;
m_socket->sendTextMessage(msg); m_socket->sendTextMessage(msg);
delete message; delete message;
} }
void ClientConnection::onNewTextMessageFromSocket(const QString& message) void ClientConnection::onNewTextMessageFromSocket(const QString &message)
{ {
DEBUG_LOG(m_logger) << "Recv msg: " << message << this; DEBUG_LOG(m_logger) << "Recv msg: " << message << this;
emit newTextMessage(this, message); emit newTextMessage(this, message);
} }
void ClientConnection::sendMessagesFromQueue() void ClientConnection::sendMessagesFromQueue()
{ {
INFO_LOG(m_logger) << "Client connected ip: " << m_socket->peerAddress().toString() << ":" << m_socket->peerPort(); INFO_LOG(m_logger) << "Client connected ip: " << m_socket->peerAddress().toString() << ":" << m_socket->peerPort();
if (m_socket->state() != QAbstractSocket::ConnectedState) if (m_socket->state() != QAbstractSocket::ConnectedState)
return; return;
while (!m_messageQueue.isEmpty()) while (!m_messageQueue.isEmpty())
{ {
ReplyMessage* message = m_messageQueue.dequeue(); ReplyMessage *message = m_messageQueue.dequeue();
const QString msg(message->toJsonString()); const QString msg(message->toJsonString());
TRACE_LOG(m_logger) << "Send msg: " << msg; TRACE_LOG(m_logger) << "Send msg: " << msg;
m_socket->sendTextMessage(msg); m_socket->sendTextMessage(msg);
delete message; delete message;
DEBUG_LOG(m_logger) << "Sent message from queue, new size: " << m_messageQueue.size(); DEBUG_LOG(m_logger) << "Sent message from queue, new size: " << m_messageQueue.size();
} }
} }
void ClientConnection::onSocketDisconnect() void ClientConnection::onSocketDisconnect()
{ {
DEBUG_LOG(m_logger) << "Client disconnected ip: " << m_socket->peerAddress().toString() << ":" DEBUG_LOG(m_logger) << "Client disconnected ip: " << m_socket->peerAddress().toString() << ":" << m_socket->peerPort();
<< m_socket->peerPort();
exit(0); exit(0);
emit disconnected(this); emit disconnected(this);
} }
#endif #endif
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -12,68 +12,70 @@
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
class QWebSocket; class QWebSocket;
#else #else
namespace LtsWebSocket { class QWebSocketStub; } namespace LtsWebSocket
{
class QWebSocketStub;
}
using QWebSocket = LtsWebSocket::QWebSocketStub; using QWebSocket = LtsWebSocket::QWebSocketStub;
namespace LtsWebSocket namespace LtsWebSocket
{ {
class QWebSocketStub class QWebSocketStub
{ {
public: public:
QWebSocketStub(QObject* parent = nullptr) { Q_UNUSED(parent); } QWebSocketStub(QObject *parent = nullptr) { Q_UNUSED(parent); }
virtual ~QWebSocketStub() = default; virtual ~QWebSocketStub() = default;
void sendTextMessage(const QString& /*message*/) {} void sendTextMessage(const QString & /*message*/) {}
void close() {} void close() {}
bool isValid() const { return false; } bool isValid() const { return false; }
QString errorString() const { return QString(); } QString errorString() const { return QString(); }
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
#endif #endif
namespace LtsWebSocket namespace LtsWebSocket
{ {
class LTSWEBSOCKETSERVER_EXPORT ClientConnection : public QThread, public ReplyHandler class LTSWEBSOCKETSERVER_EXPORT ClientConnection
{ : public QThread
, public ReplyHandler
{
Q_OBJECT Q_OBJECT
public: public:
explicit ClientConnection(QWebSocket* socket, QObject* parent = nullptr); explicit ClientConnection(QWebSocket *socket, QObject *parent = nullptr);
~ClientConnection(); ~ClientConnection();
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
bool init(); bool init();
void addReply(ReplyMessage* message) override; void addReply(ReplyMessage *message) override;
QWebSocket* webSocket() QWebSocket *webSocket() { return m_socket; }
{
return m_socket;
}
#else #else
bool init() { return false; } bool init() { return false; }
void addReply(ReplyMessage* /*message*/) override {} void addReply(ReplyMessage * /*message*/) override {}
QWebSocket* webSocket() { return nullptr; } QWebSocket *webSocket() { return nullptr; }
#endif #endif
signals: signals:
void newTextMessage(ClientConnection* client, const QString& message); void newTextMessage(ClientConnection *client, const QString &message);
void disconnected(ClientConnection* client); void disconnected(ClientConnection *client);
private slots: private slots:
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
void onNewTextMessageFromSocket(const QString& message); void onNewTextMessageFromSocket(const QString &message);
void sendMessagesFromQueue(); void sendMessagesFromQueue();
void onSocketDisconnect(); void onSocketDisconnect();
#endif #endif
private: private:
NGL::INGLLogger& m_logger; NGL::INGLLogger &m_logger;
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
void sendMessages(); void sendMessages();
#endif #endif
QWebSocket* m_socket; QWebSocket *m_socket;
QQueue<ReplyMessage*> m_messageQueue; QQueue<ReplyMessage *> m_messageQueue;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -9,13 +9,14 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
InvalidMessage::InvalidMessage(ReplyHandler* client, const QString& uuid, const QString& errorText) InvalidMessage::InvalidMessage(ReplyHandler *client, const QString &uuid, const QString &errorText)
: AbstractClientMessage(client, QString(), 1, uuid), m_errorText(errorText) : AbstractClientMessage(client, QString(), 1, uuid)
{ , m_errorText(errorText)
} {
}
void InvalidMessage::process() void InvalidMessage::process()
{ {
ErrorMessage::ErrorData errorData; ErrorMessage::ErrorData errorData;
errorData.errorClass = 1; errorData.errorClass = 1;
@@ -23,12 +24,12 @@ void InvalidMessage::process()
errorData.uuid = m_uuid; errorData.uuid = m_uuid;
m_client->addReply(new ErrorMessage(errorData)); m_client->addReply(new ErrorMessage(errorData));
} }
bool InvalidMessage::hasValidData() const bool InvalidMessage::hasValidData() const
{ {
return true; return true;
} }
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -11,12 +11,15 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
class LTSWEBSOCKETCOMMON_EXPORT AbstractClientMessage class LTSWEBSOCKETCOMMON_EXPORT AbstractClientMessage
{ {
public: public:
AbstractClientMessage(ReplyHandler* client, const QString& type, const int typeId, const QString& uuid, AbstractClientMessage(ReplyHandler *client, const QString &type, const int typeId, const QString &uuid, const QJsonValue &data = QJsonValue())
const QJsonValue& data = QJsonValue()) : m_type(type)
: m_type(type), m_typeId(typeId), m_uuid(uuid), m_data(data), m_client(client) , m_typeId(typeId)
, m_uuid(uuid)
, m_data(data)
, m_client(client)
{ {
} }
@@ -26,29 +29,26 @@ class LTSWEBSOCKETCOMMON_EXPORT AbstractClientMessage
virtual bool hasValidData() const = 0; virtual bool hasValidData() const = 0;
void reply(ReplyMessage* reply) void reply(ReplyMessage *reply) { m_client->addReply(reply); }
{
m_client->addReply(reply);
}
protected: protected:
const QString m_type; const QString m_type;
const int m_typeId; const int m_typeId;
const QString m_uuid; const QString m_uuid;
const QJsonValue m_data; const QJsonValue m_data;
ReplyHandler* m_client; ReplyHandler *m_client;
}; };
class LTSWEBSOCKETCOMMON_EXPORT InvalidMessage final : public AbstractClientMessage class LTSWEBSOCKETCOMMON_EXPORT InvalidMessage final : public AbstractClientMessage
{ {
public: public:
explicit InvalidMessage(ReplyHandler* client, const QString& uuid, const QString& errorText); explicit InvalidMessage(ReplyHandler *client, const QString &uuid, const QString &errorText);
void process() override; void process() override;
bool hasValidData() const override; bool hasValidData() const override;
private: private:
QString m_errorText; QString m_errorText;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -10,8 +10,8 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
QJsonParseError AbstractClientMessageFactory::parseMessage(const QString& message) QJsonParseError AbstractClientMessageFactory::parseMessage(const QString &message)
{ {
QJsonParseError error; QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8(), &error); QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8(), &error);
@@ -26,10 +26,10 @@ QJsonParseError AbstractClientMessageFactory::parseMessage(const QString& messag
m_uuid = obj.value(JsonKeys::UUID_()).toString(); m_uuid = obj.value(JsonKeys::UUID_()).toString();
return error; return error;
} }
AbstractClientMessage* AbstractClientMessageFactory::checkAttributes(ReplyHandler* client, const QString& message) const AbstractClientMessage *AbstractClientMessageFactory::checkAttributes(ReplyHandler *client, const QString &message) const
{ {
if (!m_uuid.isEmpty() && !m_type.isEmpty()) if (!m_uuid.isEmpty() && !m_type.isEmpty())
return nullptr; return nullptr;
if (m_uuid.isEmpty()) if (m_uuid.isEmpty())
@@ -39,11 +39,10 @@ AbstractClientMessage* AbstractClientMessageFactory::checkAttributes(ReplyHandle
} }
WARNING_LOG(m_logger) << "Got message no type: " << message << "'"; WARNING_LOG(m_logger) << "Got message no type: " << message << "'";
return new LtsWebSocket::InvalidMessage(client, m_uuid, QStringLiteral("Message has no type")); return new LtsWebSocket::InvalidMessage(client, m_uuid, QStringLiteral("Message has no type"));
} }
AbstractClientMessage* AbstractClientMessageFactory::checkResult(ReplyHandler* client, const QString& message, AbstractClientMessage *AbstractClientMessageFactory::checkResult(ReplyHandler *client, const QString &message, AbstractClientMessage *result) const
AbstractClientMessage* result) const {
{
if (result == nullptr) if (result == nullptr)
{ {
WARNING_LOG(m_logger) << "Could not parse message: " << message; WARNING_LOG(m_logger) << "Could not parse message: " << message;
@@ -58,6 +57,6 @@ AbstractClientMessage* AbstractClientMessageFactory::checkResult(ReplyHandler* c
} }
return result; return result;
} }
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -11,58 +11,55 @@
namespace NGL namespace NGL
{ {
class INGLLogger; class INGLLogger;
} }
namespace LtsWebSocket namespace LtsWebSocket
{ {
class LTSWEBSOCKETCOMMON_EXPORT AbstractClientMessageFactory class LTSWEBSOCKETCOMMON_EXPORT AbstractClientMessageFactory
{ {
public: public:
explicit AbstractClientMessageFactory(NGL::INGLLogger& logger) : m_logger(logger) {} explicit AbstractClientMessageFactory(NGL::INGLLogger &logger)
: m_logger(logger)
{
}
virtual ~AbstractClientMessageFactory() {} virtual ~AbstractClientMessageFactory() {}
QJsonParseError parseMessage(const QString& message); QJsonParseError parseMessage(const QString &message);
virtual AbstractClientMessage* createMessage(ReplyHandler* client, const QString& message) = 0; virtual AbstractClientMessage *createMessage(ReplyHandler *client, const QString &message) = 0;
protected: protected:
AbstractClientMessage* checkAttributes(ReplyHandler* client, const QString& message) const; AbstractClientMessage *checkAttributes(ReplyHandler *client, const QString &message) const;
AbstractClientMessage* checkResult(ReplyHandler* client, const QString& message, AbstractClientMessage *checkResult(ReplyHandler *client, const QString &message, AbstractClientMessage *result) const;
AbstractClientMessage* result) const;
protected: protected:
NGL::INGLLogger& m_logger; NGL::INGLLogger &m_logger;
QString m_type; QString m_type;
int m_typeId; int m_typeId;
QString m_uuid; QString m_uuid;
QJsonValue m_data; QJsonValue m_data;
}; };
class PongMessage final : public ReplyMessage class PongMessage final : public ReplyMessage
{ {
public: public:
static QString strPong() static QString strPong() { return QStringLiteral("pong"); }
static int idPong() { return 2; }
explicit PongMessage(const QString &payload)
: ReplyMessage(strPong(), idPong(), QString())
, m_payload(payload)
{ {
return QStringLiteral("pong");
} }
static int idPong() QString toJsonString() const override { return m_payload.isEmpty() ? strPong() : QStringLiteral("%1 %2").arg(strPong(), m_payload); }
{
return 2;
}
explicit PongMessage(const QString& payload) : ReplyMessage(strPong(), idPong(), QString()), m_payload(payload) {}
QString toJsonString() const override
{
return m_payload.isEmpty() ? strPong() : QStringLiteral("%1 %2").arg(strPong(), m_payload);
}
private: private:
QString m_payload; QString m_payload;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -12,8 +12,10 @@
using namespace LtsWebSocket; using namespace LtsWebSocket;
ConnectionHandler::ConnectionHandler(QObject* parent) ConnectionHandler::ConnectionHandler(QObject *parent)
: QObject(parent), m_logger(getLogger("LtsWebSocket.ConnectionHandler")), m_server(nullptr) : QObject(parent)
, m_logger(getLogger("LtsWebSocket.ConnectionHandler"))
, m_server(nullptr)
{ {
} }
@@ -26,7 +28,7 @@ ConnectionHandler::~ConnectionHandler()
} }
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
bool ConnectionHandler::init(const QString& serviceName, unsigned short port) bool ConnectionHandler::init(const QString &serviceName, unsigned short port)
{ {
if (m_server != nullptr) if (m_server != nullptr)
{ {
@@ -50,7 +52,7 @@ bool ConnectionHandler::init(const QString& serviceName, unsigned short port)
return true; return true;
} }
void ConnectionHandler::sendToAllClients(ReplyMessage* message) void ConnectionHandler::sendToAllClients(ReplyMessage *message)
{ {
for (auto connection : std::as_const(m_connections)) for (auto connection : std::as_const(m_connections))
connection->addReply(new ReplyMessage(*message)); connection->addReply(new ReplyMessage(*message));
@@ -67,11 +69,10 @@ void ConnectionHandler::onNewConnection()
{ {
while (m_server->hasPendingConnections()) while (m_server->hasPendingConnections())
{ {
QWebSocket* socket = m_server->nextPendingConnection(); QWebSocket *socket = m_server->nextPendingConnection();
ClientConnection* newConnection = new ClientConnection(socket, this); ClientConnection *newConnection = new ClientConnection(socket, this);
connect(newConnection, &ClientConnection::destroyed, this, connect(newConnection, &ClientConnection::destroyed, this, [this](QObject *o) { m_connections.remove(static_cast<ClientConnection *>(o)); });
[this](QObject* o) { m_connections.remove(static_cast<ClientConnection*>(o)); });
if (!newConnection->init()) if (!newConnection->init())
{ {
@@ -88,8 +89,7 @@ void ConnectionHandler::onNewConnection()
m_connections.insert(newConnection); m_connections.insert(newConnection);
emit clientConnected(newConnection); emit clientConnected(newConnection);
INFO_LOG(m_logger) << "New client connected ip: " << socket->localAddress().toString() << ":" INFO_LOG(m_logger) << "New client connected ip: " << socket->localAddress().toString() << ":" << socket->localPort();
<< socket->localPort();
} }
} }
#endif #endif
@@ -11,46 +11,52 @@
#include <QtWebSockets/QWebSocketServer> #include <QtWebSockets/QWebSocketServer>
#include <QtWebSockets/qwebsocketprotocol.h> #include <QtWebSockets/qwebsocketprotocol.h>
#else #else
namespace LtsWebSocket { class QWebSocketServerStub; } namespace LtsWebSocket
{
class QWebSocketServerStub;
}
using QWebSocketServer = LtsWebSocket::QWebSocketServerStub; using QWebSocketServer = LtsWebSocket::QWebSocketServerStub;
namespace QWebSocketProtocol { enum class CloseCode { NormalClosure = 1000 }; } namespace QWebSocketProtocol
{
enum class CloseCode
{
NormalClosure = 1000
};
}
#endif #endif
namespace LtsWebSocket namespace LtsWebSocket
{ {
class MessageHandler; class MessageHandler;
class ClientConnection; class ClientConnection;
class ReplyMessage; class ReplyMessage;
class ConnectionHandler : public QObject class ConnectionHandler : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit ConnectionHandler(QObject* parent = nullptr); explicit ConnectionHandler(QObject *parent = nullptr);
~ConnectionHandler(); ~ConnectionHandler();
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
bool init(const QString& serviceName, unsigned short port); bool init(const QString &serviceName, unsigned short port);
void sendToAllClients(ReplyMessage* message); void sendToAllClients(ReplyMessage *message);
unsigned short webSocketPort() unsigned short webSocketPort() { return m_server->serverPort(); }
{
return m_server->serverPort();
}
#else #else
bool init(const QString& /*serviceName*/, unsigned short /*port*/) { return false; } bool init(const QString & /*serviceName*/, unsigned short /*port*/) { return false; }
void sendToAllClients(ReplyMessage* /*message*/) {} void sendToAllClients(ReplyMessage * /*message*/) {}
unsigned short webSocketPort() { return 0; } unsigned short webSocketPort() { return 0; }
#endif #endif
signals: signals:
void newTextMessageFromClient(ClientConnection* client, const QString& message); void newTextMessageFromClient(ClientConnection *client, const QString &message);
void clientDisconnected(ClientConnection* client); void clientDisconnected(ClientConnection *client);
void clientConnected(ClientConnection* client); void clientConnected(ClientConnection *client);
private slots: private slots:
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
@@ -59,12 +65,12 @@ class ConnectionHandler : public QObject
#endif #endif
private: private:
NGL::INGLLogger& m_logger; NGL::INGLLogger &m_logger;
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
QWebSocketServer* m_server; QWebSocketServer *m_server;
#else #else
void* m_server; void *m_server;
#endif #endif
QSet<ClientConnection*> m_connections; QSet<ClientConnection *> m_connections;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -9,15 +9,16 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
template <typename T> class DataManagerBaseDl template <typename T> class DataManagerBaseDl
{ {
protected: protected:
explicit DataManagerBaseDl(const std::shared_ptr<T>& dbInterface, NGL::INGLLogger& logger) explicit DataManagerBaseDl(const std::shared_ptr<T> &dbInterface, NGL::INGLLogger &logger)
: m_logger(logger), m_dbInterface(dbInterface) : m_logger(logger)
, m_dbInterface(dbInterface)
{ {
} }
template <typename DbType, typename MessageType> ReplyMessage* toBaseDataMessageFromDb(const QString& uuid) const template <typename DbType, typename MessageType> ReplyMessage *toBaseDataMessageFromDb(const QString &uuid) const
{ {
QVector<DbType> dataVec; QVector<DbType> dataVec;
@@ -37,5 +38,5 @@ template <typename T> class DataManagerBaseDl
protected: protected:
NGL::INGLLogger &m_logger; NGL::INGLLogger &m_logger;
std::shared_ptr<T> m_dbInterface; std::shared_ptr<T> m_dbInterface;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -7,42 +7,42 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
namespace JsonKeys namespace JsonKeys
{ {
inline QString DATA() inline QString DATA()
{ {
return QStringLiteral("data"); return QStringLiteral("data");
} }
inline QString UUID_() inline QString UUID_()
{ {
return QStringLiteral("uuid"); return QStringLiteral("uuid");
} }
inline QString TYPE() inline QString TYPE()
{ {
return QStringLiteral("type"); return QStringLiteral("type");
} }
inline QString TYPEID() inline QString TYPEID()
{ {
return QStringLiteral("typeId"); return QStringLiteral("typeId");
} }
inline QString ERROR_() inline QString ERROR_()
{ {
return QStringLiteral("error"); return QStringLiteral("error");
} }
inline QString ERROR_MESSAGE() inline QString ERROR_MESSAGE()
{ {
return QStringLiteral("errorMessage"); return QStringLiteral("errorMessage");
} }
inline QString ERROR_CLASS() inline QString ERROR_CLASS()
{ {
return QStringLiteral("errorClass"); return QStringLiteral("errorClass");
} }
} // namespace JsonKeys } // namespace JsonKeys
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -7,8 +7,8 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
LOGGER_T getLogger(const char* name) LOGGER_T getLogger(const char *name)
{ {
static const char ns[] = "Lts.WebSocket."; static const char ns[] = "Lts.WebSocket.";
std::string loggerName; std::string loggerName;
const size_t len = strlen(name); const size_t len = strlen(name);
@@ -20,11 +20,11 @@ LOGGER_T getLogger(const char* name)
{ {
return NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger(loggerName); return NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger(loggerName);
} }
catch (const std::exception& ex) catch (const std::exception &ex)
{ {
fprintf(stderr, "Error retrieving logger: %s", ex.what()); fprintf(stderr, "Error retrieving logger: %s", ex.what());
abort(); abort();
} }
} }
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -8,12 +8,12 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
typedef NGL::INGLLogger& LOGGER_T; typedef NGL::INGLLogger &LOGGER_T;
LTSWEBSOCKETCOMMON_EXPORT LOGGER_T getLogger(const char* name); LTSWEBSOCKETCOMMON_EXPORT LOGGER_T getLogger(const char *name);
inline LOGGER_T getLogger(const QString& loggerName) inline LOGGER_T getLogger(const QString &loggerName)
{ {
return getLogger(loggerName.toUtf8().constData()); return getLogger(loggerName.toUtf8().constData());
} }
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -10,56 +10,57 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
class WebSocketHelper : public QObject class WebSocketHelper : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
WebSocketHelper(AbstractClientMessageFactory* messageFactory, LtsWebSocketClient* webSocketClient, WebSocketHelper(AbstractClientMessageFactory *messageFactory, LtsWebSocketClient *webSocketClient, NGL::INGLLogger &logger);
NGL::INGLLogger& logger);
~WebSocketHelper(); ~WebSocketHelper();
public Q_SLOTS: public Q_SLOTS:
void doOpen(const QString& hostname, const unsigned short port); void doOpen(const QString &hostname, const unsigned short port);
void doClose(); void doClose();
void doSendTextMessage(const QString& msg); void doSendTextMessage(const QString &msg);
void onConnected(); void onConnected();
void onDisconnected(); void onDisconnected();
void onError(QAbstractSocket::SocketError error); void onError(QAbstractSocket::SocketError error);
void parseMessage(const QString& message); void parseMessage(const QString &message);
Q_SIGNALS: Q_SIGNALS:
void messageParsed(AbstractClientMessage* clientMessage); void messageParsed(AbstractClientMessage *clientMessage);
void connected(); void connected();
void disconnected(); void disconnected();
void dataReceived(); void dataReceived();
void error(QAbstractSocket::SocketError); void error(QAbstractSocket::SocketError);
private: private:
AbstractClientMessageFactory* m_messageFactory; AbstractClientMessageFactory *m_messageFactory;
LtsWebSocketClient* m_webSocketClient; LtsWebSocketClient *m_webSocketClient;
QWebSocket* m_socket; QWebSocket *m_socket;
NGL::INGLLogger& m_logger; NGL::INGLLogger &m_logger;
}; };
WebSocketHelper::WebSocketHelper(AbstractClientMessageFactory* messageFactory, LtsWebSocketClient* webSocketClient, WebSocketHelper::WebSocketHelper(AbstractClientMessageFactory *messageFactory, LtsWebSocketClient *webSocketClient, NGL::INGLLogger &logger)
NGL::INGLLogger& logger) : QObject()
: QObject(), m_messageFactory(messageFactory), m_webSocketClient(webSocketClient), , m_messageFactory(messageFactory)
m_socket(new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this)), m_logger(logger) , m_webSocketClient(webSocketClient)
{ , m_socket(new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this))
, m_logger(logger)
{
connect(m_socket, &QWebSocket::textMessageReceived, this, &WebSocketHelper::parseMessage); connect(m_socket, &QWebSocket::textMessageReceived, this, &WebSocketHelper::parseMessage);
connect(m_socket, &QWebSocket::textFrameReceived, this, &WebSocketHelper::dataReceived); connect(m_socket, &QWebSocket::textFrameReceived, this, &WebSocketHelper::dataReceived);
connect(m_socket, &QWebSocket::connected, this, &WebSocketHelper::onConnected); connect(m_socket, &QWebSocket::connected, this, &WebSocketHelper::onConnected);
connect(m_socket, &QWebSocket::disconnected, this, &WebSocketHelper::onDisconnected); connect(m_socket, &QWebSocket::disconnected, this, &WebSocketHelper::onDisconnected);
connect(m_socket, &QWebSocket::errorOccurred, this, &WebSocketHelper::error); connect(m_socket, &QWebSocket::errorOccurred, this, &WebSocketHelper::error);
} }
WebSocketHelper::~WebSocketHelper() WebSocketHelper::~WebSocketHelper()
{ {
m_socket->close(); m_socket->close();
delete m_socket; delete m_socket;
} }
void WebSocketHelper::doOpen(const QString& hostname, const unsigned short port) void WebSocketHelper::doOpen(const QString &hostname, const unsigned short port)
{ {
const QUrl url(QStringLiteral("ws://%1:%2/").arg(hostname).arg(port)); const QUrl url(QStringLiteral("ws://%1:%2/").arg(hostname).arg(port));
if (m_socket->state() == QAbstractSocket::SocketState::ConnectedState) if (m_socket->state() == QAbstractSocket::SocketState::ConnectedState)
@@ -75,16 +76,16 @@ void WebSocketHelper::doOpen(const QString& hostname, const unsigned short port)
INFO_LOG(m_logger) << "Opening web socket to url: " << url.toDisplayString(); INFO_LOG(m_logger) << "Opening web socket to url: " << url.toDisplayString();
m_socket->open(url); m_socket->open(url);
} }
void WebSocketHelper::doClose() void WebSocketHelper::doClose()
{ {
INFO_LOG(m_logger) << "Closing web socket to url:" << m_socket->requestUrl().toDisplayString(); INFO_LOG(m_logger) << "Closing web socket to url:" << m_socket->requestUrl().toDisplayString();
m_socket->close(); m_socket->close();
} }
void WebSocketHelper::doSendTextMessage(const QString& msg) void WebSocketHelper::doSendTextMessage(const QString &msg)
{ {
if (!m_socket || m_socket->state() != QAbstractSocket::ConnectedState) if (!m_socket || m_socket->state() != QAbstractSocket::ConnectedState)
{ {
ERROR_LOG(m_logger) << "Message could not be send, socket is not connected."; ERROR_LOG(m_logger) << "Message could not be send, socket is not connected.";
@@ -92,29 +93,28 @@ void WebSocketHelper::doSendTextMessage(const QString& msg)
} }
DEBUG_LOG(m_logger) << "Sending message: " << msg; DEBUG_LOG(m_logger) << "Sending message: " << msg;
m_socket->sendTextMessage(msg); m_socket->sendTextMessage(msg);
} }
void WebSocketHelper::onConnected() void WebSocketHelper::onConnected()
{ {
INFO_LOG(m_logger) << "Connected to server url: " << m_socket->requestUrl().toDisplayString() INFO_LOG(m_logger) << "Connected to server url: " << m_socket->requestUrl().toDisplayString() << " using local port: " << m_socket->localPort();
<< " using local port: " << m_socket->localPort();
emit connected(); emit connected();
} }
void WebSocketHelper::onDisconnected() void WebSocketHelper::onDisconnected()
{ {
INFO_LOG(m_logger) << "Disconnected from server url: " << m_socket->requestUrl().toDisplayString(); INFO_LOG(m_logger) << "Disconnected from server url: " << m_socket->requestUrl().toDisplayString();
emit disconnected(); emit disconnected();
} }
void WebSocketHelper::onError(QAbstractSocket::SocketError error) void WebSocketHelper::onError(QAbstractSocket::SocketError error)
{ {
ERROR_LOG(m_logger) << "Error occured: " << error << " closing socket."; ERROR_LOG(m_logger) << "Error occured: " << error << " closing socket.";
m_socket->close(); m_socket->close();
} }
void WebSocketHelper::parseMessage(const QString& message) void WebSocketHelper::parseMessage(const QString &message)
{ {
const QString pingMsg(QStringLiteral("ping")); const QString pingMsg(QStringLiteral("ping"));
if (message.startsWith(pingMsg)) if (message.startsWith(pingMsg))
{ {
@@ -122,26 +122,25 @@ void WebSocketHelper::parseMessage(const QString& message)
return; return;
} }
AbstractClientMessage* clientMessage = nullptr; AbstractClientMessage *clientMessage = nullptr;
auto result = m_messageFactory->parseMessage(message); auto result = m_messageFactory->parseMessage(message);
if (QJsonParseError::NoError == result.error) if (QJsonParseError::NoError == result.error)
clientMessage = m_messageFactory->createMessage(m_webSocketClient, message); clientMessage = m_messageFactory->createMessage(m_webSocketClient, message);
else else
{ {
WARNING_LOG(m_logger) << "Could not parse incoming message: '" << message WARNING_LOG(m_logger) << "Could not parse incoming message: '" << message << "', error: " << result.errorString();
<< "', error: " << result.errorString(); clientMessage = new InvalidMessage(m_webSocketClient, QString(), QStringLiteral("Got message which is not JSON conform (%1)").arg(result.errorString()));
clientMessage =
new InvalidMessage(m_webSocketClient, QString(),
QStringLiteral("Got message which is not JSON conform (%1)").arg(result.errorString()));
} }
if (clientMessage) if (clientMessage)
emit messageParsed(clientMessage); emit messageParsed(clientMessage);
} }
LtsWebSocketClient::LtsWebSocketClient(AbstractClientMessageFactory* messageFactory, QObject* parent) LtsWebSocketClient::LtsWebSocketClient(AbstractClientMessageFactory *messageFactory, QObject *parent)
: QObject(parent), m_logger(getLogger("LtsWebSocketClient")), m_messageFactory(messageFactory), : QObject(parent)
m_webSocketHelperThread(new QThread(this)) , m_logger(getLogger("LtsWebSocketClient"))
{ , m_messageFactory(messageFactory)
, m_webSocketHelperThread(new QThread(this))
{
m_webSocketHelper = new WebSocketHelper(m_messageFactory, this, m_logger); m_webSocketHelper = new WebSocketHelper(m_messageFactory, this, m_logger);
m_webSocketHelper->moveToThread(m_webSocketHelperThread); m_webSocketHelper->moveToThread(m_webSocketHelperThread);
m_webSocketHelperThread->start(); m_webSocketHelperThread->start();
@@ -154,40 +153,40 @@ LtsWebSocketClient::LtsWebSocketClient(AbstractClientMessageFactory* messageFact
connect(this, &LtsWebSocketClient::onOpen, m_webSocketHelper, &WebSocketHelper::doOpen); connect(this, &LtsWebSocketClient::onOpen, m_webSocketHelper, &WebSocketHelper::doOpen);
connect(this, &LtsWebSocketClient::onClose, m_webSocketHelper, &WebSocketHelper::doClose); connect(this, &LtsWebSocketClient::onClose, m_webSocketHelper, &WebSocketHelper::doClose);
connect(this, &LtsWebSocketClient::onSendTextMessage, m_webSocketHelper, &WebSocketHelper::doSendTextMessage); connect(this, &LtsWebSocketClient::onSendTextMessage, m_webSocketHelper, &WebSocketHelper::doSendTextMessage);
} }
LtsWebSocketClient::~LtsWebSocketClient() LtsWebSocketClient::~LtsWebSocketClient()
{ {
m_webSocketHelper->disconnect(this); m_webSocketHelper->disconnect(this);
m_webSocketHelperThread->quit(); m_webSocketHelperThread->quit();
m_webSocketHelperThread->wait(); m_webSocketHelperThread->wait();
delete m_webSocketHelper; delete m_webSocketHelper;
} }
void LtsWebSocketClient::open(const QString& hostname, const unsigned short port) void LtsWebSocketClient::open(const QString &hostname, const unsigned short port)
{ {
emit onOpen(hostname, port); emit onOpen(hostname, port);
} }
void LtsWebSocketClient::close() void LtsWebSocketClient::close()
{ {
emit onClose(); emit onClose();
} }
void LtsWebSocketClient::addReply(ReplyMessage* message) void LtsWebSocketClient::addReply(ReplyMessage *message)
{ {
const QString msg(message->toJsonString()); const QString msg(message->toJsonString());
emit onSendTextMessage(msg); emit onSendTextMessage(msg);
delete message; delete message;
} }
void LtsWebSocketClient::onNewClientMessage(AbstractClientMessage* clientMessage) void LtsWebSocketClient::onNewClientMessage(AbstractClientMessage *clientMessage)
{ {
if (!clientMessage) if (!clientMessage)
return; return;
clientMessage->process(); clientMessage->process();
delete clientMessage; delete clientMessage;
} }
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -13,20 +13,22 @@ class QThread;
namespace LtsWebSocket namespace LtsWebSocket
{ {
class WebSocketHelper; class WebSocketHelper;
class LTSWEBSOCKETCLIENT_EXPORT LtsWebSocketClient : public QObject, public ReplyHandler class LTSWEBSOCKETCLIENT_EXPORT LtsWebSocketClient
{ : public QObject
, public ReplyHandler
{
Q_OBJECT Q_OBJECT
public: public:
explicit LtsWebSocketClient(AbstractClientMessageFactory* messageFactory, QObject* parent = nullptr); explicit LtsWebSocketClient(AbstractClientMessageFactory *messageFactory, QObject *parent = nullptr);
~LtsWebSocketClient(); ~LtsWebSocketClient();
void open(const QString& hostname, const unsigned short port); void open(const QString &hostname, const unsigned short port);
void close(); void close();
void addReply(ReplyMessage* message) override; void addReply(ReplyMessage *message) override;
signals: signals:
void connected(); void connected();
@@ -35,18 +37,18 @@ class LTSWEBSOCKETCLIENT_EXPORT LtsWebSocketClient : public QObject, public Repl
private slots: private slots:
void onNewClientMessage(AbstractClientMessage* clientMessage); void onNewClientMessage(AbstractClientMessage *clientMessage);
signals: signals:
void onOpen(const QString& hostname, const unsigned short port); void onOpen(const QString &hostname, const unsigned short port);
void onClose(); void onClose();
void onSendTextMessage(const QString& msg); void onSendTextMessage(const QString &msg);
private: private:
NGL::INGLLogger& m_logger; NGL::INGLLogger &m_logger;
AbstractClientMessageFactory* m_messageFactory; AbstractClientMessageFactory *m_messageFactory;
QThread* m_webSocketHelperThread; QThread *m_webSocketHelperThread;
WebSocketHelper* m_webSocketHelper; WebSocketHelper *m_webSocketHelper;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
@@ -11,43 +11,43 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
LtsWebSocketServer::LtsWebSocketServer(AbstractClientMessageFactory* messageFactory, QObject* parent) LtsWebSocketServer::LtsWebSocketServer(AbstractClientMessageFactory *messageFactory, QObject *parent)
: QObject(parent), m_queueTimer(new QTimer(this)), m_messageFactory(messageFactory), m_connectionHandler(nullptr), : QObject(parent)
m_logger(getLogger("LtsWebSocket.Server")) , m_queueTimer(new QTimer(this))
{ , m_messageFactory(messageFactory)
, m_connectionHandler(nullptr)
, m_logger(getLogger("LtsWebSocket.Server"))
{
connect(m_queueTimer, &QTimer::timeout, this, &LtsWebSocketServer::onQueueTimerTimeout); connect(m_queueTimer, &QTimer::timeout, this, &LtsWebSocketServer::onQueueTimerTimeout);
m_queueTimer->setSingleShot(true); m_queueTimer->setSingleShot(true);
} }
LtsWebSocketServer::~LtsWebSocketServer() = default; LtsWebSocketServer::~LtsWebSocketServer() = default;
bool LtsWebSocketServer::init(const QString& serviceName, const unsigned short port) bool LtsWebSocketServer::init(const QString &serviceName, const unsigned short port)
{ {
m_connectionHandler.reset(new ConnectionHandler(this)); m_connectionHandler.reset(new ConnectionHandler(this));
if (!m_connectionHandler->init(serviceName, port)) if (!m_connectionHandler->init(serviceName, port))
{ {
ERROR_LOG(m_logger) << "Could not init m_connectionHandler with servicename: " << serviceName ERROR_LOG(m_logger) << "Could not init m_connectionHandler with servicename: " << serviceName
<< ((port == 0) ? QStringLiteral(" random port") << ((port == 0) ? QStringLiteral(" random port") : QStringLiteral(" port: ") + QString::number(port));
: QStringLiteral(" port: ") + QString::number(port));
m_connectionHandler.reset(); m_connectionHandler.reset();
return false; return false;
} }
connect(m_connectionHandler.get(), &ConnectionHandler::newTextMessageFromClient, this, connect(m_connectionHandler.get(), &ConnectionHandler::newTextMessageFromClient, this, &LtsWebSocketServer::onNewTextMessage);
&LtsWebSocketServer::onNewTextMessage); connect(m_connectionHandler.get(), &ConnectionHandler::clientDisconnected, this, &LtsWebSocketServer::clientDisconnected);
connect(m_connectionHandler.get(), &ConnectionHandler::clientDisconnected, this,
&LtsWebSocketServer::clientDisconnected);
connect(m_connectionHandler.get(), &ConnectionHandler::clientConnected, this, &LtsWebSocketServer::clientConnected); connect(m_connectionHandler.get(), &ConnectionHandler::clientConnected, this, &LtsWebSocketServer::clientConnected);
m_queueTimer->start(m_messageDelay); m_queueTimer->start(m_messageDelay);
return true; return true;
} }
bool LtsWebSocketServer::init(const QString& serviceName, const QPair<quint16, quint16>& portRange) bool LtsWebSocketServer::init(const QString &serviceName, const QPair<quint16, quint16> &portRange)
{ {
if (portRange.first < 1025 || portRange.first > portRange.second) if (portRange.first < 1025 || portRange.first > portRange.second)
return init(serviceName); return init(serviceName);
@@ -58,26 +58,26 @@ bool LtsWebSocketServer::init(const QString& serviceName, const QPair<quint16, q
} }
return init(serviceName); return init(serviceName);
} }
void LtsWebSocketServer::sendToAllClients(ReplyMessage* message) void LtsWebSocketServer::sendToAllClients(ReplyMessage *message)
{ {
DEBUG_LOG(m_logger) << "Sending message to all clients: " << message->toJsonString(); DEBUG_LOG(m_logger) << "Sending message to all clients: " << message->toJsonString();
m_connectionHandler->sendToAllClients(message); m_connectionHandler->sendToAllClients(message);
} }
unsigned short LtsWebSocketServer::webSocketPort() const unsigned short LtsWebSocketServer::webSocketPort() const
{ {
return m_connectionHandler->webSocketPort(); return m_connectionHandler->webSocketPort();
} }
void LtsWebSocketServer::setMessageDelay(qint32 delay) void LtsWebSocketServer::setMessageDelay(qint32 delay)
{ {
m_messageDelay = delay; m_messageDelay = delay;
} }
void LtsWebSocketServer::onNewTextMessage(ReplyHandler* client, const QString& message) void LtsWebSocketServer::onNewTextMessage(ReplyHandler *client, const QString &message)
{ {
const QString pingMsg(QStringLiteral("ping")); const QString pingMsg(QStringLiteral("ping"));
if (message.startsWith(pingMsg)) if (message.startsWith(pingMsg))
{ {
@@ -90,26 +90,24 @@ void LtsWebSocketServer::onNewTextMessage(ReplyHandler* client, const QString& m
if (!m_queueTimer->isActive()) if (!m_queueTimer->isActive())
m_queueTimer->start(m_messageDelay); m_queueTimer->start(m_messageDelay);
} }
void LtsWebSocketServer::onQueueTimerTimeout() void LtsWebSocketServer::onQueueTimerTimeout()
{ {
if (m_messageQueue.isEmpty()) if (m_messageQueue.isEmpty())
return; return;
MessageCredentials credentials = m_messageQueue.takeFirst(); MessageCredentials credentials = m_messageQueue.takeFirst();
AbstractClientMessage* clientMessage = nullptr; AbstractClientMessage *clientMessage = nullptr;
auto result = m_messageFactory->parseMessage(credentials.message); auto result = m_messageFactory->parseMessage(credentials.message);
if (QJsonParseError::NoError == result.error) if (QJsonParseError::NoError == result.error)
clientMessage = m_messageFactory->createMessage(credentials.client, credentials.message); clientMessage = m_messageFactory->createMessage(credentials.client, credentials.message);
else else
{ {
WARNING_LOG(m_logger) << "Could not parse incoming message: '" << credentials.message WARNING_LOG(m_logger) << "Could not parse incoming message: '" << credentials.message << "', error: " << result.errorString();
<< "', error: " << result.errorString();
clientMessage = clientMessage = new InvalidMessage(credentials.client, QString(), QStringLiteral("Got message which is not JSON conform"));
new InvalidMessage(credentials.client, QString(), QStringLiteral("Got message which is not JSON conform"));
} }
if (clientMessage) if (clientMessage)
@@ -118,7 +116,7 @@ void LtsWebSocketServer::onQueueTimerTimeout()
delete clientMessage; delete clientMessage;
m_queueTimer->start(m_messageDelay); m_queueTimer->start(m_messageDelay);
} }
} // namespace LtsWebSocket } // namespace LtsWebSocket
#else #else
@@ -126,12 +124,14 @@ void LtsWebSocketServer::onQueueTimerTimeout()
namespace LtsWebSocket namespace LtsWebSocket
{ {
LtsWebSocketServer::LtsWebSocketServer(AbstractClientMessageFactory* /*messageFactory*/, QObject* parent) LtsWebSocketServer::LtsWebSocketServer(AbstractClientMessageFactory * /*messageFactory*/, QObject *parent)
: QObject(parent), m_queueTimer(new QTimer(this)), m_logger(getLogger("LtsWebSocket.Server")) : QObject(parent)
{ , m_queueTimer(new QTimer(this))
} , m_logger(getLogger("LtsWebSocket.Server"))
{
}
LtsWebSocketServer::~LtsWebSocketServer() = default; LtsWebSocketServer::~LtsWebSocketServer() = default;
} // namespace LtsWebSocket } // namespace LtsWebSocket
#endif #endif
@@ -15,83 +15,87 @@ class QTimer;
#ifdef QT6_WEBSOCKETS_AVAILABLE #ifdef QT6_WEBSOCKETS_AVAILABLE
namespace LtsWebSocket namespace LtsWebSocket
{ {
class ConnectionHandler; class ConnectionHandler;
class ClientConnection; class ClientConnection;
class LTSWEBSOCKETSERVER_EXPORT LtsWebSocketServer : public QObject class LTSWEBSOCKETSERVER_EXPORT LtsWebSocketServer : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LtsWebSocketServer(AbstractClientMessageFactory* messageFactory, QObject* parent = nullptr); explicit LtsWebSocketServer(AbstractClientMessageFactory *messageFactory, QObject *parent = nullptr);
virtual ~LtsWebSocketServer(); virtual ~LtsWebSocketServer();
bool init(const QString& serviceName, const unsigned short port = 0); bool init(const QString &serviceName, const unsigned short port = 0);
bool init(const QString& serviceName, const QPair<quint16, quint16>& portRange); bool init(const QString &serviceName, const QPair<quint16, quint16> &portRange);
void sendToAllClients(ReplyMessage* message); void sendToAllClients(ReplyMessage *message);
unsigned short webSocketPort() const; unsigned short webSocketPort() const;
void setMessageDelay(qint32 delay); void setMessageDelay(qint32 delay);
signals: signals:
void clientDisconnected(ClientConnection* client); void clientDisconnected(ClientConnection *client);
void clientConnected(ClientConnection* client); void clientConnected(ClientConnection *client);
private slots: private slots:
void onNewTextMessage(ReplyHandler* client, const QString& message); void onNewTextMessage(ReplyHandler *client, const QString &message);
void onQueueTimerTimeout(); void onQueueTimerTimeout();
private: private:
struct MessageCredentials struct MessageCredentials
{ {
ReplyHandler* client{nullptr}; ReplyHandler *client{nullptr};
QString message; QString message;
MessageCredentials(ReplyHandler* client, const QString& message) : client(client), message(message) {} MessageCredentials(ReplyHandler *client, const QString &message)
: client(client)
, message(message)
{
}
}; };
QQueue<MessageCredentials> m_messageQueue; QQueue<MessageCredentials> m_messageQueue;
QTimer* m_queueTimer{nullptr}; QTimer *m_queueTimer{nullptr};
AbstractClientMessageFactory* m_messageFactory{nullptr}; AbstractClientMessageFactory *m_messageFactory{nullptr};
std::unique_ptr<ConnectionHandler> m_connectionHandler; std::unique_ptr<ConnectionHandler> m_connectionHandler;
qint32 m_messageDelay{0}; qint32 m_messageDelay{0};
LOGGER_T m_logger; LOGGER_T m_logger;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
#else #else
#include <QtCore/QTimer> #include <QtCore/QTimer>
namespace LtsWebSocket namespace LtsWebSocket
{ {
class LTSWEBSOCKETSERVER_EXPORT LtsWebSocketServer : public QObject class LTSWEBSOCKETSERVER_EXPORT LtsWebSocketServer : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit LtsWebSocketServer(AbstractClientMessageFactory* /*messageFactory*/, QObject* parent = nullptr); explicit LtsWebSocketServer(AbstractClientMessageFactory * /*messageFactory*/, QObject *parent = nullptr);
virtual ~LtsWebSocketServer(); virtual ~LtsWebSocketServer();
bool init(const QString& /*serviceName*/, const unsigned short /*port*/ = 0) { return false; } bool init(const QString & /*serviceName*/, const unsigned short /*port*/ = 0) { return false; }
bool init(const QString& /*serviceName*/, const QPair<quint16, quint16>& /*portRange*/) { return false; } bool init(const QString & /*serviceName*/, const QPair<quint16, quint16> & /*portRange*/) { return false; }
void sendToAllClients(ReplyMessage* /*message*/) {} void sendToAllClients(ReplyMessage * /*message*/) {}
unsigned short webSocketPort() const { return 0; } unsigned short webSocketPort() const { return 0; }
void setMessageDelay(qint32 /*delay*/) {} void setMessageDelay(qint32 /*delay*/) {}
signals: signals:
void clientDisconnected(void* /*client*/); void clientDisconnected(void * /*client*/);
void clientConnected(void* /*client*/); void clientConnected(void * /*client*/);
private slots: private slots:
void onNewTextMessage(void* /*client*/, const QString& /*message*/) {} void onNewTextMessage(void * /*client*/, const QString & /*message*/) {}
void onQueueTimerTimeout() {} void onQueueTimerTimeout() {}
private: private:
QTimer* m_queueTimer{nullptr}; QTimer *m_queueTimer{nullptr};
LOGGER_T m_logger; LOGGER_T m_logger;
}; };
} // namespace LtsWebSocket } // namespace LtsWebSocket
#endif #endif
@@ -5,9 +5,9 @@
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#if defined(LTSWEBSOCKETCOMMON_LIBRARY) #if defined(LTSWEBSOCKETCOMMON_LIBRARY)
#define LTSWEBSOCKETCOMMON_EXPORT Q_DECL_EXPORT #define LTSWEBSOCKETCOMMON_EXPORT Q_DECL_EXPORT
#else #else
#define LTSWEBSOCKETCOMMON_EXPORT Q_DECL_IMPORT #define LTSWEBSOCKETCOMMON_EXPORT Q_DECL_IMPORT
#endif #endif
#endif // LTSWEBSOCKETCOMMON_EXPORT_H #endif // LTSWEBSOCKETCOMMON_EXPORT_H
@@ -4,9 +4,9 @@
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#if defined(LTSWEBSOCKETSERVER_LIBRARY) #if defined(LTSWEBSOCKETSERVER_LIBRARY)
# define LTSWEBSOCKETSERVER_EXPORT Q_DECL_EXPORT #define LTSWEBSOCKETSERVER_EXPORT Q_DECL_EXPORT
#else #else
# define LTSWEBSOCKETSERVER_EXPORT Q_DECL_IMPORT #define LTSWEBSOCKETSERVER_EXPORT Q_DECL_IMPORT
#endif #endif
#endif // LTSWEBSOCKETSERVER_EXPORT_H #endif // LTSWEBSOCKETSERVER_EXPORT_H
@@ -2,11 +2,11 @@
namespace LtsWebSocketServer namespace LtsWebSocketServer
{ {
class ReplyMessage; class ReplyMessage;
class MessageHandler class MessageHandler
{ {
public: public:
virtual void addMessage(ReplyMessage* message) = 0; virtual void addMessage(ReplyMessage *message) = 0;
}; };
} // namespace LtsWebSocketServer } // namespace LtsWebSocketServer
@@ -9,26 +9,26 @@
namespace LtsWebSocket namespace LtsWebSocket
{ {
QString ReplyMessage::toJsonString() const QString ReplyMessage::toJsonString() const
{ {
return QString::fromUtf8(QJsonDocument(m_jsonRepresentation).toJson(QJsonDocument::Compact)); return QString::fromUtf8(QJsonDocument(m_jsonRepresentation).toJson(QJsonDocument::Compact));
} }
ReplyMessage::ReplyMessage(const QString& type, const int typeId, const QString& uuid) ReplyMessage::ReplyMessage(const QString &type, const int typeId, const QString &uuid)
{ {
m_jsonRepresentation.insert(JsonKeys::TYPE(), type); m_jsonRepresentation.insert(JsonKeys::TYPE(), type);
m_jsonRepresentation.insert(JsonKeys::TYPEID(), typeId); m_jsonRepresentation.insert(JsonKeys::TYPEID(), typeId);
if (!uuid.isEmpty()) if (!uuid.isEmpty())
m_jsonRepresentation.insert(JsonKeys::UUID_(), uuid); m_jsonRepresentation.insert(JsonKeys::UUID_(), uuid);
} }
ErrorMessage::ErrorMessage(const ErrorMessage::ErrorData& data) ErrorMessage::ErrorMessage(const ErrorMessage::ErrorData &data)
: ReplyMessage(JsonKeys::ERROR_(), -1, QUuid::createUuid().toString()) : ReplyMessage(JsonKeys::ERROR_(), -1, QUuid::createUuid().toString())
{ {
m_jsonRepresentation.insert(JsonKeys::DATA(), QJsonObject({{JsonKeys::UUID_(), data.uuid}, m_jsonRepresentation.insert(JsonKeys::DATA(),
{JsonKeys::ERROR_CLASS(), data.errorClass}, QJsonObject(
{JsonKeys::ERROR_MESSAGE(), data.errorMessage}})); {{JsonKeys::UUID_(), data.uuid}, {JsonKeys::ERROR_CLASS(), data.errorClass}, {JsonKeys::ERROR_MESSAGE(), data.errorMessage}}));
} }
} // namespace LtsWebSocket } // namespace LtsWebSocket
Loaded 100 of 381 files, more files were not shown because too many files have changed in this diff. Show more