From e3d98f5df50afe16570f9581fbe358a6e5f749e8 Mon Sep 17 00:00:00 2001 From: Kuba Date: Thu, 10 Dec 2020 16:34:28 +0100 Subject: [PATCH] [EGD-4856] Add Custom MMI message Adds custom MMI respponse mesage. It will be used by MMI response window to translate message. --- changelog.md | 1 + module-cellular/at/response.cpp | 75 +++++++++++++++++ module-cellular/at/response.hpp | 39 +++++++++ .../service-appmgr/data/MmiActionsParams.cpp | 23 +++++ .../service-appmgr/data/MmiActionsParams.hpp | 83 +++++++++++++++++++ .../CellularRequestHandler.cpp | 35 ++++++++ .../requests/SupplementaryServicesRequest.cpp | 5 ++ .../service-cellular/CellularMessage.hpp | 10 ++- .../CellularRequestHandler.hpp | 1 + .../service-cellular/RequestHandler.hpp | 3 + .../requests/SupplementaryServicesRequest.hpp | 2 + 11 files changed, 275 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index deebb4cb369667999f2fed6424805296b1a1b01c..95a89438b98dc301692cff7b566ab5cf6a7f044d 100644 --- a/changelog.md +++ b/changelog.md @@ -10,6 +10,7 @@ * `[file indexer]` Support for deleting entries in File Indexer DB. * `[listview]` Added onEmpty list callbacks and implemented them for notes and messages. * `[notes]` Added list rebuild on notifications. +* `[cellular]` Custom MMI response message. ### Changed diff --git a/module-cellular/at/response.cpp b/module-cellular/at/response.cpp index fc3c31681c37797597c63cf3883afe371b9bd89e..eff7e167fe0e657deba9e97f1fea665e1f88cd2e 100644 --- a/module-cellular/at/response.cpp +++ b/module-cellular/at/response.cpp @@ -3,6 +3,7 @@ #include "response.hpp" #include +#include #include @@ -218,5 +219,79 @@ namespace at return 0; } } // namespace qnwinfo + + namespace clir + { + std::optional parseClir(const std::string &response) + { + auto constexpr toRemove = "+CLIR: "; + auto constexpr emptyString = ""; + + auto resp = response; + utils::findAndReplaceAll(resp, toRemove, emptyString); + + auto tokens = utils::split(resp, ","); + for (auto &t : tokens) { + t = utils::trim(t); + } + if (tokens.size() == clirTokens) { + int state; + int status; + + if (!utils::toNumeric(tokens[0], state) || !utils::toNumeric(tokens[1], status)) { + return std::nullopt; + } + if (static_cast(state) < magic_enum::enum_count() && + static_cast(status) < magic_enum::enum_count()) { + return ClirResponse(static_cast(state), static_cast(status)); + } + } + return std::nullopt; + } + + app::manager::actions::IMMICustomResultParams::MMIResultMessage getState(const ServiceState &state) + { + using namespace app::manager::actions; + + auto message = IMMICustomResultParams::MMIResultMessage::CommonNoMessage; + switch (state) { + case ServiceState::AccordingToSubscription: + message = IMMICustomResultParams::MMIResultMessage::ClirAccordingToSubscription; + break; + case ServiceState::ServiceEnabled: + message = IMMICustomResultParams::MMIResultMessage::ClirEnabled; + break; + case ServiceState::ServiceDisabled: + message = IMMICustomResultParams::MMIResultMessage::ClirDisabled; + break; + } + return message; + } + + app::manager::actions::IMMICustomResultParams::MMIResultMessage getStatus(const ServiceStatus &status) + { + using namespace app::manager::actions; + + auto message = IMMICustomResultParams::MMIResultMessage::CommonNoMessage; + switch (status) { + case ServiceStatus::NotProvisioned: + message = IMMICustomResultParams::MMIResultMessage::ClirNotProvisioned; + break; + case ServiceStatus::PermanentProvisioned: + message = IMMICustomResultParams::MMIResultMessage::ClirPermanentProvisioned; + break; + case ServiceStatus::Unknown: + message = IMMICustomResultParams::MMIResultMessage::ClirUnknown; + break; + case ServiceStatus::TemporaryRestricted: + message = IMMICustomResultParams::MMIResultMessage::ClirTemporaryRestricted; + break; + case ServiceStatus::TemporaryAllowed: + message = IMMICustomResultParams::MMIResultMessage::ClirTemporaryAllowed; + break; + } + return message; + } + } // namespace clir } // namespace response } // namespace at diff --git a/module-cellular/at/response.hpp b/module-cellular/at/response.hpp index d7222de8647c8b82b3e78cc07ab7b96031e01f74..5ba87bbf2ff89ff1919ae735c3d855fee86fa150 100644 --- a/module-cellular/at/response.hpp +++ b/module-cellular/at/response.hpp @@ -9,6 +9,8 @@ #include #include +#include + namespace at { namespace response @@ -86,5 +88,42 @@ namespace at uint32_t parseNumericBandString(std::string &string); uint32_t parseLteBandString(std::string &string); } // namespace qnwinfo + + namespace clir + { + constexpr uint32_t clirTokens = 2; + + enum class ServiceState + { + AccordingToSubscription, + ServiceEnabled, + ServiceDisabled, + }; + + enum class ServiceStatus + { + NotProvisioned, + PermanentProvisioned, + Unknown, + TemporaryRestricted, + TemporaryAllowed + }; + + class ClirResponse + { + public: + ServiceState serviceState; + ServiceStatus serviceStatus; + + explicit ClirResponse(const ServiceState &state, const ServiceStatus &status) + : serviceState(state), serviceStatus(status) + {} + }; + + auto parseClir(const std::string &response) -> std::optional; + auto getState(const ServiceState &state) -> app::manager::actions::IMMICustomResultParams::MMIResultMessage; + auto getStatus(const ServiceStatus &status) + -> app::manager::actions::IMMICustomResultParams::MMIResultMessage; + } // namespace clir } // namespace response } // namespace at diff --git a/module-services/service-appmgr/data/MmiActionsParams.cpp b/module-services/service-appmgr/data/MmiActionsParams.cpp index d49009dd5a2936fbce38a6e561bc8699fa84168a..b026c0b17af61b813b0215bc3b71b2bb71f6f71c 100644 --- a/module-services/service-appmgr/data/MmiActionsParams.cpp +++ b/module-services/service-appmgr/data/MmiActionsParams.cpp @@ -5,6 +5,21 @@ using namespace app::manager::actions; +void MMICustomResultParams::addMessage(const MMIResultMessage &message) +{ + messages.push_back(message); +} + +auto MMICustomResultParams::getMessage() -> std::vector +{ + return std::move(messages); +} + +auto MMICustomResultParams::getType() -> MMIType +{ + return type; +} + MMIParams::MMIParams(std::string mmiData) : mmiData{std::move(mmiData)} {} @@ -16,7 +31,15 @@ std::string MMIParams::getData() const MMIResultParams::MMIResultParams(MMIResult result) : result(result) {} +MMIResultParams::MMIResultParams(std::shared_ptr cResult) : customResult(cResult) +{} + MMIResultParams::MMIResult MMIResultParams::getData() const noexcept { return result; } + +auto MMIResultParams::getCustomMessage() const noexcept -> std::shared_ptr +{ + return customResult; +} diff --git a/module-services/service-appmgr/service-appmgr/data/MmiActionsParams.hpp b/module-services/service-appmgr/service-appmgr/data/MmiActionsParams.hpp index 1565f5e60b3fe322c9638e6f87fb92213eb22d36..b3e400d64269220fbb8ecca992cfc26edc21d839 100644 --- a/module-services/service-appmgr/service-appmgr/data/MmiActionsParams.hpp +++ b/module-services/service-appmgr/service-appmgr/data/MmiActionsParams.hpp @@ -7,6 +7,86 @@ namespace app::manager::actions { + class IMMICustomResultParams + { + public: + enum class MMIType + { + NoneSpecified, + CallForwardingNotification, + CallForwardingData, + Clir + }; + + enum class MMIResultMessage + { + NoneSpecifiedSuccess, + NoneSpecifiedFailed, + CommonFailure, + CommonNoMessage, + + ClirAccordingToSubscription, + ClirEnabled, + ClirDisabled, + ClirNotProvisioned, + ClirPermanentProvisioned, + ClirUnknown, + ClirTemporaryRestricted, + ClirTemporaryAllowed, + + RegistrationSuccessful, + RegistrationFailed, + ErasureSuccessful, + ErasureFailed, + DisablingSuccessful, + DisablingFailed, + EnablingSuccessful, + EnablingFailed + }; + virtual auto getMessage() -> std::vector = 0; + virtual void addMessage(const MMIResultMessage &message) = 0; + virtual auto getType() -> MMIType = 0; + }; + + class MMICustomResultParams : public IMMICustomResultParams + { + public: + MMICustomResultParams(MMIType resultType) : type(resultType){}; + void addMessage(const MMIResultMessage &message) override; + auto getMessage() -> std::vector override; + auto getType() -> MMIType override; + + protected: + MMIType type; + std::vector messages; + }; + + class MMINoneSpecifiedResult : public MMICustomResultParams + { + public: + MMINoneSpecifiedResult() : MMICustomResultParams(MMIType::NoneSpecified) + {} + }; + + class MMICallForwardingResult : public MMICustomResultParams + { + public: + MMICallForwardingResult() : MMICustomResultParams(MMIType::CallForwardingData) + {} + + private: + std::string voice; + std::string fax; + std::string sync; + std::string async; + }; + + class MMIClirResult : public MMICustomResultParams + { + public: + MMIClirResult() : MMICustomResultParams(MMIType::Clir) + {} + }; class MMIParams : public ActionParams { @@ -28,9 +108,12 @@ namespace app::manager::actions Failed }; explicit MMIResultParams(MMIResult result); + explicit MMIResultParams(std::shared_ptr cParams); [[nodiscard]] MMIResult getData() const noexcept; + [[nodiscard]] auto getCustomMessage() const noexcept -> std::shared_ptr; private: MMIResult result; + std::shared_ptr customResult = nullptr; }; } // namespace app::manager::actions diff --git a/module-services/service-cellular/CellularRequestHandler.cpp b/module-services/service-cellular/CellularRequestHandler.cpp index b8b6a4796308c2d563187dd794af2a0edfdb0106..738f91825c75cf2dbae490082ccb8ba083e56e00 100644 --- a/module-services/service-cellular/CellularRequestHandler.cpp +++ b/module-services/service-cellular/CellularRequestHandler.cpp @@ -17,6 +17,10 @@ #include "service-cellular/requests/UssdRequest.hpp" #include +#include "service-cellular/service-cellular/requests/ClirRequest.hpp" +#include "service-cellular/service-cellular/requests/SupplementaryServicesRequest.hpp" + +#include void CellularRequestHandler::handle(ImeiRequest &request, at::Result &result) { @@ -81,6 +85,37 @@ void CellularRequestHandler::handle(PinChangeRequest &request, at::Result &resul sendMmiResult(requestHandled); } +void CellularRequestHandler::handle(ClirRequest &request, at::Result &result) +{ + using namespace app::manager::actions; + using namespace cellular; + using namespace at::response; + auto requestHandled = request.checkModemResponse(result); + + std::shared_ptr response = std::make_shared(); + if (requestHandled) { + auto procedureType = request.getProcedureType(); + if (procedureType == SupplementaryServicesRequest::ProcedureType::Activation) { + response->addMessage(IMMICustomResultParams::MMIResultMessage::ClirEnabled); + } + else if (procedureType == SupplementaryServicesRequest::ProcedureType::Deactivation) { + response->addMessage(IMMICustomResultParams::MMIResultMessage::ClirDisabled); + } + else if (procedureType == SupplementaryServicesRequest::ProcedureType::Interrogation) { + auto clirParsed = clir::parseClir(result.response[0]); + if (clirParsed != std::nullopt) { + response->addMessage(clir::getStatus(clirParsed->serviceStatus)); + response->addMessage(clir::getState(clirParsed->serviceState)); + } + } + else { + response->addMessage(IMMICustomResultParams::MMIResultMessage::CommonFailure); + } + } + auto msg = std::make_shared(response); + sys::Bus::SendUnicast(msg, app::manager::ApplicationManager::ServiceName, &cellular); + request.setHandled(requestHandled); +} void CellularRequestHandler::sendMmiResult(bool result) { using namespace app::manager::actions; diff --git a/module-services/service-cellular/requests/SupplementaryServicesRequest.cpp b/module-services/service-cellular/requests/SupplementaryServicesRequest.cpp index b7e4fa869dd4d3f4e561083513e5e620fc1c78a6..27ea1d37eb74910b3b3f2550a8e6f1367947e84c 100644 --- a/module-services/service-cellular/requests/SupplementaryServicesRequest.cpp +++ b/module-services/service-cellular/requests/SupplementaryServicesRequest.cpp @@ -146,4 +146,9 @@ namespace cellular return utils::to_string(informationClass); } + auto SupplementaryServicesRequest::getProcedureType() -> ProcedureType + { + return procedureType; + } + }; // namespace cellular diff --git a/module-services/service-cellular/service-cellular/CellularMessage.hpp b/module-services/service-cellular/service-cellular/CellularMessage.hpp index 1a593c91e21d7bfcd2e0560c2f107202bd4a5264..3ca4928815dc31c4b75d2d43991d542ec1b27571 100644 --- a/module-services/service-cellular/service-cellular/CellularMessage.hpp +++ b/module-services/service-cellular/service-cellular/CellularMessage.hpp @@ -549,7 +549,10 @@ class CellularMMIResult : public CellularMessage protected: app::manager::actions::MMIResultParams params; - explicit CellularMMIResult(app::manager::actions::MMIResultParams::MMIResult result) + CellularMMIResult(app::manager::actions::MMIResultParams::MMIResult result) + : CellularMessage(MessageType::CellularMMIData), params(result) + {} + CellularMMIResult(std::shared_ptr &result) : CellularMessage(MessageType::CellularMMIData), params(result) {} }; @@ -557,7 +560,10 @@ class CellularMMIResult : public CellularMessage class CellularMMIResultMessage : public CellularMMIResult, public app::manager::actions::ConvertibleToAction { public: - explicit CellularMMIResultMessage(app::manager::actions::MMIResultParams::MMIResult result) + CellularMMIResultMessage(app::manager::actions::MMIResultParams::MMIResult result) : CellularMMIResult(result) + {} + + CellularMMIResultMessage(std::shared_ptr &result) : CellularMMIResult(result) {} diff --git a/module-services/service-cellular/service-cellular/CellularRequestHandler.hpp b/module-services/service-cellular/service-cellular/CellularRequestHandler.hpp index 464ea1d93e04541bbbdeb8347cccf447e70b51c4..cf7d387be86fdd6ece5c9c78ac0009c49e0262f9 100644 --- a/module-services/service-cellular/service-cellular/CellularRequestHandler.hpp +++ b/module-services/service-cellular/service-cellular/CellularRequestHandler.hpp @@ -20,6 +20,7 @@ class CellularRequestHandler : public RequestHandler void handle(PasswordRegistrationRequest &request, at::Result &result) final; void handle(SupplementaryServicesRequest &request, at::Result &result) final; void handle(PinChangeRequest &request, at::Result &result) final; + void handle(ClirRequest &request, at::Result &result) final; private: ServiceCellular &cellular; diff --git a/module-services/service-cellular/service-cellular/RequestHandler.hpp b/module-services/service-cellular/service-cellular/RequestHandler.hpp index 36dc0715afb1bc598ccf49855b1796ca3c5cb630..dcdee5f2a8aa2f9124e10c7221aec85ec191a733 100644 --- a/module-services/service-cellular/service-cellular/RequestHandler.hpp +++ b/module-services/service-cellular/service-cellular/RequestHandler.hpp @@ -13,6 +13,8 @@ namespace cellular class SupplementaryServicesRequest; class PasswordRegistrationRequest; class PinChangeRequest; + class ClipRequest; + class ClirRequest; class RequestHandler { @@ -23,5 +25,6 @@ namespace cellular virtual void handle(PasswordRegistrationRequest &request, at::Result &result) = 0; virtual void handle(PinChangeRequest &request, at::Result &result) = 0; virtual void handle(SupplementaryServicesRequest &request, at::Result &result) = 0; + virtual void handle(ClirRequest &request, at::Result &result) = 0; }; } // namespace cellular diff --git a/module-services/service-cellular/service-cellular/requests/SupplementaryServicesRequest.hpp b/module-services/service-cellular/service-cellular/requests/SupplementaryServicesRequest.hpp index 7034268500a6b1d57edb9e2f433f256f6c4b3795..1c81e3b0b3c94f8c218a2159ada8a199ac8b4b29 100644 --- a/module-services/service-cellular/service-cellular/requests/SupplementaryServicesRequest.hpp +++ b/module-services/service-cellular/service-cellular/requests/SupplementaryServicesRequest.hpp @@ -44,6 +44,8 @@ namespace cellular Erasure ///< MMI string starts with ## }; + auto getProcedureType() -> ProcedureType; + protected: std::string request; std::string serviceCode;