1 /*
2  * Copyright (C) 2021-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 #ifndef NAPI_CALL_MANAGER_H
17 #define NAPI_CALL_MANAGER_H
18 
19 #include "pac_map.h"
20 #include "string_ex.h"
21 
22 #include "napi_call_manager_callback.h"
23 #include "napi_call_manager_types.h"
24 
25 namespace OHOS {
26 namespace Telephony {
27 constexpr int32_t SLOT_ID_INVALID = 202;
28 #define GET_PARAMS(env, info, num) \
29     size_t argc = num;             \
30     napi_value argv[num] = {0};    \
31     napi_value thisVar = nullptr;  \
32     void *data;                    \
33     napi_get_cb_info(env, info, &argc, argv, &thisVar, &data)
34 
35 /**
36  * NapiCallManager is responsible for NAPI initialization and JavaScript data parsing.
37  */
38 class NapiCallManager {
39 public:
40     NapiCallManager();
41     ~NapiCallManager();
42 
43     static napi_value DeclareCallBasisInterface(napi_env env, napi_value exports);
44     static napi_value DeclareCallConferenceInterface(napi_env env, napi_value exports);
45     static napi_value DeclareCallSupplementInterface(napi_env env, napi_value exports);
46     static napi_value DeclareCallExtendInterface(napi_env env, napi_value exports);
47     static napi_value DeclareCallMultimediaInterface(napi_env env, napi_value exports);
48     static napi_value DeclareCallImsInterface(napi_env env, napi_value exports);
49     static napi_value DeclareCallMediaEnum(napi_env env, napi_value exports);
50     static napi_value DeclareCallDialEnum(napi_env env, napi_value exports);
51     static napi_value DeclareCallStateEnum(napi_env env, napi_value exports);
52     static napi_value DeclareCallEventEnum(napi_env env, napi_value exports);
53     static napi_value DeclareCallRestrictionEnum(napi_env env, napi_value exports);
54     static napi_value DeclareCallWaitingEnum(napi_env env, napi_value exports);
55     static napi_value DeclareCallTransferEnum(napi_env env, napi_value exports);
56     // Enumeration type extension
57     static napi_value DeclareVoNRStateEnum(napi_env env, napi_value exports);
58     static napi_value DeclareAudioDeviceEnum(napi_env env, napi_value exports);
59     static napi_value DeclareVideoStateTypeEnum(napi_env env, napi_value exports);
60     static napi_value DeclareImsCallModeEnum(napi_env env, napi_value exports);
61     static napi_value DeclareDeviceDirectionEnum(napi_env env, napi_value exports);
62     static napi_value DeclareVideoRequestResultEnum(napi_env env, napi_value exports);
63     static napi_value DeclareDialSceneEnum(napi_env env, napi_value exports);
64     static napi_value DeclareCallTypeEnum(napi_env env, napi_value exports);
65     static napi_value DeclareDialTypeEnum(napi_env env, napi_value exports);
66     static napi_value DeclareTelCallStateEnum(napi_env env, napi_value exports);
67     static napi_value DeclareConferenceStateEnum(napi_env env, napi_value exports);
68     static napi_value DeclareCallStateToAppEnum(napi_env env, napi_value exports);
69     static napi_value DeclareCallEventEnumEx(napi_env env, napi_value exports);
70     static napi_value DeclareCallSessionEventEnumEx(napi_env env, napi_value exports);
71     static napi_value DeclareRestrictionTypeEnum(napi_env env, napi_value exports);
72     static napi_value DeclareRestrictionModeEnum(napi_env env, napi_value exports);
73     static napi_value DeclareRestrictionStatusEnum(napi_env env, napi_value exports);
74     static napi_value DeclareCallWaitingEnumEx(napi_env env, napi_value exports);
75     static napi_value DeclareTransferStatusEnum(napi_env env, napi_value exports);
76     static napi_value DeclareTransferTypeEnum(napi_env env, napi_value exports);
77     static napi_value DeclareTransferSettingTypeEnum(napi_env env, napi_value exports);
78     static napi_value DeclareMmiCodeResultEnum(napi_env env, napi_value exports);
79     static napi_value DeclareDisconnectedReasonEnum(napi_env env, napi_value exports);
80     static napi_value DeclareMarkTypeEnum(napi_env env, napi_value exports);
81     static napi_value RegisterCallManagerFunc(napi_env env, napi_value exports);
82     static napi_value Dial(napi_env env, napi_callback_info info);
83     static napi_value DialCall(napi_env env, napi_callback_info info);
84     static napi_value MakeCall(napi_env env, napi_callback_info info);
85     static napi_value AnswerCall(napi_env env, napi_callback_info info);
86     static napi_value AnswerVideoCall(napi_env env, napi_callback_info info);
87     static napi_value RejectCall(napi_env env, napi_callback_info info);
88     static napi_value HangUpCall(napi_env env, napi_callback_info info);
89     static napi_value HoldCall(napi_env env, napi_callback_info info);
90     static napi_value UnHoldCall(napi_env env, napi_callback_info info);
91     static napi_value SwitchCall(napi_env env, napi_callback_info info);
92     static napi_value CombineConference(napi_env env, napi_callback_info info);
93     static napi_value SeparateConference(napi_env env, napi_callback_info info);
94     static napi_value KickOutFromConference(napi_env env, napi_callback_info info);
95     static napi_value GetMainCallId(napi_env env, napi_callback_info info);
96     static napi_value GetSubCallIdList(napi_env env, napi_callback_info info);
97     static napi_value GetCallIdListForConference(napi_env env, napi_callback_info info);
98     static napi_value GetCallWaiting(napi_env env, napi_callback_info info);
99     static napi_value SetCallWaiting(napi_env env, napi_callback_info info);
100     static napi_value GetCallRestriction(napi_env env, napi_callback_info info);
101     static napi_value SetCallRestriction(napi_env env, napi_callback_info info);
102     static napi_value SetCallRestrictionPassword(napi_env env, napi_callback_info info);
103     static napi_value GetCallTransferInfo(napi_env env, napi_callback_info info);
104     static napi_value SetCallTransferInfo(napi_env env, napi_callback_info info);
105     static napi_value CanSetCallTransferTime(napi_env env, napi_callback_info info);
106     static napi_value StartDTMF(napi_env env, napi_callback_info info);
107     static napi_value StopDTMF(napi_env env, napi_callback_info info);
108     static napi_value PostDialProceed(napi_env env, napi_callback_info info);
109     static napi_value GetCallState(napi_env env, napi_callback_info info);
110     static napi_value GetCallStateSync(napi_env env, napi_callback_info info);
111     static napi_value IsRinging(napi_env env, napi_callback_info info);
112     static napi_value HasCall(napi_env env, napi_callback_info info);
113     static napi_value HasCallSync(napi_env env, napi_callback_info info);
114     static napi_value IsNewCallAllowed(napi_env env, napi_callback_info info);
115     static napi_value IsInEmergencyCall(napi_env env, napi_callback_info info);
116     static napi_value IsEmergencyPhoneNumber(napi_env env, napi_callback_info info);
117     static napi_value FormatPhoneNumber(napi_env env, napi_callback_info info);
118     static napi_value FormatPhoneNumberToE164(napi_env env, napi_callback_info info);
119     static napi_value ObserverOn(napi_env env, napi_callback_info info);
120     static napi_value ObserverOff(napi_env env, napi_callback_info info);
121     static napi_value SetMuted(napi_env env, napi_callback_info info);
122     static napi_value CancelMuted(napi_env env, napi_callback_info info);
123     static napi_value MuteRinger(napi_env env, napi_callback_info info);
124     static napi_value SetAudioDevice(napi_env env, napi_callback_info info);
125     static napi_value ControlCamera(napi_env env, napi_callback_info info);
126     static napi_value SetPreviewWindow(napi_env env, napi_callback_info info);
127     static napi_value SetDisplayWindow(napi_env env, napi_callback_info info);
128     static napi_value SetCameraZoom(napi_env env, napi_callback_info info);
129     static napi_value SetPausePicture(napi_env env, napi_callback_info info);
130     static napi_value SetDeviceDirection(napi_env env, napi_callback_info info);
131     static napi_value RequestCameraCapabilities(napi_env env, napi_callback_info info);
132     static napi_value SetCallPreferenceMode(napi_env env, napi_callback_info info);
133     static napi_value EnableImsSwitch(napi_env env, napi_callback_info info);
134     static napi_value DisableImsSwitch(napi_env env, napi_callback_info info);
135     static napi_value IsImsSwitchEnabled(napi_env env, napi_callback_info info);
136     static napi_value IsImsSwitchEnabledSync(napi_env env, napi_callback_info info);
137     static napi_value SetVoNRState(napi_env env, napi_callback_info info);
138     static napi_value GetVoNRState(napi_env env, napi_callback_info info);
139     static napi_value StartRTT(napi_env env, napi_callback_info info);
140     static napi_value StopRTT(napi_env env, napi_callback_info info);
141     static napi_value JoinConference(napi_env env, napi_callback_info info);
142     static napi_value UpdateImsCallMode(napi_env env, napi_callback_info info);
143     static napi_value ReportOttCallDetailsInfo(napi_env env, napi_callback_info info);
144     static napi_value ReportOttCallEventInfo(napi_env env, napi_callback_info info);
145     static napi_value HasVoiceCapability(napi_env env, napi_callback_info info);
146     static napi_value CloseUnFinishedUssd(napi_env env, napi_callback_info info);
147     static napi_value InputDialerSpecialCode(napi_env env, napi_callback_info info);
148     static napi_value RemoveMissedIncomingCallNotification(napi_env env, napi_callback_info info);
149     static napi_value SetVoIPCallState(napi_env env, napi_callback_info info);
150     static napi_value CancelCallUpgrade(napi_env env, napi_callback_info info);
151     static napi_value SendCallUiEvent(napi_env env, napi_callback_info info);
152 
153 private:
154     static void RegisterCallBack();
155     static void NativeCallBack(napi_env env, napi_status status, void *data);
156     static void NativeDialCallBack(napi_env env, napi_status status, void *data);
157     static void NativeVoidCallBack(napi_env env, napi_status status, void *data);
158     static void NativeVoidCallBackWithErrorCode(napi_env env, napi_status status, void *data);
159     static void NativePropertyCallBack(napi_env env, napi_status status, void *data);
160     static void NativeGetMainCallIdCallBack(napi_env env, napi_status status, void *data);
161     static void NativeIsImsSwitchEnabledCallBack(napi_env env, napi_status status, void *data);
162     static void NativeGetVoNRStateCallBack(napi_env env, napi_status status, void *data);
163     static void NativeBoolCallBack(napi_env env, napi_status status, void *data);
164     static void NativeBoolCallBackWithErrorCode(napi_env env, napi_status status, void *data);
165     static void NativeIsEmergencyPhoneNumberCallBack(napi_env env, napi_status status, void *data);
166     static void NativeFormatNumberCallBack(napi_env env, napi_status status, void *data);
167     static void NativeListCallBack(napi_env env, napi_status status, void *data);
168     static void NativeOffCallBack(napi_env env, napi_status status, void *data);
169     static void GetDialInfo(napi_env env, napi_value objValue, DialAsyncContext &asyncContext);
170     static void GetSmsInfo(napi_env env, napi_value objValue, RejectAsyncContext &asyncContext);
171     static int32_t GetRestrictionInfo(napi_env env, napi_value objValue, CallRestrictionAsyncContext &asyncContext);
172     static int32_t GetTransferInfo(napi_env env, napi_value objValue, CallTransferAsyncContext &asyncContext);
173     static void NativeDial(napi_env env, void *data);
174     static void NativeDialCall(napi_env env, void *data);
175     static void NativeMakeCall(napi_env env, void *data);
176     static void NativeAnswerCall(napi_env env, void *data);
177     static void NativeRejectCall(napi_env env, void *data);
178     static void NativeHangUpCall(napi_env env, void *data);
179     static void NativeHoldCall(napi_env env, void *data);
180     static void NativeUnHoldCall(napi_env env, void *data);
181     static void NativeSwitchCall(napi_env env, void *data);
182     static void NativeCombineConference(napi_env env, void *data);
183     static void NativeSeparateConference(napi_env env, void *data);
184     static void NativeKickOutFromConference(napi_env env, void *data);
185     static void NativeGetMainCallId(napi_env env, void *data);
186     static void NativeGetSubCallIdList(napi_env env, void *data);
187     static void NativeGetCallIdListForConference(napi_env env, void *data);
188     static void NativeGetCallWaiting(napi_env env, void *data);
189     static void NativeSetCallWaiting(napi_env env, void *data);
190     static void NativeGetCallRestriction(napi_env env, void *data);
191     static void NativeSetCallRestriction(napi_env env, void *data);
192     static void NativeSetCallRestrictionPassword(napi_env env, void *data);
193     static void NativeGetTransferNumber(napi_env env, void *data);
194     static void NativeSetTransferNumber(napi_env env, void *data);
195     static void NativeCanSetCallTransferTime(napi_env env, void *data);
196     static void NativeStartDTMF(napi_env env, void *data);
197     static void NativeStopDTMF(napi_env env, void *data);
198     static void NativeGetCallState(napi_env env, void *data);
199     static void NativeIsRinging(napi_env env, void *data);
200     static void NativeHasCall(napi_env env, void *data);
201     static void NativeIsNewCallAllowed(napi_env env, void *data);
202     static void NativeIsInEmergencyCall(napi_env env, void *data);
203     static void NativeIsEmergencyPhoneNumber(napi_env env, void *data);
204     static void NativeFormatPhoneNumber(napi_env env, void *data);
205     static void NativeFormatPhoneNumberToE164(napi_env env, void *data);
206     static void NativeSetMuted(napi_env env, void *data);
207     static void NativeCancelMuted(napi_env env, void *data);
208     static void NativeMuteRinger(napi_env env, void *data);
209     static void NativeSetAudioDevice(napi_env env, void *data);
210     static void NativeControlCamera(napi_env env, void *data);
211     static void NativeSetPreviewWindow(napi_env env, void *data);
212     static void NativeSetDisplayWindow(napi_env env, void *data);
213     static void NativeSetCameraZoom(napi_env env, void *data);
214     static void NativeSetPausePicture(napi_env env, void *data);
215     static void NativeSetDeviceDirection(napi_env env, void *data);
216     static void NativeRequestCameraCapabilities(napi_env env, void *data);
217     static void NativeSetCallPreferenceMode(napi_env env, void *data);
218     static void NativeIsImsSwitchEnabled(napi_env env, void *data);
219     static void NativeEnableImsSwitch(napi_env env, void *data);
220     static void NativeDisableImsSwitch(napi_env env, void *data);
221     static void NativeSetVoNRState(napi_env env, void *data);
222     static void NativeGetVoNRState(napi_env env, void *data);
223     static void NativeStartRTT(napi_env env, void *data);
224     static void NativeStopRTT(napi_env env, void *data);
225     static void NativeJoinConference(napi_env env, void *data);
226     static void NativeUpdateImsCallMode(napi_env env, void *data);
227     static void NativeCloseUnFinishedUssd(napi_env env, void *data);
228     static void NativeInputDialerSpecialCode(napi_env env, void *data);
229     static void NativeRemoveMissedIncomingCallNotification(napi_env env, void *data);
230     static void NativeSetVoIPCallState(napi_env env, void *data);
231     static void NativeCancelCallUpgrade(napi_env env, void *data);
232     static void NativeSendCallUiEvent(napi_env env, void *data);
233     static bool MatchEmptyParameter(napi_env env, const napi_value parameters[], const size_t parameterCount);
234     static bool MatchOneOptionalNumberParameter(
235         napi_env env, const napi_value parameters[], const size_t parameterCount);
236     static bool MatchAnswerCallParameter(
237         napi_env env, const napi_value parameters[], const size_t parameterCount);
238     static bool MatchOneNumberParameter(napi_env env, const napi_value parameters[], const size_t parameterCount);
239     static bool MatchOneStringParameter(napi_env env, const napi_value parameters[], const size_t parameterCount);
240     static bool MatchObserverOffParameter(napi_env env, const napi_value parameters[], const size_t parameterCount);
241     static bool MatchTwoNumberParameters(napi_env env, const napi_value parameters[], const size_t parameterCount);
242     static bool MatchNumberAndObjectParameters(
243         napi_env env, const napi_value parameters[], const size_t parameterCount);
244     static bool MatchNumberAndBoolParameters(napi_env env, const napi_value parameters[], const size_t parameterCount);
245     static bool MatchNumberAndStringParameters(
246         napi_env env, const napi_value parameters[], const size_t parameterCount);
247     static bool MatchAudioDeviceParameters(napi_env env, const napi_value parameters[], const size_t parameterCount);
248     static bool MatchRejectCallParameters(napi_env env, const napi_value parameters[], const size_t parameterCount);
249     static bool MatchRejectCallFirstIllegalParameters(napi_env env, const napi_value parameters[]);
250     static bool MatchRejectCallSecondIllegalParameters(napi_env env, const napi_value parameters[]);
251     static bool MatchRejectCallTwoIllegalParameters(napi_env env, const napi_value parameters[]);
252     static void NativeReportOttCallDetailsInfo(napi_env env, void *data);
253     static void NativeReportOttCallEventInfo(napi_env env, void *data);
254     static void NativePostDialProceed(napi_env env, void *data);
255     static napi_value HandleAsyncWork(napi_env env, AsyncContext *context, std::string workName,
256         napi_async_execute_callback execute, napi_async_complete_callback complete);
257     static void RegisterNapiCallFuncCallback(std::string tmpStr, EventCallback stateCallback);
258     static void UnRegisterCallbackWithListenerType(std::string tmpStr);
259     static bool MatchStringAndVariableObjectParameters(
260         napi_env env, const napi_value parameters[], const size_t parameterCount);
261     static bool MatchTwoStringParameter(napi_env env, const napi_value parameters[], const size_t parameterCount);
262     static bool MatchCallRestrictionPasswordParameter(
263         napi_env env, const napi_value parameters[], const size_t parameterCount);
264     static void HandleRejectCall(napi_env env, RejectAsyncContext &asyncContext,
265         const napi_value parameters[], const size_t parameterCount);
266 private:
267     static int32_t registerStatus_;
268 };
269 } // namespace Telephony
270 } // namespace OHOS
271 
272 #endif // NAPI_CALL_MANAGER_H
273