From 72e2a3003b6899ae609053f91177f79e5ae447fc Mon Sep 17 00:00:00 2001 From: Dawid Wojtas Date: Wed, 28 Sep 2022 13:08:11 +0200 Subject: [PATCH] [MOS-738] Fix receiving an empty SMS message Checking how many parts the modem sent and then catching an exception in case of an error. --- .../service-cellular/ServiceCellular.cpp | 83 ++++++++++++------- pure_changelog.md | 1 + 2 files changed, 53 insertions(+), 31 deletions(-) diff --git a/module-services/service-cellular/ServiceCellular.cpp b/module-services/service-cellular/ServiceCellular.cpp index 5c3e66cb2bdb297aa0719eb90b88ada8ddee09da..713841ba756ff09efefb9fb028b59bd93182d7dc 100644 --- a/module-services/service-cellular/ServiceCellular.cpp +++ b/module-services/service-cellular/ServiceCellular.cpp @@ -1007,41 +1007,62 @@ auto ServiceCellular::receiveSMS(std::string messageNumber) -> bool } } - if (!rawMessage || qcmgrRetries == at::AtCmdMaxRetries) { - LOG_ERROR("!!!! Could not read text message !!!!"); - retVal = false; + if (qcmgrRetries == at::AtCmdMaxRetries) { + LOG_ERROR("Could not read text message"); + return false; } - else { - auto receivedMessages = rawMessage.response.size(); - for (std::size_t i = 0; i < receivedMessages; i++) { - bool messageParsed = SMSParser::parse(&rawMessage.response[i]); - if (messageParsed) { - UTF8 decodedMessage; - UTF8 smsNumber = SMSParser::getNumber(); - std::string smsMessage = SMSParser::getMessage(); - - const std::string decodedStr = utils::hexToBytes(smsMessage); - const auto mmsNotificationOpt = pdu::parse(decodedStr); - if (mmsNotificationOpt) { - std::string number = numberFromAddress(mmsNotificationOpt->fromAddress); - // NOTE: number may be empty - decodedMessage = UTF8("[MMS]"); - smsNumber = UTF8(number); - } - if (decodedMessage.empty()) { - decodedMessage = UCS2(smsMessage).toUTF8(); - } - smsMessage.clear(); + if (!rawMessage) { + LOG_ERROR("AT invalid result: %s", magic_enum::enum_name(rawMessage.code).data()); + return false; + } - auto messageDate = SMSParser::getTime(); - const auto record = createSMSRecord(decodedMessage, smsNumber, messageDate); + // The modem should send 3 responses: + // 1. Data with phone number, time etc, + // 2. Message content + // 3. Status: OK, ERROR + auto receivedMessages = rawMessage.response.size(); + if (receivedMessages < 3) { + LOG_ERROR("AT response too short: %zu", receivedMessages); + return false; + } - if (!dbAddSMSRecord(record)) { - LOG_ERROR("Failed to add text message to db"); - retVal = false; - break; - } + for (std::size_t i = 0; i < receivedMessages; i++) { + bool messageParsed = SMSParser::parse(&rawMessage.response[i]); + if (messageParsed) { + UTF8 decodedMessage; + UTF8 smsNumber = SMSParser::getNumber(); + std::string smsMessage = SMSParser::getMessage(); + + std::string decodedStr; + try { + decodedStr = utils::hexToBytes(smsMessage); + } + catch (const std::exception &e) { + LOG_ERROR("Decoded SMS: %s", e.what()); + retVal = false; + break; + } + const auto mmsNotificationOpt = pdu::parse(decodedStr); + if (mmsNotificationOpt) { + std::string number = numberFromAddress(mmsNotificationOpt->fromAddress); + // NOTE: number may be empty + decodedMessage = UTF8("[MMS]"); + smsNumber = UTF8(number); + } + + if (decodedMessage.empty()) { + decodedMessage = UCS2(smsMessage).toUTF8(); + } + smsMessage.clear(); + + auto messageDate = SMSParser::getTime(); + const auto record = createSMSRecord(decodedMessage, smsNumber, messageDate); + + if (!dbAddSMSRecord(record)) { + LOG_ERROR("Failed to add text message to db"); + retVal = false; + break; } } } diff --git a/pure_changelog.md b/pure_changelog.md index 76f0d115261da2be2ae590ceeac3b859a8e02eb2..8516fb4556d3fd153574aac1376d4bb0bfb8eb5a 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -8,6 +8,7 @@ * Separated system volume from Bluetooth device volume for A2DP ### Fixed +* Fixed receiving an empty SMS message * Fixed issue with inability to send SMS * Fixed mixed SMS messages * Fixed disappearing manual alarm and vibration volume setting in German