• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "cdma_sms_sender.h"
17 
18 #include <cinttypes>
19 
20 #include "cdma_sms_message.h"
21 #include "core_manager_inner.h"
22 #include "radio_event.h"
23 #include "securec.h"
24 #include "sms_hisysevent.h"
25 #include "string_utils.h"
26 #include "telephony_log_wrapper.h"
27 
28 namespace OHOS {
29 namespace Telephony {
30 using namespace std;
31 static constexpr uint32_t CDMASMS_MESSAGE_ID_MAX = 65536;
32 static constexpr uint8_t CDMASMS_SEQ_NUM_MAX = 64;
33 
CdmaSmsSender(int32_t slotId,function<void (shared_ptr<SmsSendIndexer>)> sendRetryFun)34 CdmaSmsSender::CdmaSmsSender(int32_t slotId, function<void(shared_ptr<SmsSendIndexer>)> sendRetryFun)
35     : SmsSender(slotId, sendRetryFun)
36 {}
37 
~CdmaSmsSender()38 CdmaSmsSender::~CdmaSmsSender() {}
39 
TextBasedSmsDelivery(const string & desAddr,const string & scAddr,const string & text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback,uint16_t dataBaseId,bool isMmsApp)40 void CdmaSmsSender::TextBasedSmsDelivery(const string &desAddr, const string &scAddr, const string &text,
41     const sptr<ISendShortMessageCallback> &sendCallback,
42     const sptr<IDeliveryShortMessageCallback> &deliveryCallback, uint16_t dataBaseId, bool isMmsApp)
43 {
44     if (isImsNetDomain_ && imsSmsCfg_) {
45         TextBasedSmsDeliveryViaIms(desAddr, scAddr, text, sendCallback, deliveryCallback, dataBaseId, isMmsApp);
46         return;
47     }
48     CdmaSmsMessage message;
49     DataCodingScheme codingType;
50     std::vector<struct SplitInfo> splits;
51     std::string addr;
52     message.SplitMessage(splits, text, CheckForce7BitEncodeType(), codingType, false, addr);
53     if (splits.size() > MAX_SEGMENT_NUM) {
54         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
55         TELEPHONY_LOGE("message exceed the limit.");
56         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
57             SmsMmsErrorCode::SMS_ERROR_EXCEED_MAX_SEGMENT_NUM, "text sms cdma message exceed the limit");
58         return;
59     }
60     bool bStatusReport = (deliveryCallback == nullptr) ? false : true;
61     std::unique_ptr<CdmaTransportMsg> transMsg =
62         message.CreateSubmitTransMsg(desAddr, scAddr, text, bStatusReport, codingType);
63     if (transMsg == nullptr) {
64         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
65         TELEPHONY_LOGE("CreateSubmitTransMsg nullptr fail.");
66         return;
67     }
68     /* 1. Set Reply sequence number. */
69     uint8_t msgRef8bit = GetSeqNum();
70     transMsg->data.p2p.replySeq = msgRef8bit;
71     /* 2. Set msg ID. */
72     uint16_t msgId = GetSubmitMsgId();
73     transMsg->data.p2p.telesvcMsg.data.submit.msgId.msgId = msgId;
74     chrono::system_clock::duration timePoint = chrono::system_clock::now().time_since_epoch();
75     long timeStamp = chrono::duration_cast<chrono::seconds>(timePoint).count();
76     TextBasedSmsSplitDelivery(desAddr, scAddr, splits, std::move(transMsg), msgRef8bit, msgId, timeStamp,
77         sendCallback, deliveryCallback, dataBaseId, isMmsApp);
78 }
79 
TextBasedSmsSplitDelivery(const std::string & desAddr,const std::string & scAddr,std::vector<struct SplitInfo> splits,std::unique_ptr<CdmaTransportMsg> transMsg,uint8_t msgRef8bit,uint16_t msgId,long timeStamp,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback,uint16_t dataBaseId,bool isMmsApp)80 void CdmaSmsSender::TextBasedSmsSplitDelivery(const std::string &desAddr, const std::string &scAddr,
81     std::vector<struct SplitInfo> splits, std::unique_ptr<CdmaTransportMsg> transMsg, uint8_t msgRef8bit,
82     uint16_t msgId, long timeStamp, const sptr<ISendShortMessageCallback> &sendCallback,
83     const sptr<IDeliveryShortMessageCallback> &deliveryCallback, uint16_t dataBaseId, bool isMmsApp)
84 {
85     shared_ptr<bool> hasCellFailed = make_shared<bool>(false);
86     if (hasCellFailed == nullptr) {
87         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
88         return;
89     }
90     for (std::size_t i = 0; i < splits.size(); i++) {
91         (void)memset_s(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data,
92             sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data), 0x00,
93             sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data));
94         if (splits[i].encodeData.size() > sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data)) {
95             TELEPHONY_LOGE("data length invalid");
96             return;
97         }
98         int value = memcpy_s(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data,
99             sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data), splits[i].encodeData.data(),
100             splits[i].encodeData.size());
101         if (value != EOK) {
102             SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
103             return;
104         }
105         std::string segmentText;
106         segmentText.append((char *)(splits[i].encodeData.data()), splits[i].encodeData.size());
107         auto indexer = make_shared<SmsSendIndexer>(desAddr, scAddr, segmentText, sendCallback, deliveryCallback);
108         if (indexer == nullptr) {
109             SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
110             return;
111         }
112         indexer->SetDcs(splits[i].encodeType);
113         SetPduSeqInfo(indexer, splits.size(), transMsg, i, msgRef8bit);
114         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.length =
115             static_cast<int>(splits[i].encodeData.size());
116         /* encode msg data */
117         std::unique_ptr<std::vector<uint8_t>> pdu = EncodeMsg(*transMsg.get());
118         if (pdu == nullptr) {
119             SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
120             return;
121         }
122         indexer->SetEncodePdu(*pdu);
123         UpdateIndexerInfo(indexer, msgRef8bit, splits.size(), hasCellFailed,
124             timeStamp, msgId, isMmsApp, dataBaseId);
125         SendSmsToRil(indexer);
126     }
127 }
128 
UpdateIndexerInfo(shared_ptr<SmsSendIndexer> & indexer,uint8_t msgRef8bit,const uint8_t unSentCellCount,shared_ptr<bool> hasCellFailed,long timeStamp,uint16_t msgId,uint16_t dataBaseId,bool isMmsApp)129 void CdmaSmsSender::UpdateIndexerInfo(
130     shared_ptr<SmsSendIndexer> &indexer,
131     uint8_t msgRef8bit,
132     const uint8_t unSentCellCount,
133     shared_ptr<bool> hasCellFailed,
134     long timeStamp,
135     uint16_t msgId,
136     uint16_t dataBaseId,
137     bool isMmsApp)
138 {
139     indexer->SetMsgRefId(msgRef8bit);
140     indexer->SetNetWorkType(NET_TYPE_CDMA);
141     indexer->SetUnSentCellCount(unSentCellCount);
142     indexer->SetHasCellFailed(hasCellFailed);
143     indexer->SetTimeStamp(timeStamp);
144     indexer->SetMsgId(msgId);
145     indexer->SetDataBaseId(dataBaseId);
146     indexer->SetIsMmsApp(isMmsApp);
147 }
148 
TextBasedSmsDeliveryViaIms(const string & desAddr,const string & scAddr,const string & text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback,uint16_t dataBaseId,bool isMmsApp)149 void CdmaSmsSender::TextBasedSmsDeliveryViaIms(const string &desAddr, const string &scAddr, const string &text,
150     const sptr<ISendShortMessageCallback> &sendCallback, const sptr<IDeliveryShortMessageCallback> &deliveryCallback,
151     uint16_t dataBaseId, bool isMmsApp)
152 {
153     DataCodingScheme codingType;
154     GsmSmsMessage gsmSmsMessage;
155     std::vector<struct SplitInfo> cellsInfos;
156     gsmSmsMessage.SetSmsCodingNationalType(GetSmsCodingNationalType(slotId_));
157     std::string addr;
158     gsmSmsMessage.SplitMessage(cellsInfos, text, CheckForce7BitEncodeType(), codingType, false, addr);
159     bool isStatusReport = (deliveryCallback == nullptr) ? false : true;
160     std::shared_ptr<struct SmsTpdu> tpdu =
161         gsmSmsMessage.CreateDefaultSubmitSmsTpdu(desAddr, scAddr, text, isStatusReport, codingType);
162     int cellsInfosSize = static_cast<int>(cellsInfos.size());
163     shared_ptr<uint8_t> unSentCellCount = make_shared<uint8_t>(cellsInfosSize);
164     shared_ptr<bool> hasCellFailed = make_shared<bool>(false);
165     if (TpduNullOrSmsPageOverNormalOrSmsEncodeFail(cellsInfos, tpdu, unSentCellCount, hasCellFailed, sendCallback)) {
166         return;
167     }
168 
169     std::unique_lock<std::mutex> lock(mutex_);
170     uint8_t msgRef8bit = GetMsgRef8Bit();
171     TELEPHONY_LOGI("cdma text msgRef8bit = %{public}d", msgRef8bit);
172     for (int i = 0; i < cellsInfosSize; i++) {
173         SendSmsForEveryIndexer(i, cellsInfos, desAddr, scAddr, tpdu, gsmSmsMessage, unSentCellCount, hasCellFailed,
174             codingType, msgRef8bit, sendCallback, deliveryCallback, dataBaseId, isMmsApp);
175     }
176     return;
177 }
178 
SendSmsForEveryIndexer(int & i,std::vector<struct SplitInfo> cellsInfos,const string & desAddr,const string & scAddr,std::shared_ptr<struct SmsTpdu> tpdu,GsmSmsMessage gsmSmsMessage,shared_ptr<uint8_t> unSentCellCount,shared_ptr<bool> hasCellFailed,DataCodingScheme codingType,uint8_t msgRef8bit,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback,uint16_t dataBaseId,bool isMmsApp)179 void CdmaSmsSender::SendSmsForEveryIndexer(int &i, std::vector<struct SplitInfo> cellsInfos, const string &desAddr,
180     const string &scAddr, std::shared_ptr<struct SmsTpdu> tpdu, GsmSmsMessage gsmSmsMessage,
181     shared_ptr<uint8_t> unSentCellCount, shared_ptr<bool> hasCellFailed, DataCodingScheme codingType,
182     uint8_t msgRef8bit, const sptr<ISendShortMessageCallback> &sendCallback,
183     const sptr<IDeliveryShortMessageCallback> &deliveryCallback, uint16_t dataBaseId, bool isMmsApp)
184 {
185     std::string segmentText;
186     segmentText.append((char *)(cellsInfos[i].encodeData.data()), cellsInfos[i].encodeData.size());
187     std::shared_ptr<SmsSendIndexer> indexer =
188         make_shared<SmsSendIndexer>(desAddr, scAddr, segmentText, sendCallback, deliveryCallback);
189     if (indexer == nullptr) {
190         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
191         return;
192     }
193     indexer->SetDcs(cellsInfos[i].encodeType);
194     (void)memset_s(tpdu->data.submit.userData.data, MAX_USER_DATA_LEN + 1, 0x00, MAX_USER_DATA_LEN + 1);
195 
196     if (cellsInfos[i].encodeData.size() >= MAX_USER_DATA_LEN + 1) {
197         return;
198     }
199     if (memcpy_s(tpdu->data.submit.userData.data, MAX_USER_DATA_LEN + 1, &cellsInfos[i].encodeData[0],
200         cellsInfos[i].encodeData.size()) != EOK) {
201         SendResultCallBack(indexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
202         return;
203     }
204 
205     tpdu->data.submit.userData.length = cellsInfos[i].encodeData.size();
206     tpdu->data.submit.userData.data[cellsInfos[i].encodeData.size()] = 0;
207     tpdu->data.submit.msgRef = msgRef8bit;
208     int headerCnt = 0;
209     bool isMore = false;
210 
211     int cellsInfosSize = static_cast<int>(cellsInfos.size());
212     if (cellsInfosSize > 1) {
213         indexer->SetIsConcat(true);
214         SmsConcat concat;
215         concat.is8Bits = true;
216         concat.msgRef = msgRef8bit;
217         concat.totalSeg = static_cast<uint16_t>(cellsInfosSize);
218         concat.seqNum = static_cast<uint16_t>(i + 1);
219         indexer->SetSmsConcat(concat);
220         headerCnt += gsmSmsMessage.SetHeaderConcat(headerCnt, concat);
221     }
222 
223     /* Set User Data Header for Alternate Reply Address */
224     headerCnt += gsmSmsMessage.SetHeaderReply(headerCnt);
225     /* Set User Data Header for National Language Single Shift */
226     headerCnt += gsmSmsMessage.SetHeaderLang(headerCnt, codingType, cellsInfos[i].langId);
227     indexer->SetLangId(cellsInfos[i].langId);
228     indexer->SetIsMmsApp(isMmsApp);
229     indexer->SetDataBaseId(dataBaseId);
230     tpdu->data.submit.userData.headerCnt = headerCnt;
231     tpdu->data.submit.bHeaderInd = (headerCnt > 0) ? true : false;
232 
233     if (cellsInfosSize > 1 && i < (cellsInfosSize - 1)) {
234         tpdu->data.submit.bStatusReport = false;
235         isMore = true;
236     } else {
237         tpdu->data.submit.bStatusReport = (deliveryCallback == nullptr) ? false : true;
238     }
239     ReadySendSms(gsmSmsMessage, scAddr, isMore, indexer, msgRef8bit, unSentCellCount, hasCellFailed);
240 }
241 
ReadySendSms(GsmSmsMessage gsmSmsMessage,const string & scAddr,bool isMore,std::shared_ptr<SmsSendIndexer> indexer,uint8_t msgRef8bit,shared_ptr<uint8_t> unSentCellCount,shared_ptr<bool> hasCellFailed)242 void CdmaSmsSender::ReadySendSms(GsmSmsMessage gsmSmsMessage, const string &scAddr, bool isMore,
243     std::shared_ptr<SmsSendIndexer> indexer, uint8_t msgRef8bit, shared_ptr<uint8_t> unSentCellCount,
244     shared_ptr<bool> hasCellFailed)
245 {
246     std::shared_ptr<struct EncodeInfo> encodeInfo = gsmSmsMessage.GetSubmitEncodeInfo(scAddr, isMore);
247     if (encodeInfo == nullptr) {
248         SendResultCallBack(indexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
249         TELEPHONY_LOGE("create encodeInfo encodeInfo nullptr error.");
250         return;
251     }
252 
253     SetSendIndexerInfo(indexer, encodeInfo, msgRef8bit);
254     indexer->SetUnSentCellCount(*unSentCellCount);
255     indexer->SetHasCellFailed(hasCellFailed);
256     indexer->SetImsSmsForCdma(true);
257     SendSmsToRil(indexer);
258 }
259 
TpduNullOrSmsPageOverNormalOrSmsEncodeFail(std::vector<struct SplitInfo> cellsInfos,std::shared_ptr<struct SmsTpdu> tpdu,shared_ptr<uint8_t> unSentCellCount,shared_ptr<bool> hasCellFailed,const sptr<ISendShortMessageCallback> & sendCallback)260 bool CdmaSmsSender::TpduNullOrSmsPageOverNormalOrSmsEncodeFail(std::vector<struct SplitInfo> cellsInfos,
261     std::shared_ptr<struct SmsTpdu> tpdu, shared_ptr<uint8_t> unSentCellCount, shared_ptr<bool> hasCellFailed,
262     const sptr<ISendShortMessageCallback> &sendCallback)
263 {
264     if (tpdu == nullptr) {
265         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
266         TELEPHONY_LOGE("TextBasedSmsDelivery tpdu nullptr error.");
267         return true;
268     }
269 
270     int cellsInfosSize = static_cast<int>(cellsInfos.size());
271     if (cellsInfosSize > MAX_SEGMENT_NUM) {
272         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
273         TELEPHONY_LOGE("message exceed the limit.");
274         return true;
275     }
276 
277     bool isStatusReport = tpdu->data.submit.bStatusReport;
278     TELEPHONY_LOGI("TextBasedSmsDelivery isStatusReport= %{public}d", isStatusReport);
279     if (unSentCellCount == nullptr || hasCellFailed == nullptr) {
280         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
281         return true;
282     }
283     return false;
284 }
285 
SetSendIndexerInfo(const std::shared_ptr<SmsSendIndexer> & indexer,const std::shared_ptr<struct EncodeInfo> & encodeInfo,uint8_t msgRef8bit)286 void CdmaSmsSender::SetSendIndexerInfo(const std::shared_ptr<SmsSendIndexer> &indexer,
287     const std::shared_ptr<struct EncodeInfo> &encodeInfo, uint8_t msgRef8bit)
288 {
289     if (encodeInfo == nullptr || indexer == nullptr) {
290         TELEPHONY_LOGE("CdmaSmsSender::SetSendIndexerInfo encodeInfo nullptr");
291         return;
292     }
293 
294     std::vector<uint8_t> smca(encodeInfo->smcaData_, encodeInfo->smcaData_ + encodeInfo->smcaLen);
295     std::vector<uint8_t> pdu(encodeInfo->tpduData_, encodeInfo->tpduData_ + encodeInfo->tpduLen);
296     chrono::system_clock::duration timePoint = chrono::system_clock::now().time_since_epoch();
297     long timeStamp = chrono::duration_cast<chrono::seconds>(timePoint).count();
298     indexer->SetTimeStamp(timeStamp);
299     indexer->SetEncodeSmca(std::move(smca));
300     indexer->SetEncodePdu(std::move(pdu));
301     indexer->SetHasMore(encodeInfo->isMore_);
302     indexer->SetMsgRefId(msgRef8bit);
303     indexer->SetNetWorkType(NET_TYPE_CDMA);
304 }
305 
SetPduSeqInfo(const std::shared_ptr<SmsSendIndexer> & smsIndexer,const std::size_t size,const std::unique_ptr<CdmaTransportMsg> & transMsg,const std::size_t index,const uint8_t msgRef8bit)306 void CdmaSmsSender::SetPduSeqInfo(const std::shared_ptr<SmsSendIndexer> &smsIndexer, const std::size_t size,
307     const std::unique_ptr<CdmaTransportMsg> &transMsg, const std::size_t index, const uint8_t msgRef8bit)
308 {
309     if (size > 1) {
310         smsIndexer->SetIsConcat(true);
311         SmsConcat smsConcat;
312         transMsg->data.p2p.teleserviceId = static_cast<uint16_t>(SmsTransTelsvcId::WEMT);
313         transMsg->data.p2p.telesvcMsg.data.submit.msgId.headerInd = true;
314         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.headerCnt = 1;
315         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udhType = UDH_CONCAT_8BIT;
316         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udh.concat8bit.msgRef = msgRef8bit;
317         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udh.concat8bit.totalSeg =
318             static_cast<uint8_t>(size);
319         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udh.concat8bit.seqNum = index + 1;
320         smsConcat.msgRef = msgRef8bit;
321         smsConcat.seqNum = index + 1;
322         smsConcat.totalSeg = static_cast<uint8_t>(size);
323         smsConcat.is8Bits = true;
324         smsIndexer->SetSmsConcat(smsConcat);
325     }
326 }
327 
DataBasedSmsDelivery(const string & desAddr,const string & scAddr,int32_t port,const uint8_t * data,uint32_t dataLen,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)328 void CdmaSmsSender::DataBasedSmsDelivery(const string &desAddr, const string &scAddr, int32_t port, const uint8_t *data,
329     uint32_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
330     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
331 {
332     if (isImsNetDomain_ && imsSmsCfg_) {
333         DataBasedSmsDeliveryViaIms(desAddr, scAddr, port, data, dataLen, sendCallback, deliveryCallback);
334         return;
335     }
336     CdmaSmsMessage message;
337     DataCodingScheme codingType;
338     std::vector<struct SplitInfo> splits;
339     std::string text((char *)data, dataLen);
340     std::string addr;
341     message.SplitMessage(splits, text, false, codingType, true, addr);
342     if (splits.size() == 0) {
343         TELEPHONY_LOGE("splits fail.");
344         return;
345     }
346     std::unique_ptr<CdmaTransportMsg> transMsg = nullptr;
347     bool bStatusReport = (deliveryCallback == nullptr) ? false : true;
348     transMsg = message.CreateSubmitTransMsg(desAddr, scAddr, port, data, dataLen, bStatusReport);
349     if (transMsg == nullptr) {
350         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
351         TELEPHONY_LOGE("CreateSubmitTransMsg nullptr fail.");
352         return;
353     }
354     /* Set Reply sequence number. */
355     uint8_t msgRef8bit = GetSeqNum();
356     transMsg->data.p2p.replySeq = msgRef8bit;
357     /* Set msg ID. */
358     uint16_t msgId = GetSubmitMsgId();
359     transMsg->data.p2p.telesvcMsg.data.submit.msgId.msgId = msgId;
360     /* while user data header isn't exist, headerInd must be set false. */
361     transMsg->data.p2p.telesvcMsg.data.submit.msgId.headerInd = true;
362     transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.length = static_cast<int>(splits[0].encodeData.size());
363     if (splits[0].encodeData.size() > sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data)) {
364         TELEPHONY_LOGE("DataBasedSmsDelivery data length invalid.");
365         return;
366     }
367     if (memcpy_s(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data,
368         sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data), splits[0].encodeData.data(),
369         splits[0].encodeData.size()) != EOK) {
370         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
371         TELEPHONY_LOGE("memcpy_s return error.");
372         return;
373     }
374     std::shared_ptr<SmsSendIndexer> indexer = make_shared<SmsSendIndexer>(desAddr, scAddr, port,
375         splits[0].encodeData.data(), splits[0].encodeData.size(), sendCallback, deliveryCallback);
376     EncodeMsgData(std::move(transMsg), indexer, msgRef8bit, sendCallback);
377 }
378 
EncodeMsgData(std::unique_ptr<CdmaTransportMsg> transMsg,std::shared_ptr<SmsSendIndexer> indexer,uint8_t msgRef8bit,const sptr<ISendShortMessageCallback> & sendCallback)379 void CdmaSmsSender::EncodeMsgData(std::unique_ptr<CdmaTransportMsg> transMsg, std::shared_ptr<SmsSendIndexer> indexer,
380     uint8_t msgRef8bit, const sptr<ISendShortMessageCallback> &sendCallback)
381 {
382     /* encode msg data */
383     SmsWriteBuffer pduBuffer;
384     std::unique_ptr<CdmaSmsTransportMessage> msg = CdmaSmsTransportMessage::CreateTransportMessage(*transMsg.get());
385     if (msg == nullptr || msg->IsEmpty() || !msg->Encode(pduBuffer)) {
386         TELEPHONY_LOGE("EncodeMsg Error");
387         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
388         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
389             SmsMmsErrorCode::SMS_ERROR_PDU_ENCODEING_FAIL, "cdma encode msg error");
390         return;
391     }
392 
393     const uint8_t segmentCount = 1;
394     shared_ptr<uint8_t> unSentCellCount = make_shared<uint8_t>(segmentCount);
395     shared_ptr<bool> hasCellFailed = make_shared<bool>(false);
396     std::unique_ptr<std::vector<uint8_t>> pdu = pduBuffer.GetPduBuffer();
397     if (indexer == nullptr || unSentCellCount == nullptr || hasCellFailed == nullptr || pdu == nullptr) {
398         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
399         TELEPHONY_LOGE("Init SmsSend Indexer Error.");
400         return;
401     }
402     indexer->SetEncodePdu(*pdu);
403     indexer->SetMsgRefId(msgRef8bit);
404     indexer->SetNetWorkType(NET_TYPE_CDMA);
405     indexer->SetUnSentCellCount(*unSentCellCount);
406     indexer->SetHasCellFailed(hasCellFailed);
407     chrono::system_clock::duration timePoint = chrono::system_clock::now().time_since_epoch();
408     long timeStamp = chrono::duration_cast<chrono::seconds>(timePoint).count();
409     indexer->SetTimeStamp(timeStamp);
410     uint16_t msgId = GetSubmitMsgId();
411     indexer->SetMsgId(msgId);
412     SendSmsToRil(indexer);
413 }
414 
DataBasedSmsDeliveryViaIms(const string & desAddr,const string & scAddr,int32_t port,const uint8_t * data,uint32_t dataLen,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)415 void CdmaSmsSender::DataBasedSmsDeliveryViaIms(const string &desAddr, const string &scAddr, int32_t port,
416     const uint8_t *data, uint32_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
417     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
418 {
419     GsmSmsMessage gsmSmsMessage;
420     std::vector<struct SplitInfo> cellsInfos;
421     DataCodingScheme codingType;
422     std::string dataStr;
423     CharArrayToString(data, dataLen, dataStr);
424     gsmSmsMessage.SetSmsCodingNationalType(GetSmsCodingNationalType(slotId_));
425     gsmSmsMessage.SplitMessage(cellsInfos, dataStr, CheckForce7BitEncodeType(), codingType, true, desAddr);
426     uint8_t msgRef8bit = GetMsgRef8Bit();
427     TELEPHONY_LOGI("cdma data msgRef8bit = %{public}d", msgRef8bit);
428     std::shared_ptr<struct SmsTpdu> tpdu = gsmSmsMessage.CreateDataSubmitSmsTpdu(
429         desAddr, scAddr, port, data, dataLen, msgRef8bit, codingType, (deliveryCallback == nullptr) ? false : true);
430     if (tpdu == nullptr) {
431         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
432         TELEPHONY_LOGE("tpdu nullptr error.");
433         return;
434     }
435     DataBasedSmsDeliverySplitPage(
436         gsmSmsMessage, cellsInfos, tpdu, msgRef8bit, desAddr, scAddr, port, sendCallback, deliveryCallback);
437 }
438 
StatusReportAnalysis(const AppExecFwk::InnerEvent::Pointer & event)439 void CdmaSmsSender::StatusReportAnalysis(const AppExecFwk::InnerEvent::Pointer &event)
440 {
441     if (event == nullptr) {
442         TELEPHONY_LOGE("cdma_sms_sender: StatusReportAnalysis event nullptr error.");
443         return;
444     }
445     std::shared_ptr<SmsReceiveIndexer> statusInfo = event->GetSharedObject<SmsReceiveIndexer>();
446     if (statusInfo == nullptr) {
447         TELEPHONY_LOGE("cdma_sms_sender: StatusReportAnalysis statusInfo nullptr error.");
448         return;
449     }
450     std::string pdu = StringUtils::StringToHex(statusInfo->GetPdu());
451     std::shared_ptr<CdmaSmsMessage> message = CdmaSmsMessage::CreateMessage(pdu);
452     if (message == nullptr) {
453         TELEPHONY_LOGE("message is nullptr.");
454         return;
455     }
456     sptr<IDeliveryShortMessageCallback> deliveryCallback = nullptr;
457     auto oldIndexer = reportList_.begin();
458     while (oldIndexer != reportList_.end()) {
459         auto iter = oldIndexer++;
460         if (*iter != nullptr) {
461             if (message->GetMsgRef() == (*iter)->GetMsgRefId()) {
462                 // save the message to db, or updata to db msg state(success or fail)
463                 deliveryCallback = (*iter)->GetDeliveryCallback();
464                 reportList_.erase(iter);
465             }
466         }
467     }
468     if (deliveryCallback != nullptr) {
469         std::string ackpdu = StringUtils::StringToHex(message->GetRawPdu());
470         deliveryCallback->OnSmsDeliveryResult(StringUtils::ToUtf16(ackpdu));
471         TELEPHONY_LOGI("gsm_sms_sender: StatusReportAnalysis %{private}s", pdu.c_str());
472     }
473 }
474 
SendSmsToRil(const shared_ptr<SmsSendIndexer> & smsIndexer)475 void CdmaSmsSender::SendSmsToRil(const shared_ptr<SmsSendIndexer> &smsIndexer)
476 {
477     if (smsIndexer == nullptr) {
478         TELEPHONY_LOGE("cdma_sms_sender: SendSms smsIndexer nullptr");
479         return;
480     }
481     if ((!isImsNetDomain_ && voiceServiceState_ != static_cast<int32_t>(RegServiceState::REG_STATE_IN_SERVICE))) {
482         SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_SERVICE_UNAVAILABLE);
483         TELEPHONY_LOGE("cdma_sms_sender: SendSms not in service");
484         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
485             SmsMmsErrorCode::SMS_ERROR_SENDSMS_NOT_IN_SERVICE, "cdma send sms not in service");
486         return;
487     }
488     int64_t refId = GetMsgRef64Bit();
489     TELEPHONY_LOGI("cdma refId = %{public}" PRId64 "", refId);
490     if (!SendCacheMapAddItem(refId, smsIndexer)) {
491         TELEPHONY_LOGE("SendCacheMapAddItem Error!!");
492     }
493 
494     std::string pdu = StringUtils::StringToHex(smsIndexer->GetEncodePdu());
495     bool sendImsSMS = smsIndexer->IsImsSmsForCdma();
496     if (smsIndexer->GetPsResendCount() < MAX_SEND_RETRIES) {
497         sendImsSMS = true;
498     }
499 
500     if (sendImsSMS) {
501         SendImsSms(smsIndexer, refId, pdu);
502     } else {
503         SendCsSms(smsIndexer, refId, pdu);
504     }
505 }
506 
SendCsSms(const shared_ptr<SmsSendIndexer> & smsIndexer,int64_t & refId,std::string & pdu)507 void CdmaSmsSender::SendCsSms(const shared_ptr<SmsSendIndexer> &smsIndexer, int64_t &refId, std::string &pdu)
508 {
509     lastSmsDomain_ = CS_DOMAIN;
510     CoreManagerInner::GetInstance().SendCdmaSms(
511         slotId_, RadioEvent::RADIO_SEND_CDMA_SMS, pdu, refId, shared_from_this());
512     TELEPHONY_LOGI("SendCsSms pdu = %{private}s", pdu.c_str());
513 }
514 
SendImsSms(const shared_ptr<SmsSendIndexer> & smsIndexer,int64_t & refId,std::string & pdu)515 void CdmaSmsSender::SendImsSms(const shared_ptr<SmsSendIndexer> &smsIndexer, int64_t &refId, std::string &pdu)
516 {
517     TELEPHONY_LOGI("ims network domain send sms interface.!");
518     auto smsClient = DelayedSingleton<ImsSmsClient>::GetInstance();
519     if (smsClient == nullptr) {
520         TELEPHONY_LOGE("SendImsSms return, ImsSmsClient is nullptr.");
521         return;
522     }
523     lastSmsDomain_ = IMS_DOMAIN;
524     ImsMessageInfo imsMessageInfo;
525     imsMessageInfo.refId = refId;
526     imsMessageInfo.smscPdu = StringUtils::StringToHex(smsIndexer->GetEncodeSmca());
527     imsMessageInfo.pdu = pdu;
528     imsMessageInfo.tech = SMS_RADIO_TECH_3GPP;
529     int32_t reply = smsClient->ImsSendMessage(slotId_, imsMessageInfo);
530     TELEPHONY_LOGI("SendImsSms reply = %{public}d", reply);
531 }
532 
IsImsSmsSupported(int32_t slotId,bool & isSupported)533 int32_t CdmaSmsSender::IsImsSmsSupported(int32_t slotId, bool &isSupported)
534 {
535     auto smsClient = DelayedSingleton<ImsSmsClient>::GetInstance();
536     if (smsClient == nullptr) {
537         TELEPHONY_LOGE("IsImsSmsSupported return, ImsSmsClient is nullptr.");
538         return TELEPHONY_ERR_LOCAL_PTR_NULL;
539     }
540     std::unique_lock<std::mutex> lck(ctx_);
541     resIsSmsReady_ = false;
542     int32_t reply = smsClient->ImsGetSmsConfig(slotId);
543     TELEPHONY_LOGI("IsImsSmsSupported reply = %{public}d", reply);
544     while (resIsSmsReady_) {
545         TELEPHONY_LOGI("IsImsSmsSupported::wait(), resIsSmsReady_ = false");
546         if (cv_.wait_for(lck, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
547             break;
548         }
549     }
550     TELEPHONY_LOGI("CdmaSmsSender::IsImsSmsSupported(), imsSmsCfg_:%{public}d", imsSmsCfg_);
551     isSupported = (imsSmsCfg_ == IMS_SMS_ENABLE);
552     return TELEPHONY_ERR_SUCCESS;
553 }
554 
StatusReportSetImsSms(const AppExecFwk::InnerEvent::Pointer & event)555 void CdmaSmsSender::StatusReportSetImsSms(const AppExecFwk::InnerEvent::Pointer &event)
556 {
557     if (event == nullptr) {
558         TELEPHONY_LOGE("cdma_sms_sender: StatusReportSetImsSms event nullptr error.");
559         return;
560     }
561     std::shared_ptr<RadioResponseInfo> imsResponseInfo = event->GetSharedObject<RadioResponseInfo>();
562     if (imsResponseInfo == nullptr) {
563         TELEPHONY_LOGE("imsResponseInfo is nullptr error.");
564         return;
565     }
566     if (imsResponseInfo->error != ErrType::NONE) {
567         imsSmsCfg_ = IMS_SMS_DISABLE;
568     }
569 }
570 
StatusReportGetImsSms(const AppExecFwk::InnerEvent::Pointer & event)571 void CdmaSmsSender::StatusReportGetImsSms(const AppExecFwk::InnerEvent::Pointer &event)
572 {
573     if (event == nullptr) {
574         TELEPHONY_LOGE("CdmaSmsSender: StatusReportGetImsSms event nullptr error.");
575         return;
576     }
577     std::shared_ptr<int32_t> imsSmsInfo = event->GetSharedObject<int32_t>();
578     if (imsSmsInfo == nullptr) {
579         TELEPHONY_LOGE("CdmaSmsSender: StatusReportGetImsSms imsSmsInfo nullptr error.");
580         return;
581     }
582     imsSmsCfg_ = *imsSmsInfo;
583 }
584 
Init()585 void CdmaSmsSender::Init() {}
586 
ReceiveStatusReport(const std::shared_ptr<SmsReceiveIndexer> & smsIndexer)587 void CdmaSmsSender::ReceiveStatusReport(const std::shared_ptr<SmsReceiveIndexer> &smsIndexer)
588 {
589     SendEvent(RadioEvent::RADIO_SMS_STATUS, smsIndexer);
590 }
591 
RegisterImsHandler()592 void CdmaSmsSender::RegisterImsHandler()
593 {
594     if (isImsCdmaHandlerRegistered) {
595         return;
596     }
597     auto smsClient = DelayedSingleton<ImsSmsClient>::GetInstance();
598     if (smsClient == nullptr) {
599         TELEPHONY_LOGE("RegisterHandler return, ImsSmsClient is nullptr.");
600         return;
601     }
602     smsClient->RegisterImsSmsCallbackHandler(slotId_, shared_from_this());
603     TELEPHONY_LOGE("RegisterHandler  gsm ImsSmsClient successs");
604     isImsCdmaHandlerRegistered = true;
605 }
606 
GetSeqNum()607 uint8_t CdmaSmsSender::GetSeqNum()
608 {
609     msgSeqNum_ = ((msgSeqNum_ + 1) % CDMASMS_SEQ_NUM_MAX);
610     return msgSeqNum_;
611 }
612 
GetSubmitMsgId()613 uint8_t CdmaSmsSender::GetSubmitMsgId()
614 {
615     msgSubmitId_ = ((msgSubmitId_ + 1) % CDMASMS_MESSAGE_ID_MAX);
616     return msgSubmitId_;
617 }
618 
EncodeMsg(CdmaTransportMsg & transMsg)619 std::unique_ptr<std::vector<uint8_t>> CdmaSmsSender::EncodeMsg(CdmaTransportMsg &transMsg)
620 {
621     std::unique_ptr<CdmaSmsTransportMessage> msg = CdmaSmsTransportMessage::CreateTransportMessage(transMsg);
622     SmsWriteBuffer pduBuffer;
623     if (msg == nullptr || msg->IsEmpty() || !msg->Encode(pduBuffer)) {
624         TELEPHONY_LOGE("encode msg error");
625         return nullptr;
626     }
627     return pduBuffer.GetPduBuffer();
628 }
629 
ResendTextDelivery(const std::shared_ptr<SmsSendIndexer> & smsIndexer)630 void CdmaSmsSender::ResendTextDelivery(const std::shared_ptr<SmsSendIndexer> &smsIndexer)
631 {
632     if (smsIndexer == nullptr) {
633         TELEPHONY_LOGE("smsIndexer is nullptr!!");
634         return;
635     }
636     CdmaSmsMessage message;
637     DataCodingScheme codingType = smsIndexer->GetDcs();
638     std::unique_ptr<CdmaTransportMsg> transMsg = nullptr;
639     bool bStatusReport = (smsIndexer->GetDeliveryCallback() == nullptr) ? false : true;
640     transMsg = message.CreateSubmitTransMsg(
641         smsIndexer->GetDestAddr(), smsIndexer->GetSmcaAddr(), smsIndexer->GetText(), bStatusReport, codingType);
642     if (transMsg == nullptr) {
643         SendResultCallBack(smsIndexer->GetSendCallback(), ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
644         TELEPHONY_LOGE("CreateSubmitTransMsg nullptr fail.");
645         return;
646     }
647     /* 1. Set Reply sequence number. */
648     uint8_t msgRef8bit = smsIndexer->GetMsgRefId();
649     transMsg->data.p2p.replySeq = msgRef8bit;
650     /* 2. Set msg ID. */
651     transMsg->data.p2p.telesvcMsg.data.submit.msgId.msgId = smsIndexer->GetMsgId();
652     chrono::system_clock::duration timePoint = chrono::system_clock::now().time_since_epoch();
653     long timeStamp = chrono::duration_cast<chrono::seconds>(timePoint).count();
654     smsIndexer->SetTimeStamp(timeStamp);
655     transMsg->data.p2p.telesvcMsg.data.submit.userData.encodeType = SmsEncodingType::OCTET;
656     (void)memset_s(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data,
657         sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data), 0x00,
658         sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data));
659     if (smsIndexer->GetText().length() > sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data)) {
660         TELEPHONY_LOGE("ResendTextDelivery data length invalid.");
661         return;
662     }
663     if (memcpy_s(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data,
664         sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data), smsIndexer->GetText().data(),
665         smsIndexer->GetText().length()) != EOK) {
666         SendResultCallBack(smsIndexer->GetSendCallback(), ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
667         return;
668     }
669     SetConcact(smsIndexer, transMsg);
670     /* encode msg data */
671     std::unique_ptr<std::vector<uint8_t>> pdu = EncodeMsg(*transMsg.get());
672     if (pdu == nullptr) {
673         SendResultCallBack(smsIndexer->GetSendCallback(), ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
674         return;
675     }
676     smsIndexer->SetEncodePdu(*pdu);
677     smsIndexer->SetNetWorkType(NET_TYPE_CDMA);
678     smsIndexer->SetTimeStamp(timeStamp);
679     SendSmsToRil(smsIndexer);
680 }
681 
ResendDataDelivery(const std::shared_ptr<SmsSendIndexer> & smsIndexer)682 void CdmaSmsSender::ResendDataDelivery(const std::shared_ptr<SmsSendIndexer> &smsIndexer)
683 {
684     if (smsIndexer == nullptr) {
685         TELEPHONY_LOGI("ResendDataDelivery::smsIndexer is nullptr error.");
686         return;
687     }
688 
689     CdmaSmsMessage message;
690     std::unique_ptr<CdmaTransportMsg> transMsg = nullptr;
691     bool bStatusReport = (smsIndexer->GetDeliveryCallback() == nullptr) ? false : true;
692     transMsg = message.CreateSubmitTransMsg(smsIndexer->GetDestAddr(), smsIndexer->GetSmcaAddr(),
693         smsIndexer->GetDestPort(), smsIndexer->GetData().data(), smsIndexer->GetData().size(), bStatusReport);
694     if (transMsg == nullptr) {
695         SendResultCallBack(smsIndexer->GetSendCallback(), ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
696         TELEPHONY_LOGE("CreateSubmitTransMsg nullptr fail.");
697         return;
698     }
699     /* Set Reply sequence number. */
700     uint8_t msgRef8bit = smsIndexer->GetMsgRefId();
701     transMsg->data.p2p.replySeq = msgRef8bit;
702     /* Set msg ID. */
703     transMsg->data.p2p.telesvcMsg.data.submit.msgId.msgId = smsIndexer->GetMsgId();
704     /* while user data header isn't exist, headerInd must be set false. */
705     transMsg->data.p2p.telesvcMsg.data.submit.msgId.headerInd = true;
706 
707     chrono::system_clock::duration timePoint = chrono::system_clock::now().time_since_epoch();
708     long timeStamp = chrono::duration_cast<chrono::seconds>(timePoint).count();
709     transMsg->data.p2p.telesvcMsg.data.submit.userData.encodeType = SmsEncodingType::OCTET;
710     if (smsIndexer->GetData().size() > sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data)) {
711         TELEPHONY_LOGE("ResendDataDelivery data length invalid.");
712         return;
713     }
714     if (memcpy_s(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data,
715         sizeof(transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.data), smsIndexer->GetData().data(),
716         smsIndexer->GetData().size()) != EOK) {
717         SendResultCallBack(smsIndexer->GetSendCallback(), ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
718         return;
719     }
720 
721     transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.length = static_cast<int>(smsIndexer->GetData().size());
722     /* encode msg data */
723     std::unique_ptr<std::vector<uint8_t>> pdu = EncodeMsg(*transMsg.get());
724     if (pdu == nullptr) {
725         SendResultCallBack(smsIndexer->GetSendCallback(), ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
726         return;
727     }
728     smsIndexer->SetEncodePdu(*pdu);
729     smsIndexer->SetNetWorkType(NET_TYPE_CDMA);
730     smsIndexer->SetTimeStamp(timeStamp);
731     SendSmsToRil(smsIndexer);
732 }
733 
SetConcact(const std::shared_ptr<SmsSendIndexer> & smsIndexer,const std::unique_ptr<CdmaTransportMsg> & transMsg)734 void CdmaSmsSender::SetConcact(
735     const std::shared_ptr<SmsSendIndexer> &smsIndexer, const std::unique_ptr<CdmaTransportMsg> &transMsg)
736 {
737     if (smsIndexer->GetIsConcat()) {
738         SmsConcat smsConcat = smsIndexer->GetSmsConcat();
739         transMsg->data.p2p.teleserviceId = static_cast<uint16_t>(SmsTransTelsvcId::WEMT);
740         transMsg->data.p2p.telesvcMsg.data.submit.msgId.headerInd = true;
741         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.headerCnt = 1;
742         if (smsConcat.is8Bits) {
743             transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udhType = UDH_CONCAT_8BIT;
744         } else {
745             transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udhType = UDH_CONCAT_16BIT;
746         }
747         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udh.concat8bit.msgRef = smsConcat.msgRef;
748         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udh.concat8bit.totalSeg =
749             smsConcat.totalSeg;
750         transMsg->data.p2p.telesvcMsg.data.submit.userData.userData.header[0].udh.concat8bit.seqNum = smsConcat.seqNum;
751     }
752 }
753 } // namespace Telephony
754 } // namespace OHOS
755