• 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 "gsm_sms_sender.h"
17 
18 #include <cinttypes>
19 
20 #include "core_manager_inner.h"
21 #include "radio_event.h"
22 #include "satellite_sms_client.h"
23 #include "securec.h"
24 #include "sms_hisysevent.h"
25 #include "telephony_log_wrapper.h"
26 
27 namespace OHOS {
28 namespace Telephony {
29 using namespace std;
GsmSmsSender(int32_t slotId,function<void (std::shared_ptr<SmsSendIndexer>)> sendRetryFun)30 GsmSmsSender::GsmSmsSender(int32_t slotId, function<void(std::shared_ptr<SmsSendIndexer>)> sendRetryFun)
31     : SmsSender(slotId, sendRetryFun)
32 {}
33 
~GsmSmsSender()34 GsmSmsSender::~GsmSmsSender() {}
35 
Init()36 void GsmSmsSender::Init()
37 {
38     if (!RegisterHandler()) {
39         TELEPHONY_LOGI("GsmSmsSender::Init Register RADIO_SMS_STATUS fail.");
40     }
41 }
42 
TextBasedSmsDelivery(const string & desAddr,const string & scAddr,const string & text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback,uint16_t dataBaseId,bool isMmsApp)43 void GsmSmsSender::TextBasedSmsDelivery(const string &desAddr, const string &scAddr, const string &text,
44     const sptr<ISendShortMessageCallback> &sendCallback,
45     const sptr<IDeliveryShortMessageCallback> &deliveryCallback, uint16_t dataBaseId, bool isMmsApp)
46 {
47     DataCodingScheme codingType;
48     GsmSmsMessage gsmSmsMessage;
49     std::vector<struct SplitInfo> cellsInfos;
50     gsmSmsMessage.SetSmsCodingNationalType(GetSmsCodingNationalType(slotId_));
51     std::string addr;
52     gsmSmsMessage.SplitMessage(cellsInfos, text, CheckForce7BitEncodeType(), codingType, false, addr);
53     bool isStatusReport = (deliveryCallback == nullptr) ? false : true;
54     std::shared_ptr<struct SmsTpdu> tpdu =
55         gsmSmsMessage.CreateDefaultSubmitSmsTpdu(desAddr, scAddr, text, isStatusReport, codingType);
56     if (tpdu == nullptr) {
57         SendCallbackExceptionCase(sendCallback, "TextBasedSmsDelivery");
58         return;
59     }
60     int cellsInfosSize = static_cast<int>(cellsInfos.size());
61     if (cellsInfosSize > MAX_SEGMENT_NUM) {
62         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
63         TELEPHONY_LOGE("message exceed the limit.");
64         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
65             SmsMmsErrorCode::SMS_ERROR_EXCEED_MAX_SEGMENT_NUM, "text sms gsm message cellsInfosSize exceed the limit");
66         return;
67     }
68     isStatusReport = tpdu->data.submit.bStatusReport;
69 
70     TELEPHONY_LOGI("TextBasedSmsDelivery isStatusReport= %{public}d", isStatusReport);
71     std::unique_lock<std::mutex> lock(mutex_);
72     TextBasedSmsSplitDelivery(desAddr, scAddr, cellsInfos, codingType, isStatusReport, tpdu,
73         gsmSmsMessage, sendCallback, deliveryCallback, dataBaseId, isMmsApp);
74 }
75 
TextBasedSmsSplitDelivery(const std::string & desAddr,const std::string & scAddr,std::vector<struct SplitInfo> cellsInfos,DataCodingScheme codingType,bool isStatusReport,std::shared_ptr<struct SmsTpdu> tpdu,GsmSmsMessage & gsmSmsMessage,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback,uint16_t dataBaseId,bool isMmsApp)76 void GsmSmsSender::TextBasedSmsSplitDelivery(const std::string &desAddr, const std::string &scAddr,
77     std::vector<struct SplitInfo> cellsInfos, DataCodingScheme codingType, bool isStatusReport,
78     std::shared_ptr<struct SmsTpdu> tpdu, GsmSmsMessage &gsmSmsMessage,
79     const sptr<ISendShortMessageCallback> &sendCallback, const sptr<IDeliveryShortMessageCallback> &deliveryCallback,
80     uint16_t dataBaseId, bool isMmsApp)
81 {
82     int cellsInfosSize = static_cast<int>(cellsInfos.size());
83     unsigned char msgRef8bit = GetMsgRef8Bit();
84     shared_ptr<uint8_t> unSentCellCount = make_shared<uint8_t>(cellsInfosSize);
85     shared_ptr<bool> hasCellFailed = make_shared<bool>(false);
86     if (unSentCellCount == nullptr || hasCellFailed == nullptr) {
87         SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
88         return;
89     }
90     for (int i = 0; i < cellsInfosSize; i++) {
91         std::shared_ptr<SmsSendIndexer> indexer = nullptr;
92         std::string segmentText;
93         segmentText.append((char *)(cellsInfos[i].encodeData.data()), cellsInfos[i].encodeData.size());
94         indexer = make_shared<SmsSendIndexer>(desAddr, scAddr, segmentText, sendCallback, deliveryCallback);
95         if (indexer == nullptr) {
96             SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
97             return;
98         }
99         indexer->SetDcs(cellsInfos[i].encodeType);
100         indexer->SetDataBaseId(dataBaseId);
101         indexer->SetIsMmsApp(isMmsApp);
102         (void)memset_s(tpdu->data.submit.userData.data, MAX_USER_DATA_LEN + 1, 0x00, MAX_USER_DATA_LEN + 1);
103         if (cellsInfos[i].encodeData.size() > MAX_USER_DATA_LEN + 1) {
104             TELEPHONY_LOGE("TextBasedSmsDelivery data length invalid.");
105             return;
106         }
107         int ret = memcpy_s(tpdu->data.submit.userData.data, MAX_USER_DATA_LEN + 1, &cellsInfos[i].encodeData[0],
108             cellsInfos[i].encodeData.size());
109         if (ret != EOK) {
110             SendResultCallBack(indexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
111             return;
112         }
113         tpdu->data.submit.userData.length = cellsInfos[i].encodeData.size();
114         tpdu->data.submit.userData.data[cellsInfos[i].encodeData.size()] = 0;
115         tpdu->data.submit.msgRef = msgRef8bit;
116         int headerCnt = 0;
117         if (cellsInfosSize > 1) {
118             indexer->SetIsConcat(true);
119             SmsConcat concat;
120             concat.msgRef = msgRef8bit;
121             concat.totalSeg = static_cast<uint16_t>(cellsInfosSize);
122             concat.seqNum = static_cast<uint16_t>(i + 1);
123             indexer->SetSmsConcat(concat);
124             headerCnt += gsmSmsMessage.SetHeaderConcat(headerCnt, concat);
125             concat.is8Bits = true;
126         }
127         /* Set User Data Header for Alternate Reply Address */
128         headerCnt += gsmSmsMessage.SetHeaderReply(headerCnt);
129         /* Set User Data Header for National Language Single Shift */
130         headerCnt += gsmSmsMessage.SetHeaderLang(headerCnt, codingType, cellsInfos[i].langId);
131         indexer->SetLangId(cellsInfos[i].langId);
132         tpdu->data.submit.userData.headerCnt = headerCnt;
133         tpdu->data.submit.bHeaderInd = (headerCnt > 0) ? true : false;
134         bool isMore = false;
135         if (cellsInfosSize > 1 && i < (cellsInfosSize - 1)) {
136             isMore = true;
137             tpdu->data.submit.bStatusReport = false;
138         } else {
139             tpdu->data.submit.bStatusReport = isStatusReport;
140             isMore = false;
141         }
142         std::shared_ptr<struct EncodeInfo> encodeInfo = gsmSmsMessage.GetSubmitEncodeInfo(scAddr, isMore);
143         if (encodeInfo == nullptr) {
144             SendResultCallBack(indexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
145             TELEPHONY_LOGE("create encodeInfo encodeInfo nullptr error.");
146             continue;
147         }
148         SetSendIndexerInfo(indexer, encodeInfo, msgRef8bit);
149         indexer->SetUnSentCellCount(*unSentCellCount);
150         indexer->SetHasCellFailed(hasCellFailed);
151         SendSmsToRil(indexer);
152     }
153 }
154 
DataBasedSmsDelivery(const std::string & desAddr,const std::string & scAddr,int32_t port,const uint8_t * data,uint32_t dataLen,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)155 void GsmSmsSender::DataBasedSmsDelivery(const std::string &desAddr, const std::string &scAddr, int32_t port,
156     const uint8_t *data, uint32_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
157     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
158 {
159     GsmSmsMessage gsmSmsMessage;
160     std::vector<struct SplitInfo> cellsInfos;
161     DataCodingScheme codingType;
162     std::string dataStr;
163     CharArrayToString(data, dataLen, dataStr);
164     gsmSmsMessage.SetSmsCodingNationalType(GetSmsCodingNationalType(slotId_));
165     gsmSmsMessage.SplitMessage(cellsInfos, dataStr, CheckForce7BitEncodeType(), codingType, true, desAddr);
166     uint8_t msgRef8bit = GetMsgRef8Bit();
167     TELEPHONY_LOGI("gsm data msgRef8bit = %{public}d", msgRef8bit);
168     std::shared_ptr<struct SmsTpdu> tpdu = gsmSmsMessage.CreateDataSubmitSmsTpdu(
169         desAddr, scAddr, port, data, dataLen, msgRef8bit, codingType, (deliveryCallback == nullptr) ? false : true);
170     if (tpdu == nullptr) {
171         SendCallbackExceptionCase(sendCallback, "DataBasedSmsDelivery");
172         return;
173     }
174     DataBasedSmsDeliverySplitPage(
175         gsmSmsMessage, cellsInfos, tpdu, msgRef8bit, desAddr, scAddr, port, sendCallback, deliveryCallback);
176 }
177 
SendSmsToRil(const shared_ptr<SmsSendIndexer> & smsIndexer)178 void GsmSmsSender::SendSmsToRil(const shared_ptr<SmsSendIndexer> &smsIndexer)
179 {
180     if (smsIndexer == nullptr) {
181         SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
182         TELEPHONY_LOGE("gsm_sms_sender: SendSms smsIndexer nullptr");
183         return;
184     }
185     auto &satelliteSmsClient = SatelliteSmsClient::GetInstance();
186     if (!satelliteSmsClient.IsSatelliteEnabled()) {
187         if (!isImsNetDomain_ && (voiceServiceState_ != static_cast<int32_t>(RegServiceState::REG_STATE_IN_SERVICE))) {
188             SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_SERVICE_UNAVAILABLE);
189             TELEPHONY_LOGE("gsm_sms_sender: SendSms not in service");
190             SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
191                 SmsMmsErrorCode::SMS_ERROR_SENDSMS_NOT_IN_SERVICE, "gsm send sms not in service");
192             return;
193         }
194     }
195 
196     int64_t refId = GetMsgRef64Bit();
197     TELEPHONY_LOGI("gsm refId = %{public}" PRId64 "", refId);
198     if (!SendCacheMapAddItem(refId, smsIndexer)) {
199         TELEPHONY_LOGE("SendCacheMapAddItem Error!!");
200         return;
201     }
202 
203     GsmSimMessageParam smsData;
204     smsData.refId = refId;
205     smsData.smscPdu = StringUtils::StringToHex(smsIndexer->GetEncodeSmca());
206     smsData.pdu = StringUtils::StringToHex(smsIndexer->GetEncodePdu());
207 
208     if (satelliteSmsClient.IsSatelliteEnabled()) {
209         TELEPHONY_LOGI("send sms through satellite");
210         SendSatelliteSms(smsIndexer, smsData);
211         return;
212     }
213 
214     bool sendCsSMS = false;
215     if ((!isImsNetDomain_ || !imsSmsCfg_) || (smsIndexer->GetPsResendCount() == MAX_SEND_RETRIES)) {
216         sendCsSMS = true;
217     }
218     if (sendCsSMS) {
219         SendCsSms(smsIndexer, smsData);
220     } else {
221         SendImsSms(smsIndexer, smsData);
222     }
223 }
224 
SendCsSms(const shared_ptr<SmsSendIndexer> & smsIndexer,GsmSimMessageParam smsData)225 void GsmSmsSender::SendCsSms(const shared_ptr<SmsSendIndexer> &smsIndexer, GsmSimMessageParam smsData)
226 {
227     uint8_t tryCount = smsIndexer->GetCsResendCount();
228     lastSmsDomain_ = CS_DOMAIN;
229     if (tryCount > 0) {
230         smsIndexer->UpdatePduForResend();
231     }
232     if (tryCount == 0 && smsIndexer->GetHasMore()) {
233         TELEPHONY_LOGI("SendSmsMoreMode pdu len = %{public}zu", smsIndexer->GetEncodePdu().size());
234         CoreManagerInner::GetInstance().SendSmsMoreMode(
235             slotId_, RadioEvent::RADIO_SEND_SMS_EXPECT_MORE, smsData, shared_from_this());
236     } else {
237         TELEPHONY_LOGI("SendSms pdu len = %{public}zu", smsIndexer->GetEncodePdu().size());
238         CoreManagerInner::GetInstance().SendGsmSms(slotId_, RadioEvent::RADIO_SEND_SMS, smsData, shared_from_this());
239     }
240 }
241 
SendSatelliteSms(const shared_ptr<SmsSendIndexer> & smsIndexer,GsmSimMessageParam smsData)242 void GsmSmsSender::SendSatelliteSms(const shared_ptr<SmsSendIndexer> &smsIndexer, GsmSimMessageParam smsData)
243 {
244     auto &satelliteSmsClient = SatelliteSmsClient::GetInstance();
245     uint8_t tryCount = smsIndexer->GetCsResendCount();
246     lastSmsDomain_ = CS_DOMAIN;
247     if (tryCount > 0) {
248         smsIndexer->UpdatePduForResend();
249     }
250     TELEPHONY_LOGI("satellite SendSms tryCount = %{public}d", tryCount);
251     if (tryCount == 0 && smsIndexer->GetHasMore()) {
252         TELEPHONY_LOGI("satellite SendSmsMoreMode pdu len = %{public}zu", smsIndexer->GetEncodePdu().size());
253         satelliteSmsClient.SendSmsMoreMode(slotId_, RadioEvent::RADIO_SEND_SMS_EXPECT_MORE, smsData);
254     } else {
255         TELEPHONY_LOGI("satellite SendSms pdu len = %{public}zu", smsIndexer->GetEncodePdu().size());
256         satelliteSmsClient.SendSms(slotId_, RadioEvent::RADIO_SEND_SMS, smsData);
257     }
258 }
259 
SendImsSms(const shared_ptr<SmsSendIndexer> & smsIndexer,GsmSimMessageParam smsData)260 void GsmSmsSender::SendImsSms(const shared_ptr<SmsSendIndexer> &smsIndexer, GsmSimMessageParam smsData)
261 {
262     auto smsClient = DelayedSingleton<ImsSmsClient>::GetInstance();
263     TELEPHONY_LOGI("ims network domain send sms interface.!");
264     if (smsClient == nullptr) {
265         TELEPHONY_LOGE("SendSmsToRil return, ImsSmsClient is nullptr.");
266         return;
267     }
268     lastSmsDomain_ = IMS_DOMAIN;
269     ImsMessageInfo imsMessageInfo;
270     imsMessageInfo.refId = smsData.refId;
271     imsMessageInfo.smscPdu = smsData.smscPdu;
272     imsMessageInfo.pdu = smsData.pdu;
273     imsMessageInfo.tech = SMS_RADIO_TECH_3GPP;
274     int32_t reply = smsClient->ImsSendMessage(slotId_, imsMessageInfo);
275     TELEPHONY_LOGI("SendImsSms reply = %{public}d", reply);
276 }
277 
IsImsSmsSupported(int32_t slotId,bool & isSupported)278 int32_t GsmSmsSender::IsImsSmsSupported(int32_t slotId, bool &isSupported)
279 {
280     auto smsClient = DelayedSingleton<ImsSmsClient>::GetInstance();
281     if (smsClient == nullptr) {
282         TELEPHONY_LOGE("GetImsSmsConfig return, ImsSmsClient is nullptr.");
283         return TELEPHONY_ERR_LOCAL_PTR_NULL;
284     }
285     std::unique_lock<std::mutex> lck(ctx_);
286     resIsSmsReady_ = false;
287     int32_t reply = smsClient->ImsGetSmsConfig(slotId);
288     TELEPHONY_LOGI("GetImsSms reply = %{public}d", reply);
289     while (resIsSmsReady_) {
290         TELEPHONY_LOGI("GetImsSmsConfig::wait(), resIsSmsReady_ = false");
291         if (cv_.wait_for(lck, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
292             break;
293         }
294     }
295     TELEPHONY_LOGI("GsmSmsSender::IsImsSmsSupported() imsSmsCfg_:%{public}d", imsSmsCfg_);
296     isSupported = (imsSmsCfg_ == IMS_SMS_ENABLE);
297     return TELEPHONY_ERR_SUCCESS;
298 }
299 
StatusReportAnalysis(const AppExecFwk::InnerEvent::Pointer & event)300 void GsmSmsSender::StatusReportAnalysis(const AppExecFwk::InnerEvent::Pointer &event)
301 {
302     if (event == nullptr) {
303         TELEPHONY_LOGE("GsmSmsSender: StatusReportAnalysis event nullptr error.");
304         return;
305     }
306 
307     std::shared_ptr<SmsMessageInfo> statusInfo = event->GetSharedObject<SmsMessageInfo>();
308     if (statusInfo == nullptr) {
309         TELEPHONY_LOGE("GsmSmsSender: StatusReportAnalysis statusInfo nullptr error.");
310         return;
311     }
312 
313     std::string pdu = StringUtils::StringToHex(statusInfo->pdu);
314     TELEPHONY_LOGI("StatusReport pdu size == %{public}zu", pdu.length());
315     std::shared_ptr<GsmSmsMessage> message = GsmSmsMessage::CreateMessage(pdu);
316     if (message == nullptr) {
317         TELEPHONY_LOGE("GsmSmsSender: StatusReportAnalysis message nullptr error.");
318         return;
319     }
320     sptr<IDeliveryShortMessageCallback> deliveryCallback = nullptr;
321     auto oldIndexer = reportList_.begin();
322     while (oldIndexer != reportList_.end()) {
323         auto iter = oldIndexer++;
324         if (*iter != nullptr && (message->GetMsgRef() == (*iter)->GetMsgRefId())) {
325             // save the message to db, or updata to db msg state(success or failed)
326             TELEPHONY_LOGI("StatusReport %{public}d", message->GetMsgRef());
327             deliveryCallback = (*iter)->GetDeliveryCallback();
328             reportList_.erase(iter);
329         }
330     }
331     auto &satelliteSmsClient = SatelliteSmsClient::GetInstance();
332     if (satelliteSmsClient.GetSatelliteCapability() > 0 && satelliteSmsClient.IsSatelliteEnabled()) {
333         TELEPHONY_LOGI("send sms ack through satellite");
334         satelliteSmsClient.SendSmsAck(slotId_, 0, AckIncomeCause::SMS_ACK_PROCESSED, true);
335     } else {
336         CoreManagerInner::GetInstance().SendSmsAck(slotId_, 0, AckIncomeCause::SMS_ACK_PROCESSED, true, nullptr);
337     }
338     if (deliveryCallback != nullptr) {
339         std::string ackpdu = StringUtils::StringToHex(message->GetRawPdu());
340         deliveryCallback->OnSmsDeliveryResult(StringUtils::ToUtf16(ackpdu));
341     }
342 }
343 
StatusReportSetImsSms(const AppExecFwk::InnerEvent::Pointer & event)344 void GsmSmsSender::StatusReportSetImsSms(const AppExecFwk::InnerEvent::Pointer &event)
345 {
346     if (event == nullptr) {
347         TELEPHONY_LOGE("GsmSmsSender: StatusReportSetImsSms event nullptr error.");
348         return;
349     }
350     std::shared_ptr<RadioResponseInfo> imsResponseInfo = event->GetSharedObject<RadioResponseInfo>();
351 
352     if (imsResponseInfo == nullptr) {
353         return;
354     }
355 
356     if (imsResponseInfo->error != ErrType::NONE) {
357         imsSmsCfg_ = IMS_SMS_DISABLE;
358     }
359 }
360 
StatusReportGetImsSms(const AppExecFwk::InnerEvent::Pointer & event)361 void GsmSmsSender::StatusReportGetImsSms(const AppExecFwk::InnerEvent::Pointer &event)
362 {
363     if (event == nullptr) {
364         TELEPHONY_LOGE("GsmSmsSender: StatusReportGetImsSms event nullptr error.");
365         return;
366     }
367     std::shared_ptr<int32_t> imsSmsInfo = event->GetSharedObject<int32_t>();
368     if (imsSmsInfo == nullptr) {
369         TELEPHONY_LOGE("GsmSmsSender: StatusReportGetImsSms imsSmsInfo nullptr error.");
370         return;
371     }
372     imsSmsCfg_ = *imsSmsInfo;
373 }
374 
SetSendIndexerInfo(const std::shared_ptr<SmsSendIndexer> & indexer,const std::shared_ptr<struct EncodeInfo> & encodeInfo,unsigned char msgRef8bit)375 void GsmSmsSender::SetSendIndexerInfo(const std::shared_ptr<SmsSendIndexer> &indexer,
376     const std::shared_ptr<struct EncodeInfo> &encodeInfo, unsigned char msgRef8bit)
377 {
378     if (encodeInfo == nullptr || indexer == nullptr) {
379         TELEPHONY_LOGE("CreateSendIndexer encodeInfo nullptr");
380         return;
381     }
382 
383     std::vector<uint8_t> smca(encodeInfo->smcaData_, encodeInfo->smcaData_ + encodeInfo->smcaLen);
384     std::vector<uint8_t> pdu(encodeInfo->tpduData_, encodeInfo->tpduData_ + encodeInfo->tpduLen);
385     chrono::system_clock::duration timePoint = chrono::system_clock::now().time_since_epoch();
386     int64_t timeStamp = chrono::duration_cast<chrono::seconds>(timePoint).count();
387     indexer->SetTimeStamp(timeStamp);
388     indexer->SetEncodeSmca(std::move(smca));
389     indexer->SetEncodePdu(std::move(pdu));
390     indexer->SetHasMore(encodeInfo->isMore_);
391     TELEPHONY_LOGI("gsm text msgRef8bit = %{public}d", msgRef8bit);
392     indexer->SetMsgRefId(msgRef8bit);
393     indexer->SetNetWorkType(NET_TYPE_GSM);
394 }
395 
RegisterHandler()396 bool GsmSmsSender::RegisterHandler()
397 {
398     auto &satelliteSmsClient = SatelliteSmsClient::GetInstance();
399     if (satelliteSmsClient.GetSatelliteSupported()) {
400         satelliteSmsClient.AddSendHandler(slotId_, std::static_pointer_cast<TelEventHandler>(shared_from_this()));
401     }
402     CoreManagerInner::GetInstance().RegisterCoreNotify(
403         slotId_, shared_from_this(), RadioEvent::RADIO_SMS_STATUS, nullptr);
404 
405     return true;
406 }
407 
RegisterSatelliteCallback()408 void GsmSmsSender::RegisterSatelliteCallback()
409 {
410     auto &satelliteSmsClient = SatelliteSmsClient::GetInstance();
411     if (satelliteSmsClient.GetSatelliteSupported()) {
412         TELEPHONY_LOGI("gsm sender register satellite notify");
413         satelliteCallback_ =
414             std::make_unique<SatelliteSmsCallback>(std::static_pointer_cast<TelEventHandler>(shared_from_this()))
415                 .release();
416         satelliteSmsClient.RegisterSmsNotify(slotId_, RadioEvent::RADIO_SMS_STATUS, satelliteCallback_);
417         satelliteSmsClient.RegisterSmsNotify(slotId_, RadioEvent::RADIO_SEND_SMS, satelliteCallback_);
418         satelliteSmsClient.RegisterSmsNotify(slotId_, RadioEvent::RADIO_SEND_SMS_EXPECT_MORE, satelliteCallback_);
419     }
420 }
421 
UnregisterSatelliteCallback()422 void GsmSmsSender::UnregisterSatelliteCallback()
423 {
424     auto &satelliteSmsClient = SatelliteSmsClient::GetInstance();
425     if (satelliteSmsClient.GetSatelliteSupported()) {
426         TELEPHONY_LOGI("gsm sender unregister satellite notify");
427         satelliteCallback_ = nullptr;
428     }
429 }
430 
RegisterImsHandler()431 void GsmSmsSender::RegisterImsHandler()
432 {
433     if (isImsGsmHandlerRegistered) {
434         return;
435     }
436     auto smsClient = DelayedSingleton<ImsSmsClient>::GetInstance();
437     if (smsClient == nullptr) {
438         TELEPHONY_LOGE("RegisterHandler return, ImsSmsClient is nullptr.");
439         return;
440     }
441 
442     smsClient->RegisterImsSmsCallbackHandler(slotId_, shared_from_this());
443     TELEPHONY_LOGE("RegisterHandler  gsm ImsSmsClient successs");
444     isImsGsmHandlerRegistered = true;
445 }
446 
ResendTextDelivery(const std::shared_ptr<SmsSendIndexer> & smsIndexer)447 void GsmSmsSender::ResendTextDelivery(const std::shared_ptr<SmsSendIndexer> &smsIndexer)
448 {
449     if (smsIndexer == nullptr) {
450         TELEPHONY_LOGE("ResendTextDelivery smsIndexer == nullptr");
451         return;
452     }
453     GsmSmsMessage gsmSmsMessage;
454     bool isMore = false;
455     if (!SetPduInfo(smsIndexer, gsmSmsMessage, isMore)) {
456         TELEPHONY_LOGE("SetPduInfo fail.");
457         return;
458     }
459 
460     std::shared_ptr<struct EncodeInfo> encodeInfo = nullptr;
461     encodeInfo = gsmSmsMessage.GetSubmitEncodeInfo(smsIndexer->GetSmcaAddr(), isMore);
462     if (encodeInfo == nullptr) {
463         SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
464         TELEPHONY_LOGE("create encodeInfo indexer == nullptr\r\n");
465         return;
466     }
467     SetSendIndexerInfo(smsIndexer, encodeInfo, smsIndexer->GetMsgRefId());
468     std::unique_lock<std::mutex> lock(mutex_);
469     SendSmsToRil(smsIndexer);
470 }
471 
ResendDataDelivery(const std::shared_ptr<SmsSendIndexer> & smsIndexer)472 void GsmSmsSender::ResendDataDelivery(const std::shared_ptr<SmsSendIndexer> &smsIndexer)
473 {
474     if (smsIndexer == nullptr) {
475         TELEPHONY_LOGE("DataBasedSmsDelivery ResendDataDelivery smsIndexer nullptr");
476         return;
477     }
478 
479     bool isStatusReport = false;
480     unsigned char msgRef8bit = 0;
481     msgRef8bit = smsIndexer->GetMsgRefId();
482     isStatusReport = (smsIndexer->GetDeliveryCallback() == nullptr) ? false : true;
483 
484     GsmSmsMessage gsmSmsMessage;
485     std::shared_ptr<struct SmsTpdu> tpdu = nullptr;
486     tpdu = gsmSmsMessage.CreateDataSubmitSmsTpdu(smsIndexer->GetDestAddr(), smsIndexer->GetSmcaAddr(),
487         smsIndexer->GetDestPort(), smsIndexer->GetData().data(), smsIndexer->GetData().size(), msgRef8bit,
488         smsIndexer->GetDcs(), isStatusReport);
489 
490     std::shared_ptr<struct EncodeInfo> encodeInfo = nullptr;
491     encodeInfo = gsmSmsMessage.GetSubmitEncodeInfo(smsIndexer->GetSmcaAddr(), false);
492     if (encodeInfo == nullptr || tpdu == nullptr) {
493         SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
494         TELEPHONY_LOGE("DataBasedSmsDelivery encodeInfo or tpdu nullptr");
495         return;
496     }
497     std::vector<uint8_t> smca(encodeInfo->smcaData_, encodeInfo->smcaData_ + encodeInfo->smcaLen);
498     std::vector<uint8_t> pdu(encodeInfo->tpduData_, encodeInfo->tpduData_ + encodeInfo->tpduLen);
499     std::shared_ptr<uint8_t> unSentCellCount = make_shared<uint8_t>(1);
500     if (unSentCellCount == nullptr) {
501         SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
502         TELEPHONY_LOGE("DataBasedSmsDelivery unSentCellCount nullptr");
503         return;
504     }
505     std::shared_ptr<bool> hasCellFailed = make_shared<bool>(false);
506     if (hasCellFailed == nullptr) {
507         SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
508         TELEPHONY_LOGE("DataBasedSmsDelivery hasCellFailed nullptr");
509         return;
510     }
511     chrono::system_clock::duration timePoint = chrono::system_clock::now().time_since_epoch();
512     int64_t timeStamp = chrono::duration_cast<chrono::seconds>(timePoint).count();
513 
514     smsIndexer->SetUnSentCellCount(*unSentCellCount);
515     smsIndexer->SetHasCellFailed(hasCellFailed);
516     smsIndexer->SetEncodeSmca(std::move(smca));
517     smsIndexer->SetEncodePdu(std::move(pdu));
518     smsIndexer->SetHasMore(encodeInfo->isMore_);
519     smsIndexer->SetMsgRefId(msgRef8bit);
520     smsIndexer->SetNetWorkType(NET_TYPE_GSM);
521     smsIndexer->SetTimeStamp(timeStamp);
522     std::unique_lock<std::mutex> lock(mutex_);
523     SendSmsToRil(smsIndexer);
524 }
525 
SetPduInfo(const std::shared_ptr<SmsSendIndexer> & smsIndexer,GsmSmsMessage & gsmSmsMessage,bool & isMore)526 bool GsmSmsSender::SetPduInfo(
527     const std::shared_ptr<SmsSendIndexer> &smsIndexer, GsmSmsMessage &gsmSmsMessage, bool &isMore)
528 {
529     bool ret = false;
530     if (smsIndexer == nullptr) {
531         TELEPHONY_LOGE("Indexer is nullptr");
532         return ret;
533     }
534     DataCodingScheme codingType = smsIndexer->GetDcs();
535     std::shared_ptr<struct SmsTpdu> tpdu = nullptr;
536     tpdu = gsmSmsMessage.CreateDefaultSubmitSmsTpdu(smsIndexer->GetDestAddr(), smsIndexer->GetSmcaAddr(),
537         smsIndexer->GetText(), (smsIndexer->GetDeliveryCallback() == nullptr) ? false : true, codingType);
538     if (tpdu == nullptr) {
539         SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
540         TELEPHONY_LOGE("ResendTextDelivery CreateDefaultSubmitSmsTpdu err.");
541         return ret;
542     }
543     (void)memset_s(tpdu->data.submit.userData.data, MAX_USER_DATA_LEN + 1, 0x00, MAX_USER_DATA_LEN + 1);
544     if (smsIndexer->GetText().length() >= MAX_USER_DATA_LEN + 1) {
545         TELEPHONY_LOGE("SetPduInfo data length invalid.");
546         return ret;
547     }
548     if (memcpy_s(tpdu->data.submit.userData.data, MAX_USER_DATA_LEN + 1, smsIndexer->GetText().c_str(),
549         smsIndexer->GetText().length()) != EOK) {
550         SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
551         TELEPHONY_LOGE("TextBasedSmsDelivery memcpy_s error.");
552         return ret;
553     }
554     int headerCnt = 0;
555     tpdu->data.submit.userData.length = static_cast<int>(smsIndexer->GetText().length());
556     tpdu->data.submit.userData.data[smsIndexer->GetText().length()] = 0;
557     tpdu->data.submit.msgRef = smsIndexer->GetMsgRefId();
558     if (smsIndexer->GetIsConcat()) {
559         headerCnt += gsmSmsMessage.SetHeaderConcat(headerCnt, smsIndexer->GetSmsConcat());
560     }
561     /* Set User Data Header for Alternate Reply Address */
562     headerCnt += gsmSmsMessage.SetHeaderReply(headerCnt);
563     /* Set User Data Header for National Language Single Shift */
564     headerCnt += gsmSmsMessage.SetHeaderLang(headerCnt, codingType, smsIndexer->GetLangId());
565     tpdu->data.submit.userData.headerCnt = headerCnt;
566     tpdu->data.submit.bHeaderInd = (headerCnt > 0) ? true : false;
567 
568     unsigned char totalSeg = smsIndexer->GetSmsConcat().totalSeg;
569     if ((totalSeg > 1) && (smsIndexer->GetSmsConcat().seqNum < totalSeg)) {
570         tpdu->data.submit.bStatusReport = false;
571         isMore = true;
572     } else {
573         tpdu->data.submit.bStatusReport = (smsIndexer->GetDeliveryCallback() == nullptr) ? false : true;
574         isMore = false;
575     }
576     return true;
577 }
578 } // namespace Telephony
579 } // namespace OHOS
580