1e5d0e473Sopenharmony_ci/* 2e5d0e473Sopenharmony_ci * Copyright (C) 2021-2023 Huawei Device Co., Ltd. 3e5d0e473Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e5d0e473Sopenharmony_ci * you may not use this file except in compliance with the License. 5e5d0e473Sopenharmony_ci * You may obtain a copy of the License at 6e5d0e473Sopenharmony_ci * 7e5d0e473Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e5d0e473Sopenharmony_ci * 9e5d0e473Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e5d0e473Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e5d0e473Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e5d0e473Sopenharmony_ci * See the License for the specific language governing permissions and 13e5d0e473Sopenharmony_ci * limitations under the License. 14e5d0e473Sopenharmony_ci */ 15e5d0e473Sopenharmony_ci 16e5d0e473Sopenharmony_ci#include "gsm_sms_message.h" 17e5d0e473Sopenharmony_ci 18e5d0e473Sopenharmony_ci#include "core_manager_inner.h" 19e5d0e473Sopenharmony_ci#include "securec.h" 20e5d0e473Sopenharmony_ci#include "telephony_log_wrapper.h" 21e5d0e473Sopenharmony_ci#include "text_coder.h" 22e5d0e473Sopenharmony_ci 23e5d0e473Sopenharmony_cinamespace OHOS { 24e5d0e473Sopenharmony_cinamespace Telephony { 25e5d0e473Sopenharmony_ciusing namespace std; 26e5d0e473Sopenharmony_cistatic constexpr uint16_t DEFAULT_PORT = -1; 27e5d0e473Sopenharmony_cistatic constexpr uint8_t MAX_GSM_7BIT_DATA_LEN = 160; 28e5d0e473Sopenharmony_cistatic constexpr uint8_t MAX_SMSC_LEN = 20; 29e5d0e473Sopenharmony_cistatic constexpr uint16_t MAX_TPDU_DATA_LEN = 255; 30e5d0e473Sopenharmony_cistatic constexpr uint16_t TAPI_TEXT_SIZE_MAX = 520; 31e5d0e473Sopenharmony_ci 32e5d0e473Sopenharmony_ciuint8_t GsmSmsMessage::CalcReplyEncodeAddress(const std::string &replyAddress) 33e5d0e473Sopenharmony_ci{ 34e5d0e473Sopenharmony_ci std::string encodedAddr; 35e5d0e473Sopenharmony_ci if (replyAddress.length() > 0) { 36e5d0e473Sopenharmony_ci struct AddressNumber replyAddr = {}; 37e5d0e473Sopenharmony_ci replyAddr.ton = TYPE_NATIONAL; 38e5d0e473Sopenharmony_ci replyAddr.npi = SMS_NPI_ISDN; 39e5d0e473Sopenharmony_ci int ret = memset_s(replyAddr.address, sizeof(replyAddr.address), 0x00, MAX_ADDRESS_LEN + 1); 40e5d0e473Sopenharmony_ci if (ret != EOK) { 41e5d0e473Sopenharmony_ci TELEPHONY_LOGE("CalcReplyEncodeAddress memset_s error!"); 42e5d0e473Sopenharmony_ci return 0; 43e5d0e473Sopenharmony_ci } 44e5d0e473Sopenharmony_ci ret = memcpy_s(replyAddr.address, sizeof(replyAddr.address), replyAddress.c_str(), MAX_ADDRESS_LEN); 45e5d0e473Sopenharmony_ci if (ret != EOK) { 46e5d0e473Sopenharmony_ci TELEPHONY_LOGE("CalcReplyEncodeAddress memory_s error!"); 47e5d0e473Sopenharmony_ci return 0; 48e5d0e473Sopenharmony_ci } 49e5d0e473Sopenharmony_ci GsmSmsParamCodec codec; 50e5d0e473Sopenharmony_ci codec.EncodeAddressPdu(&replyAddr, encodedAddr); 51e5d0e473Sopenharmony_ci } 52e5d0e473Sopenharmony_ci return encodedAddr.size(); 53e5d0e473Sopenharmony_ci} 54e5d0e473Sopenharmony_ci 55e5d0e473Sopenharmony_ciint GsmSmsMessage::SetSmsTpduDestAddress(std::shared_ptr<struct SmsTpdu> &tPdu, const std::string &desAddr) 56e5d0e473Sopenharmony_ci{ 57e5d0e473Sopenharmony_ci int ret = 0; 58e5d0e473Sopenharmony_ci int addLen = 0; 59e5d0e473Sopenharmony_ci if (tPdu == nullptr) { 60e5d0e473Sopenharmony_ci TELEPHONY_LOGE("TPdu is null."); 61e5d0e473Sopenharmony_ci return addLen; 62e5d0e473Sopenharmony_ci } 63e5d0e473Sopenharmony_ci addLen = static_cast<int>(desAddr.length()); 64e5d0e473Sopenharmony_ci tPdu->data.submit.destAddress.ton = TYPE_UNKNOWN; 65e5d0e473Sopenharmony_ci tPdu->data.submit.destAddress.npi = SMS_NPI_ISDN; 66e5d0e473Sopenharmony_ci if (addLen < MAX_ADDRESS_LEN) { 67e5d0e473Sopenharmony_ci ret = memcpy_s(tPdu->data.submit.destAddress.address, sizeof(tPdu->data.submit.destAddress.address), 68e5d0e473Sopenharmony_ci desAddr.c_str(), addLen); 69e5d0e473Sopenharmony_ci if (ret != EOK) { 70e5d0e473Sopenharmony_ci TELEPHONY_LOGE("SetSmsTpduDestAddress memcpy_s error!"); 71e5d0e473Sopenharmony_ci return addLen; 72e5d0e473Sopenharmony_ci } 73e5d0e473Sopenharmony_ci tPdu->data.submit.destAddress.address[addLen] = '\0'; 74e5d0e473Sopenharmony_ci } else { 75e5d0e473Sopenharmony_ci if (desAddr[0] == '+') { 76e5d0e473Sopenharmony_ci ret = memcpy_s(tPdu->data.submit.destAddress.address, sizeof(tPdu->data.submit.destAddress.address), 77e5d0e473Sopenharmony_ci desAddr.c_str(), MAX_ADDRESS_LEN); 78e5d0e473Sopenharmony_ci } else { 79e5d0e473Sopenharmony_ci ret = memcpy_s(tPdu->data.submit.destAddress.address, sizeof(tPdu->data.submit.destAddress.address), 80e5d0e473Sopenharmony_ci desAddr.c_str(), MAX_ADDRESS_LEN - 1); 81e5d0e473Sopenharmony_ci } 82e5d0e473Sopenharmony_ci if (ret != EOK) { 83e5d0e473Sopenharmony_ci TELEPHONY_LOGE("SetSmsTpduDestAddress memcpy_s error!"); 84e5d0e473Sopenharmony_ci return addLen; 85e5d0e473Sopenharmony_ci } 86e5d0e473Sopenharmony_ci tPdu->data.submit.destAddress.address[MAX_ADDRESS_LEN] = '\0'; 87e5d0e473Sopenharmony_ci } 88e5d0e473Sopenharmony_ci return addLen; 89e5d0e473Sopenharmony_ci} 90e5d0e473Sopenharmony_ci 91e5d0e473Sopenharmony_ciint GsmSmsMessage::SetHeaderLang(int index, const DataCodingScheme codingType, const MSG_LANGUAGE_ID_T langId) 92e5d0e473Sopenharmony_ci{ 93e5d0e473Sopenharmony_ci int ret = 0; 94e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 95e5d0e473Sopenharmony_ci TELEPHONY_LOGE("TPdu is null."); 96e5d0e473Sopenharmony_ci return ret; 97e5d0e473Sopenharmony_ci } 98e5d0e473Sopenharmony_ci switch (smsTpdu_->tpduType) { 99e5d0e473Sopenharmony_ci case SMS_TPDU_SUBMIT: 100e5d0e473Sopenharmony_ci if (codingType == DATA_CODING_7BIT && langId != MSG_ID_RESERVED_LANG) { 101e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udhType = UDH_SINGLE_SHIFT; 102e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.singleShift.langId = langId; 103e5d0e473Sopenharmony_ci ret++; 104e5d0e473Sopenharmony_ci } 105e5d0e473Sopenharmony_ci break; 106e5d0e473Sopenharmony_ci default: 107e5d0e473Sopenharmony_ci break; 108e5d0e473Sopenharmony_ci } 109e5d0e473Sopenharmony_ci return ret; 110e5d0e473Sopenharmony_ci} 111e5d0e473Sopenharmony_ci 112e5d0e473Sopenharmony_ciint GsmSmsMessage::SetHeaderConcat(int index, const SmsConcat &concat) 113e5d0e473Sopenharmony_ci{ 114e5d0e473Sopenharmony_ci int ret = 0; 115e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 116e5d0e473Sopenharmony_ci TELEPHONY_LOGE("TPdu is null."); 117e5d0e473Sopenharmony_ci return ret; 118e5d0e473Sopenharmony_ci } 119e5d0e473Sopenharmony_ci switch (smsTpdu_->tpduType) { 120e5d0e473Sopenharmony_ci case SMS_TPDU_SUBMIT: 121e5d0e473Sopenharmony_ci if (concat.is8Bits) { 122e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udhType = UDH_CONCAT_8BIT; 123e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.concat8bit.msgRef = concat.msgRef; 124e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.concat8bit.totalSeg = concat.totalSeg; 125e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.concat8bit.seqNum = concat.seqNum; 126e5d0e473Sopenharmony_ci } else { 127e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udhType = UDH_CONCAT_16BIT; 128e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.concat16bit.msgRef = concat.msgRef; 129e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.concat16bit.totalSeg = concat.totalSeg; 130e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.concat16bit.seqNum = concat.seqNum; 131e5d0e473Sopenharmony_ci } 132e5d0e473Sopenharmony_ci ret++; 133e5d0e473Sopenharmony_ci break; 134e5d0e473Sopenharmony_ci default: 135e5d0e473Sopenharmony_ci break; 136e5d0e473Sopenharmony_ci } 137e5d0e473Sopenharmony_ci return ret; 138e5d0e473Sopenharmony_ci} 139e5d0e473Sopenharmony_ci 140e5d0e473Sopenharmony_ciint GsmSmsMessage::SetHeaderReply(int index) 141e5d0e473Sopenharmony_ci{ 142e5d0e473Sopenharmony_ci int ret = 0; 143e5d0e473Sopenharmony_ci std::string reply = GetReplyAddress(); 144e5d0e473Sopenharmony_ci if (reply.length() == 0) { 145e5d0e473Sopenharmony_ci TELEPHONY_LOGE("address is null."); 146e5d0e473Sopenharmony_ci return ret; 147e5d0e473Sopenharmony_ci } 148e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 149e5d0e473Sopenharmony_ci TELEPHONY_LOGE("smsTpdu_ is null."); 150e5d0e473Sopenharmony_ci return ret; 151e5d0e473Sopenharmony_ci } 152e5d0e473Sopenharmony_ci switch (smsTpdu_->tpduType) { 153e5d0e473Sopenharmony_ci case SMS_TPDU_SUBMIT: { 154e5d0e473Sopenharmony_ci smsTpdu_->data.submit.bReplyPath = true; 155e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udhType = UDH_ALTERNATE_REPLY_ADDRESS; 156e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.alternateAddress.ton = TYPE_NATIONAL; 157e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.header[index].udh.alternateAddress.npi = SMS_NPI_ISDN; 158e5d0e473Sopenharmony_ci ret = memset_s(smsTpdu_->data.submit.userData.header[index].udh.alternateAddress.address, 159e5d0e473Sopenharmony_ci sizeof(smsTpdu_->data.submit.userData.header[index].udh.alternateAddress.address), 0x00, 160e5d0e473Sopenharmony_ci MAX_ADDRESS_LEN + 1); 161e5d0e473Sopenharmony_ci if (ret != EOK) { 162e5d0e473Sopenharmony_ci TELEPHONY_LOGE("SetHeaderReply memset_s error!"); 163e5d0e473Sopenharmony_ci return ret; 164e5d0e473Sopenharmony_ci } 165e5d0e473Sopenharmony_ci if (sizeof(smsTpdu_->data.submit.userData.header[index].udh.alternateAddress.address) < reply.length()) { 166e5d0e473Sopenharmony_ci TELEPHONY_LOGE("reply length exceed maxinum"); 167e5d0e473Sopenharmony_ci return ret; 168e5d0e473Sopenharmony_ci } 169e5d0e473Sopenharmony_ci ret = memcpy_s(smsTpdu_->data.submit.userData.header[index].udh.alternateAddress.address, 170e5d0e473Sopenharmony_ci sizeof(smsTpdu_->data.submit.userData.header[index].udh.alternateAddress.address), reply.c_str(), 171e5d0e473Sopenharmony_ci reply.length()); 172e5d0e473Sopenharmony_ci if (ret != EOK) { 173e5d0e473Sopenharmony_ci TELEPHONY_LOGE("SetHeaderReply memcpy_s error!"); 174e5d0e473Sopenharmony_ci return ret; 175e5d0e473Sopenharmony_ci } 176e5d0e473Sopenharmony_ci break; 177e5d0e473Sopenharmony_ci } 178e5d0e473Sopenharmony_ci default: 179e5d0e473Sopenharmony_ci break; 180e5d0e473Sopenharmony_ci } 181e5d0e473Sopenharmony_ci return ret; 182e5d0e473Sopenharmony_ci} 183e5d0e473Sopenharmony_ci 184e5d0e473Sopenharmony_civoid GsmSmsMessage::CreateDefaultSubmit(bool bStatusReport, const DataCodingScheme codingScheme) 185e5d0e473Sopenharmony_ci{ 186e5d0e473Sopenharmony_ci smsTpdu_ = std::make_shared<struct SmsTpdu>(); 187e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 188e5d0e473Sopenharmony_ci TELEPHONY_LOGE("Make tPdu is fail."); 189e5d0e473Sopenharmony_ci return; 190e5d0e473Sopenharmony_ci } 191e5d0e473Sopenharmony_ci smsTpdu_->tpduType = SMS_TPDU_SUBMIT; 192e5d0e473Sopenharmony_ci smsTpdu_->data.submit.bHeaderInd = false; 193e5d0e473Sopenharmony_ci smsTpdu_->data.submit.bRejectDup = false; 194e5d0e473Sopenharmony_ci smsTpdu_->data.submit.bStatusReport = bStatusReport; 195e5d0e473Sopenharmony_ci smsTpdu_->data.submit.bReplyPath = false; 196e5d0e473Sopenharmony_ci smsTpdu_->data.submit.msgRef = 0; 197e5d0e473Sopenharmony_ci smsTpdu_->data.submit.dcs.bCompressed = false; 198e5d0e473Sopenharmony_ci smsTpdu_->data.submit.dcs.msgClass = SmsMessageClass::SMS_CLASS_UNKNOWN; 199e5d0e473Sopenharmony_ci smsTpdu_->data.submit.dcs.codingGroup = CODING_GENERAL_GROUP; 200e5d0e473Sopenharmony_ci smsTpdu_->data.submit.dcs.codingScheme = codingScheme; 201e5d0e473Sopenharmony_ci smsTpdu_->data.submit.pid = SMS_NORMAL_PID; 202e5d0e473Sopenharmony_ci smsTpdu_->data.submit.vpf = SMS_VPF_NOT_PRESENT; 203e5d0e473Sopenharmony_ci} 204e5d0e473Sopenharmony_ci 205e5d0e473Sopenharmony_cistd::shared_ptr<struct SmsTpdu> GsmSmsMessage::CreateDefaultSubmitSmsTpdu(const std::string &dest, 206e5d0e473Sopenharmony_ci const std::string &sc, const std::string &text, bool bStatusReport, 207e5d0e473Sopenharmony_ci const DataCodingScheme codingScheme = DATA_CODING_7BIT) 208e5d0e473Sopenharmony_ci{ 209e5d0e473Sopenharmony_ci SetFullText(text); 210e5d0e473Sopenharmony_ci SetSmscAddr(sc); 211e5d0e473Sopenharmony_ci SetDestAddress(dest); 212e5d0e473Sopenharmony_ci CreateDefaultSubmit(bStatusReport, codingScheme); 213e5d0e473Sopenharmony_ci SetSmsTpduDestAddress(smsTpdu_, dest); 214e5d0e473Sopenharmony_ci return smsTpdu_; 215e5d0e473Sopenharmony_ci} 216e5d0e473Sopenharmony_ci 217e5d0e473Sopenharmony_cistd::shared_ptr<struct SmsTpdu> GsmSmsMessage::CreateDataSubmitSmsTpdu(const std::string &desAddr, 218e5d0e473Sopenharmony_ci const std::string &scAddr, int32_t port, const uint8_t *data, uint32_t dataLen, uint8_t msgRef8bit, 219e5d0e473Sopenharmony_ci DataCodingScheme codingType, bool bStatusReport) 220e5d0e473Sopenharmony_ci{ 221e5d0e473Sopenharmony_ci SetSmscAddr(scAddr); 222e5d0e473Sopenharmony_ci SetDestAddress(desAddr); 223e5d0e473Sopenharmony_ci CreateDefaultSubmit(bStatusReport, codingType); 224e5d0e473Sopenharmony_ci SetSmsTpduDestAddress(smsTpdu_, desAddr); 225e5d0e473Sopenharmony_ci int endcodeLen = 0; 226e5d0e473Sopenharmony_ci MSG_LANGUAGE_ID_T langId = MSG_ID_RESERVED_LANG; 227e5d0e473Sopenharmony_ci uint8_t encodeData[(MAX_GSM_7BIT_DATA_LEN * MAX_SEGMENT_NUM) + 1]; 228e5d0e473Sopenharmony_ci if (memset_s(encodeData, sizeof(encodeData), 0x00, sizeof(encodeData)) != EOK) { 229e5d0e473Sopenharmony_ci TELEPHONY_LOGE("failed to initialize!"); 230e5d0e473Sopenharmony_ci return nullptr; 231e5d0e473Sopenharmony_ci } 232e5d0e473Sopenharmony_ci const uint8_t *pMsgText = data; 233e5d0e473Sopenharmony_ci uint8_t *pDestText = encodeData; 234e5d0e473Sopenharmony_ci endcodeLen = TextCoder::Instance().Utf8ToGsm7bit( 235e5d0e473Sopenharmony_ci pDestText, ((MAX_GSM_7BIT_DATA_LEN * MAX_SEGMENT_NUM) + 1), pMsgText, static_cast<int16_t>(dataLen), langId); 236e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 237e5d0e473Sopenharmony_ci TELEPHONY_LOGE("smsTpdu_ is nullptr!"); 238e5d0e473Sopenharmony_ci return nullptr; 239e5d0e473Sopenharmony_ci } 240e5d0e473Sopenharmony_ci if (memset_s(smsTpdu_->data.submit.userData.data, sizeof(smsTpdu_->data.submit.userData.data), 0x00, 241e5d0e473Sopenharmony_ci sizeof(smsTpdu_->data.submit.userData.data)) != EOK) { 242e5d0e473Sopenharmony_ci TELEPHONY_LOGE("memset_s is error!"); 243e5d0e473Sopenharmony_ci return nullptr; 244e5d0e473Sopenharmony_ci } 245e5d0e473Sopenharmony_ci if ((unsigned int)endcodeLen >= sizeof(smsTpdu_->data.submit.userData.data)) { 246e5d0e473Sopenharmony_ci endcodeLen = sizeof(smsTpdu_->data.submit.userData.data) -1; 247e5d0e473Sopenharmony_ci if (memcpy_s(smsTpdu_->data.submit.userData.data, sizeof(smsTpdu_->data.submit.userData.data), encodeData, 248e5d0e473Sopenharmony_ci sizeof(smsTpdu_->data.submit.userData.data)) != EOK) { 249e5d0e473Sopenharmony_ci TELEPHONY_LOGE("memcpy_s is error!"); 250e5d0e473Sopenharmony_ci return nullptr; 251e5d0e473Sopenharmony_ci } 252e5d0e473Sopenharmony_ci } else { 253e5d0e473Sopenharmony_ci if (memcpy_s(smsTpdu_->data.submit.userData.data, sizeof(smsTpdu_->data.submit.userData.data), encodeData, 254e5d0e473Sopenharmony_ci endcodeLen) != EOK) { 255e5d0e473Sopenharmony_ci TELEPHONY_LOGE("memcpy_s is error!"); 256e5d0e473Sopenharmony_ci return nullptr; 257e5d0e473Sopenharmony_ci } 258e5d0e473Sopenharmony_ci } 259e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.data[endcodeLen] = 0; 260e5d0e473Sopenharmony_ci smsTpdu_->data.submit.userData.length = (int)dataLen; 261e5d0e473Sopenharmony_ci smsTpdu_->data.submit.msgRef = msgRef8bit; 262e5d0e473Sopenharmony_ci return smsTpdu_; 263e5d0e473Sopenharmony_ci} 264e5d0e473Sopenharmony_ci 265e5d0e473Sopenharmony_cistd::shared_ptr<struct EncodeInfo> GsmSmsMessage::GetSubmitEncodeInfo(const std::string &sc, bool bMore) 266e5d0e473Sopenharmony_ci{ 267e5d0e473Sopenharmony_ci uint8_t encodeSmscAddr[MAX_SMSC_LEN]; 268e5d0e473Sopenharmony_ci if (memset_s(encodeSmscAddr, sizeof(encodeSmscAddr), 0x00, sizeof(encodeSmscAddr)) != EOK) { 269e5d0e473Sopenharmony_ci TELEPHONY_LOGE("memset_s error."); 270e5d0e473Sopenharmony_ci return nullptr; 271e5d0e473Sopenharmony_ci } 272e5d0e473Sopenharmony_ci 273e5d0e473Sopenharmony_ci uint8_t encodeSmscLen = 0; 274e5d0e473Sopenharmony_ci if ((!sc.empty()) && (sc.length() < MAX_SMSC_LEN)) { 275e5d0e473Sopenharmony_ci struct AddressNumber pAddress; 276e5d0e473Sopenharmony_ci if (memset_s(&pAddress.address, sizeof(pAddress.address), 0x00, sizeof(pAddress.address)) != EOK) { 277e5d0e473Sopenharmony_ci TELEPHONY_LOGE("GetSubmitEncodeInfo memset_s error!"); 278e5d0e473Sopenharmony_ci return nullptr; 279e5d0e473Sopenharmony_ci } 280e5d0e473Sopenharmony_ci if (sc.length() > sizeof(pAddress.address)) { 281e5d0e473Sopenharmony_ci return nullptr; 282e5d0e473Sopenharmony_ci } 283e5d0e473Sopenharmony_ci if (memcpy_s(&pAddress.address, sizeof(pAddress.address), sc.data(), sc.length()) != EOK) { 284e5d0e473Sopenharmony_ci TELEPHONY_LOGE("GetSubmitEncodeInfo memcpy_s error!"); 285e5d0e473Sopenharmony_ci return nullptr; 286e5d0e473Sopenharmony_ci } 287e5d0e473Sopenharmony_ci pAddress.address[sc.length()] = '\0'; 288e5d0e473Sopenharmony_ci if (sc[0] == '+') { 289e5d0e473Sopenharmony_ci pAddress.ton = TYPE_INTERNATIONAL; 290e5d0e473Sopenharmony_ci } else { 291e5d0e473Sopenharmony_ci pAddress.ton = TYPE_UNKNOWN; 292e5d0e473Sopenharmony_ci } 293e5d0e473Sopenharmony_ci pAddress.npi = SMS_NPI_ISDN; /* app cannot set this value */ 294e5d0e473Sopenharmony_ci GsmSmsParamCodec codec; 295e5d0e473Sopenharmony_ci encodeSmscLen = codec.EncodeSmscPdu(&pAddress, encodeSmscAddr, sizeof(encodeSmscAddr)); 296e5d0e473Sopenharmony_ci } 297e5d0e473Sopenharmony_ci return GetSubmitEncodeInfoPartData(encodeSmscAddr, encodeSmscLen, bMore); 298e5d0e473Sopenharmony_ci} 299e5d0e473Sopenharmony_ci 300e5d0e473Sopenharmony_cistd::shared_ptr<struct EncodeInfo> GsmSmsMessage::GetSubmitEncodeInfoPartData( 301e5d0e473Sopenharmony_ci uint8_t *encodeSmscAddr, uint8_t encodeSmscLen, bool bMore) 302e5d0e473Sopenharmony_ci{ 303e5d0e473Sopenharmony_ci std::shared_ptr<struct EncodeInfo> info = std::make_shared<struct EncodeInfo>(); 304e5d0e473Sopenharmony_ci auto tpduCodec = std::make_shared<GsmSmsTpduCodec>(); 305e5d0e473Sopenharmony_ci if (tpduCodec == nullptr) { 306e5d0e473Sopenharmony_ci TELEPHONY_LOGE("tpduCodec nullptr."); 307e5d0e473Sopenharmony_ci return nullptr; 308e5d0e473Sopenharmony_ci } 309e5d0e473Sopenharmony_ci char tpduBuf[MAX_TPDU_DATA_LEN]; 310e5d0e473Sopenharmony_ci if (memset_s(tpduBuf, sizeof(tpduBuf), 0x00, sizeof(tpduBuf)) != EOK) { 311e5d0e473Sopenharmony_ci TELEPHONY_LOGE("memset_s error."); 312e5d0e473Sopenharmony_ci return nullptr; 313e5d0e473Sopenharmony_ci } 314e5d0e473Sopenharmony_ci 315e5d0e473Sopenharmony_ci uint16_t bufLen = 0; 316e5d0e473Sopenharmony_ci bool ret = tpduCodec->EncodeSmsPdu(smsTpdu_, tpduBuf, sizeof(tpduBuf), bufLen); 317e5d0e473Sopenharmony_ci if (ret && bufLen > 0 && info != nullptr) { 318e5d0e473Sopenharmony_ci if (encodeSmscLen > sizeof(info->smcaData_)) { 319e5d0e473Sopenharmony_ci TELEPHONY_LOGE("GetSubmitEncodeInfo data length invalid."); 320e5d0e473Sopenharmony_ci return nullptr; 321e5d0e473Sopenharmony_ci } 322e5d0e473Sopenharmony_ci if (memcpy_s(info->smcaData_, sizeof(info->smcaData_), encodeSmscAddr, encodeSmscLen) != EOK) { 323e5d0e473Sopenharmony_ci TELEPHONY_LOGE("GetSubmitEncodeInfo encodeSmscAddr memcpy_s error!"); 324e5d0e473Sopenharmony_ci return nullptr; 325e5d0e473Sopenharmony_ci } 326e5d0e473Sopenharmony_ci if (memcpy_s(info->tpduData_, sizeof(info->tpduData_), tpduBuf, bufLen) != EOK) { 327e5d0e473Sopenharmony_ci TELEPHONY_LOGE("GetSubmitEncodeInfo memcpy_s error!"); 328e5d0e473Sopenharmony_ci return nullptr; 329e5d0e473Sopenharmony_ci } 330e5d0e473Sopenharmony_ci info->smcaLen = encodeSmscLen; 331e5d0e473Sopenharmony_ci info->tpduLen = bufLen; 332e5d0e473Sopenharmony_ci info->isMore_ = bMore; 333e5d0e473Sopenharmony_ci } 334e5d0e473Sopenharmony_ci return info; 335e5d0e473Sopenharmony_ci} 336e5d0e473Sopenharmony_ci 337e5d0e473Sopenharmony_cistd::shared_ptr<struct SmsTpdu> GsmSmsMessage::CreateDeliverSmsTpdu() 338e5d0e473Sopenharmony_ci{ 339e5d0e473Sopenharmony_ci smsTpdu_ = std::make_shared<struct SmsTpdu>(); 340e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 341e5d0e473Sopenharmony_ci TELEPHONY_LOGE("Make smsTpdu fail."); 342e5d0e473Sopenharmony_ci return smsTpdu_; 343e5d0e473Sopenharmony_ci } 344e5d0e473Sopenharmony_ci smsTpdu_->tpduType = SMS_TPDU_DELIVER; 345e5d0e473Sopenharmony_ci smsTpdu_->data.deliver.bHeaderInd = false; 346e5d0e473Sopenharmony_ci return smsTpdu_; 347e5d0e473Sopenharmony_ci} 348e5d0e473Sopenharmony_ci 349e5d0e473Sopenharmony_cistd::shared_ptr<struct SmsTpdu> GsmSmsMessage::CreateDeliverReportSmsTpdu() 350e5d0e473Sopenharmony_ci{ 351e5d0e473Sopenharmony_ci smsTpdu_ = std::make_shared<struct SmsTpdu>(); 352e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 353e5d0e473Sopenharmony_ci TELEPHONY_LOGE("Make smsTpdu fail."); 354e5d0e473Sopenharmony_ci return smsTpdu_; 355e5d0e473Sopenharmony_ci } 356e5d0e473Sopenharmony_ci smsTpdu_->tpduType = SMS_TPDU_DELIVER_REP; 357e5d0e473Sopenharmony_ci smsTpdu_->data.deliverRep.bHeaderInd = false; 358e5d0e473Sopenharmony_ci smsTpdu_->data.deliverRep.paramInd = 0x00; 359e5d0e473Sopenharmony_ci return smsTpdu_; 360e5d0e473Sopenharmony_ci} 361e5d0e473Sopenharmony_ci 362e5d0e473Sopenharmony_cistd::shared_ptr<struct SmsTpdu> GsmSmsMessage::CreateStatusReportSmsTpdu() 363e5d0e473Sopenharmony_ci{ 364e5d0e473Sopenharmony_ci smsTpdu_ = std::make_shared<struct SmsTpdu>(); 365e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 366e5d0e473Sopenharmony_ci TELEPHONY_LOGE("Make smsTpdu fail."); 367e5d0e473Sopenharmony_ci return smsTpdu_; 368e5d0e473Sopenharmony_ci } 369e5d0e473Sopenharmony_ci smsTpdu_->tpduType = SMS_TPDU_STATUS_REP; 370e5d0e473Sopenharmony_ci return smsTpdu_; 371e5d0e473Sopenharmony_ci} 372e5d0e473Sopenharmony_ci 373e5d0e473Sopenharmony_cistd::shared_ptr<GsmSmsMessage> GsmSmsMessage::CreateMessage(const std::string &pdu) 374e5d0e473Sopenharmony_ci{ 375e5d0e473Sopenharmony_ci std::shared_ptr<GsmSmsMessage> message = std::make_shared<GsmSmsMessage>(); 376e5d0e473Sopenharmony_ci if (message == nullptr) { 377e5d0e473Sopenharmony_ci TELEPHONY_LOGE("Make message fail."); 378e5d0e473Sopenharmony_ci return message; 379e5d0e473Sopenharmony_ci } 380e5d0e473Sopenharmony_ci message->smsTpdu_ = std::make_shared<struct SmsTpdu>(); 381e5d0e473Sopenharmony_ci if (message->smsTpdu_ == nullptr) { 382e5d0e473Sopenharmony_ci TELEPHONY_LOGE("Make smsTpdu fail."); 383e5d0e473Sopenharmony_ci return message; 384e5d0e473Sopenharmony_ci } 385e5d0e473Sopenharmony_ci (void)memset_s(message->smsTpdu_.get(), sizeof(struct SmsTpdu), 0x00, sizeof(struct SmsTpdu)); 386e5d0e473Sopenharmony_ci std::string pduData = StringUtils::HexToString(pdu); 387e5d0e473Sopenharmony_ci message->rawPdu_ = StringUtils::HexToByteVector(pdu); 388e5d0e473Sopenharmony_ci if (message->PduAnalysis(pduData)) { 389e5d0e473Sopenharmony_ci return message; 390e5d0e473Sopenharmony_ci } 391e5d0e473Sopenharmony_ci return nullptr; 392e5d0e473Sopenharmony_ci} 393e5d0e473Sopenharmony_ci 394e5d0e473Sopenharmony_cibool GsmSmsMessage::PduAnalysis(const string &pdu) 395e5d0e473Sopenharmony_ci{ 396e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr || pdu.empty() || pdu.length() > MAX_TPDU_DATA_LEN) { 397e5d0e473Sopenharmony_ci TELEPHONY_LOGE("GsmSmsMessage::PduAnalysis smsTpdu is null"); 398e5d0e473Sopenharmony_ci return false; 399e5d0e473Sopenharmony_ci } 400e5d0e473Sopenharmony_ci struct AddressNumber smsc; 401e5d0e473Sopenharmony_ci if (memset_s(&smsc, sizeof(struct AddressNumber), 0x00, sizeof(struct AddressNumber)) != EOK) { 402e5d0e473Sopenharmony_ci TELEPHONY_LOGE("PduAnalysis memset_s error!"); 403e5d0e473Sopenharmony_ci return false; 404e5d0e473Sopenharmony_ci } 405e5d0e473Sopenharmony_ci GsmSmsParamCodec codec; 406e5d0e473Sopenharmony_ci uint8_t smscLen = codec.DecodeSmscPdu(reinterpret_cast<const uint8_t *>(pdu.c_str()), pdu.length(), smsc); 407e5d0e473Sopenharmony_ci if (smscLen >= pdu.length()) { 408e5d0e473Sopenharmony_ci TELEPHONY_LOGE("PduAnalysis pdu is invalid!"); 409e5d0e473Sopenharmony_ci return false; 410e5d0e473Sopenharmony_ci } else if (smscLen > 0) { 411e5d0e473Sopenharmony_ci scAddress_ = smsc.address; 412e5d0e473Sopenharmony_ci } 413e5d0e473Sopenharmony_ci uint8_t tempPdu[TAPI_TEXT_SIZE_MAX + 1] = { 0 }; 414e5d0e473Sopenharmony_ci if (sizeof(tempPdu) + smscLen < pdu.length()) { 415e5d0e473Sopenharmony_ci TELEPHONY_LOGE("pdu length exceed maxinum"); 416e5d0e473Sopenharmony_ci return false; 417e5d0e473Sopenharmony_ci } 418e5d0e473Sopenharmony_ci if (memcpy_s(tempPdu, sizeof(tempPdu), (pdu.c_str() + smscLen), pdu.length() - smscLen) != EOK) { 419e5d0e473Sopenharmony_ci TELEPHONY_LOGE("PduAnalysis memset_s error!"); 420e5d0e473Sopenharmony_ci return false; 421e5d0e473Sopenharmony_ci } 422e5d0e473Sopenharmony_ci auto tpduCodec = std::make_shared<GsmSmsTpduCodec>(); 423e5d0e473Sopenharmony_ci if (!tpduCodec->DecodeSmsPdu(tempPdu, pdu.length() - smscLen, smsTpdu_.get())) { 424e5d0e473Sopenharmony_ci TELEPHONY_LOGE("DecodeSmsPdu fail"); 425e5d0e473Sopenharmony_ci return false; 426e5d0e473Sopenharmony_ci } 427e5d0e473Sopenharmony_ci return PduAnalysisMsg(); 428e5d0e473Sopenharmony_ci} 429e5d0e473Sopenharmony_ci 430e5d0e473Sopenharmony_cibool GsmSmsMessage::PduAnalysisMsg() 431e5d0e473Sopenharmony_ci{ 432e5d0e473Sopenharmony_ci bool result = true; 433e5d0e473Sopenharmony_ci switch (smsTpdu_->tpduType) { 434e5d0e473Sopenharmony_ci case SMS_TPDU_DELIVER: 435e5d0e473Sopenharmony_ci AnalysisMsgDeliver(smsTpdu_->data.deliver); 436e5d0e473Sopenharmony_ci break; 437e5d0e473Sopenharmony_ci case SMS_TPDU_STATUS_REP: 438e5d0e473Sopenharmony_ci AnalysisMsgStatusReport(smsTpdu_->data.statusRep); 439e5d0e473Sopenharmony_ci break; 440e5d0e473Sopenharmony_ci case SMS_TPDU_SUBMIT: 441e5d0e473Sopenharmony_ci AnalysisMsgSubmit(smsTpdu_->data.submit); 442e5d0e473Sopenharmony_ci break; 443e5d0e473Sopenharmony_ci default: 444e5d0e473Sopenharmony_ci TELEPHONY_LOGE("tpduType is unknown."); 445e5d0e473Sopenharmony_ci result = false; 446e5d0e473Sopenharmony_ci break; 447e5d0e473Sopenharmony_ci } 448e5d0e473Sopenharmony_ci return result; 449e5d0e473Sopenharmony_ci} 450e5d0e473Sopenharmony_ci 451e5d0e473Sopenharmony_civoid GsmSmsMessage::AnalysisMsgDeliver(const SmsDeliver &deliver) 452e5d0e473Sopenharmony_ci{ 453e5d0e473Sopenharmony_ci protocolId_ = (int)(deliver.pid); 454e5d0e473Sopenharmony_ci hasReplyPath_ = deliver.bReplyPath; 455e5d0e473Sopenharmony_ci bStatusReportMessage_ = deliver.bStatusReport; 456e5d0e473Sopenharmony_ci bMoreMsg_ = deliver.bMoreMsg; 457e5d0e473Sopenharmony_ci bHeaderInd_ = deliver.bHeaderInd; 458e5d0e473Sopenharmony_ci originatingAddress_ = deliver.originAddress.address; 459e5d0e473Sopenharmony_ci headerCnt_ = deliver.userData.headerCnt; 460e5d0e473Sopenharmony_ci ConvertMsgTimeStamp(deliver.timeStamp); 461e5d0e473Sopenharmony_ci ConvertMessageDcs(); 462e5d0e473Sopenharmony_ci ConvertUserData(); 463e5d0e473Sopenharmony_ci} 464e5d0e473Sopenharmony_ci 465e5d0e473Sopenharmony_civoid GsmSmsMessage::AnalysisMsgStatusReport(const SmsStatusReport &statusRep) 466e5d0e473Sopenharmony_ci{ 467e5d0e473Sopenharmony_ci protocolId_ = (int)(statusRep.pid); 468e5d0e473Sopenharmony_ci msgRef_ = statusRep.msgRef; 469e5d0e473Sopenharmony_ci bMoreMsg_ = statusRep.bMoreMsg; 470e5d0e473Sopenharmony_ci bStatusReportMessage_ = statusRep.bStatusReport; 471e5d0e473Sopenharmony_ci bHeaderInd_ = statusRep.bHeaderInd; 472e5d0e473Sopenharmony_ci status_ = statusRep.status; 473e5d0e473Sopenharmony_ci ConvertMsgTimeStamp(statusRep.timeStamp); 474e5d0e473Sopenharmony_ci ConvertMessageDcs(); 475e5d0e473Sopenharmony_ci ConvertUserData(); 476e5d0e473Sopenharmony_ci} 477e5d0e473Sopenharmony_ci 478e5d0e473Sopenharmony_civoid GsmSmsMessage::AnalysisMsgSubmit(const SmsSubmit &submit) 479e5d0e473Sopenharmony_ci{ 480e5d0e473Sopenharmony_ci protocolId_ = static_cast<int>(submit.pid); 481e5d0e473Sopenharmony_ci hasReplyPath_ = submit.bReplyPath; 482e5d0e473Sopenharmony_ci msgRef_ = submit.msgRef; 483e5d0e473Sopenharmony_ci bStatusReportMessage_ = submit.bStatusReport; 484e5d0e473Sopenharmony_ci bHeaderInd_ = submit.bHeaderInd; 485e5d0e473Sopenharmony_ci ConvertMsgTimeStamp(submit.validityPeriod); 486e5d0e473Sopenharmony_ci ConvertMessageDcs(); 487e5d0e473Sopenharmony_ci ConvertUserData(); 488e5d0e473Sopenharmony_ci} 489e5d0e473Sopenharmony_ci 490e5d0e473Sopenharmony_civoid GsmSmsMessage::ConvertMessageDcs() 491e5d0e473Sopenharmony_ci{ 492e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr) { 493e5d0e473Sopenharmony_ci TELEPHONY_LOGE("GsmSmsMessage::ConvertMessageDcs smsTpdu is null"); 494e5d0e473Sopenharmony_ci return; 495e5d0e473Sopenharmony_ci } 496e5d0e473Sopenharmony_ci switch (smsTpdu_->tpduType) { 497e5d0e473Sopenharmony_ci case SMS_TPDU_DELIVER: 498e5d0e473Sopenharmony_ci bCompressed_ = smsTpdu_->data.deliver.dcs.bCompressed; 499e5d0e473Sopenharmony_ci codingScheme_ = smsTpdu_->data.deliver.dcs.codingScheme; 500e5d0e473Sopenharmony_ci codingGroup_ = smsTpdu_->data.deliver.dcs.codingGroup; 501e5d0e473Sopenharmony_ci bIndActive_ = smsTpdu_->data.deliver.dcs.bIndActive; 502e5d0e473Sopenharmony_ci bMwi_ = smsTpdu_->data.deliver.dcs.bMWI; 503e5d0e473Sopenharmony_ci bMwiSense_ = smsTpdu_->data.deliver.dcs.bIndActive; /* Indicates vmail notification set/clear */ 504e5d0e473Sopenharmony_ci ConvertMessageClass(smsTpdu_->data.deliver.dcs.msgClass); 505e5d0e473Sopenharmony_ci break; 506e5d0e473Sopenharmony_ci case SMS_TPDU_STATUS_REP: 507e5d0e473Sopenharmony_ci bCompressed_ = smsTpdu_->data.statusRep.dcs.bCompressed; 508e5d0e473Sopenharmony_ci codingScheme_ = smsTpdu_->data.statusRep.dcs.codingScheme; 509e5d0e473Sopenharmony_ci codingGroup_ = smsTpdu_->data.statusRep.dcs.codingGroup; 510e5d0e473Sopenharmony_ci bIndActive_ = smsTpdu_->data.statusRep.dcs.bIndActive; 511e5d0e473Sopenharmony_ci ConvertMessageClass(smsTpdu_->data.statusRep.dcs.msgClass); 512e5d0e473Sopenharmony_ci break; 513e5d0e473Sopenharmony_ci case SMS_TPDU_SUBMIT: 514e5d0e473Sopenharmony_ci bCompressed_ = smsTpdu_->data.submit.dcs.bCompressed; 515e5d0e473Sopenharmony_ci codingScheme_ = smsTpdu_->data.submit.dcs.codingScheme; 516e5d0e473Sopenharmony_ci codingGroup_ = smsTpdu_->data.submit.dcs.codingGroup; 517e5d0e473Sopenharmony_ci bIndActive_ = smsTpdu_->data.submit.dcs.bIndActive; 518e5d0e473Sopenharmony_ci bMwi_ = smsTpdu_->data.submit.dcs.bMWI; 519e5d0e473Sopenharmony_ci bMwiSense_ = smsTpdu_->data.submit.dcs.bIndActive; 520e5d0e473Sopenharmony_ci ConvertMessageClass(smsTpdu_->data.submit.dcs.msgClass); 521e5d0e473Sopenharmony_ci break; 522e5d0e473Sopenharmony_ci default: 523e5d0e473Sopenharmony_ci break; 524e5d0e473Sopenharmony_ci } 525e5d0e473Sopenharmony_ci} 526e5d0e473Sopenharmony_ci 527e5d0e473Sopenharmony_civoid GsmSmsMessage::ConvertUserData() 528e5d0e473Sopenharmony_ci{ 529e5d0e473Sopenharmony_ci int ret = 0; 530e5d0e473Sopenharmony_ci if (smsTpdu_ == nullptr || 531e5d0e473Sopenharmony_ci (memset_s(&smsUserData_, sizeof(struct SmsUDPackage), 0x00, sizeof(struct SmsUDPackage)) != EOK)) { 532e5d0e473Sopenharmony_ci TELEPHONY_LOGE("nullptr or memset_s error."); 533e5d0e473Sopenharmony_ci return; 534e5d0e473Sopenharmony_ci } 535e5d0e473Sopenharmony_ci size_t udLen = sizeof(SmsUDPackage); 536e5d0e473Sopenharmony_ci size_t tpduLen = sizeof(SmsTpud); 537e5d0e473Sopenharmony_ci switch (smsTpdu_->tpduType) { 538e5d0e473Sopenharmony_ci case SMS_TPDU_DELIVER: 539e5d0e473Sopenharmony_ci headerDataLen_ = smsTpdu_->data.deliver.userData.length; 540e5d0e473Sopenharmony_ci ret = memcpy_s(&smsUserData_, udLen, &(smsTpdu_->data.deliver.userData), udLen); 541e5d0e473Sopenharmony_ci if (ret == EOK) { 542e5d0e473Sopenharmony_ci ret = memcpy_s(&smsWapPushUserData_, tpduLen, &(smsTpdu_->data.deliver.udData), tpduLen); 543e5d0e473Sopenharmony_ci } 544e5d0e473Sopenharmony_ci break; 545e5d0e473Sopenharmony_ci case SMS_TPDU_STATUS_REP: 546e5d0e473Sopenharmony_ci headerDataLen_ = smsTpdu_->data.statusRep.userData.length; 547e5d0e473Sopenharmony_ci ret = memcpy_s(&smsUserData_, udLen, &(smsTpdu_->data.statusRep.userData), udLen); 548e5d0e473Sopenharmony_ci break; 549e5d0e473Sopenharmony_ci case SMS_TPDU_SUBMIT: 550e5d0e473Sopenharmony_ci headerDataLen_ = smsTpdu_->data.submit.userData.length; 551e5d0e473Sopenharmony_ci ret = memcpy_s(&smsUserData_, udLen, &(smsTpdu_->data.submit.userData), udLen); 552e5d0e473Sopenharmony_ci break; 553e5d0e473Sopenharmony_ci default: 554e5d0e473Sopenharmony_ci break; 555e5d0e473Sopenharmony_ci } 556e5d0e473Sopenharmony_ci if (ret != EOK) { 557e5d0e473Sopenharmony_ci TELEPHONY_LOGE("memset_s error."); 558e5d0e473Sopenharmony_ci return; 559e5d0e473Sopenharmony_ci } 560e5d0e473Sopenharmony_ci ConvertUserPartData(); 561e5d0e473Sopenharmony_ci} 562e5d0e473Sopenharmony_ci 563e5d0e473Sopenharmony_civoid GsmSmsMessage::ConvertUserPartData() 564e5d0e473Sopenharmony_ci{ 565e5d0e473Sopenharmony_ci if (smsUserData_.length == 0) { 566e5d0e473Sopenharmony_ci TELEPHONY_LOGE("user data length error."); 567e5d0e473Sopenharmony_ci return; 568e5d0e473Sopenharmony_ci } 569e5d0e473Sopenharmony_ci uint8_t buff[MAX_MSG_TEXT_LEN + 1] = { 0 }; 570e5d0e473Sopenharmony_ci if (codingScheme_ == DATA_CODING_7BIT) { 571e5d0e473Sopenharmony_ci MsgLangInfo langInfo; 572e5d0e473Sopenharmony_ci auto langId = smsUserData_.header[0].udh.singleShift.langId; 573e5d0e473Sopenharmony_ci if (langId != 0) { 574e5d0e473Sopenharmony_ci langInfo.bSingleShift = true; 575e5d0e473Sopenharmony_ci langInfo.singleLang = langId; 576e5d0e473Sopenharmony_ci } 577e5d0e473Sopenharmony_ci int dataSize = TextCoder::Instance().Gsm7bitToUtf8( 578e5d0e473Sopenharmony_ci buff, MAX_MSG_TEXT_LEN, reinterpret_cast<uint8_t *>(smsUserData_.data), smsUserData_.length, langInfo); 579e5d0e473Sopenharmony_ci visibleMessageBody_.insert(0, reinterpret_cast<char *>(buff), dataSize); 580e5d0e473Sopenharmony_ci } else if (codingScheme_ == DATA_CODING_UCS2) { 581e5d0e473Sopenharmony_ci int dataSize = TextCoder::Instance().Ucs2ToUtf8( 582e5d0e473Sopenharmony_ci buff, MAX_MSG_TEXT_LEN, reinterpret_cast<uint8_t *>(smsUserData_.data), smsUserData_.length); 583e5d0e473Sopenharmony_ci visibleMessageBody_.insert(0, reinterpret_cast<char *>(buff), dataSize); 584e5d0e473Sopenharmony_ci } else if (codingScheme_ == DATA_CODING_8BIT) { 585e5d0e473Sopenharmony_ci visibleMessageBody_.insert(0, static_cast<char *>(smsUserData_.data), smsUserData_.length); 586e5d0e473Sopenharmony_ci } 587e5d0e473Sopenharmony_ci rawUserData_.insert(0, static_cast<char *>(smsUserData_.data), smsUserData_.length); 588e5d0e473Sopenharmony_ci rawWapPushUserData_.insert(0, smsWapPushUserData_.ud, smsWapPushUserData_.udl); 589e5d0e473Sopenharmony_ci} 590e5d0e473Sopenharmony_ci 591e5d0e473Sopenharmony_civoid GsmSmsMessage::SetFullText(const std::string &text) 592e5d0e473Sopenharmony_ci{ 593e5d0e473Sopenharmony_ci fullText_ = text; 594e5d0e473Sopenharmony_ci} 595e5d0e473Sopenharmony_ci 596e5d0e473Sopenharmony_civoid GsmSmsMessage::SetDestAddress(const std::string &address) 597e5d0e473Sopenharmony_ci{ 598e5d0e473Sopenharmony_ci destAddress_ = address; 599e5d0e473Sopenharmony_ci} 600e5d0e473Sopenharmony_ci 601e5d0e473Sopenharmony_civoid GsmSmsMessage::SetDestPort(uint32_t port) 602e5d0e473Sopenharmony_ci{ 603e5d0e473Sopenharmony_ci destPort_ = port; 604e5d0e473Sopenharmony_ci} 605e5d0e473Sopenharmony_ci 606e5d0e473Sopenharmony_cistd::string GsmSmsMessage::GetFullText() const 607e5d0e473Sopenharmony_ci{ 608e5d0e473Sopenharmony_ci return fullText_; 609e5d0e473Sopenharmony_ci} 610e5d0e473Sopenharmony_ci 611e5d0e473Sopenharmony_cistd::string GsmSmsMessage::GetReplyAddress() const 612e5d0e473Sopenharmony_ci{ 613e5d0e473Sopenharmony_ci return replyAddress_; 614e5d0e473Sopenharmony_ci} 615e5d0e473Sopenharmony_ci 616e5d0e473Sopenharmony_cistd::string GsmSmsMessage::GetDestAddress() const 617e5d0e473Sopenharmony_ci{ 618e5d0e473Sopenharmony_ci return destAddress_; 619e5d0e473Sopenharmony_ci} 620e5d0e473Sopenharmony_ci 621e5d0e473Sopenharmony_ciuint16_t GsmSmsMessage::GetDestPort() 622e5d0e473Sopenharmony_ci{ 623e5d0e473Sopenharmony_ci std::shared_ptr<SmsAppPortAddr> portAddress = GetPortAddress(); 624e5d0e473Sopenharmony_ci if (portAddress == nullptr) { 625e5d0e473Sopenharmony_ci TELEPHONY_LOGE("PortAddress is null!"); 626e5d0e473Sopenharmony_ci return DEFAULT_PORT; 627e5d0e473Sopenharmony_ci } 628e5d0e473Sopenharmony_ci destPort_ = static_cast<uint16_t>(portAddress->destPort); 629e5d0e473Sopenharmony_ci return destPort_; 630e5d0e473Sopenharmony_ci} 631e5d0e473Sopenharmony_ci 632e5d0e473Sopenharmony_cibool GsmSmsMessage::GetIsSmsText() const 633e5d0e473Sopenharmony_ci{ 634e5d0e473Sopenharmony_ci return bSmsText_; 635e5d0e473Sopenharmony_ci} 636e5d0e473Sopenharmony_ci 637e5d0e473Sopenharmony_cibool GsmSmsMessage::GetGsm() const 638e5d0e473Sopenharmony_ci{ 639e5d0e473Sopenharmony_ci return true; 640e5d0e473Sopenharmony_ci} 641e5d0e473Sopenharmony_ci 642e5d0e473Sopenharmony_cibool GsmSmsMessage::GetIsTypeZeroInd() const 643e5d0e473Sopenharmony_ci{ 644e5d0e473Sopenharmony_ci return (GetProtocolId() == 0x40); 645e5d0e473Sopenharmony_ci} 646e5d0e473Sopenharmony_ci 647e5d0e473Sopenharmony_cibool GsmSmsMessage::GetIsSIMDataTypeDownload() const 648e5d0e473Sopenharmony_ci{ 649e5d0e473Sopenharmony_ci int protocolId = GetProtocolId(); 650e5d0e473Sopenharmony_ci return GetMessageClass() == SMS_SIM_MESSAGE && (protocolId == 0x7f || protocolId == 0x7c); 651e5d0e473Sopenharmony_ci} 652e5d0e473Sopenharmony_ci 653e5d0e473Sopenharmony_civoid GsmSmsMessage::ConvertMsgTimeStamp(const struct SmsTimeStamp ×) 654e5d0e473Sopenharmony_ci{ 655e5d0e473Sopenharmony_ci if (times.format == SMS_TIME_ABSOLUTE) { 656e5d0e473Sopenharmony_ci scTimestamp_ = SmsCommonUtils::ConvertTime(times.time.absolute); 657e5d0e473Sopenharmony_ci } else { 658e5d0e473Sopenharmony_ci scTimestamp_ = time(nullptr); 659e5d0e473Sopenharmony_ci } 660e5d0e473Sopenharmony_ci} 661e5d0e473Sopenharmony_ci 662e5d0e473Sopenharmony_ci// from 3GPP TS 23.040 V5.1.0 9.2.3.24.2 Special SMS Message Indication 663e5d0e473Sopenharmony_cibool GsmSmsMessage::IsSpecialMessage() const 664e5d0e473Sopenharmony_ci{ 665e5d0e473Sopenharmony_ci bool result = false; 666e5d0e473Sopenharmony_ci if (GetIsTypeZeroInd()) { 667e5d0e473Sopenharmony_ci TELEPHONY_LOGI("GsmSmsMessage:: IsTypeZeroInd"); 668e5d0e473Sopenharmony_ci result = true; 669e5d0e473Sopenharmony_ci } 670e5d0e473Sopenharmony_ci // 9.2.3.9 TP Protocol Identifier (TP PID) 671e5d0e473Sopenharmony_ci if (GetIsSIMDataTypeDownload()) { 672e5d0e473Sopenharmony_ci TELEPHONY_LOGI("GsmSmsMessage:: GetIsSIMDataTypeDownload"); 673e5d0e473Sopenharmony_ci result = true; 674e5d0e473Sopenharmony_ci } 675e5d0e473Sopenharmony_ci if (IsMwiSet() || IsMwiClear()) { 676e5d0e473Sopenharmony_ci TELEPHONY_LOGI("GsmSmsMessage::Mwi Message"); 677e5d0e473Sopenharmony_ci result = true; 678e5d0e473Sopenharmony_ci } 679e5d0e473Sopenharmony_ci return result; 680e5d0e473Sopenharmony_ci} 681e5d0e473Sopenharmony_ci 682e5d0e473Sopenharmony_civoid GsmSmsMessage::SetSmsCodingNationalType(SmsCodingNationalType smsCodingNationalType) 683e5d0e473Sopenharmony_ci{ 684e5d0e473Sopenharmony_ci smsCodingNationalType_ = smsCodingNationalType; 685e5d0e473Sopenharmony_ci} 686e5d0e473Sopenharmony_ci 687e5d0e473Sopenharmony_ciint GsmSmsMessage::DecodeMessage(uint8_t *decodeData, unsigned int len, DataCodingScheme &codingType, 688e5d0e473Sopenharmony_ci const std::string &msgText, bool &bAbnormal, MSG_LANGUAGE_ID_T &langId) 689e5d0e473Sopenharmony_ci{ 690e5d0e473Sopenharmony_ci int decodeLen = 0; 691e5d0e473Sopenharmony_ci int dataLen = static_cast<int>(msgText.length()); 692e5d0e473Sopenharmony_ci const unsigned int maxDecodeLen = len; 693e5d0e473Sopenharmony_ci const uint8_t *pMsgText = reinterpret_cast<const uint8_t *>(msgText.c_str()); 694e5d0e473Sopenharmony_ci 695e5d0e473Sopenharmony_ci if (msgText.empty()) { 696e5d0e473Sopenharmony_ci TELEPHONY_LOGE("msgText empty."); 697e5d0e473Sopenharmony_ci return decodeLen; 698e5d0e473Sopenharmony_ci } 699e5d0e473Sopenharmony_ci 700e5d0e473Sopenharmony_ci switch (codingType) { 701e5d0e473Sopenharmony_ci case DATA_CODING_7BIT: { 702e5d0e473Sopenharmony_ci decodeLen = TextCoder::Instance().Utf8ToGsm7bit( 703e5d0e473Sopenharmony_ci decodeData, maxDecodeLen, const_cast<uint8_t *>(pMsgText), dataLen, langId); 704e5d0e473Sopenharmony_ci break; 705e5d0e473Sopenharmony_ci } 706e5d0e473Sopenharmony_ci case DATA_CODING_8BIT: { 707e5d0e473Sopenharmony_ci if (static_cast<unsigned int>(dataLen) > maxDecodeLen) { 708e5d0e473Sopenharmony_ci TELEPHONY_LOGE("DecodeMessage data length invalid."); 709e5d0e473Sopenharmony_ci return decodeLen; 710e5d0e473Sopenharmony_ci } 711e5d0e473Sopenharmony_ci if (memcpy_s(decodeData, maxDecodeLen, pMsgText, dataLen) != EOK) { 712e5d0e473Sopenharmony_ci TELEPHONY_LOGE("SplitMessage SMS_CHARSET_8BIT memcpy_s error!"); 713e5d0e473Sopenharmony_ci return decodeLen; 714e5d0e473Sopenharmony_ci } 715e5d0e473Sopenharmony_ci decodeLen = dataLen; 716e5d0e473Sopenharmony_ci break; 717e5d0e473Sopenharmony_ci } 718e5d0e473Sopenharmony_ci case DATA_CODING_UCS2: { 719e5d0e473Sopenharmony_ci decodeLen = TextCoder::Instance().Utf8ToUcs2(decodeData, maxDecodeLen, pMsgText, dataLen); 720e5d0e473Sopenharmony_ci break; 721e5d0e473Sopenharmony_ci } 722e5d0e473Sopenharmony_ci case DATA_CODING_AUTO: 723e5d0e473Sopenharmony_ci default: { 724e5d0e473Sopenharmony_ci DataCodingScheme encodeType = DATA_CODING_AUTO; 725e5d0e473Sopenharmony_ci decodeLen = TextCoder::Instance().GsmUtf8ToAuto(decodeData, maxDecodeLen, pMsgText, dataLen, 726e5d0e473Sopenharmony_ci encodeType, smsCodingNationalType_, langId); 727e5d0e473Sopenharmony_ci codingType = encodeType; 728e5d0e473Sopenharmony_ci break; 729e5d0e473Sopenharmony_ci } 730e5d0e473Sopenharmony_ci } 731e5d0e473Sopenharmony_ci TELEPHONY_LOGI("DecodeMessage, message coding type is %{public}d", codingType); 732e5d0e473Sopenharmony_ci return decodeLen; 733e5d0e473Sopenharmony_ci} 734e5d0e473Sopenharmony_ci} // namespace Telephony 735e5d0e473Sopenharmony_ci} // namespace OHOS 736