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_interface_manager.h"
17
18 #include "sms_hisysevent.h"
19 #include "sms_misc_manager.h"
20 #include "string_utils.h"
21 #include "telephony_errors.h"
22 #include "telephony_log_wrapper.h"
23
24 namespace OHOS {
25 namespace Telephony {
26 using namespace std;
SmsInterfaceManager(int32_t slotId)27 SmsInterfaceManager::SmsInterfaceManager(int32_t slotId) : slotId_(slotId) {}
28
~SmsInterfaceManager()29 SmsInterfaceManager::~SmsInterfaceManager() {}
30
InitInterfaceManager()31 void SmsInterfaceManager::InitInterfaceManager()
32 {
33 smsSendManager_ = make_unique<SmsSendManager>(slotId_);
34 if (smsSendManager_ == nullptr) {
35 TELEPHONY_LOGE("failed to create SmsSendManager");
36 return;
37 }
38 smsSendManager_->Init();
39
40 smsReceiveManager_ = make_unique<SmsReceiveManager>(slotId_);
41 if (smsReceiveManager_ == nullptr) {
42 TELEPHONY_LOGE("failed to create SmsReceiveManager");
43 return;
44 }
45 smsReceiveManager_->Init();
46 auto smsMiscRunner = AppExecFwk::EventRunner::Create("SmsMiscRunner" + to_string(slotId_));
47 if (smsMiscRunner == nullptr) {
48 TELEPHONY_LOGE("failed to create SmsCbRunner");
49 return;
50 }
51 smsReceiveManager_->SetCdmaSender(smsSendManager_->GetCdmaSmsSender());
52 smsMiscManager_ = make_shared<SmsMiscManager>(smsMiscRunner, slotId_);
53 smsMiscRunner->Run();
54 TELEPHONY_LOGI("SmsInterfaceManager::InitInterfaceManager success, %{public}d", slotId_);
55 }
56
TextBasedSmsDelivery(const string & desAddr,const string & scAddr,const string & text,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)57 int32_t SmsInterfaceManager::TextBasedSmsDelivery(const string &desAddr, const string &scAddr, const string &text,
58 const sptr<ISendShortMessageCallback> &sendCallback, const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
59 {
60 if (desAddr.empty() || text.empty()) {
61 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
62 SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
63 SmsMmsErrorCode::SMS_ERROR_EMPTY_INPUT_PARAMETER, "text sms arges is empty");
64 TELEPHONY_LOGE("TextBasedSmsDelivery failed to send.");
65 return TELEPHONY_ERR_ARGUMENT_INVALID;
66 }
67 if (smsSendManager_ == nullptr) {
68 TELEPHONY_LOGE("TextBasedSmsDelivery failed to send.");
69 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
70 SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
71 SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "text sms smsSendManager_ is nullptr");
72 return TELEPHONY_ERR_LOCAL_PTR_NULL;
73 }
74 smsSendManager_->TextBasedSmsDelivery(desAddr, scAddr, text, sendCallback, deliveryCallback);
75 return TELEPHONY_ERR_SUCCESS;
76 }
77
DataBasedSmsDelivery(const string & desAddr,const string & scAddr,const uint16_t port,const uint8_t * data,uint16_t dataLen,const sptr<ISendShortMessageCallback> & sendCallback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)78 int32_t SmsInterfaceManager::DataBasedSmsDelivery(const string &desAddr, const string &scAddr, const uint16_t port,
79 const uint8_t *data, uint16_t dataLen, const sptr<ISendShortMessageCallback> &sendCallback,
80 const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
81 {
82 if (desAddr.empty() || (data == nullptr)) {
83 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
84 SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
85 SmsMmsErrorCode::SMS_ERROR_EMPTY_INPUT_PARAMETER, "data sms arges is empty");
86 TELEPHONY_LOGE("DataBasedSmsDelivery failed to send.");
87 return TELEPHONY_ERR_ARGUMENT_INVALID;
88 }
89 if (smsSendManager_ == nullptr) {
90 TELEPHONY_LOGE("TextBasedSmsDelivery failed to send.");
91 SmsSender::SendResultCallBack(sendCallback, ISendShortMessageCallback::SEND_SMS_FAILURE_UNKNOWN);
92 SmsHiSysEvent::WriteSmsSendFaultEvent(slotId_, SmsMmsMessageType::SMS_SHORT_MESSAGE,
93 SmsMmsErrorCode::SMS_ERROR_NULL_POINTER, "text sms smsSendManager_ is nullptr");
94 return TELEPHONY_ERR_LOCAL_PTR_NULL;
95 }
96 smsSendManager_->DataBasedSmsDelivery(desAddr, scAddr, port, data, dataLen, sendCallback, deliveryCallback);
97 return TELEPHONY_ERR_SUCCESS;
98 }
99
AddSimMessage(const std::string & smsc,const std::string & pdu,ISmsServiceInterface::SimMessageStatus status)100 int32_t SmsInterfaceManager::AddSimMessage(
101 const std::string &smsc, const std::string &pdu, ISmsServiceInterface::SimMessageStatus status)
102 {
103 if (smsMiscManager_ == nullptr) {
104 TELEPHONY_LOGE("smsMiscManager nullptr error.");
105 return TELEPHONY_ERR_LOCAL_PTR_NULL;
106 }
107 return smsMiscManager_->AddSimMessage(smsc, pdu, status);
108 }
109
DelSimMessage(uint32_t msgIndex)110 int32_t SmsInterfaceManager::DelSimMessage(uint32_t msgIndex)
111 {
112 if (smsMiscManager_ == nullptr) {
113 TELEPHONY_LOGE("smsMiscManager nullptr error.");
114 return TELEPHONY_ERR_LOCAL_PTR_NULL;
115 }
116 return smsMiscManager_->DelSimMessage(msgIndex);
117 }
118
UpdateSimMessage(uint32_t msgIndex,ISmsServiceInterface::SimMessageStatus newStatus,const std::string & pdu,const std::string & smsc)119 int32_t SmsInterfaceManager::UpdateSimMessage(uint32_t msgIndex, ISmsServiceInterface::SimMessageStatus newStatus,
120 const std::string &pdu, const std::string &smsc)
121 {
122 if (smsMiscManager_ == nullptr) {
123 TELEPHONY_LOGE("smsMiscManager nullptr error.");
124 return TELEPHONY_ERR_LOCAL_PTR_NULL;
125 }
126 return smsMiscManager_->UpdateSimMessage(msgIndex, newStatus, pdu, smsc);
127 }
128
GetAllSimMessages(std::vector<ShortMessage> & message)129 int32_t SmsInterfaceManager::GetAllSimMessages(std::vector<ShortMessage> &message)
130 {
131 if (smsMiscManager_ == nullptr) {
132 TELEPHONY_LOGE("smsMiscManager nullptr error.");
133 return TELEPHONY_ERR_LOCAL_PTR_NULL;
134 }
135 return smsMiscManager_->GetAllSimMessages(message);
136 }
137
SetSmscAddr(const std::string & scAddr)138 int32_t SmsInterfaceManager::SetSmscAddr(const std::string &scAddr)
139 {
140 if (smsMiscManager_ == nullptr) {
141 TELEPHONY_LOGE("smsMiscManager nullptr error.");
142 return TELEPHONY_ERR_LOCAL_PTR_NULL;
143 }
144 return smsMiscManager_->SetSmscAddr(scAddr);
145 }
146
GetSmscAddr(std::u16string & smscAddress)147 int32_t SmsInterfaceManager::GetSmscAddr(std::u16string &smscAddress)
148 {
149 if (smsMiscManager_ == nullptr) {
150 TELEPHONY_LOGE("smsMiscManager nullptr error.");
151 return TELEPHONY_ERR_LOCAL_PTR_NULL;
152 }
153 return smsMiscManager_->GetSmscAddr(smscAddress);
154 }
155
SetCBConfig(bool enable,uint32_t fromMsgId,uint32_t toMsgId,uint8_t netType)156 int32_t SmsInterfaceManager::SetCBConfig(bool enable, uint32_t fromMsgId, uint32_t toMsgId, uint8_t netType)
157 {
158 if (smsMiscManager_ == nullptr) {
159 TELEPHONY_LOGE("smsMiscManager nullptr error.");
160 return TELEPHONY_ERR_LOCAL_PTR_NULL;
161 }
162 return smsMiscManager_->SetCBConfig(enable, fromMsgId, toMsgId, netType);
163 }
164
SetImsSmsConfig(int32_t slotId,int32_t enable)165 bool SmsInterfaceManager::SetImsSmsConfig(int32_t slotId, int32_t enable)
166 {
167 if (smsMiscManager_ == nullptr) {
168 TELEPHONY_LOGE("smsMiscManager nullptr error.");
169 return false;
170 }
171 return smsSendManager_->SetImsSmsConfig(slotId, enable);
172 }
173
SetDefaultSmsSlotId(int32_t slotId)174 int32_t SmsInterfaceManager::SetDefaultSmsSlotId(int32_t slotId)
175 {
176 if (smsMiscManager_ == nullptr) {
177 TELEPHONY_LOGE("smsMiscManager nullptr error.");
178 return TELEPHONY_ERR_LOCAL_PTR_NULL;
179 }
180 return smsMiscManager_->SetDefaultSmsSlotId(slotId);
181 }
182
GetDefaultSmsSlotId()183 int32_t SmsInterfaceManager::GetDefaultSmsSlotId()
184 {
185 if (smsMiscManager_ == nullptr) {
186 TELEPHONY_LOGE("smsMiscManager nullptr error.");
187 return TELEPHONY_ERROR;
188 }
189 return smsMiscManager_->GetDefaultSmsSlotId();
190 }
191
SplitMessage(const std::string & message,std::vector<std::u16string> & splitMessage)192 int32_t SmsInterfaceManager::SplitMessage(const std::string &message, std::vector<std::u16string> &splitMessage)
193 {
194 if (smsSendManager_ == nullptr) {
195 TELEPHONY_LOGE("smsSendManager nullptr error.");
196 return TELEPHONY_ERR_LOCAL_PTR_NULL;
197 }
198 return smsSendManager_->SplitMessage(message, splitMessage);
199 }
200
GetSmsSegmentsInfo(const std::string & message,bool force7BitCode,LengthInfo & outInfo)201 int32_t SmsInterfaceManager::GetSmsSegmentsInfo(const std::string &message, bool force7BitCode, LengthInfo &outInfo)
202 {
203 if (smsSendManager_ == nullptr) {
204 TELEPHONY_LOGE("smsSendManager nullptr error.");
205 return TELEPHONY_ERR_LOCAL_PTR_NULL;
206 }
207 return smsSendManager_->GetSmsSegmentsInfo(message, force7BitCode, outInfo);
208 }
209
IsImsSmsSupported(int32_t slotId,bool & isSupported)210 int32_t SmsInterfaceManager::IsImsSmsSupported(int32_t slotId, bool &isSupported)
211 {
212 if (smsSendManager_ == nullptr) {
213 TELEPHONY_LOGE("smsSendManager is nullptr error.");
214 return TELEPHONY_ERR_LOCAL_PTR_NULL;
215 }
216 return smsSendManager_->IsImsSmsSupported(slotId, isSupported);
217 }
218
GetImsShortMessageFormat(std::u16string & format)219 int32_t SmsInterfaceManager::GetImsShortMessageFormat(std::u16string &format)
220 {
221 if (smsSendManager_ == nullptr) {
222 TELEPHONY_LOGE("smsSendManager is nullptr error.");
223 return TELEPHONY_ERR_LOCAL_PTR_NULL;
224 }
225 return smsSendManager_->GetImsShortMessageFormat(format);
226 }
227
HasSmsCapability()228 bool SmsInterfaceManager::HasSmsCapability()
229 {
230 auto helperPtr = DelayedSingleton<SmsPersistHelper>::GetInstance();
231 if (helperPtr == nullptr) {
232 TELEPHONY_LOGE("Get SmsPersistHelper Singleton nullptr error.");
233 return true;
234 }
235 return helperPtr->QueryParamBoolean(SmsPersistHelper::SMS_CAPABLE_PARAM_KEY, true);
236 }
237 } // namespace Telephony
238 } // namespace OHOS