~aleteoryx/muditaos

5d3ee6b275378b1b882e6ade122ea49f5963c6d1 — RobertPiet 5 years ago 5711ab7
[EGD-4383] Settings moved from namespace Settings to namespace settings (#1007)

* [EGD-4383] Settings moved from namespace Settings to namespace settings
M module-services/service-db/agents/settings/Settings.cpp => module-services/service-db/agents/settings/Settings.cpp +26 -25
@@ 13,7 13,7 @@
#include <utility>
#include <vector>

namespace Settings
namespace settings
{
    Settings::Settings(sys::Service *app, const std::string &dbAgentName) : dbAgentName(dbAgentName)
    {


@@ 28,7 28,7 @@ namespace Settings
        sys::Bus::Remove(std::static_pointer_cast<sys::Service>(app));
    }

    void Settings::sendMsg(std::shared_ptr<::Settings::Messages::SettingsMessage> &&msg)
    void Settings::sendMsg(std::shared_ptr<settings::Messages::SettingsMessage> &&msg)
    {
        sys::Bus::SendUnicast(std::move(msg), dbAgentName, app.get());
    }


@@ 37,19 37,20 @@ namespace Settings
    {
        using std::placeholders::_1;
        using std::placeholders::_2;
        app->connect(::Settings::Messages::VariableChanged(), std::bind(&Settings::handleVariableChanged, this, _1));
        app->connect(::Settings::Messages::CurrentProfileChanged(),
        LOG_DEBUG("Settings::registerHandlers for %s", app->GetName().c_str());
        app->connect(settings::Messages::VariableChanged(), std::bind(&Settings::handleVariableChanged, this, _1));
        app->connect(settings::Messages::CurrentProfileChanged(),
                     std::bind(&Settings::handleCurrentProfileChanged, this, _1));
        app->connect(::Settings::Messages::CurrentModeChanged(),
        app->connect(settings::Messages::CurrentModeChanged(),
                     std::bind(&Settings::handleCurrentModeChanged, this, _1));
        app->connect(::Settings::Messages::ProfileListResponse(),
        app->connect(settings::Messages::ProfileListResponse(),
                     std::bind(&Settings::handleProfileListResponse, this, _1));
        app->connect(::Settings::Messages::ModeListResponse(), std::bind(&Settings::handleModeListResponse, this, _1));
        app->connect(settings::Messages::ModeListResponse(), std::bind(&Settings::handleModeListResponse, this, _1));
    }
    auto Settings::handleVariableChanged(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleVariableChanged");
        if (auto msg = dynamic_cast<::Settings::Messages::VariableChanged *>(req)) {
        if (auto msg = dynamic_cast<settings::Messages::VariableChanged *>(req)) {
            auto key = msg->getPath().variable;
            auto val = msg->getValue();
            LOG_DEBUG("handleVariableChanged: (k=v): (%s=%s)", key.c_str(), val.value_or("").c_str());


@@ 64,7 65,7 @@ namespace Settings
    auto Settings::handleCurrentProfileChanged(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleCurrentProfileChanged");
        if (auto msg = dynamic_cast<::Settings::Messages::CurrentProfileChanged *>(req)) {
        if (auto msg = dynamic_cast<settings::Messages::CurrentProfileChanged *>(req)) {
            auto profile = msg->getProfileName();
            LOG_DEBUG("handleCurrentProfileChanged: %s", profile.c_str());
            cbProfile(profile);


@@ 74,7 75,7 @@ namespace Settings
    auto Settings::handleCurrentModeChanged(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleCurrentModeChanged");
        if (auto msg = dynamic_cast<::Settings::Messages::CurrentModeChanged *>(req)) {
        if (auto msg = dynamic_cast<settings::Messages::CurrentModeChanged *>(req)) {
            auto mode = msg->getProfileName();
            LOG_DEBUG("handleCurrentModeChanged: %s", mode.c_str());
            cbMode(mode);


@@ 84,7 85,7 @@ namespace Settings
    auto Settings::handleProfileListResponse(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleProfileListResponse");
        if (auto msg = dynamic_cast<::Settings::Messages::ProfileListResponse *>(req)) {
        if (auto msg = dynamic_cast<settings::Messages::ProfileListResponse *>(req)) {
            auto profiles = msg->getValue();
            LOG_DEBUG("handleProfileListResponse: %zu elements", profiles.size());
            cbAllProfiles(profiles);


@@ 94,7 95,7 @@ namespace Settings
    auto Settings::handleModeListResponse(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleModeListResponse");
        if (auto msg = dynamic_cast<::Settings::Messages::ModeListResponse *>(req)) {
        if (auto msg = dynamic_cast<settings::Messages::ModeListResponse *>(req)) {
            auto modes = msg->getValue();
            LOG_DEBUG("handleModeListResponse: %zu elements", modes.size());
            cbAllModes(modes);


@@ 112,7 113,7 @@ namespace Settings
        EntryPath path;
        path.variable = variableName;
        path.service  = app->GetName();
        auto msg      = std::make_shared<::Settings::Messages::RegisterOnVariableChange>(path);
        auto msg      = std::make_shared<settings::Messages::RegisterOnVariableChange>(path);
        sendMsg(std::move(msg));
    }



@@ 129,7 130,7 @@ namespace Settings
        EntryPath path;
        path.variable = variableName;
        path.service  = app->GetName();
        auto msg      = std::make_shared<::Settings::Messages::UnregisterOnVariableChange>(path);
        auto msg      = std::make_shared<settings::Messages::UnregisterOnVariableChange>(path);
        sendMsg(std::move(msg));
    }



@@ 138,26 139,26 @@ namespace Settings
        EntryPath path;
        path.variable = variableName;
        path.service  = app->GetName();
        auto msg      = std::make_shared<::Settings::Messages::SetVariable>(path, variableValue);
        auto msg      = std::make_shared<settings::Messages::SetVariable>(path, variableValue);
        sendMsg(std::move(msg));
    }

    void Settings::getAllProfiles(OnAllProfilesRetrievedCallback cb)
    {
        if (nullptr == cbAllProfiles) {
            sendMsg(std::make_shared<::Settings::Messages::ListProfiles>());
            sendMsg(std::make_shared<settings::Messages::ListProfiles>());
        }
        cbAllProfiles = cb;
    }

    void Settings::setCurrentProfile(const std::string &profile)
    {
        sendMsg(std::make_shared<::Settings::Messages::SetCurrentProfile>(profile));
        sendMsg(std::make_shared<settings::Messages::SetCurrentProfile>(profile));
    }

    void Settings::addProfile(const std::string &profile)
    {
        sendMsg(std::make_shared<::Settings::Messages::AddProfile>(profile));
        sendMsg(std::make_shared<settings::Messages::AddProfile>(profile));
    }

    void Settings::registerProfileChange(ProfileChangedCallback cb)


@@ 166,7 167,7 @@ namespace Settings
            LOG_DEBUG("Profile change callback already exists, overwritting");
        }
        else {
            sendMsg(std::make_shared<::Settings::Messages::RegisterOnProfileChange>());
            sendMsg(std::make_shared<settings::Messages::RegisterOnProfileChange>());
        }

        cbProfile = cb;


@@ 175,25 176,25 @@ namespace Settings
    void Settings::unregisterProfileChange()
    {
        cbProfile = nullptr;
        sendMsg(std::make_shared<::Settings::Messages::UnregisterOnProfileChange>());
        sendMsg(std::make_shared<settings::Messages::UnregisterOnProfileChange>());
    }

    void Settings::getAllModes(OnAllModesRetrievedCallback cb)
    {
        if (nullptr == cbAllModes) {
            sendMsg(std::make_shared<::Settings::Messages::ListModes>());
            sendMsg(std::make_shared<settings::Messages::ListModes>());
        }
        cbAllModes = cb;
    }

    void Settings::setCurrentMode(const std::string &mode)
    {
        sendMsg(std::make_shared<::Settings::Messages::SetCurrentMode>(mode));
        sendMsg(std::make_shared<settings::Messages::SetCurrentMode>(mode));
    }

    void Settings::addMode(const std::string &mode)
    {
        sendMsg(std::make_shared<::Settings::Messages::AddMode>(mode));
        sendMsg(std::make_shared<settings::Messages::AddMode>(mode));
    }

    void Settings::registerModeChange(ModeChangedCallback cb)


@@ 202,7 203,7 @@ namespace Settings
            LOG_DEBUG("ModeChange callback allready set overwriting");
        }
        else {
            sendMsg(std::make_shared<::Settings::Messages::RegisterOnModeChange>());
            sendMsg(std::make_shared<settings::Messages::RegisterOnModeChange>());
        }
        cbMode = cb;
    }


@@ 210,6 211,6 @@ namespace Settings
    void Settings::unregisterModeChange()
    {
        cbMode = nullptr;
        sendMsg(std::make_shared<::Settings::Messages::UnregisterOnModeChange>());
        sendMsg(std::make_shared<settings::Messages::UnregisterOnModeChange>());
    }
} // namespace Settings

M module-services/service-db/agents/settings/Settings.hpp => module-services/service-db/agents/settings/Settings.hpp +3 -4
@@ 4,7 4,6 @@
#pragma once

#include <module-sys/Service/Message.hpp>

#include <service-db/DBServiceName.hpp>

#include <cstdint>


@@ 15,7 14,7 @@
#include <optional>
#include <string>

namespace Settings
namespace settings
{
    namespace Messages
    {


@@ 66,7 65,7 @@ namespace Settings
        OnAllModesRetrievedCallback cbAllModes;
        ProfileChangedCallback cbProfile;
        OnAllProfilesRetrievedCallback cbAllProfiles;
        void sendMsg(std::shared_ptr<::Settings::Messages::SettingsMessage> &&msg);
        void sendMsg(std::shared_ptr<settings::Messages::SettingsMessage> &&msg);
        void registerHandlers();
        auto handleVariableChanged(sys::Message *req) -> sys::MessagePointer;
        auto handleCurrentProfileChanged(sys::Message *req) -> sys::MessagePointer;


@@ 74,4 73,4 @@ namespace Settings
        auto handleProfileListResponse(sys::Message *req) -> sys::MessagePointer;
        auto handleModeListResponse(sys::Message *req) -> sys::MessagePointer;
    };
} // namespace Settings
} // namespace settings

M module-services/service-db/agents/settings/SettingsAgent.cpp => module-services/service-db/agents/settings/SettingsAgent.cpp +72 -78
@@ 11,17 11,11 @@
#include <module-sys/Service/Bus.hpp>
#include <vfs.hpp>

#include <memory>     // for make_shared, allocator, shared_ptr, make_unique, unique_ptr
#include <functional> // for _Bind_helper<>::type, _Placeholder, bind, _1, _2
#include <utility>    // for move
namespace Settings
{
    namespace DbPaths
    {
        constexpr auto phone_mode    = "system/phone_mode";
        constexpr auto phone_profile = "system/phone_profile";
    } // namespace DbPaths
};    // namespace Settings
namespace settings::DbPaths
{
    constexpr auto phone_mode    = "system/phone_mode";
    constexpr auto phone_profile = "system/phone_profile";
}; // namespace settings::DbPaths

SettingsAgent::SettingsAgent(sys::Service *parentService) : DatabaseAgent(parentService)
{


@@ 32,7 26,7 @@ void SettingsAgent::initDb()
{
    // LOG_DEBUG("sql:\n--\n%s\n--", getDbInitString().c_str());
    database->execute(getDbInitString().c_str());
    auto notifications = database->query(Settings::Statements::getAllNotifications);
    auto notifications = database->query(settings::Statements::getAllNotifications);
    if (nullptr == notifications || 0 == notifications->getRowCount()) {
        return;
    }


@@ 55,35 49,35 @@ void SettingsAgent::registerMessages()
    using std::placeholders::_1;

    // single variable
    parentService->connect(Settings::Messages::GetVariable(), std::bind(&SettingsAgent::handleGetVariable, this, _1));
    parentService->connect(Settings::Messages::SetVariable(), std::bind(&SettingsAgent::handleSetVariable, this, _1));
    parentService->connect(Settings::Messages::RegisterOnVariableChange(),
    parentService->connect(settings::Messages::GetVariable(), std::bind(&SettingsAgent::handleGetVariable, this, _1));
    parentService->connect(settings::Messages::SetVariable(), std::bind(&SettingsAgent::handleSetVariable, this, _1));
    parentService->connect(settings::Messages::RegisterOnVariableChange(),
                           std::bind(&SettingsAgent::handleRegisterOnVariableChange, this, _1));
    parentService->connect(Settings::Messages::UnregisterOnVariableChange(),
    parentService->connect(settings::Messages::UnregisterOnVariableChange(),
                           std::bind(&SettingsAgent::handleUnregisterOnVariableChange, this, _1));
    // profile
    parentService->connect(Settings::Messages::RegisterOnProfileChange(),
    parentService->connect(settings::Messages::RegisterOnProfileChange(),
                           std::bind(&SettingsAgent::handleRegisterProfileChange, this, _1));
    parentService->connect(Settings::Messages::UnregisterOnProfileChange(),
    parentService->connect(settings::Messages::UnregisterOnProfileChange(),
                           std::bind(&SettingsAgent::handleUnregisterProfileChange, this, _1));
    parentService->connect(Settings::Messages::SetCurrentProfile(),
    parentService->connect(settings::Messages::SetCurrentProfile(),
                           std::bind(&SettingsAgent::handleSetCurrentProfile, this, _1));
    parentService->connect(Settings::Messages::GetCurrentProfile(),
    parentService->connect(settings::Messages::GetCurrentProfile(),
                           std::bind(&SettingsAgent::handleGetCurrentProfile, this, _1));
    parentService->connect(Settings::Messages::AddProfile(), std::bind(&SettingsAgent::handleAddProfile, this, _1));
    parentService->connect(Settings::Messages::ListProfiles(), std::bind(&SettingsAgent::handleListProfiles, this, _1));
    parentService->connect(settings::Messages::AddProfile(), std::bind(&SettingsAgent::handleAddProfile, this, _1));
    parentService->connect(settings::Messages::ListProfiles(), std::bind(&SettingsAgent::handleListProfiles, this, _1));

    // mode
    parentService->connect(Settings::Messages::RegisterOnModeChange(),
    parentService->connect(settings::Messages::RegisterOnModeChange(),
                           std::bind(&SettingsAgent::handleRegisterOnModeChange, this, _1));
    parentService->connect(Settings::Messages::UnregisterOnModeChange(),
    parentService->connect(settings::Messages::UnregisterOnModeChange(),
                           std::bind(&SettingsAgent::handleUnregisterOnModeChange, this, _1));
    parentService->connect(Settings::Messages::SetCurrentMode(),
    parentService->connect(settings::Messages::SetCurrentMode(),
                           std::bind(&SettingsAgent::handleSetCurrentMode, this, _1));
    parentService->connect(Settings::Messages::GetCurrentMode(),
    parentService->connect(settings::Messages::GetCurrentMode(),
                           std::bind(&SettingsAgent::handleGetCurrentMode, this, _1));
    parentService->connect(Settings::Messages::AddMode(), std::bind(&SettingsAgent::handleAddMode, this, _1));
    parentService->connect(Settings::Messages::ListModes(), std::bind(&SettingsAgent::handleListModes, this, _1));
    parentService->connect(settings::Messages::AddMode(), std::bind(&SettingsAgent::handleAddMode, this, _1));
    parentService->connect(settings::Messages::ListModes(), std::bind(&SettingsAgent::handleListModes, this, _1));
}

auto SettingsAgent::getDbInitString() -> const std::string


@@ 106,49 100,49 @@ auto SettingsAgent::getAgentName() -> const std::string
}

// dbSingleVar
auto SettingsAgent::dbGetValue(Settings::EntryPath path) -> std::optional<std::string>
auto SettingsAgent::dbGetValue(settings::EntryPath path) -> std::optional<std::string>
{
    // auto retQuery = database->query(Settings::Statements::getValue, path.to_string());
    auto retQuery = database->query(Settings::Statements::getValue, path.variable.c_str());
    // auto retQuery = database->query(settings::Statements::getValue, path.to_string());
    auto retQuery = database->query(settings::Statements::getValue, path.variable.c_str());
    if (nullptr == retQuery || 1 != retQuery->getRowCount()) {
        return std::string{};
    }
    return (*retQuery)[0].getString();
}

auto SettingsAgent::dbSetValue(Settings::EntryPath path, std::string value) -> bool
auto SettingsAgent::dbSetValue(settings::EntryPath path, std::string value) -> bool
{
    /// insert or update
    return database->execute(Settings::Statements::insertValue, path.variable.c_str(), value.c_str());
    return database->execute(settings::Statements::insertValue, path.variable.c_str(), value.c_str());
}

auto SettingsAgent::dbRegisterValueChange(Settings::EntryPath path) -> bool
auto SettingsAgent::dbRegisterValueChange(settings::EntryPath path) -> bool
{
    return database->execute(Settings::Statements::setNotification, path.variable.c_str(), path.service.c_str());
    return database->execute(settings::Statements::setNotification, path.variable.c_str(), path.service.c_str());
}

auto SettingsAgent::dbUnregisterValueChange(Settings::EntryPath path) -> bool
auto SettingsAgent::dbUnregisterValueChange(settings::EntryPath path) -> bool
{
    return database->execute(Settings::Statements::clearNotificationdRow, path.variable.c_str());
    return database->execute(settings::Statements::clearNotificationdRow, path.variable.c_str());
}

// db Profile
auto SettingsAgent::dbRegisterOnProfileChange(const std::string &service) -> bool
{
    return database->execute(Settings::Statements::setNotification, Settings::DbPaths::phone_profile, service.c_str());
    return database->execute(settings::Statements::setNotification, settings::DbPaths::phone_profile, service.c_str());
}
auto SettingsAgent::dbUnregisterOnProfileChange(const std::string &service) -> bool
{
    return database->execute(
        Settings::Statements::clearNotificationdRow, Settings::DbPaths::phone_profile, service.c_str());
        settings::Statements::clearNotificationdRow, settings::DbPaths::phone_profile, service.c_str());
}
auto SettingsAgent::dbSetCurrentProfile(const std::string &profile) -> bool
{
    return database->execute(Settings::Statements::updateValue, profile.c_str(), Settings::DbPaths::phone_profile);
    return database->execute(settings::Statements::updateValue, profile.c_str(), settings::DbPaths::phone_profile);
}
auto SettingsAgent::dbGetCurrentProfile() -> std::string
{
    auto qProfile = database->query(Settings::Statements::getValue, Settings::DbPaths::phone_profile);
    auto qProfile = database->query(settings::Statements::getValue, settings::DbPaths::phone_profile);
    if (nullptr == qProfile || 1 != qProfile->getRowCount()) {
        return std::string{};
    }


@@ 156,7 150,7 @@ auto SettingsAgent::dbGetCurrentProfile() -> std::string
}
auto SettingsAgent::dbGetAllProfiles() -> std::list<std::string>
{
    auto qProfiles = database->query(Settings::Statements::getDictValue, Settings::DbPaths::phone_profile);
    auto qProfiles = database->query(settings::Statements::getDictValue, settings::DbPaths::phone_profile);
    if (nullptr == qProfiles || 0 == qProfiles->getRowCount()) {
        return std::list<std::string>{};
    }


@@ 168,29 162,29 @@ auto SettingsAgent::dbGetAllProfiles() -> std::list<std::string>
}
auto SettingsAgent::dbAddProfile(const std::string &profile) -> bool
{
    return database->execute(Settings::Statements::addDictValue, Settings::DbPaths::phone_profile, profile.c_str());
    return database->execute(settings::Statements::addDictValue, settings::DbPaths::phone_profile, profile.c_str());
}

// dbMode
auto SettingsAgent::dbRegisterOnModeChange(const std::string &service) -> bool
{
    return database->execute(Settings::Statements::setNotification, Settings::DbPaths::phone_mode, service.c_str());
    return database->execute(settings::Statements::setNotification, settings::DbPaths::phone_mode, service.c_str());
}

auto SettingsAgent::dbUnregisterOnModeChange(const std::string &service) -> bool
{
    return database->execute(
        Settings::Statements::clearNotificationdRow, Settings::DbPaths::phone_mode, service.c_str());
        settings::Statements::clearNotificationdRow, settings::DbPaths::phone_mode, service.c_str());
}

auto SettingsAgent::dbSetCurrentMode(const std::string &mode) -> bool
{
    return database->execute(Settings::Statements::updateValue, mode.c_str(), Settings::DbPaths::phone_mode);
    return database->execute(settings::Statements::updateValue, mode.c_str(), settings::DbPaths::phone_mode);
}

auto SettingsAgent::dbGetCurrentMode() -> std::string
{
    auto qMode = database->query(Settings::Statements::getValue, Settings::DbPaths::phone_mode);
    auto qMode = database->query(settings::Statements::getValue, settings::DbPaths::phone_mode);
    if (nullptr == qMode || 1 != qMode->getRowCount()) {
        return std::string{};
    }


@@ 199,7 193,7 @@ auto SettingsAgent::dbGetCurrentMode() -> std::string

auto SettingsAgent::dbGetAllModes() -> std::list<std::string>
{
    auto qModes = database->query(Settings::Statements::getDictValue, Settings::DbPaths::phone_profile);
    auto qModes = database->query(settings::Statements::getDictValue, settings::DbPaths::phone_profile);
    if (nullptr == qModes || 0 == qModes->getRowCount()) {
        return std::list<std::string>{};
    }


@@ 212,24 206,24 @@ auto SettingsAgent::dbGetAllModes() -> std::list<std::string>

auto SettingsAgent::dbAddMode(const std::string &mode) -> bool
{
    return database->execute(Settings::Statements::addDictValue, Settings::DbPaths::phone_mode, mode.c_str());
    return database->execute(settings::Statements::addDictValue, settings::DbPaths::phone_mode, mode.c_str());
}

auto SettingsAgent::handleGetVariable(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::GetVariable *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::GetVariable *>(req)) {

        auto path  = msg->getPath();
        auto value = dbGetValue(path);

        return std::make_shared<Settings::Messages::VariableResponse>(path, value);
        return std::make_shared<settings::Messages::VariableResponse>(path, value);
    }
    return std::make_shared<sys::ResponseMessage>();
};

auto SettingsAgent::handleSetVariable(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::SetVariable *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::SetVariable *>(req)) {

        auto path     = msg->getPath();
        auto value    = msg->getValue().value_or("");


@@ 240,7 234,7 @@ auto SettingsAgent::handleSetVariable(sys::Message *req) -> sys::MessagePointer
            for (auto service : variableChangeRecipents[path.variable]) {
                if (service != path.service) {
                    auto updateMsg =
                        std::make_shared<Settings::Messages::VariableChanged>(path, value, oldValue.value_or(""));
                        std::make_shared<settings::Messages::VariableChanged>(path, value, oldValue.value_or(""));
                    sys::Bus::SendUnicast(std::move(updateMsg), service, parentService);
                }
            }


@@ 251,14 245,14 @@ auto SettingsAgent::handleSetVariable(sys::Message *req) -> sys::MessagePointer

auto SettingsAgent::handleRegisterOnVariableChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::RegisterOnVariableChange *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::RegisterOnVariableChange *>(req)) {
        auto path = msg->getPath();
        if (dbRegisterValueChange(path)) {
            auto it = variableChangeRecipents.find(path.to_string());
            if (variableChangeRecipents.end() == it || it->second.end() == it->second.find(path.service)) {
                variableChangeRecipents[path.to_string()] = {path.service};
                auto currentValue                         = dbGetValue(path).value_or("");
                auto msgValue = std::make_shared<::Settings::Messages::VariableChanged>(path, currentValue, "");
                auto msgValue = std::make_shared<::settings::Messages::VariableChanged>(path, currentValue, "");
                sys::Bus::SendUnicast(std::move(msgValue), msg->sender, parentService);
            }
            else {


@@ 271,7 265,7 @@ auto SettingsAgent::handleRegisterOnVariableChange(sys::Message *req) -> sys::Me

auto SettingsAgent::handleUnregisterOnVariableChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::UnregisterOnVariableChange *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::UnregisterOnVariableChange *>(req)) {
        auto path = msg->getPath();
        if (dbUnregisterValueChange(path)) {
            auto it = variableChangeRecipents.find(path.to_string());


@@ 286,10 280,10 @@ auto SettingsAgent::handleUnregisterOnVariableChange(sys::Message *req) -> sys::
// profile
auto SettingsAgent::handleRegisterProfileChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::RegisterOnProfileChange *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::RegisterOnProfileChange *>(req)) {
        if (dbRegisterOnProfileChange(msg->sender)) {
            profileChangedRecipents.insert(msg->sender);
            auto msgCurrentProfile = std::make_shared<Settings::Messages::CurrentProfileChanged>(dbGetCurrentProfile());
            auto msgCurrentProfile = std::make_shared<settings::Messages::CurrentProfileChanged>(dbGetCurrentProfile());
            sys::Bus::SendUnicast(std::move(msgCurrentProfile), msg->sender, parentService);
        }
    }


@@ 297,7 291,7 @@ auto SettingsAgent::handleRegisterProfileChange(sys::Message *req) -> sys::Messa
}
auto SettingsAgent::handleUnregisterProfileChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::UnregisterOnProfileChange *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::UnregisterOnProfileChange *>(req)) {
        if (dbUnregisterOnProfileChange(msg->sender)) {
            profileChangedRecipents.erase(msg->sender);
        }


@@ 306,12 300,12 @@ auto SettingsAgent::handleUnregisterProfileChange(sys::Message *req) -> sys::Mes
}
auto SettingsAgent::handleSetCurrentProfile(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::SetCurrentProfile *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::SetCurrentProfile *>(req)) {
        auto profile = msg->getProfileName();
        if (dbSetCurrentProfile(profile)) {
            for (auto service : profileChangedRecipents) {
                if (service != msg->sender) {
                    auto msgProfileChanged = std::make_shared<Settings::Messages::CurrentProfileChanged>(profile);
                    auto msgProfileChanged = std::make_shared<settings::Messages::CurrentProfileChanged>(profile);
                    sys::Bus::SendUnicast(std::move(msgProfileChanged), service, parentService);
                }
            }


@@ 321,10 315,10 @@ auto SettingsAgent::handleSetCurrentProfile(sys::Message *req) -> sys::MessagePo
}
auto SettingsAgent::handleGetCurrentProfile(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::GetCurrentProfile *>(req)) {
    if (nullptr != dynamic_cast<settings::Messages::GetCurrentProfile *>(req)) {
        auto service = profileChangedRecipents.find(req->sender);
        if (profileChangedRecipents.end() != service) {
            auto msgCurrentProfile = std::make_shared<Settings::Messages::CurrentProfileChanged>(dbGetCurrentProfile());
            auto msgCurrentProfile = std::make_shared<settings::Messages::CurrentProfileChanged>(dbGetCurrentProfile());
            sys::Bus::SendUnicast(std::move(msgCurrentProfile), *service, parentService);
        }
    }


@@ 332,12 326,12 @@ auto SettingsAgent::handleGetCurrentProfile(sys::Message *req) -> sys::MessagePo
}
auto SettingsAgent::handleAddProfile(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::AddProfile *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::AddProfile *>(req)) {
        if (dbAddProfile(msg->getProfileName())) {
            auto allProfiles = dbGetAllProfiles();
            for (auto service : profileChangedRecipents) {
                if (service != req->sender) {
                    auto msgAllProfiles = std::make_shared<Settings::Messages::ProfileListResponse>(allProfiles);
                    auto msgAllProfiles = std::make_shared<settings::Messages::ProfileListResponse>(allProfiles);
                    sys::Bus::SendUnicast(std::move(msgAllProfiles), service, parentService);
                }
            }


@@ 347,9 341,9 @@ auto SettingsAgent::handleAddProfile(sys::Message *req) -> sys::MessagePointer
}
auto SettingsAgent::handleListProfiles(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::ListProfiles *>(req)) {
    if (nullptr != dynamic_cast<settings::Messages::ListProfiles *>(req)) {
        profileChangedRecipents.insert(req->sender);
        auto msgAllProfiles = std::make_shared<Settings::Messages::ProfileListResponse>(dbGetAllProfiles());
        auto msgAllProfiles = std::make_shared<settings::Messages::ProfileListResponse>(dbGetAllProfiles());
        sys::Bus::SendUnicast(std::move(msgAllProfiles), req->sender, parentService);
    }
    return std::make_shared<sys::ResponseMessage>();


@@ 358,10 352,10 @@ auto SettingsAgent::handleListProfiles(sys::Message *req) -> sys::MessagePointer
// mode
auto SettingsAgent::handleRegisterOnModeChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::RegisterOnModeChange *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::RegisterOnModeChange *>(req)) {
        if (dbRegisterOnModeChange(msg->sender)) {
            modeChangeRecipents.insert(msg->sender);
            auto msgMode = std::make_shared<Settings::Messages::CurrentModeChanged>(dbGetCurrentMode());
            auto msgMode = std::make_shared<settings::Messages::CurrentModeChanged>(dbGetCurrentMode());
            sys::Bus::SendUnicast(std::move(msgMode), msg->sender, parentService);
        }
    }


@@ 369,7 363,7 @@ auto SettingsAgent::handleRegisterOnModeChange(sys::Message *req) -> sys::Messag
}
auto SettingsAgent::handleUnregisterOnModeChange(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::UnregisterOnModeChange *>(req)) {
    if (nullptr != dynamic_cast<settings::Messages::UnregisterOnModeChange *>(req)) {
        dbUnregisterOnModeChange(req->sender);
        modeChangeRecipents.erase(req->sender);
    }


@@ 377,13 371,13 @@ auto SettingsAgent::handleUnregisterOnModeChange(sys::Message *req) -> sys::Mess
}
auto SettingsAgent::handleSetCurrentMode(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::SetCurrentMode *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::SetCurrentMode *>(req)) {
        auto newMode = msg->getProfileName();
        if (dbGetCurrentMode() != newMode) {
            if (dbSetCurrentMode(newMode)) {
                for (auto service : modeChangeRecipents) {
                    if (service != msg->sender) {
                        auto msgModeChanged = std::make_shared<Settings::Messages::CurrentModeChanged>(newMode);
                        auto msgModeChanged = std::make_shared<settings::Messages::CurrentModeChanged>(newMode);
                        sys::Bus::SendUnicast(std::move(msgModeChanged), service, parentService);
                    }
                }


@@ 394,9 388,9 @@ auto SettingsAgent::handleSetCurrentMode(sys::Message *req) -> sys::MessagePoint
}
auto SettingsAgent::handleGetCurrentMode(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::GetCurrentMode *>(req)) {
    if (nullptr != dynamic_cast<settings::Messages::GetCurrentMode *>(req)) {
        if (modeChangeRecipents.end() != modeChangeRecipents.find(req->sender)) {
            auto msgMode = std::make_shared<Settings::Messages::CurrentModeChanged>(dbGetCurrentMode());
            auto msgMode = std::make_shared<settings::Messages::CurrentModeChanged>(dbGetCurrentMode());
            sys::Bus::SendUnicast(std::move(msgMode), req->sender, parentService);
        }
    }


@@ 404,12 398,12 @@ auto SettingsAgent::handleGetCurrentMode(sys::Message *req) -> sys::MessagePoint
}
auto SettingsAgent::handleAddMode(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::AddMode *>(req)) {
    if (auto msg = dynamic_cast<settings::Messages::AddMode *>(req)) {
        if (dbAddMode(msg->getProfileName())) {
            auto allModes = dbGetAllModes();
            for (auto service : modeChangeRecipents) {
                if (service != msg->sender) {
                    auto msgAllModes = std::make_shared<Settings::Messages::ModeListResponse>(allModes);
                    auto msgAllModes = std::make_shared<settings::Messages::ModeListResponse>(allModes);
                    sys::Bus::SendUnicast(std::move(msgAllModes), service, parentService);
                }
            }


@@ 419,9 413,9 @@ auto SettingsAgent::handleAddMode(sys::Message *req) -> sys::MessagePointer
}
auto SettingsAgent::handleListModes(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::ListModes *>(req)) {
    if (nullptr != dynamic_cast<settings::Messages::ListModes *>(req)) {
        modeChangeRecipents.insert(req->sender);
        auto msgAllModes = std::make_shared<Settings::Messages::ModeListResponse>(dbGetAllModes());
        auto msgAllModes = std::make_shared<settings::Messages::ModeListResponse>(dbGetAllModes());
        sys::Bus::SendUnicast(std::move(msgAllModes), req->sender, parentService);
    }
    return std::make_shared<sys::ResponseMessage>();

M module-services/service-db/agents/settings/SettingsAgent.hpp => module-services/service-db/agents/settings/SettingsAgent.hpp +6 -6
@@ 11,10 11,10 @@
#include <optional>
#include <string>

namespace Settings
namespace settings
{
    struct EntryPath;
} // namespace Settings
} // namespace settings
namespace sys
{
    class Service;


@@ 38,10 38,10 @@ class SettingsAgent : public DatabaseAgent
    SetOfRecipents profileChangedRecipents;
    SetOfRecipents modeChangeRecipents;
    // db operations
    auto dbGetValue(Settings::EntryPath path) -> std::optional<std::string>;
    auto dbSetValue(Settings::EntryPath path, std::string value) -> bool;
    auto dbRegisterValueChange(Settings::EntryPath path) -> bool;
    auto dbUnregisterValueChange(Settings::EntryPath path) -> bool;
    auto dbGetValue(settings::EntryPath path) -> std::optional<std::string>;
    auto dbSetValue(settings::EntryPath path, std::string value) -> bool;
    auto dbRegisterValueChange(settings::EntryPath path) -> bool;
    auto dbUnregisterValueChange(settings::EntryPath path) -> bool;

    auto dbRegisterOnProfileChange(const std::string &service) -> bool;
    auto dbUnregisterOnProfileChange(const std::string &service) -> bool;

M module-services/service-db/agents/settings/Settings_queries.hpp => module-services/service-db/agents/settings/Settings_queries.hpp +4 -2
@@ 3,7 3,9 @@

#pragma once

namespace Settings::Statements
#include <log/log.hpp>

namespace settings::Statements
{
    constexpr auto getValue = R"sql(
                         SELECT value


@@ 92,4 94,4 @@ namespace Settings::Statements
                        WHERE path = '%q' AND service = '%q';
                        )sql";

} // namespace Settings::Statements
} // namespace settings::Statements

A module-services/service-db/agents/settings/SystemSettings.hpp => module-services/service-db/agents/settings/SystemSettings.hpp +15 -0
@@ 0,0 1,15 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

namespace settings::SystemProperties
{
    constexpr inline auto timeFormat12    = "gs_time_format_12";
    constexpr inline auto timeDateFormat  = "gs_time_date_format";
    constexpr inline auto activeSim       = "gs_active_sim";
    constexpr inline auto lockPassHash    = "gs_lock_pass_hash";
    constexpr inline auto lockTime        = "gs_lock_time";
    constexpr inline auto displayLanguage = "gs_display_language";
    constexpr inline auto inputLanguage   = "gs_input_language";
}; // namespace settings::SystemProperties

M module-services/service-db/service-db/SettingsMessages.hpp => module-services/service-db/service-db/SettingsMessages.hpp +2 -2
@@ 12,7 12,7 @@
#include <utility>
#include <variant>

namespace Settings
namespace settings
{
    struct EntryPath
    {


@@ 334,4 334,4 @@ namespace Settings
        };

    } // namespace Messages
} // namespace Settings
} // namespace settings

M module-services/service-db/test/test-service-db-settings-api.cpp => module-services/service-db/test/test-service-db-settings-api.cpp +21 -21
@@ 32,16 32,16 @@ TEST_CASE("SettingsApi")
    SECTION("variable/profile/mode register/set/get/unregister")
    {
        std::shared_ptr<sys::SystemManager> manager = std::make_shared<sys::SystemManager>(5000);
        std::shared_ptr<Settings::MyService> varWritter;
        std::shared_ptr<Settings::MyService> varReader;
        std::shared_ptr<Settings::AppTest> testVar;
        std::shared_ptr<Settings::ServiceProfile> profWritter;
        std::shared_ptr<Settings::ServiceProfile> profReader;
        std::shared_ptr<Settings::AppTestProfileMode> testProf;
        std::shared_ptr<settings::MyService> varWritter;
        std::shared_ptr<settings::MyService> varReader;
        std::shared_ptr<settings::AppTest> testVar;
        std::shared_ptr<settings::ServiceProfile> profWritter;
        std::shared_ptr<settings::ServiceProfile> profReader;
        std::shared_ptr<settings::AppTestProfileMode> testProf;
        std::shared_ptr<std::mutex> testStart;
        std::shared_ptr<Settings::ServiceMode> modeWritter;
        std::shared_ptr<Settings::ServiceMode> modeReader;
        std::shared_ptr<Settings::AppTestProfileMode> testMode;
        std::shared_ptr<settings::ServiceMode> modeWritter;
        std::shared_ptr<settings::ServiceMode> modeReader;
        std::shared_ptr<settings::AppTestProfileMode> testMode;

        manager->StartSystem([manager,
                              &varWritter,


@@ 62,44 62,44 @@ TEST_CASE("SettingsApi")
                                                         manager.get());
            ret &= sys::SystemManager::CreateService(std::make_shared<ServiceDB>(), manager.get());

            varWritter = std::make_shared<Settings::MyService>("writterVar");
            varReader  = std::make_shared<Settings::MyService>("readerVar");
            varWritter = std::make_shared<settings::MyService>("writterVar");
            varReader  = std::make_shared<settings::MyService>("readerVar");

            ret &= sys::SystemManager::CreateService(varWritter, manager.get());
            ret &= sys::SystemManager::CreateService(varReader, manager.get());

            testVar = std::make_shared<Settings::AppTest>("appTest", varWritter, varReader, testStart);
            testVar = std::make_shared<settings::AppTest>("appTest", varWritter, varReader, testStart);
            ret &= sys::SystemManager::CreateService(testVar, manager.get());

            profWritter = std::make_shared<Settings::ServiceProfile>("writterProf");
            profReader  = std::make_shared<Settings::ServiceProfile>("readerProf");
            profWritter = std::make_shared<settings::ServiceProfile>("writterProf");
            profReader  = std::make_shared<settings::ServiceProfile>("readerProf");

            ret &= sys::SystemManager::CreateService(profWritter, manager.get());
            ret &= sys::SystemManager::CreateService(profReader, manager.get());

            testProf =
                std::make_shared<Settings::AppTestProfileMode>("appTestProfile", profWritter, profReader, testStart);
                std::make_shared<settings::AppTestProfileMode>("appTestProfile", profWritter, profReader, testStart);
            ret &= sys::SystemManager::CreateService(testProf, manager.get());

            modeWritter = std::make_shared<Settings::ServiceMode>("writterMode");
            modeReader  = std::make_shared<Settings::ServiceMode>("readerMode");
            modeWritter = std::make_shared<settings::ServiceMode>("writterMode");
            modeReader  = std::make_shared<settings::ServiceMode>("readerMode");

            ret &= sys::SystemManager::CreateService(modeWritter, manager.get());
            ret &= sys::SystemManager::CreateService(modeReader, manager.get());

            testMode =
                std::make_shared<Settings::AppTestProfileMode>("appTestMode", modeWritter, modeReader, testStart);
                std::make_shared<settings::AppTestProfileMode>("appTestMode", modeWritter, modeReader, testStart);
            ret &= sys::SystemManager::CreateService(testMode, manager.get());

            std::cout << "koniec start thr_id: " << std::this_thread::get_id() << std::endl << std::flush;
            testStart->unlock();
            auto msgStart = std::make_shared<Settings::UTMsg::UTMsgStart>();
            auto msgStart = std::make_shared<settings::UTMsg::UTMsgStart>();
            sys::Bus::SendUnicast(std::move(msgStart), "appTest", manager.get());

            msgStart = std::make_shared<Settings::UTMsg::UTMsgStart>();
            msgStart = std::make_shared<settings::UTMsg::UTMsgStart>();
            sys::Bus::SendUnicast(std::move(msgStart), "appTestProfile", manager.get());

            msgStart = std::make_shared<Settings::UTMsg::UTMsgStart>();
            msgStart = std::make_shared<settings::UTMsg::UTMsgStart>();
            sys::Bus::SendUnicast(std::move(msgStart), "appTestMode", manager.get());

            return ret;

M module-services/service-db/test/test-service-db-settings-messages.cpp => module-services/service-db/test/test-service-db-settings-messages.cpp +30 -30
@@ 15,19 15,19 @@
#include <service-db/SettingsMessages.hpp> // for SetVariable, ListProfiles, GetVariable, AddMode, AddProfile, CurrentModeChanged, CurrentProfileChanged, EntryPath, GetCurrentMode, GetCurrentProfile, ListModes, ModeListResponse, ProfileListResponse, RegisterOnVariableChange, UnregisterOnVariableChange, VariableChanged, VariableResponse
#include "Service/Common.hpp"            // for ReturnCodes, ReturnCodes::Success, ServicePowerMode

namespace Settings
namespace settings
{
    class Service : public sys::Service
    {
      public:
        using sys::Service::Service;

        auto getValue(Settings::EntryPath path) -> std::optional<std::string>
        auto getValue(settings::EntryPath path) -> std::optional<std::string>
        {
            return "";
        }

        std::string setValue(Settings::EntryPath path, std::string value)
        std::string setValue(settings::EntryPath path, std::string value)
        {
            // insert into ...
            return value;


@@ 43,8 43,8 @@ namespace Settings
            using std::placeholders::_1;
            using std::placeholders::_2;

            connect(Settings::Messages::GetVariable(), std::bind(&Service::handleGetVariable, this, _1));
            connect(Settings::Messages::SetVariable(), std::bind(&Service::handleSetVariable, this, _1));
            connect(settings::Messages::GetVariable(), std::bind(&Service::handleGetVariable, this, _1));
            connect(settings::Messages::SetVariable(), std::bind(&Service::handleSetVariable, this, _1));

            return sys::ReturnCodes::Success;
        }


@@ 61,25 61,25 @@ namespace Settings

        sys::MessagePointer handleGetVariable(sys::Message *req)
        {
            if (auto msg = dynamic_cast<Settings::Messages::GetVariable *>(req)) {
            if (auto msg = dynamic_cast<settings::Messages::GetVariable *>(req)) {

                auto path  = msg->getPath();
                auto value = getValue(path);

                return std::make_shared<Settings::Messages::VariableResponse>(path, value);
                return std::make_shared<settings::Messages::VariableResponse>(path, value);
            }
            return std::make_shared<sys::ResponseMessage>();
        };

        sys::MessagePointer handleSetVariable(sys::Message *req)
        {
            if (auto msg = dynamic_cast<Settings::Messages::SetVariable *>(req)) {
            if (auto msg = dynamic_cast<settings::Messages::SetVariable *>(req)) {

                auto path      = msg->getPath();
                auto value     = msg->getValue().value_or("");
                auto old_value = setValue(path, msg->getValue().value_or(""));

                auto update_msg = std::make_shared<Settings::Messages::VariableChanged>(path, value, old_value);
                auto update_msg = std::make_shared<settings::Messages::VariableChanged>(path, value, old_value);
                sys::Bus::SendUnicast(std::move(update_msg), "db-worker", this);
            }
            return std::make_shared<sys::ResponseMessage>();


@@ 87,74 87,74 @@ namespace Settings

        sys::MessagePointer handleListProfiles(sys::Message *req)
        {
            if (dynamic_cast<Settings::Messages::ListProfiles *>(req) != nullptr) {
            if (dynamic_cast<settings::Messages::ListProfiles *>(req) != nullptr) {
                std::list<std::string> profiles = {"silent", "loud"};
                return std::make_shared<Settings::Messages::ProfileListResponse>(profiles);
                return std::make_shared<settings::Messages::ProfileListResponse>(profiles);
            }
            return std::make_shared<sys::ResponseMessage>();
        };

        sys::MessagePointer handleListModes(sys::Message *req)
        {
            if (dynamic_cast<Settings::Messages::ListProfiles *>(req) != nullptr) {
            if (dynamic_cast<settings::Messages::ListProfiles *>(req) != nullptr) {
                std::list<std::string> modes = {"mode1", "mode2"};
                return std::make_shared<Settings::Messages::ModeListResponse>(modes);
                return std::make_shared<settings::Messages::ModeListResponse>(modes);
            }
            return std::make_shared<sys::ResponseMessage>();
        };
    };
} // namespace Settings
} // namespace settings

TEST_CASE("Settings Messages")
{
    SECTION("Init handler")
    {
        Settings::Service settings("settings");
        settings::Service settings("settings");
        settings.InitHandler();
    }

    SECTION("Send register messages")
    {
        Settings::Service settings("settings");
        settings::Service settings("settings");
        settings.InitHandler();

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::RegisterOnVariableChange>(
                                  Settings::EntryPath({"mode", "service", "profile", "variable"})),
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::RegisterOnVariableChange>(
                                  settings::EntryPath({"mode", "service", "profile", "variable"})),
                              "db-worker",
                              &settings);

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::UnregisterOnVariableChange>(
                                  Settings::EntryPath({"mode", "service", "profile", "variable"})),
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::UnregisterOnVariableChange>(
                                  settings::EntryPath({"mode", "service", "profile", "variable"})),
                              "db-worker",
                              &settings);
    }

    SECTION("Send profile messages")
    {
        Settings::Service settings("settings");
        settings::Service settings("settings");
        settings.InitHandler();

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::ListProfiles>(), "settings", &settings);
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::ListProfiles>(), "settings", &settings);

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::AddProfile>("new-profile"), "settings", &settings);
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::AddProfile>("new-profile"), "settings", &settings);

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::GetCurrentProfile>(), "settings", &settings);
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::GetCurrentProfile>(), "settings", &settings);

        sys::Bus::SendUnicast(
            std::make_shared<Settings::Messages::CurrentProfileChanged>("profile"), "settings", &settings);
            std::make_shared<settings::Messages::CurrentProfileChanged>("profile"), "settings", &settings);
    }

    SECTION("Send mode messages")
    {
        Settings::Service settings("settings");
        settings::Service settings("settings");
        settings.InitHandler();

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::ListModes>(), "settings", &settings);
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::ListModes>(), "settings", &settings);

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::GetCurrentMode>(), "settings", &settings);
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::GetCurrentMode>(), "settings", &settings);

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::AddMode>("new-mode"), "settings", &settings);
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::AddMode>("new-mode"), "settings", &settings);

        sys::Bus::SendUnicast(std::make_shared<Settings::Messages::CurrentModeChanged>("mode"), "settings", &settings);
        sys::Bus::SendUnicast(std::make_shared<settings::Messages::CurrentModeChanged>("mode"), "settings", &settings);
    }
}

M module-services/service-db/test/test-service-db-settings-testapps.hpp => module-services/service-db/test/test-service-db-settings-testapps.hpp +29 -29
@@ 1,7 1,7 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

namespace Settings
namespace settings
{
    class TestService : public sys::Service
    {


@@ 80,7 80,7 @@ namespace Settings
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
            if (nullptr != dynamic_cast<::Settings::UTMsg::UTMsgStart *>(msg)) {
            if (nullptr != dynamic_cast<settings::UTMsg::UTMsgStart *>(msg)) {
                testStart->lock();
                testStart->unlock();
                if (state != State::Unk) {


@@ 88,50 88,50 @@ namespace Settings
                }
                else {
                    state    = State::Start;
                    auto msg = std::make_shared<::Settings::UTMsg::ReqRegValChg>("brightness", "none");
                    auto msg = std::make_shared<settings::UTMsg::ReqRegValChg>("brightness", "none");
                    sys::Bus::SendUnicast(std::move(msg), getter->GetName(), this);
                }
            }
            else if (nullptr != dynamic_cast<::Settings::UTMsg::CnfRegValChg *>(msg)) {
            else if (nullptr != dynamic_cast<settings::UTMsg::CnfRegValChg *>(msg)) {
                if (state == State::Start) {
                    state = State::Register;
                }
            }
            else if (auto m = dynamic_cast<::Settings::UTMsg::CnfValChg *>(msg)) {
            else if (auto m = dynamic_cast<settings::UTMsg::CnfValChg *>(msg)) {
                if (state == State::Register) {
                    state = State::RegisterStartVal;
                    v.push_back(m->value);
                    auto msg = std::make_shared<::Settings::UTMsg::ReqSetVal>("brightness", v[0] + "1");
                    auto msg = std::make_shared<settings::UTMsg::ReqSetVal>("brightness", v[0] + "1");
                    sys::Bus::SendUnicast(std::move(msg), setter->GetName(), this);
                }
                else if (state == State::RegisterSetVal) {
                    if (m->value == v[0] + "1") {
                        v.push_back(m->value);
                        auto msg = std::make_shared<::Settings::UTMsg::ReqUnRegValChg>("brightness", "empty");
                        auto msg = std::make_shared<settings::UTMsg::ReqUnRegValChg>("brightness", "empty");
                        sys::Bus::SendUnicast(std::move(msg), getter->GetName(), this);
                        state = State::UnregisterWait;
                    }
                }
            }
            else if (nullptr != dynamic_cast<::Settings::UTMsg::CnfUnRegValChg *>(msg)) {
            else if (nullptr != dynamic_cast<settings::UTMsg::CnfUnRegValChg *>(msg)) {
                if (state == State::UnregisterWait) {
                    state    = State::Unregister;
                    auto msg = std::make_shared<::Settings::UTMsg::ReqSetVal>("brightness", v.back() + "2");
                    auto msg = std::make_shared<settings::UTMsg::ReqSetVal>("brightness", v.back() + "2");
                    sys::Bus::SendUnicast(std::move(msg), setter->GetName(), this);
                }
            }
            else if (auto m = dynamic_cast<::Settings::UTMsg::CnfReqSetVal *>(msg)) {
            else if (auto m = dynamic_cast<settings::UTMsg::CnfReqSetVal *>(msg)) {
                if (state == State::RegisterStartVal) {
                    state = State::RegisterSetVal;
                }
                else if (state == State::Unregister) {
                    std::this_thread::sleep_for(std::chrono::milliseconds(200));
                    v.push_back(m->value);
                    auto msg = std::make_shared<::Settings::UTMsg::UTMsgStop>();
                    auto msg = std::make_shared<settings::UTMsg::UTMsgStop>();
                    sys::Bus::SendUnicast(std::move(msg), GetName(), this);
                }
            }
            else if (nullptr != dynamic_cast<::Settings::UTMsg::UTMsgStop *>(msg)) {
            else if (nullptr != dynamic_cast<settings::UTMsg::UTMsgStop *>(msg)) {
                if (state == State::Unregister) {
                    sys::SystemManager::CloseSystem(this);
                }


@@ 153,7 153,7 @@ namespace Settings
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
            if (nullptr != dynamic_cast<::Settings::UTMsg::UTMsgStart *>(msg)) {
            if (nullptr != dynamic_cast<settings::UTMsg::UTMsgStart *>(msg)) {
                testStart->lock();
                testStart->unlock();
                if (state != State::Unk) {


@@ 161,60 161,60 @@ namespace Settings
                }
                else {
                    state    = State::Start;
                    auto msg = std::make_shared<::Settings::UTMsg::ReqRegProfileChg>();
                    auto msg = std::make_shared<settings::UTMsg::ReqRegProfileChg>();
                    sys::Bus::SendUnicast(std::move(msg), getter->GetName(), this);
                }
            }
            else if (nullptr != dynamic_cast<::Settings::UTMsg::CnfRegProfileChg *>(msg)) {
            else if (nullptr != dynamic_cast<settings::UTMsg::CnfRegProfileChg *>(msg)) {
                if (state == State::Start) {
                    state = State::Register;
                }
            }
            else if (auto m = dynamic_cast<::Settings::UTMsg::ProfileChg *>(msg)) {
            else if (auto m = dynamic_cast<settings::UTMsg::ProfileChg *>(msg)) {
                if (state == State::Register) {
                    state = State::RegisterStartVal;
                    v.push_back(m->name);
                    auto msg = std::make_shared<::Settings::UTMsg::ReqSetCurrentProfile>(m->name + "1");
                    auto msg = std::make_shared<settings::UTMsg::ReqSetCurrentProfile>(m->name + "1");
                    sys::Bus::SendUnicast(std::move(msg), setter->GetName(), this);
                }
                else if (state == State::RegisterSetVal) {
                    if (m->name == v[0] + "1") {
                        v.push_back(m->name);
                        auto msg = std::make_shared<::Settings::UTMsg::ReqUnRegProfileChg>();
                        auto msg = std::make_shared<settings::UTMsg::ReqUnRegProfileChg>();
                        sys::Bus::SendUnicast(std::move(msg), getter->GetName(), this);
                        state = State::UnregisterWait;
                    }
                }
            }
            else if (nullptr != dynamic_cast<::Settings::UTMsg::CnfUnRegProfileChg *>(msg)) {
            else if (nullptr != dynamic_cast<settings::UTMsg::CnfUnRegProfileChg *>(msg)) {
                if (state == State::UnregisterWait) {
                    state    = State::Unregister;
                    auto msg = std::make_shared<::Settings::UTMsg::ReqSetCurrentProfile>(v.back() + "2");
                    auto msg = std::make_shared<settings::UTMsg::ReqSetCurrentProfile>(v.back() + "2");
                    sys::Bus::SendUnicast(std::move(msg), setter->GetName(), this);
                }
            }
            else if (auto m = dynamic_cast<::Settings::UTMsg::CnfSetCurrentProfile *>(msg)) {
            else if (auto m = dynamic_cast<settings::UTMsg::CnfSetCurrentProfile *>(msg)) {
                if (state == State::RegisterStartVal) {
                    state = State::RegisterSetVal;
                }
                else if (state == State::Unregister) {
                    v.push_back(m->name);
                    auto msg = std::make_shared<::Settings::UTMsg::ReqGetAllProfiles>();
                    auto msg = std::make_shared<settings::UTMsg::ReqGetAllProfiles>();
                    sys::Bus::SendUnicast(std::move(msg), getter->GetName(), this);
                }
            }
            else if (nullptr != dynamic_cast<::Settings::UTMsg::CnfGetAllProfiles *>(msg)) {
            else if (nullptr != dynamic_cast<settings::UTMsg::CnfGetAllProfiles *>(msg)) {
                if (state == State::Unregister) {
                    state = State::RegisterAllWait;
                }
            }
            else if (auto m = dynamic_cast<::Settings::UTMsg::ProfilesChg *>(msg)) {
            else if (auto m = dynamic_cast<settings::UTMsg::ProfilesChg *>(msg)) {
                if (state == State::RegisterAllWait) {
                    state = State::RegisterAll;
                    for (auto prof : m->profiles) {
                        v.push_back(prof);
                    }
                    auto msg = std::make_shared<::Settings::UTMsg::ReqAddProfile>("other");
                    auto msg = std::make_shared<settings::UTMsg::ReqAddProfile>("other");
                    sys::Bus::SendUnicast(std::move(msg), setter->GetName(), this);
                }
                else if (state == State::RegisterAllAddWait) {


@@ 223,16 223,16 @@ namespace Settings
                        v.push_back(prof);
                    }
                    std::this_thread::sleep_for(std::chrono::milliseconds(200));
                    auto msg = std::make_shared<::Settings::UTMsg::UTMsgStop>();
                    auto msg = std::make_shared<settings::UTMsg::UTMsgStop>();
                    sys::Bus::SendUnicast(std::move(msg), GetName(), this);
                }
            }
            else if (nullptr != dynamic_cast<::Settings::UTMsg::CnfAddProfile *>(msg)) {
            else if (nullptr != dynamic_cast<settings::UTMsg::CnfAddProfile *>(msg)) {
                if (state == State::RegisterAll) {
                    state = State::RegisterAllAddWait;
                }
            }
            else if (nullptr != dynamic_cast<::Settings::UTMsg::UTMsgStop *>(msg)) {
            else if (nullptr != dynamic_cast<settings::UTMsg::UTMsgStop *>(msg)) {
                if (state == State::RegisterAllAdd) {
                    sys::SystemManager::CloseSystem(this);
                }


@@ 241,4 241,4 @@ namespace Settings
            return std::make_shared<sys::ResponseMessage>();
        }
    };
} // namespace Settings
} // namespace settings

M module-services/service-db/test/test-service-db-settings-testmsgs.hpp => module-services/service-db/test/test-service-db-settings-testmsgs.hpp +4 -4
@@ 1,15 1,15 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

namespace Settings
namespace settings
{
    namespace UTMsg
    {
        class SettingsUTMsg : public ::Settings::Messages::SettingsMessage
        class SettingsUTMsg : public ::settings::Messages::SettingsMessage
        {
          public:
            explicit SettingsUTMsg(MessageType type = MessageType::Settings)
                : ::Settings::Messages::SettingsMessage(type){};
                : ::settings::Messages::SettingsMessage(type){};
            ~SettingsUTMsg() override = default;
        };



@@ 174,4 174,4 @@ namespace Settings
            {}
        };
    }; // namespace UTMsg
} // namespace Settings
} // namespace settings

M module-services/service-db/test/test-service-db-settings-testservices.hpp => module-services/service-db/test/test-service-db-settings-testservices.hpp +40 -40
@@ 1,16 1,16 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

namespace Settings
namespace settings
{
    class MyService : public sys::Service
    {
      public:
        MyService(const std::string &name) : sys::Service(name)
        {
            mySettings = std::make_shared<::Settings::Settings>(this);
            mySettings = std::make_shared<settings::Settings>(this);
        }
        std::shared_ptr<::Settings::Settings> mySettings;
        std::shared_ptr<settings::Settings> mySettings;
        std::vector<std::pair<std::string, std::string>> valChanged;
        std::string whoRequestedNotifyOnChange;
        void ValueChanged(const std::string &name, std::optional<std::string> value)


@@ 25,33 25,33 @@ namespace Settings
        }
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        {
            if (auto msg = dynamic_cast<::Settings::UTMsg::ReqRegValChg *>(req)) {
            if (auto msg = dynamic_cast<settings::UTMsg::ReqRegValChg *>(req)) {
                debug("ReqRegValChg", msg->name, msg->value);
                whoRequestedNotifyOnChange = msg->sender;
                mySettings->registerValueChange(
                    msg->name, ([this](const std::string &name, std::optional<std::string> value) {
                        ValueChanged(name, value);
                        auto cnf = std::make_shared<::Settings::UTMsg::CnfValChg>(name, value.value_or(""));
                        auto cnf = std::make_shared<settings::UTMsg::CnfValChg>(name, value.value_or(""));
                        sys::Bus::SendUnicast(std::move(cnf), whoRequestedNotifyOnChange, this);
                    }));
                auto cnf = std::make_shared<::Settings::UTMsg::CnfRegValChg>(msg->name, msg->value);
                auto cnf = std::make_shared<settings::UTMsg::CnfRegValChg>(msg->name, msg->value);
                sys::Bus::SendUnicast(std::move(cnf), whoRequestedNotifyOnChange, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqUnRegValChg *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqUnRegValChg *>(req)) {
                // unregister
                debug("ReqUnRegValChg", msg->name, msg->value);
                mySettings->unregisterValueChange(msg->name);
                auto cnf = std::make_shared<::Settings::UTMsg::CnfUnRegValChg>(msg->name, msg->value);
                auto cnf = std::make_shared<settings::UTMsg::CnfUnRegValChg>(msg->name, msg->value);
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqSetVal *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqSetVal *>(req)) {
                // set value
                debug("ReqSetVal", msg->name, msg->value);
                mySettings->setValue(msg->name, msg->value);
                auto cnf = std::make_shared<::Settings::UTMsg::CnfReqSetVal>(msg->name, msg->value);
                auto cnf = std::make_shared<settings::UTMsg::CnfReqSetVal>(msg->name, msg->value);
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }
            else if (dynamic_cast<::Settings::UTMsg::ReqGetVal *>(msg)) {
            else if (dynamic_cast<settings::UTMsg::ReqGetVal *>(msg)) {
                debug("ReqGetValChg", msg->name, msg->value);
            }
            return std::make_shared<sys::ResponseMessage>();


@@ 77,49 77,49 @@ namespace Settings
      public:
        ServiceProfile(const std::string &name) : MyService(name)
        {}
        ::Settings::Settings::ListOfProfiles profiles;
        settings::Settings::ListOfProfiles profiles;
        std::string profile;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        {
            if (auto msg = dynamic_cast<::Settings::UTMsg::ReqRegProfileChg *>(req)) {
            if (auto msg = dynamic_cast<settings::UTMsg::ReqRegProfileChg *>(req)) {
                debug("ReqRegProfileChg", msg->name, msg->value);
                whoRequestedNotifyOnChange = msg->sender;
                mySettings->registerProfileChange(([this](const std::string &profile) {
                    this->profile = profile;
                    auto cnf      = std::make_shared<::Settings::UTMsg::ProfileChg>(profile);
                    auto cnf      = std::make_shared<settings::UTMsg::ProfileChg>(profile);
                    sys::Bus::SendUnicast(std::move(cnf), whoRequestedNotifyOnChange, this);
                }));
                auto cnf = std::make_shared<::Settings::UTMsg::CnfRegProfileChg>();
                auto cnf = std::make_shared<settings::UTMsg::CnfRegProfileChg>();
                sys::Bus::SendUnicast(std::move(cnf), whoRequestedNotifyOnChange, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqUnRegProfileChg *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqUnRegProfileChg *>(req)) {
                // unregister
                debug("ReqUnRegProfileChg", msg->name, msg->value);
                mySettings->unregisterProfileChange();
                auto cnf = std::make_shared<::Settings::UTMsg::CnfUnRegProfileChg>();
                auto cnf = std::make_shared<settings::UTMsg::CnfUnRegProfileChg>();
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqSetCurrentProfile *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqSetCurrentProfile *>(req)) {
                // set value
                debug("ReqSetCurrentProfile", msg->name, msg->value);
                mySettings->setCurrentProfile(msg->name);
                auto cnf = std::make_shared<::Settings::UTMsg::CnfSetCurrentProfile>(msg->name);
                auto cnf = std::make_shared<settings::UTMsg::CnfSetCurrentProfile>(msg->name);
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqGetAllProfiles *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqGetAllProfiles *>(req)) {
                debug("ReqGetAllProfiles", msg->name, msg->value);
                mySettings->getAllProfiles(([this](const ::Settings::Settings::ListOfProfiles &profiles) {
                mySettings->getAllProfiles(([this](const settings::Settings::ListOfProfiles &profiles) {
                    this->profiles = profiles;
                    auto cnf       = std::make_shared<::Settings::UTMsg::ProfilesChg>(profiles);
                    auto cnf       = std::make_shared<settings::UTMsg::ProfilesChg>(profiles);
                    sys::Bus::SendUnicast(std::move(cnf), whoRequestedNotifyOnChange, this);
                }));
                auto cnf = std::make_shared<::Settings::UTMsg::CnfGetAllProfiles>();
                auto cnf = std::make_shared<settings::UTMsg::CnfGetAllProfiles>();
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqAddProfile *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqAddProfile *>(req)) {
                debug("ReqAddProfile", msg->name, msg->value);
                mySettings->addProfile(msg->name);
                auto cnf = std::make_shared<::Settings::UTMsg::CnfAddProfile>(msg->name);
                auto cnf = std::make_shared<settings::UTMsg::CnfAddProfile>(msg->name);
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }



@@ 132,53 132,53 @@ namespace Settings
      public:
        ServiceMode(const std::string &name) : MyService(name)
        {}
        ::Settings::Settings::ListOfModes modes;
        settings::Settings::ListOfModes modes;
        std::string mode;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        {
            if (auto msg = dynamic_cast<::Settings::UTMsg::ReqRegProfileChg *>(req)) {
            if (auto msg = dynamic_cast<settings::UTMsg::ReqRegProfileChg *>(req)) {
                debug("ReqRegProfileChg", msg->name, msg->value);
                whoRequestedNotifyOnChange = msg->sender;
                mySettings->registerModeChange(([this](const std::string &mode) {
                    this->mode = mode;
                    auto cnf   = std::make_shared<::Settings::UTMsg::ProfileChg>(mode);
                    auto cnf   = std::make_shared<settings::UTMsg::ProfileChg>(mode);
                    sys::Bus::SendUnicast(std::move(cnf), whoRequestedNotifyOnChange, this);
                }));
                auto cnf = std::make_shared<::Settings::UTMsg::CnfRegProfileChg>();
                auto cnf = std::make_shared<settings::UTMsg::CnfRegProfileChg>();
                sys::Bus::SendUnicast(std::move(cnf), whoRequestedNotifyOnChange, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqUnRegProfileChg *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqUnRegProfileChg *>(req)) {
                // unregister
                debug("ReqUnRegProfileChg", msg->name, msg->value);
                mySettings->unregisterModeChange();
                auto cnf = std::make_shared<::Settings::UTMsg::CnfUnRegProfileChg>();
                auto cnf = std::make_shared<settings::UTMsg::CnfUnRegProfileChg>();
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqSetCurrentProfile *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqSetCurrentProfile *>(req)) {
                // set value
                debug("ReqSetCurrentProfile", msg->name, msg->value);
                mySettings->setCurrentMode(msg->name);
                auto cnf = std::make_shared<::Settings::UTMsg::CnfSetCurrentProfile>(msg->name);
                auto cnf = std::make_shared<settings::UTMsg::CnfSetCurrentProfile>(msg->name);
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqGetAllProfiles *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqGetAllProfiles *>(req)) {
                debug("ReqGetAllProfiles", msg->name, msg->value);
                mySettings->getAllModes(([this](const ::Settings::Settings::ListOfModes &modes) {
                mySettings->getAllModes(([this](const settings::Settings::ListOfModes &modes) {
                    this->modes = modes;
                    auto cnf    = std::make_shared<::Settings::UTMsg::ProfilesChg>(modes);
                    auto cnf    = std::make_shared<settings::UTMsg::ProfilesChg>(modes);
                    sys::Bus::SendUnicast(std::move(cnf), whoRequestedNotifyOnChange, this);
                }));
                auto cnf = std::make_shared<::Settings::UTMsg::CnfGetAllProfiles>();
                auto cnf = std::make_shared<settings::UTMsg::CnfGetAllProfiles>();
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }
            else if (auto msg = dynamic_cast<::Settings::UTMsg::ReqAddProfile *>(req)) {
            else if (auto msg = dynamic_cast<settings::UTMsg::ReqAddProfile *>(req)) {
                debug("ReqAddProfile", msg->name, msg->value);
                mySettings->addMode(msg->name);
                auto cnf = std::make_shared<::Settings::UTMsg::CnfAddProfile>(msg->name);
                auto cnf = std::make_shared<settings::UTMsg::CnfAddProfile>(msg->name);
                sys::Bus::SendUnicast(std::move(cnf), msg->sender, this);
            }

            return std::make_shared<sys::ResponseMessage>();
        }
    };
} // namespace Settings
} // namespace settings