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 §ionId, 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