• 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 "msg_text_convert.h"
24 #include "sms_dump_helper.h"
25 #include "sms_hisysevent.h"
26 #include "string_utils.h"
27 #include "telephony_log_wrapper.h"
28 #include "telephony_common_utils.h"
29 #include "telephony_permission.h"
30 
31 namespace OHOS {
32 namespace Telephony {
33 using namespace std;
34 using namespace AppExecFwk;
35 using namespace HiviewDFX;
36 constexpr static uint32_t CONNECT_SERVICE_WAIT_TIME = 2000;
37 constexpr static size_t MIN_LEN = 1;
38 bool g_registerResult = SystemAbility::MakeAndRegisterAbility(DelayedSingleton<SmsService>::GetInstance().get());
39 
SmsService()40 SmsService::SmsService() : SystemAbility(TELEPHONY_SMS_MMS_SYS_ABILITY_ID, true) {}
41 
~SmsService()42 SmsService::~SmsService() {}
43 
OnStart()44 void SmsService::OnStart()
45 {
46     TELEPHONY_LOGI("SmsService::OnStart start service Enter.");
47     bindTime_ =
48         std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
49             .count();
50     if (state_ == ServiceRunningState::STATE_RUNNING) {
51         TELEPHONY_LOGE("msService has already started.");
52         return;
53     }
54     if (!Init()) {
55         TELEPHONY_LOGE("failed to init SmsService");
56         return;
57     }
58     state_ = ServiceRunningState::STATE_RUNNING;
59     endTime_ =
60         std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
61             .count();
62     TELEPHONY_LOGI("SmsService::OnStart start service Exit.");
63 }
64 
Init()65 bool SmsService::Init()
66 {
67     DelayedSingleton<ImsSmsClient>::GetInstance()->Init();
68     if (!registerToService_) {
69         bool ret = Publish(DelayedSingleton<SmsService>::GetInstance().get());
70         if (!ret) {
71             TELEPHONY_LOGE("SmsService::Init Publish failed!");
72             return false;
73         }
74         registerToService_ = true;
75         WaitCoreServiceToInit();
76     }
77     DelayedSingleton<SmsStateHandler>::GetInstance()->Init();
78     return true;
79 }
80 
OnStop()81 void SmsService::OnStop()
82 {
83     state_ = ServiceRunningState::STATE_NOT_START;
84     registerToService_ = false;
85     DelayedSingleton<ImsSmsClient>::GetInstance()->UnInit();
86     DelayedSingleton<SmsStateHandler>::GetInstance()->UnInit();
87     TELEPHONY_LOGI("SmsService::OnStop stop service.");
88 }
89 
Dump(std::int32_t fd,const std::vector<std::u16string> & args)90 int32_t SmsService::Dump(std::int32_t fd, const std::vector<std::u16string> &args)
91 {
92     if (fd < 0) {
93         TELEPHONY_LOGE("dump fd invalid");
94         return TELEPHONY_ERR_FAIL;
95     }
96     std::vector<std::string> argsInStr;
97     for (const auto &arg : args) {
98         TELEPHONY_LOGI("Dump args: %{public}s", Str16ToStr8(arg).c_str());
99         argsInStr.emplace_back(Str16ToStr8(arg));
100     }
101     std::string result;
102     SmsDumpHelper dumpHelper;
103     if (dumpHelper.Dump(argsInStr, result)) {
104         TELEPHONY_LOGI("%{public}s", result.c_str());
105         std::int32_t ret = dprintf(fd, "%s", result.c_str());
106         if (ret < 0) {
107             TELEPHONY_LOGE("dprintf to dump fd failed");
108             return TELEPHONY_ERR_FAIL;
109         }
110         return TELEPHONY_SUCCESS;
111     }
112     TELEPHONY_LOGW("dumpHelper failed");
113     return TELEPHONY_ERR_FAIL;
114 }
115 
WaitCoreServiceToInit()116 void SmsService::WaitCoreServiceToInit()
117 {
118     std::thread connectTask([&]() {
119         while (true) {
120             if (CoreManagerInner::GetInstance().IsInitFinished()) {
121                 InitModule();
122                 TELEPHONY_LOGI("SmsService Connection successful");
123                 break;
124             }
125             std::this_thread::sleep_for(std::chrono::milliseconds(CONNECT_SERVICE_WAIT_TIME));
126         }
127     });
128     connectTask.detach();
129 }
130 
GetBindTime()131 std::string SmsService::GetBindTime()
132 {
133     return std::to_string(bindTime_);
134 }
135 
SendMessage(int32_t slotId,const u16string desAddr,const u16string scAddr,const u16string text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)136 int32_t SmsService::SendMessage(int32_t slotId, const u16string desAddr, const u16string scAddr, const u16string text,
137     const sptr<ISendShortMessageCallback> &sendCallback, const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
138 {
139     if (NoPermissionOrParametersCheckFail(slotId, desAddr, sendCallback)) {
140         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
141             SmsMmsErrorCode::SMS_ERROR_PERMISSION_ERROR, Permission::SEND_MESSAGES);
142         return TELEPHONY_ERR_PERMISSION_ERR;
143     }
144     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
145     if (interfaceManager == nullptr) {
146         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
147         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
148             SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "text sms interfaceManager is nullptr");
149         TELEPHONY_LOGE("SmsService::SendMessage interfaceManager nullptr error.");
150         return TELEPHONY_ERR_LOCAL_PTR_NULL;
151     }
152     if (!ValidDestinationAddress(StringUtils::ToUtf8(desAddr))) {
153         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
154         TELEPHONY_LOGE("SmsService::SendMessage desAddr not conform to the regular specification");
155         return TELEPHONY_ERR_ARGUMENT_INVALID;
156     }
157     int32_t ret = interfaceManager->TextBasedSmsDelivery(StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(scAddr),
158         StringUtils::ToUtf8(text), sendCallback, deliveryCallback);
159     std::string bundleName = GetBundleName();
160     if (bundleName != COM_OHOS_MMS) {
161         InsertSessionAndDetail(slotId, StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(text));
162     }
163     return ret;
164 }
165 
InsertSessionAndDetail(int32_t slotId,const std::string & telephone,const std::string & text)166 void SmsService::InsertSessionAndDetail(int32_t slotId, const std::string &telephone, const std::string &text)
167 {
168     uint16_t sectionId;
169     uint16_t messageCount;
170     bool ret = QuerySessionByTelephone(telephone, sectionId, messageCount);
171     if (ret) {
172         InsertSmsMmsInfo(slotId, sectionId, telephone, text);
173         messageCount++;
174         InsertSession(false, messageCount, telephone, text);
175     } else {
176         ret = InsertSession(true, 0, telephone, text);
177         if (ret) {
178             QuerySessionByTelephone(telephone, sectionId, messageCount);
179             InsertSmsMmsInfo(slotId, sectionId, telephone, text);
180         }
181     }
182 }
183 
QuerySessionByTelephone(const std::string & telephone,uint16_t & sectionId,uint16_t & messageCount)184 bool SmsService::QuerySessionByTelephone(const std::string &telephone, uint16_t &sectionId, uint16_t &messageCount)
185 {
186     DataShare::DataSharePredicates predicates;
187     predicates.EqualTo(Session::TELEPHONE, telephone);
188     return DelayedSingleton<SmsPersistHelper>::GetInstance()->QuerySession(predicates, sectionId, messageCount);
189 }
190 
InsertSmsMmsInfo(int32_t slotId,uint16_t sessionId,const std::string & number,const std::string & text)191 void SmsService::InsertSmsMmsInfo(int32_t slotId, uint16_t sessionId, const std::string &number, const std::string &text)
192 {
193     DataShare::DataSharePredicates predicates;
194     uint16_t maxGroupId = 0;
195     DelayedSingleton<SmsPersistHelper>::GetInstance()->QueryMaxGroupId(predicates, maxGroupId);
196     auto now = std::chrono::system_clock::now();
197     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
198     DataShare::DataShareValuesBucket smsMmsInfoBucket;
199     smsMmsInfoBucket.Put(SmsMmsInfo::SLOT_ID, std::to_string(slotId));
200     smsMmsInfoBucket.Put(SmsMmsInfo::RECEIVER_NUMBER, number);
201     smsMmsInfoBucket.Put(SmsMmsInfo::SENDER_NUMBER, "");
202     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SENDER, "0");
203     smsMmsInfoBucket.Put(SmsMmsInfo::START_TIME, std::to_string(duration.count()));
204     smsMmsInfoBucket.Put(SmsMmsInfo::END_TIME, std::to_string(duration.count()));
205     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_TYPE, "0");
206     smsMmsInfoBucket.Put(SmsMmsInfo::SMS_TYPE, "0");
207     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_TITLE, text);
208     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_CONTENT, text);
209     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_STATE, "0");
210     smsMmsInfoBucket.Put(SmsMmsInfo::MSG_CODE, "");
211     smsMmsInfoBucket.Put(SmsMmsInfo::IS_LOCK, "0");
212     smsMmsInfoBucket.Put(SmsMmsInfo::IS_READ, "1");
213     smsMmsInfoBucket.Put(SmsMmsInfo::IS_COLLECT, "0");
214     smsMmsInfoBucket.Put(SmsMmsInfo::SESSION_TYPE, "0");
215     smsMmsInfoBucket.Put(SmsMmsInfo::SESSION_ID, std::to_string(sessionId));
216     smsMmsInfoBucket.Put(SmsMmsInfo::GROUP_ID, std::to_string(maxGroupId + 1));
217     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SUBSECTION, "0");
218     smsMmsInfoBucket.Put(SmsMmsInfo::IS_SEND_REPORT, "0");
219     DelayedSingleton<SmsPersistHelper>::GetInstance()->Insert(SMS_MMS_INFO, smsMmsInfoBucket);
220 }
221 
InsertSession(bool isNewSession,uint16_t messageCount,const std::string & number,const std::string & text)222 bool SmsService::InsertSession(bool isNewSession, uint16_t messageCount, const std::string &number,
223     const std::string &text)
224 {
225     auto now = std::chrono::system_clock::now();
226     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
227     DataShare::DataShareValuesBucket sessionBucket;
228     sessionBucket.Put(Session::TIME, std::to_string(duration.count()));
229     sessionBucket.Put(Session::TELEPHONE, number);
230     sessionBucket.Put(Session::CONTENT, text);
231     sessionBucket.Put(Session::CONTACTS_NUM, "1");
232     sessionBucket.Put(Session::SMS_TYPE, "0");
233     sessionBucket.Put(Session::UNREAD_COUNT, "0");
234     sessionBucket.Put(Session::SENDING_STATUS, "0");
235     sessionBucket.Put(Session::HAS_DRAFT, "0");
236     sessionBucket.Put(Session::HAS_LOCK, "0");
237     sessionBucket.Put(Session::HAS_MMS, "0");
238     sessionBucket.Put(Session::HAS_ATTACHMENT, "0");
239     if (!isNewSession) {
240         sessionBucket.Put(Session::MESSAGE_COUNT, std::to_string(messageCount));
241         DataShare::DataSharePredicates predicates;
242         predicates.EqualTo(Session::TELEPHONE, number);
243         return DelayedSingleton<SmsPersistHelper>::GetInstance()->Update(predicates, sessionBucket);
244     }
245     sessionBucket.Put(Session::MESSAGE_COUNT, "1");
246     return DelayedSingleton<SmsPersistHelper>::GetInstance()->Insert(SESSION, sessionBucket);
247 }
248 
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)249 int32_t SmsService::SendMessage(int32_t slotId, const u16string desAddr, const u16string scAddr, uint16_t port,
250     const uint8_t *data, uint16_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
251     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
252 {
253     if (NoPermissionOrParametersCheckFail(slotId, desAddr, sendCallback)) {
254         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
255             SmsMmsErrorCode::SMS_ERROR_PERMISSION_ERROR, Permission::SEND_MESSAGES);
256         return TELEPHONY_ERR_PERMISSION_ERR;
257     }
258     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
259     if (interfaceManager == nullptr) {
260         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
261         TELEPHONY_LOGE("SmsService::SendMessage interfaceManager nullptr error.");
262         SmsHiSysEvent::WriteSmsSendFaultEvent(slotId, SmsMmsMessageType::SMS_SHORT_MESSAGE,
263             SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "data sms interfaceManager is nullptr");
264         return TELEPHONY_ERR_LOCAL_PTR_NULL;
265     }
266     if (!ValidDestinationAddress(StringUtils::ToUtf8(desAddr))) {
267         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
268         TELEPHONY_LOGE("SmsService::SendMessage desAddr not conform to the regular specification");
269         return TELEPHONY_ERR_ARGUMENT_INVALID;
270     }
271     return interfaceManager->DataBasedSmsDelivery(
272         StringUtils::ToUtf8(desAddr), StringUtils::ToUtf8(scAddr), port, data, dataLen, sendCallback, deliveryCallback);
273 }
274 
NoPermissionOrParametersCheckFail(int32_t slotId,const u16string desAddr,const sptr<ISendShortMessageCallback> & sendCallback)275 bool SmsService::NoPermissionOrParametersCheckFail(
276     int32_t slotId, const u16string desAddr, const sptr<ISendShortMessageCallback> &sendCallback)
277 {
278     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
279         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
280         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
281         return true;
282     }
283     if (desAddr.empty()) {
284         SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
285         TELEPHONY_LOGE("SmsService::SendMessage desAddr invalid.");
286         return true;
287     }
288     return false;
289 }
290 
IsImsSmsSupported(int32_t slotId,bool & isSupported)291 int32_t SmsService::IsImsSmsSupported(int32_t slotId, bool &isSupported)
292 {
293     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
294     if (interfaceManager == nullptr) {
295         TELEPHONY_LOGE("interfaceManager is nullptr.");
296         return TELEPHONY_ERR_SLOTID_INVALID;
297     }
298     return interfaceManager->IsImsSmsSupported(slotId, isSupported);
299 }
300 
GetImsShortMessageFormat(std::u16string & format)301 int32_t SmsService::GetImsShortMessageFormat(std::u16string &format)
302 {
303     int32_t slotId = GetDefaultSmsSlotId();
304     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
305     if (interfaceManager == nullptr) {
306         TELEPHONY_LOGE("interfaceManager is nullptr error.");
307         return TELEPHONY_ERR_SLOTID_INVALID;
308     }
309     return interfaceManager->GetImsShortMessageFormat(format);
310 }
311 
HasSmsCapability()312 bool SmsService::HasSmsCapability()
313 {
314     int32_t slotId = GetDefaultSmsSlotId();
315     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
316     if (interfaceManager == nullptr) {
317         TELEPHONY_LOGE("Get SmsInterfaceManager is nullptr error.");
318         return true;
319     }
320     return interfaceManager->HasSmsCapability();
321 }
322 
SetSmscAddr(int32_t slotId,const std::u16string & scAddr)323 int32_t SmsService::SetSmscAddr(int32_t slotId, const std::u16string &scAddr)
324 {
325     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
326         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Set State Permisson.");
327         return TELEPHONY_ERR_PERMISSION_ERR;
328     }
329 
330     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
331     if (interfaceManager == nullptr) {
332         TELEPHONY_LOGE("interfaceManager is nullptr error.");
333         return TELEPHONY_ERR_SLOTID_INVALID;
334     }
335     string sca = StringUtils::ToUtf8(scAddr);
336     TrimSmscAddr(sca);
337     if (sca.empty() || sca.length() == 0) {
338         TELEPHONY_LOGE("sca is empty");
339         return TELEPHONY_ERR_ARGUMENT_NULL;
340     }
341     return interfaceManager->SetSmscAddr(sca);
342 }
343 
TrimSmscAddr(std::string & sca)344 void SmsService::TrimSmscAddr(std::string &sca)
345 {
346     if (sca.length() < MIN_LEN) {
347         return;
348     }
349     while (sca.length() >= MIN_LEN && sca[0] == ' ') {
350         sca.erase(0, 1);
351     }
352     while (sca.length() > MIN_LEN && sca[sca.length() - 1] == ' ') {
353         sca.erase(sca.length() - 1, 1);
354     }
355 }
356 
GetSmscAddr(int32_t slotId,std::u16string & smscAddress)357 int32_t SmsService::GetSmscAddr(int32_t slotId, std::u16string &smscAddress)
358 {
359     if (!TelephonyPermission::CheckPermission(Permission::GET_TELEPHONY_STATE)) {
360         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
361         return TELEPHONY_ERR_PERMISSION_ERR;
362     }
363 
364     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
365     if (interfaceManager == nullptr) {
366         TELEPHONY_LOGE("SmsService::GetSmscAddr interfaceManager nullptr error");
367         return TELEPHONY_ERR_SLOTID_INVALID;
368     }
369     return interfaceManager->GetSmscAddr(smscAddress);
370 }
371 
AddSimMessage(int32_t slotId,const std::u16string & smsc,const std::u16string & pdu,SimMessageStatus status)372 int32_t SmsService::AddSimMessage(
373     int32_t slotId, const std::u16string &smsc, const std::u16string &pdu, SimMessageStatus status)
374 {
375     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
376         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
377         return TELEPHONY_ERR_PERMISSION_ERR;
378     }
379     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
380         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
381         return TELEPHONY_ERR_PERMISSION_ERR;
382     }
383 
384     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
385     if (interfaceManager == nullptr) {
386         TELEPHONY_LOGE("SmsService::AddSimMessage interfaceManager nullptr error");
387         return TELEPHONY_ERR_SLOTID_INVALID;
388     }
389     std::string smscData = StringUtils::ToUtf8(smsc);
390     std::string pduData = StringUtils::ToUtf8(pdu);
391     if (pdu.empty() || pduData.empty()) {
392         TELEPHONY_LOGE("SmsService::AddSimMessage pdu empty error");
393         return TELEPHONY_ERR_ARGUMENT_INVALID;
394     }
395     return interfaceManager->AddSimMessage(smscData, pduData, status);
396 }
397 
DelSimMessage(int32_t slotId,uint32_t msgIndex)398 int32_t SmsService::DelSimMessage(int32_t slotId, uint32_t msgIndex)
399 {
400     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
401         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
402         return TELEPHONY_ERR_PERMISSION_ERR;
403     }
404     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
405         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
406         return TELEPHONY_ERR_PERMISSION_ERR;
407     }
408 
409     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
410     if (interfaceManager == nullptr) {
411         TELEPHONY_LOGE("SmsService::DelSimMessage interfaceManager nullptr error.");
412         return TELEPHONY_ERR_SLOTID_INVALID;
413     }
414     if (!CheckSimMessageIndexValid(slotId, msgIndex)) {
415         TELEPHONY_LOGE("SmsService::DelSimMessage msgIndex inValid");
416         return TELEPHONY_ERR_ARGUMENT_INVALID;
417     }
418 
419     return interfaceManager->DelSimMessage(msgIndex);
420 }
421 
UpdateSimMessage(int32_t slotId,uint32_t msgIndex,SimMessageStatus newStatus,const std::u16string & pdu,const std::u16string & smsc)422 int32_t SmsService::UpdateSimMessage(int32_t slotId, uint32_t msgIndex, SimMessageStatus newStatus,
423     const std::u16string &pdu, const std::u16string &smsc)
424 {
425     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
426         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
427         return TELEPHONY_ERR_PERMISSION_ERR;
428     }
429     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
430         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Send Messages Permisson.");
431         return TELEPHONY_ERR_PERMISSION_ERR;
432     }
433 
434     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
435     if (interfaceManager == nullptr) {
436         TELEPHONY_LOGE("SmsService::UpdateSimMessage interfaceManager nullptr error.");
437         return TELEPHONY_ERR_SLOTID_INVALID;
438     }
439     std::string pduData = StringUtils::ToUtf8(pdu);
440     std::string smscData = StringUtils::ToUtf8(smsc);
441     if (!CheckSimMessageIndexValid(slotId, msgIndex)) {
442         TELEPHONY_LOGE("SmsService::UpdateSimMessage msgIndex inValid");
443         return TELEPHONY_ERR_ARGUMENT_INVALID;
444     }
445     if (pdu.empty() || pduData.empty()) {
446         TELEPHONY_LOGE("SmsService::UpdateSimMessage pdu empty error");
447         return TELEPHONY_ERR_ARGUMENT_INVALID;
448     }
449     return interfaceManager->UpdateSimMessage(msgIndex, newStatus, pduData, smscData);
450 }
451 
GetAllSimMessages(int32_t slotId,std::vector<ShortMessage> & message)452 int32_t SmsService::GetAllSimMessages(int32_t slotId, std::vector<ShortMessage> &message)
453 {
454     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
455         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
456         return TELEPHONY_ERR_PERMISSION_ERR;
457     }
458 
459     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
460     if (interfaceManager == nullptr) {
461         TELEPHONY_LOGE("SmsService::GetAllSimMessages interfaceManager nullptr error.");
462         return TELEPHONY_ERR_SLOTID_INVALID;
463     }
464     return interfaceManager->GetAllSimMessages(message);
465 }
466 
CheckSimMessageIndexValid(int32_t slotId,uint32_t msgIndex)467 bool SmsService::CheckSimMessageIndexValid(int32_t slotId, uint32_t msgIndex)
468 {
469     std::vector<ShortMessage> totalMessages;
470     int32_t result = GetAllSimMessages(slotId, totalMessages);
471     if (result != TELEPHONY_ERR_SUCCESS) {
472         TELEPHONY_LOGE("SmsService::CheckSimMessageIndexValid get result fail");
473         return false;
474     }
475 
476     if (msgIndex < 0 || totalMessages.size() == 0) {
477         TELEPHONY_LOGE("SmsService::CheckSimMessageIndexValid msgIndex error");
478         return false;
479     }
480     for (auto message : totalMessages) {
481         if (message.GetIndexOnSim() == static_cast<int32_t>(msgIndex)) {
482             return true;
483         }
484     }
485     TELEPHONY_LOGI("SmsService::CheckSimMessageIndexValid msgIndex not founded");
486     return false;
487 }
488 
SetCBConfig(int32_t slotId,bool enable,uint32_t fromMsgId,uint32_t toMsgId,uint8_t netType)489 int32_t SmsService::SetCBConfig(int32_t slotId, bool enable, uint32_t fromMsgId, uint32_t toMsgId, uint8_t netType)
490 {
491     if (!TelephonyPermission::CheckPermission(Permission::RECEIVE_MESSAGES)) {
492         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Receive Messages Permisson.");
493         return TELEPHONY_ERR_PERMISSION_ERR;
494     }
495 
496     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
497     if (interfaceManager == nullptr) {
498         TELEPHONY_LOGE("SmsService::SetCBConfig interfaceManager nullptr error.");
499         return TELEPHONY_ERR_SLOTID_INVALID;
500     }
501     return interfaceManager->SetCBConfig(enable, fromMsgId, toMsgId, netType);
502 }
503 
SetImsSmsConfig(int32_t slotId,int32_t enable)504 bool SmsService::SetImsSmsConfig(int32_t slotId, int32_t enable)
505 {
506     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
507         TELEPHONY_LOGE("Check permission failed.");
508         return false;
509     }
510     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
511     if (interfaceManager == nullptr) {
512         TELEPHONY_LOGE("SmsService::SetImsSmsConfig interfaceManager nullptr error.");
513         return false;
514     }
515     return interfaceManager->SetImsSmsConfig(slotId, enable);
516 }
517 
SetDefaultSmsSlotId(int32_t slotId)518 int32_t SmsService::SetDefaultSmsSlotId(int32_t slotId)
519 {
520     if (!TelephonyPermission::CheckPermission(Permission::SET_TELEPHONY_STATE)) {
521         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Set State Permisson.");
522         return TELEPHONY_ERR_PERMISSION_ERR;
523     }
524 
525     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
526     if (interfaceManager == nullptr) {
527         TELEPHONY_LOGE("SmsService::SetDefaultSmsSlotId interfaceManager nullptr error.");
528         return TELEPHONY_ERR_LOCAL_PTR_NULL;
529     }
530     return interfaceManager->SetDefaultSmsSlotId(slotId);
531 }
532 
GetDefaultSmsSlotId()533 int32_t SmsService::GetDefaultSmsSlotId()
534 {
535     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager();
536     if (interfaceManager == nullptr) {
537         TELEPHONY_LOGE("SmsService::GetDefaultSmsSlotId interfaceManager nullptr error.");
538         return TELEPHONY_ERROR;
539     }
540     return interfaceManager->GetDefaultSmsSlotId();
541 }
542 
SplitMessage(const std::u16string & message,std::vector<std::u16string> & splitMessage)543 int32_t SmsService::SplitMessage(const std::u16string &message, std::vector<std::u16string> &splitMessage)
544 {
545     if (!TelephonyPermission::CheckPermission(Permission::SEND_MESSAGES)) {
546         TELEPHONY_LOGE("Check Permission Failed, No Has Telephony Get State Permisson.");
547         return TELEPHONY_ERR_PERMISSION_ERR;
548     }
549 
550     if (message.empty()) {
551         return TELEPHONY_ERR_ARGUMENT_INVALID;
552     }
553     int32_t slotId = GetDefaultSmsSlotId();
554     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
555     if (interfaceManager == nullptr) {
556         TELEPHONY_LOGE("SmsService::SplitMessage interfaceManager nullptr error.");
557         return TELEPHONY_ERR_SLOTID_INVALID;
558     }
559     std::string messageData = StringUtils::ToUtf8(message);
560     return interfaceManager->SplitMessage(messageData, splitMessage);
561 }
562 
GetSmsSegmentsInfo(int32_t slotId,const std::u16string & message,bool force7BitCode,ISmsServiceInterface::SmsSegmentsInfo & info)563 int32_t SmsService::GetSmsSegmentsInfo(
564     int32_t slotId, const std::u16string &message, bool force7BitCode, ISmsServiceInterface::SmsSegmentsInfo &info)
565 {
566     if (message.empty()) {
567         return TELEPHONY_ERR_ARGUMENT_NULL;
568     }
569     std::shared_ptr<SmsInterfaceManager> interfaceManager = GetSmsInterfaceManager(slotId);
570     if (interfaceManager == nullptr) {
571         TELEPHONY_LOGE("GetSmsSegmentsInfo interfaceManager is nullptr error.");
572         return TELEPHONY_ERR_SLOTID_INVALID;
573     }
574     std::string messageData = StringUtils::ToUtf8(message);
575     LengthInfo result;
576     int32_t ret = interfaceManager->GetSmsSegmentsInfo(messageData, force7BitCode, result);
577     if (ret != TELEPHONY_ERR_SUCCESS) {
578         return ret;
579     }
580     info.msgSegCount = static_cast<int32_t>(result.msgSegCount);
581     info.msgEncodingCount = static_cast<int32_t>(result.msgEncodeCount);
582     info.msgRemainCount = static_cast<int32_t>(result.msgRemainCount);
583     SmsSegmentsInfo::SmsSegmentCodeScheme dcs = static_cast<SmsSegmentsInfo::SmsSegmentCodeScheme>(result.dcs);
584     switch (dcs) {
585         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_7BIT:
586         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_8BIT:
587         case SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_16BIT:
588             info.msgCodeScheme = dcs;
589             break;
590         default:
591             info.msgCodeScheme = SmsSegmentsInfo::SmsSegmentCodeScheme::SMS_ENCODING_UNKNOWN;
592             break;
593     }
594     return TELEPHONY_ERR_SUCCESS;
595 }
596 
GetServiceRunningState()597 int32_t SmsService::GetServiceRunningState()
598 {
599     return static_cast<int32_t>(state_);
600 }
601 
GetEndTime()602 int64_t SmsService::GetEndTime()
603 {
604     return endTime_;
605 }
606 
ValidDestinationAddress(std::string desAddr)607 bool SmsService::ValidDestinationAddress(std::string desAddr)
608 {
609     // Allow address start with '+' and number, Address length range 3 to 20
610     std::regex regexMode("^([0-9_+]{1})([0-9]{2,19})$");
611     return std::regex_match(desAddr, regexMode);
612 }
613 
GetSpendTime()614 int64_t SmsService::GetSpendTime()
615 {
616     spendTime_ = endTime_ - bindTime_;
617     return spendTime_;
618 }
619 
CreateMessage(std::string pdu,std::string specification,ShortMessage & message)620 int32_t SmsService::CreateMessage(std::string pdu, std::string specification, ShortMessage &message)
621 {
622     std::shared_ptr<SmsBaseMessage> baseMessage;
623     if (specification == "3gpp") {
624         baseMessage = GsmSmsMessage::CreateMessage(pdu);
625     } else if (specification == "3gpp2") {
626         baseMessage = CdmaSmsMessage::CreateMessage(pdu);
627     }
628 
629     if (baseMessage == nullptr) {
630         return TELEPHONY_ERR_LOCAL_PTR_NULL;
631     }
632     message.visibleMessageBody_ = StringUtils::ToUtf16(baseMessage->GetVisibleMessageBody());
633     message.visibleRawAddress_ = StringUtils::ToUtf16(baseMessage->GetVisibleOriginatingAddress());
634     message.messageClass_ = static_cast<ShortMessage::SmsMessageClass>(baseMessage->GetMessageClass());
635     message.scAddress_ = StringUtils::ToUtf16(baseMessage->GetSmscAddr());
636     message.scTimestamp_ = baseMessage->GetScTimestamp();
637     message.isReplaceMessage_ = baseMessage->IsReplaceMessage();
638     message.status_ = baseMessage->GetStatus();
639     message.isSmsStatusReportMessage_ = baseMessage->IsSmsStatusReportMessage();
640     message.hasReplyPath_ = baseMessage->HasReplyPath();
641     message.protocolId_ = baseMessage->GetProtocolId();
642     message.pdu_ = baseMessage->GetRawPdu();
643     return TELEPHONY_ERR_SUCCESS;
644 }
645 
GetBase64Encode(std::string src,std::string & dest)646 bool SmsService::GetBase64Encode(std::string src, std::string &dest)
647 {
648     MsgTextConvert *textCvt = MsgTextConvert::Instance();
649     if (textCvt == nullptr) {
650         return false;
651     }
652 
653     textCvt->Base64Encode(src, dest);
654     return true;
655 }
656 
GetBase64Decode(std::string src,std::string & dest)657 bool SmsService::GetBase64Decode(std::string src, std::string &dest)
658 {
659     MsgTextConvert *textCvt = MsgTextConvert::Instance();
660     if (textCvt == nullptr) {
661         return false;
662     }
663 
664     textCvt->Base64Decode(src, dest);
665     return true;
666 }
667 
GetEncodeStringFunc(std::string & encodeString,uint32_t charset,uint32_t valLength,std::string strEncodeString)668 bool SmsService::GetEncodeStringFunc(
669     std::string &encodeString, uint32_t charset, uint32_t valLength, std::string strEncodeString)
670 {
671     MsgTextConvert *textCvt = MsgTextConvert::Instance();
672     if (textCvt == nullptr) {
673         return false;
674     }
675 
676     textCvt->GetEncodeString(encodeString, charset, valLength, strEncodeString);
677     return true;
678 }
679 } // namespace Telephony
680 } // namespace OHOS