• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "ims_call.h"
17 
18 #include "call_control_manager.h"
19 #include "call_object_manager.h"
20 #include "call_manager_errors.h"
21 #include "telephony_log_wrapper.h"
22 #include "ims_conference.h"
23 
24 #include "cellular_call_connection.h"
25 
26 namespace OHOS {
27 namespace Telephony {
IMSCall(DialParaInfo & info)28 IMSCall::IMSCall(DialParaInfo &info) : CarrierCall(info), videoCallState_(nullptr), isInitialized_(false) {}
29 
IMSCall(DialParaInfo & info,AppExecFwk::PacMap & extras)30 IMSCall::IMSCall(DialParaInfo &info, AppExecFwk::PacMap &extras)
31     : CarrierCall(info, extras), videoCallState_(nullptr), isInitialized_(false)
32 {}
33 
~IMSCall()34 IMSCall::~IMSCall() {}
35 
InitVideoCall()36 int32_t IMSCall::InitVideoCall()
37 {
38     if (isInitialized_) {
39         TELEPHONY_LOGI("video call initialize ok!");
40         return TELEPHONY_SUCCESS;
41     }
42     sptr<VideoCallState> state = new (std::nothrow) AudioOnlyState(this);
43     if (state == nullptr) {
44         TELEPHONY_LOGE("null pointer");
45         return TELEPHONY_ERR_LOCAL_PTR_NULL;
46     }
47     videoStateMap_[ImsCallMode::CALL_MODE_AUDIO_ONLY] = state;
48     videoCallState_ = state;
49     state = (std::make_unique<VideoSendState>(this)).release();
50     if (state == nullptr) {
51         TELEPHONY_LOGE("null pointer");
52         return TELEPHONY_ERR_LOCAL_PTR_NULL;
53     }
54     videoStateMap_[ImsCallMode::CALL_MODE_SEND_ONLY] = state;
55     state = (std::make_unique<VideoReceiveState>(this)).release();
56     if (state == nullptr) {
57         TELEPHONY_LOGE("null pointer");
58         return TELEPHONY_ERR_LOCAL_PTR_NULL;
59     }
60     videoStateMap_[ImsCallMode::CALL_MODE_RECEIVE_ONLY] = state;
61     state = (std::make_unique<VideoSendReceiveState>(this)).release();
62     if (state == nullptr) {
63         TELEPHONY_LOGE("null pointer");
64         return TELEPHONY_ERR_LOCAL_PTR_NULL;
65     }
66     videoStateMap_[ImsCallMode::CALL_MODE_SEND_RECEIVE] = state;
67     state = (std::make_unique<VideoPauseState>(this)).release();
68     if (state == nullptr) {
69         TELEPHONY_LOGE("null pointer");
70         return TELEPHONY_ERR_LOCAL_PTR_NULL;
71     }
72     videoStateMap_[ImsCallMode::CALL_MODE_VIDEO_PAUSED] = state;
73     isInitialized_ = true;
74     return TELEPHONY_SUCCESS;
75 }
76 
DialingProcess()77 int32_t IMSCall::DialingProcess()
78 {
79     return CarrierDialingProcess();
80 }
81 
AnswerCall(int32_t videoState)82 int32_t IMSCall::AnswerCall(int32_t videoState)
83 {
84     return CarrierAnswerCall(videoState);
85 }
86 
RejectCall()87 int32_t IMSCall::RejectCall()
88 {
89     return CarrierRejectCall();
90 }
91 
HangUpCall()92 int32_t IMSCall::HangUpCall()
93 {
94     return CarrierHangUpCall();
95 }
96 
HoldCall()97 int32_t IMSCall::HoldCall()
98 {
99     return CarrierHoldCall();
100 }
101 
UnHoldCall()102 int32_t IMSCall::UnHoldCall()
103 {
104     return CarrierUnHoldCall();
105 }
106 
SwitchCall()107 int32_t IMSCall::SwitchCall()
108 {
109     return CarrierSwitchCall();
110 }
111 
StartRtt(std::u16string & msg)112 int32_t IMSCall::StartRtt(std::u16string &msg)
113 {
114     CellularCallInfo callInfo;
115     int32_t ret = PackCellularCallInfo(callInfo);
116     if (ret != TELEPHONY_SUCCESS) {
117         TELEPHONY_LOGW("PackCellularCallInfo failed!");
118         return ret;
119     }
120     ret = DelayedSingleton<CellularCallConnection>::GetInstance()->StartRtt(callInfo, msg);
121     if (ret != TELEPHONY_SUCCESS) {
122         TELEPHONY_LOGE("StartRtt failed!");
123         return CALL_ERR_STARTRTT_FAILED;
124     }
125     return TELEPHONY_SUCCESS;
126 }
127 
StopRtt()128 int32_t IMSCall::StopRtt()
129 {
130     CellularCallInfo callInfo;
131     int32_t ret = PackCellularCallInfo(callInfo);
132     if (ret != TELEPHONY_SUCCESS) {
133         TELEPHONY_LOGW("PackCellularCallInfo failed!");
134         return ret;
135     }
136     ret = DelayedSingleton<CellularCallConnection>::GetInstance()->StopRtt(callInfo);
137     if (ret != TELEPHONY_SUCCESS) {
138         TELEPHONY_LOGE("StopRtt failed!");
139         return CALL_ERR_STOPRTT_FAILED;
140     }
141     return TELEPHONY_SUCCESS;
142 }
143 
SetMute(int32_t mute,int32_t slotId)144 int32_t IMSCall::SetMute(int32_t mute, int32_t slotId)
145 {
146     return CarrierSetMute(mute, slotId);
147 }
148 
GetCallAttributeInfo(CallAttributeInfo & info)149 void IMSCall::GetCallAttributeInfo(CallAttributeInfo &info)
150 {
151     GetCallAttributeCarrierInfo(info);
152 }
153 
CombineConference()154 int32_t IMSCall::CombineConference()
155 {
156     int32_t ret = DelayedSingleton<ImsConference>::GetInstance()->SetMainCall(GetCallID());
157     if (ret != TELEPHONY_SUCCESS) {
158         TELEPHONY_LOGE("SetMainCall failed,  error%{public}d", ret);
159         return ret;
160     }
161     return CarrierCombineConference();
162 }
163 
SeparateConference()164 int32_t IMSCall::SeparateConference()
165 {
166     return CarrierSeparateConference();
167 }
168 
KickOutFromConference()169 int32_t IMSCall::KickOutFromConference()
170 {
171     return CarrierKickOutFromConference();
172 }
173 
CanCombineConference()174 int32_t IMSCall::CanCombineConference()
175 {
176     int32_t ret = IsSupportConferenceable();
177     if (ret != TELEPHONY_SUCCESS) {
178         TELEPHONY_LOGE("call unsupported conference,  error%{public}d", ret);
179         return ret;
180     }
181     return DelayedSingleton<ImsConference>::GetInstance()->CanCombineConference();
182 }
183 
CanSeparateConference()184 int32_t IMSCall::CanSeparateConference()
185 {
186     return DelayedSingleton<ImsConference>::GetInstance()->CanSeparateConference();
187 }
188 
CanKickOutFromConference()189 int32_t IMSCall::CanKickOutFromConference()
190 {
191     return DelayedSingleton<ImsConference>::GetInstance()->CanKickOutFromConference();
192 }
193 
GetMainCallId(int32_t & mainCallId)194 int32_t IMSCall::GetMainCallId(int32_t &mainCallId)
195 {
196     mainCallId = DelayedSingleton<ImsConference>::GetInstance()->GetMainCall();
197     return TELEPHONY_SUCCESS;
198 }
199 
LaunchConference()200 int32_t IMSCall::LaunchConference()
201 {
202     int32_t ret = DelayedSingleton<ImsConference>::GetInstance()->JoinToConference(GetCallID());
203     if (ret == TELEPHONY_SUCCESS) {
204         SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_ACTIVE);
205     }
206     return ret;
207 }
208 
ExitConference()209 int32_t IMSCall::ExitConference()
210 {
211     int32_t ret = DelayedSingleton<ImsConference>::GetInstance()->LeaveFromConference(GetCallID());
212     if (ret == TELEPHONY_SUCCESS) {
213         SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_IDLE);
214     }
215     return ret;
216 }
217 
HoldConference()218 int32_t IMSCall::HoldConference()
219 {
220     int32_t ret = DelayedSingleton<ImsConference>::GetInstance()->HoldConference(GetCallID());
221     if (ret == TELEPHONY_SUCCESS) {
222         SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_HOLDING);
223     }
224     return ret;
225 }
226 
GetSubCallIdList(std::vector<std::u16string> & callIdList)227 int32_t IMSCall::GetSubCallIdList(std::vector<std::u16string> &callIdList)
228 {
229     return DelayedSingleton<ImsConference>::GetInstance()->GetSubCallIdList(GetCallID(), callIdList);
230 }
231 
GetCallIdListForConference(std::vector<std::u16string> & callIdList)232 int32_t IMSCall::GetCallIdListForConference(std::vector<std::u16string> &callIdList)
233 {
234     return DelayedSingleton<ImsConference>::GetInstance()->GetCallIdListForConference(GetCallID(), callIdList);
235 }
236 
IsSupportConferenceable()237 int32_t IMSCall::IsSupportConferenceable()
238 {
239 #ifdef ABILIT_CONFIG_SUPPORT
240     bool carrierSupport = GetCarrierConfig(IMS_SUPPORT_CONFERENCE);
241     if (!carrierSupport) {
242         return TELEPHONY_CONFERENCE_CARRIER_NOT_SUPPORT;
243     }
244     if (isVideoCall()) {
245         carrierSupport = GetCarrierConfig(IMS_VIDEO_SUPPORT_CONFERENCE)
246     }
247     if (!carrierSupport) {
248         return TELEPHONY_CONFERENCE_VIDEO_CALL_NOT_SUPPORT;
249     }
250 #endif
251     return CarrierCall::IsSupportConferenceable();
252 }
253 
AcceptVideoCall()254 int32_t IMSCall::AcceptVideoCall()
255 {
256     TELEPHONY_LOGI("always accept video call request.");
257     return SendUpdateCallMediaModeResponse(ImsCallMode::CALL_MODE_SEND_RECEIVE);
258 }
259 
RefuseVideoCall()260 int32_t IMSCall::RefuseVideoCall()
261 {
262     TELEPHONY_LOGI("always refuse video call request.");
263     return SendUpdateCallMediaModeResponse(ImsCallMode::CALL_MODE_AUDIO_ONLY);
264 }
265 
SendUpdateCallMediaModeRequest(ImsCallMode mode)266 int32_t IMSCall::SendUpdateCallMediaModeRequest(ImsCallMode mode)
267 {
268     std::lock_guard<std::mutex> lock(videoUpdateMutex_);
269     int32_t ret = InitVideoCall();
270     if (ret != TELEPHONY_SUCCESS) {
271         TELEPHONY_LOGE("video call initialize failed");
272         return ret;
273     }
274     if (GetTelCallState() != TelCallState::CALL_STATUS_ACTIVE) {
275         TELEPHONY_LOGE("call state is not active");
276         return CALL_ERR_CALL_STATE;
277     }
278     if (videoCallState_ == nullptr) {
279         TELEPHONY_LOGE("unexpected null pointer");
280         return TELEPHONY_ERR_LOCAL_PTR_NULL;
281     }
282     return videoCallState_->SendUpdateCallMediaModeRequest(mode);
283 }
284 
SendUpdateCallMediaModeResponse(ImsCallMode mode)285 int32_t IMSCall::SendUpdateCallMediaModeResponse(ImsCallMode mode)
286 {
287     std::lock_guard<std::mutex> lock(videoUpdateMutex_);
288     int32_t ret = InitVideoCall();
289     if (ret != TELEPHONY_SUCCESS) {
290         TELEPHONY_LOGE("video call initialize failed");
291         return ret;
292     }
293 
294     if (GetTelCallState() != TelCallState::CALL_STATUS_ACTIVE) {
295         TELEPHONY_LOGE("call state is not active");
296         return CALL_ERR_CALL_STATE;
297     }
298     return videoCallState_->SendUpdateCallMediaModeResponse(mode);
299 }
300 
RecieveUpdateCallMediaModeRequest(ImsCallMode mode)301 int32_t IMSCall::RecieveUpdateCallMediaModeRequest(ImsCallMode mode)
302 {
303     std::lock_guard<std::mutex> lock(videoUpdateMutex_);
304     int32_t ret = InitVideoCall();
305     if (ret != TELEPHONY_SUCCESS) {
306         TELEPHONY_LOGE("video call initialize failed");
307         return ret;
308     }
309     if (GetTelCallState() != TelCallState::CALL_STATUS_ACTIVE) {
310         TELEPHONY_LOGE("call state is not active");
311         return CALL_ERR_CALL_STATE;
312     }
313     return videoCallState_->RecieveUpdateCallMediaModeRequest(mode);
314 }
315 
ReceiveUpdateCallMediaModeResponse(CallMediaModeResponse & response)316 int32_t IMSCall::ReceiveUpdateCallMediaModeResponse(CallMediaModeResponse &response)
317 {
318     std::lock_guard<std::mutex> lock(videoUpdateMutex_);
319     int32_t ret = InitVideoCall();
320     if (ret != TELEPHONY_SUCCESS) {
321         TELEPHONY_LOGE("video call initialize failed");
322         return ret;
323     }
324     if (GetTelCallState() != TelCallState::CALL_STATUS_ACTIVE) {
325         TELEPHONY_LOGE("call state is not active");
326         return CALL_ERR_CALL_STATE;
327     }
328     if (response.result == TELEPHONY_SUCCESS) {
329         return videoCallState_->ReceiveUpdateCallMediaModeResponse(ImsCallMode::CALL_MODE_SEND_RECEIVE);
330     }
331     return videoCallState_->ReceiveUpdateCallMediaModeResponse(ImsCallMode::CALL_MODE_AUDIO_ONLY);
332 }
333 
SwitchVideoState(ImsCallMode mode)334 void IMSCall::SwitchVideoState(ImsCallMode mode)
335 {
336     // save old state.
337     TELEPHONY_LOGI("SwitchVideoState call %{public}d switch to state %{public}d", GetCallID(), mode);
338     if (videoStateMap_.find(mode) != videoStateMap_.end()) {
339         videoCallState_ = videoStateMap_[mode];
340     } else {
341         videoCallState_ = videoStateMap_[ImsCallMode::CALL_MODE_AUDIO_ONLY];
342     }
343     return;
344 }
345 
IsSupportVideoCall()346 bool IMSCall::IsSupportVideoCall()
347 {
348     bool isSupportVideoCall = true;
349 #ifdef ABILITY_CONFIG_SUPPORT
350     isSupportVideoCall = GetCarrierConfig(ITEM_VIDEO_CALL);
351 #endif
352     if (GetTelCallState() == TelCallState::CALL_STATUS_INCOMING) {
353         TELEPHONY_LOGW("incoming call not support video upgrade");
354         isSupportVideoCall = false;
355     }
356     if (GetEmergencyState()) {
357         TELEPHONY_LOGW("emergency call not support video upgrade");
358         isSupportVideoCall = false;
359     }
360     return isSupportVideoCall;
361 }
362 
DispatchUpdateVideoRequest(ImsCallMode mode)363 int32_t IMSCall::DispatchUpdateVideoRequest(ImsCallMode mode)
364 {
365     CellularCallInfo callInfo;
366     int32_t ret = PackCellularCallInfo(callInfo);
367     if (ret != TELEPHONY_SUCCESS) {
368         TELEPHONY_LOGW("PackCellularCallInfo failed!");
369         return ret;
370     }
371     ret = DelayedSingleton<CellularCallConnection>::GetInstance()->SendUpdateCallMediaModeRequest(callInfo, mode);
372     if (ret != TELEPHONY_SUCCESS) {
373         TELEPHONY_LOGE("send update media failed, errno:%{public}d!", ret);
374         return ret;
375     }
376     return TELEPHONY_SUCCESS;
377 }
378 
DispatchUpdateVideoResponse(ImsCallMode mode)379 int32_t IMSCall::DispatchUpdateVideoResponse(ImsCallMode mode)
380 {
381     return TELEPHONY_SUCCESS;
382 }
383 
GetCallVideoState(ImsCallMode mode)384 sptr<VideoCallState> IMSCall::GetCallVideoState(ImsCallMode mode)
385 {
386     TELEPHONY_LOGI("get call video state %{public}d", mode);
387     if (videoStateMap_.find(mode) != videoStateMap_.end()) {
388         return videoStateMap_[mode];
389     } else {
390         return nullptr;
391     }
392 }
393 } // namespace Telephony
394 } // namespace OHOS
395