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