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_manager_client.h"
17 
18 #include "if_system_ability_manager.h"
19 #include "iservice_registry.h"
20 #include "sms_service_interface_death_recipient.h"
21 #include "system_ability_definition.h"
22 #include "telephony_errors.h"
23 #include "telephony_log_wrapper.h"
24 
25 namespace OHOS {
26 namespace Telephony {
SmsServiceManagerClient()27 SmsServiceManagerClient::SmsServiceManagerClient() {}
28 
~SmsServiceManagerClient()29 SmsServiceManagerClient::~SmsServiceManagerClient() {}
30 
InitSmsServiceProxy()31 bool SmsServiceManagerClient::InitSmsServiceProxy()
32 {
33     std::lock_guard<std::mutex> lock(mutex_);
34     if (smsServiceInterface_ == nullptr) {
35         sptr<ISystemAbilityManager> systemAbilityManager =
36             SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
37         if (!systemAbilityManager) {
38             TELEPHONY_LOGE(" Get system ability mgr failed.");
39             return false;
40         }
41         sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(TELEPHONY_SMS_MMS_SYS_ABILITY_ID);
42         if (!remoteObject) {
43             TELEPHONY_LOGE("Get SMS Service Failed.");
44             return false;
45         }
46         smsServiceInterface_ = iface_cast<ISmsServiceInterface>(remoteObject);
47         if ((!smsServiceInterface_) || (!smsServiceInterface_->AsObject())) {
48             TELEPHONY_LOGE("Get SMS Service Proxy Failed.");
49             return false;
50         }
51         recipient_ = new SmsServiceInterfaceDeathRecipient(*this);
52         if (!recipient_) {
53             TELEPHONY_LOGE("Failed to create death Recipient ptr SmsServiceInterfaceDeathRecipient!");
54             return false;
55         }
56         smsServiceInterface_->AsObject()->AddDeathRecipient(recipient_);
57     }
58     return true;
59 }
60 
ResetSmsServiceProxy()61 void SmsServiceManagerClient::ResetSmsServiceProxy()
62 {
63     std::lock_guard<std::mutex> lock(mutex_);
64     if ((smsServiceInterface_ != nullptr) && (smsServiceInterface_->AsObject() != nullptr)) {
65         smsServiceInterface_->AsObject()->RemoveDeathRecipient(recipient_);
66     }
67     smsServiceInterface_ = nullptr;
68 }
69 
SetDefaultSmsSlotId(int32_t slotId)70 int32_t SmsServiceManagerClient::SetDefaultSmsSlotId(int32_t slotId)
71 {
72     if (InitSmsServiceProxy()) {
73         std::lock_guard<std::mutex> lock(mutex_);
74         return smsServiceInterface_->SetDefaultSmsSlotId(slotId);
75     }
76     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
77 }
78 
GetDefaultSmsSimId(int32_t & simId)79 int32_t SmsServiceManagerClient::GetDefaultSmsSimId(int32_t &simId)
80 {
81     if (InitSmsServiceProxy()) {
82         std::lock_guard<std::mutex> lock(mutex_);
83         return smsServiceInterface_->GetDefaultSmsSimId(simId);
84     }
85     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
86 }
87 
GetDefaultSmsSlotId()88 int32_t SmsServiceManagerClient::GetDefaultSmsSlotId()
89 {
90     if (InitSmsServiceProxy()) {
91         std::lock_guard<std::mutex> lock(mutex_);
92         return smsServiceInterface_->GetDefaultSmsSlotId();
93     }
94     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
95 }
96 
SendMessage(int32_t slotId,const std::u16string desAddr,const std::u16string scAddr,const std::u16string text,const sptr<ISendShortMessageCallback> & callback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)97 int32_t SmsServiceManagerClient::SendMessage(int32_t slotId, const std::u16string desAddr, const std::u16string scAddr,
98     const std::u16string text, const sptr<ISendShortMessageCallback> &callback,
99     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
100 {
101     if (InitSmsServiceProxy()) {
102         std::lock_guard<std::mutex> lock(mutex_);
103         return smsServiceInterface_->SendMessage(slotId, desAddr, scAddr, text, callback, deliveryCallback);
104     }
105     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
106 }
107 
SendMessage(int32_t slotId,const std::u16string desAddr,const std::u16string scAddr,uint16_t port,const uint8_t * data,uint16_t dataLen,const sptr<ISendShortMessageCallback> & callback,const sptr<IDeliveryShortMessageCallback> & deliveryCallback)108 int32_t SmsServiceManagerClient::SendMessage(int32_t slotId, const std::u16string desAddr, const std::u16string scAddr,
109     uint16_t port, const uint8_t *data, uint16_t dataLen, const sptr<ISendShortMessageCallback> &callback,
110     const sptr<IDeliveryShortMessageCallback> &deliveryCallback)
111 {
112     if (InitSmsServiceProxy()) {
113         std::lock_guard<std::mutex> lock(mutex_);
114         return smsServiceInterface_->SendMessage(
115             slotId, desAddr, scAddr, port, data, dataLen, callback, deliveryCallback);
116     }
117     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
118 }
119 
SetScAddress(int32_t slotId,const std::u16string & scAddr)120 int32_t SmsServiceManagerClient::SetScAddress(int32_t slotId, const std::u16string &scAddr)
121 {
122     if (InitSmsServiceProxy()) {
123         std::lock_guard<std::mutex> lock(mutex_);
124         return smsServiceInterface_->SetSmscAddr(slotId, scAddr);
125     }
126     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
127 }
128 
GetScAddress(int32_t slotId,std::u16string & smscAddress)129 int32_t SmsServiceManagerClient::GetScAddress(int32_t slotId, std::u16string &smscAddress)
130 {
131     if (InitSmsServiceProxy()) {
132         std::lock_guard<std::mutex> lock(mutex_);
133         return smsServiceInterface_->GetSmscAddr(slotId, smscAddress);
134     }
135     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
136 }
137 
AddSimMessage(int32_t slotId,const std::u16string & smsc,const std::u16string & pdu,ISmsServiceInterface::SimMessageStatus status)138 int32_t SmsServiceManagerClient::AddSimMessage(int32_t slotId, const std::u16string &smsc, const std::u16string &pdu,
139     ISmsServiceInterface::SimMessageStatus status)
140 {
141     if (InitSmsServiceProxy()) {
142         std::lock_guard<std::mutex> lock(mutex_);
143         return smsServiceInterface_->AddSimMessage(slotId, smsc, pdu, status);
144     }
145     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
146 }
147 
DelSimMessage(int32_t slotId,uint32_t msgIndex)148 int32_t SmsServiceManagerClient::DelSimMessage(int32_t slotId, uint32_t msgIndex)
149 {
150     if (InitSmsServiceProxy()) {
151         std::lock_guard<std::mutex> lock(mutex_);
152         return smsServiceInterface_->DelSimMessage(slotId, msgIndex);
153     }
154     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
155 }
156 
UpdateSimMessage(int32_t slotId,uint32_t msgIndex,ISmsServiceInterface::SimMessageStatus newStatus,const std::u16string & pdu,const std::u16string & smsc)157 int32_t SmsServiceManagerClient::UpdateSimMessage(int32_t slotId, uint32_t msgIndex,
158     ISmsServiceInterface::SimMessageStatus newStatus, const std::u16string &pdu, const std::u16string &smsc)
159 {
160     if (InitSmsServiceProxy()) {
161         std::lock_guard<std::mutex> lock(mutex_);
162         return smsServiceInterface_->UpdateSimMessage(slotId, msgIndex, newStatus, pdu, smsc);
163     }
164     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
165 }
166 
GetAllSimMessages(int32_t slotId,std::vector<ShortMessage> & message)167 int32_t SmsServiceManagerClient::GetAllSimMessages(int32_t slotId, std::vector<ShortMessage> &message)
168 {
169     if (InitSmsServiceProxy()) {
170         std::lock_guard<std::mutex> lock(mutex_);
171         return smsServiceInterface_->GetAllSimMessages(slotId, message);
172     }
173     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
174 }
175 
SetCBConfig(int32_t slotId,bool enable,uint32_t startMessageId,uint32_t endMessageId,uint8_t ranType)176 int32_t SmsServiceManagerClient::SetCBConfig(
177     int32_t slotId, bool enable, uint32_t startMessageId, uint32_t endMessageId, uint8_t ranType)
178 {
179     if (InitSmsServiceProxy()) {
180         std::lock_guard<std::mutex> lock(mutex_);
181         return smsServiceInterface_->SetCBConfig(slotId, enable, startMessageId, endMessageId, ranType);
182     }
183     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
184 }
185 
SetImsSmsConfig(int32_t slotId,int32_t enable)186 bool SmsServiceManagerClient::SetImsSmsConfig(int32_t slotId, int32_t enable)
187 {
188     if (InitSmsServiceProxy()) {
189         std::lock_guard<std::mutex> lock(mutex_);
190         return smsServiceInterface_->SetImsSmsConfig(slotId, enable);
191     }
192     return false;
193 }
194 
SendMms(int32_t slotId,const std::u16string & mmsc,const std::u16string & data,const std::u16string & ua,const std::u16string & uaprof)195 int32_t SmsServiceManagerClient::SendMms(int32_t slotId, const std::u16string &mmsc, const std::u16string &data,
196     const std::u16string &ua, const std::u16string &uaprof)
197 {
198     if (InitSmsServiceProxy()) {
199         std::lock_guard<std::mutex> lock(mutex_);
200         return smsServiceInterface_->SendMms(slotId, mmsc, data, ua, uaprof);
201     }
202     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
203 }
204 
DownloadMms(int32_t slotId,const std::u16string & mmsc,std::u16string & data,const std::u16string & ua,const std::u16string & uaprof)205 int32_t SmsServiceManagerClient::DownloadMms(int32_t slotId, const std::u16string &mmsc, std::u16string &data,
206     const std::u16string &ua, const std::u16string &uaprof)
207 {
208     if (InitSmsServiceProxy()) {
209         std::lock_guard<std::mutex> lock(mutex_);
210         return smsServiceInterface_->DownloadMms(slotId, mmsc, data, ua, uaprof);
211     }
212     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
213 }
214 
SplitMessage(const std::u16string & message,std::vector<std::u16string> & splitMessage)215 int32_t SmsServiceManagerClient::SplitMessage(const std::u16string &message, std::vector<std::u16string> &splitMessage)
216 {
217     if (InitSmsServiceProxy()) {
218         std::lock_guard<std::mutex> lock(mutex_);
219         return smsServiceInterface_->SplitMessage(message, splitMessage);
220     }
221     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
222 }
223 
GetSmsSegmentsInfo(int32_t slotId,const std::u16string & message,bool force7BitCode,ISmsServiceInterface::SmsSegmentsInfo & segInfo)224 int32_t SmsServiceManagerClient::GetSmsSegmentsInfo(
225     int32_t slotId, const std::u16string &message, bool force7BitCode, ISmsServiceInterface::SmsSegmentsInfo &segInfo)
226 {
227     if (InitSmsServiceProxy()) {
228         std::lock_guard<std::mutex> lock(mutex_);
229         return smsServiceInterface_->GetSmsSegmentsInfo(slotId, message, force7BitCode, segInfo);
230     }
231     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
232 }
233 
IsImsSmsSupported(int32_t slotId,bool & isSupported)234 int32_t SmsServiceManagerClient::IsImsSmsSupported(int32_t slotId, bool &isSupported)
235 {
236     if (InitSmsServiceProxy()) {
237         std::lock_guard<std::mutex> lock(mutex_);
238         return smsServiceInterface_->IsImsSmsSupported(slotId, isSupported);
239     }
240     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
241 }
242 
GetImsShortMessageFormat(std::u16string & format)243 int32_t SmsServiceManagerClient::GetImsShortMessageFormat(std::u16string &format)
244 {
245     if (InitSmsServiceProxy()) {
246         std::lock_guard<std::mutex> lock(mutex_);
247         return smsServiceInterface_->GetImsShortMessageFormat(format);
248     }
249     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
250 }
251 
HasSmsCapability()252 bool SmsServiceManagerClient::HasSmsCapability()
253 {
254     if (InitSmsServiceProxy()) {
255         std::lock_guard<std::mutex> lock(mutex_);
256         return smsServiceInterface_->HasSmsCapability();
257     }
258     return false;
259 }
260 
CreateMessage(std::string pdu,std::string specification,ShortMessage & message)261 int32_t SmsServiceManagerClient::CreateMessage(std::string pdu, std::string specification, ShortMessage &message)
262 {
263     if (InitSmsServiceProxy()) {
264         std::lock_guard<std::mutex> lock(mutex_);
265         return smsServiceInterface_->CreateMessage(pdu, specification, message);
266     }
267     return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
268 }
269 
GetBase64Encode(std::string src,std::string & dest)270 bool SmsServiceManagerClient::GetBase64Encode(std::string src, std::string &dest)
271 {
272     if (InitSmsServiceProxy()) {
273         std::lock_guard<std::mutex> lock(mutex_);
274         return smsServiceInterface_->GetBase64Encode(src, dest);
275     }
276     return false;
277 }
278 
GetBase64Decode(std::string src,std::string & dest)279 bool SmsServiceManagerClient::GetBase64Decode(std::string src, std::string &dest)
280 {
281     if (InitSmsServiceProxy()) {
282         std::lock_guard<std::mutex> lock(mutex_);
283         return smsServiceInterface_->GetBase64Decode(src, dest);
284     }
285     return false;
286 }
287 
GetEncodeStringFunc(std::string & encodeString,uint32_t charset,uint32_t valLength,std::string strEncodeString)288 bool SmsServiceManagerClient::GetEncodeStringFunc(
289     std::string &encodeString, uint32_t charset, uint32_t valLength, std::string strEncodeString)
290 {
291     if (InitSmsServiceProxy()) {
292         std::lock_guard<std::mutex> lock(mutex_);
293         return smsServiceInterface_->GetEncodeStringFunc(encodeString, charset, valLength, strEncodeString);
294     }
295     return false;
296 }
297 } // namespace Telephony
298 } // namespace OHOS