~aleteoryx/muditaos

e7b9bcf7e94bced35c173dcc6e44329abeccd2f5 — Przemyslaw Brudny 5 years ago 3f29c30
[EGD-5133] Fix settings bus add duplications

Changed Bus Channels vector to set to prevent
duplicates and cleaned logging.
M module-apps/application-messages/ApplicationMessages.cpp => module-apps/application-messages/ApplicationMessages.cpp +0 -1
@@ 65,7 65,6 @@ namespace app

        if (msgl->messageType == MessageType::DBServiceNotification) {
            auto msg = dynamic_cast<db::NotificationMessage *>(msgl);
            LOG_DEBUG("Received notification");
            if (msg != nullptr) {
                // window-specific actions
                if (msg->interface == db::Interface::Name::SMSThread || msg->interface == db::Interface::Name::SMS) {

M module-apps/application-messages/widgets/SMSOutputWidget.cpp => module-apps/application-messages/widgets/SMSOutputWidget.cpp +0 -1
@@ 35,7 35,6 @@ namespace gui
        smsBubble->setPenWidth(style::window::default_border_rect_no_focus);
        smsBubble->setPadding(style::messages::smsOutput::sms_right_bubble_padding);

        LOG_DEBUG("ADD SMS TYPE: %d", static_cast<int>(record->type));
        switch (record->type) {
        case SMSType::QUEUED:
            // Handle in the same way as case below. (pending sending display as already sent)

A module-db/Common/Logging.hpp => module-db/Common/Logging.hpp +12 -0
@@ 0,0 1,12 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#if DEBUG_DB_MODEL_DATA == 1
#define debug_db_data(...) LOG_DEBUG(__VA_ARGS__)
#define error_db_data(...) LOG_ERROR(__VA_ARGS__)
#else
#define debug_db_data(...)
#define error_db_data(...)
#endif

M module-db/Interface/ContactRecord.cpp => module-db/Interface/ContactRecord.cpp +51 -50
@@ 35,7 35,7 @@ auto ContactRecordInterface::Add(ContactRecord &rec) -> bool
    }

    uint32_t contactID = contactDB->getLastInsertRowId();
    LOG_DEBUG("New contact with ID %" PRIu32 " created", contactID);
    debug_db_data("New contact with ID %" PRIu32 " created", contactID);
    rec.ID = contactID;

    ret = contactDB->name.add(ContactsNameTableRow{{.ID = DB_ID_NONE},


@@ 128,7 128,7 @@ auto ContactRecordInterface::RemoveByID(uint32_t id) -> bool
auto ContactRecordInterface::runQuery(std::shared_ptr<db::Query> query) -> std::unique_ptr<db::QueryResult>
{
    if (query->type != db::Query::Type::Read) {
        LOG_WARN("Received unhandled query type: %lu", static_cast<unsigned long int>(query->type));
        debug_db_data("Received unhandled query type: %lu", static_cast<unsigned long int>(query->type));
        return nullptr;
    }



@@ 157,7 157,7 @@ auto ContactRecordInterface::runQuery(std::shared_ptr<db::Query> query) -> std::
        return numberGetByIdQuery(query);
    }
    else {
        LOG_ERROR("Unexpected query type.");
        error_db_data("Unexpected query type.");
        return nullptr;
    }
}


@@ 169,14 169,14 @@ auto ContactRecordInterface::getQuery(std::shared_ptr<db::Query> query) -> std::
    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());
        debug_db_data("Filtering by number: %s", textFilter->getFilterData().c_str());
    }

    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(),
              static_cast<unsigned long>(readQuery->getOffset()),
              static_cast<unsigned long>(readQuery->getLimit()));
    debug_db_data("Contact read query, filter: \"%s\", offset=%lu, limit=%lu",
                  readQuery->getFilterData().c_str(),
                  static_cast<unsigned long>(readQuery->getOffset()),
                  static_cast<unsigned long>(readQuery->getLimit()));
    auto [limit, offset] = readQuery->getLimitOffset();
    auto matchType       = searchByNumber ? ContactsTable::MatchType::TextNumber : ContactsTable::MatchType::Name;
    uint32_t groupID     = readQuery->getGroupFilterData();


@@ 186,7 186,7 @@ auto ContactRecordInterface::getQuery(std::shared_ptr<db::Query> query) -> std::
    else {
        groupID = favouritesGroupId;
    }
    LOG_DEBUG("Contact match Type: %lu", static_cast<unsigned long int>(matchType));
    debug_db_data("Contact match Type: %lu", static_cast<unsigned long int>(matchType));

    std::vector<std::uint32_t> ids;



@@ 196,7 196,7 @@ auto ContactRecordInterface::getQuery(std::shared_ptr<db::Query> query) -> std::
    else {
        ids = contactDB->contacts.GetIDsSortedByName(limit, offset);
    }
    LOG_DEBUG("Received records: %lu", static_cast<unsigned long int>(ids.size()));
    debug_db_data("Received records: %lu", static_cast<unsigned long int>(ids.size()));

    std::vector<ContactRecord> result(ids.size());
    std::transform(std::begin(ids), std::end(ids), std::begin(result), [this](uint32_t id) { return GetByID(id); });


@@ 240,11 240,11 @@ auto ContactRecordInterface::getSizeQuery(std::shared_ptr<db::Query> query) -> s
    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());
        debug_db_data("Filtering by number: %s", textFilter->getFilterData().c_str());
    }

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

    std::size_t count = 0;
    if (!countQuery->isFilterPresent()) {


@@ 281,7 281,7 @@ auto ContactRecordInterface::getSizeQuery(std::shared_ptr<db::Query> query) -> s
        count = contactDB->name.GetCountByName(countQuery->getFilterData());
    }

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

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


@@ 361,7 361,7 @@ auto ContactRecordInterface::unbindNumber(std::uint32_t contactId, std::uint32_t

auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
{
    LOG_DEBUG("%s", __FUNCTION__);
    debug_db_data("%s", __FUNCTION__);
    bool ret;
    ContactsTableRow contact = contactDB->contacts.getByIdWithTemporary(rec.ID);
    if (!contact.isValid()) {


@@ 381,7 381,7 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
                                                              .numberUser = number.number.getEntered().c_str(),
                                                              .numbere164 = number.number.getE164().c_str(),
                                                              .type       = number.numberType})) {
                LOG_ERROR("Failed to add new number for contact");
                error_db_data("Failed to add new number for contact");
                return false;
            }



@@ 390,7 390,7 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
        else {
            if (auto oldId = numberMatch->getContactID(); oldId != rec.ID) {
                if (!unbindNumber(oldId, numberMatch->getNumberID())) {
                    LOG_ERROR(
                    error_db_data(
                        "Failed to unbind number %" PRIu32 " from contact %" PRIu32, numberMatch->getNumberID(), oldId);
                }



@@ 398,9 398,9 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
                numberRecord.contactID = rec.ID;

                if (!contactDB->number.update(numberRecord)) {
                    LOG_ERROR("Failed to reassing number %" PRIu32 " to contact %" PRIu32,
                              numberMatch->getNumberID(),
                              rec.ID);
                    error_db_data("Failed to reassing number %" PRIu32 " to contact %" PRIu32,
                                  numberMatch->getNumberID(),
                                  rec.ID);
                }
            }
            outputNumberIDs.push_back(numberMatch->getNumberID());


@@ 411,9 411,9 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
    for (auto inNumberID : inputNumberIDs) {
        if (std::find(std::begin(outputNumberIDs), std::end(outputNumberIDs), inNumberID) ==
            std::end(outputNumberIDs)) {
            LOG_INFO("Removing obsolete number from table: %" PRIu32, inNumberID);
            debug_db_data("Removing obsolete number from table: %" PRIu32, inNumberID);
            if (!contactDB->number.removeById(inNumberID)) {
                LOG_ERROR("Failed to remove number");
                error_db_data("Failed to remove number");
                return false;
            }
        }


@@ 423,12 423,12 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
    auto speedDialContacts = GetBySpeedDial(rec.speeddial);
    if (!speedDialContacts->empty()) {
        if (speedDialContacts->size() != 1) {
            LOG_ERROR("Multiple contacts for same speed dial value %s", rec.speeddial.c_str());
            error_db_data("Multiple contacts for same speed dial value %s", rec.speeddial.c_str());
        }
        auto oldContact      = contactDB->contacts.getById(speedDialContacts->at(0).ID);
        oldContact.speedDial = "";
        if (!contactDB->contacts.update(oldContact)) {
            LOG_ERROR("Failed to remove speed dial from old contact");
            error_db_data("Failed to remove speed dial from old contact");
        }
    }



@@ 442,7 442,7 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
                                                      .nameAlternative = rec.alternativeName});

    if (!ret) {
        LOG_ERROR("Failed to update contact.");
        error_db_data("Failed to update contact.");
        return false;
    }



@@ 452,7 452,7 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
                                                      .nameAlternative = rec.alternativeName});

    if (!ret) {
        LOG_ERROR("Failed to update contact name");
        error_db_data("Failed to update contact name");
        return false;
    }



@@ 463,14 463,14 @@ auto ContactRecordInterface::Update(const ContactRecord &rec) -> bool
                                                            .mail      = rec.mail});

    if (!ret) {
        LOG_ERROR("Failed to update contact address");
        error_db_data("Failed to update contact address");
        return false;
    }

    ret = contactDB->ringtones.update(ContactsRingtonesTableRow(contact.ID, rec.assetPath));

    if (!ret) {
        LOG_ERROR("Failed to update contact ringtone");
        error_db_data("Failed to update contact ringtone");
        return false;
    }



@@ 487,7 487,7 @@ auto ContactRecordInterface::GetByID(uint32_t id) -> ContactRecord

auto ContactRecordInterface::GetByIdWithTemporary(uint32_t id) -> ContactRecord
{
    LOG_DEBUG("looking contact %" PRIu32 " with tmp", id);
    debug_db_data("looking contact %" PRIu32 " with tmp", id);
    auto contact = contactDB->contacts.getByIdWithTemporary(id);
    return getByIdCommon(contact);
}


@@ 495,7 495,7 @@ auto ContactRecordInterface::GetByIdWithTemporary(uint32_t id) -> ContactRecord
auto ContactRecordInterface::getByIdCommon(ContactsTableRow &contact) -> ContactRecord
{
    ContactRecord rec = ContactRecord();
    LOG_DEBUG("%" PRIu32, contact.ID);
    debug_db_data("%" PRIu32, contact.ID);
    if (!contact.isValid()) {
        return rec;
    }


@@ 509,7 509,7 @@ auto ContactRecordInterface::getByIdCommon(ContactsTableRow &contact) -> Contact
        rec.numbers = numbers;
    }
    else {
        LOG_DEBUG("Contact record does not contain any numbers.");
        debug_db_data("Contact record does not contain any numbers.");
    }

    auto ring = contactDB->ringtones.getById(contact.ringID);


@@ 517,7 517,7 @@ auto ContactRecordInterface::getByIdCommon(ContactsTableRow &contact) -> Contact
        rec.assetPath = ring.assetPath;
    }
    else {
        LOG_DEBUG("no ring record");
        debug_db_data("no ring record");
    }

    auto address = contactDB->address.getById(contact.addressID);


@@ 527,7 527,7 @@ auto ContactRecordInterface::getByIdCommon(ContactsTableRow &contact) -> Contact
        rec.mail    = address.mail;
    }
    else {
        LOG_DEBUG("no addres record");
        debug_db_data("no addres record");
    }

    auto name = contactDB->name.getById(contact.nameID);


@@ 536,7 536,7 @@ auto ContactRecordInterface::getByIdCommon(ContactsTableRow &contact) -> Contact
        rec.alternativeName = name.nameAlternative;
    }
    else {
        LOG_DEBUG("no name record");
        debug_db_data("no name record");
    }

    return rec;


@@ 573,7 573,7 @@ auto ContactRecordInterface::GetLimitOffset(uint32_t offset, uint32_t limit)

        auto nrs = getNumbers(contact.numbersID);
        if (nrs.size() == 0) {
            LOG_DEBUG("Contact record does not contain any numbers.");
            debug_db_data("Contact record does not contain any numbers.");
        }

        auto ring = contactDB->ringtones.getById(contact.ringID);


@@ 621,7 621,7 @@ auto ContactRecordInterface::GetLimitOffsetByField(uint32_t offset,

            auto nrs = getNumbers(contact.numbersID);
            if (nrs.size() == 0) {
                LOG_DEBUG("Contact record does not contain any numbers.");
                debug_db_data("Contact record does not contain any numbers.");
            }

            auto ring = contactDB->ringtones.getById(contact.ringID);


@@ 659,7 659,7 @@ auto ContactRecordInterface::GetLimitOffsetByField(uint32_t offset,

            auto nrs = getNumbers(contact.numbersID);
            if (nrs.size() == 0) {
                LOG_DEBUG("Contact record does not contain any numbers.");
                debug_db_data("Contact record does not contain any numbers.");
            }

            auto name = contactDB->name.getById(contact.nameID);


@@ 704,7 704,7 @@ auto ContactRecordInterface::GetLimitOffsetByField(uint32_t offset,

            auto nrs = getNumbers(contact.numbersID);
            if (nrs.size() == 0) {
                LOG_DEBUG("Contact record does not contain any numbers.");
                debug_db_data("Contact record does not contain any numbers.");
            }

            auto name = contactDB->name.getById(contact.nameID);


@@ 754,7 754,7 @@ auto ContactRecordInterface::GetLimitOffsetByField(uint32_t offset,

            auto nrs = getNumbers(contact.numbersID);
            if (nrs.size() == 0) {
                LOG_DEBUG("Contact record does not contain any numbers.");
                debug_db_data("Contact record does not contain any numbers.");
            }

            auto ring = contactDB->ringtones.getById(contact.ringID);


@@ 804,7 804,7 @@ auto ContactRecordInterface::GetByName(UTF8 primaryName, UTF8 alternativeName)

        auto nrs = getNumbers(contact.numbersID);
        if (nrs.size() == 0) {
            LOG_DEBUG("Contact record does not contain any numbers.");
            debug_db_data("Contact record does not contain any numbers.");
        }

        auto ring = contactDB->ringtones.getById(contact.ringID);


@@ 847,7 847,7 @@ auto ContactRecordInterface::Search(const char *primaryName, const char *alterna

        auto nrs = getNumbers(contact.numbersID);
        if (nrs.size() == 0) {
            LOG_DEBUG("Contact record does not contain any numbers.");
            debug_db_data("Contact record does not contain any numbers.");
        }

        auto ring = contactDB->ringtones.getById(contact.ringID);


@@ 898,13 898,13 @@ auto ContactRecordInterface::GetByNumber(const utils::PhoneNumber::View &numberV

    // Contact not found, create temporary one
    if (createTempContact == CreateTempContact::True) {
        LOG_INFO("Cannot find contact for number %s, creating temporary one", number.c_str());
        debug_db_data("Cannot find contact for number %s, creating temporary one", number.c_str());
        ContactRecord tmpRecord = {
            {.ID = DB_ID_NONE},
            .numbers = std::vector<ContactRecord::Number>{ContactRecord::Number(numberView)},
        };
        if (!Add(tmpRecord)) {
            LOG_ERROR("Cannot add contact record");
            error_db_data("Cannot add contact record");
            return ret;
        }



@@ 924,7 924,7 @@ auto ContactRecordInterface::buildNumberMatcher(std::vector<ContactNumberHolder>
            contactNumberHolders.emplace_back(number);
        }
        catch (const utils::PhoneNumber::Error &e) {
            LOG_WARN(
            debug_db_data(
                "Skipping invalid phone number pair: (%s, %s)", number.numberUser.c_str(), number.numbere164.c_str());
            continue;
        }


@@ 949,13 949,13 @@ auto ContactRecordInterface::MatchByNumber(const utils::PhoneNumber::View &numbe
            return std::nullopt;
        }

        LOG_INFO("Cannot find contact for number %s, creating temporary one", numberView.getEntered().c_str());
        debug_db_data("Cannot find contact for number %s, creating temporary one", numberView.getEntered().c_str());
        ContactRecord newContact = {{.ID = DB_ID_NONE},
                                    .numbers = std::vector<ContactRecord::Number>{ContactRecord::Number(numberView)},
                                    .groups  = {contactDB->groups.getById(ContactsDB::temporaryGroupId())}};

        if (!Add(newContact)) {
            LOG_FATAL("Cannot add contact record");
            error_db_data("Cannot add contact record");
            return std::nullopt;
        }



@@ 986,7 986,7 @@ auto ContactRecordInterface::getNumbers(const std::string &numbers_id) -> std::v
            nr_val = std::stol(nr_str);
        }
        catch (const std::exception &e) {
            LOG_ERROR("Convertion error from %s, taking default value %ld", nr_str.c_str(), nr_val);
            error_db_data("Convertion error from %s, taking default value %ld", nr_str.c_str(), nr_val);
        }

        auto nr = contactDB->number.getById(nr_val);


@@ 999,10 999,11 @@ auto ContactRecordInterface::getNumbers(const std::string &numbers_id) -> std::v
            nrs.emplace_back(number.getView(), nr.type);
        }
        catch (const utils::PhoneNumber::Error &e) {
            LOG_ERROR("Invalid contact's number pair: \"%s\" (\"%s\", \"%s\"). Using user number instead of a pair.",
                      e.what(),
                      nr.numberUser.c_str(),
                      nr.numbere164.c_str());
            error_db_data(
                "Invalid contact's number pair: \"%s\" (\"%s\", \"%s\"). Using user number instead of a pair.",
                e.what(),
                nr.numberUser.c_str(),
                nr.numbere164.c_str());
            nrs.emplace_back(utils::PhoneNumber(nr.numberUser, utils::country::Id::UNKNOWN).getView(), nr.type);
        }
    }

M module-db/Interface/ContactRecord.hpp => module-db/Interface/ContactRecord.hpp +4 -3
@@ 5,6 5,7 @@

#include <Databases/ContactsDB.hpp>
#include <Common/Query.hpp>
#include <Common/Logging.hpp>
#include <Tables/ContactsGroups.hpp>

#include <i18n/i18n.hpp>


@@ 23,8 24,8 @@

struct ContactRecord : public Record
{
    UTF8 primaryName     = "";
    UTF8 alternativeName = "";
    UTF8 primaryName          = "";
    UTF8 alternativeName      = "";
    uint32_t contactPosOnList = 0;

    struct Number


@@ 71,7 72,7 @@ struct ContactRecord : public Record
    inline auto getFormattedName(const NameFormatType type = NameFormatType::Default) const -> UTF8
    {
        if (isTemporary()) {
            LOG_DEBUG("temporary contact, number as name: '%s'", getNumberAsName().c_str());
            debug_db_data("temporary contact, number as name: '%s'", getNumberAsName().c_str());
            return getNumberAsName();
        }
        if (primaryName.length() > 0) {

M module-db/Tables/CalllogTable.cpp => module-db/Tables/CalllogTable.cpp +0 -1
@@ 197,7 197,6 @@ uint32_t CalllogTable::count(EntryState state)
        break;
    }
    query += ";";
    LOG_DEBUG("> %s", query.c_str());
    auto queryRet = db->query(query.c_str());

    if (queryRet == nullptr || queryRet->getRowCount() == 0) {

M module-db/Tables/ContactsTable.cpp => module-db/Tables/ContactsTable.cpp +7 -7
@@ 79,20 79,20 @@ ContactsTableRow ContactsTable::getById(uint32_t id)

ContactsTableRow ContactsTable::getByIdWithTemporary(uint32_t id)
{
    LOG_DEBUG("%s", __FUNCTION__);
    debug_db_data("%s", __FUNCTION__);
    auto retQuery = db->query(statements::selectWithTemp, id);
    return getByIdCommon(std::move(retQuery));
}

ContactsTableRow ContactsTable::getByIdCommon(std::unique_ptr<QueryResult> retQuery)
{
    LOG_DEBUG("%s", __FUNCTION__);
    debug_db_data("%s", __FUNCTION__);
    if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) {
        LOG_DEBUG("no results");
        return ContactsTableRow();
    }

    LOG_DEBUG(
    debug_db_data(
        "got results: %" PRIu32 "; ID: %" PRIu32, retQuery->getRowCount(), (*retQuery)[ColumnName::id].getInt32());
    return ContactsTableRow{
        {.ID = (*retQuery)[ColumnName::id].getUInt32()},


@@ 133,7 133,7 @@ std::vector<ContactsTableRow> ContactsTable::Search(const std::string &primaryNa
    if (!number.empty())
        q += "t3.number_e164 like '%%" + number + "%%'";

    LOG_DEBUG("query: \"%s\"", q.c_str());
    debug_db_data("query: \"%s\"", q.c_str());
    auto retQuery = db->query(q.c_str());

    if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) {


@@ 190,7 190,7 @@ std::vector<std::uint32_t> ContactsTable::GetIDsSortedByName(std::uint32_t limit
    std::vector<std::uint32_t> ids_limit;

    std::string query = GetSortedByNameQueryString(ContactQuerySection::Favourites);
    LOG_DEBUG("query: %s", query.c_str());
    debug_db_data("query: %s", query.c_str());
    auto queryRet = db->query(query.c_str());
    if (queryRet == nullptr) {



@@ 202,7 202,7 @@ std::vector<std::uint32_t> ContactsTable::GetIDsSortedByName(std::uint32_t limit
        } while (queryRet->nextRow());

    query = GetSortedByNameQueryString(ContactQuerySection::Mixed);
    LOG_DEBUG("query: %s", query.c_str());
    debug_db_data("query: %s", query.c_str());
    queryRet = db->query(query.c_str());
    if ((queryRet == nullptr) || (queryRet->getRowCount() == 0)) {
        return ids;


@@ 323,7 323,7 @@ std::vector<std::uint32_t> ContactsTable::GetIDsSortedByField(

    query += " ;";

    LOG_DEBUG("query: %s", query.c_str());
    debug_db_data("query: %s", query.c_str());
    auto queryRet = db->query(query.c_str());
    if ((queryRet == nullptr) || (queryRet->getRowCount() == 0)) {
        return ids;

M module-db/Tables/ContactsTable.hpp => module-db/Tables/ContactsTable.hpp +1 -0
@@ 4,6 4,7 @@
#pragma once

#include "Common/Common.hpp"
#include "Common/Logging.hpp"
#include "Record.hpp"
#include "Table.hpp"
#include "utf8/UTF8.hpp"

M module-gui/gui/widgets/Text.cpp => module-gui/gui/widgets/Text.cpp +1 -1
@@ 165,7 165,7 @@ namespace gui
    {
        auto tmp_document = text::RichTextParser().parse(text, &format);
        if (tmp_document->isEmpty()) {
            LOG_ERROR("Nothing to parse/parser error in rich text: %s", text.c_str());
            debug_text("Nothing to parse/parser error in rich text: %s", text.c_str());
            addText(text); // fallback
        }
        for (auto block : tmp_document->getBlockCursor(0)) {

M module-services/service-audio/ServiceAudio.cpp => module-services/service-audio/ServiceAudio.cpp +0 -4
@@ 474,7 474,6 @@ sys::MessagePointer ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sy
    bool isBusy = IsBusy();

    auto &msgType = typeid(*msgl);
    LOG_DEBUG("msgType %d %s", static_cast<int>(msgl->messageType), msgType.name());

    if (msgType == typeid(AudioNotificationMessage)) {
        auto *msg = static_cast<AudioNotificationMessage *>(msgl);


@@ 526,9 525,6 @@ sys::MessagePointer ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sy
        auto *msg   = static_cast<AudioKeyPressedRequest *>(msgl);
        responseMsg = HandleKeyPressed(msg->step);
    }
    else {
        LOG_DEBUG("Unhandled message");
    }

    auto curIsBusy = IsBusy();
    if (isBusy != curIsBusy) {

M module-services/service-bluetooth/ServiceBluetooth.cpp => module-services/service-bluetooth/ServiceBluetooth.cpp +0 -1
@@ 124,7 124,6 @@ sys::MessagePointer ServiceBluetooth::DataReceivedHandler(sys::DataMessage *msg,
            LOG_INFO("Queues sent after a request!");
        } break;
        default:
            LOG_INFO("BT not handled!");
            break;
        }
    }

M module-services/service-db/agents/settings/Settings.cpp => module-services/service-db/agents/settings/Settings.cpp +1 -1
@@ 239,4 239,4 @@ namespace settings
        cbMode = nullptr;
        sendMsg(std::make_shared<settings::Messages::UnregisterOnModeChange>());
    }
} // namespace Settings
} // namespace settings

M module-sys/Service/Bus.cpp => module-sys/Service/Bus.cpp +2 -1
@@ 26,7 26,7 @@ namespace sys
    {
        CriticalSection::Enter();
        for (auto &w : service->busChannels) {
            channels[w].m_services.push_back(service);
            channels[w].m_services.insert(service);
        }
        servicesRegistered[service->GetName()] = service;
        CriticalSection::Exit();


@@ 195,6 195,7 @@ namespace sys

        msg->transType = Message::TransmissionType ::Multicast;
        msg->sender    = source->GetName();

        for (auto const &w : channels[channel].m_services) {
            w->mailbox.push(msg);
        }

M module-sys/Service/Channel.hpp => module-sys/Service/Channel.hpp +2 -1
@@ 4,6 4,7 @@
#pragma once

#include <memory>
#include <set>

namespace sys
{


@@ 17,7 18,7 @@ namespace sys
        Channel()
        {}

        std::vector<std::shared_ptr<Service>> m_services;
        std::set<std::shared_ptr<Service>> m_services;
    };

} // namespace sys