Files
MuditaOS/module-services/service-cellular/CellularRequestHandler.cpp
Kuba 0f2503e76d [EGD-4859] Add call forwarding parser
It allows to show proper GUI windows for call forwarding MMI responses.
2021-01-25 13:23:32 +01:00

195 lines
8.3 KiB
C++

// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "service-cellular/CellularRequestHandler.hpp"
#include "service-cellular/RequestFactory.hpp"
#include "service-cellular/ServiceCellular.hpp"
#include "Service/Bus.hpp"
#include "Service/Message.hpp"
#include "Service/Timer.hpp"
#include "service-cellular/requests/CallRequest.hpp"
#include "service-cellular/requests/SupplementaryServicesRequest.hpp"
#include "service-cellular/requests/PasswordRegistrationRequest.hpp"
#include "service-cellular/requests/PinChangeRequest.hpp"
#include "service-cellular/requests/ImeiRequest.hpp"
#include "service-cellular/requests/UssdRequest.hpp"
#include "service-cellular/service-cellular/requests/ClirRequest.hpp"
#include "service-cellular/requests/CallForwardingRequest.hpp"
#include <service-appmgr/model/ApplicationManager.hpp>
#include <module-cellular/at/response.hpp>
using namespace cellular;
void CellularRequestHandler::handle(ImeiRequest &request, at::Result &result)
{
if (!request.checkModemResponse(result)) {
request.setHandled(false);
sendMmiResult(false);
return;
}
request.setHandled(true);
auto msg = std::make_shared<CellularMMIPushMessage>(result.response[0]);
sys::Bus::SendUnicast(msg, app::manager::ApplicationManager::ServiceName, &cellular);
}
void CellularRequestHandler::handle(UssdRequest &request, at::Result &result)
{
auto requestHandled = request.checkModemResponse(result);
if (requestHandled) {
cellular.ussdState = ussd::State::pullRequestSent;
cellular.setUSSDTimer();
}
else {
sendMmiResult(requestHandled);
}
request.setHandled(requestHandled);
}
void CellularRequestHandler::handle(CallRequest &request, at::Result &result)
{
if (!request.checkModemResponse(result)) {
request.setHandled(false);
return;
}
// activate call state timer
cellular.callStateTimer->reload();
// Propagate "Ringing" notification into system
sys::Bus::SendMulticast(
std::make_shared<CellularCallMessage>(CellularCallMessage::Type::Ringing, request.getNumber()),
sys::BusChannels::ServiceCellularNotifications,
&cellular);
request.setHandled(true);
}
void CellularRequestHandler::handle(SupplementaryServicesRequest &request, at::Result &result)
{
auto requestHandled = request.checkModemResponse(result);
request.setHandled(requestHandled);
sendMmiResult(requestHandled);
}
void CellularRequestHandler::handle(PasswordRegistrationRequest &request, at::Result &result)
{
auto requestHandled = request.checkModemResponse(result);
request.setHandled(requestHandled);
sendMmiResult(requestHandled);
}
void CellularRequestHandler::handle(PinChangeRequest &request, at::Result &result)
{
auto requestHandled = request.checkModemResponse(result);
request.setHandled(requestHandled);
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<MMICustomResultParams> response = std::make_shared<MMIClirResult>();
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<CellularMMIResultMessage>(MMIResultParams::MMIResult::Success, response);
sys::Bus::SendUnicast(msg, app::manager::ApplicationManager::ServiceName, &cellular);
request.setHandled(requestHandled);
}
void CellularRequestHandler::handle(CallForwardingRequest &request, at::Result &result)
{
using namespace app::manager::actions;
using namespace cellular;
using namespace at::response;
auto requestHandled = request.checkModemResponse(result);
std::shared_ptr<MMICustomResultParams> response;
if (requestHandled) {
auto procedureType = request.getProcedureType();
if (procedureType == SupplementaryServicesRequest::ProcedureType::Registration) {
response =
std::make_shared<MMICallForwardingResult>(IMMICustomResultParams::MMIType::CallForwardingNotification);
response->addMessage(IMMICustomResultParams::MMIResultMessage::RegistrationSuccessful);
}
else if (procedureType == SupplementaryServicesRequest::ProcedureType::Deactivation) {
response =
std::make_shared<MMICallForwardingResult>(IMMICustomResultParams::MMIType::CallForwardingNotification);
response->addMessage(IMMICustomResultParams::MMIResultMessage::DisablingSuccessful);
}
else if (procedureType == SupplementaryServicesRequest::ProcedureType::Erasure) {
response =
std::make_shared<MMICallForwardingResult>(IMMICustomResultParams::MMIType::CallForwardingNotification);
response->addMessage(IMMICustomResultParams::MMIResultMessage::ErasureSuccessful);
}
else if (procedureType == SupplementaryServicesRequest::ProcedureType::Interrogation) {
std::vector<ccfc::ParsedCcfc> parsed;
if (at::response::ccfc::parse(result.response, parsed)) {
if (ccfc::isAnyActive(parsed)) {
auto numbers = ccfc::getNumbers(parsed);
response =
std::make_shared<MMICallForwardingResult>(IMMICustomResultParams::MMIType::CallForwardingData,
numbers.voice,
numbers.fax,
numbers.sync,
numbers.async);
}
else {
response = std::make_shared<MMICallForwardingResult>(
IMMICustomResultParams::MMIType::CallForwardingNotification);
response->addMessage(IMMICustomResultParams::MMIResultMessage::CallForwardingDisabled);
}
}
}
}
else {
if (result.code == at::Result::Code::ERROR &&
std::get<at::EquipmentErrorCode>(result.errorCode) == at::EquipmentErrorCode::PhoneBusy) {
response =
std::make_shared<MMICallForwardingResult>(IMMICustomResultParams::MMIType::CallForwardingNotification);
response->addMessage(IMMICustomResultParams::MMIResultMessage::CommonMMINotSupported);
}
}
if (response.get() == nullptr) {
response =
std::make_shared<MMICallForwardingResult>(IMMICustomResultParams::MMIType::CallForwardingNotification);
response->addMessage(IMMICustomResultParams::MMIResultMessage::CommonFailure);
}
auto msg = std::make_shared<CellularMMIResultMessage>(MMIResultParams::MMIResult::Success, response);
sys::Bus::SendUnicast(msg, app::manager::ApplicationManager::ServiceName, &cellular);
request.setHandled(requestHandled);
}
void CellularRequestHandler::sendMmiResult(bool result)
{
using namespace app::manager::actions;
auto msg = std::make_shared<CellularMMIResultMessage>(result ? MMIResultParams::MMIResult::Success
: MMIResultParams::MMIResult::Failed);
sys::Bus::SendUnicast(msg, app::manager::ApplicationManager::ServiceName, &cellular);
}