This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
powersync-core/libnymea-core/jsonrpc/configurationhandler.cpp
Michael Zanetti 8ebd1ddc4e Rework translation mechanism
This branch moves the translation logic out of the DevicePlugin
into the JsonRpc layers (JsonRpcHandlers and Rest handlers) and
deprecates the Configuration.SetLanguage method call. Instead
it adds a "locale" property in the JSONRPC.Hello message. This
will allow multiple clients to connect to a single core using
different languages.
2019-04-08 16:49:24 +02:00

685 lines
35 KiB
C++

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright (C) 2016 Simon Stürz <simon.stuerz@guh.io> *
* *
* This file is part of nymea. *
* *
* nymea is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, version 2 of the License. *
* *
* nymea is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with nymea. If not, see <http://www.gnu.org/licenses/>. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*!
\class nymeaserver::ConfigurationHandler
\brief This subclass of \l{JsonHandler} processes the JSON requests for the \tt Configuration namespace.
\ingroup json
\inmodule core
This \l{JsonHandler} will be created in the \l{JsonRPCServer} and used to handle JSON-RPC requests
for the \tt {Configuration} namespace of the API.
\sa JsonHandler, JsonRPCServer
*/
/*! \fn void nymeaserver::ConfigurationHandler::BasicConfigurationChanged(const QVariantMap &params);
This signal is emitted to the API notifications when the configurations of the server have been changed.
The \a params contains the map for the notification.
*/
/*! \fn void nymeaserver::ConfigurationHandler::TcpServerConfigurationChanged(const QVariantMap &params);
This signal is emitted to the API notifications when the configurations of the \l{TcpServer} have been changed.
The \a params contains the map for the notification.
*/
/*! \fn void nymeaserver::ConfigurationHandler::WebServerConfigurationChanged(const QVariantMap &params);
This signal is emitted to the API notifications when the configurations of the \l{WebServer} have been changed.
The \a params contains the map for the notification.
*/
/*! \fn void nymeaserver::ConfigurationHandler::WebSocketServerConfigurationChanged(const QVariantMap &params);
This signal is emitted to the API notifications when the configurations of the \l{WebSocketServer} have been changed.
The \a params contains the map for the notification.
*/
/*! \fn void nymeaserver::ConfigurationHandler::LanguageChanged(const QVariantMap &params);
This signal is emitted to the API notifications when the language of the system has changed.
The \a params contains the map for the notification.
*/
#include "configurationhandler.h"
#include "nymeacore.h"
namespace nymeaserver {
/*! Constructs a new \l ConfigurationHandler with the given \a parent. */
ConfigurationHandler::ConfigurationHandler(QObject *parent):
JsonHandler(parent)
{
// Methods
QVariantMap params; QVariantMap returns;
setDescription("GetTimeZones", "Get the list of available timezones.");
setParams("GetTimeZones", params);
returns.insert("timeZones", QVariantList() << JsonTypes::basicTypeToString(JsonTypes::String));
setReturns("GetTimeZones", returns);
params.clear(); returns.clear();
setDescription("GetAvailableLanguages", "DEPRECATED - Use the locale property in the Handshake message instead - Returns a list of locale codes available for the server. i.e. en_US, de_AT");
setParams("GetAvailableLanguages", params);
returns.insert("languages", QVariantList() << JsonTypes::basicTypeToString(JsonTypes::String));
setReturns("GetAvailableLanguages", returns);
params.clear(); returns.clear();
setDescription("GetConfigurations", "Get all configuration parameters of the server.");
setParams("GetConfigurations", params);
QVariantMap basicConfiguration;
basicConfiguration.insert("serverName", JsonTypes::basicTypeToString(JsonTypes::String));
basicConfiguration.insert("serverUuid", JsonTypes::basicTypeToString(JsonTypes::Uuid));
basicConfiguration.insert("serverTime", JsonTypes::basicTypeToString(JsonTypes::Uint));
basicConfiguration.insert("timeZone", JsonTypes::basicTypeToString(JsonTypes::String));
basicConfiguration.insert("language", JsonTypes::basicTypeToString(JsonTypes::String));
basicConfiguration.insert("debugServerEnabled", JsonTypes::basicTypeToString(JsonTypes::Bool));
returns.insert("basicConfiguration", basicConfiguration);
QVariantList tcpServerConfigurations;
tcpServerConfigurations.append(JsonTypes::serverConfigurationRef());
returns.insert("tcpServerConfigurations", tcpServerConfigurations);
QVariantList webServerConfigurations;
webServerConfigurations.append(JsonTypes::webServerConfigurationRef());
returns.insert("webServerConfigurations", webServerConfigurations);
QVariantList webSocketServerConfigurations;
webSocketServerConfigurations.append(JsonTypes::serverConfigurationRef());
returns.insert("webSocketServerConfigurations", webSocketServerConfigurations);
QVariantList mqttServerConfigurations;
mqttServerConfigurations.append(JsonTypes::serverConfigurationRef());
QVariantMap cloudConfiguration;
cloudConfiguration.insert("enabled", JsonTypes::basicTypeToString(JsonTypes::Bool));
returns.insert("cloud", cloudConfiguration);
setReturns("GetConfigurations", returns);
params.clear(); returns.clear();
setDescription("SetServerName", "Set the name of the server. Default is nymea.");
params.insert("serverName", JsonTypes::basicTypeToString(JsonTypes::String));
setParams("SetServerName", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetServerName", returns);
params.clear(); returns.clear();
setDescription("SetTimeZone", "Set the time zone of the server. See also: \"GetTimeZones\"");
params.insert("timeZone", JsonTypes::basicTypeToString(JsonTypes::String));
setParams("SetTimeZone", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetTimeZone", returns);
params.clear(); returns.clear();
setDescription("SetLanguage", "DEPRECATED - Use the locale property in the Handshake message instead - Sets the server language to the given language. See also: \"GetAvailableLanguages\"");
params.insert("language", JsonTypes::basicTypeToString(JsonTypes::String));
setParams("SetLanguage", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetLanguage", returns);
params.clear(); returns.clear();
setDescription("SetDebugServerEnabled", "Enable or disable the debug server.");
params.insert("enabled", JsonTypes::basicTypeToString(JsonTypes::String));
setParams("SetDebugServerEnabled", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetDebugServerEnabled", returns);
params.clear(); returns.clear();
setDescription("SetTcpServerConfiguration", "Configure a TCP interface of the server. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added. Note: if you are changing the configuration for the interface you are currently connected to, the connection will be dropped.");
params.insert("configuration", JsonTypes::serverConfigurationRef());
setParams("SetTcpServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetTcpServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("DeleteTcpServerConfiguration", "Delete a TCP interface of the server. Note: if you are deleting the configuration for the interface you are currently connected to, the connection will be dropped.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("DeleteTcpServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("DeleteTcpServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("SetWebSocketServerConfiguration", "Configure a WebSocket Server interface of the server. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added. Note: if you are changing the configuration for the interface you are currently connected to, the connection will be dropped.");
params.insert("configuration", JsonTypes::serverConfigurationRef());
setParams("SetWebSocketServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetWebSocketServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("DeleteWebSocketServerConfiguration", "Delete a WebSocket Server interface of the server. Note: if you are deleting the configuration for the interface you are currently connected to, the connection will be dropped.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("DeleteWebSocketServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("DeleteWebSocketServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("SetWebServerConfiguration", "Configure a WebServer interface of the server. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added.");
params.insert("configuration", JsonTypes::webServerConfigurationRef());
setParams("SetWebServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetWebServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("DeleteWebServerConfiguration", "Delete a WebServer interface of the server.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("DeleteWebServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("DeleteWebServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("SetCloudEnabled", "Sets whether the cloud connection is enabled or disabled in the settings.");
params.insert("enabled", JsonTypes::basicTypeToString(QVariant::Bool));
setParams("SetCloudEnabled", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetCloudEnabled", returns);
// MQTT
params.clear(); returns.clear();
setDescription("GetMqttServerConfigurations", "Get all MQTT Server configurations.");
setParams("GetMqttServerConfigurations", params);
returns.insert("mqttServerConfigurations", QVariantList() << JsonTypes::serverConfigurationRef());
setReturns("GetMqttServerConfigurations", returns);
params.clear(); returns.clear();
setDescription("SetMqttServerConfiguration", "Configure a MQTT Server interface on the MQTT broker. If the ID is an existing one, the existing config will be modified, otherwise a new one will be added. Setting authenticationEnabled to true will require MQTT clients to use credentials set in the MQTT broker policies.");
params.insert("configuration", JsonTypes::serverConfigurationRef());
setParams("SetMqttServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetMqttServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("DeleteMqttServerConfiguration", "Delete a MQTT Server interface of the server.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("DeleteMqttServerConfiguration", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("DeleteMqttServerConfiguration", returns);
params.clear(); returns.clear();
setDescription("GetMqttPolicies", "Get all MQTT broker policies.");
setParams("GetMqttPolicies", params);
returns.insert("mqttPolicies", QVariantList() << JsonTypes::mqttPolicyRef());
setReturns("GetMqttPolicies", returns);
params.clear(); returns.clear();
setDescription("SetMqttPolicy", "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.insert("policy", JsonTypes::mqttPolicyRef());
setParams("SetMqttPolicy", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("SetMqttPolicy", returns);
params.clear(); returns.clear();
setDescription("DeleteMqttPolicy", "Delete a MQTT policy from the broker.");
params.insert("clientId", JsonTypes::basicTypeToString(QVariant::String));
setParams("DeleteMqttPolicy", params);
returns.insert("configurationError", JsonTypes::configurationErrorRef());
setReturns("DeleteMqttPolicy", returns);
// Notifications
params.clear(); returns.clear();
setDescription("BasicConfigurationChanged", "Emitted whenever the basic configuration of this server changes.");
params.insert("basicConfiguration", basicConfiguration);
setParams("BasicConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("LanguageChanged", "Emitted whenever the language of the server changed. The Plugins, Vendors and DeviceClasses have to be reloaded to get the translated data.");
params.insert("language", JsonTypes::basicTypeToString(JsonTypes::String));
setParams("LanguageChanged", params);
params.clear(); returns.clear();
setDescription("TcpServerConfigurationChanged", "Emitted whenever the TCP server configuration changes.");
params.insert("tcpServerConfiguration", JsonTypes::serverConfigurationRef());
setParams("TcpServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("TcpServerConfigurationRemoved", "Emitted whenever a TCP server configuration is removed.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("TcpServerConfigurationRemoved", params);
params.clear(); returns.clear();
setDescription("WebSocketServerConfigurationChanged", "Emitted whenever the web socket server configuration changes.");
params.insert("webSocketServerConfiguration", JsonTypes::serverConfigurationRef());
setParams("WebSocketServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("WebSocketServerConfigurationRemoved", "Emitted whenever a WebSocket server configuration is removed.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("WebSocketServerConfigurationRemoved", params);
params.clear(); returns.clear();
setDescription("MqttServerConfigurationChanged", "Emitted whenever the MQTT broker configuration is changed.");
params.insert("mqttServerConfiguration", JsonTypes::serverConfigurationRef());
setParams("MqttServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("MqttServerConfigurationRemoved", "Emitted whenever a MQTT server configuration is removed.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("MqttServerConfigurationRemoved", params);
params.clear(); returns.clear();
setDescription("WebServerConfigurationChanged", "Emitted whenever the web server configuration changes.");
params.insert("webServerConfiguration", JsonTypes::webServerConfigurationRef());
setParams("WebServerConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("WebServerConfigurationRemoved", "Emitted whenever a Web server configuration is removed.");
params.insert("id", JsonTypes::basicTypeToString(QVariant::String));
setParams("WebServerConfigurationRemoved", params);
params.clear(); returns.clear();
setDescription("CloudConfigurationChanged", "Emitted whenever the cloud configuration is changed.");
params.insert("cloudConfiguration", cloudConfiguration);
setParams("CloudConfigurationChanged", params);
params.clear(); returns.clear();
setDescription("MqttPolicyChanged", "Emitted whenever a MQTT broker policy is changed.");
params.insert("policy", JsonTypes::mqttPolicyRef());
setParams("MqttPolicyChanged", params);
params.clear(); returns.clear();
setDescription("MqttPolicyRemoved", "Emitted whenever a MQTT broker policy is removed.");
params.insert("clientId", JsonTypes::basicTypeToString(QVariant::String));
setParams("MqttPolicyRemoved", params);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::serverNameChanged, this, &ConfigurationHandler::onBasicConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::timeZoneChanged, 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);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::tcpServerConfigurationChanged, this, &ConfigurationHandler::onTcpServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::tcpServerConfigurationRemoved, this, &ConfigurationHandler::onTcpServerConfigurationRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webServerConfigurationChanged, this, &ConfigurationHandler::onWebServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webServerConfigurationRemoved, this, &ConfigurationHandler::onWebServerConfigurationRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webSocketServerConfigurationChanged, this, &ConfigurationHandler::onWebSocketServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::webSocketServerConfigurationRemoved, this, &ConfigurationHandler::onWebSocketServerConfigurationRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::mqttServerConfigurationChanged, this, &ConfigurationHandler::onMqttServerConfigurationChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::mqttServerConfigurationRemoved, this, &ConfigurationHandler::onMqttServerConfigurationRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::mqttPolicyChanged, this, &ConfigurationHandler::onMqttPolicyChanged);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::mqttPolicyRemoved, this, &ConfigurationHandler::onMqttPolicyRemoved);
connect(NymeaCore::instance()->configuration(), &NymeaConfiguration::cloudEnabledChanged, this, &ConfigurationHandler::onCloudConfigurationChanged);
}
/*! Returns the name of the \l{ConfigurationHandler}. In this case \b Configuration.*/
QString ConfigurationHandler::name() const
{
return "Configuration";
}
JsonReply *ConfigurationHandler::GetConfigurations(const QVariantMap &params) const
{
Q_UNUSED(params)
QVariantMap returns;
returns.insert("basicConfiguration", JsonTypes::packBasicConfiguration());
QVariantList tcpServerConfigs;
foreach (const ServerConfiguration &config, NymeaCore::instance()->configuration()->tcpServerConfigurations()) {
tcpServerConfigs.append(JsonTypes::packServerConfiguration(config));
}
returns.insert("tcpServerConfigurations", tcpServerConfigs);
QVariantList webServerConfigs;
foreach (const WebServerConfiguration &config, NymeaCore::instance()->configuration()->webServerConfigurations()) {
webServerConfigs.append(JsonTypes::packWebServerConfiguration(config));
}
returns.insert("webServerConfigurations", webServerConfigs);
QVariantList webSocketServerConfigs;
foreach (const ServerConfiguration &config, NymeaCore::instance()->configuration()->webSocketServerConfigurations()) {
webSocketServerConfigs.append(JsonTypes::packServerConfiguration(config));
}
returns.insert("webSocketServerConfigurations", webSocketServerConfigs);
QVariantMap cloudConfig;
cloudConfig.insert("enabled", NymeaCore::instance()->configuration()->cloudEnabled());
returns.insert("cloud", cloudConfig);
return createReply(returns);
}
JsonReply *ConfigurationHandler::GetTimeZones(const QVariantMap &params) const
{
Q_UNUSED(params)
QVariantList timeZones;
foreach (const QByteArray &timeZoneId, NymeaCore::instance()->timeManager()->availableTimeZones()) {
timeZones.append(QString::fromUtf8(timeZoneId));
}
QVariantMap returns;
returns.insert("timeZones", timeZones);
return createReply(returns);
}
JsonReply *ConfigurationHandler::GetAvailableLanguages(const QVariantMap &params) const
{
Q_UNUSED(params)
QVariantList languages;
foreach (const QString &language, NymeaCore::getAvailableLanguages()) {
languages.append(language);
}
QVariantMap returns;
returns.insert("languages", languages);
return createReply(returns);
}
JsonReply *ConfigurationHandler::SetServerName(const QVariantMap &params) const
{
QString serverName = params.value("serverName").toString();
NymeaCore::instance()->configuration()->setServerName(serverName);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::SetTimeZone(const QVariantMap &params) const
{
qCDebug(dcJsonRpc()) << "Setting time zone to" << params.value("timeZone").toString();
QByteArray timeZone = params.value("timeZone").toString().toUtf8();
if (!NymeaCore::instance()->timeManager()->setTimeZone(timeZone))
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidTimeZone));
NymeaCore::instance()->configuration()->setTimeZone(timeZone);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::SetLanguage(const QVariantMap &params) const
{
qCDebug(dcJsonRpc()) << "Setting language to" << params.value("language").toString();
QLocale locale(params.value("language").toString());
NymeaCore::instance()->configuration()->setLocale(locale);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::SetTcpServerConfiguration(const QVariantMap &params) const
{
ServerConfiguration config = JsonTypes::unpackServerConfiguration(params.value("configuration").toMap());
if (config.id.isEmpty()) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
if (config.address.isNull())
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidHostAddress));
if (config.port <= 0 || config.port > 65535) {
qCWarning(dcJsonRpc()) << "Port out of range";
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidPort));
}
qCDebug(dcJsonRpc()) << QString("Configure TCP server %1:%2").arg(config.address.toString()).arg(config.port);
NymeaCore::instance()->configuration()->setTcpServerConfiguration(config);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::DeleteTcpServerConfiguration(const QVariantMap &params) const
{
QString id = params.value("id").toString();
if (id.isEmpty() || !NymeaCore::instance()->configuration()->tcpServerConfigurations().contains(id)) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
NymeaCore::instance()->configuration()->removeTcpServerConfiguration(id);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::SetWebServerConfiguration(const QVariantMap &params) const
{
WebServerConfiguration config = JsonTypes::unpackWebServerConfiguration(params.value("configuration").toMap());
if (config.id.isEmpty()) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
if (config.address.isNull())
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidHostAddress));
if (config.port <= 0 || config.port > 65535) {
qCWarning(dcJsonRpc()) << "Port out of range";
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidPort));
}
qCDebug(dcJsonRpc()) << QString("Configure web server %1:%2").arg(config.address.toString()).arg(config.port);
NymeaCore::instance()->configuration()->setWebServerConfiguration(config);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::DeleteWebServerConfiguration(const QVariantMap &params) const
{
QString id = params.value("id").toString();
if (id.isEmpty() || !NymeaCore::instance()->configuration()->webServerConfigurations().contains(id)) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
NymeaCore::instance()->configuration()->removeWebServerConfiguration(id);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::SetWebSocketServerConfiguration(const QVariantMap &params) const
{
ServerConfiguration config = JsonTypes::unpackServerConfiguration(params.value("configuration").toMap());
if (config.id.isEmpty()) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
if (config.address.isNull())
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidHostAddress));
if (config.port <= 0 || config.port > 65535) {
qCWarning(dcJsonRpc()) << "Port out of range";
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidPort));
}
qCDebug(dcJsonRpc()) << QString("Configuring web socket server %1:%2").arg(config.address.toString()).arg(config.port);
NymeaCore::instance()->configuration()->setWebSocketServerConfiguration(config);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::DeleteWebSocketServerConfiguration(const QVariantMap &params) const
{
QString id = params.value("id").toString();
if (id.isEmpty() || !NymeaCore::instance()->configuration()->webSocketServerConfigurations().contains(id)) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
NymeaCore::instance()->configuration()->removeWebSocketServerConfiguration(id);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::GetMqttServerConfigurations(const QVariantMap &params) const
{
Q_UNUSED(params)
QVariantMap ret;
QVariantList mqttServerConfigs;
foreach (const ServerConfiguration &config, NymeaCore::instance()->configuration()->mqttServerConfigurations()) {
mqttServerConfigs << JsonTypes::packServerConfiguration(config);
}
ret.insert("mqttServerConfigurations", mqttServerConfigs);
return createReply(ret);
}
JsonReply *ConfigurationHandler::SetMqttServerConfiguration(const QVariantMap &params) const
{
ServerConfiguration config = JsonTypes::unpackServerConfiguration(params.value("configuration").toMap());
if (config.id.isEmpty()) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
if (config.address.isNull())
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidHostAddress));
if (config.port <= 0 || config.port > 65535) {
qCWarning(dcJsonRpc()) << "Port out of range";
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidPort));
}
qCDebug(dcJsonRpc()) << QString("Configure MQTT server %1:%2").arg(config.address.toString()).arg(config.port);
NymeaCore::instance()->configuration()->setMqttServerConfiguration(config);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::DeleteMqttServerConfiguration(const QVariantMap &params) const
{
QString id = params.value("id").toString();
if (id.isEmpty() || !NymeaCore::instance()->configuration()->mqttServerConfigurations().contains(id)) {
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorInvalidId));
}
NymeaCore::instance()->configuration()->removeMqttServerConfiguration(id);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::GetMqttPolicies(const QVariantMap &params) const
{
Q_UNUSED(params)
QVariantList mqttPolicies;
foreach (const MqttPolicy &policy, NymeaCore::instance()->configuration()->mqttPolicies()) {
mqttPolicies << JsonTypes::packMqttPolicy(policy);
}
QVariantMap ret;
ret.insert("mqttPolicies", mqttPolicies);
return createReply(ret);
}
JsonReply *ConfigurationHandler::SetMqttPolicy(const QVariantMap &params) const
{
MqttPolicy policy = JsonTypes::unpackMqttPolicy(params.value("policy").toMap());
NymeaCore::instance()->configuration()->updateMqttPolicy(policy);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::DeleteMqttPolicy(const QVariantMap &params) const
{
QString clientId = params.value("clientId").toString();
bool success = NymeaCore::instance()->configuration()->removeMqttPolicy(clientId);
return createReply(statusToReply(success ? NymeaConfiguration::ConfigurationErrorNoError : NymeaConfiguration::ConfigurationErrorInvalidId));
}
JsonReply *ConfigurationHandler::SetCloudEnabled(const QVariantMap &params) const
{
bool enabled = params.value("enabled").toBool();
NymeaCore::instance()->configuration()->setCloudEnabled(enabled);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
JsonReply *ConfigurationHandler::SetDebugServerEnabled(const QVariantMap &params) const
{
bool enabled = params.value("enabled").toBool();
NymeaCore::instance()->configuration()->setDebugServerEnabled(enabled);
return createReply(statusToReply(NymeaConfiguration::ConfigurationErrorNoError));
}
void ConfigurationHandler::onBasicConfigurationChanged()
{
qCDebug(dcJsonRpc()) << "Notification: Basic configuration changed";
QVariantMap params;
params.insert("basicConfiguration", JsonTypes::packBasicConfiguration());
emit BasicConfigurationChanged(params);
}
void ConfigurationHandler::onTcpServerConfigurationChanged(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: TCP server configuration changed";
QVariantMap params;
params.insert("tcpServerConfiguration", JsonTypes::packServerConfiguration(NymeaCore::instance()->configuration()->tcpServerConfigurations().value(id)));
emit TcpServerConfigurationChanged(params);
}
void ConfigurationHandler::onTcpServerConfigurationRemoved(const QString &id)
{
qCDebug(dcJsonRpc) << "Notification: TCP server configuration removed";
QVariantMap params;
params.insert("id", id);
emit TcpServerConfigurationRemoved(params);
}
void ConfigurationHandler::onWebServerConfigurationChanged(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: web server configuration changed";
QVariantMap params;
params.insert("webServerConfiguration", JsonTypes::packWebServerConfiguration(NymeaCore::instance()->configuration()->webServerConfigurations().value(id)));
emit WebServerConfigurationChanged(params);
}
void ConfigurationHandler::onWebServerConfigurationRemoved(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: Web server configuration removed";
QVariantMap params;
params.insert("id", id);
emit WebServerConfigurationChanged(params);
}
void ConfigurationHandler::onWebSocketServerConfigurationChanged(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: web socket server configuration changed";
QVariantMap params;
params.insert("webSocketServerConfiguration", JsonTypes::packServerConfiguration(NymeaCore::instance()->configuration()->webSocketServerConfigurations().value(id)));
emit WebSocketServerConfigurationChanged(params);
}
void ConfigurationHandler::onWebSocketServerConfigurationRemoved(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: WebSocket server configuration removed";
QVariantMap params;
params.insert("id", id);
emit WebSocketServerConfigurationRemoved(params);
}
void ConfigurationHandler::onMqttServerConfigurationChanged(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: MQTT server configuration changed";
QVariantMap params;
params.insert("mqttServerConfiguration", JsonTypes::packServerConfiguration(NymeaCore::instance()->configuration()->mqttServerConfigurations().value(id)));
emit MqttServerConfigurationChanged(params);
}
void ConfigurationHandler::onMqttServerConfigurationRemoved(const QString &id)
{
qCDebug(dcJsonRpc()) << "Notification: MQTT server configuration removed";
QVariantMap params;
params.insert("id", id);
emit MqttServerConfigurationRemoved(params);
}
void ConfigurationHandler::onMqttPolicyChanged(const QString &clientId)
{
qCDebug(dcJsonRpc()) << "Notification: MQTT policy changed";
QVariantMap params;
params.insert("policy", JsonTypes::packMqttPolicy(NymeaCore::instance()->configuration()->mqttPolicies().value(clientId)));
emit MqttPolicyChanged(params);
}
void ConfigurationHandler::onMqttPolicyRemoved(const QString &clientId)
{
qCDebug(dcJsonRpc()) << "Notification: MQTT policy removed";
QVariantMap params;
params.insert("clientId", clientId);
emit MqttPolicyRemoved(params);
}
void ConfigurationHandler::onCloudConfigurationChanged(bool enabled)
{
qCDebug(dcJsonRpc()) << "Notification: cloud configuration changed";
QVariantMap params;
QVariantMap cloudConfiguration;
cloudConfiguration.insert("enabled", enabled);
params.insert("cloudConfiguration", cloudConfiguration);
emit CloudConfigurationChanged(params);
}
void ConfigurationHandler::onLanguageChanged()
{
qCDebug(dcJsonRpc()) << "Notification: language configuration changed";
QVariantMap params;
params.insert("language", NymeaCore::instance()->configuration()->locale().name());
emit LanguageChanged(params);
}
}