1 /*
2 * Copyright (C) 2022 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 "ims_call_client.h"
17
18 #include "cellular_call_hisysevent.h"
19 #include "ims_call_callback_stub.h"
20 #include "iservice_registry.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 {
27 ImsCallClient::ImsCallClient() = default;
28
~ImsCallClient()29 ImsCallClient::~ImsCallClient()
30 {
31 UnInit();
32 }
33
Init()34 void ImsCallClient::Init()
35 {
36 TELEPHONY_LOGI("Init start");
37 if (IsConnect()) {
38 TELEPHONY_LOGE("Init, IsConnect return true");
39 return;
40 }
41
42 GetImsCallProxy();
43 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
44 if (imsCallProxy_ == nullptr) {
45 TELEPHONY_LOGE("Init, get ims call proxy failed!");
46 }
47
48 statusChangeListener_ = new (std::nothrow) SystemAbilityListener();
49 if (statusChangeListener_ == nullptr) {
50 TELEPHONY_LOGE("Init, failed to create statusChangeListener.");
51 return;
52 }
53 auto managerPtr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
54 if (managerPtr == nullptr) {
55 TELEPHONY_LOGE("Init, get system ability manager error.");
56 return;
57 }
58 int32_t ret = managerPtr->SubscribeSystemAbility(TELEPHONY_IMS_SYS_ABILITY_ID, statusChangeListener_);
59 if (ret) {
60 TELEPHONY_LOGE("Init, failed to subscribe sa:%{public}d", TELEPHONY_IMS_SYS_ABILITY_ID);
61 return;
62 }
63 TELEPHONY_LOGI("Init successfully");
64 }
65
UnInit()66 void ImsCallClient::UnInit()
67 {
68 Clean();
69 if (statusChangeListener_ != nullptr) {
70 statusChangeListener_.clear();
71 statusChangeListener_ = nullptr;
72 }
73 std::lock_guard<std::mutex> lock(mutexMap_);
74 handlerMap_.clear();
75 }
76
GetImsCallProxy()77 sptr<ImsCallInterface> ImsCallClient::GetImsCallProxy()
78 {
79 {
80 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
81 if (imsCallProxy_ != nullptr) {
82 return imsCallProxy_;
83 }
84 }
85 auto managerPtr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
86 if (managerPtr == nullptr) {
87 TELEPHONY_LOGE("GetImsCallProxy return, get system ability manager error.");
88 return nullptr;
89 }
90 auto remoteObjectPtr = managerPtr->CheckSystemAbility(TELEPHONY_IMS_SYS_ABILITY_ID);
91 if (remoteObjectPtr == nullptr) {
92 TELEPHONY_LOGE("GetImsCallProxy return, remote service not exists.");
93 return nullptr;
94 }
95 Utils::UniqueWriteGuard<Utils::RWLock> guard(rwClientLock_);
96 imsCoreServiceProxy_ = iface_cast<ImsCoreServiceInterface>(remoteObjectPtr);
97 if (imsCoreServiceProxy_ == nullptr) {
98 TELEPHONY_LOGE("GetImsCallProxy return, imsCoreServiceProxy_ is nullptr.");
99 return nullptr;
100 }
101 sptr<IRemoteObject> imsCallRemoteObjectPtr = imsCoreServiceProxy_->GetProxyObjectPtr(PROXY_IMS_CALL);
102 if (imsCallRemoteObjectPtr == nullptr) {
103 TELEPHONY_LOGE("GetImsCallProxy return, ImsCallRemoteObjectPtr is nullptr.");
104 return nullptr;
105 }
106
107 imsCallProxy_ = iface_cast<ImsCallInterface>(imsCallRemoteObjectPtr);
108 if (imsCallProxy_ == nullptr) {
109 TELEPHONY_LOGE("GetImsCallProxy return, iface_cast<imsCallProxy_> failed!");
110 return nullptr;
111 }
112 // register callback
113 RegisterImsCallCallback();
114 TELEPHONY_LOGI("GetImsCallProxy success.");
115 return imsCallProxy_;
116 }
117
IsConnect()118 bool ImsCallClient::IsConnect()
119 {
120 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
121 return (imsCallProxy_ != nullptr);
122 }
123
RegisterImsCallCallback()124 int32_t ImsCallClient::RegisterImsCallCallback()
125 {
126 if (imsCallProxy_ == nullptr) {
127 TELEPHONY_LOGE("imsCallProxy_ is null!");
128 return TELEPHONY_ERR_LOCAL_PTR_NULL;
129 }
130 imsCallCallback_ = (std::make_unique<ImsCallCallbackStub>()).release();
131 if (imsCallCallback_ == nullptr) {
132 TELEPHONY_LOGE("RegisterImsCallCallback return, make unique error.");
133 return TELEPHONY_ERR_LOCAL_PTR_NULL;
134 }
135 int32_t ret = imsCallProxy_->RegisterImsCallCallback(imsCallCallback_);
136 if (ret) {
137 TELEPHONY_LOGE("RegisterImsCallCallback return, register callback error.");
138 return TELEPHONY_ERR_FAIL;
139 }
140 TELEPHONY_LOGI("RegisterImsCallCallback success.");
141 return TELEPHONY_SUCCESS;
142 }
143
RegisterImsCallCallbackHandler(int32_t slotId,const std::shared_ptr<AppExecFwk::EventHandler> & handler)144 int32_t ImsCallClient::RegisterImsCallCallbackHandler(
145 int32_t slotId, const std::shared_ptr<AppExecFwk::EventHandler> &handler)
146 {
147 if (handler == nullptr) {
148 TELEPHONY_LOGE("RegisterImsCallCallbackHandler return, handler is null.");
149 return TELEPHONY_ERR_LOCAL_PTR_NULL;
150 }
151
152 std::lock_guard<std::mutex> lock(mutexMap_);
153 handlerMap_.insert(std::make_pair(slotId, handler));
154 TELEPHONY_LOGI("RegisterImsCallCallbackHandler success.");
155 return TELEPHONY_SUCCESS;
156 }
157
GetHandler(int32_t slotId)158 std::shared_ptr<AppExecFwk::EventHandler> ImsCallClient::GetHandler(int32_t slotId)
159 {
160 std::lock_guard<std::mutex> lock(mutexMap_);
161 return handlerMap_[slotId];
162 }
163
Dial(const ImsCallInfo & callInfo,CLIRMode mode)164 int32_t ImsCallClient::Dial(const ImsCallInfo &callInfo, CLIRMode mode)
165 {
166 if (ReConnectService() != TELEPHONY_SUCCESS) {
167 TELEPHONY_LOGE("ipc reconnect failed!");
168 CellularCallHiSysEvent::WriteDialCallFaultEvent(callInfo.slotId, INVALID_PARAMETER, callInfo.videoState,
169 TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL, "ipc reconnect failed");
170 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
171 }
172 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
173 return imsCallProxy_->Dial(callInfo, mode);
174 }
175
HangUp(const ImsCallInfo & callInfo)176 int32_t ImsCallClient::HangUp(const ImsCallInfo &callInfo)
177 {
178 if (ReConnectService() != TELEPHONY_SUCCESS) {
179 TELEPHONY_LOGE("ipc reconnect failed!");
180 CellularCallHiSysEvent::WriteHangUpFaultEvent(
181 callInfo.slotId, INVALID_PARAMETER, TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL, "HangUp ims ipc reconnect failed");
182 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
183 }
184 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
185 return imsCallProxy_->HangUp(callInfo);
186 }
187
Reject(const ImsCallInfo & callInfo)188 int32_t ImsCallClient::Reject(const ImsCallInfo &callInfo)
189 {
190 if (ReConnectService() != TELEPHONY_SUCCESS) {
191 TELEPHONY_LOGE("ipc reconnect failed!");
192 CellularCallHiSysEvent::WriteHangUpFaultEvent(
193 callInfo.slotId, INVALID_PARAMETER, TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL, "Reject ims ipc reconnect failed");
194 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
195 }
196 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
197 return imsCallProxy_->RejectWithReason(callInfo, ImsRejectReason::USER_DECLINE);
198 }
199
RejectWithReason(const ImsCallInfo & callInfo,const ImsRejectReason & reason)200 int32_t ImsCallClient::RejectWithReason(const ImsCallInfo &callInfo, const ImsRejectReason &reason)
201 {
202 if (ReConnectService() != TELEPHONY_SUCCESS) {
203 TELEPHONY_LOGE("ipc reconnect failed!");
204 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
205 }
206 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
207 return imsCallProxy_->RejectWithReason(callInfo, reason);
208 }
209
Answer(const ImsCallInfo & callInfo)210 int32_t ImsCallClient::Answer(const ImsCallInfo &callInfo)
211 {
212 if (ReConnectService() != TELEPHONY_SUCCESS) {
213 TELEPHONY_LOGE("ipc reconnect failed!");
214 CellularCallHiSysEvent::WriteAnswerCallFaultEvent(callInfo.slotId, INVALID_PARAMETER, callInfo.videoState,
215 TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL, "answer ims ipc reconnect failed");
216 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
217 }
218 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
219 return imsCallProxy_->Answer(callInfo);
220 }
221
HoldCall(int32_t slotId,int32_t callType)222 int32_t ImsCallClient::HoldCall(int32_t slotId, int32_t callType)
223 {
224 if (ReConnectService() != TELEPHONY_SUCCESS) {
225 TELEPHONY_LOGE("ipc reconnect failed!");
226 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
227 }
228 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
229 return imsCallProxy_->HoldCall(slotId, callType);
230 }
231
UnHoldCall(int32_t slotId,int32_t callType)232 int32_t ImsCallClient::UnHoldCall(int32_t slotId, int32_t callType)
233 {
234 if (ReConnectService() != TELEPHONY_SUCCESS) {
235 TELEPHONY_LOGE("ipc reconnect failed!");
236 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
237 }
238 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
239 return imsCallProxy_->UnHoldCall(slotId, callType);
240 }
241
SwitchCall(int32_t slotId,int32_t callType)242 int32_t ImsCallClient::SwitchCall(int32_t slotId, int32_t callType)
243 {
244 if (ReConnectService() != TELEPHONY_SUCCESS) {
245 TELEPHONY_LOGE("ipc reconnect failed!");
246 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
247 }
248 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
249 return imsCallProxy_->SwitchCall(slotId, callType);
250 }
251
CombineConference(int32_t slotId)252 int32_t ImsCallClient::CombineConference(int32_t slotId)
253 {
254 if (ReConnectService() != TELEPHONY_SUCCESS) {
255 TELEPHONY_LOGE("ipc reconnect failed!");
256 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
257 }
258 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
259 return imsCallProxy_->CombineConference(slotId);
260 }
261
InviteToConference(int32_t slotId,const std::vector<std::string> & numberList)262 int32_t ImsCallClient::InviteToConference(int32_t slotId, const std::vector<std::string> &numberList)
263 {
264 if (ReConnectService() != TELEPHONY_SUCCESS) {
265 TELEPHONY_LOGE("ipc reconnect failed!");
266 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
267 }
268 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
269 return imsCallProxy_->InviteToConference(slotId, numberList);
270 }
271
KickOutFromConference(int32_t slotId,int32_t index)272 int32_t ImsCallClient::KickOutFromConference(int32_t slotId, int32_t index)
273 {
274 if (ReConnectService() != TELEPHONY_SUCCESS) {
275 TELEPHONY_LOGE("ipc reconnect failed!");
276 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
277 }
278 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
279 return imsCallProxy_->KickOutFromConference(slotId, index);
280 }
281
SendUpdateCallMediaModeRequest(const ImsCallInfo & callInfo,ImsCallType callType)282 int32_t ImsCallClient::SendUpdateCallMediaModeRequest(const ImsCallInfo &callInfo, ImsCallType callType)
283 {
284 if (ReConnectService() != TELEPHONY_SUCCESS) {
285 TELEPHONY_LOGE("ipc reconnect failed!");
286 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
287 }
288 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
289 return imsCallProxy_->SendUpdateCallMediaModeRequest(callInfo, callType);
290 }
291
SendUpdateCallMediaModeResponse(const ImsCallInfo & callInfo,ImsCallType callType)292 int32_t ImsCallClient::SendUpdateCallMediaModeResponse(const ImsCallInfo &callInfo, ImsCallType callType)
293 {
294 if (ReConnectService() != TELEPHONY_SUCCESS) {
295 TELEPHONY_LOGE("ipc reconnect failed!");
296 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
297 }
298 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
299 return imsCallProxy_->SendUpdateCallMediaModeResponse(callInfo, callType);
300 }
301
CancelCallUpgrade(int32_t slotId,int32_t callIndex)302 int32_t ImsCallClient::CancelCallUpgrade(int32_t slotId, int32_t callIndex)
303 {
304 if (ReConnectService() != TELEPHONY_SUCCESS) {
305 TELEPHONY_LOGE("ipc reconnect failed!");
306 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
307 }
308 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
309 return imsCallProxy_->CancelCallUpgrade(slotId, callIndex);
310 }
311
RequestCameraCapabilities(int32_t slotId,int32_t callIndex)312 int32_t ImsCallClient::RequestCameraCapabilities(int32_t slotId, int32_t callIndex)
313 {
314 if (ReConnectService() != TELEPHONY_SUCCESS) {
315 TELEPHONY_LOGE("ipc reconnect failed!");
316 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
317 }
318 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
319 return imsCallProxy_->RequestCameraCapabilities(slotId, callIndex);
320 }
321
GetImsCallsDataRequest(int32_t slotId,int64_t lastCallsDataFlag)322 int32_t ImsCallClient::GetImsCallsDataRequest(int32_t slotId, int64_t lastCallsDataFlag)
323 {
324 if (ReConnectService() != TELEPHONY_SUCCESS) {
325 TELEPHONY_LOGE("ipc reconnect failed!");
326 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
327 }
328 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
329 return imsCallProxy_->GetImsCallsDataRequest(slotId, lastCallsDataFlag);
330 }
331
GetLastCallFailReason(int32_t slotId)332 int32_t ImsCallClient::GetLastCallFailReason(int32_t slotId)
333 {
334 if (ReConnectService() != TELEPHONY_SUCCESS) {
335 TELEPHONY_LOGE("ipc reconnect failed!");
336 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
337 }
338 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
339 return imsCallProxy_->GetLastCallFailReason(slotId);
340 }
341
StartDtmf(int32_t slotId,char cDtmfCode,int32_t index)342 int32_t ImsCallClient::StartDtmf(int32_t slotId, char cDtmfCode, int32_t index)
343 {
344 if (ReConnectService() != TELEPHONY_SUCCESS) {
345 TELEPHONY_LOGE("ipc reconnect failed!");
346 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
347 }
348 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
349 return imsCallProxy_->StartDtmf(slotId, cDtmfCode, index);
350 }
351
SendDtmf(int32_t slotId,char cDtmfCode,int32_t index)352 int32_t ImsCallClient::SendDtmf(int32_t slotId, char cDtmfCode, int32_t index)
353 {
354 if (ReConnectService() != TELEPHONY_SUCCESS) {
355 TELEPHONY_LOGE("ipc reconnect failed!");
356 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
357 }
358 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
359 return imsCallProxy_->SendDtmf(slotId, cDtmfCode, index);
360 }
361
StopDtmf(int32_t slotId,int32_t index)362 int32_t ImsCallClient::StopDtmf(int32_t slotId, int32_t index)
363 {
364 if (ReConnectService() != TELEPHONY_SUCCESS) {
365 TELEPHONY_LOGE("ipc reconnect failed!");
366 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
367 }
368 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
369 return imsCallProxy_->StopDtmf(slotId, index);
370 }
371
StartRtt(int32_t slotId,const std::string & msg)372 int32_t ImsCallClient::StartRtt(int32_t slotId, const std::string &msg)
373 {
374 if (ReConnectService() != TELEPHONY_SUCCESS) {
375 TELEPHONY_LOGE("ipc reconnect failed!");
376 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
377 }
378 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
379 return imsCallProxy_->StartRtt(slotId, msg);
380 }
381
StopRtt(int32_t slotId)382 int32_t ImsCallClient::StopRtt(int32_t slotId)
383 {
384 if (ReConnectService() != TELEPHONY_SUCCESS) {
385 TELEPHONY_LOGE("ipc reconnect failed!");
386 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
387 }
388 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
389 return imsCallProxy_->StopRtt(slotId);
390 }
391
SetDomainPreferenceMode(int32_t slotId,int32_t mode)392 int32_t ImsCallClient::SetDomainPreferenceMode(int32_t slotId, int32_t mode)
393 {
394 if (ReConnectService() != TELEPHONY_SUCCESS) {
395 TELEPHONY_LOGE("ipc reconnect failed!");
396 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
397 }
398 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
399 return imsCallProxy_->SetDomainPreferenceMode(slotId, mode);
400 }
401
GetDomainPreferenceMode(int32_t slotId)402 int32_t ImsCallClient::GetDomainPreferenceMode(int32_t slotId)
403 {
404 if (ReConnectService() != TELEPHONY_SUCCESS) {
405 TELEPHONY_LOGE("ipc reconnect failed!");
406 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
407 }
408 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
409 return imsCallProxy_->GetDomainPreferenceMode(slotId);
410 }
411
SetCarrierVtConfig(int32_t slotId,int32_t active)412 int32_t ImsCallClient::SetCarrierVtConfig(int32_t slotId, int32_t active)
413 {
414 if (ReConnectService() != TELEPHONY_SUCCESS) {
415 TELEPHONY_LOGE("ipc reconnect failed!");
416 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
417 }
418 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
419 return imsCallProxy_->SetCarrierVtConfig(slotId, active);
420 }
421
SetImsSwitchStatus(int32_t slotId,int32_t active)422 int32_t ImsCallClient::SetImsSwitchStatus(int32_t slotId, int32_t active)
423 {
424 if (ReConnectService() != TELEPHONY_SUCCESS) {
425 TELEPHONY_LOGE("ipc reconnect failed!");
426 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
427 }
428 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
429 return imsCallProxy_->SetImsSwitchStatus(slotId, active);
430 }
431
GetImsSwitchStatus(int32_t slotId)432 int32_t ImsCallClient::GetImsSwitchStatus(int32_t slotId)
433 {
434 if (ReConnectService() != TELEPHONY_SUCCESS) {
435 TELEPHONY_LOGE("ipc reconnect failed!");
436 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
437 }
438 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
439 return imsCallProxy_->GetImsSwitchStatus(slotId);
440 }
441
SetImsConfig(ImsConfigItem item,const std::string & value)442 int32_t ImsCallClient::SetImsConfig(ImsConfigItem item, const std::string &value)
443 {
444 if (ReConnectService() != TELEPHONY_SUCCESS) {
445 TELEPHONY_LOGE("ipc reconnect failed!");
446 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
447 }
448 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
449 return imsCallProxy_->SetImsConfig(item, value);
450 }
451
SetImsConfig(ImsConfigItem item,int32_t value)452 int32_t ImsCallClient::SetImsConfig(ImsConfigItem item, int32_t value)
453 {
454 if (ReConnectService() != TELEPHONY_SUCCESS) {
455 TELEPHONY_LOGE("ipc reconnect failed!");
456 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
457 }
458 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
459 return imsCallProxy_->SetImsConfig(item, value);
460 }
461
GetImsConfig(ImsConfigItem item)462 int32_t ImsCallClient::GetImsConfig(ImsConfigItem item)
463 {
464 if (ReConnectService() != TELEPHONY_SUCCESS) {
465 TELEPHONY_LOGE("ipc reconnect failed!");
466 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
467 }
468 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
469 return imsCallProxy_->GetImsConfig(item);
470 }
471
SetImsFeatureValue(FeatureType type,int32_t value)472 int32_t ImsCallClient::SetImsFeatureValue(FeatureType type, int32_t value)
473 {
474 if (ReConnectService() != TELEPHONY_SUCCESS) {
475 TELEPHONY_LOGE("ipc reconnect failed!");
476 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
477 }
478 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
479 return imsCallProxy_->SetImsFeatureValue(type, value);
480 }
481
GetImsFeatureValue(FeatureType type,int32_t & value)482 int32_t ImsCallClient::GetImsFeatureValue(FeatureType type, int32_t &value)
483 {
484 if (ReConnectService() != TELEPHONY_SUCCESS) {
485 TELEPHONY_LOGE("ipc reconnect failed!");
486 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
487 }
488 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
489 return imsCallProxy_->GetImsFeatureValue(type, value);
490 }
491
SetMute(int32_t slotId,int32_t mute)492 int32_t ImsCallClient::SetMute(int32_t slotId, int32_t mute)
493 {
494 if (ReConnectService() != TELEPHONY_SUCCESS) {
495 TELEPHONY_LOGE("ipc reconnect failed!");
496 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
497 }
498 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
499 return imsCallProxy_->SetMute(slotId, mute);
500 }
501
GetMute(int32_t slotId)502 int32_t ImsCallClient::GetMute(int32_t slotId)
503 {
504 if (ReConnectService() != TELEPHONY_SUCCESS) {
505 TELEPHONY_LOGE("ipc reconnect failed!");
506 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
507 }
508 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
509 return imsCallProxy_->GetMute(slotId);
510 }
511
ControlCamera(int32_t slotId,int32_t callIndex,const std::string & cameraId)512 int32_t ImsCallClient::ControlCamera(int32_t slotId, int32_t callIndex, const std::string &cameraId)
513 {
514 if (ReConnectService() != TELEPHONY_SUCCESS) {
515 TELEPHONY_LOGE("ipc reconnect failed!");
516 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
517 }
518 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
519 return imsCallProxy_->ControlCamera(slotId, callIndex, cameraId);
520 }
521
SetPreviewWindow(int32_t slotId,int32_t callIndex,const std::string & surfaceID,sptr<Surface> surface)522 int32_t ImsCallClient::SetPreviewWindow(
523 int32_t slotId, int32_t callIndex, const std::string &surfaceID, sptr<Surface> surface)
524 {
525 if (ReConnectService() != TELEPHONY_SUCCESS) {
526 TELEPHONY_LOGE("ipc reconnect failed!");
527 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
528 }
529 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
530 return imsCallProxy_->SetPreviewWindow(slotId, callIndex, surfaceID, surface);
531 }
532
SetDisplayWindow(int32_t slotId,int32_t callIndex,const std::string & surfaceID,sptr<Surface> surface)533 int32_t ImsCallClient::SetDisplayWindow(
534 int32_t slotId, int32_t callIndex, const std::string &surfaceID, sptr<Surface> surface)
535 {
536 if (ReConnectService() != TELEPHONY_SUCCESS) {
537 TELEPHONY_LOGE("ipc reconnect failed!");
538 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
539 }
540 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
541 return imsCallProxy_->SetDisplayWindow(slotId, callIndex, surfaceID, surface);
542 }
543
SetCameraZoom(float zoomRatio)544 int32_t ImsCallClient::SetCameraZoom(float zoomRatio)
545 {
546 if (ReConnectService() != TELEPHONY_SUCCESS) {
547 TELEPHONY_LOGE("ipc reconnect failed!");
548 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
549 }
550 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
551 return imsCallProxy_->SetCameraZoom(zoomRatio);
552 }
553
SetPausePicture(int32_t slotId,int32_t callIndex,const std::string & path)554 int32_t ImsCallClient::SetPausePicture(int32_t slotId, int32_t callIndex, const std::string &path)
555 {
556 if (ReConnectService() != TELEPHONY_SUCCESS) {
557 TELEPHONY_LOGE("ipc reconnect failed!");
558 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
559 }
560 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
561 return imsCallProxy_->SetPausePicture(slotId, callIndex, path);
562 }
563
SetDeviceDirection(int32_t slotId,int32_t callIndex,int32_t rotation)564 int32_t ImsCallClient::SetDeviceDirection(int32_t slotId, int32_t callIndex, int32_t rotation)
565 {
566 if (ReConnectService() != TELEPHONY_SUCCESS) {
567 TELEPHONY_LOGE("ipc reconnect failed!");
568 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
569 }
570 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
571 return imsCallProxy_->SetDeviceDirection(slotId, callIndex, rotation);
572 }
573
SetClip(int32_t slotId,int32_t action,int32_t index)574 int32_t ImsCallClient::SetClip(int32_t slotId, int32_t action, int32_t index)
575 {
576 if (ReConnectService() != TELEPHONY_SUCCESS) {
577 TELEPHONY_LOGE("ipc reconnect failed!");
578 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
579 }
580 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
581 return imsCallProxy_->SetClip(slotId, action, index);
582 }
583
GetClip(int32_t slotId,int32_t index)584 int32_t ImsCallClient::GetClip(int32_t slotId, int32_t index)
585 {
586 if (ReConnectService() != TELEPHONY_SUCCESS) {
587 TELEPHONY_LOGE("ipc reconnect failed!");
588 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
589 }
590 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
591 return imsCallProxy_->GetClip(slotId, index);
592 }
593
SetClir(int32_t slotId,int32_t action,int32_t index)594 int32_t ImsCallClient::SetClir(int32_t slotId, int32_t action, int32_t index)
595 {
596 if (ReConnectService() != TELEPHONY_SUCCESS) {
597 TELEPHONY_LOGE("ipc reconnect failed!");
598 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
599 }
600 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
601 return imsCallProxy_->SetClir(slotId, action, index);
602 }
603
GetClir(int32_t slotId,int32_t index)604 int32_t ImsCallClient::GetClir(int32_t slotId, int32_t index)
605 {
606 if (ReConnectService() != TELEPHONY_SUCCESS) {
607 TELEPHONY_LOGE("ipc reconnect failed!");
608 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
609 }
610 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
611 return imsCallProxy_->GetClir(slotId, index);
612 }
613
SetCallTransfer(int32_t slotId,const CallTransferInfo & cfInfo,int32_t classType,int32_t index)614 int32_t ImsCallClient::SetCallTransfer(int32_t slotId, const CallTransferInfo &cfInfo, int32_t classType, int32_t index)
615 {
616 if (ReConnectService() != TELEPHONY_SUCCESS) {
617 TELEPHONY_LOGE("ipc reconnect failed!");
618 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
619 }
620 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
621 return imsCallProxy_->SetCallTransfer(slotId, cfInfo, classType, index);
622 }
623
CanSetCallTransferTime(int32_t slotId,bool & result)624 int32_t ImsCallClient::CanSetCallTransferTime(int32_t slotId, bool &result)
625 {
626 if (ReConnectService() != TELEPHONY_SUCCESS) {
627 TELEPHONY_LOGE("[slot%{public}d] ipc reconnect failed!", slotId);
628 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
629 }
630 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
631 return imsCallProxy_->CanSetCallTransferTime(slotId, result);
632 }
633
GetCallTransfer(int32_t slotId,int32_t reason,int32_t index)634 int32_t ImsCallClient::GetCallTransfer(int32_t slotId, int32_t reason, int32_t index)
635 {
636 if (ReConnectService() != TELEPHONY_SUCCESS) {
637 TELEPHONY_LOGE("ipc reconnect failed!");
638 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
639 }
640 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
641 return imsCallProxy_->GetCallTransfer(slotId, reason, index);
642 }
643
SetCallRestriction(int32_t slotId,const std::string & fac,int32_t mode,const std::string & pw,int32_t index)644 int32_t ImsCallClient::SetCallRestriction(
645 int32_t slotId, const std::string &fac, int32_t mode, const std::string &pw, int32_t index)
646 {
647 if (ReConnectService() != TELEPHONY_SUCCESS) {
648 TELEPHONY_LOGE("ipc reconnect failed!");
649 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
650 }
651 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
652 return imsCallProxy_->SetCallRestriction(slotId, fac, mode, pw, index);
653 }
654
GetCallRestriction(int32_t slotId,const std::string & fac,int32_t index)655 int32_t ImsCallClient::GetCallRestriction(int32_t slotId, const std::string &fac, int32_t index)
656 {
657 if (ReConnectService() != TELEPHONY_SUCCESS) {
658 TELEPHONY_LOGE("ipc reconnect failed!");
659 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
660 }
661 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
662 return imsCallProxy_->GetCallRestriction(slotId, fac, index);
663 }
664
SetCallWaiting(int32_t slotId,bool activate,int32_t classType,int32_t index)665 int32_t ImsCallClient::SetCallWaiting(int32_t slotId, bool activate, int32_t classType, int32_t index)
666 {
667 if (ReConnectService() != TELEPHONY_SUCCESS) {
668 TELEPHONY_LOGE("ipc reconnect failed!");
669 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
670 }
671 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
672 return imsCallProxy_->SetCallWaiting(slotId, activate, classType, index);
673 }
674
SetVideoCallWaiting(int32_t slotId,bool activate)675 int32_t ImsCallClient::SetVideoCallWaiting(int32_t slotId, bool activate)
676 {
677 if (ReConnectService() != TELEPHONY_SUCCESS) {
678 TELEPHONY_LOGE("ipc reconnect failed!");
679 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
680 }
681 return imsCallProxy_->SetVideoCallWaiting(slotId, activate);
682 }
683
GetCallWaiting(int32_t slotId,int32_t index)684 int32_t ImsCallClient::GetCallWaiting(int32_t slotId, int32_t index)
685 {
686 if (ReConnectService() != TELEPHONY_SUCCESS) {
687 TELEPHONY_LOGE("ipc reconnect failed!");
688 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
689 }
690 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
691 return imsCallProxy_->GetCallWaiting(slotId, index);
692 }
693
SetColr(int32_t slotId,int32_t presentation,int32_t index)694 int32_t ImsCallClient::SetColr(int32_t slotId, int32_t presentation, int32_t index)
695 {
696 if (ReConnectService() != TELEPHONY_SUCCESS) {
697 TELEPHONY_LOGE("ipc reconnect failed!");
698 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
699 }
700 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
701 return imsCallProxy_->SetColr(slotId, presentation, index);
702 }
703
GetColr(int32_t slotId,int32_t index)704 int32_t ImsCallClient::GetColr(int32_t slotId, int32_t index)
705 {
706 if (ReConnectService() != TELEPHONY_SUCCESS) {
707 TELEPHONY_LOGE("ipc reconnect failed!");
708 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
709 }
710 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
711 return imsCallProxy_->GetColr(slotId, index);
712 }
713
SetColp(int32_t slotId,int32_t action,int32_t index)714 int32_t ImsCallClient::SetColp(int32_t slotId, int32_t action, int32_t index)
715 {
716 if (ReConnectService() != TELEPHONY_SUCCESS) {
717 TELEPHONY_LOGE("ipc reconnect failed!");
718 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
719 }
720 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
721 return imsCallProxy_->SetColp(slotId, action, index);
722 }
723
GetColp(int32_t slotId,int32_t index)724 int32_t ImsCallClient::GetColp(int32_t slotId, int32_t index)
725 {
726 if (ReConnectService() != TELEPHONY_SUCCESS) {
727 TELEPHONY_LOGE("ipc reconnect failed!");
728 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
729 }
730 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
731 return imsCallProxy_->GetColp(slotId, index);
732 }
733
ReConnectService()734 int32_t ImsCallClient::ReConnectService()
735 {
736 if (imsCallProxy_ == nullptr) {
737 TELEPHONY_LOGI("try to reconnect ims call service now...");
738 GetImsCallProxy();
739 if (imsCallProxy_ == nullptr) {
740 TELEPHONY_LOGE("Connect service failed");
741 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
742 }
743 }
744 return TELEPHONY_SUCCESS;
745 }
746
Clean()747 void ImsCallClient::Clean()
748 {
749 Utils::UniqueWriteGuard<Utils::RWLock> guard(rwClientLock_);
750 if (imsCoreServiceProxy_ != nullptr) {
751 imsCoreServiceProxy_.clear();
752 imsCoreServiceProxy_ = nullptr;
753 }
754 if (imsCallProxy_ != nullptr) {
755 imsCallProxy_.clear();
756 imsCallProxy_ = nullptr;
757 }
758 if (imsCallCallback_ != nullptr) {
759 imsCallCallback_.clear();
760 imsCallCallback_ = nullptr;
761 }
762 }
763
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)764 void ImsCallClient::SystemAbilityListener::OnAddSystemAbility(int32_t systemAbilityId,
765 const std::string& deviceId)
766 {
767 TELEPHONY_LOGI("SA:%{public}d is added!", systemAbilityId);
768 if (!CheckInputSysAbilityId(systemAbilityId)) {
769 TELEPHONY_LOGE("add SA:%{public}d is invalid!", systemAbilityId);
770 return;
771 }
772
773 auto imsCallClient = DelayedSingleton<ImsCallClient>::GetInstance();
774 if (imsCallClient->IsConnect()) {
775 TELEPHONY_LOGE("SA:%{public}d already connected!", systemAbilityId);
776 return;
777 }
778
779 imsCallClient->Clean();
780 int32_t res = imsCallClient->ReConnectService();
781 if (res != TELEPHONY_SUCCESS) {
782 TELEPHONY_LOGE("SA:%{public}d reconnect service failed!", systemAbilityId);
783 return;
784 }
785 TELEPHONY_LOGI("SA:%{public}d reconnect service successfully!", systemAbilityId);
786 }
787
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)788 void ImsCallClient::SystemAbilityListener::OnRemoveSystemAbility(int32_t systemAbilityId,
789 const std::string& deviceId)
790 {
791 TELEPHONY_LOGI("SA:%{public}d is removed!", systemAbilityId);
792 auto imsCallClient = DelayedSingleton<ImsCallClient>::GetInstance();
793 if (!imsCallClient->IsConnect()) {
794 return;
795 }
796
797 imsCallClient->Clean();
798 }
799
UpdateImsCapabilities(int32_t slotId,const ImsCapabilityList & imsCapabilityList)800 int32_t ImsCallClient::UpdateImsCapabilities(int32_t slotId, const ImsCapabilityList &imsCapabilityList)
801 {
802 if (ReConnectService() != TELEPHONY_SUCCESS) {
803 TELEPHONY_LOGE("ipc reconnect failed!");
804 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
805 }
806 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
807 return imsCallProxy_->UpdateImsCapabilities(slotId, imsCapabilityList);
808 }
809
GetUtImpuFromNetwork(int32_t slotId,std::string & impu)810 int32_t ImsCallClient::GetUtImpuFromNetwork(int32_t slotId, std::string &impu)
811 {
812 if (ReConnectService() != TELEPHONY_SUCCESS) {
813 TELEPHONY_LOGE("[slot%{public}d]ipc reconnect failed!", slotId);
814 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
815 }
816 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
817 return imsCallProxy_->GetUtImpuFromNetwork(slotId, impu);
818 }
819
NotifyOperatorConfigChanged(int32_t slotId,int32_t state)820 int32_t ImsCallClient::NotifyOperatorConfigChanged(int32_t slotId, int32_t state)
821 {
822 if (ReConnectService() != TELEPHONY_SUCCESS) {
823 TELEPHONY_LOGE("[slot%{public}d]ipc reconnect failed!", slotId);
824 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
825 }
826 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
827 return imsCallProxy_->NotifyOperatorConfigChanged(slotId, state);
828 }
829
GetImsCapabilities(int32_t slotId)830 int32_t ImsCallClient::GetImsCapabilities(int32_t slotId)
831 {
832 if (ReConnectService() != TELEPHONY_SUCCESS) {
833 TELEPHONY_LOGE("ipc reconnect failed!");
834 return TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL;
835 }
836 Utils::UniqueReadGuard<Utils::RWLock> guard(rwClientLock_);
837 return imsCallProxy_->GetImsCapabilities(slotId);
838 }
839 } // namespace Telephony
840 } // namespace OHOS
841