~aleteoryx/muditaos

a870922ec320fac19dd46cedeaf40357f7a58bb9 — Lukasz Mastalerz 2 years ago f021615
[CP-1837] Random crashes while copying files

General improvements to prevent running out of memory while copying
files via Mudita Center
22 files changed, 67 insertions(+), 51 deletions(-)

M harmony_changelog.md
M module-services/service-appmgr/include/service-appmgr/model/ApplicationManagerCommon.hpp
M module-services/service-appmgr/model/ActionsRegistry.cpp
M module-services/service-desktop/DesktopMessages.cpp
M module-services/service-desktop/endpoints/filesystem/FS_Helper.cpp
M module-services/service-desktop/endpoints/filesystem/FileContext.cpp
M module-services/service-desktop/endpoints/filesystem/FileOperations.cpp
M module-services/service-desktop/endpoints/include/endpoints/Context.hpp
M module-services/service-desktop/endpoints/include/endpoints/filesystem/FileContext.hpp
M module-services/service-desktop/endpoints/include/endpoints/filesystem/FileOperations.hpp
M module-services/service-desktop/include/service-desktop/DesktopMessages.hpp
M module-services/service-desktop/parser/MessageHandler.cpp
M module-utils/log/CMakeLists.txt
M module-utils/log/LoggerBufferContainer.hpp
M products/BellHybrid/apps/application-bell-main/windows/BellMainMenuWindow.cpp
M products/BellHybrid/serial-number-reader/SerialNumberReader.cpp
M products/BellHybrid/serial-number-reader/include/serial-number-reader/SerialNumberReader.hpp
M products/BellHybrid/services/appmgr/IdleHandler.cpp
M products/BellHybrid/services/appmgr/include/appmgr/ApplicationManager.hpp
M products/BellHybrid/services/appmgr/include/appmgr/IdleHandler.hpp
M products/BellHybrid/services/desktop/endpoints/deviceInfo/DeviceInfoEndpoint.cpp
M products/BellHybrid/services/desktop/endpoints/include/endpoints/deviceInfo/DeviceInfoEndpoint.hpp
M harmony_changelog.md => harmony_changelog.md +1 -0
@@ 12,6 12,7 @@
* Fixed missing software version in French language
* Fixed problems with displaying file names in Relaxation
* Fixed polish Meditation summary text
* Fixed problems with copying files via Mudita Center to Relaxation

### Added


M module-services/service-appmgr/include/service-appmgr/model/ApplicationManagerCommon.hpp => module-services/service-appmgr/include/service-appmgr/model/ApplicationManagerCommon.hpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

M module-services/service-appmgr/model/ActionsRegistry.cpp => module-services/service-appmgr/model/ActionsRegistry.cpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "ActionsRegistry.hpp"

M module-services/service-desktop/DesktopMessages.cpp => module-services/service-desktop/DesktopMessages.cpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "service-desktop/DesktopMessages.hpp"

M module-services/service-desktop/endpoints/filesystem/FS_Helper.cpp => module-services/service-desktop/endpoints/filesystem/FS_Helper.cpp +6 -9
@@ 81,7 81,6 @@ namespace sdesktop::endpoints
        const auto &body = context.getBody();
        auto code        = http::Code::BadRequest;
        ResponseContext response{};

        if (body[json::fs::fileName].is_string() && body[json::fs::fileSize].is_number() &&
            body[json::fs::fileCrc32].is_string()) {
            response = startSendFile(context);


@@ 228,11 227,11 @@ namespace sdesktop::endpoints

    auto FS_Helper::startSendFile(Context &context) const -> ResponseContext
    {
        const auto &body               = context.getBody();
        const auto filePath            = body[json::fs::fileName].string_value();
        const uint32_t fileSize        = body[json::fs::fileSize].int_value();
        const auto fileCrc32           = body[json::fs::fileCrc32].string_value();
        auto code                      = http::Code::BadRequest;
        const auto &body        = context.getBody();
        const auto &filePath    = body[json::fs::fileName].string_value();
        const uint32_t fileSize = body[json::fs::fileSize].int_value();
        const auto &fileCrc32   = body[json::fs::fileCrc32].string_value();
        auto code               = http::Code::BadRequest;

        LOG_DEBUG("Start sending of file: %s", filePath.c_str());



@@ 289,7 288,7 @@ namespace sdesktop::endpoints
        const auto &body   = context.getBody();
        const auto txID    = body[json::fs::txID].int_value();
        const auto chunkNo = body[json::fs::chunkNo].int_value();
        const auto data    = body[json::fs::data].string_value();
        const auto &data   = body[json::fs::data].string_value();

        if (data.empty()) {
            std::ostringstream errorReason;


@@ 320,8 319,6 @@ namespace sdesktop::endpoints
        auto code = http::Code::OK;

        if (returnCode == sys::ReturnCodes::Success) {
            LOG_DEBUG("FileOperations::sendDataForTransmitID success");

            response = json11::Json::object(
                {{json::fs::txID, static_cast<int>(txID)}, {json::fs::chunkNo, static_cast<int>(chunkNo)}});
        }

M module-services/service-desktop/endpoints/filesystem/FileContext.cpp => module-services/service-desktop/endpoints/filesystem/FileContext.cpp +3 -10
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <endpoints/filesystem/FileContext.hpp>


@@ 34,7 34,8 @@ FileWriteContext::FileWriteContext(const std::filesystem::path &path,
                                   std::size_t chunkSize,
                                   std::string crc32Digest,
                                   std::size_t offset)
    : FileContext(path, size, chunkSize, offset), crc32Digest(std::move(crc32Digest))
    : FileContext(path, size, chunkSize, offset), crc32Digest(std::move(crc32Digest)),
      file(path, std::ios::binary | std::ios::app)
{}

FileWriteContext::~FileWriteContext()


@@ 113,17 114,11 @@ auto FileReadContext::read() -> std::vector<std::uint8_t>

auto FileWriteContext::write(const std::vector<std::uint8_t> &data) -> void
{
    LOG_DEBUG("Sending file data");

    std::ofstream file(path, std::ios::binary | std::ios::app);

    if (!file.is_open() || file.fail()) {
        LOG_ERROR("File %s open error", path.c_str());
        throw std::runtime_error("File open error");
    }

    file.seekp(offset);

    auto dataLeft = std::min(static_cast<std::size_t>(chunkSize), (size - offset));

    file.write(reinterpret_cast<const char *>(data.data()), dataLeft);


@@ 136,8 131,6 @@ auto FileWriteContext::write(const std::vector<std::uint8_t> &data) -> void

    runningCrc32Digest.add(data.data(), dataLeft);

    LOG_DEBUG("Written %u bytes", static_cast<unsigned int>(dataLeft));

    advanceFileOffset(dataLeft);

    if (reachedEOF()) {

M module-services/service-desktop/endpoints/filesystem/FileOperations.cpp => module-services/service-desktop/endpoints/filesystem/FileOperations.cpp +11 -11
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <endpoints/filesystem/FileOperations.hpp>


@@ 115,15 115,13 @@ auto FileOperations::encodeDataAsBase64(const std::vector<std::uint8_t> &binaryD
    return encodedData;
}

auto FileOperations::decodeDataFromBase64(const std::string &encodedData) const -> std::vector<std::uint8_t>
auto FileOperations::decodeDataFromBase64(const std::string &encodedData) -> void
{
    const auto decodedDataSize = decodedSize(encodedData.length());

    std::vector<std::uint8_t> decodedData(decodedDataSize, 0);

    b64tobin(decodedData.data(), encodedData.data());

    return decodedData;
    if (decodedDataSize != fileData->size()) {
        fileData->resize(decodedDataSize, 0);
    }
    b64tobin(fileData->data(), encodedData.data());
}

auto FileOperations::getDataForReceiveID(transfer_id rxID, std::uint32_t chunkNo) -> DataWithCrc32


@@ 176,6 174,7 @@ auto FileOperations::createTransmitIDForFile(const std::filesystem::path &file,
    LOG_DEBUG("Creating txID %u", static_cast<unsigned>(txID));

    createFileWriteContextFor(file, size, Crc32, txID);
    fileData = std::make_unique<std::vector<uint8_t>>(SingleChunkSize, 0);

    return txID;
}


@@ 205,23 204,24 @@ auto FileOperations::sendDataForTransmitID(transfer_id txID, std::uint32_t chunk
        return sys::ReturnCodes::Failure;
    }

    auto binaryData = decodeDataFromBase64(data);
    decodeDataFromBase64(data);

    fileCtx->write(binaryData);
    fileCtx->write(*fileData);

    if (fileCtx->reachedEOF()) {
        LOG_INFO("Reached EOF for txID %u", static_cast<unsigned>(txID));

        auto fileOK = fileCtx->crc32Matches();

        if (!fileOK) {
            LOG_ERROR("File CRC32 mismatch");
            fileCtx->removeFile();
            writeTransfers.erase(txID);
            fileData.reset(nullptr);

            throw std::runtime_error("File CRC32 mismatch");
        }
        writeTransfers.erase(txID);
        fileData.reset(nullptr);
    }

    return returnCode;

M module-services/service-desktop/endpoints/include/endpoints/Context.hpp => module-services/service-desktop/endpoints/include/endpoints/Context.hpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

M module-services/service-desktop/endpoints/include/endpoints/filesystem/FileContext.hpp => module-services/service-desktop/endpoints/include/endpoints/filesystem/FileContext.hpp +3 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 77,4 77,6 @@ class FileWriteContext : public FileContext

  private:
    std::string crc32Digest{};

    std::ofstream file{};
};

M module-services/service-desktop/endpoints/include/endpoints/filesystem/FileOperations.hpp => module-services/service-desktop/endpoints/include/endpoints/filesystem/FileOperations.hpp +3 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 25,6 25,7 @@ class FileOperations

    std::atomic<transfer_id> runningRxId{0};
    std::atomic<transfer_id> runningTxId{0};
    std::unique_ptr<std::vector<std::uint8_t>> fileData{};

    auto createFileReadContextFor(const std::filesystem::path &file, std::size_t fileSize, transfer_id xfrId) -> void;



@@ 35,7 36,7 @@ class FileOperations

    auto encodeDataAsBase64(const std::vector<std::uint8_t> &binaryData) const -> std::string;

    auto decodeDataFromBase64(const std::string &encodedData) const -> std::vector<std::uint8_t>;
    auto decodeDataFromBase64(const std::string &encodedData) -> void;

    auto encodedSize(std::size_t binarySize) const -> std::size_t;


M module-services/service-desktop/include/service-desktop/DesktopMessages.hpp => module-services/service-desktop/include/service-desktop/DesktopMessages.hpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

M module-services/service-desktop/parser/MessageHandler.cpp => module-services/service-desktop/parser/MessageHandler.cpp +2 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "MessageHandler.hpp"


@@ 32,7 32,7 @@ namespace sdesktop::endpoints
    {
        auto context = ContextFactory::create(messageJson);

        LOG_DEBUG("[MsgHandler]\nmethod: %s\nendpoint: %s\nuuid: %d\n",
        LOG_DEBUG("[MsgHandler]\nmethod: %s\nendpoint: %s\nuuid: %d",
                  magic_enum::enum_name(context->getMethod()).data(),
                  magic_enum::enum_name(context->getEndpoint()).data(),
                  context->getUuid());

M module-utils/log/CMakeLists.txt => module-utils/log/CMakeLists.txt +19 -0
@@ 26,6 26,25 @@ target_link_libraries(log
        sys-service
)

if(${PROJECT_TARGET} STREQUAL "TARGET_RT1051")
    if(${PRODUCT} STREQUAL "PurePhone")
        set(CIRCULAR_BUFFER_SIZE 1024)
    elseif(${PRODUCT} STREQUAL "BellHybrid")
        set(CIRCULAR_BUFFER_SIZE 512)
    else()
        message(FATAL_ERROR "Unknown product: ${PRODUCT}")
    endif()
elseif (${PROJECT_TARGET} STREQUAL "TARGET_Linux")
    set(CIRCULAR_BUFFER_SIZE 1024)
else()
    message(FATAL_ERROR "Unknown target: ${PROJECT_TARGET}")
endif()

target_compile_definitions(log
        PUBLIC
        LOGGER_CIRCULAR_BUFFER_SIZE=${CIRCULAR_BUFFER_SIZE}
        )

if (${ENABLE_TESTS})
    add_subdirectory(tests)
endif()

M module-utils/log/LoggerBufferContainer.hpp => module-utils/log/LoggerBufferContainer.hpp +2 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 42,7 42,7 @@ class LoggerBufferContainer
    }

  private:
    static constexpr size_t circularBufferSize = 1024;
    static constexpr size_t circularBufferSize = LOGGER_CIRCULAR_BUFFER_SIZE;
    static constexpr size_t numberOfBuffers    = 2;

    size_t currentIndex;

M products/BellHybrid/apps/application-bell-main/windows/BellMainMenuWindow.cpp => products/BellHybrid/apps/application-bell-main/windows/BellMainMenuWindow.cpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "BellMainMenuWindow.hpp"

M products/BellHybrid/serial-number-reader/SerialNumberReader.cpp => products/BellHybrid/serial-number-reader/SerialNumberReader.cpp +5 -2
@@ 4,6 4,7 @@
#include <purefs/vfs_subsystem.hpp>

#include <serial-number-reader/SerialNumberReader.hpp>
#include <log/log.hpp>

namespace
{


@@ 20,11 21,13 @@ namespace
        buffer[EMMC_SN_LENGTH] = '\0';
        return std::string(buffer);
    }

} // namespace
namespace serial_number_reader
{
    std::string readSerialNumber()
    const std::string &readSerialNumber()
    {
        return readSerialNumberFromEmmc();
        const static std::string serialNumber = readSerialNumberFromEmmc();
        return serialNumber;
    }
} // namespace serial_number_reader

M products/BellHybrid/serial-number-reader/include/serial-number-reader/SerialNumberReader.hpp => products/BellHybrid/serial-number-reader/include/serial-number-reader/SerialNumberReader.hpp +1 -1
@@ 6,5 6,5 @@

namespace serial_number_reader
{
    std::string readSerialNumber();
    const std::string &readSerialNumber();
} // namespace serial_number_reader

M products/BellHybrid/services/appmgr/IdleHandler.cpp => products/BellHybrid/services/appmgr/IdleHandler.cpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <appmgr/IdleHandler.hpp>

M products/BellHybrid/services/appmgr/include/appmgr/ApplicationManager.hpp => products/BellHybrid/services/appmgr/include/appmgr/ApplicationManager.hpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

M products/BellHybrid/services/appmgr/include/appmgr/IdleHandler.hpp => products/BellHybrid/services/appmgr/include/appmgr/IdleHandler.hpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

M products/BellHybrid/services/desktop/endpoints/deviceInfo/DeviceInfoEndpoint.cpp => products/BellHybrid/services/desktop/endpoints/deviceInfo/DeviceInfoEndpoint.cpp +1 -1
@@ 19,7 19,7 @@
namespace sdesktop::endpoints
{

    auto DeviceInfoEndpoint::getSerialNumber() -> std::string
    auto DeviceInfoEndpoint::getSerialNumber() -> const std::string &
    {
        return serial_number_reader::readSerialNumber();
    }

M products/BellHybrid/services/desktop/endpoints/include/endpoints/deviceInfo/DeviceInfoEndpoint.hpp => products/BellHybrid/services/desktop/endpoints/include/endpoints/deviceInfo/DeviceInfoEndpoint.hpp +1 -1
@@ 14,7 14,7 @@ namespace sdesktop::endpoints
        explicit DeviceInfoEndpoint(sys::Service *ownerServicePtr) : DeviceInfoEndpointCommon(ownerServicePtr)
        {}

        auto getSerialNumber() -> std::string;
        auto getSerialNumber() -> const std::string &;
        auto getOnboardingState() -> OnboardingState;
        auto getDeviceInfo(Context &context) -> http::Code override;
    };