diff --git a/libnymea-core/jsonrpc/configurationhandler.cpp b/libnymea-core/jsonrpc/configurationhandler.cpp index f78332be..3c7134eb 100644 --- a/libnymea-core/jsonrpc/configurationhandler.cpp +++ b/libnymea-core/jsonrpc/configurationhandler.cpp @@ -108,6 +108,11 @@ ConfigurationHandler::ConfigurationHandler(QObject *parent): basicConfiguration.insert("d:serverTime", enumValueName(Uint)); basicConfiguration.insert("d:timeZone", enumValueName(String)); basicConfiguration.insert("d:language", enumValueName(String)); + QVariantMap location; + location.insert("latitude", enumValueName(Double)); + location.insert("longitude", enumValueName(Double)); + location.insert("name", enumValueName(String)); + basicConfiguration.insert("d:location", location); basicConfiguration.insert("debugServerEnabled", enumValueName(Bool)); returns.insert("basicConfiguration", basicConfiguration); QVariantList tcpServerConfigurations; @@ -144,6 +149,12 @@ ConfigurationHandler::ConfigurationHandler(QObject *parent): returns.insert("configurationError", enumRef()); registerMethod("SetLanguage", description, params, returns, Types::PermissionScopeAdmin, "Use the locale property in the Handshake message instead."); + params.clear(); returns.clear(); + description = "Sets the server location."; + params.insert("location", location); + returns.insert("configurationError", enumRef()); + registerMethod("SetLocation", description, params, returns, Types::PermissionScopeAdmin); + params.clear(); returns.clear(); description = "Enable or disable the debug server."; params.insert("enabled", enumValueName(String)); @@ -306,6 +317,7 @@ ConfigurationHandler::ConfigurationHandler(QObject *parent): connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::serverNameChanged, this, &ConfigurationHandler::onBasicConfigurationChanged); connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::timeZoneChanged, this, &ConfigurationHandler::onBasicConfigurationChanged); + connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::locationChanged, this, &ConfigurationHandler::onBasicConfigurationChanged); connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::localeChanged, this, &ConfigurationHandler::onBasicConfigurationChanged); connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::debugServerEnabledChanged, this, &ConfigurationHandler::onBasicConfigurationChanged); connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::localeChanged, this, &ConfigurationHandler::onLanguageChanged); @@ -423,6 +435,16 @@ JsonReply *ConfigurationHandler::SetLanguage(const QVariantMap ¶ms) const return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError)); } +JsonReply *ConfigurationHandler::SetLocation(const QVariantMap ¶ms) const +{ + QVariantMap locationMap = params.value("location").toMap(); + double latitude = locationMap.value("latitude").toDouble(); + double longitude = locationMap.value("longitude").toDouble(); + QString name = locationMap.value("name").toString(); + NymeaCore::instance()->configuration()->setLocation(latitude, longitude, name); + return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError)); +} + JsonReply *ConfigurationHandler::SetTcpServerConfiguration(const QVariantMap ¶ms) const { ServerConfiguration config = unpack(params.value("configuration").toMap()); @@ -734,6 +756,11 @@ QVariantMap ConfigurationHandler::packBasicConfiguration() basicConfiguration.insert("serverTime", NymeaCore::instance()->timeManager()->currentDateTime().toTime_t()); basicConfiguration.insert("timeZone", QTimeZone::systemTimeZoneId()); basicConfiguration.insert("language", NymeaCore::instance()->configuration()->locale().name()); + basicConfiguration.insert("location", QVariantMap{ + {"latitude", NymeaCore::instance()->configuration()->locationLatitude()}, + {"longitude", NymeaCore::instance()->configuration()->locationLongitude()}, + {"name", NymeaCore::instance()->configuration()->locationName()} + }); basicConfiguration.insert("debugServerEnabled", NymeaCore::instance()->configuration()->debugServerEnabled()); return basicConfiguration; } diff --git a/libnymea-core/jsonrpc/configurationhandler.h b/libnymea-core/jsonrpc/configurationhandler.h index 899d734a..22cd0847 100644 --- a/libnymea-core/jsonrpc/configurationhandler.h +++ b/libnymea-core/jsonrpc/configurationhandler.h @@ -52,6 +52,7 @@ public: Q_INVOKABLE JsonReply *SetServerName(const QVariantMap ¶ms) const; Q_INVOKABLE JsonReply *SetTimeZone(const QVariantMap ¶ms) const; Q_INVOKABLE JsonReply *SetLanguage(const QVariantMap ¶ms) const; + Q_INVOKABLE JsonReply *SetLocation(const QVariantMap ¶ms) const; Q_INVOKABLE JsonReply *SetDebugServerEnabled(const QVariantMap ¶ms) const; Q_INVOKABLE JsonReply *SetTcpServerConfiguration(const QVariantMap ¶ms) const; Q_INVOKABLE JsonReply *DeleteTcpServerConfiguration(const QVariantMap ¶ms) const; diff --git a/libnymea-core/nymeaconfiguration.cpp b/libnymea-core/nymeaconfiguration.cpp index 7b11ccad..4abba5d3 100644 --- a/libnymea-core/nymeaconfiguration.cpp +++ b/libnymea-core/nymeaconfiguration.cpp @@ -285,6 +285,39 @@ void NymeaConfiguration::setTimeZone(const QByteArray &timeZone) } } +double NymeaConfiguration::locationLatitude() const +{ + NymeaSettings settings(NymeaSettings::SettingsRoleGlobal); + settings.beginGroup("nymead"); + return settings.value("locationLatitude").toDouble(); +} + +double NymeaConfiguration::locationLongitude() const +{ + NymeaSettings settings(NymeaSettings::SettingsRoleGlobal); + settings.beginGroup("nymead"); + return settings.value("locationLongitude").toDouble(); +} + +QString NymeaConfiguration::locationName() const +{ + NymeaSettings settings(NymeaSettings::SettingsRoleGlobal); + settings.beginGroup("nymead"); + return settings.value("locationName").toString(); +} + +void NymeaConfiguration::setLocation(double latitude, double longitude, const QString &name) +{ + NymeaSettings settings(NymeaSettings::SettingsRoleGlobal); + settings.beginGroup("nymead"); + if (settings.value("locationLatitude").toDouble() != latitude || settings.value("locationLongitude").toDouble() != longitude || settings.value("locationName").toString() != name) { + settings.setValue("locationLatitude", latitude); + settings.setValue("locationLongitude", longitude); + settings.setValue("locationName", name); + emit locationChanged(); + } +} + QLocale NymeaConfiguration::locale() const { NymeaSettings settings(NymeaSettings::SettingsRoleGlobal); diff --git a/libnymea-core/nymeaconfiguration.h b/libnymea-core/nymeaconfiguration.h index e0b8ca66..c223aedb 100644 --- a/libnymea-core/nymeaconfiguration.h +++ b/libnymea-core/nymeaconfiguration.h @@ -144,6 +144,11 @@ public: QByteArray timeZone() const; void setTimeZone(const QByteArray &timeZone); + double locationLatitude() const; + double locationLongitude() const; + QString locationName() const; + void setLocation(double latitude, double longitude, const QString &name); + QLocale locale() const; void setLocale(const QLocale &locale); @@ -225,6 +230,7 @@ signals: void serverNameChanged(const QString &serverName); void timeZoneChanged(); void localeChanged(); + void locationChanged(); void tcpServerConfigurationChanged(const QString &configId); void tcpServerConfigurationRemoved(const QString &configId); diff --git a/tests/auto/api.json b/tests/auto/api.json index 09dc6734..a20680a8 100644 --- a/tests/auto/api.json +++ b/tests/auto/api.json @@ -653,6 +653,11 @@ "returns": { "basicConfiguration": { "d:language": "String", + "d:location": { + "latitude": "Double", + "longitude": "Double", + "name": "String" + }, "d:serverTime": "Uint", "d:timeZone": "String", "debugServerEnabled": "Bool", @@ -728,6 +733,20 @@ "configurationError": "$ref:ConfigurationError" } }, + "Configuration.SetLocation": { + "description": "Sets the server location.", + "params": { + "location": { + "latitude": "Double", + "longitude": "Double", + "name": "String" + } + }, + "permissionScope": "PermissionScopeAdmin", + "returns": { + "configurationError": "$ref:ConfigurationError" + } + }, "Configuration.SetMqttPolicy": { "description": "Configure a MQTT broker policy. If the ID is an existing one, the existing policy will be modified, otherwise a new one will be added.", "params": { @@ -2276,6 +2295,11 @@ "params": { "basicConfiguration": { "d:language": "String", + "d:location": { + "latitude": "Double", + "longitude": "Double", + "name": "String" + }, "d:serverTime": "Uint", "d:timeZone": "String", "debugServerEnabled": "Bool",