• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 "sms_send_manager.h"
17 
18 #include <functional>
19 #include <memory.h>
20 
21 #include "cdma_sms_message.h"
22 #include "gsm_sms_message.h"
23 #include "gsm_sms_tpdu_codec.h"
24 #include "i_sms_service_interface.h"
25 #include "sms_hisysevent.h"
26 #include "sms_receive_manager.h"
27 #include "telephony_errors.h"
28 #include "telephony_log_wrapper.h"
29 
30 namespace OHOS {
31 namespace Telephony {
32 static constexpr const char *NET_TYPE_GSM_STRING = "3gpp";
33 static constexpr const char *NET_TYPE_CDMA_STRING = "3gpp2";
34 static constexpr const char *NET_TYPE_UNKNOWN_STRING = "unknown";
35 
36 using namespace std;
SmsSendManager(int32_t slotId)37 SmsSendManager::SmsSendManager(int32_t slotId) : slotId_(slotId) {}
38 
~SmsSendManager()39 SmsSendManager::~SmsSendManager()
40 {
41     if (gsmSmsSender_ != nullptr && networkManager_ != nullptr) {
42         if (auto id = gsmSmsSender_->GetNetworkId(); id.has_value()) {
43             networkManager_->NetworkUnregister(id.value());
44         }
45     }
46     if (cdmaSmsSender_ != nullptr && networkManager_ != nullptr) {
47         if (auto id = cdmaSmsSender_->GetNetworkId(); id.has_value()) {
48             networkManager_->NetworkUnregister(id.value());
49         }
50     }
51     if (networkManager_ != nullptr) {
52         networkManager_->UnRegisterHandler();
53     }
54 }
55 
Init()56 void SmsSendManager::Init()
57 {
58     gsmSmsSendRunner_ = AppExecFwk::EventRunner::Create("gsmSmsSenderLoop" + to_string(slotId_));
59     if (gsmSmsSendRunner_ == nullptr) {
60         TELEPHONY_LOGE("failed to create GsmSenderEventRunner");
61         return;
62     }
63     gsmSmsSender_ = std::make_shared<GsmSmsSender>(
64         gsmSmsSendRunner_, slotId_, bind(&SmsSendManager::RetriedSmsDelivery, this, placeholders::_1));
65     if (gsmSmsSender_ == nullptr) {
66         TELEPHONY_LOGE("failed to create GsmSmsSender");
67         return;
68     }
69     gsmSmsSender_->Init();
70     gsmSmsSendRunner_->Run();
71 
72     cdmaSmsSendRunner_ = AppExecFwk::EventRunner::Create("cdmaSmsSenderLoop" + to_string(slotId_));
73     if (cdmaSmsSendRunner_ == nullptr) {
74         TELEPHONY_LOGE("failed to create CdmaSenderEventRunner");
75         return;
76     }
77     cdmaSmsSender_ = std::make_shared<CdmaSmsSender>(
78         cdmaSmsSendRunner_, slotId_, bind(&SmsSendManager::RetriedSmsDelivery, this, placeholders::_1));
79     if (cdmaSmsSender_ == nullptr) {
80         TELEPHONY_LOGE("failed to create CdmaSmsSender");
81         return;
82     }
83     cdmaSmsSender_->Init();
84     cdmaSmsSendRunner_->Run();
85     InitNetworkHandle();
86 }
87 
InitNetworkHandle()88 void SmsSendManager::InitNetworkHandle()
89 {
90     networkRunner_ = AppExecFwk::EventRunner::Create("networkLoop" + to_string(slotId_));
91     if (networkRunner_ == nullptr) {
92         TELEPHONY_LOGE("failed to create networkRunner");
93         return;
94     }
95     networkManager_ = std::make_shared<SmsNetworkPolicyManager>(networkRunner_, slotId_);
96     if (networkManager_ == nullptr) {
97         TELEPHONY_LOGE("failed to create networkManager");
98         return;
99     }
100     networkManager_->Init();
101     networkRunner_->Run();
102     TELEPHONY_LOGI("Init SmsSendManager successfully.");
103     if (auto ret = networkManager_->NetworkRegister(
104         std::bind(&SmsSender::SetNetworkState, gsmSmsSender_, std::placeholders::_1, std::placeholders::_2));
105         ret.has_value()) {
106         gsmSmsSender_->SetNetworkId(ret);
107     } else {
108         TELEPHONY_LOGE("gsm failed to register networkManager");
109     }
110     if (auto ret = networkManager_->NetworkRegister(
111         std::bind(&SmsSender::SetNetworkState, cdmaSmsSender_, std::placeholders::_1, std::placeholders::_2));
112         ret.has_value()) {
113         cdmaSmsSender_->SetNetworkId(ret);
114     } else {
115         TELEPHONY_LOGE("cdma failed to register networkManager");
116     }
117 }
118 
TextBasedSmsDelivery(const string & desAddr,const string & scAddr,const string & text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)119 void SmsSendManager::TextBasedSmsDelivery(const string &desAddr, const string &scAddr, const string &text,
120     const sptr<ISendShortMessageCallback> &sendCallback,
121     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
122 {
123     if (desAddr.empty() || text.empty()) {
124         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
125         TELEPHONY_LOGE("TextBasedSmsDelivery::param Set Error.");
126         return;
127     }
128     if (networkManager_ == nullptr) {
129         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
130         TELEPHONY_LOGE("TextBasedSmsDelivery::networkManager nullptr error.");
131         return;
132     }
133     if (gsmSmsSender_ == nullptr || cdmaSmsSender_ == nullptr) {
134         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
135         TELEPHONY_LOGE("gsmSmsSender or cdmaSmsSender nullptr error.");
136         return;
137     }
138 
139     NetWorkType netWorkType = networkManager_->GetNetWorkType();
140     TELEPHONY_LOGI("netWorkType = %{public}d.", netWorkType);
141     if (netWorkType == NetWorkType::NET_TYPE_GSM) {
142         gsmSmsSender_->RegisterImsHandler();
143         gsmSmsSender_->TextBasedSmsDelivery(desAddr, scAddr, text, sendCallback, deliveryCallback);
144     } else if (netWorkType == NetWorkType::NET_TYPE_CDMA) {
145         cdmaSmsSender_->RegisterImsHandler();
146         cdmaSmsSender_->TextBasedSmsDelivery(desAddr, scAddr, text, sendCallback, deliveryCallback);
147     } else {
148         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_SERVICE_UNAVAILABLE);
149         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
150             SmsMmsErrorCode::SMS_ERROR_UNKNOWN_NETWORK_TYPE, "text sms network unknown send error");
151         TELEPHONY_LOGI("network unknown send error.");
152     }
153 }
154 
DataBasedSmsDelivery(const string & desAddr,const string & scAddr,uint16_t port,const uint8_t * data,uint16_t dataLen,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)155 void SmsSendManager::DataBasedSmsDelivery(const string &desAddr, const string &scAddr, uint16_t port,
156     const uint8_t *data, uint16_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
157     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
158 {
159     if (desAddr.empty() || data == nullptr) {
160         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
161         TELEPHONY_LOGE("DataBasedSmsDelivery::param Set Error.");
162         return;
163     }
164     if (networkManager_ == nullptr) {
165         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
166         TELEPHONY_LOGE("DataBasedSmsDelivery::networkManager nullptr error.");
167         return;
168     }
169     if (gsmSmsSender_ == nullptr || cdmaSmsSender_ == nullptr) {
170         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
171         TELEPHONY_LOGE("gsmSmsSender or cdmaSmsSender nullptr error.");
172         return;
173     }
174 
175     NetWorkType netWorkType = networkManager_->GetNetWorkType();
176     if (netWorkType == NetWorkType::NET_TYPE_GSM) {
177         gsmSmsSender_->RegisterImsHandler();
178         gsmSmsSender_->DataBasedSmsDelivery(desAddr, scAddr, port, data, dataLen, sendCallback, deliveryCallback);
179     } else if (netWorkType == NetWorkType::NET_TYPE_CDMA) {
180         cdmaSmsSender_->RegisterImsHandler();
181         cdmaSmsSender_->DataBasedSmsDelivery(desAddr, scAddr, port, data, dataLen, sendCallback, deliveryCallback);
182     } else {
183         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_SERVICE_UNAVAILABLE);
184         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
185             SmsMmsErrorCode::SMS_ERROR_UNKNOWN_NETWORK_TYPE, "data sms network unknown send error");
186         TELEPHONY_LOGI("network unknown send error.");
187     }
188 }
189 
RetriedSmsDelivery(const shared_ptr<SmsSendIndexer> smsIndexer)190 void SmsSendManager::RetriedSmsDelivery(const shared_ptr<SmsSendIndexer> smsIndexer)
191 {
192     if (smsIndexer == nullptr) {
193         TELEPHONY_LOGI("RetriedSmsDelivery::smsIndexer is nullptr error.");
194         return;
195     }
196     if (gsmSmsSender_ == nullptr || cdmaSmsSender_ == nullptr || networkManager_ == nullptr) {
197         TELEPHONY_LOGE("Sender or network nullptr error.");
198         return;
199     }
200 
201     NetWorkType oldNetWorkType = smsIndexer->GetNetWorkType();
202     NetWorkType newNetWorkType = networkManager_->GetNetWorkType();
203     if (oldNetWorkType != newNetWorkType) {
204         smsIndexer->SetNetWorkType(newNetWorkType);
205         shared_ptr<SmsSendIndexer> indexer = smsIndexer;
206         switch (newNetWorkType) {
207             case NetWorkType::NET_TYPE_CDMA:
208                 if (smsIndexer->GetIsText()) {
209                     cdmaSmsSender_->ResendTextDelivery(indexer);
210                 } else {
211                     cdmaSmsSender_->ResendDataDelivery(indexer);
212                 }
213                 break;
214             case NetWorkType::NET_TYPE_GSM:
215                 if (smsIndexer->GetIsText()) {
216                     gsmSmsSender_->ResendTextDelivery(indexer);
217                 } else {
218                     gsmSmsSender_->ResendDataDelivery(indexer);
219                 }
220                 break;
221             default:
222                 SmsSender::SendResultCallBack(
223                     smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_SERVICE_UNAVAILABLE);
224                 TELEPHONY_LOGI("network unknown send error.");
225                 break;
226         }
227         return;
228     }
229 
230     if (newNetWorkType == NetWorkType::NET_TYPE_GSM) {
231         gsmSmsSender_->SendSmsToRil(smsIndexer);
232     } else if (newNetWorkType == NetWorkType::NET_TYPE_CDMA) {
233         cdmaSmsSender_->SendSmsToRil(smsIndexer);
234     } else {
235         SmsSender::SendResultCallBack(smsIndexer, ISendShortMessageCallback::SEND_SMS_FAILURE_SERVICE_UNAVAILABLE);
236         TELEPHONY_LOGI("Network Unknown.");
237     }
238 }
239 
SplitMessage(const std::string & message,std::vector<std::u16string> & splitMessage)240 int32_t SmsSendManager::SplitMessage(const std::string &message, std::vector<std::u16string> &splitMessage)
241 {
242     if (networkManager_ == nullptr) {
243         TELEPHONY_LOGE("SmsSendManager::SplitMessage networkManager nullptr Error.");
244         return TELEPHONY_ERR_LOCAL_PTR_NULL;
245     }
246 
247     SmsCodingScheme codingType;
248     std::vector<struct SplitInfo> cellsInfos;
249     NetWorkType netWorkType = networkManager_->GetNetWorkType();
250     switch (netWorkType) {
251         case NetWorkType::NET_TYPE_CDMA: {
252             GsmSmsMessage gsmSmsMessage;
253             gsmSmsMessage.SplitMessage(cellsInfos, message, false, codingType, false);
254             break;
255         }
256         case NetWorkType::NET_TYPE_GSM: {
257             CdmaSmsMessage cdmaSmsMessage;
258             cdmaSmsMessage.SplitMessage(cellsInfos, message, false, codingType, false);
259             break;
260         }
261         default:
262             TELEPHONY_LOGE("netWorkType is NET_TYPE_UNKNOWN");
263             break;
264     }
265 
266     for (auto &item : cellsInfos) {
267         splitMessage.emplace_back(StringUtils::ToUtf16(item.text));
268     }
269     return TELEPHONY_ERR_SUCCESS;
270 }
271 
GetSmsSegmentsInfo(const std::string & message,bool force7BitCode,LengthInfo & lenInfo)272 int32_t SmsSendManager::GetSmsSegmentsInfo(const std::string &message, bool force7BitCode, LengthInfo &lenInfo)
273 {
274     if (networkManager_ == nullptr) {
275         TELEPHONY_LOGE("GetSmsSegmentsInfo networkManager_ Nullptr Error.");
276         return TELEPHONY_ERR_LOCAL_PTR_NULL;
277     }
278     NetWorkType netWorkType = networkManager_->GetNetWorkType();
279     switch (netWorkType) {
280         case NetWorkType::NET_TYPE_CDMA: {
281             CdmaSmsMessage cdmaSmsMessage;
282             return cdmaSmsMessage.GetSmsSegmentsInfo(message, force7BitCode, lenInfo);
283         }
284         case NetWorkType::NET_TYPE_GSM: {
285             GsmSmsMessage gsmSmsMessage;
286             return gsmSmsMessage.GetSmsSegmentsInfo(message, force7BitCode, lenInfo);
287         }
288         default:
289             TELEPHONY_LOGE("netWorkType is NET_TYPE_UNKNOWN");
290             break;
291     }
292     return TELEPHONY_ERR_UNKNOWN_NETWORK_TYPE;
293 }
294 
GetCdmaSmsSender() const295 std::shared_ptr<SmsSender> SmsSendManager::GetCdmaSmsSender() const
296 {
297     return cdmaSmsSender_;
298 }
299 
IsImsSmsSupported(int32_t slotId,bool & isSupported)300 int32_t SmsSendManager::IsImsSmsSupported(int32_t slotId, bool &isSupported)
301 {
302     if (networkManager_ == nullptr) {
303         TELEPHONY_LOGE("networkManager is nullptr error.");
304         return TELEPHONY_ERR_LOCAL_PTR_NULL;
305     }
306 
307     if (gsmSmsSender_ == nullptr || cdmaSmsSender_ == nullptr || networkManager_ == nullptr) {
308         TELEPHONY_LOGE("Sender or network nullptr error.");
309         return TELEPHONY_ERR_LOCAL_PTR_NULL;
310     }
311 
312     NetWorkType newNetWorkType = networkManager_->GetNetWorkType();
313     switch (newNetWorkType) {
314         case NetWorkType::NET_TYPE_GSM:
315             return gsmSmsSender_->IsImsSmsSupported(slotId, isSupported);
316         case NetWorkType::NET_TYPE_CDMA:
317             return cdmaSmsSender_->IsImsSmsSupported(slotId, isSupported);
318         default:
319             TELEPHONY_LOGE("network unknown send error.");
320             return TELEPHONY_ERR_UNKNOWN_NETWORK_TYPE;
321     }
322 }
323 
SetImsSmsConfig(int32_t slotId,int32_t enable)324 bool SmsSendManager::SetImsSmsConfig(int32_t slotId, int32_t enable)
325 {
326     bool result = false;
327     if (gsmSmsSender_ == nullptr || cdmaSmsSender_ == nullptr || networkManager_ == nullptr) {
328         TELEPHONY_LOGE("Sender or network nullptr error.");
329         return result;
330     }
331     NetWorkType newNetWorkType = networkManager_->GetNetWorkType();
332 
333     switch (newNetWorkType) {
334         case NetWorkType::NET_TYPE_GSM:
335             result = gsmSmsSender_->SetImsSmsConfig(slotId, enable);
336             break;
337         case NetWorkType::NET_TYPE_CDMA:
338             result = cdmaSmsSender_->SetImsSmsConfig(slotId, enable);
339             break;
340         default:
341             TELEPHONY_LOGE("network unknown send error.");
342             break;
343     }
344     return result;
345 }
346 
GetImsShortMessageFormat(std::u16string & format)347 int32_t SmsSendManager::GetImsShortMessageFormat(std::u16string &format)
348 {
349     format = StringUtils::ToUtf16(NET_TYPE_UNKNOWN_STRING);
350     if (networkManager_ == nullptr) {
351         TELEPHONY_LOGE("networkManager is nullptr error.");
352         return TELEPHONY_ERR_LOCAL_PTR_NULL;
353     }
354     switch (networkManager_->GetNetWorkType()) {
355         case NetWorkType::NET_TYPE_GSM:
356             format = StringUtils::ToUtf16(NET_TYPE_GSM_STRING);
357             break;
358         case NetWorkType::NET_TYPE_CDMA:
359             format = StringUtils::ToUtf16(NET_TYPE_CDMA_STRING);
360             break;
361         default:
362             break;
363     }
364     return TELEPHONY_ERR_SUCCESS;
365 }
366 } // namespace Telephony
367 } // namespace OHOS