• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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