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_service.h"
17
18 #include <regex>
19
20 #include "cdma_sms_message.h"
21 #include "core_manager_inner.h"
22 #include "ims_sms_client.h"
23 #include "phonenumbers/phonenumber.pb.h"
24 #include "sms_dump_helper.h"
25 #include "sms_mms_common.h"
26 #include "sms_hisysevent.h"
27 #include "string_utils.h"
28 #include "telephony_common_utils.h"
29 #include "telephony_ext_wrapper.h"
30 #include "telephony_log_wrapper.h"
31 #include "telephony_permission.h"
32 #include "text_coder.h"
33 #include "base64.h"
34
35 namespace OHOS {
36 namespace Telephony {
37 using namespace std;
38 using namespace AppExecFwk;
39 using namespace HiviewDFX;
40 constexpr static uint32_t CONNECT_SERVICE_WAIT_TIME = 2000;
41 constexpr static size_t MIN_LEN = 1;
42 bool g_registerResult = SystemAbility::MakeAndRegisterAbility(DelayedSingleton<SmsService>::GetInstance().get());
43 const std::string INFO_MSG_TELEPHONE_REG = "^(0086|\\+?86|\\+)?(9|95|100|101|106|108|111|116|118|123|125|400|800|1212|"
44 "000000|\\d{2,4}12123$|\\d{2,4}12329$|^02[0-9]|010|^05[34]|^07[56])";
45 const std::string ISO_COUNTRY_CODE = "CN";
SmsService()46 SmsService::SmsService() : SystemAbility(TELEPHONY_SMS_MMS_SYS_ABILITY_ID, true) {}
47
~SmsService()48 SmsService::~SmsService() {}
49
OnStart()50 void SmsService::OnStart()
51 {
52 TELEPHONY_LOGI("SmsService::OnStart start service Enter.");
53 bindTime_ =
54 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
55 .count();
56 if (state_ == ServiceRunningState::STATE_RUNNING) {
57 TELEPHONY_LOGE("msService has already started.");
58 return;
59 }
60 if (!Init()) {
61 TELEPHONY_LOGE("failed to init SmsService");
62 return;
63 }
64 state_ = ServiceRunningState::STATE_RUNNING;
65 endTime_ =
66 std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
67 .count();
68 TELEPHONY_LOGI("SmsService::OnStart start service Exit.");
69 }
70
Init()71 bool SmsService::Init()
72 {
73 #ifdef OHOS_BUILD_ENABLE_TELEPHONY_EXT
74 TELEPHONY_EXT_WRAPPER.InitTelephonyExtWrapper();
75 #endif
76 DelayedSingleton<ImsSmsClient>::GetInstance()->Init();
77 if (!registerToService_) {
78 bool ret = Publish(DelayedSingleton<SmsService>::GetInstance().get());
79 if (!ret) {
80 TELEPHONY_LOGE("SmsService::Init Publish failed!");
81 return false;
82 }
83 registerToService_ = true;
84 WaitCoreServiceToInit();
85 }
86 DelayedSingleton<SmsStateHandler>::GetInstance()->Init();
87 return true;
88 }
89
OnStop()90 void SmsService::OnStop()
91 {
92 state_ = ServiceRunningState::STATE_NOT_START;
93 registerToService_ = false;
94 DelayedSingleton<ImsSmsClient>::GetInstance()->UnInit();
95 DelayedSingleton<SmsStateHandler>::GetInstance()->UnInit();
96 TELEPHONY_LOGI("SmsService::OnStop stop service.");
97 }
98
Dump(std::int32_t fd,const std::vector<std::u16string> & args)99 int32_t SmsService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
100 {
101 if (fd < 0) {
102 TELEPHONY_LOGE("dump fd invalid");
103 return TELEPHONY_ERR_FAIL;
104 }
105 std::vector<std::string> argsInStr;
106 for (const auto &arg : args) {
107 TELEPHONY_LOGI("Dump args: %{public}s", Str16ToStr8(arg).c_str());
108 argsInStr.emplace_back(Str16ToStr8(arg));
109 }
110 std::string result;
111 SmsDumpHelper dumpHelper;
112 if (dumpHelper.Dump(argsInStr, result)) {
113 TELEPHONY_LOGI("%{public}s", result.c_str());
114 std::int32_t ret = dprintf(fd, "%s", result.c_str());
115 if (ret < 0) {
116 TELEPHONY_LOGE("dprintf to dump fd failed");
117 return TELEPHONY_ERR_FAIL;
118 }
119 return TELEPHONY_SUCCESS;
120 }
121 TELEPHONY_LOGW("dumpHelper failed");
122 return TELEPHONY_ERR_FAIL;
123 }
124
WaitCoreServiceToInit()125 void SmsService::WaitCoreServiceToInit()
126 {
127 TelFFRTUtils::Submit([&]() {
128 while (true) {
129 if (CoreManagerInner::GetInstance().IsInitFinished()) {
130 InitModule();
131 TELEPHONY_LOGI("SmsService Connection successful");
132 break;
133 }
134 TelFFRTUtils::SleepFor(CONNECT_SERVICE_WAIT_TIME);
135 }
136 });
137 }
138
GetBindTime()139 std::string SmsService::GetBindTime()
140 {
141 return std::to_string(bindTime_);
142 }
143
SendMessage(int32_t slotId,const u16string desAddr,const u16string scAddr,const u16string text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback,bool isMmsApp)144 int32_t SmsService::SendMessage(int32_t slotId, const u16string desAddr, const u16string scAddr, const u16string text,
145 const sptr<ISendShortMessageCallback> &sendCallback, const sptr<IDeliveryShortMessageCallback> &deliveryCallback,
146 bool isMmsApp)
147 {
148 if (!CheckSmsPermission(sendCallback)) {
149 SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
150 SmsMmsErrorCode::SMS_ERROR_PERMISSION_ERROR, Permission::SEND_MESSAGES);
151 return TELEPHONY_ERR_PERMISSION_ERR;
152 }
153 if (desAddr.empty()) {
154 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
155 TELEPHONY_LOGE("SmsService::SendMessage desAddr empty");
156 return TELEPHONY_ERR_ARGUMENT_INVALID;
157 }
158 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
159 if (interfaceManager == nullptr) {
160 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
161 SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
162 SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "text sms interfaceManager is nullptr");
163 TELEPHONY_LOGE("SmsService::SendMessage interfaceManager nullptr error.");
164 return TELEPHONY_ERR_LOCAL_PTR_NULL;
165 }
166 if (!ValidDestinationAddress(StringUtils::ToUtf8(desAddr))) {
167 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
168 TELEPHONY_LOGE("SmsService::SendMessage desAddr not conform to the regular specification");
169 return TELEPHONY_ERR_ARGUMENT_INVALID;
170 }
171
172 uint16_t dataId = 0;
173 if (!isMmsApp) {
174 InsertSessionAndDetail(slotId, StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(text), dataId);
175 TELEPHONY_LOGI("InsertSessionAndDetail write data to db. the id:%{public}d", dataId);
176 } else {
177 DataShare::DataSharePredicates predicates;
178 predicates.EqualTo(SmsMmsInfo::MSG_TYPE, SmsMmsCommonData::SMS_MSM_TYPE_SMS);
179 predicates.EqualTo(SmsMmsInfo::RECEIVER_NUMBER, StringUtils::ToUtf8(desAddr));
180 predicates.EqualTo(SmsMmsInfo::SLOT_ID, slotId);
181 predicates.EqualTo(SmsMmsInfo::MSG_CONTENT, StringUtils::ToUtf8(text));
182 predicates.EqualTo(SmsMmsInfo::MSG_STATE, SmsMmsCommonData::SMS_MSM_STATUS_SENDING);
183 predicates.OrderByDesc(SmsMmsInfo::START_TIME);
184 DelayedSingleton<SmsPersistHelper>::GetInstance()->QuerySmsMmsForId(predicates, dataId);
185 }
186 bool ret = interfaceManager->TextBasedSmsDelivery(StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(scAddr),
187 StringUtils::ToUtf8(text), sendCallback, deliveryCallback, dataId, isMmsApp);
188 DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateContact(StringUtils::ToUtf8(desAddr));
189 return ret;
190 }
191
SendMessageWithoutSave(int32_t slotId,const u16string desAddr,const u16string scAddr,const u16string text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)192 int32_t SmsService::SendMessageWithoutSave(int32_t slotId, const u16string desAddr, const u16string scAddr,
193 const u16string text, const sptr<ISendShortMessageCallback> &sendCallback,
194 const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
195 {
196 return SendMessage(slotId, desAddr, scAddr, text, sendCallback, deliveryCallback);
197 }
198
InsertSessionAndDetail(int32_t slotId,const std::string & telephone,const std::string & text,uint16_t & dataBaseId)199 void SmsService::InsertSessionAndDetail(int32_t slotId, const std::string &telephone, const std::string &text,
200 uint16_t &dataBaseId)
201 {
202 uint16_t sessionId = 0;
203 uint16_t messageCount = 0;
204 bool ret = QuerySessionByTelephone(telephone, sessionId, messageCount);
205 if (ret) {
206 InsertSmsMmsInfo(slotId, sessionId, telephone, text, dataBaseId);
207 messageCount++;
208 InsertSession(false, messageCount, telephone, text);
209 } else {
210 ret = InsertSession(true, 0, telephone, text);
211 if (ret) {
212 QuerySessionByTelephone(telephone, sessionId, messageCount);
213 InsertSmsMmsInfo(slotId, sessionId, telephone, text, dataBaseId);
214 }
215 }
216 }
217
QuerySessionByTelephone(const std::string & telephone,uint16_t & sessionId,uint16_t & messageCount)218 bool SmsService::QuerySessionByTelephone(const std::string &telephone, uint16_t &sessionId, uint16_t &messageCount)
219 {
220 DataShare::DataSharePredicates predicates;
221 auto persistHelper = DelayedSingleton<SmsPersistHelper>::GetInstance();
222 UpdatePredicatesByPhoneNum(predicates, telephone);
223 return persistHelper->QuerySession(predicates, sessionId, messageCount);
224 }
225
InsertSmsMmsInfo(int32_t slotId,uint16_t sessionId,const std::string & number,const std::string & text,uint16_t & dataBaseId)226 void SmsService::InsertSmsMmsInfo(
227 int32_t slotId, uint16_t sessionId, const std::string &number, const std::string &text, uint16_t &dataBaseId)
228 {
229 DataShare::DataSharePredicates predicates;
230 uint16_t maxGroupId = 0;
231 DelayedSingleton<SmsPersistHelper>::GetInstance()->QueryMaxGroupId(predicates, maxGroupId);
232 auto now = std::chrono::system_clock::now();
233 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
234 DataShare::DataShareValuesBucket smsMmsInfoBucket;
235 smsMmsInfoBucket.Put(SmsMmsInfo::SLOT_ID, std::to_string(slotId));
236 smsMmsInfoBucket.Put(SmsMmsInfo::RECEIVER_NUMBER, number);
237 smsMmsInfoBucket.Put(SmsMmsInfo::SENDER_NUMBER, "");
238 smsMmsInfoBucket.Put(SmsMmsInfo::IS_SENDER, "0");
239 smsMmsInfoBucket.Put(SmsMmsInfo::START_TIME, std::to_string(duration.count()));
240 smsMmsInfoBucket.Put(SmsMmsInfo::END_TIME, std::to_string(duration.count()));
241 smsMmsInfoBucket.Put(SmsMmsInfo::MSG_TYPE, "0");
242 smsMmsInfoBucket.Put(SmsMmsInfo::SMS_TYPE, "0");
243 smsMmsInfoBucket.Put(SmsMmsInfo::MSG_TITLE, text);
244 smsMmsInfoBucket.Put(SmsMmsInfo::MSG_CONTENT, text);
245 smsMmsInfoBucket.Put(SmsMmsInfo::MSG_STATE, SMS_MMS_INFO_MSG_STATE_SENDING);
246 smsMmsInfoBucket.Put(SmsMmsInfo::MSG_CODE, "");
247 smsMmsInfoBucket.Put(SmsMmsInfo::IS_LOCK, "0");
248 smsMmsInfoBucket.Put(SmsMmsInfo::IS_READ, "1");
249 smsMmsInfoBucket.Put(SmsMmsInfo::IS_COLLECT, "0");
250 smsMmsInfoBucket.Put(SmsMmsInfo::SESSION_TYPE, "0");
251 smsMmsInfoBucket.Put(SmsMmsInfo::SESSION_ID, std::to_string(sessionId));
252 smsMmsInfoBucket.Put(SmsMmsInfo::GROUP_ID, std::to_string(maxGroupId + 1));
253 smsMmsInfoBucket.Put(SmsMmsInfo::IS_SUBSECTION, "0");
254 smsMmsInfoBucket.Put(SmsMmsInfo::IS_SEND_REPORT, "0");
255 DelayedSingleton<SmsPersistHelper>::GetInstance()->Insert(SMS_MMS_INFO, smsMmsInfoBucket, dataBaseId);
256 }
257
258
InsertSession(bool isNewSession,uint16_t messageCount,const std::string & number,const std::string & text)259 bool SmsService::InsertSession(
260 bool isNewSession, uint16_t messageCount, const std::string &number, const std::string &text)
261 {
262 auto now = std::chrono::system_clock::now();
263 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
264 DataShare::DataShareValuesBucket sessionBucket;
265 sessionBucket.Put(Session::TIME, std::to_string(duration.count()));
266 sessionBucket.Put(Session::TELEPHONE, number);
267 sessionBucket.Put(Session::CONTENT, text);
268 sessionBucket.Put(Session::CONTACTS_NUM, "1");
269 sessionBucket.Put(Session::SMS_TYPE, "0");
270 sessionBucket.Put(Session::UNREAD_COUNT, "0");
271 sessionBucket.Put(Session::SENDING_STATUS, "0");
272 sessionBucket.Put(Session::HAS_DRAFT, "0");
273 sessionBucket.Put(Session::HAS_LOCK, "0");
274 sessionBucket.Put(Session::HAS_MMS, "0");
275 sessionBucket.Put(Session::HAS_ATTACHMENT, "0");
276 if (!isNewSession) {
277 sessionBucket.Put(Session::MESSAGE_COUNT, std::to_string(messageCount));
278 DataShare::DataSharePredicates predicates;
279 UpdatePredicatesByPhoneNum(predicates, number);
280 return DelayedSingleton<SmsPersistHelper>::GetInstance()->Update(predicates, sessionBucket);
281 }
282 sessionBucket.Put(Session::MESSAGE_COUNT, "1");
283 return DelayedSingleton<SmsPersistHelper>::GetInstance()->Insert(SMS_SESSION, sessionBucket);
284 }
285
SendMessage(int32_t slotId,const u16string desAddr,const u16string scAddr,uint16_t port,const uint8_t * data,uint16_t dataLen,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)286 int32_t SmsService::SendMessage(int32_t slotId, const u16string desAddr, const u16string scAddr, uint16_t port,
287 const uint8_t *data, uint16_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
288 const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
289 {
290 if (!CheckSmsPermission(sendCallback)) {
291 SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
292 SmsMmsErrorCode::SMS_ERROR_PERMISSION_ERROR, Permission::SEND_MESSAGES);
293 return TELEPHONY_ERR_PERMISSION_ERR;
294 }
295 if (desAddr.empty()) {
296 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
297 TELEPHONY_LOGE("SmsService::SendMessage desAddr empty");
298 return TELEPHONY_ERR_ARGUMENT_INVALID;
299 }
300 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
301 if (interfaceManager == nullptr) {
302 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
303 TELEPHONY_LOGE("SmsService::SendMessage interfaceManager nullptr error.");
304 SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
305 SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "data sms interfaceManager is nullptr");
306 return TELEPHONY_ERR_LOCAL_PTR_NULL;
307 }
308 if (!ValidDestinationAddress(StringUtils::ToUtf8(desAddr))) {
309 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
310 TELEPHONY_LOGE("SmsService::SendMessage desAddr not conform to the regular specification");
311 return TELEPHONY_ERR_ARGUMENT_INVALID;
312 }
313 bool ret = interfaceManager->DataBasedSmsDelivery(
314 StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(scAddr), port, data, dataLen, sendCallback, deliveryCallback);
315 DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateContact(StringUtils::ToUtf8(desAddr));
316 return ret;
317 }
318
CheckSmsPermission(const sptr<ISendShortMessageCallback> & sendCallback)319 bool SmsService::CheckSmsPermission(const sptr<ISendShortMessageCallback> &sendCallback)
320 {
321 if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
322 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
323 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
324 return false;
325 }
326 return true;
327 }
328
IsImsSmsSupported(int32_t slotId,bool & isSupported)329 int32_t SmsService::IsImsSmsSupported(int32_t slotId, bool &isSupported)
330 {
331 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
332 TELEPHONY_LOGE("Non-system applications use system APIs!");
333 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
334 }
335 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
336 if (interfaceManager == nullptr) {
337 TELEPHONY_LOGE("interfaceManager is nullptr.");
338 return TELEPHONY_ERR_SLOTID_INVALID;
339 }
340 return interfaceManager->IsImsSmsSupported(slotId, isSupported);
341 }
342
GetImsShortMessageFormat(std::u16string & format)343 int32_t SmsService::GetImsShortMessageFormat(std::u16string &format)
344 {
345 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
346 TELEPHONY_LOGE("Non-system applications use system APIs!");
347 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
348 }
349 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
350 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
351 return TELEPHONY_ERR_PERMISSION_ERR;
352 }
353 int32_t slotId = GetDefaultSmsSlotId();
354 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
355 if (interfaceManager == nullptr) {
356 TELEPHONY_LOGE("interfaceManager is nullptr error.");
357 return TELEPHONY_ERR_SLOTID_INVALID;
358 }
359 return interfaceManager->GetImsShortMessageFormat(format);
360 }
361
HasSmsCapability()362 bool SmsService::HasSmsCapability()
363 {
364 int32_t slotId = GetDefaultSmsSlotId();
365 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
366 if (interfaceManager == nullptr) {
367 TELEPHONY_LOGE("Get SmsInterfaceManager is nullptr error.");
368 return true;
369 }
370 return interfaceManager->HasSmsCapability();
371 }
372
SetSmscAddr(int32_t slotId,const std::u16string & scAddr)373 int32_t SmsService::SetSmscAddr(int32_t slotId, const std::u16string &scAddr)
374 {
375 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
376 TELEPHONY_LOGE("Non-system applications use system APIs!");
377 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
378 }
379 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
380 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Set State Permisson.");
381 return TELEPHONY_ERR_PERMISSION_ERR;
382 }
383
384 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
385 if (interfaceManager == nullptr) {
386 TELEPHONY_LOGE("interfaceManager is nullptr error.");
387 return TELEPHONY_ERR_SLOTID_INVALID;
388 }
389 string sca = StringUtils::ToUtf8(scAddr);
390 TrimSmscAddr(sca);
391 if (sca.empty() || sca.length() == 0) {
392 TELEPHONY_LOGE("sca is empty");
393 return TELEPHONY_ERR_ARGUMENT_NULL;
394 }
395 return interfaceManager->SetSmscAddr(sca);
396 }
397
TrimSmscAddr(std::string & sca)398 void SmsService::TrimSmscAddr(std::string &sca)
399 {
400 if (sca.length() < MIN_LEN) {
401 return;
402 }
403 while (sca.length() >= MIN_LEN && sca[0] == ' ') {
404 sca.erase(0, 1);
405 }
406 while (sca.length() > MIN_LEN && sca[sca.length() - 1] == ' ') {
407 sca.erase(sca.length() - 1, 1);
408 }
409 }
410
GetSmscAddr(int32_t slotId,std::u16string & smscAddress)411 int32_t SmsService::GetSmscAddr(int32_t slotId, std::u16string &smscAddress)
412 {
413 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
414 TELEPHONY_LOGE("Non-system applications use system APIs!");
415 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
416 }
417 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
418 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
419 return TELEPHONY_ERR_PERMISSION_ERR;
420 }
421
422 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
423 if (interfaceManager == nullptr) {
424 TELEPHONY_LOGE("SmsService::GetSmscAddr interfaceManager nullptr error");
425 return TELEPHONY_ERR_SLOTID_INVALID;
426 }
427 return interfaceManager->GetSmscAddr(smscAddress);
428 }
429
AddSimMessage(int32_t slotId,const std::u16string & smsc,const std::u16string & pdu,SimMessageStatus status)430 int32_t SmsService::AddSimMessage(
431 int32_t slotId, const std::u16string &smsc, const std::u16string &pdu, SimMessageStatus status)
432 {
433 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
434 TELEPHONY_LOGE("Non-system applications use system APIs!");
435 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
436 }
437 if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
438 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
439 return TELEPHONY_ERR_PERMISSION_ERR;
440 }
441 if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
442 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
443 return TELEPHONY_ERR_PERMISSION_ERR;
444 }
445
446 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
447 if (interfaceManager == nullptr) {
448 TELEPHONY_LOGE("SmsService::AddSimMessage interfaceManager nullptr error");
449 return TELEPHONY_ERR_SLOTID_INVALID;
450 }
451 std::string smscData = StringUtils::ToUtf8(smsc);
452 std::string pduData = StringUtils::ToUtf8(pdu);
453 if (pdu.empty() || pduData.empty()) {
454 TELEPHONY_LOGE("SmsService::AddSimMessage pdu empty error");
455 return TELEPHONY_ERR_ARGUMENT_INVALID;
456 }
457 return interfaceManager->AddSimMessage(smscData, pduData, status);
458 }
459
DelSimMessage(int32_t slotId,uint32_t msgIndex)460 int32_t SmsService::DelSimMessage(int32_t slotId, uint32_t msgIndex)
461 {
462 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
463 TELEPHONY_LOGE("Non-system applications use system APIs!");
464 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
465 }
466 if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
467 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
468 return TELEPHONY_ERR_PERMISSION_ERR;
469 }
470 if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
471 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
472 return TELEPHONY_ERR_PERMISSION_ERR;
473 }
474
475 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
476 if (interfaceManager == nullptr) {
477 TELEPHONY_LOGE("SmsService::DelSimMessage interfaceManager nullptr error.");
478 return TELEPHONY_ERR_SLOTID_INVALID;
479 }
480 if (!CheckSimMessageIndexValid(slotId, msgIndex)) {
481 TELEPHONY_LOGE("SmsService::DelSimMessage msgIndex inValid");
482 return TELEPHONY_ERR_ARGUMENT_INVALID;
483 }
484
485 return interfaceManager->DelSimMessage(msgIndex);
486 }
487
UpdateSimMessage(int32_t slotId,uint32_t msgIndex,SimMessageStatus newStatus,const std::u16string & pdu,const std::u16string & smsc)488 int32_t SmsService::UpdateSimMessage(int32_t slotId, uint32_t msgIndex, SimMessageStatus newStatus,
489 const std::u16string &pdu, const std::u16string &smsc)
490 {
491 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
492 TELEPHONY_LOGE("Non-system applications use system APIs!");
493 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
494 }
495 if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
496 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
497 return TELEPHONY_ERR_PERMISSION_ERR;
498 }
499 if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
500 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
501 return TELEPHONY_ERR_PERMISSION_ERR;
502 }
503
504 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
505 if (interfaceManager == nullptr) {
506 TELEPHONY_LOGE("SmsService::UpdateSimMessage interfaceManager nullptr error.");
507 return TELEPHONY_ERR_SLOTID_INVALID;
508 }
509 std::string pduData = StringUtils::ToUtf8(pdu);
510 std::string smscData = StringUtils::ToUtf8(smsc);
511 if (!CheckSimMessageIndexValid(slotId, msgIndex)) {
512 TELEPHONY_LOGE("SmsService::UpdateSimMessage msgIndex inValid");
513 return TELEPHONY_ERR_ARGUMENT_INVALID;
514 }
515 if (pdu.empty() || pduData.empty()) {
516 TELEPHONY_LOGE("SmsService::UpdateSimMessage pdu empty error");
517 return TELEPHONY_ERR_ARGUMENT_INVALID;
518 }
519 return interfaceManager->UpdateSimMessage(msgIndex, newStatus, pduData, smscData);
520 }
521
GetAllSimMessages(int32_t slotId,std::vector<ShortMessage> & message)522 int32_t SmsService::GetAllSimMessages(int32_t slotId, std::vector<ShortMessage> &message)
523 {
524 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
525 TELEPHONY_LOGE("Non-system applications use system APIs!");
526 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
527 }
528 if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
529 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
530 return TELEPHONY_ERR_PERMISSION_ERR;
531 }
532
533 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
534 if (interfaceManager == nullptr) {
535 TELEPHONY_LOGE("SmsService::GetAllSimMessages interfaceManager nullptr error.");
536 return TELEPHONY_ERR_SLOTID_INVALID;
537 }
538 return interfaceManager->GetAllSimMessages(message);
539 }
540
CheckSimMessageIndexValid(int32_t slotId,uint32_t msgIndex)541 bool SmsService::CheckSimMessageIndexValid(int32_t slotId, uint32_t msgIndex)
542 {
543 std::vector<ShortMessage> totalMessages;
544 int32_t result = GetAllSimMessages(slotId, totalMessages);
545 if (result != TELEPHONY_ERR_SUCCESS) {
546 TELEPHONY_LOGE("SmsService::CheckSimMessageIndexValid get result fail");
547 return false;
548 }
549
550 if (msgIndex < 0 || totalMessages.size() == 0) {
551 TELEPHONY_LOGE("SmsService::CheckSimMessageIndexValid msgIndex error");
552 return false;
553 }
554 for (auto message : totalMessages) {
555 if (message.GetIndexOnSim() == static_cast<int32_t>(msgIndex)) {
556 return true;
557 }
558 }
559 TELEPHONY_LOGI("SmsService::CheckSimMessageIndexValid msgIndex not founded");
560 return false;
561 }
562
SetCBConfig(int32_t slotId,bool enable,uint32_t fromMsgId,uint32_t toMsgId,uint8_t netType)563 int32_t SmsService::SetCBConfig(int32_t slotId, bool enable, uint32_t fromMsgId, uint32_t toMsgId, uint8_t netType)
564 {
565 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
566 TELEPHONY_LOGE("Non-system applications use system APIs!");
567 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
568 }
569 if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
570 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
571 return TELEPHONY_ERR_PERMISSION_ERR;
572 }
573
574 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
575 if (interfaceManager == nullptr) {
576 TELEPHONY_LOGE("SmsService::SetCBConfig interfaceManager nullptr error.");
577 return TELEPHONY_ERR_SLOTID_INVALID;
578 }
579 return interfaceManager->SetCBConfig(enable, fromMsgId, toMsgId, netType);
580 }
581
SetImsSmsConfig(int32_t slotId,int32_t enable)582 bool SmsService::SetImsSmsConfig(int32_t slotId, int32_t enable)
583 {
584 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
585 TELEPHONY_LOGE("Check permission failed.");
586 return false;
587 }
588 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
589 if (interfaceManager == nullptr) {
590 TELEPHONY_LOGE("SmsService::SetImsSmsConfig interfaceManager nullptr error.");
591 return false;
592 }
593 return interfaceManager->SetImsSmsConfig(slotId, enable);
594 }
595
SetDefaultSmsSlotId(int32_t slotId)596 int32_t SmsService::SetDefaultSmsSlotId(int32_t slotId)
597 {
598 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
599 TELEPHONY_LOGE("Non-system applications use system APIs!");
600 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
601 }
602 if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
603 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Set State Permisson.");
604 return TELEPHONY_ERR_PERMISSION_ERR;
605 }
606
607 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
608 if (interfaceManager == nullptr) {
609 TELEPHONY_LOGE("SmsService::SetDefaultSmsSlotId interfaceManager nullptr error.");
610 return TELEPHONY_ERR_LOCAL_PTR_NULL;
611 }
612 return interfaceManager->SetDefaultSmsSlotId(slotId);
613 }
614
GetDefaultSmsSlotId()615 int32_t SmsService::GetDefaultSmsSlotId()
616 {
617 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
618 if (interfaceManager == nullptr) {
619 TELEPHONY_LOGE("SmsService::GetDefaultSmsSlotId interfaceManager nullptr error.");
620 return TELEPHONY_ERROR;
621 }
622 return interfaceManager->GetDefaultSmsSlotId();
623 }
624
GetDefaultSmsSimId(int32_t & simId)625 int32_t SmsService::GetDefaultSmsSimId(int32_t &simId)
626 {
627 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
628 if (interfaceManager == nullptr) {
629 TELEPHONY_LOGE("interfaceManager nullptr error.");
630 return TELEPHONY_ERROR;
631 }
632 return interfaceManager->GetDefaultSmsSimId(simId);
633 }
634
SplitMessage(const std::u16string & message,std::vector<std::u16string> & splitMessage)635 int32_t SmsService::SplitMessage(const std::u16string &message, std::vector<std::u16string> &splitMessage)
636 {
637 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
638 TELEPHONY_LOGE("Non-system applications use system APIs!");
639 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
640 }
641 if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
642 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
643 return TELEPHONY_ERR_PERMISSION_ERR;
644 }
645
646 if (message.empty()) {
647 return TELEPHONY_ERR_ARGUMENT_INVALID;
648 }
649 int32_t slotId = GetDefaultSmsSlotId();
650 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
651 if (interfaceManager == nullptr) {
652 TELEPHONY_LOGE("SmsService::SplitMessage interfaceManager nullptr error.");
653 return TELEPHONY_ERR_SLOTID_INVALID;
654 }
655 std::string messageData = StringUtils::ToUtf8(message);
656 return interfaceManager->SplitMessage(messageData, splitMessage);
657 }
658
GetSmsSegmentsInfo(int32_t slotId,const std::u16string & message,bool force7BitCode,ISmsServiceInterface::SmsSegmentsInfo & info)659 int32_t SmsService::GetSmsSegmentsInfo(
660 int32_t slotId, const std::u16string &message, bool force7BitCode, ISmsServiceInterface::SmsSegmentsInfo &info)
661 {
662 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
663 TELEPHONY_LOGE("Non-system applications use system APIs!");
664 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
665 }
666 if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
667 TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
668 return TELEPHONY_ERR_PERMISSION_ERR;
669 }
670 if (message.empty()) {
671 return TELEPHONY_ERR_ARGUMENT_NULL;
672 }
673 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
674 if (interfaceManager == nullptr) {
675 TELEPHONY_LOGE("GetSmsSegmentsInfo interfaceManager is nullptr error.");
676 return TELEPHONY_ERR_SLOTID_INVALID;
677 }
678 std::string messageData = StringUtils::ToUtf8(message);
679 LengthInfo result;
680 int32_t ret = interfaceManager->GetSmsSegmentsInfo(messageData, force7BitCode, result);
681 if (ret != TELEPHONY_ERR_SUCCESS) {
682 return ret;
683 }
684 info.msgSegCount = static_cast<int32_t>(result.msgSegCount);
685 info.msgEncodingCount = static_cast<int32_t>(result.msgEncodeCount);
686 info.msgRemainCount = static_cast<int32_t>(result.msgRemainCount);
687 SmsSegmentsInfo::SmsSegmentCodeScheme dcs = static_cast<SmsSegmentsInfo::SmsSegmentCodeScheme>(result.dcs);
688 switch (dcs) {
689 case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_7BIT:
690 case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_8BIT:
691 case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_16BIT:
692 info.msgCodeScheme = dcs;
693 break;
694 default:
695 info.msgCodeScheme = SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_UNKNOWN;
696 break;
697 }
698 return TELEPHONY_ERR_SUCCESS;
699 }
700
GetServiceRunningState()701 int32_t SmsService::GetServiceRunningState()
702 {
703 return static_cast<int32_t>(state_);
704 }
705
GetEndTime()706 int64_t SmsService::GetEndTime()
707 {
708 return endTime_;
709 }
710
ValidDestinationAddress(std::string desAddr)711 bool SmsService::ValidDestinationAddress(std::string desAddr)
712 {
713 // Allow address start with '+' and number, Address length range 3 to 20
714 std::regex regexMode("^([0-9_+]{1})([0-9]{2,19})$");
715 return std::regex_match(desAddr, regexMode);
716 }
717
GetSpendTime()718 int64_t SmsService::GetSpendTime()
719 {
720 spendTime_ = endTime_ - bindTime_;
721 return spendTime_;
722 }
723
CreateMessage(std::string pdu,std::string specification,ShortMessage & message)724 int32_t SmsService::CreateMessage(std::string pdu, std::string specification, ShortMessage &message)
725 {
726 std::shared_ptr<SmsBaseMessage> baseMessage;
727 if (specification == "3gpp") {
728 baseMessage = GsmSmsMessage::CreateMessage(pdu);
729 } else if (specification == "3gpp2") {
730 baseMessage = CdmaSmsMessage::CreateMessage(pdu);
731 }
732
733 if (baseMessage == nullptr) {
734 return TELEPHONY_ERR_LOCAL_PTR_NULL;
735 }
736 message.visibleMessageBody_ = StringUtils::ToUtf16(baseMessage->GetVisibleMessageBody());
737 message.visibleRawAddress_ = StringUtils::ToUtf16(baseMessage->GetVisibleOriginatingAddress());
738 message.messageClass_ = static_cast<ShortMessage::SmsMessageClass>(baseMessage->GetMessageClass());
739 message.scAddress_ = StringUtils::ToUtf16(baseMessage->GetSmscAddr());
740 message.scTimestamp_ = baseMessage->GetScTimestamp();
741 message.isReplaceMessage_ = baseMessage->IsReplaceMessage();
742 message.status_ = baseMessage->GetStatus();
743 message.isSmsStatusReportMessage_ = baseMessage->IsSmsStatusReportMessage();
744 message.hasReplyPath_ = baseMessage->HasReplyPath();
745 message.protocolId_ = baseMessage->GetProtocolId();
746 message.pdu_ = baseMessage->GetRawPdu();
747 message.rawUserData_ = baseMessage->GetRawUserData();
748 return TELEPHONY_ERR_SUCCESS;
749 }
750
GetBase64Encode(std::string src,std::string & dest)751 bool SmsService::GetBase64Encode(std::string src, std::string &dest)
752 {
753 auto results = Base64::Encode(std::vector<unsigned char>(src.begin(), src.end()));
754 if (results == nullptr) {
755 TELEPHONY_LOGE("Base64 encoding failed: nullptr returned");
756 return false;
757 }
758 dest = *results;
759 return true;
760 }
761
GetBase64Decode(std::string src,std::string & dest)762 bool SmsService::GetBase64Decode(std::string src, std::string &dest)
763 {
764 auto results = Base64::Decode(src);
765 if (results == nullptr) {
766 TELEPHONY_LOGE("Base64 decoding failed: empty vector returned");
767 return false;
768 }
769 dest = std::string(results->begin(), results->end());
770 return true;
771 }
772
GetEncodeStringFunc(std::string & encodeString,uint32_t charset,uint32_t valLength,std::string strEncodeString)773 bool SmsService::GetEncodeStringFunc(
774 std::string &encodeString, uint32_t charset, uint32_t valLength, std::string strEncodeString)
775 {
776 TextCoder::Instance().GetEncodeString(encodeString, charset, valLength, strEncodeString);
777 return true;
778 }
779
SendMms(int32_t slotId,const std::u16string & mmsc,const std::u16string & data,const std::u16string & ua,const std::u16string & uaprof,int64_t & time,bool isMmsApp)780 int32_t SmsService::SendMms(int32_t slotId, const std::u16string &mmsc, const std::u16string &data,
781 const std::u16string &ua, const std::u16string &uaprof, int64_t &time, bool isMmsApp)
782 {
783 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
784 TELEPHONY_LOGE("Non-system applications use system APIs!");
785 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
786 }
787 if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
788 TELEPHONY_LOGE("check permission failed");
789 return TELEPHONY_ERR_PERMISSION_ERR;
790 }
791 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
792 if (interfaceManager == nullptr) {
793 TELEPHONY_LOGE("interfaceManager nullptr");
794 return TELEPHONY_ERR_SLOTID_INVALID;
795 }
796 if (mmsc.empty()) {
797 TELEPHONY_LOGE("mmsc URL is empty");
798 return TELEPHONY_ERR_ARGUMENT_INVALID;
799 }
800 if (data.empty()) {
801 TELEPHONY_LOGE("mms pdu file is empty");
802 return TELEPHONY_ERR_ARGUMENT_INVALID;
803 }
804 uint16_t dataBaseId = 0;
805 if (isMmsApp) {
806 DataShare::DataSharePredicates predicates;
807 predicates.EqualTo(SmsMmsInfo::MSG_TYPE, SmsMmsCommonData::SMS_MSM_TYPE_MMS);
808 predicates.EqualTo(SmsMmsInfo::MSG_STATE, SmsMmsCommonData::SMS_MSM_STATUS_SENDING);
809 predicates.EqualTo(SmsMmsInfo::SLOT_ID, slotId);
810 predicates.LessThanOrEqualTo(SmsMmsInfo::START_TIME, time);
811 predicates.OrderByDesc(SmsMmsInfo::START_TIME);
812 DelayedSingleton<SmsPersistHelper>::GetInstance()->QuerySmsMmsForId(predicates, dataBaseId);
813 TELEPHONY_LOGI("SmsService::SendMms. slot:%{public}d;;time:%{public}s;id:%{public}d",
814 slotId, std::to_string(time).c_str(), dataBaseId);
815 }
816 DataShare::DataShareValuesBucket sessionBucket;
817 int32_t ret = interfaceManager->SendMms(mmsc, data, ua, uaprof);
818 std::string sendStatus = SmsMmsCommonData::SMS_MMS_INFO_MSG_STATE_FAILED;
819 if (ret == TELEPHONY_ERR_SUCCESS) {
820 sessionBucket.Put(SmsMmsInfo::MSG_STATE, SmsMmsCommonData::SMS_MSM_STATUS_SUCCEED);
821 sendStatus = SmsMmsCommonData::SMS_MMS_INFO_MSG_STATE_SUCCEED;
822 } else {
823 sessionBucket.Put(SmsMmsInfo::MSG_STATE, SmsMmsCommonData::SMS_MSM_STATUS_FAILED);
824 }
825 if (isMmsApp) {
826 ServiceAfterSendMmsComplete(slotId, time, dataBaseId, sessionBucket, sendStatus);
827 }
828 return ret;
829 }
830
ServiceAfterSendMmsComplete(int32_t slotId,int64_t & time,uint16_t & dataBaseId,DataShare::DataShareValuesBucket & sessionBucket,std::string & sendStatus)831 void SmsService::ServiceAfterSendMmsComplete(int32_t slotId, int64_t &time, uint16_t &dataBaseId,
832 DataShare::DataShareValuesBucket &sessionBucket, std::string &sendStatus)
833 {
834 if (0 >= dataBaseId) {
835 TELEPHONY_LOGE("SmsService::SendMms. slot:%{public}d;time:%{public}s",
836 slotId, std::to_string(time).c_str());
837 } else {
838 DataShare::DataSharePredicates predicates;
839 predicates.EqualTo(SmsMmsInfo::MSG_ID, dataBaseId);
840 if (!DelayedSingleton<SmsPersistHelper>::GetInstance()->UpdateSms(predicates, sessionBucket)) {
841 TELEPHONY_LOGE("SmsService::SendMms. Failed UpdateSms;dataBaseId:%{public}d;", dataBaseId);
842 }
843 TELEPHONY_LOGI("before send boradcast. SmsService::SendMms %{public}d", dataBaseId);
844 DelayedSingleton<SmsMmsCommon>::GetInstance()->SendBroadcast(dataBaseId,
845 SmsMmsCommonData::SMS_MMS_SENT_RESULT_NOTIFY, sendStatus,
846 SmsMmsCommonData::SMS_MMS_INFO_MMS_TYPE);
847 }
848 return;
849 }
850
DownloadMms(int32_t slotId,const std::u16string & mmsc,std::u16string & data,const std::u16string & ua,const std::u16string & uaprof)851 int32_t SmsService::DownloadMms(int32_t slotId, const std::u16string &mmsc, std::u16string &data,
852 const std::u16string &ua, const std::u16string &uaprof)
853 {
854 if (!TelephonyPermission::CheckCallerIsSystemApp()) {
855 TELEPHONY_LOGE("Non-system applications use system APIs!");
856 return TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API;
857 }
858 if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MMS)) {
859 TELEPHONY_LOGE("check permission failed");
860 return TELEPHONY_ERR_PERMISSION_ERR;
861 }
862 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
863 if (interfaceManager == nullptr) {
864 TELEPHONY_LOGE("interfaceManager nullptr error");
865 return TELEPHONY_ERR_SLOTID_INVALID;
866 }
867 if (mmsc.empty()) {
868 TELEPHONY_LOGE("mmsc URL is empty");
869 return TELEPHONY_ERR_ARGUMENT_INVALID;
870 }
871 TELEPHONY_LOGI("download mms slotId:%{public}d", slotId);
872 int32_t ret = interfaceManager->DownloadMms(mmsc, data, ua, uaprof);
873 if (ret == TELEPHONY_ERR_SUCCESS) {
874 TELEPHONY_LOGI("down mms successed");
875 return TELEPHONY_ERR_SUCCESS;
876 } else {
877 TELEPHONY_LOGI("down mms failed");
878 return ret;
879 }
880 }
881
OnRilAdapterHostDied(int32_t slotId)882 int32_t SmsService::OnRilAdapterHostDied(int32_t slotId)
883 {
884 std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
885 if (interfaceManager == nullptr) {
886 TELEPHONY_LOGE("interfaceManager is nullptr error.");
887 return TELEPHONY_ERR_LOCAL_PTR_NULL;
888 }
889 interfaceManager->OnRilAdapterHostDied();
890 return TELEPHONY_ERR_SUCCESS;
891 }
892
IsInfoMsg(const std::string & telephone)893 bool SmsService::IsInfoMsg(const std::string &telephone)
894 {
895 std::regex regex(INFO_MSG_TELEPHONE_REG);
896 return std::regex_match(telephone, regex);
897 }
898
UpdatePredicatesByPhoneNum(DataShare::DataSharePredicates & predicates,const std::string & phoneNum)899 void SmsService::UpdatePredicatesByPhoneNum(DataShare::DataSharePredicates &predicates, const std::string &phoneNum)
900 {
901 // 如果尾数小于等于7位,直接全等对比;群聊也直接全等对比;通知消息也做全等对比
902 if (phoneNum.size() <= 7 || phoneNum.find(',') != std::string::npos || IsInfoMsg(phoneNum)) {
903 predicates.EqualTo(Session::TELEPHONE, phoneNum);
904 } else {
905 std::string formatNum;
906 auto persistHelper = DelayedSingleton<SmsPersistHelper>::GetInstance();
907 int32_t ret = persistHelper->FormatSmsNumber(
908 phoneNum, ISO_COUNTRY_CODE, i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::NATIONAL, formatNum);
909 if (ret != TELEPHONY_SUCCESS) {
910 ret = persistHelper->FormatSmsNumber(
911 phoneNum, ISO_COUNTRY_CODE, i18n::phonenumbers::PhoneNumberUtil::PhoneNumberFormat::E164, formatNum);
912 }
913 if (ret != TELEPHONY_SUCCESS) {
914 formatNum = phoneNum;
915 }
916 // 增加contactsNum字段的判断,防止单聊通过endsWith匹配到群聊。
917 predicates.In(Session::CONTACTS_NUM, std::vector<string>({ "0", "1" }));
918 predicates.And();
919 predicates.EndsWith(Session::TELEPHONE, phoneNum);
920 }
921 }
922 } // namespace Telephony
923 } // namespace OHOS
924