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 "cs_call.h"
17
18#include "call_manager_errors.h"
19#include "telephony_log_wrapper.h"
20
21namespace OHOS {
22namespace Telephony {
23CSCall::CSCall(DialParaInfo &info) : CarrierCall(info) {}
24
25CSCall::CSCall(DialParaInfo &info, AppExecFwk::PacMap &extras) : CarrierCall(info, extras) {}
26
27CSCall::~CSCall() {}
28
29int32_t CSCall::DialingProcess()
30{
31    return CarrierDialingProcess();
32}
33
34int32_t CSCall::AnswerCall(int32_t videoState)
35{
36    return CarrierAnswerCall(videoState);
37}
38
39int32_t CSCall::RejectCall()
40{
41    return CarrierRejectCall();
42}
43
44int32_t CSCall::HangUpCall()
45{
46    return CarrierHangUpCall();
47}
48
49int32_t CSCall::HoldCall()
50{
51    return CarrierHoldCall();
52}
53
54int32_t CSCall::UnHoldCall()
55{
56    return CarrierUnHoldCall();
57}
58
59int32_t CSCall::SwitchCall()
60{
61    return CarrierSwitchCall();
62}
63
64void CSCall::GetCallAttributeInfo(CallAttributeInfo &info)
65{
66    GetCallAttributeCarrierInfo(info);
67}
68
69int32_t CSCall::SetMute(int32_t mute, int32_t slotId)
70{
71    return CarrierSetMute(mute, slotId);
72}
73
74int32_t CSCall::CombineConference()
75{
76    int32_t ret = DelayedSingleton<CsConference>::GetInstance()->SetMainCall(GetCallID());
77    if (ret != TELEPHONY_SUCCESS) {
78        return ret;
79    }
80    ConferenceState currentState = DelayedSingleton<CsConference>::GetInstance()->GetConferenceState();
81    if (currentState == ConferenceState::CONFERENCE_STATE_CREATING) {
82        TELEPHONY_LOGE("skip combine, a process of combine already exsists");
83        return TELEPHONY_SUCCESS;
84    }
85    DelayedSingleton<CsConference>::GetInstance()->SetConferenceState(ConferenceState::CONFERENCE_STATE_CREATING);
86    return CarrierCombineConference();
87}
88
89void CSCall::HandleCombineConferenceFailEvent()
90{
91    std::set<std::int32_t> subCallIdList = DelayedSingleton<CsConference>::GetInstance()->GetSubCallIdList();
92    if (subCallIdList.empty()) {
93        DelayedSingleton<CsConference>::GetInstance()->SetMainCall(ERR_ID);
94    } else {
95        DelayedSingleton<CsConference>::GetInstance()->SetMainCall(*subCallIdList.begin());
96    }
97    ConferenceState oldState = DelayedSingleton<CsConference>::GetInstance()->GetOldConferenceState();
98    DelayedSingleton<CsConference>::GetInstance()->SetConferenceState(oldState);
99}
100
101int32_t CSCall::SeparateConference()
102{
103    return CarrierSeparateConference();
104}
105
106int32_t CSCall::KickOutFromConference()
107{
108    return CarrierKickOutFromConference();
109}
110
111int32_t CSCall::CanCombineConference()
112{
113    int32_t ret = IsSupportConferenceable();
114    if (ret != TELEPHONY_SUCCESS) {
115        TELEPHONY_LOGE("call unsupported conference, error%{public}d", ret);
116        return ret;
117    }
118    return DelayedSingleton<CsConference>::GetInstance()->CanCombineConference();
119}
120
121int32_t CSCall::CanSeparateConference()
122{
123    return DelayedSingleton<CsConference>::GetInstance()->CanSeparateConference();
124}
125
126int32_t CSCall::CanKickOutFromConference()
127{
128    return DelayedSingleton<CsConference>::GetInstance()->CanKickOutFromConference();
129}
130
131int32_t CSCall::LaunchConference()
132{
133    int32_t ret = DelayedSingleton<CsConference>::GetInstance()->JoinToConference(GetCallID());
134    if (ret == TELEPHONY_SUCCESS) {
135        SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_ACTIVE);
136    }
137    return ret;
138}
139
140int32_t CSCall::ExitConference()
141{
142    int32_t ret = DelayedSingleton<CsConference>::GetInstance()->LeaveFromConference(GetCallID());
143    if (ret == TELEPHONY_SUCCESS) {
144        SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_IDLE);
145    }
146    return ret;
147}
148
149int32_t CSCall::HoldConference()
150{
151    int32_t ret = DelayedSingleton<CsConference>::GetInstance()->HoldConference(GetCallID());
152    if (ret == TELEPHONY_SUCCESS) {
153        SetTelConferenceState(TelConferenceState::TEL_CONFERENCE_HOLDING);
154    }
155    return ret;
156}
157
158int32_t CSCall::GetMainCallId(int32_t &mainCallId)
159{
160    mainCallId = DelayedSingleton<CsConference>::GetInstance()->GetMainCall();
161    return TELEPHONY_SUCCESS;
162}
163
164int32_t CSCall::GetSubCallIdList(std::vector<std::u16string> &callIdList)
165{
166    return DelayedSingleton<CsConference>::GetInstance()->GetSubCallIdList(GetCallID(), callIdList);
167}
168
169int32_t CSCall::GetCallIdListForConference(std::vector<std::u16string> &callIdList)
170{
171    return DelayedSingleton<CsConference>::GetInstance()->GetCallIdListForConference(GetCallID(), callIdList);
172}
173
174int32_t CSCall::IsSupportConferenceable()
175{
176    // get from configure file
177#ifdef ABILIT_CONFIG_SUPPORT
178    bool carrierSupport = GetCarrierConfig(CS_SUPPORT_CONFERENCE);
179    if (!carrierSupport) {
180        return TELEPHONY_CONFERENCE_CARRIER_NOT_SUPPORT;
181    }
182#endif
183    return CarrierCall::IsSupportConferenceable();
184}
185} // namespace Telephony
186} // namespace OHOS
187