From f724d9074ba9cfd662b18d7b9de7fcb18548824b Mon Sep 17 00:00:00 2001 From: Adam Dobrowolski Date: Thu, 18 Feb 2021 15:28:12 +0100 Subject: [PATCH] [EGD-5701] Added DOM dump to harness * Added generic handler to developerMode * Added DOM message handling --- module-apps/Application.cpp | 24 +++++- module-apps/Application.hpp | 3 +- module-apps/CMakeLists.txt | 1 + module-apps/DOMResponder.cpp | 34 ++++++++ module-apps/DOMResponder.hpp | 41 ++++++++++ module-apps/messages/AppMessage.hpp | 15 +--- module-apps/messages/BaseAppMessage.hpp | 17 ++++ module-bsp/board/linux/rtc/rtc.cpp | 7 +- module-gui/gui/dom/Item2JsonSerializer.cpp | 7 +- module-gui/gui/dom/Item2JsonSerializer.hpp | 3 +- module-services/service-appmgr/CMakeLists.txt | 4 +- .../service-appmgr/messages/BaseMessage.cpp | 7 +- .../service-appmgr/messages/DOMRequest.cpp | 18 +++++ .../model/ApplicationManager.cpp | 16 ++++ .../service-appmgr/messages/BaseMessage.hpp | 4 +- .../service-appmgr/messages/DOMRequest.hpp | 28 +++++++ .../model/ApplicationManager.hpp | 2 + module-services/service-cellular/SMSSend.hpp | 22 +++++ .../service-desktop/CMakeLists.txt | 7 +- .../service-desktop/DesktopEvent.cpp | 10 +++ .../service-desktop/DesktopMessages.cpp | 12 --- .../service-desktop/DeveloperModeMessage.cpp | 14 ++++ module-services/service-desktop/README.md | 63 ++++++++++++--- .../service-desktop/ServiceDesktop.cpp | 1 + .../doc/how_machine_works.puml | 9 +++ .../service-desktop/doc/how_machine_works.svg | 19 +++++ .../service-desktop/endpoints/Context.hpp | 18 ++--- .../endpoints/ResponseContext.hpp | 16 ++++ .../endpoints/backup/BackupRestore.cpp | 3 +- .../developerMode/DeveloperModeEndpoint.cpp | 41 +++++++--- .../developerMode/DeveloperModeEndpoint.hpp | 14 +++- .../developerMode/DeveloperModeHelper.cpp | 81 ++++++++++--------- .../developerMode/DeveloperModeHelper.hpp | 17 ++-- .../developerMode/Mode/BaseHelper.cpp | 51 ++++++++++++ .../developerMode/Mode/BaseHelper.hpp | 67 +++++++++++++++ .../developerMode/Mode/UI_Helper.cpp | 41 ++++++++++ .../developerMode/Mode/UI_Helper.hpp | 24 ++++++ .../developerMode/event/DomRequest.cpp | 16 ++++ .../developerMode/event/DomRequest.hpp | 16 ++++ .../deviceInfo/DeviceInfoEndpoint.cpp | 3 +- .../endpoints/update/UpdateMuditaOS.hpp | 3 +- .../service-desktop/parser/HttpEnums.cpp | 20 +++++ .../service-desktop/parser/HttpEnums.hpp | 32 ++++++++ .../service-desktop/parser/ParserUtils.cpp | 22 ----- .../service-desktop/parser/ParserUtils.hpp | 30 +------ .../service-desktop/DesktopEvent.hpp | 16 ++++ .../service-desktop/DesktopMessages.hpp | 27 +------ .../service-desktop/DeveloperModeMessage.hpp | 19 +++++ module-sys/Service/Common.hpp | 16 +--- module-sys/Service/Message.hpp | 8 +- module-sys/Service/MessageForward.hpp | 19 +++++ module-sys/Service/SystemReturnCodes.hpp | 19 +++++ module-sys/Service/Timer.cpp | 2 +- source/MessageType.hpp | 1 + test/pytest/test_dom_dump.py | 9 +++ 55 files changed, 825 insertions(+), 214 deletions(-) create mode 100644 module-apps/DOMResponder.cpp create mode 100644 module-apps/DOMResponder.hpp create mode 100644 module-apps/messages/BaseAppMessage.hpp create mode 100644 module-services/service-appmgr/messages/DOMRequest.cpp create mode 100644 module-services/service-appmgr/service-appmgr/messages/DOMRequest.hpp create mode 100644 module-services/service-cellular/SMSSend.hpp create mode 100644 module-services/service-desktop/DesktopEvent.cpp create mode 100644 module-services/service-desktop/DeveloperModeMessage.cpp create mode 100644 module-services/service-desktop/doc/how_machine_works.puml create mode 100644 module-services/service-desktop/doc/how_machine_works.svg create mode 100644 module-services/service-desktop/endpoints/ResponseContext.hpp create mode 100644 module-services/service-desktop/endpoints/developerMode/Mode/BaseHelper.cpp create mode 100644 module-services/service-desktop/endpoints/developerMode/Mode/BaseHelper.hpp create mode 100644 module-services/service-desktop/endpoints/developerMode/Mode/UI_Helper.cpp create mode 100644 module-services/service-desktop/endpoints/developerMode/Mode/UI_Helper.hpp create mode 100644 module-services/service-desktop/endpoints/developerMode/event/DomRequest.cpp create mode 100644 module-services/service-desktop/endpoints/developerMode/event/DomRequest.hpp create mode 100644 module-services/service-desktop/parser/HttpEnums.cpp create mode 100644 module-services/service-desktop/parser/HttpEnums.hpp delete mode 100644 module-services/service-desktop/parser/ParserUtils.cpp create mode 100644 module-services/service-desktop/service-desktop/DesktopEvent.hpp create mode 100644 module-services/service-desktop/service-desktop/DeveloperModeMessage.hpp create mode 100644 module-sys/Service/MessageForward.hpp create mode 100644 module-sys/Service/SystemReturnCodes.hpp create mode 100644 test/pytest/test_dom_dump.py diff --git a/module-apps/Application.cpp b/module-apps/Application.cpp index 2002c9129cbcae71aec4e3ca7f0b8773ff185e1f..659597aec24deb13e750bf1f8c57a11ddb958bf7 100644 --- a/module-apps/Application.cpp +++ b/module-apps/Application.cpp @@ -20,9 +20,11 @@ #include #include #include +#include #include "service-gui/messages/DrawMessage.hpp" // for DrawMessage #include "task.h" // for xTaskGetTic... #include "windows/AppWindow.hpp" // for AppWindow +#include "DOMResponder.hpp" #include // for Text #include // for find #include // for distance, next @@ -84,8 +86,9 @@ namespace app connect(typeid(AppRefreshMessage), [this](sys::Message *msg) -> sys::MessagePointer { return handleAppRefresh(msg); }); - connect(sevm::BatteryStatusChangeMessage(), [&](sys::Message *) { return handleBatteryStatusChange(); }); + connect(typeid(app::manager::DOMRequest), + [&](sys::Message *msg) -> sys::MessagePointer { return handleGetDOM(msg); }); } Application::~Application() noexcept @@ -448,6 +451,25 @@ namespace app return msgHandled(); } + sys::MessagePointer Application::handleGetDOM(sys::Message *msgl) + { + if (windowsStack.isEmpty()) { + LOG_ERROR("Current window is not defined - can't dump DOM"); + return msgNotHandled(); + } + auto window = getCurrentWindow(); + if (window == nullptr) { + LOG_ERROR("No window - can't dump DOM"); + return msgNotHandled(); + } + + auto request = static_cast(msgl); + LOG_DEBUG("Get DOM for: %s", request->getSenderName().c_str()); + bus.sendUnicast(DOMResponder(GetName(), *window, std::move(request->event)).build(), request->getSenderName()); + + return msgHandled(); + } + sys::MessagePointer Application::handleAppFocusLost(sys::Message *msgl) { if (state == State::ACTIVE_FORGROUND) { diff --git a/module-apps/Application.hpp b/module-apps/Application.hpp index 69794e80a0b56745d5ac02ad183a3bbc2a018dc5..16e80cd058cd19d3644a139c73b1c9d990ae0b50 100644 --- a/module-apps/Application.hpp +++ b/module-apps/Application.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -175,6 +175,7 @@ namespace app sys::MessagePointer handleAppClose(sys::Message *msgl); sys::MessagePointer handleAppRebuild(sys::Message *msgl); sys::MessagePointer handleAppRefresh(sys::Message *msgl); + sys::MessagePointer handleGetDOM(sys::Message *msgl); sys::MessagePointer handleAppFocusLost(sys::Message *msgl); sys::MessagePointer handleSIMMessage(sys::Message *msgl); diff --git a/module-apps/CMakeLists.txt b/module-apps/CMakeLists.txt index d3c53632a26cf18407bbb2d17f2b75ec9c818862..0f1e77831fb0cd08308e42319861e8426a7480b2 100644 --- a/module-apps/CMakeLists.txt +++ b/module-apps/CMakeLists.txt @@ -17,6 +17,7 @@ endif() set( SOURCES "Application.cpp" "GuiTimer.cpp" + "DOMResponder.cpp" "WindowsFactory.cpp" "TopBarManager.cpp" "AsyncTask.cpp" diff --git a/module-apps/DOMResponder.cpp b/module-apps/DOMResponder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..afd7da526c0aac2d2fcf8b3502243989065d3d80 --- /dev/null +++ b/module-apps/DOMResponder.cpp @@ -0,0 +1,34 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "DOMResponder.hpp" +#include "service-desktop/DeveloperModeMessage.hpp" +#include +#include +#include +#include +#include +#include + +namespace app +{ + DOMResponder::DOMResponder(const std::string &name, gui::Item &item, std::unique_ptr event) + : name(name), item(item), event(std::move(event)) + {} + + [[nodiscard]] auto DOMResponder::build() -> std::shared_ptr + { + createDOM(); + return std::make_shared(std::move(event)); + } + + void DOMResponder::createDOM() + { + auto t = utils::time::Scoped("Time to build dom"); + auto serializer = gui::Item2JsonSerializer(); + serializer.traverse(item); + auto evt = std::make_unique(*event); + evt->setJson(serializer.get()); + event = std::move(evt); + } +} // namespace app diff --git a/module-apps/DOMResponder.hpp b/module-apps/DOMResponder.hpp new file mode 100644 index 0000000000000000000000000000000000000000..7f7dec3bd2f4ba57699aa59129dc58f28f949961 --- /dev/null +++ b/module-apps/DOMResponder.hpp @@ -0,0 +1,41 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include +#include + +namespace gui +{ + class Item; +} + +namespace sdesktop::developerMode +{ + class Event; +} + +namespace app +{ + /// This class essentially hides implementation of: ServiceDesktop mechanics and DOM serialization from Application + /// gets event data + /// creates DOM and enapsulates in it event data + /// builds response to be used with ServiceDesktop response type + class DOMResponder + { + std::string name; + gui::Item &item; + std::unique_ptr event; + /// uses gui::Item serializer to create DOM dump + void createDOM(); + + public: + DOMResponder(const std::string &, gui::Item &, std::unique_ptr event); + /// creates response used to inform ServiceDesktop with DOM dump encapsulated + /// requires use of createDOM first + [[nodiscard]] auto build() -> std::shared_ptr; + }; + +}; // namespace app diff --git a/module-apps/messages/AppMessage.hpp b/module-apps/messages/AppMessage.hpp index c74afc5d2941e1b088fa0aa790878e9540290eb6..522da285aa85e69c206c43f4e7ce4cafb8882ddc 100644 --- a/module-apps/messages/AppMessage.hpp +++ b/module-apps/messages/AppMessage.hpp @@ -1,29 +1,18 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "Common.hpp" -#include "MessageType.hpp" -#include "Service/Message.hpp" #include "SwitchData.hpp" #include "gui/input/InputEvent.hpp" +#include "BaseAppMessage.hpp" #include #include namespace app { - /* - * @brief Template for all messages that go to application manager - */ - class AppMessage : public sys::DataMessage - { - public: - AppMessage(MessageType messageType) : sys::DataMessage(messageType){}; - AppMessage() : sys::DataMessage(MessageType::AppMessage){}; - }; - class AppActionRequest : public AppMessage { public: diff --git a/module-apps/messages/BaseAppMessage.hpp b/module-apps/messages/BaseAppMessage.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f9becde4d0b6caa083c02c1d56558e5d5e2f0d33 --- /dev/null +++ b/module-apps/messages/BaseAppMessage.hpp @@ -0,0 +1,17 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include "MessageType.hpp" +#include "Service/Message.hpp" + +namespace app +{ + class AppMessage : public sys::DataMessage + { + public: + explicit AppMessage(MessageType messageType) : sys::DataMessage(messageType){}; + AppMessage() : sys::DataMessage(MessageType::AppMessage){}; + }; +} // namespace app diff --git a/module-bsp/board/linux/rtc/rtc.cpp b/module-bsp/board/linux/rtc/rtc.cpp index f886cd85f540508483897f63043aa1cbb4ca8765..311df8060a7e0d5bd7f707d999c86899fc657045 100644 --- a/module-bsp/board/linux/rtc/rtc.cpp +++ b/module-bsp/board/linux/rtc/rtc.cpp @@ -180,7 +180,12 @@ static void rtc_worker(void *pvp) // TODO delete function if it will not be used in service void SNVS_HP_WRAPPER_IRQHandler() -{} +{ + /// HERE on TICK set_time timer monotonic + /// gmtime <- based on timer monotonic + /// localtime <- based on timer monotonic + /// timezone <- can be based on offset between two if one super wishes... (+1, +2 etc... ) +} /* * ********************************************************************************************************************** * * * diff --git a/module-gui/gui/dom/Item2JsonSerializer.cpp b/module-gui/gui/dom/Item2JsonSerializer.cpp index de9c7c9edff191acd56f143b8e0c08b11b6ebabf..2b161c0e58ca3134ad5ac3ba94f54e9ec0814ca2 100644 --- a/module-gui/gui/dom/Item2JsonSerializer.cpp +++ b/module-gui/gui/dom/Item2JsonSerializer.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "Item2JsonSerializer.hpp" @@ -69,3 +69,8 @@ void Item2JsonSerializer::dump(std::ostream &stream) { stream << document.dump(); } + +[[nodiscard]] auto Item2JsonSerializer::get() -> json11::Json && +{ + return std::move(document); +} diff --git a/module-gui/gui/dom/Item2JsonSerializer.hpp b/module-gui/gui/dom/Item2JsonSerializer.hpp index 5e9659d309e97dc9a76bdbf195e3ceecf15d82d1..e1b6522f1700d87eaa70fef88c3bcda140f3d091 100644 --- a/module-gui/gui/dom/Item2JsonSerializer.hpp +++ b/module-gui/gui/dom/Item2JsonSerializer.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -26,5 +26,6 @@ namespace gui /// JSON format and kept in `document`. void traverse(gui::Item &root); void dump(std::ostream &stream); + [[nodiscard]] auto get() -> json11::Json &&; }; } // namespace gui diff --git a/module-services/service-appmgr/CMakeLists.txt b/module-services/service-appmgr/CMakeLists.txt index e9bb133649f1ce16d7e04c084501d4387812cef9..407be90dbd8eac01219a334325ef3efac763603b 100644 --- a/module-services/service-appmgr/CMakeLists.txt +++ b/module-services/service-appmgr/CMakeLists.txt @@ -22,7 +22,9 @@ set(SOURCES messages/SwitchBackRequest.cpp messages/SwitchConfirmation.cpp messages/SwitchRequest.cpp - messages/UpdateInProgress.cpp) + messages/UpdateInProgress.cpp + messages/DOMRequest.cpp +) add_library(${PROJECT_NAME} STATIC ${SOURCES}) diff --git a/module-services/service-appmgr/messages/BaseMessage.cpp b/module-services/service-appmgr/messages/BaseMessage.cpp index 4652b28bde107326c99eb898a35bc659d096825e..d9afa22e0834d57154fafdd157412a6fb67d6600 100644 --- a/module-services/service-appmgr/messages/BaseMessage.cpp +++ b/module-services/service-appmgr/messages/BaseMessage.cpp @@ -1,10 +1,15 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include namespace app::manager { + + BaseMessage::BaseMessage(ApplicationName sender) + : sys::DataMessage(MessageType::APMGeneric), senderName(std::move(sender)) + {} + BaseMessage::BaseMessage(MessageType type, ApplicationName sender) : sys::DataMessage(type), senderName{std::move(sender)} {} diff --git a/module-services/service-appmgr/messages/DOMRequest.cpp b/module-services/service-appmgr/messages/DOMRequest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f621f20453a946e0d1775d73eef4947a4a428005 --- /dev/null +++ b/module-services/service-appmgr/messages/DOMRequest.cpp @@ -0,0 +1,18 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "service-desktop/DeveloperModeMessage.hpp" +#include + +namespace app::manager +{ + + DOMRequest::DOMRequest(ApplicationName sender, std::unique_ptr event) + : sdesktop::developerMode::DeveloperModeRequest(std::move(event)), sender(std::move(sender)) + {} + + DOMRequest::DOMRequest(const DOMRequest &dom) + : sdesktop::developerMode::DeveloperModeRequest(std::make_unique(*dom.event)), + sender(std::move(dom.sender)) + {} +} // namespace app::manager diff --git a/module-services/service-appmgr/model/ApplicationManager.cpp b/module-services/service-appmgr/model/ApplicationManager.cpp index 7feb4364bd470881c54a687451bb6cc58ecc56c1..508424442a1f0e695c12d31f61c348f408314f87 100644 --- a/module-services/service-appmgr/model/ApplicationManager.cpp +++ b/module-services/service-appmgr/model/ApplicationManager.cpp @@ -28,6 +28,8 @@ #include #include #include +#include + // Auto phone lock disabled for now till the times when it's debugged // #define AUTO_PHONE_LOCK_ENABLED namespace app::manager @@ -294,6 +296,8 @@ namespace app::manager return msgHandled(); }); + connect(typeid(app::manager::DOMRequest), [&](sys::Message *request) { return handleDOMRequest(request); }); + auto convertibleToActionHandler = [this](sys::Message *request) { return handleMessageAsAction(request); }; connect(typeid(CellularSimRequestPinMessage), convertibleToActionHandler); connect(typeid(CellularSimRequestPukMessage), convertibleToActionHandler); @@ -843,4 +847,16 @@ namespace app::manager } utils::localize.setInputLanguage(value); } + + auto ApplicationManager::handleDOMRequest(sys::Message *request) -> std::shared_ptr + { + auto app = getFocusedApplication(); + if (app != nullptr) { + auto message = static_cast(request); + LOG_INFO("DOM request for: %s", message->getSenderName().c_str()); + bus.sendUnicast(std::make_unique(*message), app->name()); + return sys::MessageNone{}; + } + return std::make_shared(sys::ReturnCodes::Unresolved); + } } // namespace app::manager diff --git a/module-services/service-appmgr/service-appmgr/messages/BaseMessage.hpp b/module-services/service-appmgr/service-appmgr/messages/BaseMessage.hpp index e4444734b8f31909c51afc9c092be72ed46e3948..f9adb2bf1209675a9d503e01cf493be22452b616 100644 --- a/module-services/service-appmgr/service-appmgr/messages/BaseMessage.hpp +++ b/module-services/service-appmgr/service-appmgr/messages/BaseMessage.hpp @@ -1,11 +1,10 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include #include - #include namespace app::manager @@ -14,6 +13,7 @@ namespace app::manager { public: BaseMessage(MessageType type, ApplicationName sender); + explicit BaseMessage(ApplicationName sender); [[nodiscard]] auto getSenderName() const noexcept -> const ApplicationName &; diff --git a/module-services/service-appmgr/service-appmgr/messages/DOMRequest.hpp b/module-services/service-appmgr/service-appmgr/messages/DOMRequest.hpp new file mode 100644 index 0000000000000000000000000000000000000000..6751f7d2ab6eaee5d17e2e23becae9f6dfae2b43 --- /dev/null +++ b/module-services/service-appmgr/service-appmgr/messages/DOMRequest.hpp @@ -0,0 +1,28 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include "BaseMessage.hpp" +#include "service-desktop/DeveloperModeMessage.hpp" +#include + +namespace app::manager +{ + class DOMRequest : public sdesktop::developerMode::DeveloperModeRequest + { + ApplicationName sender; + + public: + DOMRequest(ApplicationName sender, std::unique_ptr event); + [[nodiscard]] auto getEvent() + { + return std::move(event); + } + [[nodiscard]] auto getSenderName() const + { + return sender; + } + DOMRequest(const DOMRequest &dom); + }; +} // namespace app::manager diff --git a/module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp b/module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp index d78d7aa9bb12be27108f802eb9f397a6dcbf394b..c4b24a0693a8326bee4def987f62f9c53c57fc46 100644 --- a/module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp +++ b/module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp @@ -133,6 +133,8 @@ namespace app::manager auto handleDateFormatChange(DateFormatChangeRequest *msg) -> bool; auto handlePowerSavingModeInit() -> bool; auto handleMessageAsAction(sys::Message *request) -> std::shared_ptr; + /// handles dom request by passing this request to application which should provide the dom + auto handleDOMRequest(sys::Message *request) -> std::shared_ptr; void requestApplicationClose(ApplicationHandle &app, bool isCloseable); void onApplicationSwitch(ApplicationHandle &app, diff --git a/module-services/service-cellular/SMSSend.hpp b/module-services/service-cellular/SMSSend.hpp new file mode 100644 index 0000000000000000000000000000000000000000..f17a443e3dbb43d523ed7b3491616ff86c5ee155 --- /dev/null +++ b/module-services/service-cellular/SMSSend.hpp @@ -0,0 +1,22 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include "SMSRecord.hpp" +#include "service-cellular/ServiceCellular.hpp" + +namespace cellular::internal +{ + + class SMSSend + { + protected: + ServiceCellular &cellular; + + public: + explicit SMSSend(ServiceCellular &p) : cellular(p) + {} + [[nodiscard]] auto send(SMSRecord &record) -> bool; + }; +} // namespace cellular::internal diff --git a/module-services/service-desktop/CMakeLists.txt b/module-services/service-desktop/CMakeLists.txt index 7c27cebe42c2b025d5daabbc2ea307a80b92d3eb..9ae9f12cf2d9898d445f1f18c36a8a1533ebae95 100644 --- a/module-services/service-desktop/CMakeLists.txt +++ b/module-services/service-desktop/CMakeLists.txt @@ -12,6 +12,9 @@ set(SOURCES endpoints/contacts/ContactsEndpoint.cpp endpoints/developerMode/DeveloperModeEndpoint.cpp endpoints/developerMode/DeveloperModeHelper.cpp + endpoints/developerMode/Mode/BaseHelper.cpp + endpoints/developerMode/Mode/UI_Helper.cpp + endpoints/developerMode/event/DomRequest.cpp endpoints/deviceInfo/DeviceInfoEndpoint.cpp endpoints/factoryReset/FactoryReset.cpp endpoints/factoryReset/FactoryResetEndpoint.cpp @@ -24,10 +27,12 @@ set(SOURCES endpoints/calendarEvents/CalendarEventsHelper.cpp endpoints/calendarEvents/CalendarEventsEndpoint.cpp - parser/ParserUtils.cpp + parser/HttpEnums.cpp parser/ParserFSM.cpp parser/MessageHandler.cpp + DesktopEvent.cpp + DeveloperModeMessage.cpp DesktopMessages.cpp ServiceDesktop.cpp WorkerDesktop.cpp diff --git a/module-services/service-desktop/DesktopEvent.cpp b/module-services/service-desktop/DesktopEvent.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a29c0c5864e684cc6969be26874b8f079d54184e --- /dev/null +++ b/module-services/service-desktop/DesktopEvent.cpp @@ -0,0 +1,10 @@ +#include "service-desktop/DesktopEvent.hpp" +#include + +namespace sdesktop +{ + void Event::send() + { + parserFSM::MessageHandler::putToSendQueue(context.createSimpleResponse()); + } +} // namespace sdesktop diff --git a/module-services/service-desktop/DesktopMessages.cpp b/module-services/service-desktop/DesktopMessages.cpp index 6adcd4e61b15b591f49b2a8ee57675cd6fbf8af9..b0ce812b92e2f1c221c4e71f036cff8d4bc9c8f5 100644 --- a/module-services/service-desktop/DesktopMessages.cpp +++ b/module-services/service-desktop/DesktopMessages.cpp @@ -7,10 +7,6 @@ namespace sdesktop { using namespace parserFSM; - void Event::send() - { - MessageHandler::putToSendQueue(context.createSimpleResponse()); - } namespace developerMode { @@ -41,17 +37,9 @@ namespace sdesktop context.setEndpoint(EndpointType::developerMode); context.setResponseBody(json11::Json::object{{json::developerMode::cellularStateInfo, stateStr}}); } - - DeveloperModeRequest::DeveloperModeRequest(std::unique_ptr event) - : sys::DataMessage(MessageType::DeveloperModeRequest), event(std::move(event)) - {} - - DeveloperModeRequest::DeveloperModeRequest() : sys::DataMessage(MessageType::DeveloperModeRequest) - {} } // namespace developerMode namespace bluetooth { - BluetoothStatusRequestEvent::BluetoothStatusRequestEvent(int state) { context.setResponseStatus(http::Code::OK); diff --git a/module-services/service-desktop/DeveloperModeMessage.cpp b/module-services/service-desktop/DeveloperModeMessage.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5bf191ec0d1ab29f1b1bfc72136bfe3f7a3b1b28 --- /dev/null +++ b/module-services/service-desktop/DeveloperModeMessage.cpp @@ -0,0 +1,14 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include + +namespace sdesktop::developerMode +{ + DeveloperModeRequest::DeveloperModeRequest(std::unique_ptr event) + : sys::DataMessage(MessageType::DeveloperModeRequest), event(std::move(event)) + {} + + DeveloperModeRequest::DeveloperModeRequest() : sys::DataMessage(MessageType::DeveloperModeRequest) + {} +} // namespace sdesktop::developerMode diff --git a/module-services/service-desktop/README.md b/module-services/service-desktop/README.md index 00757ba642070824ebcd30bf3a57c7f55b296d47..a3be10d3b50117dcd89c8809311e86cc1f17f835 100644 --- a/module-services/service-desktop/README.md +++ b/module-services/service-desktop/README.md @@ -95,31 +95,72 @@ enum class Code ##### Example request -```#000000053{"endpoint":1, "method":1, "payload":{"test":"test"}}``` +``` +#000000053{"endpoint":1, "method":1, "payload":{"test":"test"}} +``` ##### Example response -```#000000095{"endpoint": 1, "status": 200, "body": {"charging": true, "level": 75, "maximumCapacity": 100}}``` +``` +#000000095{"endpoint": 1, "status": 200, "body": {"charging": true, "level": 75, "maximumCapacity": 100}} +``` #### Sample requests *Contacts* get contact: -```#000000056{"endpoint":6, "method":1, "uuid":1, "body":{"count":5}}``` +``` +#000000056{"endpoint":6, "method":1, "uuid":1, "body":{"count":5}} +``` response: -```#000000861{"body": [{"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bolig<0xc5><0x82>owa", "blocked": false, "favourite": true, "id": 19, "numbers": ["500639802"], "priName": "Alek"}, {"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bolig<0xc5><0x82>owa", "blocked": false, "favourite": true, "id": 22, "numbers": ["500453837"], "priName": "Gra<0xc5><0xbc>yna"}, {"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bolig<0xc5><0x82>owa", "blocked": false, "favourite": true, "id": 20, "numbers": ["500545546"], "priName": "Zofia"}, {"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bubel", "blocked": false, "favourite": true, "id": 44, "numbers": ["500087699"], "priName": "Brian"}, {"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bubel", "blocked": false, "favourite": true, "id": 43, "numbers": ["500656981"], "priName": "Cezary"}], "endpoint": 6, "status": 200, "uuid": "3"}``` +``` +#000000861{"body": [{"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bolig<0xc5><0x82>owa", "blocked": false, "favourite": true, "id": 19, "numbers": ["500639802"], "priName": "Alek"}, {"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bolig<0xc5><0x82>owa", "blocked": false, "favourite": true, "id": 22, "numbers": ["500453837"], "priName": "Gra<0xc5><0xbc>yna"}, {"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bolig<0xc5><0x82>owa", "blocked": false, "favourite": true, "id": 20, "numbers": ["500545546"], "priName": "Zofia"}, {"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bubel", "blocked": false, "favourite": true, "id": 44, "numbers": ["500087699"], "priName": "Brian"}, {"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Bubel", "blocked": false, "favourite": true, "id": 43, "numbers": ["500656981"], "priName": "Cezary"}], "endpoint": 6, "status": 200, "uuid": "3"} +``` update contact: -```#000000203{"endpoint":6, "method":2, "uuid":123, "body":{"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Cic", "blocked": true, "favourite": true, "id": "43", "numbers": ["724842187"], "priName": "Baatek"}}``` +``` +#000000203{"endpoint":6, "method":2, "uuid":123, "body":{"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Cic", "blocked": true, "favourite": true, "id": "43", "numbers": ["724842187"], "priName": "Baatek"}} +``` response: -```#000000057{"body": "", "endpoint": 6, "status": 500, "uuid": "123"}/``` -```#000000057{"body": "", "endpoint": 6, "status": 200, "uuid": "123"}``` +``` +#000000057{"body": "", "endpoint": 6, "status": 500, "uuid": "123"}/ +``` +``` +#000000057{"body": "", "endpoint": 6, "status": 200, "uuid": "123"} +``` add contact: -```#000000191{"endpoint":6, "method":3, "uuid":123, "body":{"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Cic", "blocked": true, "favourite": true, "numbers": ["724842187"], "priName": "Baatek"}}``` +``` +#000000191{"endpoint":6, "method":3, "uuid":123, "body":{"address": "6 Czeczota St.\n02600 Warsaw", "altName": "Cic", "blocked": true, "favourite": true, "numbers": ["724842187"], "priName": "Baatek"}} +``` response: -```#000000057{"body": "", "endpoint": 6, "status": 200, "uuid": "123"}``` +``` +#000000057{"body": "", "endpoint": 6, "status": 200, "uuid": "123"} +``` remove contact: -```#000000057{"endpoint":6, "method":4, "uuid":123, "body":{"id": 23}}``` +``` +#000000057{"endpoint":6, "method":4, "uuid":123, "body":{"id": 23}} +``` response: -```#000000057{"body": "", "endpoint": 6, "status": 200, "uuid": "123"}``` +``` +#000000057{"body": "", "endpoint": 6, "status": 200, "uuid": "123"} +``` + +### Service documentation + +#### Hi level view + +![Flowchart](./doc/how_machine_works.svg) + + +#### System asynchronous calls synchronization + +Calls from outside world are REST like. This means that: +- for one request +- there is one response + +To provide synchronous response for asynchronous system calls we have special mechanism. + +1. Send: `DeveloperModeRequest` message with special `Event` Data +2. Process `DeveloperModeRequest` in system, fill in `Event` Data +3. Pass `DeveloperModeRequest` back to requester diff --git a/module-services/service-desktop/ServiceDesktop.cpp b/module-services/service-desktop/ServiceDesktop.cpp index 904982cd16d9c51356290060e3075e68780cd5d7..ad3096d1779750a55d0b2b9c66bffe521cf8152d 100644 --- a/module-services/service-desktop/ServiceDesktop.cpp +++ b/module-services/service-desktop/ServiceDesktop.cpp @@ -1,6 +1,7 @@ // Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md +#include "service-appmgr/service-appmgr/messages/DOMRequest.hpp" #include "service-desktop/DesktopMessages.hpp" #include "service-desktop/ServiceDesktop.hpp" #include "service-desktop/WorkerDesktop.hpp" diff --git a/module-services/service-desktop/doc/how_machine_works.puml b/module-services/service-desktop/doc/how_machine_works.puml new file mode 100644 index 0000000000000000000000000000000000000000..9a5680bc23a80d1bbe484a6d5441bb3e1e99106c --- /dev/null +++ b/module-services/service-desktop/doc/how_machine_works.puml @@ -0,0 +1,9 @@ +@startuml +Worker -> Worker : get data +Worker --> ServiceDesktop : pass frame +ServiceDesktop -> ServiceDesktop : parse payload{ data request } +ServiceDesktop --> System : get {data} +System --> ServiceDesktop : responds {data} +ServiceDesktop -> ServiceDesktop : response final touch +ServiceDesktop -> Worker : push response +@enduml diff --git a/module-services/service-desktop/doc/how_machine_works.svg b/module-services/service-desktop/doc/how_machine_works.svg new file mode 100644 index 0000000000000000000000000000000000000000..618ffeb224c4c96d1740fff670561b4c80911b72 --- /dev/null +++ b/module-services/service-desktop/doc/how_machine_works.svg @@ -0,0 +1,19 @@ +WorkerWorkerServiceDesktopServiceDesktopSystemSystemget datapass frameparse payload{ data request }get {data}responds {data}response final touchpush response \ No newline at end of file diff --git a/module-services/service-desktop/endpoints/Context.hpp b/module-services/service-desktop/endpoints/Context.hpp index 38db9f037b4ceed01cb004814e0cc0a0b1a152d1..f20b4520f34cc96aa0b7b8e311e1af52cd137184 100644 --- a/module-services/service-desktop/endpoints/Context.hpp +++ b/module-services/service-desktop/endpoints/Context.hpp @@ -3,8 +3,8 @@ #pragma once -#include #include +#include "ResponseContext.hpp" namespace parserFSM { @@ -23,12 +23,6 @@ namespace parserFSM inline constexpr auto entries = "entries"; } // namespace json - struct endpointResponseContext - { - http::Code status = http::Code::OK; - json11::Json body = json11::Json(); - }; - constexpr int invalidUuid = 0; class Context @@ -38,7 +32,7 @@ namespace parserFSM EndpointType endpoint; uint32_t uuid; http::Method method; - endpointResponseContext responseContext; + endpoint::ResponseContext responseContext; auto validate() -> void { @@ -99,6 +93,12 @@ namespace parserFSM {json::body, responseContext.body}}; return buildResponseStr(responseJson.dump().size(), responseJson.dump()); } + + auto setResponse(endpoint::ResponseContext r) + { + r = responseContext; + } + auto setResponseStatus(http::Code status) { responseContext.status = status; @@ -111,7 +111,7 @@ namespace parserFSM { responseContext.body = respBody; } - auto getBody() -> json11::Json + auto getBody() -> const json11::Json & { return body; } diff --git a/module-services/service-desktop/endpoints/ResponseContext.hpp b/module-services/service-desktop/endpoints/ResponseContext.hpp new file mode 100644 index 0000000000000000000000000000000000000000..7c9ba55d94ae0b6c9fcce0e5c703f953f70234f5 --- /dev/null +++ b/module-services/service-desktop/endpoints/ResponseContext.hpp @@ -0,0 +1,16 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include + +namespace parserFSM::endpoint +{ + struct ResponseContext + { + http::Code status = http::Code::OK; + json11::Json body = json11::Json(); + }; +} // namespace parserFSM::endpoint diff --git a/module-services/service-desktop/endpoints/backup/BackupRestore.cpp b/module-services/service-desktop/endpoints/backup/BackupRestore.cpp index 5545912bdbbf931ea07fff781a77879f60b5e1ce..ee1b183a5eed8d358e1a044e8b339a466e180254 100644 --- a/module-services/service-desktop/endpoints/backup/BackupRestore.cpp +++ b/module-services/service-desktop/endpoints/backup/BackupRestore.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "BackupRestore.hpp" @@ -16,6 +16,7 @@ #include #include #include +#include namespace sys { diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.cpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.cpp index 65e1583980ef14277fd7b7f1289deb6990a35f40..99ebca7e58552b0658b298bfbd50b71d69530711 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.cpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.cpp @@ -1,24 +1,41 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "DeveloperModeEndpoint.hpp" +#include "log/log.hpp" #include +#include using namespace parserFSM; auto DeveloperModeEndpoint::handle(Context &context) -> void { - switch (context.getMethod()) { - case http::Method::get: - helper->processGetRequest(context); - break; - case http::Method::post: - break; - case http::Method::put: - helper->processPutRequest(context); - break; - case http::Method::del: - break; + auto &p = helperSwitcher(context); + auto [sent, response] = p.process(context.getMethod(), context); + if (sent == sent::delayed) { + LOG_DEBUG("There is no proper delayed serving mechanism - depend on invisible context caching"); } + if (sent == sent::no) { + if (not response) { + LOG_ERROR("Response not sent & response not created : respond with error"); + context.setResponseStatus(http::Code::NotAcceptable); + } + else { + context.setResponse(response.value()); + } + + MessageHandler::putToSendQueue(context.createSimpleResponse()); + } + if (sent == sent::yes and response) { + LOG_ERROR("Response set when we already handled response in handler"); + } +} + +auto DeveloperModeEndpoint::helperSwitcher(parserFSM::Context &ctx) -> parserFSM::BaseHelper & +{ + if (ctx.getBody()["ui"] == true) { + return *uiHelper; + } + return *helper; } diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.hpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.hpp index 9fe43d9317ecc962767adb502415cf3c68a005e9..407de2b564cc3889e2296ede980989164c673e6e 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.hpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeEndpoint.hpp @@ -1,9 +1,10 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "DeveloperModeHelper.hpp" +#include "Mode/UI_Helper.hpp" #include #include @@ -24,13 +25,18 @@ namespace sys class DeveloperModeEndpoint : public parserFSM::Endpoint { private: - std::unique_ptr helper; + const std::unique_ptr helper; + const std::unique_ptr uiHelper; public: - DeveloperModeEndpoint(sys::Service *_ownerServicePtr) : Endpoint(_ownerServicePtr) + explicit DeveloperModeEndpoint(sys::Service *_ownerServicePtr) + : Endpoint(_ownerServicePtr), helper(std::make_unique(ownerServicePtr)), + uiHelper(std::make_unique(ownerServicePtr)) { debugName = "DeveloperModeEndpoint"; - helper = std::make_unique(ownerServicePtr); } + auto handle(parserFSM::Context &context) -> void override; + + [[nodiscard]] auto helperSwitcher(parserFSM::Context &ctx) -> parserFSM::BaseHelper &; }; diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp index 49b0570931bc8185be99c1520d524858d57b29b6..520d60ce2224f32755bc5dba874c59410abf6091 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include #include @@ -18,6 +17,7 @@ #include #include