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