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