• 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_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