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 "ott_call.h"
17 
18 #include "call_manager_errors.h"
19 #include "call_manager_hisysevent.h"
20 #include "telephony_log_wrapper.h"
21 
22 #include "ott_call_connection.h"
23 #include "ott_conference.h"
24 
25 namespace OHOS {
26 namespace Telephony {
OTTCall(DialParaInfo & info)27 OTTCall::OTTCall(DialParaInfo &info) : CallBase(info), ottCallConnectionPtr_(std::make_unique<OTTCallConnection>())
28 {}
29 
OTTCall(DialParaInfo & info,AppExecFwk::PacMap & extras)30 OTTCall::OTTCall(DialParaInfo &info, AppExecFwk::PacMap &extras)
31     : CallBase(info, extras), ottCallConnectionPtr_(std::make_unique<OTTCallConnection>())
32 {}
33 
~OTTCall()34 OTTCall::~OTTCall() {}
35 
DialingProcess()36 int32_t OTTCall::DialingProcess()
37 {
38     int32_t ret = DialCallBase();
39     if (ret != TELEPHONY_SUCCESS) {
40         HangUpCall();
41     }
42     return ret;
43 }
44 
AnswerCall(int32_t videoState)45 int32_t OTTCall::AnswerCall(int32_t videoState)
46 {
47     int32_t ret = AnswerCallBase();
48     if (ret != TELEPHONY_SUCCESS) {
49         TELEPHONY_LOGE("answer call failed!");
50         CallManagerHisysevent::WriteAnswerCallFaultEvent(
51             INVALID_PARAMETER, INVALID_PARAMETER, videoState, ret, "the device is currently not ringing");
52         return CALL_ERR_ANSWER_FAILED;
53     }
54     OttCallRequestInfo requestInfo;
55     ret = PackOttCallRequestInfo(requestInfo);
56     if (ret != TELEPHONY_SUCCESS) {
57         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
58         CallManagerHisysevent::WriteAnswerCallFaultEvent(
59             INVALID_PARAMETER, INVALID_PARAMETER, videoState, ret, "PackOttCallRequestInfo failed");
60         return CALL_ERR_ANSWER_FAILED;
61     }
62     if (ottCallConnectionPtr_ == nullptr) {
63         TELEPHONY_LOGE("ottCallConnectionPtr_ is nullptr!");
64         return TELEPHONY_ERR_LOCAL_PTR_NULL;
65     }
66     ret = ottCallConnectionPtr_->Answer(requestInfo);
67     if (ret != TELEPHONY_SUCCESS) {
68         TELEPHONY_LOGE("answer call failed!");
69         return CALL_ERR_ANSWER_FAILED;
70     }
71     return TELEPHONY_SUCCESS;
72 }
73 
RejectCall()74 int32_t OTTCall::RejectCall()
75 {
76     int32_t ret = RejectCallBase();
77     if (ret != TELEPHONY_SUCCESS) {
78         return ret;
79     }
80     OttCallRequestInfo requestInfo;
81     ret = PackOttCallRequestInfo(requestInfo);
82     if (ret != TELEPHONY_SUCCESS) {
83         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
84         CallManagerHisysevent::WriteHangUpFaultEvent(
85             INVALID_PARAMETER, INVALID_PARAMETER, ret, "Reject PackOttCallRequestInfo failed");
86         return CALL_ERR_REJECT_FAILED;
87     }
88     ret = ottCallConnectionPtr_->Reject(requestInfo);
89     if (ret != TELEPHONY_SUCCESS) {
90         TELEPHONY_LOGE("reject call failed!");
91         return CALL_ERR_REJECT_FAILED;
92     }
93     return TELEPHONY_SUCCESS;
94 }
95 
HangUpCall()96 int32_t OTTCall::HangUpCall()
97 {
98     OttCallRequestInfo requestInfo;
99     int32_t ret = PackOttCallRequestInfo(requestInfo);
100     if (ret != TELEPHONY_SUCCESS) {
101         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
102         CallManagerHisysevent::WriteHangUpFaultEvent(
103             INVALID_PARAMETER, INVALID_PARAMETER, ret, "HangUp PackOttCallRequestInfo failed");
104         return CALL_ERR_HANGUP_FAILED;
105     }
106     ret = ottCallConnectionPtr_->HangUp(requestInfo);
107     if (ret != TELEPHONY_SUCCESS) {
108         TELEPHONY_LOGE("hangUp call failed!");
109         return CALL_ERR_HANGUP_FAILED;
110     }
111     return TELEPHONY_SUCCESS;
112 }
113 
HoldCall()114 int32_t OTTCall::HoldCall()
115 {
116     OttCallRequestInfo requestInfo;
117     int32_t ret = PackOttCallRequestInfo(requestInfo);
118     if (ret != TELEPHONY_SUCCESS) {
119         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
120         return CALL_ERR_HOLD_FAILED;
121     }
122     ret = ottCallConnectionPtr_->HoldCall(requestInfo);
123     if (ret != TELEPHONY_SUCCESS) {
124         TELEPHONY_LOGE("holdCall call failed!");
125         return CALL_ERR_HOLD_FAILED;
126     }
127     return TELEPHONY_SUCCESS;
128 }
129 
UnHoldCall()130 int32_t OTTCall::UnHoldCall()
131 {
132     OttCallRequestInfo requestInfo;
133     int32_t ret = PackOttCallRequestInfo(requestInfo);
134     if (ret != TELEPHONY_SUCCESS) {
135         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
136         return CALL_ERR_UNHOLD_FAILED;
137     }
138     ret = ottCallConnectionPtr_->UnHoldCall(requestInfo);
139     if (ret != TELEPHONY_SUCCESS) {
140         TELEPHONY_LOGE("unHoldCall call failed!");
141         return CALL_ERR_UNHOLD_FAILED;
142     }
143     return TELEPHONY_SUCCESS;
144 }
145 
SwitchCall()146 int32_t OTTCall::SwitchCall()
147 {
148     OttCallRequestInfo requestInfo;
149     int32_t ret = PackOttCallRequestInfo(requestInfo);
150     if (ret != TELEPHONY_SUCCESS) {
151         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
152         return CALL_ERR_UNHOLD_FAILED;
153     }
154     ret = ottCallConnectionPtr_->SwitchCall(requestInfo);
155     if (ret != TELEPHONY_SUCCESS) {
156         TELEPHONY_LOGE("switchCall call failed!");
157         return CALL_ERR_UNHOLD_FAILED;
158     }
159     return TELEPHONY_SUCCESS;
160 }
161 
GetCallAttributeInfo(CallAttributeInfo & info)162 void OTTCall::GetCallAttributeInfo(CallAttributeInfo &info)
163 {
164     GetCallAttributeBaseInfo(info);
165 }
166 
GetEmergencyState()167 bool OTTCall::GetEmergencyState()
168 {
169     return false;
170 }
171 
StartDtmf(char str)172 int32_t OTTCall::StartDtmf(char str)
173 {
174     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
175 }
176 
StopDtmf()177 int32_t OTTCall::StopDtmf()
178 {
179     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
180 }
181 
PostDialProceed(bool proceed)182 int32_t OTTCall::PostDialProceed(bool proceed)
183 {
184     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
185 }
186 
GetSlotId()187 int32_t OTTCall::GetSlotId()
188 {
189     return CALL_ERR_ILLEGAL_CALL_OPERATION;
190 }
191 
CombineConference()192 int32_t OTTCall::CombineConference()
193 {
194     int32_t ret = DelayedSingleton<OttConference>::GetInstance()->SetMainCall(GetCallID());
195     if (ret != TELEPHONY_SUCCESS) {
196         TELEPHONY_LOGE("SetMainCall failed,  error%{public}d", ret);
197         return ret;
198     }
199     OttCallRequestInfo requestInfo;
200     ret = PackOttCallRequestInfo(requestInfo);
201     if (ret != TELEPHONY_SUCCESS) {
202         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
203         return ret;
204     }
205     if (ottCallConnectionPtr_ == nullptr) {
206         TELEPHONY_LOGE("ottCallConnectionPtr_ is nullptr!");
207         return TELEPHONY_ERR_LOCAL_PTR_NULL;
208     }
209     ConferenceState currentState = DelayedSingleton<OttConference>::GetInstance()->GetConferenceState();
210     if (currentState == ConferenceState::CONFERENCE_STATE_CREATING) {
211         TELEPHONY_LOGE("skip combine, a process of combine already exsists");
212         return TELEPHONY_SUCCESS;
213     }
214     DelayedSingleton<OttConference>::GetInstance()->SetConferenceState(ConferenceState::CONFERENCE_STATE_CREATING);
215     return ottCallConnectionPtr_->CombineConference(requestInfo);
216 }
217 
HandleCombineConferenceFailEvent()218 void OTTCall::HandleCombineConferenceFailEvent()
219 {
220     std::set<std::int32_t> subCallIdList = DelayedSingleton<OttConference>::GetInstance()->GetSubCallIdList();
221     if (subCallIdList.empty()) {
222         DelayedSingleton<OttConference>::GetInstance()->SetMainCall(ERR_ID);
223     } else {
224         DelayedSingleton<OttConference>::GetInstance()->SetMainCall(*subCallIdList.begin());
225     }
226     ConferenceState oldState = DelayedSingleton<OttConference>::GetInstance()->GetOldConferenceState();
227     DelayedSingleton<OttConference>::GetInstance()->SetConferenceState(oldState);
228 }
229 
CanCombineConference()230 int32_t OTTCall::CanCombineConference()
231 {
232     int32_t ret = IsSupportConferenceable();
233     if (ret != TELEPHONY_SUCCESS) {
234         TELEPHONY_LOGE("call unsupported conference, error%{public}d", ret);
235         return ret;
236     }
237     return DelayedSingleton<OttConference>::GetInstance()->CanCombineConference();
238 }
239 
SeparateConference()240 int32_t OTTCall::SeparateConference()
241 {
242     OttCallRequestInfo requestInfo;
243     int32_t ret = PackOttCallRequestInfo(requestInfo);
244     if (ret != TELEPHONY_SUCCESS) {
245         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
246         return ret;
247     }
248     if (ottCallConnectionPtr_ == nullptr) {
249         TELEPHONY_LOGE("ottCallConnectionPtr_ is nullptr!");
250         return TELEPHONY_ERR_LOCAL_PTR_NULL;
251     }
252     return ottCallConnectionPtr_->SeparateConference(requestInfo);
253 }
254 
KickOutFromConference()255 int32_t OTTCall::KickOutFromConference()
256 {
257     OttCallRequestInfo requestInfo;
258     int32_t ret = PackOttCallRequestInfo(requestInfo);
259     if (ret != TELEPHONY_SUCCESS) {
260         TELEPHONY_LOGE("PackOttCallRequestInfo failed, error%{public}d", ret);
261         return ret;
262     }
263     if (ottCallConnectionPtr_ == nullptr) {
264         TELEPHONY_LOGE("ottCallConnectionPtr_ is nullptr!");
265         return TELEPHONY_ERR_LOCAL_PTR_NULL;
266     }
267     return ottCallConnectionPtr_->KickOutFromConference(requestInfo);
268 }
269 
CanSeparateConference()270 int32_t OTTCall::CanSeparateConference()
271 {
272     return DelayedSingleton<OttConference>::GetInstance()->CanSeparateConference();
273 }
274 
CanKickOutFromConference()275 int32_t OTTCall::CanKickOutFromConference()
276 {
277     return DelayedSingleton<OttConference>::GetInstance()->CanKickOutFromConference();
278 }
279 
LaunchConference()280 int32_t OTTCall::LaunchConference()
281 {
282     int32_t ret = DelayedSingleton<OttConference>::GetInstance()->JoinToConference(GetCallID());
283     if (ret == TELEPHONY_SUCCESS) {
284         SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_ACTIVE);
285     }
286     return ret;
287 }
288 
ExitConference()289 int32_t OTTCall::ExitConference()
290 {
291     int32_t ret = DelayedSingleton<OttConference>::GetInstance()->LeaveFromConference(GetCallID());
292     if (ret == TELEPHONY_SUCCESS) {
293         SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_IDLE);
294     }
295     return ret;
296 }
297 
HoldConference()298 int32_t OTTCall::HoldConference()
299 {
300     int32_t ret = DelayedSingleton<OttConference>::GetInstance()->HoldConference(GetCallID());
301     if (ret == TELEPHONY_SUCCESS) {
302         SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_HOLDING);
303     }
304     return ret;
305 }
306 
GetMainCallId(int32_t & mainCallId)307 int32_t OTTCall::GetMainCallId(int32_t &mainCallId)
308 {
309     mainCallId = DelayedSingleton<OttConference>::GetInstance()->GetMainCall();
310     return TELEPHONY_SUCCESS;
311 }
312 
GetSubCallIdList(std::vector<std::u16string> & callIdList)313 int32_t OTTCall::GetSubCallIdList(std::vector<std::u16string> &callIdList)
314 {
315     return DelayedSingleton<OttConference>::GetInstance()->GetSubCallIdList(GetCallID(), callIdList);
316 }
317 
GetCallIdListForConference(std::vector<std::u16string> & callIdList)318 int32_t OTTCall::GetCallIdListForConference(std::vector<std::u16string> &callIdList)
319 {
320     return DelayedSingleton<OttConference>::GetInstance()->GetCallIdListForConference(GetCallID(), callIdList);
321 }
322 
IsSupportConferenceable()323 int32_t OTTCall::IsSupportConferenceable()
324 {
325 #ifdef ABILIT_CONFIG_SUPPORT
326     bool ottSupport = GetOttConfig(OTT_SUPPORT_CONFERENCE);
327     if (!ottSupport) {
328         return TELEPHONY_CONFERENCE_OTT_NOT_SUPPORT;
329     }
330     if (isVideoCall()) {
331         ottSupport = GetOTTConfig(OTT_VIDEO_SUPPORT_CONFERENCE)
332     }
333     if (!ottSupport) {
334         return TELEPHONY_CONFERENCE_VIDEO_CALL_NOT_SUPPORT;
335     }
336 #endif
337     return TELEPHONY_SUCCESS;
338 }
339 
SendUpdateCallMediaModeRequest(ImsCallMode mode)340 int32_t OTTCall::SendUpdateCallMediaModeRequest(ImsCallMode mode)
341 {
342     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
343 }
344 
InitVideoCall()345 int32_t OTTCall::InitVideoCall()
346 {
347     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
348 }
349 
RecieveUpdateCallMediaModeRequest(CallModeReportInfo & imsCallModeInfo)350 int32_t OTTCall::RecieveUpdateCallMediaModeRequest(CallModeReportInfo &imsCallModeInfo)
351 {
352     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
353 }
354 
SendUpdateCallMediaModeResponse(ImsCallMode mode)355 int32_t OTTCall::SendUpdateCallMediaModeResponse(ImsCallMode mode)
356 {
357     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
358 }
359 
ReceiveUpdateCallMediaModeResponse(CallModeReportInfo & response)360 int32_t OTTCall::ReceiveUpdateCallMediaModeResponse(CallModeReportInfo &response)
361 {
362     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
363 }
364 
UpdateImsCallMode(ImsCallMode mode)365 int32_t OTTCall::UpdateImsCallMode(ImsCallMode mode)
366 {
367     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
368 }
369 
ReportImsCallModeInfo(CallMediaModeInfo & response)370 int32_t OTTCall::ReportImsCallModeInfo(CallMediaModeInfo &response)
371 {
372     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
373 }
374 
ControlCamera(std::string & cameraId,int32_t callingUid,int32_t callingPid)375 int32_t OTTCall::ControlCamera(std::string &cameraId, int32_t callingUid, int32_t callingPid)
376 {
377     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
378 }
379 
SetPreviewWindow(std::string & surfaceId,sptr<Surface> surface)380 int32_t OTTCall::SetPreviewWindow(std::string &surfaceId, sptr<Surface> surface)
381 {
382     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
383 }
384 
SetDisplayWindow(std::string & surfaceId,sptr<Surface> surface)385 int32_t OTTCall::SetDisplayWindow(std::string &surfaceId, sptr<Surface> surface)
386 {
387     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
388 }
389 
SetPausePicture(std::string & path)390 int32_t OTTCall::SetPausePicture(std::string &path)
391 {
392     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
393 }
394 
SetDeviceDirection(int32_t rotation)395 int32_t OTTCall::SetDeviceDirection(int32_t rotation)
396 {
397     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
398 }
399 
CancelCallUpgrade()400 int32_t OTTCall::CancelCallUpgrade()
401 {
402     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
403 }
404 
RequestCameraCapabilities()405 int32_t OTTCall::RequestCameraCapabilities()
406 {
407     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
408 }
409 
SetMute(int32_t mute,int32_t slotId)410 int32_t OTTCall::SetMute(int32_t mute, int32_t slotId)
411 {
412     return CALL_ERR_FUNCTION_NOT_SUPPORTED;
413 }
414 
PackOttCallRequestInfo(OttCallRequestInfo & requestInfo)415 int32_t OTTCall::PackOttCallRequestInfo(OttCallRequestInfo &requestInfo)
416 {
417     if (accountNumber_.length() > static_cast<size_t>(kMaxNumberLen)) {
418         TELEPHONY_LOGE("Number out of limit!");
419         return CALL_ERR_NUMBER_OUT_OF_RANGE;
420     }
421     if (memcpy_s(requestInfo.phoneNum, kMaxNumberLen, accountNumber_.c_str(), accountNumber_.length()) != EOK) {
422         TELEPHONY_LOGW("memset_s failed!");
423         return TELEPHONY_ERR_MEMSET_FAIL;
424     }
425     if (bundleName_.length() > static_cast<size_t>(kMaxBundleNameLen)) {
426         TELEPHONY_LOGE("Number out of limit!");
427         return CALL_ERR_NUMBER_OUT_OF_RANGE;
428     }
429     if (memcpy_s(requestInfo.bundleName, kMaxBundleNameLen, bundleName_.c_str(), bundleName_.length()) != EOK) {
430         TELEPHONY_LOGW("memset_s failed!");
431         return TELEPHONY_ERR_MEMSET_FAIL;
432     }
433     requestInfo.videoState = videoState_;
434     return TELEPHONY_SUCCESS;
435 }
436 } // namespace Telephony
437 } // namespace OHOS
438