// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md #include "AsyncTask.hpp" #include #include "log/log.hpp" namespace app { AsyncCallbackReceiver::AsyncCallbackReceiver(AsyncCallbacksDeleter *deleter) noexcept : deleter{deleter} {} AsyncCallbackReceiver::~AsyncCallbackReceiver() { if (deleter != nullptr) { deleter->cancelCallbacks(this); } } void AsyncTask::execute(ApplicationCommon *application, AsyncCallbackReceiver::Ptr receiverObject, std::optional> callback, ReceiverBehavior receiverBehavior) { const auto requestId = onExecute(application); application->callbackStorage->registerCallback( requestId, receiverObject, std::move(callback), receiverBehavior); } std::unique_ptr AsyncQuery::createFromQuery(std::unique_ptr &&query, db::Interface::Name target) { return std::make_unique(std::move(query), target); } AsyncQuery::AsyncQuery(std::unique_ptr &&query, db::Interface::Name target) noexcept : query{std::move(query)}, target{target} {} void AsyncQuery::setCallback(std::unique_ptr &&listener) noexcept { query->setQueryListener(std::move(listener)); } void AsyncQuery::setCallback(db::QueryCallbackFunction &&callback) noexcept { query->setQueryListener(db::QueryCallback::fromFunction(std::move(callback))); } RequestId AsyncQuery::onExecute(ApplicationCommon *application) { const auto [result, id] = DBServiceAPI::GetQuery(application, target, std::move(query)); if (!result) { LOG_FATAL("Failed to send request!"); } return id; } auto AsyncRequest::createFromMessage(std::unique_ptr &&message, std::string serviceName) -> std::unique_ptr { return std::make_unique(std::move(message), serviceName); } AsyncRequest::AsyncRequest(std::unique_ptr &&message, std::string serviceName) noexcept : message{std::move(message)}, serviceName{serviceName} {} auto AsyncRequest::onExecute(ApplicationCommon *application) -> RequestId { std::shared_ptr msg{std::move(message)}; bool result = application->bus.sendUnicast(msg, serviceName); if (!result) { LOG_FATAL("Failed to send message!"); } return msg->uniID; } auto NullCallback::execute() -> bool { // Nothing to do. return false; } QueryCallback::QueryCallback(db::QueryResponse *response) : response{response} {} auto QueryCallback::execute() -> bool { const auto result = response->getResult(); if (result != nullptr && result->hasListener()) { return result->handle(); } return false; } AsyncResponseCallback::AsyncResponseCallback(sys::ResponseMessage *response, CallbackFunction callbackFunction) : response{response}, callbackFunction(callbackFunction) {} auto AsyncResponseCallback::execute() -> bool { return callbackFunction(response); } } // namespace app