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 &times)
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