~aleteoryx/muditaos

9095333b2c10af0127725c41c854c53453f41787 — Bartek Cichocki 5 years ago 9ce0ece
[EGD-3502] PR fixes
57 files changed, 577 insertions(+), 489 deletions(-)

M .idea/runConfigurations/PurePhone.xml
M changelog.md
M module-apps/DatabaseModel.hpp
M module-db/Common/Query.cpp
M module-db/Common/Query.hpp
M module-db/Interface/ContactRecord.cpp
M module-db/Interface/ContactRecord.hpp
M module-db/Interface/SMSRecord.cpp
M module-db/Interface/SMSRecord.hpp
M module-db/Interface/SMSTemplateRecord.cpp
M module-db/Interface/SMSTemplateRecord.hpp
M module-db/queries/phonebook/QueryContactGetByID.hpp
M module-db/queries/phonebook/QueryContactRemove.hpp
M module-db/queries/sms/QuerySMSGetByContactID.hpp
M module-db/queries/sms/QuerySMSGetByID.hpp
M module-db/queries/sms/QuerySMSGetByText.hpp
M module-db/queries/sms/QuerySMSRemove.hpp
M module-db/queries/sms/QuerySMSTemplateGet.hpp
M module-db/queries/sms/QuerySMSTemplateGetByID.hpp
M module-db/queries/sms/QuerySMSTemplateRemove.hpp
M module-db/queries/sms/QuerySMSThreadsGet.hpp
M module-services/service-desktop/ServiceDesktop.cpp
M module-services/service-desktop/WorkerDesktop.cpp
M module-services/service-desktop/WorkerDesktop.hpp
M module-services/service-desktop/endpoints/Context.hpp
M module-services/service-desktop/endpoints/DBHelper.hpp
M module-services/service-desktop/endpoints/Endpoint.hpp
M module-services/service-desktop/endpoints/EndpointFactory.hpp
M module-services/service-desktop/endpoints/backup/BackupEndpoint.cpp
M module-services/service-desktop/endpoints/backup/BackupEndpoint.hpp
M module-services/service-desktop/endpoints/contacts/ContactHelper.cpp
M module-services/service-desktop/endpoints/contacts/ContactHelper.hpp
M module-services/service-desktop/endpoints/contacts/ContactsEndpoint.cpp
M module-services/service-desktop/endpoints/contacts/ContactsEndpoint.hpp
M module-services/service-desktop/endpoints/deviceInfo/DeviceInfoEndpoint.cpp
M module-services/service-desktop/endpoints/deviceInfo/DeviceInfoEndpoint.hpp
M module-services/service-desktop/endpoints/factoryReset/FactoryResetEndpoint.cpp
M module-services/service-desktop/endpoints/factoryReset/FactoryResetEndpoint.hpp
M module-services/service-desktop/endpoints/messages/MessageHelper.cpp
M module-services/service-desktop/endpoints/messages/MessageHelper.hpp
M module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp
M module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp
M module-services/service-desktop/endpoints/restore/RestoreEndpoint.cpp
M module-services/service-desktop/endpoints/restore/RestoreEndpoint.hpp
M module-services/service-desktop/endpoints/update/UpdateEndpoint.cpp
M module-services/service-desktop/endpoints/update/UpdateEndpoint.hpp
M module-services/service-desktop/parser/CMakeLists.txt
M module-services/service-desktop/parser/MessageHandler.cpp
M module-services/service-desktop/parser/MessageHandler.hpp
R module-services/service-desktop/parser/{ParserStateMachine => ParserFSM}.cpp
R module-services/service-desktop/parser/{ParserStateMachine => ParserFSM}.hpp
M module-services/service-desktop/parser/ParserUtils.cpp
M module-services/service-desktop/parser/ParserUtils.hpp
M module-services/service-desktop/tests/unittest.cpp
M module-utils/log/debug.hpp
R module-vfs/board/cross/freeRTOS_FAT/portable/{common.c => common.cpp}
M module-vfs/targets/Target_Cross.cmake
M .idea/runConfigurations/PurePhone.xml => .idea/runConfigurations/PurePhone.xml +1 -1
@@ 1,5 1,5 @@
<component name="ProjectRunConfigurationManager">
  <configuration default="false" name="PurePhone" type="CMakeRunConfiguration" factoryName="Application" activateToolWindowBeforeRun="false" WORKING_DIR="file://$PROJECT_DIR$/build-linux" PASS_PARENT_ENVS_2="true" PROJECT_NAME="PurePhone" TARGET_NAME="PurePhone" CONFIG_NAME="Linux" RUN_TARGET_PROJECT_NAME="PurePhone" RUN_TARGET_NAME="PurePhone">
  <configuration default="false" name="PurePhone" type="CMakeRunConfiguration" factoryName="Application" activateToolWindowBeforeRun="false" REDIRECT_INPUT="false" WORKING_DIR="file://$CMakeCurrentBuildDir$" PASS_PARENT_ENVS_2="true" PROJECT_NAME="PurePhone" TARGET_NAME="PurePhone" CONFIG_NAME="Linux" RUN_TARGET_PROJECT_NAME="PurePhone" RUN_TARGET_NAME="PurePhone">
    <method v="2">
      <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
    </method>

M changelog.md => changelog.md +3 -0
@@ 38,6 38,9 @@
* `[gui]` Fixed label padding handling.
* `[settings]` Fixed settings info.

### Other
* `[desktop]` Rewritten message handling.

## [0.34.2 - 2020-08-21]

### Changed

M module-apps/DatabaseModel.hpp => module-apps/DatabaseModel.hpp +1 -1
@@ 57,7 57,7 @@ namespace app
        {
            auto index = modelIndex;

            if ((index < 0) || (index >= records.size())) {
            if (index >= records.size()) {
                return nullptr;
            }


M module-db/Common/Query.cpp => module-db/Common/Query.cpp +7 -7
@@ 5,23 5,23 @@

using namespace db;

Query::Query(Type type, QueryListener *listener) : type(type), listener(listener)
Query::Query(Type type, QueryListener *listener) : type(type), queryListener(listener)
{}

QueryListener *Query::getQueryListener() const noexcept
{
    return listener;
    return queryListener;
}

void Query::setQueryListener(QueryListener *queryListener) noexcept
void Query::setQueryListener(QueryListener *listener) noexcept
{
    listener = queryListener;
    queryListener = listener;
}

void Query::setQueryListener(std::unique_ptr<EndpointListener> _listener) noexcept
void Query::setQueryListener(std::unique_ptr<QueryListener> listener) noexcept
{
    endpointListener = std::move(_listener);
    listener         = dynamic_cast<QueryListener *>(endpointListener.get());
    queryListenerUniqueptr = std::move(listener);
    queryListener          = dynamic_cast<QueryListener *>(queryListenerUniqueptr.get());
}

QueryResult::QueryResult(std::shared_ptr<Query> requestQuery) : requestQuery(std::move(requestQuery))

M module-db/Common/Query.hpp => module-db/Common/Query.hpp +14 -9
@@ 4,6 4,9 @@
#include <string>
#include <functional>
#include <log/log.hpp>
#include <module-services/service-desktop/endpoints/Context.hpp>

using namespace parserFSM;

namespace db
{


@@ 13,25 16,27 @@ namespace db
    {
      public:
        virtual bool handleQueryResponse(QueryResult *) = 0;
        virtual ~QueryListener()                        = default;
    };

    using QueryCallback = std::function<bool(db::QueryResult *, uint32_t)>;
    using QueryCallback = std::function<bool(db::QueryResult *, Context &)>;

    class EndpointListener : public db::QueryListener
    {
      private:
        uint32_t uuid;
        Context context = Context();

      public:
        EndpointListener(QueryCallback _callback, uint32_t uuid) : uuid(uuid), callback(std::move(_callback)){};
        EndpointListener(QueryCallback callback, Context &context)
            : context(std::move(context)), callback(std::move(callback)){};
        EndpointListener() : callback(nullptr){};
        ~EndpointListener() = default;
        QueryCallback callback;
        ~EndpointListener()    = default;
        QueryCallback callback = nullptr;
        auto handleQueryResponse(db::QueryResult *result) -> bool override
        {
            if (callback != nullptr) {
                LOG_DEBUG("Executing callback...");
                auto ret = callback(result, uuid);
                auto ret = callback(result, context);
                LOG_DEBUG("Callback finished");
                return ret;
            }


@@ 60,15 65,15 @@ namespace db

        QueryListener *getQueryListener() const noexcept;
        void setQueryListener(QueryListener *queryListener) noexcept;
        void setQueryListener(std::unique_ptr<EndpointListener> listener) noexcept;
        void setQueryListener(std::unique_ptr<QueryListener> listener) noexcept;

        const Type type;

        [[nodiscard]] virtual auto debugInfo() const -> std::string = 0;

      private:
        QueryListener *listener = nullptr;
        std::unique_ptr<EndpointListener> endpointListener = nullptr;
        QueryListener *queryListener                          = nullptr;
        std::unique_ptr<QueryListener> queryListenerUniqueptr = nullptr;
    };

    /// virtual query output (result) interface

M module-db/Interface/ContactRecord.cpp => module-db/Interface/ContactRecord.cpp +93 -59
@@ 142,6 142,32 @@ std::unique_ptr<db::QueryResult> ContactRecordInterface::runQuery(std::shared_pt
        return nullptr;
    }

    if (typeid(*query) == typeid(db::query::ContactGet)) {
        return getQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::ContactGetByID)) {
        return getByIDQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::ContactGetSize)) {
        return getSizeQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::ContactAdd)) {
        return addQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::ContactUpdate)) {
        return updateQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::ContactRemove)) {
        return removeQuery(query);
    }
    else {
        LOG_ERROR("Unexpected query type.");
        return nullptr;
    }
}

std::unique_ptr<db::QueryResult> ContactRecordInterface::getQuery(std::shared_ptr<db::Query> query)
{
    auto textFilter = dynamic_cast<const db::query::TextFilter *>(query.get());
    assert(query != nullptr);
    bool searchByNumber = false;


@@ 150,8 176,6 @@ std::unique_ptr<db::QueryResult> ContactRecordInterface::runQuery(std::shared_pt
        LOG_INFO("Filtering by number: %s", textFilter->getFilterData().c_str());
    }

    if (typeid(*query) == typeid(db::query::ContactGet)) {

        auto readQuery = static_cast<const db::query::ContactGet *>(query.get());
        LOG_DEBUG("Contact read query, filter: \"%s\", offset=%lu, limit=%lu",
                  readQuery->getFilterData().c_str(),


@@ 178,71 202,81 @@ std::unique_ptr<db::QueryResult> ContactRecordInterface::runQuery(std::shared_pt
        auto response = std::make_unique<db::query::ContactGetResult>(result);
        response->setRequestQuery(query);
        return response;
}

std::unique_ptr<db::QueryResult> ContactRecordInterface::getByIDQuery(std::shared_ptr<db::Query> query)
{
    auto readQuery = static_cast<db::query::ContactGetByID *>(query.get());
    auto record    = ContactRecordInterface::GetByID(readQuery->getID());
    auto response  = std::make_unique<db::query::ContactGetByIDResult>(record);
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> ContactRecordInterface::getSizeQuery(std::shared_ptr<db::Query> query)
{
    auto textFilter = dynamic_cast<const db::query::TextFilter *>(query.get());
    assert(query != nullptr);
    bool searchByNumber = false;
    if (textFilter != nullptr && textFilter->isFilterPresent() && utils::is_number(textFilter->getFilterData())) {
        searchByNumber = true;
        LOG_INFO("Filtering by number: %s", textFilter->getFilterData().c_str());
    }
    else if (typeid(*query) == typeid(db::query::ContactGetByID)) {
        auto readQuery = static_cast<db::query::ContactGetByID *>(query.get());
        auto record    = ContactRecordInterface::GetByID(readQuery->getID());
        LOG_DEBUG("ID: %d", readQuery->getID());
        auto response = std::make_unique<db::query::ContactGetByIDResult>(record);
        response->setRequestQuery(query);
        return response;
    }
    else if (typeid(*query) == typeid(db::query::ContactGetSize)) {
        auto countQuery = static_cast<const db::query::ContactGetSize *>(query.get());
        LOG_DEBUG("Contact count query, filter: \"%s\"", countQuery->getFilterData().c_str());

        std::size_t count = 0;
        if (!countQuery->isFilterPresent()) {
            uint32_t groupID = countQuery->getGroupFilterData();
            if (groupID != DB_ID_NONE) {
                count = contactDB->contacts
                            .GetIDsSortedByField(ContactsTable::MatchType::Group, countQuery->getFilterData(), groupID)
                            .size();
            }
            else
                count = contactDB->contacts.count();
        }
        else if (searchByNumber) {

    auto countQuery = static_cast<const db::query::ContactGetSize *>(query.get());
    LOG_DEBUG("Contact count query, filter: \"%s\"", countQuery->getFilterData().c_str());

    std::size_t count = 0;
    if (!countQuery->isFilterPresent()) {
        uint32_t groupID = countQuery->getGroupFilterData();
        if (groupID != DB_ID_NONE) {
            count = contactDB->contacts
                        .GetIDsSortedByField(
                            ContactsTable::MatchType::TextNumber, countQuery->getFilterData(), favouritesGroupId)
                        .GetIDsSortedByField(ContactsTable::MatchType::Group, countQuery->getFilterData(), groupID)
                        .size();
        }
        else {
            count = contactDB->name.GetCountByName(countQuery->getFilterData());
        }

        LOG_DEBUG("Contact count query result: %lu", static_cast<unsigned long>(count));

        auto response = std::make_unique<db::query::RecordsSizeQueryResult>(count);
        response->setRequestQuery(query);
        return response;
    }
    else if (typeid(*query) == typeid(db::query::ContactAdd)) {
        auto addQuery = static_cast<const db::query::ContactAdd *>(query.get());
        auto ret      = ContactRecordInterface::Add(addQuery->rec);
        auto response = std::make_unique<db::query::ContactAddResult>(ret);
        response->setRequestQuery(query);
        return response;
    }
    else if (typeid(*query) == typeid(db::query::ContactUpdate)) {
        auto updateQuery = static_cast<const db::query::ContactUpdate *>(query.get());
        auto ret         = ContactRecordInterface::Update(updateQuery->rec);
        auto response    = std::make_unique<db::query::ContactUpdateResult>(ret);
        response->setRequestQuery(query);
        return response;
        else
            count = contactDB->contacts.count();
    }
    else if (typeid(*query) == typeid(db::query::ContactRemove)) {
        auto removeQuery = static_cast<db::query::ContactRemove *>(query.get());
        auto ret         = ContactRecordInterface::RemoveByID(removeQuery->getID());
        auto response    = std::make_unique<db::query::ContactRemoveResult>(ret);
        response->setRequestQuery(query);
        return response;
    else if (searchByNumber) {
        count = contactDB->contacts
                    .GetIDsSortedByField(
                        ContactsTable::MatchType::TextNumber, countQuery->getFilterData(), favouritesGroupId)
                    .size();
    }
    else {
        LOG_ERROR("Unexpected query type.");
        return nullptr;
        count = contactDB->name.GetCountByName(countQuery->getFilterData());
    }

    LOG_DEBUG("Contact count query result: %lu", static_cast<unsigned long>(count));

    auto response = std::make_unique<db::query::RecordsSizeQueryResult>(count);
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::QueryResult> ContactRecordInterface::addQuery(std::shared_ptr<db::Query> query)
{
    auto addQuery = static_cast<const db::query::ContactAdd *>(query.get());
    auto ret      = ContactRecordInterface::Add(addQuery->rec);
    auto response = std::make_unique<db::query::ContactAddResult>(ret);
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::QueryResult> ContactRecordInterface::updateQuery(std::shared_ptr<db::Query> query)
{
    auto updateQuery = static_cast<const db::query::ContactUpdate *>(query.get());
    auto ret         = ContactRecordInterface::Update(updateQuery->rec);
    auto response    = std::make_unique<db::query::ContactUpdateResult>(ret);
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> ContactRecordInterface::removeQuery(std::shared_ptr<db::Query> query)
{
    auto removeQuery = static_cast<db::query::ContactRemove *>(query.get());
    auto ret         = ContactRecordInterface::RemoveByID(removeQuery->getID());
    auto response    = std::make_unique<db::query::ContactRemoveResult>(ret);
    response->setRequestQuery(query);
    return response;
}

std::vector<std::uint32_t> ContactRecordInterface::splitNumberIDs(const std::string &numberIDs)

M module-db/Interface/ContactRecord.hpp => module-db/Interface/ContactRecord.hpp +6 -0
@@ 186,4 186,10 @@ class ContactRecordInterface : public RecordInterface<ContactRecord, ContactReco
    bool unbindNumber(std::uint32_t contactId, std::uint32_t numberId);

    const std::uint32_t favouritesGroupId;
    std::unique_ptr<db::QueryResult> getQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> getByIDQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> getSizeQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> addQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> updateQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> removeQuery(std::shared_ptr<db::Query> query);
};

M module-db/Interface/SMSRecord.cpp => module-db/Interface/SMSRecord.cpp +108 -82
@@ 297,100 297,25 @@ SMSRecord SMSRecordInterface::GetByID(uint32_t id)
std::unique_ptr<db::QueryResult> SMSRecordInterface::runQuery(std::shared_ptr<db::Query> query)
{
    if (typeid(*query) == typeid(db::query::SMSSearchByType)) {
        return runQueryImpl(dynamic_cast<const db::query::SMSSearchByType *>(query.get()));
        return runQueryImpl(static_cast<const db::query::SMSSearchByType *>(query.get()));
    }
    else if (typeid(*query) == typeid(db::query::SMSGetByID)) {
        const auto localQuery = dynamic_cast<const db::query::SMSGetByID *>(query.get());
        auto sms = smsDB->sms.getById(localQuery->id);
        SMSRecord record;

        record.body      = sms.body;
        record.contactID = sms.contactID;
        record.date      = sms.date;
        record.dateSent  = sms.dateSent;
        record.errorCode = sms.errorCode;
        record.threadID  = sms.threadID;
        record.type      = sms.type;
        record.ID        = sms.ID;
        auto response    = std::make_unique<db::query::SMSGetByIDResult>(record);
        response->setRequestQuery(query);
        return response;
        return getByIDQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSGetByContactID)) {
        const auto localQuery = dynamic_cast<const db::query::SMSGetByContactID *>(query.get());
        auto smsVector = smsDB->sms.getByContactId(localQuery->contactId);
        std::vector<SMSRecord> recordVector;
        for (auto sms : smsVector) {
            SMSRecord record;
            record.body      = sms.body;
            record.contactID = sms.contactID;
            record.date      = sms.date;
            record.dateSent  = sms.dateSent;
            record.errorCode = sms.errorCode;
            record.threadID  = sms.threadID;
            record.type      = sms.type;
            record.ID        = sms.ID;
            recordVector.emplace_back(record);
        }

        auto response = std::make_unique<db::query::SMSGetByContactIDResult>(recordVector);
        response->setRequestQuery(query);
        return response;
        return getByContactIDQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSGetByText)) {
        const auto localQuery = dynamic_cast<const db::query::SMSGetByText *>(query.get());
        auto smsVector = smsDB->sms.getByText(localQuery->text);
        std::vector<SMSRecord> recordVector;
        for (auto sms : smsVector) {
            SMSRecord record;
            record.body      = sms.body;
            record.contactID = sms.contactID;
            record.date      = sms.date;
            record.dateSent  = sms.dateSent;
            record.errorCode = sms.errorCode;
            record.threadID  = sms.threadID;
            record.type      = sms.type;
            record.ID        = sms.ID;
            recordVector.emplace_back(record);
        }

        auto response = std::make_unique<db::query::SMSGetByTextResult>(recordVector);
        response->setRequestQuery(query);
        return response;
        return getByTextQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSGetCount)) {
        auto response = std::make_unique<db::query::SMSGetCountResult>(smsDB->sms.count());
        response->setRequestQuery(query);
        return response;
        return getCountQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSRemove)) {
        const auto localQuery = dynamic_cast<const db::query::SMSRemove *>(query.get());
        auto ret              = smsDB->sms.removeById(localQuery->id);
        auto response         = std::make_unique<db::query::SMSRemoveResult>(ret);
        response->setRequestQuery(query);
        return response;
        return removeQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSGet)) {
        const auto localQuery = dynamic_cast<const db::query::SMSGet *>(query.get());

        auto smsVector = smsDB->sms.getLimitOffset(localQuery->getOffset(), localQuery->getLimit());
        std::vector<SMSRecord> recordVector;
        for (auto sms : smsVector) {
            SMSRecord record;
            record.body      = sms.body;
            record.contactID = sms.contactID;
            record.date      = sms.date;
            record.dateSent  = sms.dateSent;
            record.errorCode = sms.errorCode;
            record.threadID  = sms.threadID;
            record.type      = sms.type;
            record.ID        = sms.ID;
            recordVector.emplace_back(record);
        }

        auto response = std::make_unique<db::query::SMSGetResult>(recordVector);
        response->setRequestQuery(query);
        return response;
        return getQuery(query);
    }

    return nullptr;


@@ 414,3 339,104 @@ std::unique_ptr<db::query::SMSSearchByTypeResult> SMSRecordInterface::runQueryIm
    }
    return std::make_unique<db::query::SMSSearchByTypeResult>(db_result.first, *records);
}

std::unique_ptr<db::QueryResult> SMSRecordInterface::getByIDQuery(std::shared_ptr<db::Query> query)
{
    const auto localQuery = static_cast<const db::query::SMSGetByID *>(query.get());
    auto sms              = smsDB->sms.getById(localQuery->id);
    SMSRecord record;

    record.body      = sms.body;
    record.contactID = sms.contactID;
    record.date      = sms.date;
    record.dateSent  = sms.dateSent;
    record.errorCode = sms.errorCode;
    record.threadID  = sms.threadID;
    record.type      = sms.type;
    record.ID        = sms.ID;
    auto response    = std::make_unique<db::query::SMSGetByIDResult>(record);
    response->setRequestQuery(query);
    return response;
}

std::unique_ptr<db::QueryResult> SMSRecordInterface::getByContactIDQuery(std::shared_ptr<db::Query> query)
{
    const auto localQuery = static_cast<const db::query::SMSGetByContactID *>(query.get());
    auto smsVector        = smsDB->sms.getByContactId(localQuery->contactId);
    std::vector<SMSRecord> recordVector;
    for (auto sms : smsVector) {
        SMSRecord record;
        record.body      = sms.body;
        record.contactID = sms.contactID;
        record.date      = sms.date;
        record.dateSent  = sms.dateSent;
        record.errorCode = sms.errorCode;
        record.threadID  = sms.threadID;
        record.type      = sms.type;
        record.ID        = sms.ID;
        recordVector.emplace_back(record);
    }

    auto response = std::make_unique<db::query::SMSGetByContactIDResult>(recordVector);
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> SMSRecordInterface::getByTextQuery(std::shared_ptr<db::Query> query)
{
    const auto localQuery = static_cast<const db::query::SMSGetByText *>(query.get());
    auto smsVector        = smsDB->sms.getByText(localQuery->text);
    std::vector<SMSRecord> recordVector;
    for (auto sms : smsVector) {
        SMSRecord record;
        record.body      = sms.body;
        record.contactID = sms.contactID;
        record.date      = sms.date;
        record.dateSent  = sms.dateSent;
        record.errorCode = sms.errorCode;
        record.threadID  = sms.threadID;
        record.type      = sms.type;
        record.ID        = sms.ID;
        recordVector.emplace_back(record);
    }

    auto response = std::make_unique<db::query::SMSGetByTextResult>(recordVector);
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> SMSRecordInterface::getCountQuery(std::shared_ptr<db::Query> query)
{
    auto response = std::make_unique<db::query::SMSGetCountResult>(smsDB->sms.count());
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> SMSRecordInterface::removeQuery(std::shared_ptr<db::Query> query)
{
    const auto localQuery = static_cast<const db::query::SMSRemove *>(query.get());
    auto ret              = smsDB->sms.removeById(localQuery->id);
    auto response         = std::make_unique<db::query::SMSRemoveResult>(ret);
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> SMSRecordInterface::getQuery(std::shared_ptr<db::Query> query)
{
    const auto localQuery = static_cast<const db::query::SMSGet *>(query.get());

    auto smsVector = smsDB->sms.getLimitOffset(localQuery->getOffset(), localQuery->getLimit());
    std::vector<SMSRecord> recordVector;
    for (auto sms : smsVector) {
        SMSRecord record;
        record.body      = sms.body;
        record.contactID = sms.contactID;
        record.date      = sms.date;
        record.dateSent  = sms.dateSent;
        record.errorCode = sms.errorCode;
        record.threadID  = sms.threadID;
        record.type      = sms.type;
        record.ID        = sms.ID;
        recordVector.emplace_back(record);
    }

    auto response = std::make_unique<db::query::SMSGetResult>(recordVector);
    response->setRequestQuery(query);
    return response;
}

M module-db/Interface/SMSRecord.hpp => module-db/Interface/SMSRecord.hpp +7 -2
@@ 63,7 63,12 @@ class SMSRecordInterface : public RecordInterface<SMSRecord, SMSRecordField>
    SmsDB *smsDB                        = nullptr;
    ContactsDB *contactsDB              = nullptr;

    std::unique_ptr<db::query::SMSSearchByTypeResult> runQueryImpl(const db::query::SMSSearchByType *query);

    static void UpdateThreadSummary(ThreadRecord &threadToUpdate, const SMSRecord &rec);
    std::unique_ptr<db::query::SMSSearchByTypeResult> runQueryImpl(const db::query::SMSSearchByType *query);
    std::unique_ptr<db::QueryResult> getByIDQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> getByContactIDQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> getByTextQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> getCountQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> removeQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> getQuery(std::shared_ptr<db::Query> query);
};

M module-db/Interface/SMSTemplateRecord.cpp => module-db/Interface/SMSTemplateRecord.cpp +54 -35
@@ 83,50 83,69 @@ SMSTemplateRecord SMSTemplateRecordInterface::GetByID(uint32_t id)
std::unique_ptr<db::QueryResult> SMSTemplateRecordInterface::runQuery(std::shared_ptr<db::Query> query)
{
    if (typeid(*query) == typeid(db::query::SMSTemplateGetByID)) {
        const auto local_query = dynamic_cast<const db::query::SMSTemplateGetByID *>(query.get());
        auto smsTemplate       = smsDB->templates.getById(local_query->id);

        auto response = std::make_unique<db::query::SMSTemplateGetByIDResult>(std::move(smsTemplate));
        response->setRequestQuery(query);
        return response;
        return getByIDQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSTemplateGet)) {
        const auto localQuery = dynamic_cast<const db::query::SMSTemplateGet *>(query.get());
        auto dbResult         = smsDB->templates.getLimitOffset(localQuery->offset, localQuery->limit);
        std::vector<SMSTemplateRecord> recordVector;
        for (auto SMStemplate : dbResult) {
            SMSTemplateRecord record;
            record.ID                 = SMStemplate.ID;
            record.text               = SMStemplate.text;
            record.lastUsageTimestamp = SMStemplate.lastUsageTimestamp;
            recordVector.emplace_back(record);
        }
        auto response = std::make_unique<db::query::SMSTemplateGetResult>(std::move(recordVector));
        response->setRequestQuery(query);
        return response;
        return getQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSTemplateGetCount)) {
        auto response = std::make_unique<db::query::SMSTemplateGetCountResult>(smsDB->templates.count());
        response->setRequestQuery(query);
        return response;
        return getCountQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSTemplateAdd)) {
        const auto localQuery = dynamic_cast<const db::query::SMSTemplateAdd *>(query.get());
        auto ret              = SMSTemplateRecordInterface::Add(localQuery->rec);
        auto response         = std::make_unique<db::query::SMSTemplateAddResult>(ret);
        response->setRequestQuery(query);
        return response;
        return addQuery(query);
    }
    else if (typeid(*query) == typeid(db::query::SMSTemplateRemove)) {
        const auto localQuery = dynamic_cast<const db::query::SMSTemplateRemove *>(query.get());
        auto ret              = smsDB->templates.removeById(localQuery->id);
        auto response         = std::make_unique<db::query::SMSTemplateRemoveResult>(ret);
        response->setRequestQuery(query);
        return response;
        return removeQuery(query);
    }
    else {
        auto response = std::make_unique<db::query::SMSTemplateGetByIDResult>(SMSTemplateRecord());
        response->setRequestQuery(query);
        return response;
        return getByIDQuery(query);
    }
}

std::unique_ptr<db::QueryResult> SMSTemplateRecordInterface::getByIDQuery(std::shared_ptr<db::Query> query)
{
    const auto local_query = static_cast<const db::query::SMSTemplateGetByID *>(query.get());
    auto smsTemplate       = smsDB->templates.getById(local_query->id);

    auto response = std::make_unique<db::query::SMSTemplateGetByIDResult>(std::move(smsTemplate));
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> SMSTemplateRecordInterface::getQuery(std::shared_ptr<db::Query> query)
{
    const auto localQuery = static_cast<const db::query::SMSTemplateGet *>(query.get());
    auto dbResult         = smsDB->templates.getLimitOffset(localQuery->offset, localQuery->limit);
    std::vector<SMSTemplateRecord> recordVector;
    for (auto SMStemplate : dbResult) {
        SMSTemplateRecord record;
        record.ID                 = SMStemplate.ID;
        record.text               = SMStemplate.text;
        record.lastUsageTimestamp = SMStemplate.lastUsageTimestamp;
        recordVector.emplace_back(record);
    }
    auto response = std::make_unique<db::query::SMSTemplateGetResult>(std::move(recordVector));
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> SMSTemplateRecordInterface::getCountQuery(std::shared_ptr<db::Query> query)
{
    auto response = std::make_unique<db::query::SMSTemplateGetCountResult>(smsDB->templates.count());
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> SMSTemplateRecordInterface::addQuery(std::shared_ptr<db::Query> query)
{
    const auto localQuery = static_cast<const db::query::SMSTemplateAdd *>(query.get());
    auto ret              = SMSTemplateRecordInterface::Add(localQuery->rec);
    auto response         = std::make_unique<db::query::SMSTemplateAddResult>(ret);
    response->setRequestQuery(query);
    return response;
}
std::unique_ptr<db::QueryResult> SMSTemplateRecordInterface::removeQuery(std::shared_ptr<db::Query> query)
{
    const auto localQuery = static_cast<const db::query::SMSTemplateRemove *>(query.get());
    auto ret              = smsDB->templates.removeById(localQuery->id);
    auto response         = std::make_unique<db::query::SMSTemplateRemoveResult>(ret);
    response->setRequestQuery(query);
    return response;
}

M module-db/Interface/SMSTemplateRecord.hpp => module-db/Interface/SMSTemplateRecord.hpp +5 -0
@@ 46,4 46,9 @@ class SMSTemplateRecordInterface : public RecordInterface<SMSTemplateRecord, SMS

  private:
    SmsDB *smsDB = nullptr;
    std::unique_ptr<db::QueryResult> getByIDQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> getQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> getCountQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> addQuery(std::shared_ptr<db::Query> query);
    std::unique_ptr<db::QueryResult> removeQuery(std::shared_ptr<db::Query> query);
};

M module-db/queries/phonebook/QueryContactGetByID.hpp => module-db/queries/phonebook/QueryContactGetByID.hpp +0 -5
@@ 24,11 24,6 @@ namespace db::query
        unsigned int id;
    };

    /**
     * @brief A response to the db::query::ContactGetByID query. Returns a vector of
     * ContactRecord data
     *
     */
    class ContactGetByIDResult : public QueryResult
    {
      public:

M module-db/queries/phonebook/QueryContactRemove.hpp => module-db/queries/phonebook/QueryContactRemove.hpp +0 -5
@@ 24,11 24,6 @@ namespace db::query
        unsigned int id;
    };

    /**
     * @brief A response to the db::query::ContactGetByID query. Returns a vector of
     * ContactRecord data
     *
     */
    class ContactRemoveResult : public QueryResult
    {
      public:

M module-db/queries/sms/QuerySMSGetByContactID.hpp => module-db/queries/sms/QuerySMSGetByContactID.hpp +1 -1
@@ 7,7 7,7 @@

namespace db::query
{
    /// implements search for SMS by type

    class SMSGetByContactID : public Query
    {
      public:

M module-db/queries/sms/QuerySMSGetByID.hpp => module-db/queries/sms/QuerySMSGetByID.hpp +1 -1
@@ 7,7 7,7 @@

namespace db::query
{
    /// implements search for SMS by type

    class SMSGetByID : public Query
    {
      public:

M module-db/queries/sms/QuerySMSGetByText.hpp => module-db/queries/sms/QuerySMSGetByText.hpp +1 -1
@@ 7,7 7,7 @@

namespace db::query
{
    /// implements search for SMS by type

    class SMSGetByText : public Query
    {
      public:

M module-db/queries/sms/QuerySMSRemove.hpp => module-db/queries/sms/QuerySMSRemove.hpp +1 -1
@@ 7,7 7,7 @@

namespace db::query
{
    /// implements search for SMS by type

    class SMSRemove : public Query
    {
      public:

M module-db/queries/sms/QuerySMSTemplateGet.hpp => module-db/queries/sms/QuerySMSTemplateGet.hpp +1 -1
@@ 7,7 7,7 @@

namespace db::query
{
    /// implements search for SMS by text

    class SMSTemplateGet : public Query
    {
      public:

M module-db/queries/sms/QuerySMSTemplateGetByID.hpp => module-db/queries/sms/QuerySMSTemplateGetByID.hpp +1 -1
@@ 7,7 7,7 @@

namespace db::query
{
    /// implements search for SMS by type

    class SMSTemplateGetByID : public Query
    {
      public:

M module-db/queries/sms/QuerySMSTemplateRemove.hpp => module-db/queries/sms/QuerySMSTemplateRemove.hpp +1 -1
@@ 7,7 7,7 @@

namespace db::query
{
    /// implements search for SMS by type

    class SMSTemplateRemove : public Query
    {
      public:

M module-db/queries/sms/QuerySMSThreadsGet.hpp => module-db/queries/sms/QuerySMSThreadsGet.hpp +1 -1
@@ 6,7 6,7 @@

namespace db::query
{
    /// implements search for SMS by text

    class SMSThreadsGet : public Query
    {
      public:

M module-services/service-desktop/ServiceDesktop.cpp => module-services/service-desktop/ServiceDesktop.cpp +0 -3
@@ 2,11 2,8 @@
#include "ServiceDesktop.hpp"
#include "BackupRestore.hpp"
#include "DesktopMessages.hpp"
#include "Endpoint.hpp"
#include "module-services/service-desktop/endpoints/factoryReset/FactoryReset.hpp"
#include "log/log.hpp"
#include "messages/DBSMSMessage.hpp"
#include "messages/DBSMSTemplateMessage.hpp"

ServiceDesktop::ServiceDesktop() : sys::Service(service::name::service_desktop, "", sdesktop::service_stack)
{

M module-services/service-desktop/WorkerDesktop.cpp => module-services/service-desktop/WorkerDesktop.cpp +1 -1
@@ 43,7 43,7 @@ bool WorkerDesktop::init(std::list<sys::WorkerQueueInfo> queues)
        return false;
    }

    ParserStateMachine::MessageHandler::sendQueue = Worker::getQueueByName(WorkerDesktop::SEND_QUEUE_BUFFER_NAME);
    parserFSM::MessageHandler::sendQueue = Worker::getQueueByName(WorkerDesktop::SEND_QUEUE_BUFFER_NAME);

    return true;
}

M module-services/service-desktop/WorkerDesktop.hpp => module-services/service-desktop/WorkerDesktop.hpp +2 -2
@@ 12,7 12,7 @@ extern "C"
#include "Service/Message.hpp"
#include "Service/Service.hpp"
#include "Service/Worker.hpp"
#include "parser/ParserStateMachine.hpp"
#include "parser/ParserFSM.hpp"

#include "bsp/usb_cdc/usb_cdc.hpp"



@@ 29,5 29,5 @@ class WorkerDesktop : public sys::Worker
    virtual bool deinit() override;
    bool handleMessage(uint32_t queueID) override final;
    sys::Service *ownerService = nullptr;
    ParserStateMachine::StateMachine parser;
    parserFSM::StateMachine parser;
};

M module-services/service-desktop/endpoints/Context.hpp => module-services/service-desktop/endpoints/Context.hpp +47 -3
@@ 1,8 1,8 @@
#pragma once
#include "ParserUtils.hpp"
#include "json/json11.hpp"
#include "module-services/service-desktop/parser/ParserUtils.hpp"

namespace ParserStateMachine
namespace parserFSM
{

    namespace json


@@ 14,6 14,12 @@ namespace ParserStateMachine
        const inline std::string body     = "body";
    } // namespace json

    struct endpointResponseContext
    {
        http::Code status = http::Code::OK;
        json11::Json body = json11::Json();
    };

    class Context
    {
      private:


@@ 21,6 27,8 @@ namespace ParserStateMachine
        EndpointType endpoint;
        uint32_t uuid;
        http::Method method;
        endpointResponseContext responseContext;

        auto validate() -> void
        {
            if (body.is_object() == false) {


@@ 30,6 38,18 @@ namespace ParserStateMachine
                endpoint = EndpointType::invalid;
            }
        }
        auto buildResponseStr(std::size_t responseSize, std::string responsePayloadString) -> std::string
        {
            constexpr auto pos                 = 0;
            constexpr auto count               = 1;
            std::string responsePayloadSizeStr = std::to_string(responseSize);
            while (responsePayloadSizeStr.length() < message::size_length) {
                responsePayloadSizeStr.insert(pos, count, '0');
            }

            std::string responseStr = message::endpointChar + responsePayloadSizeStr + responsePayloadString;
            return responseStr;
        }

      public:
        Context(json11::Json &js)


@@ 40,6 60,30 @@ namespace ParserStateMachine
            method   = static_cast<http::Method>(js[json::method].int_value());
            validate();
        }
        Context()
        {
            body     = json11::Json();
            endpoint = EndpointType::invalid;
            uuid     = 0;
            method   = http::Method::get;
        }

        auto createSimpleResponse() -> std::string
        {
            json11::Json responseJson = json11::Json::object{{json::endpoint, static_cast<int>(getEndpoint())},
                                                             {json::status, static_cast<int>(responseContext.status)},
                                                             {json::uuid, std::to_string(getUuid())},
                                                             {json::body, responseContext.body}};
            return buildResponseStr(responseJson.dump().size(), responseJson.dump());
        }
        auto setResponseStatus(http::Code status)
        {
            responseContext.status = status;
        }
        auto setResponseBody(json11::Json respBody)
        {
            responseContext.body = respBody;
        }
        auto getBody() -> json11::Json
        {
            return body;


@@ 58,4 102,4 @@ namespace ParserStateMachine
        }
    };

} // namespace ParserStateMachine
} // namespace parserFSM

M module-services/service-desktop/endpoints/DBHelper.hpp => module-services/service-desktop/endpoints/DBHelper.hpp +3 -3
@@ 2,14 2,14 @@

#include "Common/Query.hpp"
#include "Context.hpp"
#include "ParserStateMachine.hpp"
#include "ParserFSM.hpp"
#include "messages/QueryMessage.hpp"
#include "queries/sms/QuerySMSSearch.hpp"
#include <Service/Common.hpp>
#include <Service/Service.hpp>
#include "Endpoint.hpp"

namespace ParserStateMachine
namespace parserFSM
{

    class DBHelper


@@ 25,4 25,4 @@ namespace ParserStateMachine
      protected:
        sys::Service *ownerServicePtr = nullptr;
    };
} // namespace ParserStateMachine
} // namespace parserFSM

M module-services/service-desktop/endpoints/Endpoint.hpp => module-services/service-desktop/endpoints/Endpoint.hpp +7 -42
@@ 1,12 1,12 @@
#pragma once
#include "ParserUtils.hpp"
#include "module-services/service-desktop/parser/ParserUtils.hpp"
#include "json/json11.hpp"
#include "Common/Query.hpp"
#include "Context.hpp"
#include "Service/Service.hpp"
#include <string>

namespace ParserStateMachine
namespace parserFSM
{

    class Endpoint


@@ 14,51 14,16 @@ namespace ParserStateMachine

      public:
        Endpoint(sys::Service *_ownerServicePtr) : ownerServicePtr(_ownerServicePtr){};
        virtual ~Endpoint()                                  = default;
        virtual auto handle(Context &context) -> std::string = 0;
        virtual ~Endpoint()                           = default;
        virtual auto handle(Context &context) -> void = 0;
        auto c_str() -> const char *
        {
            return debugName.c_str();
        }

        static auto buildResponseStr(std::size_t responseSize, std::string responsePayloadString) -> std::string
        {
            std::string responsePayloadSizeStr = std::to_string(responseSize);
            while (responsePayloadSizeStr.length() < message::size_length) {
                responsePayloadSizeStr.insert(0, 1, '0');
            }

            std::string responseStr = message::endpointChar + responsePayloadSizeStr + responsePayloadString;
            return responseStr;
        }

        static auto createSimpleResponse(sys::ReturnCodes status, int endpoint, uint32_t uuid, json11::Json body)
            -> std::string
        {
            json11::Json responseJson = json11::Json::object{
                {json::endpoint, endpoint},
                {json::status,
                 static_cast<int>(status == sys::ReturnCodes::Success ? http::Code::OK
                                                                      : http::Code::InternalServerError)},
                {json::uuid, std::to_string(uuid)},
                {json::body, body}};
            return Endpoint::buildResponseStr(responseJson.dump().size(), responseJson.dump());
        }

        static auto createSimpleResponse(bool status, int endpoint, uint32_t uuid, json11::Json body) -> std::string
        {
            json11::Json responseJson = json11::Json::object{
                {json::endpoint, endpoint},
                {json::status, static_cast<int>(status ? http::Code::OK : http::Code::InternalServerError)},
                {json::uuid, std::to_string(uuid)},
                {json::body, body}};

            return Endpoint::buildResponseStr(responseJson.dump().size(), responseJson.dump());
        }

      protected:
        std::string debugName;
        sys::Service *ownerServicePtr;
        std::string debugName         = "";
        sys::Service *ownerServicePtr = nullptr;
    };

} // namespace ParserStateMachine
} // namespace parserFSM

M module-services/service-desktop/endpoints/EndpointFactory.hpp => module-services/service-desktop/endpoints/EndpointFactory.hpp +1 -1
@@ 9,7 9,7 @@
#include "update/UpdateEndpoint.hpp"
#include "restore/RestoreEndpoint.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

class EndpointFactory
{

M module-services/service-desktop/endpoints/backup/BackupEndpoint.cpp => module-services/service-desktop/endpoints/backup/BackupEndpoint.cpp +10 -14
@@ 5,7 5,7 @@

static bool backupReady = false;

auto BackupEndpoint::handle(Context &context) -> std::string
auto BackupEndpoint::handle(Context &context) -> void
{
    switch (context.getMethod()) {
    case http::Method::get:


@@ 17,12 17,10 @@ auto BackupEndpoint::handle(Context &context) -> std::string
    case http::Method::put:
        [[fallthrough]];
    case http::Method::del:
        MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
            sys::ReturnCodes::Failure, static_cast<int>(EndpointType::backup), context.getUuid(), json11::Json()));
        context.setResponseStatus(http::Code::BadRequest);
        MessageHandler::putToSendQueue(context.createSimpleResponse());
        break;
    }

    return std::string();
}
auto BackupEndpoint::request(Context &context) -> sys::ReturnCodes
{


@@ 33,14 31,13 @@ auto BackupEndpoint::request(Context &context) -> sys::ReturnCodes
        sys::Bus::SendUnicast(msg, service::name::service_desktop, ownerServicePtr);
        backupReady = true;

        responseBodyJson = json11::Json::object({{json::backupRequest, true}});
        context.setResponseBody(json11::Json::object({{json::backupRequest, true}}));
    }
    else {
        responseBodyJson = json11::Json::object({{json::backupRequest, false}});
        context.setResponseBody(json11::Json::object({{json::backupRequest, false}}));
    }

    MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
        true, static_cast<int>(EndpointType::backup), context.getUuid(), responseBodyJson));
    MessageHandler::putToSendQueue(context.createSimpleResponse());

    return sys::ReturnCodes::Success;
}


@@ 54,18 51,17 @@ auto BackupEndpoint::upload(Context &context) -> sys::ReturnCodes
    }
    else if (context.getBody()[json::backupUpload] == true) {
        if (vfs.fileExists(purefs::dir::os_backup.c_str())) {
            responseBodyJson = json11::Json::object({{json::backupUpload, true}});
            context.setResponseBody(json11::Json::object({{json::backupUpload, true}}));
        }
        else {
            responseBodyJson = json11::Json::object({{json::backupUpload, false}});
            context.setResponseBody(json11::Json::object({{json::backupUpload, false}}));
        }
    }
    else {
        responseBodyJson = json11::Json::object({{json::backupReady, false}});
        context.setResponseBody(json11::Json::object({{json::backupReady, false}}));
    }

    MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
        true, static_cast<int>(EndpointType::backup), context.getUuid(), responseBodyJson));
    MessageHandler::putToSendQueue(context.createSimpleResponse());

    return sys::ReturnCodes::Success;
}

M module-services/service-desktop/endpoints/backup/BackupEndpoint.hpp => module-services/service-desktop/endpoints/backup/BackupEndpoint.hpp +2 -2
@@ 2,7 2,7 @@
#include "ParserUtils.hpp"
#include "ServiceDesktop.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

class BackupEndpoint : public Endpoint
{


@@ 11,7 11,7 @@ class BackupEndpoint : public Endpoint
    {
        debugName = "BackupEndpoint";
    }
    auto handle(Context &context) -> std::string override;
    auto handle(Context &context) -> void override;
    auto request(Context &context) -> sys::ReturnCodes;
    auto upload(Context &context) -> sys::ReturnCodes;
};

M module-services/service-desktop/endpoints/contacts/ContactHelper.cpp => module-services/service-desktop/endpoints/contacts/ContactHelper.cpp +59 -28
@@ 4,7 4,6 @@
#include "ParserUtils.hpp"
#include "Service/Common.hpp"
#include "api/DBServiceAPI.hpp"
#include "application-phonebook/models/NewContactModel.hpp"
#include "log/log.hpp"
#include "queries/phonebook/QueryContactGetByID.hpp"
#include "queries/phonebook/QueryContactUpdate.hpp"


@@ 13,7 12,7 @@
#include <queries/phonebook/QueryContactAdd.hpp>
#include <queries/phonebook/QueryContactRemove.hpp>

using namespace ParserStateMachine;
using namespace parserFSM;

auto ContactHelper::to_json(ContactRecord record) -> json11::Json
{


@@ 41,7 40,7 @@ auto ContactHelper::from_json(json11::Json contactJSON) -> ContactRecord
    newRecord.alternativeName = UTF8(contactJSON[json::contacts::alternativeName].string_value());
    newRecord.address         = UTF8(contactJSON[json::contacts::address].string_value());

    newRecord.contactType = ContactType ::USER;
    newRecord.contactType = ContactType::USER;

    for (auto num : contactJSON[json::contacts::numbers].array_items()) {
        utils::PhoneNumber phoneNumber(num.string_value());


@@ 59,12 58,15 @@ auto ContactHelper::requestDataFromDB(Context &context) -> sys::ReturnCodes
    if (context.getBody()[json::contacts::id].int_value() != 0) {
        return requestContactByID(context);
    }
    else if (context.getBody()[json::contacts::count].bool_value()) {
        return requestCount(context);
    }

    auto limit = context.getBody()[json::contacts::count].int_value();
    auto query = std::make_unique<db::query::ContactGet>(0, limit, "");

    auto listener = std::make_unique<db::EndpointListener>(
        [](db::QueryResult *result, uint32_t uuid) {
        [](db::QueryResult *result, Context context) {
            if (auto contactResult = dynamic_cast<db::query::ContactGetResult *>(result)) {

                auto recordsPtr = std::make_unique<std::vector<ContactRecord>>(contactResult->getRecords());


@@ 74,15 76,15 @@ auto ContactHelper::requestDataFromDB(Context &context) -> sys::ReturnCodes
                    contactsArray.emplace_back(ContactHelper::to_json(record));
                }

                MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                    true, static_cast<int>(EndpointType::contacts), uuid, contactsArray));
                context.setResponseBody(contactsArray);
                MessageHandler::putToSendQueue(context.createSimpleResponse());
                return true;
            }
            else {
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));



@@ 91,12 93,35 @@ auto ContactHelper::requestDataFromDB(Context &context) -> sys::ReturnCodes
    return sys::ReturnCodes::Success;
}

auto ContactHelper::createDBEntry(Context &context) -> sys::ReturnCodes
sys::ReturnCodes ContactHelper::requestCount(Context &context)
{
    LOG_DEBUG("Creating %s %s ...",
              context.getBody()[json::contacts::primaryName].string_value().c_str(),
              context.getBody()[json::contacts::alternativeName].string_value().c_str());
    auto query = std::make_unique<db::query::ContactGetSize>();

    auto listener = std::make_unique<db::EndpointListener>(
        [](db::QueryResult *result, Context context) {
            if (auto contactResult = dynamic_cast<db::query::RecordsSizeQueryResult *>(result)) {

                auto count = contactResult->getSize();

                context.setResponseBody(json11::Json::object({{json::contacts::count, static_cast<int>(count)}}));
                MessageHandler::putToSendQueue(context.createSimpleResponse());
                return true;
            }
            else {
                return false;
            }
        },
        context);

    query->setQueryListener(std::move(listener));

    DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::Contact, std::move(query));

    return sys::ReturnCodes::Success;
}

auto ContactHelper::createDBEntry(Context &context) -> sys::ReturnCodes
{
    auto newRecord = from_json(context.getBody());
    if (newRecord.numbers.empty()) {
        LOG_ERROR("Empty number, not added!");


@@ 106,10 131,12 @@ auto ContactHelper::createDBEntry(Context &context) -> sys::ReturnCodes
    auto query = std::make_unique<db::query::ContactAdd>(newRecord);

    auto listener = std::make_unique<db::EndpointListener>(
        [](db::QueryResult *result, uint32_t uuid) {
        [](db::QueryResult *result, Context context) {
            if (auto contactResult = dynamic_cast<db::query::ContactAddResult *>(result)) {
                MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                    contactResult->getResult(), static_cast<int>(EndpointType::contacts), uuid, json11::Json()));

                context.setResponseStatus(contactResult->getResult() ? http::Code::OK
                                                                     : http::Code::InternalServerError);
                MessageHandler::putToSendQueue(context.createSimpleResponse());

                return true;
            }


@@ 117,7 144,7 @@ auto ContactHelper::createDBEntry(Context &context) -> sys::ReturnCodes
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));



@@ 131,11 158,12 @@ auto ContactHelper::requestContactByID(Context &context) -> sys::ReturnCodes
    auto query = std::make_unique<db::query::ContactGetByID>(id);

    auto listener = std::make_unique<db::EndpointListener>(
        [](db::QueryResult *result, uint32_t uuid) {
        [](db::QueryResult *result, Context context) {
            if (auto contactResult = dynamic_cast<db::query::ContactGetByIDResult *>(result)) {
                auto record = ContactHelper::to_json(contactResult->getResult());
                MessageHandler::putToSendQueue(
                    Endpoint::createSimpleResponse(true, static_cast<int>(EndpointType::contacts), uuid, record));

                context.setResponseBody(record);
                MessageHandler::putToSendQueue(context.createSimpleResponse());

                return true;
            }


@@ 143,7 171,7 @@ auto ContactHelper::requestContactByID(Context &context) -> sys::ReturnCodes
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));



@@ 157,10 185,12 @@ auto ContactHelper::updateDBEntry(Context &context) -> sys::ReturnCodes
    auto query   = std::make_unique<db::query::ContactUpdate>(contact);

    auto listener = std::make_unique<db::EndpointListener>(
        [](db::QueryResult *result, uint32_t uuid) {
        [](db::QueryResult *result, Context context) {
            if (auto contactResult = dynamic_cast<db::query::ContactUpdateResult *>(result)) {
                MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                    contactResult->getResult(), static_cast<int>(EndpointType::contacts), uuid, json11::Json()));

                context.setResponseStatus(contactResult->getResult() ? http::Code::OK
                                                                     : http::Code::InternalServerError);
                MessageHandler::putToSendQueue(context.createSimpleResponse());

                return true;
            }


@@ 168,11 198,10 @@ auto ContactHelper::updateDBEntry(Context &context) -> sys::ReturnCodes
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));
    DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::Contact, std::move(query));
    LOG_DEBUG("Query done");

    return sys::ReturnCodes::Success;
}


@@ 183,10 212,12 @@ auto ContactHelper::deleteDBEntry(Context &context) -> sys::ReturnCodes
    auto query = std::make_unique<db::query::ContactRemove>(id);

    auto listener = std::make_unique<db::EndpointListener>(
        [](db::QueryResult *result, uint32_t uuid) {
        [](db::QueryResult *result, Context context) {
            if (auto contactResult = dynamic_cast<db::query::ContactRemoveResult *>(result)) {
                MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                    contactResult->getResult(), static_cast<int>(EndpointType::contacts), uuid, json11::Json()));

                context.setResponseStatus(contactResult->getResult() ? http::Code::OK
                                                                     : http::Code::InternalServerError);
                MessageHandler::putToSendQueue(context.createSimpleResponse());

                return true;
            }


@@ 194,7 225,7 @@ auto ContactHelper::deleteDBEntry(Context &context) -> sys::ReturnCodes
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));


M module-services/service-desktop/endpoints/contacts/ContactHelper.hpp => module-services/service-desktop/endpoints/contacts/ContactHelper.hpp +3 -2
@@ 9,7 9,7 @@
#include <service-db/api/DBServiceAPI.hpp>
#include "ContactRecord.hpp"

namespace ParserStateMachine
namespace parserFSM
{

    class ContactHelper : public DBHelper


@@ 22,6 22,7 @@ namespace ParserStateMachine
        auto updateDBEntry(Context &context) -> sys::ReturnCodes override;
        auto deleteDBEntry(Context &context) -> sys::ReturnCodes override;

        auto requestCount(Context &context) -> sys::ReturnCodes;
        auto requestContactByID(Context &context) -> sys::ReturnCodes;
        static auto to_json(ContactRecord record) -> json11::Json;
        static auto from_json(json11::Json contactJSON) -> ContactRecord;


@@ 39,4 40,4 @@ namespace ParserStateMachine
        const inline std::string isFavourite     = "favourite";

    } // namespace json::contacts
} // namespace ParserStateMachine
} // namespace parserFSM

M module-services/service-desktop/endpoints/contacts/ContactsEndpoint.cpp => module-services/service-desktop/endpoints/contacts/ContactsEndpoint.cpp +2 -5
@@ 3,11 3,10 @@
#include <memory>
#include <string>

using namespace ParserStateMachine;
using namespace parserFSM;

auto ContactsEndpoint::handle(Context &context) -> std::string
auto ContactsEndpoint::handle(Context &context) -> void
{

    switch (context.getMethod()) {
    case http::Method::get:
        helper->requestDataFromDB(context);


@@ 22,6 21,4 @@ auto ContactsEndpoint::handle(Context &context) -> std::string
        helper->deleteDBEntry(context);
        break;
    }

    return std::string();
}

M module-services/service-desktop/endpoints/contacts/ContactsEndpoint.hpp => module-services/service-desktop/endpoints/contacts/ContactsEndpoint.hpp +2 -2
@@ 4,7 4,7 @@
#include "Service/Service.hpp"
#include "ContactHelper.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

class ContactsEndpoint : public Endpoint
{


@@ 17,5 17,5 @@ class ContactsEndpoint : public Endpoint
        debugName = "ContactsEndpoint";
        helper    = std::make_unique<ContactHelper>(ownerServicePtr);
    }
    auto handle(Context &context) -> std::string override;
    auto handle(Context &context) -> void override;
};

M module-services/service-desktop/endpoints/deviceInfo/DeviceInfoEndpoint.cpp => module-services/service-desktop/endpoints/deviceInfo/DeviceInfoEndpoint.cpp +6 -14
@@ 6,30 6,23 @@
#include <service-desktop/ServiceDesktop.hpp>
#include <string>

time_t FreeRTOS_time(time_t *pxTime)
{
    return utils::time::Time().getTime();
}

auto DeviceInfoEndpoint::handle(Context &context) -> std::string
auto DeviceInfoEndpoint::handle(Context &context) -> void
{
    switch (context.getMethod()) {
    case http::Method::get:
        getDeviceInfo(context);
        break;
    default:
        MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
            sys::ReturnCodes::Failure, static_cast<int>(EndpointType::deviceInfo), context.getUuid(), json11::Json()));
        context.setResponseStatus(http::Code::BadRequest);
        MessageHandler::putToSendQueue(context.createSimpleResponse());
        break;
    }

    return std::string();
}
auto DeviceInfoEndpoint::getDeviceInfo(Context &context) -> bool
{
    vfs::FilesystemStats fsStats = vfs.getFilesystemStats();

    json11::Json responseBodyJson = json11::Json::object(
    context.setResponseBody(json11::Json::object(
        {{json::batteryLevel, std::to_string(Store::Battery::get().level)},
         {json::batteryState, std::to_string(static_cast<int>(Store::Battery::get().state))},
         {json::selectedSim, std::to_string(static_cast<int>(Store::GSM::get()->selected))},


@@ 41,9 34,8 @@ auto DeviceInfoEndpoint::getDeviceInfo(Context &context) -> bool
         {json::gitRevision, (std::string)(GIT_REV)},
         {json::gitTag, (std::string)GIT_TAG},
         {json::gitBranch, (std::string)GIT_BRANCH},
         {json::currentRTCTime, std::to_string(static_cast<uint32_t>(utils::time::Time().getTime()))}});
         {json::currentRTCTime, std::to_string(static_cast<uint32_t>(utils::time::Time().getTime()))}}));

    MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
        true, static_cast<int>(EndpointType::deviceInfo), context.getUuid(), responseBodyJson));
    MessageHandler::putToSendQueue(context.createSimpleResponse());
    return true;
}

M module-services/service-desktop/endpoints/deviceInfo/DeviceInfoEndpoint.hpp => module-services/service-desktop/endpoints/deviceInfo/DeviceInfoEndpoint.hpp +2 -2
@@ 3,7 3,7 @@
#include "Endpoint.hpp"
#include "Service/Service.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

class DeviceInfoEndpoint : public Endpoint
{


@@ 13,6 13,6 @@ class DeviceInfoEndpoint : public Endpoint
    {
        debugName = "DeviceInfoEndpoint";
    }
    auto handle(Context &context) -> std::string override;
    auto handle(Context &context) -> void override;
    auto getDeviceInfo(Context &context) -> bool;
};

M module-services/service-desktop/endpoints/factoryReset/FactoryResetEndpoint.cpp => module-services/service-desktop/endpoints/factoryReset/FactoryResetEndpoint.cpp +10 -13
@@ 2,32 2,29 @@
#include "DesktopMessages.hpp"
#include "ServiceDesktop.hpp"

auto FactoryResetEndpoint::handle(Context &context) -> std::string
auto FactoryResetEndpoint::handle(Context &context) -> void
{
    if (context.getMethod() == ParserStateMachine::http::Method::post) {
        json11::Json responseBodyJson;
    if (context.getMethod() == parserFSM::http::Method::post) {

        if (context.getBody()[ParserStateMachine::json::factoryRequest] == true) {
        if (context.getBody()[parserFSM::json::factoryRequest] == true) {
            auto msg = std::make_shared<sdesktop::FactoryMessage>();
            sys::Bus::SendUnicast(msg, service::name::service_desktop, ownerServicePtr);

            responseBodyJson = json11::Json::object({{ParserStateMachine::json::factoryRequest, true}});
            context.setResponseBody(json11::Json::object({{parserFSM::json::factoryRequest, true}}));
        }
        else {
            responseBodyJson = json11::Json::object({{ParserStateMachine::json::factoryRequest, false}});
            context.setResponseBody(json11::Json::object({{parserFSM::json::factoryRequest, false}}));
        }

        MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
            sys::ReturnCodes::Success, static_cast<int>(EndpointType::factory), context.getUuid(), json11::Json()));
        MessageHandler::putToSendQueue(context.createSimpleResponse());

        return std::string();
        return;
    }
    else {
        json11::Json responseBodyJson = json11::Json::object({{ParserStateMachine::json::factoryRequest, false}});
        context.setResponseBody(json11::Json::object({{parserFSM::json::factoryRequest, false}}));

        MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
            sys::ReturnCodes::Failure, static_cast<int>(EndpointType::factory), context.getUuid(), json11::Json()));
        MessageHandler::putToSendQueue(context.createSimpleResponse());

        return std::string();
        return;
    }
}

M module-services/service-desktop/endpoints/factoryReset/FactoryResetEndpoint.hpp => module-services/service-desktop/endpoints/factoryReset/FactoryResetEndpoint.hpp +2 -2
@@ 3,7 3,7 @@
#include "Endpoint.hpp"
#include "Service/Service.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

class FactoryResetEndpoint : public Endpoint
{


@@ 13,6 13,6 @@ class FactoryResetEndpoint : public Endpoint
    {
        debugName = "FactoryResetEndpoint";
    }
    auto handle(Context &context) -> std::string override;
    auto handle(Context &context) -> void override;
    auto makeFactoryReset(Context &context) -> bool;
};

M module-services/service-desktop/endpoints/messages/MessageHelper.cpp => module-services/service-desktop/endpoints/messages/MessageHelper.cpp +63 -55
@@ 25,7 25,7 @@
#include <memory>
#include <string>

using namespace ParserStateMachine;
using namespace parserFSM;

auto MessageHelper::to_json(SMSRecord record) -> json11::Json
{


@@ 91,19 91,19 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes
        auto query = std::make_unique<db::query::SMSGetCount>();

        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, uint32_t uuid) {
            [=](db::QueryResult *result, Context context) {
                if (auto SMSResult = dynamic_cast<db::query::SMSGetCountResult *>(result)) {
                    auto id   = SMSResult->getResults();
                    auto body = json11::Json::object{{json::messages::count, static_cast<int>(id)}};
                    MessageHandler::putToSendQueue(
                        Endpoint::createSimpleResponse(true, static_cast<int>(EndpointType::messages), uuid, body));
                    auto id = SMSResult->getResults();

                    context.setResponseBody(json11::Json::object{{json::messages::count, static_cast<int>(id)}});
                    MessageHandler::putToSendQueue(context.createSimpleResponse());
                    return true;
                }
                else {
                    return false;
                }
            },
            context.getUuid());
            context);

        query->setQueryListener(std::move(listener));
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));


@@ 113,18 113,18 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes
        auto query = std::make_unique<db::query::SMSGetByID>(context.getBody()[json::messages::id].int_value());

        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, uint32_t uuid) {
            [=](db::QueryResult *result, Context context) {
                if (auto SMSResult = dynamic_cast<db::query::SMSGetByIDResult *>(result)) {
                    auto body = MessageHelper::to_json(SMSResult->getResults());
                    MessageHandler::putToSendQueue(
                        Endpoint::createSimpleResponse(true, static_cast<int>(EndpointType::messages), uuid, body));

                    context.setResponseBody(MessageHelper::to_json(SMSResult->getResults()));
                    MessageHandler::putToSendQueue(context.createSimpleResponse());
                    return true;
                }
                else {
                    return false;
                }
            },
            context.getUuid());
            context);

        query->setQueryListener(std::move(listener));
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));


@@ 135,7 135,7 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes
            std::make_unique<db::query::SMSGetByContactID>(context.getBody()[json::messages::contactID].int_value());

        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, uint32_t uuid) {
            [=](db::QueryResult *result, Context context) {
                if (auto SMSResult = dynamic_cast<db::query::SMSGetByContactIDResult *>(result)) {

                    json11::Json::array SMSarray;


@@ 143,15 143,15 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes
                        SMSarray.emplace_back(MessageHelper::to_json(record));
                    }

                    MessageHandler::putToSendQueue(
                        Endpoint::createSimpleResponse(true, static_cast<int>(EndpointType::messages), uuid, SMSarray));
                    context.setResponseBody(SMSarray);
                    MessageHandler::putToSendQueue(context.createSimpleResponse());
                    return true;
                }
                else {
                    return false;
                }
            },
            context.getUuid());
            context);

        query->setQueryListener(std::move(listener));
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));


@@ 161,7 161,7 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes
            std::make_unique<db::query::SMSGetByText>(context.getBody()[json::messages::messageBody].string_value());

        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, uint32_t uuid) {
            [=](db::QueryResult *result, Context context) {
                if (auto SMSResult = dynamic_cast<db::query::SMSGetByTextResult *>(result)) {

                    json11::Json::array SMSarray;


@@ 169,15 169,15 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes
                        SMSarray.emplace_back(MessageHelper::to_json(record));
                    }

                    MessageHandler::putToSendQueue(
                        Endpoint::createSimpleResponse(true, static_cast<int>(EndpointType::messages), uuid, SMSarray));
                    context.setResponseBody(SMSarray);
                    MessageHandler::putToSendQueue(context.createSimpleResponse());
                    return true;
                }
                else {
                    return false;
                }
            },
            context.getUuid());
            context);

        query->setQueryListener(std::move(listener));
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));


@@ 188,7 188,7 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes
                                                         context.getBody()[json::messages::offset].int_value());

        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, uint32_t uuid) {
            [=](db::QueryResult *result, Context context) {
                if (auto SMSResult = dynamic_cast<db::query::SMSGetResult *>(result)) {

                    json11::Json::array SMSarray;


@@ 196,15 196,15 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes
                        SMSarray.emplace_back(MessageHelper::to_json(record));
                    }

                    MessageHandler::putToSendQueue(
                        Endpoint::createSimpleResponse(true, static_cast<int>(EndpointType::messages), uuid, SMSarray));
                    context.setResponseBody(SMSarray);
                    MessageHandler::putToSendQueue(context.createSimpleResponse());
                    return true;
                }
                else {
                    return false;
                }
            },
            context.getUuid());
            context);

        query->setQueryListener(std::move(listener));
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));


@@ 220,19 220,19 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes
        auto query = std::make_unique<db::query::SMSTemplateGetCount>();

        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, uint32_t uuid) {
            [=](db::QueryResult *result, Context context) {
                if (auto SMSResult = dynamic_cast<db::query::SMSTemplateGetCountResult *>(result)) {
                    auto id   = SMSResult->getResults();
                    auto body = json11::Json::object{{json::messages::count, static_cast<int>(id)}};
                    MessageHandler::putToSendQueue(
                        Endpoint::createSimpleResponse(true, static_cast<int>(EndpointType::messages), uuid, body));
                    auto id = SMSResult->getResults();

                    context.setResponseBody(json11::Json::object{{json::messages::count, static_cast<int>(id)}});
                    MessageHandler::putToSendQueue(context.createSimpleResponse());
                    return true;
                }
                else {
                    return false;
                }
            },
            context.getUuid());
            context);

        query->setQueryListener(std::move(listener));
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query));


@@ 241,18 241,18 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes
        auto query = std::make_unique<db::query::SMSTemplateGetByID>(context.getBody()[json::messages::id].int_value());

        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, uint32_t uuid) {
            [=](db::QueryResult *result, Context context) {
                if (auto SMSTemplateResult = dynamic_cast<db::query::SMSTemplateGetByIDResult *>(result)) {
                    auto body = MessageHelper::to_json(SMSTemplateResult->getResults());
                    MessageHandler::putToSendQueue(
                        Endpoint::createSimpleResponse(true, static_cast<int>(EndpointType::messages), uuid, body));

                    context.setResponseBody(MessageHelper::to_json(SMSTemplateResult->getResults()));
                    MessageHandler::putToSendQueue(context.createSimpleResponse());
                    return true;
                }
                else {
                    return false;
                }
            },
            context.getUuid());
            context);

        query->setQueryListener(std::move(listener));
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query));


@@ 262,22 262,23 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes
        auto query = std::make_unique<db::query::SMSTemplateGet>(context.getBody()[json::messages::offset].int_value(),
                                                                 context.getBody()[json::messages::count].int_value());
        auto listener = std::make_unique<db::EndpointListener>(
            [=](db::QueryResult *result, uint32_t uuid) {
            [=](db::QueryResult *result, Context context) {
                if (auto SMSTemplateResult = dynamic_cast<db::query::SMSTemplateGetResult *>(result)) {

                    json11::Json::array SMSTemplateArray;
                    for (auto record : SMSTemplateResult->getResults()) {
                        SMSTemplateArray.emplace_back(to_json(record));
                    }
                    MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                        true, static_cast<int>(EndpointType::messages), uuid, SMSTemplateArray));

                    context.setResponseBody(SMSTemplateArray);
                    MessageHandler::putToSendQueue(context.createSimpleResponse());
                    return true;
                }
                else {
                    return false;
                }
            },
            context.getUuid());
            context);

        query->setQueryListener(std::move(listener));
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query));


@@ 303,17 304,19 @@ auto MessageHelper::createTemplate(Context &context) -> sys::ReturnCodes

    auto query    = std::make_unique<db::query::SMSTemplateAdd>(record);
    auto listener = std::make_unique<db::EndpointListener>(
        [=](db::QueryResult *result, uint32_t uuid) {
        [=](db::QueryResult *result, Context context) {
            if (auto SMSTemplateResult = dynamic_cast<db::query::SMSTemplateAddResult *>(result)) {
                MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                    SMSTemplateResult->getResult(), static_cast<int>(EndpointType::messages), uuid, json11::Json()));

                context.setResponseStatus(SMSTemplateResult->getResult() ? http::Code::OK
                                                                         : http::Code::InternalServerError);
                MessageHandler::putToSendQueue(context.createSimpleResponse());
                return true;
            }
            else {
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));
    DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query));


@@ 342,17 345,19 @@ auto MessageHelper::deleteSMS(Context &context) -> sys::ReturnCodes
    auto id       = context.getBody()[json::messages::id].int_value();
    auto query    = std::make_unique<db::query::SMSRemove>(id);
    auto listener = std::make_unique<db::EndpointListener>(
        [=](db::QueryResult *result, uint32_t uuid) {
        [=](db::QueryResult *result, Context context) {
            if (auto SMSTemplateResult = dynamic_cast<db::query::SMSRemoveResult *>(result)) {
                MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                    SMSTemplateResult->getResults(), static_cast<int>(EndpointType::messages), uuid, json11::Json()));

                context.setResponseStatus(SMSTemplateResult->getResults() ? http::Code::OK
                                                                          : http::Code::InternalServerError);
                MessageHandler::putToSendQueue(context.createSimpleResponse());
                return true;
            }
            else {
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));
    DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));


@@ 365,17 370,19 @@ auto MessageHelper::deleteTemplate(Context &context) -> sys::ReturnCodes
    auto id       = context.getBody()[json::messages::id].int_value();
    auto query    = std::make_unique<db::query::SMSTemplateRemove>(id);
    auto listener = std::make_unique<db::EndpointListener>(
        [=](db::QueryResult *result, uint32_t uuid) {
        [=](db::QueryResult *result, Context context) {
            if (auto SMSTemplateResult = dynamic_cast<db::query::SMSTemplateRemoveResult *>(result)) {
                MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                    SMSTemplateResult->getResults(), static_cast<int>(EndpointType::messages), uuid, json11::Json()));

                context.setResponseStatus(SMSTemplateResult->getResults() ? http::Code::OK
                                                                          : http::Code::InternalServerError);
                MessageHandler::putToSendQueue(context.createSimpleResponse());
                return true;
            }
            else {
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));
    DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query));


@@ 402,10 409,11 @@ auto MessageHelper::updateSMS(Context &context) -> sys::ReturnCodes
        (context.getBody()[json::messages::isUnread].bool_value() ? MarkAsRead::Read::False : MarkAsRead::Read::True));

    auto listener = std::make_unique<db::EndpointListener>(
        [=](db::QueryResult *result, uint32_t uuid) {
        [=](db::QueryResult *result, Context context) {
            if (auto SMSResult = dynamic_cast<db::query::smsthread::MarkAsReadResult *>(result)) {
                MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
                    SMSResult->getResult(), static_cast<int>(EndpointType::messages), uuid, json11::Json()));

                context.setResponseStatus(SMSResult->getResult() ? http::Code::OK : http::Code::InternalServerError);
                MessageHandler::putToSendQueue(context.createSimpleResponse());

                return true;
            }


@@ 413,7 421,7 @@ auto MessageHelper::updateSMS(Context &context) -> sys::ReturnCodes
                return false;
            }
        },
        context.getUuid());
        context);

    query->setQueryListener(std::move(listener));


M module-services/service-desktop/endpoints/messages/MessageHelper.hpp => module-services/service-desktop/endpoints/messages/MessageHelper.hpp +3 -4
@@ 9,7 9,7 @@
#include <service-db/api/DBServiceAPI.hpp>
#include "Endpoint.hpp"

namespace ParserStateMachine
namespace parserFSM
{

    class MessageHelper final : public DBHelper


@@ 32,7 32,7 @@ namespace ParserStateMachine
        auto updateSMS(Context &context) -> sys::ReturnCodes;
        auto deleteSMS(Context &context) -> sys::ReturnCodes;

        auto requestMessagesCount(Context &context) -> sys::ReturnCodes;
        // auto createSimpleResponse(Context &context) -> std::string override;

        static auto to_json(SMSRecord record) -> json11::Json;
        static auto to_json(ThreadRecord record) -> json11::Json;


@@ 49,7 49,6 @@ namespace ParserStateMachine
        const inline std::string count        = "count";
        const inline std::string offset       = "offset";
        const inline std::string phoneNumber  = "phoneNumber";
        const inline std::string messageBody  = "messageBody";
        const inline std::string isUnread     = "unread";
        const inline std::string contactID    = "contactID";
        const inline std::string date         = "date";


@@ 67,4 66,4 @@ namespace ParserStateMachine
        } // namespace thread

    } // namespace messages
} // namespace ParserStateMachine
} // namespace parserFSM

M module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp => module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp +2 -8
@@ 1,15 1,10 @@

#include "MessagesEndpoint.hpp"
#include "queries/sms/QuerySMSGetByID.hpp"
#include "queries/sms/QuerySMSGetByContactID.hpp"
#include "queries/sms/QuerySMSGetByText.hpp"
#include "queries/sms/QuerySMSTemplateGetByID.hpp"
#include <memory>
#include <string>

using namespace ParserStateMachine;
using namespace parserFSM;

auto MessagesEndpoint::handle(Context &context) -> std::string
auto MessagesEndpoint::handle(Context &context) -> void
{

    switch (context.getMethod()) {


@@ 26,5 21,4 @@ auto MessagesEndpoint::handle(Context &context) -> std::string
        helper->deleteDBEntry(context);
        break;
    }
    return std::string();
}

M module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp => module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp +2 -2
@@ 4,7 4,7 @@
#include "Service/Service.hpp"
#include "MessageHelper.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

class MessagesEndpoint : public Endpoint
{


@@ 17,5 17,5 @@ class MessagesEndpoint : public Endpoint
        debugName = "MessagesEndpoint";
        helper    = std::make_shared<MessageHelper>(ownerServicePtr);
    }
    auto handle(Context &context) -> std::string override;
    auto handle(Context &context) -> void override;
};

M module-services/service-desktop/endpoints/restore/RestoreEndpoint.cpp => module-services/service-desktop/endpoints/restore/RestoreEndpoint.cpp +8 -10
@@ 3,27 3,25 @@
#include "ServiceDesktop.hpp"
#include "RestoreEndpoint.hpp"

auto RestoreEndpoint::handle(Context &context) -> std::string
auto RestoreEndpoint::handle(Context &context) -> void
{
    if (context.getMethod() == ParserStateMachine::http::Method::post) {
        json11::Json responseBodyJson;
    if (context.getMethod() == parserFSM::http::Method::post) {

        if (context.getBody()[ParserStateMachine::json::restoreRequest] == true) {
        if (context.getBody()[parserFSM::json::restoreRequest] == true) {
            auto msg = std::make_shared<sdesktop::RestoreMessage>();
            sys::Bus::SendUnicast(msg, service::name::service_desktop, ownerServicePtr);

            responseBodyJson = json11::Json::object({{ParserStateMachine::json::restoreRequest, true}});
            context.setResponseBody(json11::Json::object({{parserFSM::json::restoreRequest, true}}));
        }
        else {
            responseBodyJson = json11::Json::object({{ParserStateMachine::json::restoreRequest, false}});
            context.setResponseBody(json11::Json::object({{parserFSM::json::restoreRequest, false}}));
        }

        MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
            true, static_cast<int>(EndpointType::restore), context.getUuid(), responseBodyJson));
        MessageHandler::putToSendQueue(context.createSimpleResponse());

        return std::string();
        return;
    }
    else {
        return std::string();
        return;
    }
}

M module-services/service-desktop/endpoints/restore/RestoreEndpoint.hpp => module-services/service-desktop/endpoints/restore/RestoreEndpoint.hpp +2 -2
@@ 2,7 2,7 @@
#include "ParserUtils.hpp"
#include "ServiceDesktop.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

class RestoreEndpoint : public Endpoint
{


@@ 11,5 11,5 @@ class RestoreEndpoint : public Endpoint
    {
        debugName = "RestoreEndpoint";
    }
    auto handle(Context &context) -> std::string override;
    auto handle(Context &context) -> void override;
};

M module-services/service-desktop/endpoints/update/UpdateEndpoint.cpp => module-services/service-desktop/endpoints/update/UpdateEndpoint.cpp +5 -8
@@ 3,7 3,7 @@
#include "DesktopMessages.hpp"
#include "ServiceDesktop.hpp"

auto UpdateEndpoint::handle(Context &context) -> std::string
auto UpdateEndpoint::handle(Context &context) -> void
{
    switch (context.getMethod()) {
    case http::Method::post:


@@ 15,17 15,15 @@ auto UpdateEndpoint::handle(Context &context) -> std::string
    default:
        break;
    }
    return std::string();
}

auto UpdateEndpoint::run(Context &context) -> sys::ReturnCodes
{
    std::string fileName = context.getBody()["fileName"].string_value();

    json11::Json responseBodyJson = json11::Json::object({{ParserStateMachine::json::updateReady, true}});
    context.setResponseBody(json11::Json::object({{parserFSM::json::updateReady, true}}));

    MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
        true, static_cast<int>(EndpointType::update), context.getUuid(), responseBodyJson));
    MessageHandler::putToSendQueue(context.createSimpleResponse());

    auto msg = std::make_shared<sdesktop::UpdateOsMessage>(fileName, context.getUuid());
    sys::Bus::SendUnicast(msg, service::name::service_desktop, ownerServicePtr);


@@ 37,10 35,9 @@ auto UpdateEndpoint::getUpdates(Context &context) -> sys::ReturnCodes
{
    json11::Json fileList = vfs.listdir(purefs::dir::os_updates.c_str(), updateos::extension::update, true);

    json11::Json responseBodyJson = json11::Json::object{{ParserStateMachine::json::updateFileList, fileList}};
    context.setResponseBody(json11::Json::object{{parserFSM::json::updateFileList, fileList}});

    MessageHandler::putToSendQueue(Endpoint::createSimpleResponse(
        true, static_cast<int>(EndpointType::update), context.getUuid(), responseBodyJson));
    MessageHandler::putToSendQueue(context.createSimpleResponse());

    return sys::ReturnCodes::Success;
}

M module-services/service-desktop/endpoints/update/UpdateEndpoint.hpp => module-services/service-desktop/endpoints/update/UpdateEndpoint.hpp +2 -2
@@ 3,7 3,7 @@
#include "Endpoint.hpp"
#include "Service/Service.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

class UpdateEndpoint : public Endpoint
{


@@ 13,7 13,7 @@ class UpdateEndpoint : public Endpoint
    {
        debugName = "UpdateEndpoint";
    }
    auto handle(Context &context) -> std::string override;
    auto handle(Context &context) -> void override;
    auto run(Context &context) -> sys::ReturnCodes;
    auto getUpdates(Context &context) -> sys::ReturnCodes;
};

M module-services/service-desktop/parser/CMakeLists.txt => module-services/service-desktop/parser/CMakeLists.txt +1 -1
@@ 5,7 5,7 @@ target_include_directories(${PROJECT_NAME}
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_LIST_DIR}")
target_sources(${PROJECT_NAME}
	PRIVATE
		"${CMAKE_CURRENT_LIST_DIR}/ParserStateMachine.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/ParserFSM.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/ParserUtils.cpp"
		"${CMAKE_CURRENT_LIST_DIR}/MessageHandler.cpp"


M module-services/service-desktop/parser/MessageHandler.cpp => module-services/service-desktop/parser/MessageHandler.cpp +1 -1
@@ 5,7 5,7 @@
#include "ParserUtils.hpp"
#include <memory>

using namespace ParserStateMachine;
using namespace parserFSM;

xQueueHandle MessageHandler::sendQueue;


M module-services/service-desktop/parser/MessageHandler.hpp => module-services/service-desktop/parser/MessageHandler.hpp +2 -2
@@ 9,7 9,7 @@ extern "C"
#include <queue.h>
}

namespace ParserStateMachine
namespace parserFSM
{
    class MessageHandler
    {


@@ 38,4 38,4 @@ namespace ParserStateMachine
        std::string JsonErrorMsg;
        sys::Service *OwnerServicePtr = nullptr;
    };
} // namespace ParserStateMachine
} // namespace parserFSM

R module-services/service-desktop/parser/ParserStateMachine.cpp => module-services/service-desktop/parser/ParserFSM.cpp +2 -2
@@ 1,11 1,11 @@
#include "ParserStateMachine.hpp"
#include "ParserFSM.hpp"
#include <service-desktop/ServiceDesktop.hpp>
#include <log/log.hpp>
#include <json/json11.hpp>
#include <memory>
#include <string>

using namespace ParserStateMachine;
using namespace parserFSM;

StateMachine::StateMachine(sys::Service *OwnerService) : OwnerServicePtr(OwnerService)
{}

R module-services/service-desktop/parser/ParserStateMachine.hpp => module-services/service-desktop/parser/ParserFSM.hpp +4 -4
@@ 3,7 3,7 @@
#include "json/json11.hpp"
#include "MessageHandler.hpp"

namespace ParserStateMachine
namespace parserFSM
{
    enum class State
    {


@@ 24,8 24,8 @@ namespace ParserStateMachine
        };

      private:
        std::string *receivedMsgPtr     = nullptr;
        ParserStateMachine::State state = State::NoMsg;
        std::string *receivedMsgPtr = nullptr;
        parserFSM::State state      = State::NoMsg;
        std::string payload;
        std::string header;
        unsigned long payloadLength   = 0;


@@ 37,4 37,4 @@ namespace ParserStateMachine
        void parsePartialMessage();
        void parsePayload();
    };
} // namespace ParserStateMachine
} // namespace parserFSM

M module-services/service-desktop/parser/ParserUtils.cpp => module-services/service-desktop/parser/ParserUtils.cpp +1 -1
@@ 1,6 1,6 @@
#include "ParserUtils.hpp"

using namespace ParserStateMachine;
using namespace parserFSM;

bool http::isMethodValid(uint8_t method)
{

M module-services/service-desktop/parser/ParserUtils.hpp => module-services/service-desktop/parser/ParserUtils.hpp +4 -4
@@ 4,14 4,14 @@
#include <vector>
#include <log/log.hpp>

namespace ParserStateMachine
namespace parserFSM
{

    // Endpoint type definition
    enum class EndpointType
    {
        invalid    = 0,
        deviceInfo = 1,
        invalid = 0,
        deviceInfo,
        update,
        backup,
        restore,


@@ 137,4 137,4 @@ namespace ParserStateMachine

    } // namespace json

} // namespace ParserStateMachine
} // namespace parserFSM

M module-services/service-desktop/tests/unittest.cpp => module-services/service-desktop/tests/unittest.cpp +2 -16
@@ 6,7 6,7 @@
#include "Service/Common.hpp"
#include "module-services/service-desktop/endpoints/update/UpdatePureOS.hpp"
#include "module-services/service-desktop/endpoints/factoryReset/FactoryReset.hpp"
#include "ParserStateMachine.hpp"
#include "ParserFSM.hpp"
#include "contacts/ContactHelper.hpp"
#include "messages/MessageHelper.hpp"
#include "queries/sms/QuerySMSSearchByType.hpp"


@@ 48,7 48,7 @@ TEST_CASE("Factory Reset Test")
    REQUIRE(FactoryReset::CopyDirContent(factorydir, sysdir) == true);
}

using namespace ParserStateMachine;
using namespace parserFSM;

TEST_CASE("Parser Test")
{


@@ 230,17 230,3 @@ TEST_CASE("DB Helpers test - json encoding (messages)")
    REQUIRE(messageTemplateJson[json::messages::id] == 1);
}

TEST_CASE("Simple response builder test")
{
    auto resp = Endpoint::createSimpleResponse(
        sys::ReturnCodes::Success, static_cast<int>(EndpointType::contacts), 1234, json11::Json());
    std::string err;
    REQUIRE(resp.substr(0, 10) == "#000000060");
    resp.erase(0, 10);

    auto responseJson = json11::Json::parse(resp, err);
    REQUIRE(err.empty());
    REQUIRE(responseJson[json::endpoint] == static_cast<int>(EndpointType::contacts));
    REQUIRE(responseJson[json::status] == static_cast<int>(http::Code::OK));
    REQUIRE(responseJson[json::uuid].dump() == "\"1234\"");
}

M module-utils/log/debug.hpp => module-utils/log/debug.hpp +1 -1
@@ 4,7 4,7 @@
#define DEBUG_SCOPED_TIMINGS         1 /// show timings in measured functions
#define _RT1051_UART_DEBUG           0 /// show full modem uart communication
#define DEBUG_MODEM_OUTPUT_RESPONSE  1 /// show full modem output
#define DEBUG_SERVICE_MESSAGES       1 /// show messages prior to handling in service
#define DEBUG_SERVICE_MESSAGES       0 /// show messages prior to handling in service
#define DEBUG_DB_MODEL_DATA          0 /// show messages prior to handling in service
#define DEBUG_FONT                   0 /// show Font debug messages
#define DEBUG_GUI_TEXT               0 /// show basic debug messages for gui::Text - warning this can be hard on cpu

R module-vfs/board/cross/freeRTOS_FAT/portable/common.c => module-vfs/board/cross/freeRTOS_FAT/portable/common.cpp +4 -12
@@ 7,7 7,7 @@
#include <stdint.h>
#include <string.h>
#include <time.h>

#include <time/time_conversion.hpp>
#if 0
struct tm *gmtime_r( const time_t *pxTime, struct tm *tmStruct )
{


@@ 19,16 19,8 @@ struct tm *gmtime_r( const time_t *pxTime, struct tm *tmStruct )
#endif
/*-----------------------------------------------------------*/

time_t FreeRTOS_time( time_t *pxTime )
time_t FreeRTOS_time(time_t *pxTime)
{
time_t xReturn;

	xReturn = 0;//time( &xReturn );

	if( pxTime != NULL )
	{
		*pxTime = xReturn;
	}

	return xReturn;
    return utils::time::Time().getTime();
}


M module-vfs/targets/Target_Cross.cmake => module-vfs/targets/Target_Cross.cmake +2 -1
@@ 16,6 16,7 @@ set(BOARD_SOURCES
        ${CMAKE_CURRENT_SOURCE_DIR}/board/cross/freeRTOS_FAT/ff_time.c

        ${CMAKE_CURRENT_SOURCE_DIR}/board/cross/freeRTOS_FAT/portable/ff_eMMC_user_disk.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/board/cross/freeRTOS_FAT/portable/common.cpp


        CACHE INTERNAL ""


@@ 27,4 28,4 @@ set(BOARD_DIR_INCLUDES
        ${CMAKE_CURRENT_SOURCE_DIR}/board/cross/freeRTOS_FAT/include
        ${CMAKE_CURRENT_SOURCE_DIR}/board/cross/freeRTOS_FAT/portable

        CACHE INTERNAL "")
\ No newline at end of file
        CACHE INTERNAL "")