• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2023 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 "napi_call_manager.h"
17 
18 #include <securec.h>
19 #include <string_ex.h>
20 
21 #include "ability_manager_client.h"
22 #include "bool_wrapper.h"
23 #include "call_manager_client.h"
24 #include "call_manager_errors.h"
25 #include "napi_call_ability_callback.h"
26 #include "napi_call_manager_types.h"
27 #include "napi_call_manager_utils.h"
28 #include "napi_util.h"
29 #include "string_wrapper.h"
30 #include "system_ability_definition.h"
31 #include "telephony_log_wrapper.h"
32 #include "telephony_napi_common_error.h"
33 #include "telephony_types.h"
34 #include "want.h"
35 
36 namespace OHOS {
37 namespace Telephony {
38 static constexpr const char *OBSERVER_ON_JS_PERMISSION_ERROR_STRING =
39     "BusinessError 201: Permission denied. An attempt was made to On forbidden by permission: "
40     "ohos.permission.SET_TELEPHONY_STATE.";
41 static constexpr const char *OBSERVER_OFF_JS_PERMISSION_ERROR_STRING =
42     "BusinessError 201: Permission denied. An attempt was made to Off forbidden by permission: "
43     "ohos.permission.SET_TELEPHONY_STATE.";
44 int32_t NapiCallManager::registerStatus_ = TELEPHONY_ERROR;
45 
NapiCallManager()46 NapiCallManager::NapiCallManager() {}
47 
~NapiCallManager()48 NapiCallManager::~NapiCallManager()
49 {
50     DelayedSingleton<CallManagerClient>::GetInstance()->UnInit();
51 }
52 
Init()53 void Init()
54 {
55     // Establish a connection with call_manager
56     DelayedSingleton<CallManagerClient>::GetInstance()->Init(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
57 }
58 
DeclareCallBasisInterface(napi_env env,napi_value exports)59 napi_value NapiCallManager::DeclareCallBasisInterface(napi_env env, napi_value exports)
60 {
61     napi_property_descriptor desc[] = {
62         DECLARE_NAPI_FUNCTION("dial", Dial),
63         DECLARE_NAPI_FUNCTION("dialCall", DialCall),
64         DECLARE_NAPI_FUNCTION("makeCall", MakeCall),
65         DECLARE_NAPI_FUNCTION("answer", AnswerCall),
66         DECLARE_NAPI_FUNCTION("reject", RejectCall),
67         DECLARE_NAPI_FUNCTION("hangup", HangUpCall),
68         DECLARE_NAPI_FUNCTION("answerCall", AnswerCall),
69         DECLARE_NAPI_FUNCTION("rejectCall", RejectCall),
70         DECLARE_NAPI_FUNCTION("hangUpCall", HangUpCall),
71         DECLARE_NAPI_FUNCTION("holdCall", HoldCall),
72         DECLARE_NAPI_FUNCTION("unHoldCall", UnHoldCall),
73         DECLARE_NAPI_FUNCTION("switchCall", SwitchCall),
74         DECLARE_NAPI_FUNCTION("setCallPreferenceMode", SetCallPreferenceMode),
75         DECLARE_NAPI_FUNCTION("hasVoiceCapability", HasVoiceCapability),
76     };
77     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
78     return exports;
79 }
80 
DeclareCallConferenceInterface(napi_env env,napi_value exports)81 napi_value NapiCallManager::DeclareCallConferenceInterface(napi_env env, napi_value exports)
82 {
83     napi_property_descriptor desc[] = {
84         DECLARE_NAPI_FUNCTION("combineConference", CombineConference),
85         DECLARE_NAPI_FUNCTION("separateConference", SeparateConference),
86         DECLARE_NAPI_FUNCTION("kickOutFromConference", KickOutFromConference),
87         DECLARE_NAPI_FUNCTION("getMainCallId", GetMainCallId),
88         DECLARE_NAPI_FUNCTION("getSubCallIdList", GetSubCallIdList),
89         DECLARE_NAPI_FUNCTION("getCallIdListForConference", GetCallIdListForConference),
90     };
91     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
92     return exports;
93 }
94 
DeclareCallSupplementInterface(napi_env env,napi_value exports)95 napi_value NapiCallManager::DeclareCallSupplementInterface(napi_env env, napi_value exports)
96 {
97     napi_property_descriptor desc[] = {
98         DECLARE_NAPI_FUNCTION("getCallWaitingStatus", GetCallWaiting),
99         DECLARE_NAPI_FUNCTION("setCallWaiting", SetCallWaiting),
100         DECLARE_NAPI_FUNCTION("getCallRestrictionStatus", GetCallRestriction),
101         DECLARE_NAPI_FUNCTION("setCallRestriction", SetCallRestriction),
102         DECLARE_NAPI_FUNCTION("setCallRestrictionPassword", SetCallRestrictionPassword),
103         DECLARE_NAPI_FUNCTION("getCallTransferInfo", GetCallTransferInfo),
104         DECLARE_NAPI_FUNCTION("setCallTransfer", SetCallTransferInfo),
105         DECLARE_NAPI_FUNCTION("enableImsSwitch", EnableImsSwitch),
106         DECLARE_NAPI_FUNCTION("disableImsSwitch", DisableImsSwitch),
107         DECLARE_NAPI_FUNCTION("isImsSwitchEnabled", IsImsSwitchEnabled),
108         DECLARE_NAPI_FUNCTION("setVoNRState", SetVoNRState),
109         DECLARE_NAPI_FUNCTION("getVoNRState", GetVoNRState),
110         DECLARE_NAPI_FUNCTION("canSetCallTransferTime", CanSetCallTransferTime),
111         DECLARE_NAPI_FUNCTION("closeUnfinishedUssd", CloseUnFinishedUssd),
112         DECLARE_NAPI_FUNCTION("inputDialerSpecialCode", InputDialerSpecialCode),
113     };
114     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
115     return exports;
116 }
117 
DeclareCallExtendInterface(napi_env env,napi_value exports)118 napi_value NapiCallManager::DeclareCallExtendInterface(napi_env env, napi_value exports)
119 {
120     napi_property_descriptor desc[] = {
121         DECLARE_NAPI_FUNCTION("startDTMF", StartDTMF),
122         DECLARE_NAPI_FUNCTION("stopDTMF", StopDTMF),
123         DECLARE_NAPI_FUNCTION("postDialProceed", PostDialProceed),
124         DECLARE_NAPI_FUNCTION("getCallState", GetCallState),
125         DECLARE_NAPI_FUNCTION("getCallStateSync", GetCallStateSync),
126         DECLARE_NAPI_FUNCTION("isRinging", IsRinging),
127         DECLARE_NAPI_FUNCTION("hasCall", HasCall),
128         DECLARE_NAPI_FUNCTION("hasCallSync", HasCallSync),
129         DECLARE_NAPI_FUNCTION("isNewCallAllowed", IsNewCallAllowed),
130         DECLARE_NAPI_FUNCTION("isInEmergencyCall", IsInEmergencyCall),
131         DECLARE_NAPI_FUNCTION("isEmergencyPhoneNumber", IsEmergencyPhoneNumber),
132         DECLARE_NAPI_FUNCTION("formatPhoneNumber", FormatPhoneNumber),
133         DECLARE_NAPI_FUNCTION("formatPhoneNumberToE164", FormatPhoneNumberToE164),
134         DECLARE_NAPI_FUNCTION("on", ObserverOn),
135         DECLARE_NAPI_FUNCTION("off", ObserverOff),
136         DECLARE_NAPI_FUNCTION("reportOttCallDetailsInfo", ReportOttCallDetailsInfo),
137         DECLARE_NAPI_FUNCTION("reportOttCallEventInfo", ReportOttCallEventInfo),
138         DECLARE_NAPI_FUNCTION("removeMissedIncomingCallNotification", RemoveMissedIncomingCallNotification),
139         DECLARE_NAPI_FUNCTION("setVoIPCallState", SetVoIPCallState),
140     };
141     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
142     return exports;
143 }
144 
DeclareCallMultimediaInterface(napi_env env,napi_value exports)145 napi_value NapiCallManager::DeclareCallMultimediaInterface(napi_env env, napi_value exports)
146 {
147     napi_property_descriptor desc[] = {
148         DECLARE_NAPI_FUNCTION("setMuted", SetMuted),
149         DECLARE_NAPI_FUNCTION("cancelMuted", CancelMuted),
150         DECLARE_NAPI_FUNCTION("muteRinger", MuteRinger),
151         DECLARE_NAPI_FUNCTION("setAudioDevice", SetAudioDevice),
152         DECLARE_NAPI_FUNCTION("controlCamera", ControlCamera),
153         DECLARE_NAPI_FUNCTION("setPreviewSurface", SetPreviewWindow),
154         DECLARE_NAPI_FUNCTION("setDisplaySurface", SetDisplayWindow),
155         DECLARE_NAPI_FUNCTION("setCameraZoom", SetCameraZoom),
156         DECLARE_NAPI_FUNCTION("setDeviceDirection", SetDeviceDirection),
157         DECLARE_NAPI_FUNCTION("updateImsCallMode", UpdateImsCallMode),
158         DECLARE_NAPI_FUNCTION("cancelCallUpgrade", CancelCallUpgrade),
159     };
160     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
161     return exports;
162 }
163 
DeclareCallImsInterface(napi_env env,napi_value exports)164 napi_value NapiCallManager::DeclareCallImsInterface(napi_env env, napi_value exports)
165 {
166     napi_property_descriptor desc[] = {
167         DECLARE_NAPI_FUNCTION("startRTT", StartRTT),
168         DECLARE_NAPI_FUNCTION("stopRTT", StopRTT),
169         DECLARE_NAPI_FUNCTION("joinConference", JoinConference),
170     };
171     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
172     return exports;
173 }
174 
DeclareCallMediaEnum(napi_env env,napi_value exports)175 napi_value NapiCallManager::DeclareCallMediaEnum(napi_env env, napi_value exports)
176 {
177     napi_property_descriptor desc[] = {
178         // VideoStateType
179         DECLARE_NAPI_STATIC_PROPERTY("TYPE_VOICE",
180             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VideoStateType::TYPE_VOICE))),
181         DECLARE_NAPI_STATIC_PROPERTY("TYPE_VIDEO_SEND_ONLY",
182             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VideoStateType::TYPE_SEND_ONLY))),
183         DECLARE_NAPI_STATIC_PROPERTY("TYPE_VIDEO_RECEIVE_ONLY",
184             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VideoStateType::TYPE_RECEIVE_ONLY))),
185         DECLARE_NAPI_STATIC_PROPERTY("TYPE_VIDEO_BIDIRECTIONAL",
186             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VideoStateType::TYPE_VIDEO))),
187         // ImsCallMode
188         DECLARE_NAPI_STATIC_PROPERTY(
189             "CALL_MODE_AUDIO_ONLY", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_AUDIO_ONLY)),
190         DECLARE_NAPI_STATIC_PROPERTY(
191             "CALL_MODE_SEND_ONLY", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_SEND_ONLY)),
192         DECLARE_NAPI_STATIC_PROPERTY(
193             "CALL_MODE_RECEIVE_ONLY", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_RECEIVE_ONLY)),
194         DECLARE_NAPI_STATIC_PROPERTY(
195             "CALL_MODE_SEND_RECEIVE", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_SEND_RECEIVE)),
196         DECLARE_NAPI_STATIC_PROPERTY(
197             "CALL_MODE_VIDEO_PAUSED", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_VIDEO_PAUSED)),
198         // VideoRequestResultType
199         DECLARE_NAPI_STATIC_PROPERTY(
200             "TYPE_REQUEST_SUCCESS", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_SUCCESS)),
201         DECLARE_NAPI_STATIC_PROPERTY(
202             "TYPE_REQUEST_FAILURE", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_FAIL)),
203         DECLARE_NAPI_STATIC_PROPERTY(
204             "TYPE_REQUEST_INVALID", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_INVALID)),
205         DECLARE_NAPI_STATIC_PROPERTY(
206             "TYPE_REQUEST_TIMED_OUT", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_TIMED_OUT)),
207         DECLARE_NAPI_STATIC_PROPERTY(
208             "TYPE_REQUEST_REJECTED_BY_REMOTE", NapiCallManagerUtils::ToInt32Value(env, REQUEST_REJECTED_BY_REMOTE)),
209         DECLARE_NAPI_STATIC_PROPERTY(
210             "TYPE_REQUEST_UPGRADE_CANCELED", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_UPGRADE_CANCELED)),
211         DECLARE_NAPI_STATIC_PROPERTY(
212             "TYPE_DOWNGRADE_RTP_OR_RTCP_TIMEOUT",
213             NapiCallManagerUtils::ToInt32Value(env, TYPE_MODIFY_DOWNGRADE_RTP_OR_RTCP_TIMEOUT)),
214         DECLARE_NAPI_STATIC_PROPERTY(
215             "TYPE_DOWNGRADE_RTP_AND_RTCP_TIMEOUT",
216             NapiCallManagerUtils::ToInt32Value(env, TYPE_MODIFY_DOWNGRADE_RTP_AND_RTCP_TIMEOUT)),
217         // DeviceDirection
218         DECLARE_NAPI_STATIC_PROPERTY(
219             "DEVICE_DIRECTION_0", NapiCallManagerUtils::ToInt32Value(env, DEVICE_DIRECTION_0)),
220         DECLARE_NAPI_STATIC_PROPERTY(
221             "DEVICE_DIRECTION_90", NapiCallManagerUtils::ToInt32Value(env, DEVICE_DIRECTION_90)),
222         DECLARE_NAPI_STATIC_PROPERTY(
223             "DEVICE_DIRECTION_180", NapiCallManagerUtils::ToInt32Value(env, DEVICE_DIRECTION_180)),
224         DECLARE_NAPI_STATIC_PROPERTY(
225             "DEVICE_DIRECTION_270", NapiCallManagerUtils::ToInt32Value(env, DEVICE_DIRECTION_270)),
226     };
227     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
228     return exports;
229 }
230 
DeclareCallDialEnum(napi_env env,napi_value exports)231 napi_value NapiCallManager::DeclareCallDialEnum(napi_env env, napi_value exports)
232 {
233     napi_property_descriptor desc[] = {
234         // DialScene
235         DECLARE_NAPI_STATIC_PROPERTY(
236             "CALL_NORMAL", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialScene::CALL_NORMAL))),
237         DECLARE_NAPI_STATIC_PROPERTY("CALL_PRIVILEGED",
238             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialScene::CALL_PRIVILEGED))),
239         DECLARE_NAPI_STATIC_PROPERTY(
240             "CALL_EMERGENCY", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialScene::CALL_EMERGENCY))),
241         // CallType
242         DECLARE_NAPI_STATIC_PROPERTY(
243             "TYPE_CS", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_CS))),
244         DECLARE_NAPI_STATIC_PROPERTY(
245             "TYPE_IMS", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_IMS))),
246         DECLARE_NAPI_STATIC_PROPERTY(
247             "TYPE_OTT", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_OTT))),
248         DECLARE_NAPI_STATIC_PROPERTY(
249             "TYPE_VOIP", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_VOIP))),
250         DECLARE_NAPI_STATIC_PROPERTY(
251             "TYPE_ERR_CALL", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_ERR_CALL))),
252         // DialType
253         DECLARE_NAPI_STATIC_PROPERTY("DIAL_CARRIER_TYPE",
254             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialType::DIAL_CARRIER_TYPE))),
255         DECLARE_NAPI_STATIC_PROPERTY("DIAL_VOICE_MAIL_TYPE",
256             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialType::DIAL_VOICE_MAIL_TYPE))),
257         DECLARE_NAPI_STATIC_PROPERTY(
258             "DIAL_OTT_TYPE", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialType::DIAL_OTT_TYPE))),
259     };
260     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
261     return exports;
262 }
263 
DeclareCallStateEnum(napi_env env,napi_value exports)264 napi_value NapiCallManager::DeclareCallStateEnum(napi_env env, napi_value exports)
265 {
266     napi_property_descriptor desc[] = {
267         // TelCallState
268         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_ACTIVE",
269             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_ACTIVE))),
270         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_HOLDING",
271             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_HOLDING))),
272         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_DIALING",
273             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_DIALING))),
274         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_ALERTING",
275             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_ALERTING))),
276         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_INCOMING",
277             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_INCOMING))),
278         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_WAITING",
279             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_WAITING))),
280         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_DISCONNECTED",
281             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_DISCONNECTED))),
282         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_DISCONNECTING",
283             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_DISCONNECTING))),
284         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_IDLE",
285             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_IDLE))),
286         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_ANSWERED",
287             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_ANSWERED))),
288         // TelConferenceState
289         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_IDLE",
290             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_IDLE))),
291         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_ACTIVE",
292             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_ACTIVE))),
293         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_HOLDING",
294             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_HOLDING))),
295         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_DISCONNECTING",
296             NapiCallManagerUtils::ToInt32Value(
297                 env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_DISCONNECTING))),
298         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_DISCONNECTED",
299             NapiCallManagerUtils::ToInt32Value(
300                 env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_DISCONNECTED))),
301         // CallStateToApp
302         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_UNKNOWN",
303             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_UNKNOWN))),
304         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_IDLE",
305             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_IDLE))),
306         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_RINGING",
307             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_RINGING))),
308         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_OFFHOOK",
309             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_OFFHOOK))),
310         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_ANSWERED",
311             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_ANSWERED))),
312     };
313     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
314     return exports;
315 }
316 
DeclareCallEventEnum(napi_env env,napi_value exports)317 napi_value NapiCallManager::DeclareCallEventEnum(napi_env env, napi_value exports)
318 {
319     napi_property_descriptor desc[] = {
320         // CallAbilityEventId
321         DECLARE_NAPI_STATIC_PROPERTY("EVENT_DIAL_NO_CARRIER",
322             NapiCallManagerUtils::ToInt32Value(
323                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_DIAL_NO_CARRIER))),
324         DECLARE_NAPI_STATIC_PROPERTY("EVENT_INVALID_FDN_NUMBER",
325             NapiCallManagerUtils::ToInt32Value(
326                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_INVALID_FDN_NUMBER))),
327         DECLARE_NAPI_STATIC_PROPERTY("EVENT_HOLD_CALL_FAILED",
328             NapiCallManagerUtils::ToInt32Value(
329                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_HOLD_CALL_FAILED))),
330         DECLARE_NAPI_STATIC_PROPERTY("EVENT_SWAP_CALL_FAILED",
331             NapiCallManagerUtils::ToInt32Value(
332                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_SWAP_CALL_FAILED))),
333         DECLARE_NAPI_STATIC_PROPERTY("EVENT_COMBINE_CALL_FAILED",
334             NapiCallManagerUtils::ToInt32Value(
335                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_COMBINE_CALL_FAILED))),
336         DECLARE_NAPI_STATIC_PROPERTY("EVENT_SPLIT_CALL_FAILED",
337             NapiCallManagerUtils::ToInt32Value(
338                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_SPLIT_CALL_FAILED))),
339         // CallSessionEventId
340         DECLARE_NAPI_STATIC_PROPERTY("EVENT_CONTROL_CAMERA_FAILURE",
341             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallSessionEventId::EVENT_CAMERA_FAILURE))),
342         DECLARE_NAPI_STATIC_PROPERTY("EVENT_CONTROL_CAMERA_READY",
343             NapiCallManagerUtils::ToInt32Value(
344                 env, static_cast<int32_t>(CallSessionEventId::EVENT_CAMERA_READY))),
345         DECLARE_NAPI_STATIC_PROPERTY("EVENT_DISPLAY_SURFACE_RELEASED",
346             NapiCallManagerUtils::ToInt32Value(
347                 env, static_cast<int32_t>(CallSessionEventId::EVENT_RELEASE_DISPLAY_SURFACE))),
348         DECLARE_NAPI_STATIC_PROPERTY("EVENT_PREVIEW_SURFACE_RELEASED",
349             NapiCallManagerUtils::ToInt32Value(
350                 env, static_cast<int32_t>(CallSessionEventId::EVENT_RELEASE_PREVIEW_SURFACE))),
351     };
352     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
353     return exports;
354 }
355 
DeclareCallRestrictionEnum(napi_env env,napi_value exports)356 napi_value NapiCallManager::DeclareCallRestrictionEnum(napi_env env, napi_value exports)
357 {
358     napi_property_descriptor desc[] = {
359         // CallRestrictionType
360         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_INCOMING_SERVICES",
361             NapiCallManagerUtils::ToInt32Value(
362                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_INCOMING_SERVICES))),
363         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_OUTGOING_SERVICES",
364             NapiCallManagerUtils::ToInt32Value(
365                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_OUTGOING_SERVICES))),
366         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_ALL_CALLS",
367             NapiCallManagerUtils::ToInt32Value(
368                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_ALL_CALLS))),
369         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_ROAMING_INCOMING",
370             NapiCallManagerUtils::ToInt32Value(
371                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_ROAMING_INCOMING))),
372         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_ALL_INCOMING",
373             NapiCallManagerUtils::ToInt32Value(
374                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_ALL_INCOMING))),
375         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_INTERNATIONAL_EXCLUDING_HOME",
376             NapiCallManagerUtils::ToInt32Value(
377                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_INTERNATIONAL_EXCLUDING_HOME))),
378         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_INTERNATIONAL",
379             NapiCallManagerUtils::ToInt32Value(
380                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_INTERNATIONAL))),
381         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_ALL_OUTGOING",
382             NapiCallManagerUtils::ToInt32Value(
383                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_ALL_OUTGOING))),
384         // CallRestrictionMode
385         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_MODE_DEACTIVATION",
386             NapiCallManagerUtils::ToInt32Value(
387                 env, static_cast<int32_t>(CallRestrictionMode::RESTRICTION_MODE_DEACTIVATION))),
388         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_MODE_ACTIVATION",
389             NapiCallManagerUtils::ToInt32Value(
390                 env, static_cast<int32_t>(CallRestrictionMode::RESTRICTION_MODE_ACTIVATION))),
391         // RestrictionStatus
392         DECLARE_NAPI_STATIC_PROPERTY(
393             "RESTRICTION_DISABLE", NapiCallManagerUtils::ToInt32Value(env, RESTRICTION_DISABLE)),
394         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_ENABLE", NapiCallManagerUtils::ToInt32Value(env, RESTRICTION_ENABLE)),
395     };
396     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
397     return exports;
398 }
399 
DeclareCallWaitingEnum(napi_env env,napi_value exports)400 napi_value NapiCallManager::DeclareCallWaitingEnum(napi_env env, napi_value exports)
401 {
402     napi_property_descriptor desc[] = {
403         // CallWaitingStatus
404         DECLARE_NAPI_STATIC_PROPERTY(
405             "CALL_WAITING_DISABLE", NapiCallManagerUtils::ToInt32Value(env, CALL_WAITING_DISABLE)),
406         DECLARE_NAPI_STATIC_PROPERTY(
407             "CALL_WAITING_ENABLE", NapiCallManagerUtils::ToInt32Value(env, CALL_WAITING_ENABLE)),
408     };
409     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
410     return exports;
411 }
412 
DeclareCallTransferEnum(napi_env env,napi_value exports)413 napi_value NapiCallManager::DeclareCallTransferEnum(napi_env env, napi_value exports)
414 {
415     napi_property_descriptor desc[] = {
416         // TransferStatus
417         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_DISABLE", NapiCallManagerUtils::ToInt32Value(env, TRANSFER_DISABLE)),
418         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_ENABLE", NapiCallManagerUtils::ToInt32Value(env, TRANSFER_ENABLE)),
419         // CallTransferType
420         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_TYPE_UNCONDITIONAL",
421             NapiCallManagerUtils::ToInt32Value(
422                 env, static_cast<int32_t>(CallTransferType::TRANSFER_TYPE_UNCONDITIONAL))),
423         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_TYPE_BUSY",
424             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallTransferType::TRANSFER_TYPE_BUSY))),
425         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_TYPE_NO_REPLY",
426             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallTransferType::TRANSFER_TYPE_NO_REPLY))),
427         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_TYPE_NOT_REACHABLE",
428             NapiCallManagerUtils::ToInt32Value(
429                 env, static_cast<int32_t>(CallTransferType::TRANSFER_TYPE_NOT_REACHABLE))),
430         // CallTransferSettingType
431         DECLARE_NAPI_STATIC_PROPERTY("CALL_TRANSFER_ENABLE",
432             NapiCallManagerUtils::ToInt32Value(
433                 env, static_cast<int32_t>(CallTransferSettingType::CALL_TRANSFER_ENABLE))),
434         DECLARE_NAPI_STATIC_PROPERTY("CALL_TRANSFER_DISABLE",
435             NapiCallManagerUtils::ToInt32Value(
436                 env, static_cast<int32_t>(CallTransferSettingType::CALL_TRANSFER_DISABLE))),
437         DECLARE_NAPI_STATIC_PROPERTY("CALL_TRANSFER_REGISTRATION",
438             NapiCallManagerUtils::ToInt32Value(
439                 env, static_cast<int32_t>(CallTransferSettingType::CALL_TRANSFER_REGISTRATION))),
440         DECLARE_NAPI_STATIC_PROPERTY("CALL_TRANSFER_ERASURE",
441             NapiCallManagerUtils::ToInt32Value(
442                 env, static_cast<int32_t>(CallTransferSettingType::CALL_TRANSFER_ERASURE))),
443     };
444     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
445     return exports;
446 }
447 
448 /**
449  * Enumeration type extension.
450  */
DeclareVoNRStateEnum(napi_env env,napi_value exports)451 napi_value NapiCallManager::DeclareVoNRStateEnum(napi_env env, napi_value exports)
452 {
453     napi_property_descriptor desc[] = {
454         DECLARE_NAPI_STATIC_PROPERTY("VONR_STATE_ON",
455             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VoNRState::VONR_STATE_ON))),
456         DECLARE_NAPI_STATIC_PROPERTY("VONR_STATE_OFF",
457             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VoNRState::VONR_STATE_OFF))),
458     };
459     napi_value result = nullptr;
460     napi_define_class(env, "VoNRState", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
461         sizeof(desc) / sizeof(*desc), desc, &result);
462     napi_set_named_property(env, exports, "VoNRState", result);
463     return exports;
464 }
465 
DeclareAudioDeviceEnum(napi_env env,napi_value exports)466 napi_value NapiCallManager::DeclareAudioDeviceEnum(napi_env env, napi_value exports)
467 {
468     // AudioDeviceType
469     napi_property_descriptor desc[] = {
470         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_UNKNOWN",
471             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(AudioDeviceType::DEVICE_UNKNOWN))),
472         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_DISABLE",
473             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(AudioDeviceType::DEVICE_DISABLE))),
474         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_BLUETOOTH_SCO",
475             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(AudioDeviceType::DEVICE_BLUETOOTH_SCO))),
476         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_DISTRIBUTED_AUTOMOTIVE",
477             NapiCallManagerUtils::ToInt32Value(env,
478                 static_cast<int32_t>(AudioDeviceType::DEVICE_DISTRIBUTED_AUTOMOTIVE))),
479         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_DISTRIBUTED_PHONE",
480             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(AudioDeviceType::DEVICE_DISTRIBUTED_PHONE))),
481         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_DISTRIBUTED_PAD",
482             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(AudioDeviceType::DEVICE_DISTRIBUTED_PAD))),
483         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_WIRED_HEADSET",
484             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(AudioDeviceType::DEVICE_WIRED_HEADSET))),
485         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_SPEAKER",
486             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(AudioDeviceType::DEVICE_SPEAKER))),
487         DECLARE_NAPI_STATIC_PROPERTY("DEVICE_EARPIECE",
488             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(AudioDeviceType::DEVICE_EARPIECE))),
489     };
490     napi_value result = nullptr;
491     napi_define_class(env, "AudioDeviceType", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
492         sizeof(desc) / sizeof(*desc), desc, &result);
493     napi_set_named_property(env, exports, "AudioDeviceType", result);
494     return exports;
495 }
496 
DeclareVideoStateTypeEnum(napi_env env,napi_value exports)497 napi_value NapiCallManager::DeclareVideoStateTypeEnum(napi_env env, napi_value exports)
498 {
499     napi_property_descriptor desc[] = {
500         DECLARE_NAPI_STATIC_PROPERTY("TYPE_VOICE",
501             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VideoStateType::TYPE_VOICE))),
502         DECLARE_NAPI_STATIC_PROPERTY("TYPE_VIDEO_SEND_ONLY",
503             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VideoStateType::TYPE_SEND_ONLY))),
504         DECLARE_NAPI_STATIC_PROPERTY("TYPE_VIDEO_RECEIVE_ONLY",
505             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VideoStateType::TYPE_RECEIVE_ONLY))),
506         DECLARE_NAPI_STATIC_PROPERTY("TYPE_VIDEO_BIDIRECTIONAL",
507             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(VideoStateType::TYPE_VIDEO))),
508     };
509     napi_value result = nullptr;
510     napi_define_class(env, "VideoStateType", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor,
511         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
512     napi_set_named_property(env, exports, "VideoStateType", result);
513     return exports;
514 }
515 
DeclareVideoRequestResultEnum(napi_env env,napi_value exports)516 napi_value NapiCallManager::DeclareVideoRequestResultEnum(napi_env env, napi_value exports)
517 {
518     napi_property_descriptor desc[] = {
519         DECLARE_NAPI_STATIC_PROPERTY(
520             "TYPE_REQUEST_SUCCESS", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_SUCCESS)),
521         DECLARE_NAPI_STATIC_PROPERTY(
522             "TYPE_REQUEST_FAILURE", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_FAIL)),
523         DECLARE_NAPI_STATIC_PROPERTY(
524             "TYPE_REQUEST_INVALID", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_INVALID)),
525         DECLARE_NAPI_STATIC_PROPERTY(
526             "TYPE_REQUEST_TIMED_OUT", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_TIMED_OUT)),
527         DECLARE_NAPI_STATIC_PROPERTY(
528             "TYPE_REQUEST_REJECTED_BY_REMOTE", NapiCallManagerUtils::ToInt32Value(env, REQUEST_REJECTED_BY_REMOTE)),
529         DECLARE_NAPI_STATIC_PROPERTY(
530             "TYPE_REQUEST_UPGRADE_CANCELED", NapiCallManagerUtils::ToInt32Value(env, TYPE_REQUEST_UPGRADE_CANCELED)),
531         DECLARE_NAPI_STATIC_PROPERTY(
532             "TYPE_DOWNGRADE_RTP_OR_RTCP_TIMEOUT",
533             NapiCallManagerUtils::ToInt32Value(env, TYPE_MODIFY_DOWNGRADE_RTP_OR_RTCP_TIMEOUT)),
534         DECLARE_NAPI_STATIC_PROPERTY(
535             "TYPE_DOWNGRADE_RTP_AND_RTCP_TIMEOUT",
536             NapiCallManagerUtils::ToInt32Value(env, TYPE_MODIFY_DOWNGRADE_RTP_AND_RTCP_TIMEOUT)),
537     };
538     napi_value result = nullptr;
539     napi_define_class(env, "VideoRequestResultType", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor,
540         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
541     napi_set_named_property(env, exports, "VideoRequestResultType", result);
542     return exports;
543 }
544 
DeclareImsCallModeEnum(napi_env env,napi_value exports)545 napi_value NapiCallManager::DeclareImsCallModeEnum(napi_env env, napi_value exports)
546 {
547     napi_property_descriptor desc[] = {
548         DECLARE_NAPI_STATIC_PROPERTY(
549             "CALL_MODE_AUDIO_ONLY", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_AUDIO_ONLY)),
550         DECLARE_NAPI_STATIC_PROPERTY(
551             "CALL_MODE_SEND_ONLY", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_SEND_ONLY)),
552         DECLARE_NAPI_STATIC_PROPERTY(
553             "CALL_MODE_RECEIVE_ONLY", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_RECEIVE_ONLY)),
554         DECLARE_NAPI_STATIC_PROPERTY(
555             "CALL_MODE_SEND_RECEIVE", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_SEND_RECEIVE)),
556         DECLARE_NAPI_STATIC_PROPERTY(
557             "CALL_MODE_VIDEO_PAUSED", NapiCallManagerUtils::ToInt32Value(env, CALL_MODE_VIDEO_PAUSED)),
558     };
559     napi_value result = nullptr;
560     napi_define_class(env, "ImsCallMode", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
561         sizeof(desc) / sizeof(*desc), desc, &result);
562     napi_set_named_property(env, exports, "ImsCallMode", result);
563     return exports;
564 }
565 
DeclareDeviceDirectionEnum(napi_env env,napi_value exports)566 napi_value NapiCallManager::DeclareDeviceDirectionEnum(napi_env env, napi_value exports)
567 {
568     napi_property_descriptor desc[] = {
569         // DeviceDirection
570         DECLARE_NAPI_STATIC_PROPERTY(
571             "DEVICE_DIRECTION_0", NapiCallManagerUtils::ToInt32Value(env, DEVICE_DIRECTION_0)),
572         DECLARE_NAPI_STATIC_PROPERTY(
573             "DEVICE_DIRECTION_90", NapiCallManagerUtils::ToInt32Value(env, DEVICE_DIRECTION_90)),
574         DECLARE_NAPI_STATIC_PROPERTY(
575             "DEVICE_DIRECTION_180", NapiCallManagerUtils::ToInt32Value(env, DEVICE_DIRECTION_180)),
576         DECLARE_NAPI_STATIC_PROPERTY(
577             "DEVICE_DIRECTION_270", NapiCallManagerUtils::ToInt32Value(env, DEVICE_DIRECTION_270)),
578     };
579     napi_value result = nullptr;
580     napi_define_class(env, "DeviceDirection", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
581         sizeof(desc) / sizeof(*desc), desc, &result);
582     napi_set_named_property(env, exports, "DeviceDirection", result);
583     return exports;
584 }
585 
DeclareDialSceneEnum(napi_env env,napi_value exports)586 napi_value NapiCallManager::DeclareDialSceneEnum(napi_env env, napi_value exports)
587 {
588     napi_property_descriptor desc[] = {
589         DECLARE_NAPI_STATIC_PROPERTY(
590             "CALL_NORMAL", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialScene::CALL_NORMAL))),
591         DECLARE_NAPI_STATIC_PROPERTY("CALL_PRIVILEGED",
592             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialScene::CALL_PRIVILEGED))),
593         DECLARE_NAPI_STATIC_PROPERTY("CALL_EMERGENCY",
594             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialScene::CALL_EMERGENCY))),
595     };
596     napi_value result = nullptr;
597     napi_define_class(env, "DialScene", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
598         sizeof(desc) / sizeof(*desc), desc, &result);
599     napi_set_named_property(env, exports, "DialScene", result);
600     return exports;
601 }
602 
DeclareCallTypeEnum(napi_env env,napi_value exports)603 napi_value NapiCallManager::DeclareCallTypeEnum(napi_env env, napi_value exports)
604 {
605     napi_property_descriptor desc[] = {
606         DECLARE_NAPI_STATIC_PROPERTY(
607             "TYPE_CS", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_CS))),
608         DECLARE_NAPI_STATIC_PROPERTY(
609             "TYPE_IMS", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_IMS))),
610         DECLARE_NAPI_STATIC_PROPERTY(
611             "TYPE_OTT", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_OTT))),
612         DECLARE_NAPI_STATIC_PROPERTY(
613             "TYPE_VOIP", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_VOIP))),
614         DECLARE_NAPI_STATIC_PROPERTY(
615             "TYPE_ERR_CALL", NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallType::TYPE_ERR_CALL))),
616     };
617     napi_value result = nullptr;
618     napi_define_class(env, "CallType", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
619         sizeof(desc) / sizeof(*desc), desc, &result);
620     napi_set_named_property(env, exports, "CallType", result);
621     return exports;
622 }
623 
DeclareDialTypeEnum(napi_env env,napi_value exports)624 napi_value NapiCallManager::DeclareDialTypeEnum(napi_env env, napi_value exports)
625 {
626     napi_property_descriptor desc[] = {
627         DECLARE_NAPI_STATIC_PROPERTY("DIAL_CARRIER_TYPE",
628             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialType::DIAL_CARRIER_TYPE))),
629         DECLARE_NAPI_STATIC_PROPERTY("DIAL_VOICE_MAIL_TYPE",
630             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialType::DIAL_VOICE_MAIL_TYPE))),
631         DECLARE_NAPI_STATIC_PROPERTY("DIAL_OTT_TYPE",
632             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DialType::DIAL_OTT_TYPE))),
633     };
634     napi_value result = nullptr;
635     napi_define_class(env, "DialType", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
636         sizeof(desc) / sizeof(*desc), desc, &result);
637     napi_set_named_property(env, exports, "DialType", result);
638     return exports;
639 }
640 
DeclareTelCallStateEnum(napi_env env,napi_value exports)641 napi_value NapiCallManager::DeclareTelCallStateEnum(napi_env env, napi_value exports)
642 {
643     napi_property_descriptor desc[] = {
644         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_IDLE",
645             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_IDLE))),
646         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_DISCONNECTING",
647             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_DISCONNECTING))),
648         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_DISCONNECTED",
649             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_DISCONNECTED))),
650         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_WAITING",
651             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_WAITING))),
652         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_INCOMING",
653             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_INCOMING))),
654         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_ALERTING",
655             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_ALERTING))),
656         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_DIALING",
657             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_DIALING))),
658         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_HOLDING",
659             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_HOLDING))),
660         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_ACTIVE",
661             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_ACTIVE))),
662         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATUS_ANSWERED",
663             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelCallState::CALL_STATUS_ANSWERED))),
664     };
665     napi_value result = nullptr;
666     napi_define_class(env, "TelCallState", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
667         sizeof(desc) / sizeof(*desc), desc, &result);
668     napi_set_named_property(env, exports, "TelCallState", result);
669     return exports;
670 }
671 
DeclareConferenceStateEnum(napi_env env,napi_value exports)672 napi_value NapiCallManager::DeclareConferenceStateEnum(napi_env env, napi_value exports)
673 {
674     napi_property_descriptor desc[] = {
675         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_DISCONNECTED",
676             NapiCallManagerUtils::ToInt32Value(
677                 env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_DISCONNECTED))),
678         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_DISCONNECTING",
679             NapiCallManagerUtils::ToInt32Value(
680                 env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_DISCONNECTING))),
681         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_HOLDING",
682             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_HOLDING))),
683         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_ACTIVE",
684             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_ACTIVE))),
685         DECLARE_NAPI_STATIC_PROPERTY("TEL_CONFERENCE_IDLE",
686             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(TelConferenceState::TEL_CONFERENCE_IDLE))),
687     };
688     napi_value result = nullptr;
689     napi_define_class(env, "ConferenceState", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
690         sizeof(desc) / sizeof(*desc), desc, &result);
691     napi_set_named_property(env, exports, "ConferenceState", result);
692     return exports;
693 }
694 
DeclareCallStateToAppEnum(napi_env env,napi_value exports)695 napi_value NapiCallManager::DeclareCallStateToAppEnum(napi_env env, napi_value exports)
696 {
697     napi_property_descriptor desc[] = {
698         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_UNKNOWN",
699             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_UNKNOWN))),
700         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_IDLE",
701             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_IDLE))),
702         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_RINGING",
703             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_RINGING))),
704         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_OFFHOOK",
705             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_OFFHOOK))),
706         DECLARE_NAPI_STATIC_PROPERTY("CALL_STATE_ANSWERED",
707             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallStateToApp::CALL_STATE_ANSWERED))),
708     };
709     napi_value result = nullptr;
710     napi_define_class(env, "CallState", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
711         sizeof(desc) / sizeof(*desc), desc, &result);
712     napi_set_named_property(env, exports, "CallState", result);
713     return exports;
714 }
715 
DeclareCallEventEnumEx(napi_env env,napi_value exports)716 napi_value NapiCallManager::DeclareCallEventEnumEx(napi_env env, napi_value exports)
717 {
718     napi_property_descriptor desc[] = {
719         // CallAbilityEventId
720         DECLARE_NAPI_STATIC_PROPERTY("EVENT_DIAL_NO_CARRIER",
721             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallAbilityEventId::EVENT_DIAL_NO_CARRIER))),
722         DECLARE_NAPI_STATIC_PROPERTY("EVENT_INVALID_FDN_NUMBER",
723             NapiCallManagerUtils::ToInt32Value(
724                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_INVALID_FDN_NUMBER))),
725         DECLARE_NAPI_STATIC_PROPERTY("EVENT_HOLD_CALL_FAILED",
726             NapiCallManagerUtils::ToInt32Value(
727                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_HOLD_CALL_FAILED))),
728         DECLARE_NAPI_STATIC_PROPERTY("EVENT_SWAP_CALL_FAILED",
729             NapiCallManagerUtils::ToInt32Value(
730                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_SWAP_CALL_FAILED))),
731         DECLARE_NAPI_STATIC_PROPERTY("EVENT_COMBINE_CALL_FAILED",
732             NapiCallManagerUtils::ToInt32Value(
733                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_COMBINE_CALL_FAILED))),
734         DECLARE_NAPI_STATIC_PROPERTY("EVENT_SPLIT_CALL_FAILED",
735             NapiCallManagerUtils::ToInt32Value(
736                 env, static_cast<int32_t>(CallAbilityEventId::EVENT_SPLIT_CALL_FAILED))),
737     };
738     napi_value result = nullptr;
739     napi_define_class(env, "CallAbilityEventId", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
740         sizeof(desc) / sizeof(*desc), desc, &result);
741     napi_set_named_property(env, exports, "CallAbilityEventId", result);
742     return exports;
743 }
744 
DeclareCallSessionEventEnumEx(napi_env env,napi_value exports)745 napi_value NapiCallManager::DeclareCallSessionEventEnumEx(napi_env env, napi_value exports)
746 {
747     napi_property_descriptor desc[] = {
748         // CallSessionEventId
749         DECLARE_NAPI_STATIC_PROPERTY("EVENT_CONTROL_CAMERA_FAILURE",
750             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallSessionEventId::EVENT_CAMERA_FAILURE))),
751         DECLARE_NAPI_STATIC_PROPERTY("EVENT_CONTROL_CAMERA_READY",
752             NapiCallManagerUtils::ToInt32Value(
753                 env, static_cast<int32_t>(CallSessionEventId::EVENT_CAMERA_READY))),
754         DECLARE_NAPI_STATIC_PROPERTY("EVENT_DISPLAY_SURFACE_RELEASED",
755             NapiCallManagerUtils::ToInt32Value(
756                 env, static_cast<int32_t>(CallSessionEventId::EVENT_RELEASE_DISPLAY_SURFACE))),
757         DECLARE_NAPI_STATIC_PROPERTY("EVENT_PREVIEW_SURFACE_RELEASED",
758             NapiCallManagerUtils::ToInt32Value(
759                 env, static_cast<int32_t>(CallSessionEventId::EVENT_RELEASE_PREVIEW_SURFACE))),
760     };
761     napi_value result = nullptr;
762     napi_define_class(env, "CallSessionEventId", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
763         sizeof(desc) / sizeof(*desc), desc, &result);
764     napi_set_named_property(env, exports, "CallSessionEventId", result);
765     return exports;
766 }
767 
DeclareRestrictionTypeEnum(napi_env env,napi_value exports)768 napi_value NapiCallManager::DeclareRestrictionTypeEnum(napi_env env, napi_value exports)
769 {
770     napi_property_descriptor desc[] = {
771         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_ALL_OUTGOING",
772             NapiCallManagerUtils::ToInt32Value(
773                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_ALL_OUTGOING))),
774         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_INTERNATIONAL",
775             NapiCallManagerUtils::ToInt32Value(
776                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_INTERNATIONAL))),
777         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_INTERNATIONAL_EXCLUDING_HOME",
778             NapiCallManagerUtils::ToInt32Value(
779                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_INTERNATIONAL_EXCLUDING_HOME))),
780         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_ALL_INCOMING",
781             NapiCallManagerUtils::ToInt32Value(
782                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_ALL_INCOMING))),
783         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_ROAMING_INCOMING",
784             NapiCallManagerUtils::ToInt32Value(
785                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_ROAMING_INCOMING))),
786         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_ALL_CALLS",
787             NapiCallManagerUtils::ToInt32Value(
788                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_ALL_CALLS))),
789         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_OUTGOING_SERVICES",
790             NapiCallManagerUtils::ToInt32Value(
791                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_OUTGOING_SERVICES))),
792         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_TYPE_INCOMING_SERVICES",
793             NapiCallManagerUtils::ToInt32Value(
794                 env, static_cast<int32_t>(CallRestrictionType::RESTRICTION_TYPE_INCOMING_SERVICES))),
795     };
796     napi_value result = nullptr;
797     napi_define_class(env, "CallRestrictionType", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor,
798         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
799     napi_set_named_property(env, exports, "CallRestrictionType", result);
800     return exports;
801 }
802 
DeclareRestrictionModeEnum(napi_env env,napi_value exports)803 napi_value NapiCallManager::DeclareRestrictionModeEnum(napi_env env, napi_value exports)
804 {
805     napi_property_descriptor desc[] = {
806         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_MODE_DEACTIVATION",
807             NapiCallManagerUtils::ToInt32Value(
808                 env, static_cast<int32_t>(CallRestrictionMode::RESTRICTION_MODE_DEACTIVATION))),
809         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_MODE_ACTIVATION",
810             NapiCallManagerUtils::ToInt32Value(
811                 env, static_cast<int32_t>(CallRestrictionMode::RESTRICTION_MODE_ACTIVATION))),
812     };
813     napi_value result = nullptr;
814     napi_define_class(env, "CallRestrictionMode", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor,
815         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
816     napi_set_named_property(env, exports, "CallRestrictionMode", result);
817     return exports;
818 }
819 
DeclareRestrictionStatusEnum(napi_env env,napi_value exports)820 napi_value NapiCallManager::DeclareRestrictionStatusEnum(napi_env env, napi_value exports)
821 {
822     napi_property_descriptor desc[] = {
823         DECLARE_NAPI_STATIC_PROPERTY(
824             "RESTRICTION_DISABLE", NapiCallManagerUtils::ToInt32Value(env, RESTRICTION_DISABLE)),
825         DECLARE_NAPI_STATIC_PROPERTY("RESTRICTION_ENABLE", NapiCallManagerUtils::ToInt32Value(env, RESTRICTION_ENABLE)),
826     };
827     napi_value result = nullptr;
828     napi_define_class(env, "RestrictionStatus", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
829         sizeof(desc) / sizeof(*desc), desc, &result);
830     napi_set_named_property(env, exports, "RestrictionStatus", result);
831     return exports;
832 }
833 
DeclareCallWaitingEnumEx(napi_env env,napi_value exports)834 napi_value NapiCallManager::DeclareCallWaitingEnumEx(napi_env env, napi_value exports)
835 {
836     napi_property_descriptor desc[] = {
837         DECLARE_NAPI_STATIC_PROPERTY(
838             "CALL_WAITING_DISABLE", NapiCallManagerUtils::ToInt32Value(env, CALL_WAITING_DISABLE)),
839         DECLARE_NAPI_STATIC_PROPERTY(
840             "CALL_WAITING_ENABLE", NapiCallManagerUtils::ToInt32Value(env, CALL_WAITING_ENABLE)),
841     };
842     napi_value result = nullptr;
843     napi_define_class(env, "CallWaitingStatus", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
844         sizeof(desc) / sizeof(*desc), desc, &result);
845     napi_set_named_property(env, exports, "CallWaitingStatus", result);
846     return exports;
847 }
848 
DeclareTransferStatusEnum(napi_env env,napi_value exports)849 napi_value NapiCallManager::DeclareTransferStatusEnum(napi_env env, napi_value exports)
850 {
851     napi_property_descriptor desc[] = {
852         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_DISABLE", NapiCallManagerUtils::ToInt32Value(env, TRANSFER_DISABLE)),
853         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_ENABLE", NapiCallManagerUtils::ToInt32Value(env, TRANSFER_ENABLE)),
854     };
855     napi_value result = nullptr;
856     napi_define_class(env, "TransferStatus", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
857         sizeof(desc) / sizeof(*desc), desc, &result);
858     napi_set_named_property(env, exports, "TransferStatus", result);
859     return exports;
860 }
861 
DeclareTransferTypeEnum(napi_env env,napi_value exports)862 napi_value NapiCallManager::DeclareTransferTypeEnum(napi_env env, napi_value exports)
863 {
864     napi_property_descriptor desc[] = {
865         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_TYPE_NOT_REACHABLE",
866             NapiCallManagerUtils::ToInt32Value(
867                 env, static_cast<int32_t>(CallTransferType::TRANSFER_TYPE_NOT_REACHABLE))),
868         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_TYPE_NO_REPLY",
869             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallTransferType::TRANSFER_TYPE_NO_REPLY))),
870         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_TYPE_BUSY",
871             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(CallTransferType::TRANSFER_TYPE_BUSY))),
872         DECLARE_NAPI_STATIC_PROPERTY("TRANSFER_TYPE_UNCONDITIONAL",
873             NapiCallManagerUtils::ToInt32Value(
874                 env, static_cast<int32_t>(CallTransferType::TRANSFER_TYPE_UNCONDITIONAL))),
875     };
876     napi_value result = nullptr;
877     napi_define_class(env, "CallTransferType", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor, nullptr,
878         sizeof(desc) / sizeof(*desc), desc, &result);
879     napi_set_named_property(env, exports, "CallTransferType", result);
880     return exports;
881 }
882 
DeclareTransferSettingTypeEnum(napi_env env,napi_value exports)883 napi_value NapiCallManager::DeclareTransferSettingTypeEnum(napi_env env, napi_value exports)
884 {
885     napi_property_descriptor desc[] = {
886         DECLARE_NAPI_STATIC_PROPERTY("CALL_TRANSFER_ERASURE",
887             NapiCallManagerUtils::ToInt32Value(
888                 env, static_cast<int32_t>(CallTransferSettingType::CALL_TRANSFER_ERASURE))),
889         DECLARE_NAPI_STATIC_PROPERTY("CALL_TRANSFER_REGISTRATION",
890             NapiCallManagerUtils::ToInt32Value(
891                 env, static_cast<int32_t>(CallTransferSettingType::CALL_TRANSFER_REGISTRATION))),
892         DECLARE_NAPI_STATIC_PROPERTY("CALL_TRANSFER_DISABLE",
893             NapiCallManagerUtils::ToInt32Value(
894                 env, static_cast<int32_t>(CallTransferSettingType::CALL_TRANSFER_DISABLE))),
895         DECLARE_NAPI_STATIC_PROPERTY("CALL_TRANSFER_ENABLE",
896             NapiCallManagerUtils::ToInt32Value(
897                 env, static_cast<int32_t>(CallTransferSettingType::CALL_TRANSFER_ENABLE))),
898     };
899     napi_value result = nullptr;
900     napi_define_class(env, "CallTransferSettingType", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor,
901         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
902     napi_set_named_property(env, exports, "CallTransferSettingType", result);
903     return exports;
904 }
905 
DeclareMmiCodeResultEnum(napi_env env,napi_value exports)906 napi_value NapiCallManager::DeclareMmiCodeResultEnum(napi_env env, napi_value exports)
907 {
908     napi_property_descriptor desc[] = {
909         DECLARE_NAPI_STATIC_PROPERTY("MMI_CODE_SUCCESS",
910             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(MmiCodeResult::MMI_CODE_SUCCESS))),
911         DECLARE_NAPI_STATIC_PROPERTY("MMI_CODE_FAILED",
912             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(MmiCodeResult::MMI_CODE_FAILED))),
913     };
914     napi_value result = nullptr;
915     napi_define_class(env, "MmiCodeResult", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor,
916         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
917     napi_set_named_property(env, exports, "MmiCodeResult", result);
918     return exports;
919 }
920 
DeclareDisconnectedReasonEnum(napi_env env,napi_value exports)921 napi_value NapiCallManager::DeclareDisconnectedReasonEnum(napi_env env, napi_value exports)
922 {
923     napi_property_descriptor desc[] = {
924         DECLARE_NAPI_STATIC_PROPERTY("UNASSIGNED_NUMBER",
925             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::UNASSIGNED_NUMBER))),
926         DECLARE_NAPI_STATIC_PROPERTY("NO_ROUTE_TO_DESTINATION",
927             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NO_ROUTE_TO_DESTINATION))),
928         DECLARE_NAPI_STATIC_PROPERTY("CHANNEL_UNACCEPTABLE",
929             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::CHANNEL_UNACCEPTABLE))),
930         DECLARE_NAPI_STATIC_PROPERTY("OPERATOR_DETERMINED_BARRING",
931             NapiCallManagerUtils::ToInt32Value(env,
932             static_cast<int32_t>(DisconnectedReason::OPERATOR_DETERMINED_BARRING))),
933         DECLARE_NAPI_STATIC_PROPERTY("CALL_COMPLETED_ELSEWHERE",
934             NapiCallManagerUtils::ToInt32Value(env,
935             static_cast<int32_t>(DisconnectedReason::CALL_COMPLETED_ELSEWHERE))),
936         DECLARE_NAPI_STATIC_PROPERTY("NORMAL_CALL_CLEARING",
937             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NORMAL_CALL_CLEARING))),
938         DECLARE_NAPI_STATIC_PROPERTY("USER_BUSY",
939             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::USER_BUSY))),
940         DECLARE_NAPI_STATIC_PROPERTY("NO_USER_RESPONDING",
941             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NO_USER_RESPONDING))),
942         DECLARE_NAPI_STATIC_PROPERTY("USER_ALERTING_NO_ANSWER",
943             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::USER_ALERTING_NO_ANSWER))),
944         DECLARE_NAPI_STATIC_PROPERTY("CALL_REJECTED",
945             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::CALL_REJECTED))),
946         DECLARE_NAPI_STATIC_PROPERTY("NUMBER_CHANGED",
947             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NUMBER_CHANGED))),
948         DECLARE_NAPI_STATIC_PROPERTY("CALL_REJECTED_DUE_TO_FEATURE_AT_THE_DESTINATION",
949             NapiCallManagerUtils::ToInt32Value(env,
950             static_cast<int32_t>(DisconnectedReason::CALL_REJECTED_DUE_TO_FEATURE_AT_THE_DESTINATION))),
951         DECLARE_NAPI_STATIC_PROPERTY("FAILED_PRE_EMPTION",
952             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::FAILED_PRE_EMPTION))),
953         DECLARE_NAPI_STATIC_PROPERTY("NON_SELECTED_USER_CLEARING",
954             NapiCallManagerUtils::ToInt32Value(env,
955             static_cast<int32_t>(DisconnectedReason::NON_SELECTED_USER_CLEARING))),
956         DECLARE_NAPI_STATIC_PROPERTY("DESTINATION_OUT_OF_ORDER",
957             NapiCallManagerUtils::ToInt32Value(env,
958             static_cast<int32_t>(DisconnectedReason::DESTINATION_OUT_OF_ORDER))),
959         DECLARE_NAPI_STATIC_PROPERTY("INVALID_NUMBER_FORMAT",
960             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::INVALID_NUMBER_FORMAT))),
961         DECLARE_NAPI_STATIC_PROPERTY("FACILITY_REJECTED",
962             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::FACILITY_REJECTED))),
963         DECLARE_NAPI_STATIC_PROPERTY("RESPONSE_TO_STATUS_ENQUIRY",
964             NapiCallManagerUtils::ToInt32Value(env,
965             static_cast<int32_t>(DisconnectedReason::RESPONSE_TO_STATUS_ENQUIRY))),
966         DECLARE_NAPI_STATIC_PROPERTY("NORMAL_UNSPECIFIED",
967             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NORMAL_UNSPECIFIED))),
968         DECLARE_NAPI_STATIC_PROPERTY("NO_CIRCUIT_CHANNEL_AVAILABLE",
969             NapiCallManagerUtils::ToInt32Value(env,
970             static_cast<int32_t>(DisconnectedReason::NO_CIRCUIT_CHANNEL_AVAILABLE))),
971         DECLARE_NAPI_STATIC_PROPERTY("NETWORK_OUT_OF_ORDER",
972             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NETWORK_OUT_OF_ORDER))),
973         DECLARE_NAPI_STATIC_PROPERTY("TEMPORARY_FAILURE",
974             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::TEMPORARY_FAILURE))),
975         DECLARE_NAPI_STATIC_PROPERTY("SWITCHING_EQUIPMENT_CONGESTION",
976             NapiCallManagerUtils::ToInt32Value(env,
977             static_cast<int32_t>(DisconnectedReason::SWITCHING_EQUIPMENT_CONGESTION))),
978         DECLARE_NAPI_STATIC_PROPERTY("ACCESS_INFORMATION_DISCARDED",
979             NapiCallManagerUtils::ToInt32Value(env,
980             static_cast<int32_t>(DisconnectedReason::ACCESS_INFORMATION_DISCARDED))),
981         DECLARE_NAPI_STATIC_PROPERTY("REQUEST_CIRCUIT_CHANNEL_NOT_AVAILABLE",
982             NapiCallManagerUtils::ToInt32Value(env,
983             static_cast<int32_t>(DisconnectedReason::REQUEST_CIRCUIT_CHANNEL_NOT_AVAILABLE))),
984         DECLARE_NAPI_STATIC_PROPERTY("RESOURCES_UNAVAILABLE_UNSPECIFIED",
985             NapiCallManagerUtils::ToInt32Value(env,
986             static_cast<int32_t>(DisconnectedReason::RESOURCES_UNAVAILABLE_UNSPECIFIED))),
987         DECLARE_NAPI_STATIC_PROPERTY("QUALITY_OF_SERVICE_UNAVAILABLE",
988             NapiCallManagerUtils::ToInt32Value(env,
989             static_cast<int32_t>(DisconnectedReason::QUALITY_OF_SERVICE_UNAVAILABLE))),
990         DECLARE_NAPI_STATIC_PROPERTY("REQUESTED_FACILITY_NOT_SUBSCRIBED",
991             NapiCallManagerUtils::ToInt32Value(env,
992             static_cast<int32_t>(DisconnectedReason::REQUESTED_FACILITY_NOT_SUBSCRIBED))),
993         DECLARE_NAPI_STATIC_PROPERTY("INCOMING_CALLS_BARRED_WITHIN_THE_CUG",
994             NapiCallManagerUtils::ToInt32Value(env,
995             static_cast<int32_t>(DisconnectedReason::INCOMING_CALLS_BARRED_WITHIN_THE_CUG))),
996         DECLARE_NAPI_STATIC_PROPERTY("BEARER_CAPABILITY_NOT_AUTHORIZED",
997             NapiCallManagerUtils::ToInt32Value(env,
998             static_cast<int32_t>(DisconnectedReason::BEARER_CAPABILITY_NOT_AUTHORIZED))),
999         DECLARE_NAPI_STATIC_PROPERTY("BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE",
1000             NapiCallManagerUtils::ToInt32Value(env,
1001             static_cast<int32_t>(DisconnectedReason::BEARER_CAPABILITY_NOT_PRESENTLY_AVAILABLE))),
1002         DECLARE_NAPI_STATIC_PROPERTY("SERVICE_OR_OPTION_NOT_AVAILABLE_UNSPECIFIED",
1003             NapiCallManagerUtils::ToInt32Value(env,
1004             static_cast<int32_t>(DisconnectedReason::SERVICE_OR_OPTION_NOT_AVAILABLE_UNSPECIFIED))),
1005         DECLARE_NAPI_STATIC_PROPERTY("BEARER_SERVICE_NOT_IMPLEMENTED",
1006             NapiCallManagerUtils::ToInt32Value(env,
1007             static_cast<int32_t>(DisconnectedReason::BEARER_SERVICE_NOT_IMPLEMENTED))),
1008         DECLARE_NAPI_STATIC_PROPERTY("ACM_EQUALTO_OR_GREATER_THAN_THE_MAXIMUM_VALUE",
1009             NapiCallManagerUtils::ToInt32Value(env,
1010             static_cast<int32_t>(DisconnectedReason::ACM_EQUALTO_OR_GREATE_THAN_ACMMAX))),
1011         DECLARE_NAPI_STATIC_PROPERTY("REQUESTED_FACILITY_NOT_IMPLEMENTED",
1012             NapiCallManagerUtils::ToInt32Value(env,
1013             static_cast<int32_t>(DisconnectedReason::REQUESTED_FACILITY_NOT_IMPLEMENTED))),
1014         DECLARE_NAPI_STATIC_PROPERTY("ONLY_RESTRICTED_DIGITAL_INFO_BEARER_CAPABILITY_IS_AVAILABLE",
1015             NapiCallManagerUtils::ToInt32Value(env,
1016             static_cast<int32_t>(DisconnectedReason::ONLY_RESTRICTED_DIGITAL_INFO_BEARER_CAPABILITY_IS_AVAILABLE))),
1017         DECLARE_NAPI_STATIC_PROPERTY("SERVICE_OR_OPTION_NOT_IMPLEMENTED_UNSPECIFIED",
1018             NapiCallManagerUtils::ToInt32Value(env,
1019             static_cast<int32_t>(DisconnectedReason::SERVICE_OR_OPTION_NOT_IMPLEMENTED_UNSPECIFIED))),
1020         DECLARE_NAPI_STATIC_PROPERTY("INVALID_TRANSACTION_IDENTIFIER_VALUE",
1021             NapiCallManagerUtils::ToInt32Value(env,
1022             static_cast<int32_t>(DisconnectedReason::INVALID_TRANSACTION_IDENTIFIER_VALUE))),
1023         DECLARE_NAPI_STATIC_PROPERTY("USER_NOT_MEMBER_OF_CUG",
1024             NapiCallManagerUtils::ToInt32Value(env,
1025             static_cast<int32_t>(DisconnectedReason::USER_NOT_MEMBER_OF_CUG))),
1026         DECLARE_NAPI_STATIC_PROPERTY("INCOMPATIBLE_DESTINATION",
1027             NapiCallManagerUtils::ToInt32Value(env,
1028             static_cast<int32_t>(DisconnectedReason::INCOMPATIBLE_DESTINATION))),
1029         DECLARE_NAPI_STATIC_PROPERTY("INVALID_TRANSIT_NETWORK_SELECTION",
1030             NapiCallManagerUtils::ToInt32Value(env,
1031             static_cast<int32_t>(DisconnectedReason::INVALID_TRANSIT_NETWORK_SELECTION))),
1032         DECLARE_NAPI_STATIC_PROPERTY("SEMANTICALLY_INCORRECT_MESSAGE",
1033             NapiCallManagerUtils::ToInt32Value(env,
1034             static_cast<int32_t>(DisconnectedReason::SEMANTICALLY_INCORRECT_MESSAGE))),
1035         DECLARE_NAPI_STATIC_PROPERTY("INVALID_MANDATORY_INFORMATION",
1036             NapiCallManagerUtils::ToInt32Value(env,
1037             static_cast<int32_t>(DisconnectedReason::INVALID_MANDATORY_INFORMATION))),
1038         DECLARE_NAPI_STATIC_PROPERTY("MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED",
1039             NapiCallManagerUtils::ToInt32Value(env,
1040             static_cast<int32_t>(DisconnectedReason::MESSAGE_TYPE_NON_EXISTENT_OR_NOT_IMPLEMENTED))),
1041         DECLARE_NAPI_STATIC_PROPERTY("MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE",
1042             NapiCallManagerUtils::ToInt32Value(env,
1043             static_cast<int32_t>(DisconnectedReason::MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE))),
1044         DECLARE_NAPI_STATIC_PROPERTY("INFORMATION_ELEMENT_NON_EXISTENT_OR_NOT_IMPLEMENTED",
1045             NapiCallManagerUtils::ToInt32Value(env,
1046             static_cast<int32_t>(DisconnectedReason::INFORMATION_ELEMENT_NON_EXISTENT_OR_NOT_IMPLEMENTED))),
1047         DECLARE_NAPI_STATIC_PROPERTY("CONDITIONAL_IE_ERROR",
1048             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::CONDITIONAL_IE_ERROR))),
1049         DECLARE_NAPI_STATIC_PROPERTY("MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE",
1050             NapiCallManagerUtils::ToInt32Value(env,
1051             static_cast<int32_t>(DisconnectedReason::MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE))),
1052         DECLARE_NAPI_STATIC_PROPERTY("RECOVERY_ON_TIMER_EXPIRED",
1053             NapiCallManagerUtils::ToInt32Value(env,
1054             static_cast<int32_t>(DisconnectedReason::RECOVERY_ON_TIMER_EXPIRED))),
1055         DECLARE_NAPI_STATIC_PROPERTY("PROTOCOL_ERROR_UNSPECIFIED",
1056             NapiCallManagerUtils::ToInt32Value(env,
1057             static_cast<int32_t>(DisconnectedReason::PROTOCOL_ERROR_UNSPECIFIED))),
1058         DECLARE_NAPI_STATIC_PROPERTY("INTERWORKING_UNSPECIFIED",
1059             NapiCallManagerUtils::ToInt32Value(env,
1060             static_cast<int32_t>(DisconnectedReason::INTERWORKING_UNSPECIFIED))),
1061         DECLARE_NAPI_STATIC_PROPERTY("CALL_BARRED",
1062             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::CALL_BARRED))),
1063         DECLARE_NAPI_STATIC_PROPERTY("FDN_BLOCKED",
1064             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::FDN_BLOCKED))),
1065         DECLARE_NAPI_STATIC_PROPERTY("IMSI_UNKNOWN_IN_VLR",
1066             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::IMSI_UNKNOWN_IN_VLR))),
1067         DECLARE_NAPI_STATIC_PROPERTY("IMEI_NOT_ACCEPTED",
1068             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::IMEI_NOT_ACCEPTED))),
1069         DECLARE_NAPI_STATIC_PROPERTY("DIAL_MODIFIED_TO_USSD",
1070             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::DIAL_MODIFIED_TO_USSD))),
1071         DECLARE_NAPI_STATIC_PROPERTY("DIAL_MODIFIED_TO_SS",
1072             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::DIAL_MODIFIED_TO_SS))),
1073         DECLARE_NAPI_STATIC_PROPERTY("DIAL_MODIFIED_TO_DIAL",
1074             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::DIAL_MODIFIED_TO_DIAL))),
1075         DECLARE_NAPI_STATIC_PROPERTY("RADIO_OFF",
1076             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_OFF))),
1077         DECLARE_NAPI_STATIC_PROPERTY("OUT_OF_SERVICE",
1078             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::OUT_OF_SERVICE))),
1079         DECLARE_NAPI_STATIC_PROPERTY("NO_VALID_SIM",
1080             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NO_VALID_SIM))),
1081         DECLARE_NAPI_STATIC_PROPERTY("RADIO_INTERNAL_ERROR",
1082             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_INTERNAL_ERROR))),
1083         DECLARE_NAPI_STATIC_PROPERTY("NETWORK_RESP_TIMEOUT",
1084             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NETWORK_RESP_TIMEOUT))),
1085         DECLARE_NAPI_STATIC_PROPERTY("NETWORK_REJECT",
1086             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NETWORK_REJECT))),
1087         DECLARE_NAPI_STATIC_PROPERTY("RADIO_ACCESS_FAILURE",
1088             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_ACCESS_FAILURE))),
1089         DECLARE_NAPI_STATIC_PROPERTY("RADIO_LINK_FAILURE",
1090             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_LINK_FAILURE))),
1091         DECLARE_NAPI_STATIC_PROPERTY("RADIO_LINK_LOST",
1092             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_LINK_LOST))),
1093         DECLARE_NAPI_STATIC_PROPERTY("RADIO_UPLINK_FAILURE",
1094             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_UPLINK_FAILURE))),
1095         DECLARE_NAPI_STATIC_PROPERTY("RADIO_SETUP_FAILURE",
1096             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_SETUP_FAILURE))),
1097         DECLARE_NAPI_STATIC_PROPERTY("RADIO_RELEASE_NORMAL",
1098             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_RELEASE_NORMAL))),
1099         DECLARE_NAPI_STATIC_PROPERTY("RADIO_RELEASE_ABNORMAL",
1100             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::RADIO_RELEASE_ABNORMAL))),
1101         DECLARE_NAPI_STATIC_PROPERTY("ACCESS_CLASS_BLOCKED",
1102             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::ACCESS_CLASS_BLOCKED))),
1103         DECLARE_NAPI_STATIC_PROPERTY("NETWORK_DETACH",
1104             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::NETWORK_DETACH))),
1105         DECLARE_NAPI_STATIC_PROPERTY("INVALID_PARAMETER",
1106             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::INVALID_PARAMETER))),
1107         DECLARE_NAPI_STATIC_PROPERTY("SIM_NOT_EXIT",
1108             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::SIM_NOT_EXIT))),
1109         DECLARE_NAPI_STATIC_PROPERTY("SIM_PIN_NEED",
1110             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::SIM_PIN_NEED))),
1111         DECLARE_NAPI_STATIC_PROPERTY("CALL_NOT_ALLOW",
1112             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::CALL_NOT_ALLOW))),
1113         DECLARE_NAPI_STATIC_PROPERTY("SIM_INVALID",
1114             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::SIM_INVALID))),
1115         DECLARE_NAPI_STATIC_PROPERTY("UNKNOWN",
1116             NapiCallManagerUtils::ToInt32Value(env, static_cast<int32_t>(DisconnectedReason::FAILED_UNKNOWN))),
1117     };
1118     napi_value result = nullptr;
1119     napi_define_class(env, "DisconnectedReason", NAPI_AUTO_LENGTH, NapiCallManagerUtils::CreateEnumConstructor,
1120         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
1121     napi_set_named_property(env, exports, "DisconnectedReason", result);
1122     return exports;
1123 }
1124 
1125 /**
1126  * The call_manager is initialized.
1127  */
RegisterCallManagerFunc(napi_env env,napi_value exports)1128 napi_value NapiCallManager::RegisterCallManagerFunc(napi_env env, napi_value exports)
1129 {
1130     // Interface initialization
1131     DeclareCallBasisInterface(env, exports);
1132     DeclareCallConferenceInterface(env, exports);
1133     DeclareCallSupplementInterface(env, exports);
1134     DeclareCallExtendInterface(env, exports);
1135     DeclareCallMultimediaInterface(env, exports);
1136     // Enumeration class initialization
1137     DeclareCallMediaEnum(env, exports);
1138     DeclareCallDialEnum(env, exports);
1139     DeclareCallStateEnum(env, exports);
1140     DeclareCallEventEnum(env, exports);
1141     DeclareCallRestrictionEnum(env, exports);
1142     DeclareCallWaitingEnum(env, exports);
1143     DeclareCallTransferEnum(env, exports);
1144     DeclareCallImsInterface(env, exports);
1145     // Enumeration class extension initialization
1146     DeclareVoNRStateEnum(env, exports);
1147     DeclareAudioDeviceEnum(env, exports);
1148     DeclareVideoStateTypeEnum(env, exports);
1149     DeclareVideoRequestResultEnum(env, exports);
1150     DeclareImsCallModeEnum(env, exports);
1151     DeclareDeviceDirectionEnum(env, exports);
1152     DeclareDialSceneEnum(env, exports);
1153     DeclareCallTypeEnum(env, exports);
1154     DeclareDialTypeEnum(env, exports);
1155     DeclareTelCallStateEnum(env, exports);
1156     DeclareConferenceStateEnum(env, exports);
1157     DeclareCallStateToAppEnum(env, exports);
1158     DeclareCallEventEnumEx(env, exports);
1159     DeclareCallSessionEventEnumEx(env, exports);
1160     DeclareRestrictionTypeEnum(env, exports);
1161     DeclareRestrictionModeEnum(env, exports);
1162     DeclareRestrictionStatusEnum(env, exports);
1163     DeclareCallWaitingEnumEx(env, exports);
1164     DeclareTransferStatusEnum(env, exports);
1165     DeclareTransferTypeEnum(env, exports);
1166     DeclareTransferSettingTypeEnum(env, exports);
1167     DeclareMmiCodeResultEnum(env, exports);
1168     DeclareDisconnectedReasonEnum(env, exports);
1169     Init();
1170     RegisterCallBack();
1171     return exports;
1172 }
1173 
Dial(napi_env env,napi_callback_info info)1174 napi_value NapiCallManager::Dial(napi_env env, napi_callback_info info)
1175 {
1176     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
1177     NAPI_ASSERT(env, argc <= VALUE_MAXIMUM_LIMIT, "parameter error!");
1178     bool matchFlag = NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_string);
1179     NAPI_ASSERT(env, matchFlag, "Dial type error, should be string type");
1180     auto asyncContext = (std::make_unique<DialAsyncContext>());
1181     if (asyncContext == nullptr) {
1182         std::string errorCode = std::to_string(napi_generic_failure);
1183         std::string errorMessage = "Dial error at baseContext is nullptr";
1184         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
1185         return nullptr;
1186     }
1187     napi_get_value_string_utf8(
1188         env, argv[ARRAY_INDEX_FIRST], asyncContext->number, PHONE_NUMBER_MAXIMUM_LIMIT, &(asyncContext->numberLen));
1189     if (argc == TWO_VALUE_LIMIT) {
1190         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_undefined) ||
1191             NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_null)) {
1192             TELEPHONY_LOGI("undefined or null param is detected, second param is ignored.");
1193         } else if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function)) {
1194             napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1195         } else if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_object)) {
1196             GetDialInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
1197         }
1198     } else if (argc == VALUE_MAXIMUM_LIMIT &&
1199         NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_object)) {
1200         GetDialInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
1201         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1202     }
1203     return HandleAsyncWork(env, asyncContext.release(), "Dial", NativeDial, NativeDialCallBack);
1204 }
1205 
MatchStringAndVariableObjectParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)1206 bool NapiCallManager::MatchStringAndVariableObjectParameters(
1207     napi_env env, const napi_value parameters[], const size_t parameterCount)
1208 {
1209     TELEPHONY_LOGD("Telephony_CallManager MatchStringAndVariableObjectParameters %{public}zu", parameterCount);
1210     switch (parameterCount) {
1211         case ONLY_ONE_VALUE:
1212             return NapiUtil::MatchParameters(env, parameters, { napi_string });
1213         case TWO_VALUE_LIMIT:
1214             return NapiUtil::MatchParameters(env, parameters, { napi_string, napi_function }) ||
1215                    NapiUtil::MatchParameters(env, parameters, { napi_string, napi_null}) ||
1216                    NapiUtil::MatchParameters(env, parameters, { napi_string, napi_undefined }) ||
1217                    NapiUtil::MatchParameters(env, parameters, { napi_string, napi_object });
1218         case VALUE_MAXIMUM_LIMIT:
1219             return NapiUtil::MatchParameters(env, parameters, { napi_string, napi_object, napi_function });
1220         default:
1221             return false;
1222     }
1223 }
1224 
DialCall(napi_env env,napi_callback_info info)1225 napi_value NapiCallManager::DialCall(napi_env env, napi_callback_info info)
1226 {
1227     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
1228     if (!MatchStringAndVariableObjectParameters(env, argv, argc)) {
1229         TELEPHONY_LOGE("MatchStringAndVariableObjectParameters failed.");
1230         NapiUtil::ThrowParameterError(env);
1231         return nullptr;
1232     }
1233     auto asyncContext = (std::make_unique<DialAsyncContext>());
1234     if (asyncContext == nullptr) {
1235         NapiUtil::ThrowParameterError(env);
1236         TELEPHONY_LOGE("asyncContext is nullptr.");
1237         return nullptr;
1238     }
1239     napi_get_value_string_utf8(
1240         env, argv[ARRAY_INDEX_FIRST], asyncContext->number, PHONE_NUMBER_MAXIMUM_LIMIT, &(asyncContext->numberLen));
1241     if (argc == TWO_VALUE_LIMIT) {
1242         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function)) {
1243             napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1244         } else {
1245             GetDialInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
1246         }
1247     } else if (argc == VALUE_MAXIMUM_LIMIT &&
1248         NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_object) &&
1249         NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_THIRD], napi_function)) {
1250         GetDialInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
1251         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1252     }
1253     return HandleAsyncWork(env, asyncContext.release(), "DialCall", NativeDialCall, NativeVoidCallBackWithErrorCode);
1254 }
1255 
MakeCall(napi_env env,napi_callback_info info)1256 napi_value NapiCallManager::MakeCall(napi_env env, napi_callback_info info)
1257 {
1258     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
1259     if (!MatchOneStringParameter(env, argv, argc)) {
1260         TELEPHONY_LOGE("NapiCallManager::MakeCall MatchOneStringParameter failed.");
1261         NapiUtil::ThrowParameterError(env);
1262         return nullptr;
1263     }
1264     auto asyncContext = std::make_unique<AsyncContext>();
1265     if (asyncContext == nullptr) {
1266         NapiUtil::ThrowParameterError(env);
1267         return nullptr;
1268     }
1269     napi_get_value_string_utf8(
1270         env, argv[ARRAY_INDEX_FIRST], asyncContext->number, PHONE_NUMBER_MAXIMUM_LIMIT, &(asyncContext->numberLen));
1271     if (argc == TWO_VALUE_LIMIT) {
1272         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1273     }
1274     return HandleAsyncWork(env, asyncContext.release(), "MakeCall", NativeMakeCall, NativeVoidCallBackWithErrorCode);
1275 }
1276 
AnswerCall(napi_env env,napi_callback_info info)1277 napi_value NapiCallManager::AnswerCall(napi_env env, napi_callback_info info)
1278 {
1279     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1280     if (!MatchOneOptionalNumberParameter(env, argv, argc)) {
1281         TELEPHONY_LOGE("MatchOneOptionalNumberParameter failed.");
1282         NapiUtil::ThrowParameterError(env);
1283         return nullptr;
1284     }
1285     auto answerAsyncContext = std::make_unique<AnswerAsyncContext>();
1286     if (answerAsyncContext == nullptr) {
1287         TELEPHONY_LOGE("answerAsyncContext is nullptr.");
1288         NapiUtil::ThrowParameterError(env);
1289         return nullptr;
1290     }
1291 
1292     if (argc == ZERO_VALUE) {
1293         TELEPHONY_LOGI("no param input");
1294     } else if (argc == ONLY_ONE_VALUE) {
1295         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_undefined) ||
1296             NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_null)) {
1297             TELEPHONY_LOGI("undefined or null param is detected, treating as no param input.");
1298         } else if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_function)) {
1299             napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(answerAsyncContext->callbackRef));
1300         } else {
1301             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &answerAsyncContext->callId);
1302         }
1303     } else if (argc == TWO_VALUE_LIMIT) {
1304         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function)) {
1305             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &answerAsyncContext->callId);
1306             napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(answerAsyncContext->callbackRef));
1307         } else {
1308             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &answerAsyncContext->videoState);
1309             napi_get_value_int32(env, argv[ARRAY_INDEX_SECOND], &answerAsyncContext->callId);
1310         }
1311     }
1312 
1313     return HandleAsyncWork(
1314         env, answerAsyncContext.release(), "AnswerCall", NativeAnswerCall, NativeVoidCallBackWithErrorCode);
1315 }
1316 
AnswerVideoCall(napi_env env,napi_callback_info info)1317 napi_value NapiCallManager::AnswerVideoCall(napi_env env, napi_callback_info info)
1318 {
1319     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
1320     if (!MatchAnswerCallParameter(env, argv, argc)) {
1321         TELEPHONY_LOGE("MatchOneOptionalNumberParameter failed.");
1322         NapiUtil::ThrowParameterError(env);
1323         return nullptr;
1324     }
1325     auto answerAsyncContext = std::make_unique<AnswerAsyncContext>();
1326     if (answerAsyncContext == nullptr) {
1327         TELEPHONY_LOGE("answerAsyncContext is nullptr.");
1328         NapiUtil::ThrowParameterError(env);
1329         return nullptr;
1330     }
1331     if (argc == ZERO_VALUE) {
1332         TELEPHONY_LOGI("no param input");
1333     } else if (argc == ONLY_ONE_VALUE) {
1334         napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &answerAsyncContext->videoState);
1335     } else if (argc == TWO_VALUE_LIMIT) {
1336         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function)) {
1337             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &answerAsyncContext->videoState);
1338             napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(answerAsyncContext->callbackRef));
1339         } else {
1340             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &answerAsyncContext->videoState);
1341             napi_get_value_int32(env, argv[ARRAY_INDEX_SECOND], &answerAsyncContext->callId);
1342         }
1343     }
1344 
1345     return HandleAsyncWork(
1346         env, answerAsyncContext.release(), "AnswerCall", NativeAnswerCall, NativeVoidCallBackWithErrorCode);
1347 }
1348 
RejectCall(napi_env env,napi_callback_info info)1349 napi_value NapiCallManager::RejectCall(napi_env env, napi_callback_info info)
1350 {
1351     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
1352     if (!MatchRejectCallParameters(env, argv, argc)) {
1353         TELEPHONY_LOGE("MatchRejectCallParameters failed.");
1354         NapiUtil::ThrowParameterError(env);
1355         return nullptr;
1356     }
1357     auto asyncContext = std::make_unique<RejectAsyncContext>();
1358     if (asyncContext == nullptr) {
1359         TELEPHONY_LOGE("asyncContext is nullptr.");
1360         NapiUtil::ThrowParameterError(env);
1361         return nullptr;
1362     }
1363     asyncContext->isSendSms = false;
1364     if (argc == ZERO_VALUE) {
1365         TELEPHONY_LOGI("no param input.");
1366     } else if (argc == ONLY_ONE_VALUE) {
1367         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_undefined)) {
1368             TELEPHONY_LOGI("undefined or null param is detected, treating as no param input.");
1369         } else if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_function)) {
1370             napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1371         } else if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_number)) {
1372             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1373         } else {
1374             GetSmsInfo(env, argv[ARRAY_INDEX_FIRST], *asyncContext);
1375         }
1376     } else if (argc == TWO_VALUE_LIMIT) {
1377         if (MatchRejectCallTwoIllegalParameters(env, argv)) {
1378             TELEPHONY_LOGI("undefined or null params are detected, treating as no param input.");
1379         } else if (MatchRejectCallFirstIllegalParameters(env, argv)) {
1380             TELEPHONY_LOGI("undefined or null param is detected, first param is ignored.");
1381             GetSmsInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
1382         } else if (MatchRejectCallSecondIllegalParameters(env, argv)) {
1383             TELEPHONY_LOGI("undefined or null param is detected, second param is ignored.");
1384             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1385         } else if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_object) &&
1386             NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function)) {
1387             GetSmsInfo(env, argv[ARRAY_INDEX_FIRST], *asyncContext);
1388             napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1389         } else if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_number) &&
1390                    NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function)) {
1391             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1392             napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1393         } else {
1394             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1395             GetSmsInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
1396         }
1397     } else {
1398         napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1399         GetSmsInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
1400         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1401     }
1402 
1403     return HandleAsyncWork(
1404         env, asyncContext.release(), "RejectCall", NativeRejectCall, NativeVoidCallBackWithErrorCode);
1405 }
1406 
HangUpCall(napi_env env,napi_callback_info info)1407 napi_value NapiCallManager::HangUpCall(napi_env env, napi_callback_info info)
1408 {
1409     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1410     if (!MatchOneOptionalNumberParameter(env, argv, argc)) {
1411         TELEPHONY_LOGE("MatchOneOptionalNumberParameter failed.");
1412         NapiUtil::ThrowParameterError(env);
1413         return nullptr;
1414     }
1415     auto asyncContext = std::make_unique<AsyncContext>();
1416     if (asyncContext == nullptr) {
1417         TELEPHONY_LOGE("asyncContext is nullptr.");
1418         NapiUtil::ThrowParameterError(env);
1419         return nullptr;
1420     }
1421 
1422     if (argc == ZERO_VALUE) {
1423         TELEPHONY_LOGI("no param input");
1424     } else if (argc == ONLY_ONE_VALUE) {
1425         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_undefined) ||
1426             NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_null)) {
1427             TELEPHONY_LOGI("undefined or null param is detected, treating as no param input.");
1428         } else if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_function)) {
1429             napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1430         } else {
1431             napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1432         }
1433     } else {
1434         napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1435         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1436     }
1437 
1438     return HandleAsyncWork(
1439         env, asyncContext.release(), "HangUpCall", NativeHangUpCall, NativeVoidCallBackWithErrorCode);
1440 }
1441 
HoldCall(napi_env env,napi_callback_info info)1442 napi_value NapiCallManager::HoldCall(napi_env env, napi_callback_info info)
1443 {
1444     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1445     if (!MatchOneNumberParameter(env, argv, argc)) {
1446         TELEPHONY_LOGE("NapiCallManager::HoldCall MatchOneNumberParameter failed.");
1447         NapiUtil::ThrowParameterError(env);
1448         return nullptr;
1449     }
1450     auto asyncContext = std::make_unique<AsyncContext>();
1451     if (asyncContext == nullptr) {
1452         TELEPHONY_LOGE("NapiCallManager::HoldCall asyncContext is nullptr.");
1453         NapiUtil::ThrowParameterError(env);
1454         return nullptr;
1455     }
1456     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1457     if (argc == TWO_VALUE_LIMIT) {
1458         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1459     }
1460     return HandleAsyncWork(env, asyncContext.release(), "HoldCall", NativeHoldCall, NativeVoidCallBackWithErrorCode);
1461 }
1462 
UnHoldCall(napi_env env,napi_callback_info info)1463 napi_value NapiCallManager::UnHoldCall(napi_env env, napi_callback_info info)
1464 {
1465     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1466     if (!MatchOneNumberParameter(env, argv, argc)) {
1467         TELEPHONY_LOGE("NapiCallManager::UnHoldCall MatchOneNumberParameter failed.");
1468         NapiUtil::ThrowParameterError(env);
1469         return nullptr;
1470     }
1471     auto asyncContext = std::make_unique<AsyncContext>();
1472     if (asyncContext == nullptr) {
1473         TELEPHONY_LOGE("NapiCallManager::UnHoldCall asyncContext is nullptr.");
1474         NapiUtil::ThrowParameterError(env);
1475         return nullptr;
1476     }
1477     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1478     if (argc == TWO_VALUE_LIMIT) {
1479         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1480     }
1481     return HandleAsyncWork(
1482         env, asyncContext.release(), "UnHoldCall", NativeUnHoldCall, NativeVoidCallBackWithErrorCode);
1483 }
1484 
SwitchCall(napi_env env,napi_callback_info info)1485 napi_value NapiCallManager::SwitchCall(napi_env env, napi_callback_info info)
1486 {
1487     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1488     if (!MatchOneNumberParameter(env, argv, argc)) {
1489         TELEPHONY_LOGE("NapiCallManager::SwitchCall MatchOneNumberParameter failed.");
1490         NapiUtil::ThrowParameterError(env);
1491         return nullptr;
1492     }
1493     auto asyncContext = std::make_unique<AsyncContext>();
1494     if (asyncContext == nullptr) {
1495         TELEPHONY_LOGE("NapiCallManager::SwitchCall asyncContext is nullptr.");
1496         NapiUtil::ThrowParameterError(env);
1497         return nullptr;
1498     }
1499     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1500     if (argc == TWO_VALUE_LIMIT) {
1501         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1502     }
1503 
1504     return HandleAsyncWork(
1505         env, asyncContext.release(), "SwitchCall", NativeSwitchCall, NativeVoidCallBackWithErrorCode);
1506 }
1507 
CombineConference(napi_env env,napi_callback_info info)1508 napi_value NapiCallManager::CombineConference(napi_env env, napi_callback_info info)
1509 {
1510     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1511     if (!MatchOneNumberParameter(env, argv, argc)) {
1512         TELEPHONY_LOGE("NapiCallManager::CombineConference MatchOneNumberParameter failed.");
1513         NapiUtil::ThrowParameterError(env);
1514         return nullptr;
1515     }
1516     auto asyncContext = std::make_unique<AsyncContext>();
1517     if (asyncContext == nullptr) {
1518         TELEPHONY_LOGE("NapiCallManager::CombineConference asyncContext is nullptr.");
1519         NapiUtil::ThrowParameterError(env);
1520         return nullptr;
1521     }
1522     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1523     if (argc == TWO_VALUE_LIMIT) {
1524         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1525     }
1526 
1527     return HandleAsyncWork(
1528         env, asyncContext.release(), "CombineConference", NativeCombineConference, NativeVoidCallBackWithErrorCode);
1529 }
1530 
SeparateConference(napi_env env,napi_callback_info info)1531 napi_value NapiCallManager::SeparateConference(napi_env env, napi_callback_info info)
1532 {
1533     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1534     if (!MatchOneNumberParameter(env, argv, argc)) {
1535         TELEPHONY_LOGE("NapiCallManager::SeparateConference MatchOneNumberParameter failed.");
1536         NapiUtil::ThrowParameterError(env);
1537         return nullptr;
1538     }
1539     auto asyncContext = std::make_unique<AsyncContext>();
1540     if (asyncContext == nullptr) {
1541         TELEPHONY_LOGE("NapiCallManager::SeparateConference asyncContext is nullptr.");
1542         NapiUtil::ThrowParameterError(env);
1543         return nullptr;
1544     }
1545     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1546     if (argc == TWO_VALUE_LIMIT) {
1547         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1548     }
1549     return HandleAsyncWork(
1550         env, asyncContext.release(), "SeparateConference", NativeSeparateConference, NativeVoidCallBackWithErrorCode);
1551 }
1552 
KickOutFromConference(napi_env env,napi_callback_info info)1553 napi_value NapiCallManager::KickOutFromConference(napi_env env, napi_callback_info info)
1554 {
1555     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1556     if (!MatchOneNumberParameter(env, argv, argc)) {
1557         TELEPHONY_LOGE("NapiCallManager::KickoutFromConference MatchOneNumberParameter failed.");
1558         NapiUtil::ThrowParameterError(env);
1559         return nullptr;
1560     }
1561     auto asyncContext = std::make_unique<AsyncContext>();
1562     if (asyncContext == nullptr) {
1563         TELEPHONY_LOGE("NapiCallManager::KickoutFromConference asyncContext is nullptr.");
1564         NapiUtil::ThrowParameterError(env);
1565         return nullptr;
1566     }
1567     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1568     if (argc == TWO_VALUE_LIMIT) {
1569         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1570     }
1571     return HandleAsyncWork(env, asyncContext.release(), "KickoutFromConference", NativeKickOutFromConference,
1572         NativeVoidCallBackWithErrorCode);
1573 }
1574 
GetMainCallId(napi_env env,napi_callback_info info)1575 napi_value NapiCallManager::GetMainCallId(napi_env env, napi_callback_info info)
1576 {
1577     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1578     if (!MatchOneNumberParameter(env, argv, argc)) {
1579         TELEPHONY_LOGE("NapiCallManager::GetMainCallId MatchOneNumberParameter failed.");
1580         NapiUtil::ThrowParameterError(env);
1581         return nullptr;
1582     }
1583     auto asyncContext = std::make_unique<IntResultAsyncContext>();
1584     if (asyncContext == nullptr) {
1585         TELEPHONY_LOGE("NapiCallManager::GetMainCallId asyncContext is nullptr.");
1586         NapiUtil::ThrowParameterError(env);
1587         return nullptr;
1588     }
1589     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1590     if (argc == TWO_VALUE_LIMIT) {
1591         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1592     }
1593     return HandleAsyncWork(
1594         env, asyncContext.release(), "GetMainCallId", NativeGetMainCallId, NativeGetMainCallIdCallBack);
1595 }
1596 
GetSubCallIdList(napi_env env,napi_callback_info info)1597 napi_value NapiCallManager::GetSubCallIdList(napi_env env, napi_callback_info info)
1598 {
1599     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1600     if (!MatchOneNumberParameter(env, argv, argc)) {
1601         TELEPHONY_LOGE("NapiCallManager::GetSubCallIdList MatchOneNumberParameter failed.");
1602         NapiUtil::ThrowParameterError(env);
1603         return nullptr;
1604     }
1605     auto asyncContext = std::make_unique<ListAsyncContext>();
1606     if (asyncContext == nullptr) {
1607         TELEPHONY_LOGE("NapiCallManager::GetSubCallIdList asyncContext is nullptr.");
1608         NapiUtil::ThrowParameterError(env);
1609         return nullptr;
1610     }
1611     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1612     if (argc == TWO_VALUE_LIMIT) {
1613         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1614     }
1615     return HandleAsyncWork(env, asyncContext.release(), "GetSubCallIdList", NativeGetSubCallIdList, NativeListCallBack);
1616 }
1617 
GetCallIdListForConference(napi_env env,napi_callback_info info)1618 napi_value NapiCallManager::GetCallIdListForConference(napi_env env, napi_callback_info info)
1619 {
1620     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1621     if (!MatchOneNumberParameter(env, argv, argc)) {
1622         TELEPHONY_LOGE("NapiCallManager::GetCallIdListForConference MatchOneNumberParameter failed.");
1623         NapiUtil::ThrowParameterError(env);
1624         return nullptr;
1625     }
1626     auto asyncContext = std::make_unique<ListAsyncContext>();
1627     if (asyncContext == nullptr) {
1628         TELEPHONY_LOGE("NapiCallManager::GetCallIdListForConference asyncContext is nullptr.");
1629         NapiUtil::ThrowParameterError(env);
1630         return nullptr;
1631     }
1632     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
1633     if (argc == TWO_VALUE_LIMIT) {
1634         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1635     }
1636     return HandleAsyncWork(env, asyncContext.release(), "GetCallIdListForConference", NativeGetCallIdListForConference,
1637         NativeListCallBack);
1638 }
1639 
MatchEmptyParameter(napi_env env,const napi_value parameters[],const size_t parameterCount)1640 bool NapiCallManager::MatchEmptyParameter(napi_env env, const napi_value parameters[], const size_t parameterCount)
1641 {
1642     TELEPHONY_LOGI("Telephony_CallManager MatchEmptyParameter %{public}zu", parameterCount);
1643     switch (parameterCount) {
1644         case ZERO_VALUE:
1645             return true;
1646         case ONLY_ONE_VALUE:
1647             return NapiUtil::MatchParameters(env, parameters, { napi_function });
1648         default:
1649             return false;
1650     }
1651 }
1652 
MatchOneOptionalNumberParameter(napi_env env,const napi_value parameters[],const size_t parameterCount)1653 bool NapiCallManager::MatchOneOptionalNumberParameter(
1654     napi_env env, const napi_value parameters[], const size_t parameterCount)
1655 {
1656     TELEPHONY_LOGI("Telephony_CallManager MatchAnswerParameters %{public}zu", parameterCount);
1657     switch (parameterCount) {
1658         case ZERO_VALUE:
1659             return true;
1660         case ONLY_ONE_VALUE:
1661             return NapiUtil::MatchParameters(env, parameters, { napi_number }) ||
1662                    NapiUtil::MatchParameters(env, parameters, { napi_function }) ||
1663                    NapiUtil::MatchParameters(env, parameters, { napi_null }) ||
1664                    NapiUtil::MatchParameters(env, parameters, { napi_undefined });
1665         case TWO_VALUE_LIMIT:
1666             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_number }) ||
1667                    NapiUtil::MatchParameters(env, parameters, { napi_number, napi_function });
1668         default:
1669             return false;
1670     }
1671 }
1672 
MatchAnswerCallParameter(napi_env env,const napi_value parameters[],const size_t parameterCount)1673 bool NapiCallManager::MatchAnswerCallParameter(
1674     napi_env env, const napi_value parameters[], const size_t parameterCount)
1675 {
1676     TELEPHONY_LOGI("Telephony_CallManager MatchAnswerParameters %{public}zu", parameterCount);
1677     switch (parameterCount) {
1678         case ZERO_VALUE:
1679             return true;
1680         case ONLY_ONE_VALUE:
1681             return NapiUtil::MatchParameters(env, parameters, { napi_number });
1682         case TWO_VALUE_LIMIT:
1683             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_number }) ||
1684                    NapiUtil::MatchParameters(env, parameters, { napi_number, napi_function});
1685         case THREE_VALUE_MAXIMUM_LIMIT:
1686             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_number, napi_function });
1687         default:
1688             return false;
1689     }
1690 }
1691 
MatchOneStringParameter(napi_env env,const napi_value parameters[],const size_t parameterCount)1692 bool NapiCallManager::MatchOneStringParameter(napi_env env, const napi_value parameters[], const size_t parameterCount)
1693 {
1694     TELEPHONY_LOGI("Telephony_CallManager MatchOneNumberParameter %{public}zu", parameterCount);
1695     switch (parameterCount) {
1696         case ONLY_ONE_VALUE:
1697             return NapiUtil::MatchParameters(env, parameters, { napi_string });
1698         case TWO_VALUE_LIMIT:
1699             return NapiUtil::MatchParameters(env, parameters, { napi_string, napi_function });
1700         default:
1701             return false;
1702     }
1703 }
1704 
MatchObserverOffParameter(napi_env env,const napi_value parameters[],const size_t parameterCount)1705 bool NapiCallManager::MatchObserverOffParameter(
1706     napi_env env, const napi_value parameters[], const size_t parameterCount)
1707 {
1708     TELEPHONY_LOGI("parameter count: %{public}zu", parameterCount);
1709     switch (parameterCount) {
1710         case ONLY_ONE_VALUE:
1711             return NapiUtil::MatchParameters(env, parameters, { napi_string });
1712         case TWO_VALUE_LIMIT:
1713             return NapiUtil::MatchParameters(env, parameters, { napi_string, napi_function }) ||
1714                    NapiUtil::MatchParameters(env, parameters, { napi_string, napi_null }) ||
1715                    NapiUtil::MatchParameters(env, parameters, { napi_string, napi_undefined });
1716         default:
1717             return false;
1718     }
1719 }
1720 
MatchOneNumberParameter(napi_env env,const napi_value parameters[],const size_t parameterCount)1721 bool NapiCallManager::MatchOneNumberParameter(napi_env env, const napi_value parameters[], const size_t parameterCount)
1722 {
1723     TELEPHONY_LOGI("Telephony_CallManager MatchOneNumberParameter %{public}zu", parameterCount);
1724     switch (parameterCount) {
1725         case ONLY_ONE_VALUE:
1726             return NapiUtil::MatchParameters(env, parameters, { napi_number });
1727         case TWO_VALUE_LIMIT:
1728             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_function });
1729         default:
1730             return false;
1731     }
1732 }
1733 
MatchTwoNumberParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)1734 bool NapiCallManager::MatchTwoNumberParameters(napi_env env, const napi_value parameters[], const size_t parameterCount)
1735 {
1736     TELEPHONY_LOGI("Telephony_CallManager MatchTwoNumberParameters %{public}zu", parameterCount);
1737     switch (parameterCount) {
1738         case TWO_VALUE_LIMIT:
1739             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_number });
1740         case THREE_VALUE_MAXIMUM_LIMIT:
1741             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_number, napi_function });
1742         default:
1743             return false;
1744     }
1745 }
1746 
MatchTwoStringParameter(napi_env env,const napi_value parameters[],const size_t parameterCount)1747 bool NapiCallManager::MatchTwoStringParameter(napi_env env, const napi_value parameters[], const size_t parameterCount)
1748 {
1749     TELEPHONY_LOGI("Telephony_CallManager MatchTwoStringParameter %{public}zu", parameterCount);
1750     switch (parameterCount) {
1751         case TWO_VALUE_LIMIT:
1752             return NapiUtil::MatchParameters(env, parameters, { napi_string, napi_string });
1753         case THREE_VALUE_MAXIMUM_LIMIT:
1754             return NapiUtil::MatchParameters(env, parameters, { napi_string, napi_string, napi_function });
1755         default:
1756             return false;
1757     }
1758 }
1759 
MatchNumberAndBoolParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)1760 bool NapiCallManager::MatchNumberAndBoolParameters(
1761     napi_env env, const napi_value parameters[], const size_t parameterCount)
1762 {
1763     TELEPHONY_LOGI("Telephony_CallManager MatchNumberAndBoolParameters %{public}zu", parameterCount);
1764     switch (parameterCount) {
1765         case TWO_VALUE_LIMIT:
1766             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_boolean });
1767         case THREE_VALUE_MAXIMUM_LIMIT:
1768             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_boolean, napi_function });
1769         default:
1770             return false;
1771     }
1772 }
1773 
MatchNumberAndStringParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)1774 bool NapiCallManager::MatchNumberAndStringParameters(
1775     napi_env env, const napi_value parameters[], const size_t parameterCount)
1776 {
1777     TELEPHONY_LOGI("Telephony_CallManager MatchNumberAndBoolParameters %{public}zu", parameterCount);
1778     switch (parameterCount) {
1779         case TWO_VALUE_LIMIT:
1780             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_string });
1781         case THREE_VALUE_MAXIMUM_LIMIT:
1782             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_string, napi_function });
1783         default:
1784             return false;
1785     }
1786 }
1787 
MatchAudioDeviceParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)1788 bool NapiCallManager::MatchAudioDeviceParameters(
1789     napi_env env, const napi_value parameters[], const size_t parameterCount)
1790 {
1791     TELEPHONY_LOGI("Telephony_CallManager MatchNumberAndBoolParameters %{public}zu", parameterCount);
1792     switch (parameterCount) {
1793         case ONLY_ONE_VALUE:
1794             return NapiUtil::MatchParameters(env, parameters, { napi_object });
1795         case TWO_VALUE_LIMIT:
1796             return NapiUtil::MatchParameters(env, parameters, { napi_object, napi_function });
1797         default:
1798             return false;
1799     }
1800 }
1801 
MatchRejectCallParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)1802 bool NapiCallManager::MatchRejectCallParameters(
1803     napi_env env, const napi_value parameters[], const size_t parameterCount)
1804 {
1805     TELEPHONY_LOGI("Telephony_CallManager MatchNumberAndBoolParameters %{public}zu", parameterCount);
1806     switch (parameterCount) {
1807         case ZERO_VALUE:
1808             return true;
1809         case ONLY_ONE_VALUE:
1810             return NapiUtil::MatchParameters(env, parameters, { napi_number }) ||
1811                    NapiUtil::MatchParameters(env, parameters, { napi_object }) ||
1812                    NapiUtil::MatchParameters(env, parameters, { napi_function }) ||
1813                    NapiUtil::MatchParameters(env, parameters, { napi_null }) ||
1814                    NapiUtil::MatchParameters(env, parameters, { napi_undefined });
1815         case TWO_VALUE_LIMIT:
1816             return NapiUtil::MatchParameters(env, parameters, { napi_object, napi_function }) ||
1817                    NapiUtil::MatchParameters(env, parameters, { napi_number, napi_function }) ||
1818                    NapiUtil::MatchParameters(env, parameters, { napi_number, napi_object }) ||
1819                    NapiUtil::MatchParameters(env, parameters, { napi_number, napi_null }) ||
1820                    NapiUtil::MatchParameters(env, parameters, { napi_number, napi_undefined }) ||
1821                    NapiUtil::MatchParameters(env, parameters, { napi_null, napi_object }) ||
1822                    NapiUtil::MatchParameters(env, parameters, { napi_undefined, napi_object }) ||
1823                    NapiUtil::MatchParameters(env, parameters, { napi_undefined, napi_undefined }) ||
1824                    NapiUtil::MatchParameters(env, parameters, { napi_null, napi_null });
1825         case THREE_VALUE_MAXIMUM_LIMIT:
1826             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_object, napi_function });
1827         default:
1828             return false;
1829     }
1830 }
1831 
MatchRejectCallFirstIllegalParameters(napi_env env,const napi_value parameters[])1832 bool NapiCallManager::MatchRejectCallFirstIllegalParameters(napi_env env, const napi_value parameters[])
1833 {
1834     return NapiUtil::MatchParameters(env, parameters, { napi_null, napi_object }) ||
1835            NapiUtil::MatchParameters(env, parameters, { napi_undefined, napi_object });
1836 }
1837 
MatchRejectCallSecondIllegalParameters(napi_env env,const napi_value parameters[])1838 bool NapiCallManager::MatchRejectCallSecondIllegalParameters(napi_env env, const napi_value parameters[])
1839 {
1840     return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_null }) ||
1841            NapiUtil::MatchParameters(env, parameters, { napi_number, napi_undefined });
1842 }
1843 
MatchRejectCallTwoIllegalParameters(napi_env env,const napi_value parameters[])1844 bool NapiCallManager::MatchRejectCallTwoIllegalParameters(napi_env env, const napi_value parameters[])
1845 {
1846     return NapiUtil::MatchParameters(env, parameters, { napi_undefined, napi_undefined }) ||
1847            NapiUtil::MatchParameters(env, parameters, { napi_null, napi_null });
1848 }
1849 
MatchNumberAndObjectParameters(napi_env env,const napi_value parameters[],const size_t parameterCount)1850 bool NapiCallManager::MatchNumberAndObjectParameters(
1851     napi_env env, const napi_value parameters[], const size_t parameterCount)
1852 {
1853     TELEPHONY_LOGI("Telephony_CallManager MatchNumberAndObjectParameters %{public}zu", parameterCount);
1854     switch (parameterCount) {
1855         case TWO_VALUE_LIMIT:
1856             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_object });
1857         case THREE_VALUE_MAXIMUM_LIMIT:
1858             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_object, napi_function });
1859         default:
1860             return false;
1861     }
1862 }
1863 
MatchCallRestrictionPasswordParameter(napi_env env,const napi_value parameters[],const size_t parameterCount)1864 bool NapiCallManager::MatchCallRestrictionPasswordParameter(
1865     napi_env env, const napi_value parameters[], const size_t parameterCount)
1866 {
1867     TELEPHONY_LOGI("Match parmameter count %{public}zu", parameterCount);
1868     switch (parameterCount) {
1869         case THREE_VALUE_MAXIMUM_LIMIT:
1870             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_string, napi_string });
1871         case FOUR_VALUE_MAXIMUM_LIMIT:
1872             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_string, napi_string, napi_function });
1873         default:
1874             return false;
1875     }
1876 }
1877 
GetCallWaiting(napi_env env,napi_callback_info info)1878 napi_value NapiCallManager::GetCallWaiting(napi_env env, napi_callback_info info)
1879 {
1880     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
1881     if (!MatchOneNumberParameter(env, argv, argc)) {
1882         TELEPHONY_LOGE("NapiCallManager::GetCallWaiting MatchOneNumberParameter failed.");
1883         NapiUtil::ThrowParameterError(env);
1884         return nullptr;
1885     }
1886     auto asyncContext = std::make_unique<SupplementAsyncContext>();
1887     if (asyncContext == nullptr) {
1888         TELEPHONY_LOGE("NapiCallManager::GetCallWaiting asyncContext is nullptr.");
1889         NapiUtil::ThrowParameterError(env);
1890         return nullptr;
1891     }
1892     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
1893     if (argc == TWO_VALUE_LIMIT) {
1894         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1895     }
1896     asyncContext->env = env;
1897     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
1898     return HandleAsyncWork(env, asyncContext.release(), "GetCallWaiting", NativeGetCallWaiting, NativeCallBack);
1899 }
1900 
SetCallWaiting(napi_env env,napi_callback_info info)1901 napi_value NapiCallManager::SetCallWaiting(napi_env env, napi_callback_info info)
1902 {
1903     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
1904     if (!MatchNumberAndBoolParameters(env, argv, argc)) {
1905         TELEPHONY_LOGE("NapiCallManager::SetCallWaiting MatchNumberAndBoolParameters failed.");
1906         NapiUtil::ThrowParameterError(env);
1907         return nullptr;
1908     }
1909     auto asyncContext = std::make_unique<SupplementAsyncContext>();
1910     if (asyncContext == nullptr) {
1911         TELEPHONY_LOGE("NapiCallManager::SetCallWaiting asyncContext is nullptr.");
1912         NapiUtil::ThrowParameterError(env);
1913         return nullptr;
1914     }
1915     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
1916     napi_get_value_bool(env, argv[ARRAY_INDEX_SECOND], &asyncContext->flag);
1917     if (argc == VALUE_MAXIMUM_LIMIT) {
1918         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1919     }
1920     asyncContext->env = env;
1921     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
1922     return HandleAsyncWork(env, asyncContext.release(), "SetCallWaiting", NativeSetCallWaiting, NativeCallBack);
1923 }
1924 
GetCallRestriction(napi_env env,napi_callback_info info)1925 napi_value NapiCallManager::GetCallRestriction(napi_env env, napi_callback_info info)
1926 {
1927     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
1928     if (!MatchTwoNumberParameters(env, argv, argc)) {
1929         TELEPHONY_LOGE("NapiCallManager::GetCallRestriction MatchTwoNumberParameters failed.");
1930         NapiUtil::ThrowParameterError(env);
1931         return nullptr;
1932     }
1933     auto restrictionAsyncContext = std::make_unique<SupplementAsyncContext>();
1934     if (restrictionAsyncContext == nullptr) {
1935         TELEPHONY_LOGE("NapiCallManager::GetCallRestriction asyncContext is nullptr.");
1936         NapiUtil::ThrowParameterError(env);
1937         return nullptr;
1938     }
1939     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &restrictionAsyncContext->slotId);
1940     napi_get_value_int32(env, argv[ARRAY_INDEX_SECOND], &restrictionAsyncContext->type);
1941     if (argc == VALUE_MAXIMUM_LIMIT) {
1942         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(restrictionAsyncContext->callbackRef));
1943     }
1944     restrictionAsyncContext->env = env;
1945     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(restrictionAsyncContext->thisVar));
1946     return HandleAsyncWork(
1947         env, restrictionAsyncContext.release(), "GetCallRestriction", NativeGetCallRestriction, NativeCallBack);
1948 }
1949 
SetCallRestriction(napi_env env,napi_callback_info info)1950 napi_value NapiCallManager::SetCallRestriction(napi_env env, napi_callback_info info)
1951 {
1952     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
1953     if (!MatchNumberAndObjectParameters(env, argv, argc)) {
1954         TELEPHONY_LOGE("NapiCallManager::SetCallRestriction MatchNumberAndObjectParameters failed.");
1955         NapiUtil::ThrowParameterError(env);
1956         return nullptr;
1957     }
1958     auto asyncContext = std::make_unique<CallRestrictionAsyncContext>();
1959     if (asyncContext == nullptr) {
1960         TELEPHONY_LOGE("NapiCallManager::SetCallRestriction asyncContext is nullptr.");
1961         NapiUtil::ThrowParameterError(env);
1962         return nullptr;
1963     }
1964     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
1965     asyncContext->errorCode = GetRestrictionInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
1966     if (asyncContext->errorCode == ERROR_PARAMETER_TYPE_INVALID) {
1967         NapiUtil::ThrowParameterError(env);
1968         return nullptr;
1969     }
1970     if (argc == VALUE_MAXIMUM_LIMIT) {
1971         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
1972     }
1973     asyncContext->env = env;
1974     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
1975     return HandleAsyncWork(env, asyncContext.release(), "SetCallRestriction", NativeSetCallRestriction, NativeCallBack);
1976 }
1977 
SetCallRestrictionPassword(napi_env env,napi_callback_info info)1978 napi_value NapiCallManager::SetCallRestrictionPassword(napi_env env, napi_callback_info info)
1979 {
1980     GET_PARAMS(env, info, FOUR_VALUE_MAXIMUM_LIMIT);
1981     if (!MatchCallRestrictionPasswordParameter(env, argv, argc)) {
1982         TELEPHONY_LOGE("MatchCallRestrictionPasswordParameter failed.");
1983         NapiUtil::ThrowParameterError(env);
1984         return nullptr;
1985     }
1986     auto asyncContext = std::make_unique<CallBarringPasswordAsyncContext>();
1987     if (asyncContext == nullptr) {
1988         TELEPHONY_LOGE("CallBarringPasswordAsyncContext is nullptr.");
1989         NapiUtil::ThrowParameterError(env);
1990         return nullptr;
1991     }
1992     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
1993     size_t strLen = 0;
1994     napi_get_value_string_utf8(
1995         env, argv[ARRAY_INDEX_SECOND], asyncContext->oldPassword, PHONE_NUMBER_MAXIMUM_LIMIT, &strLen);
1996     napi_get_value_string_utf8(
1997         env, argv[ARRAY_INDEX_THIRD], asyncContext->newPassword, PHONE_NUMBER_MAXIMUM_LIMIT, &strLen);
1998     if (argc == FOUR_VALUE_MAXIMUM_LIMIT) {
1999         napi_create_reference(env, argv[ARRAY_INDEX_FOURTH], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2000     }
2001     asyncContext->env = env;
2002     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
2003     return HandleAsyncWork(
2004         env, asyncContext.release(), "SetCallRestrictionPassword", NativeSetCallRestrictionPassword, NativeCallBack);
2005 }
2006 
GetCallTransferInfo(napi_env env,napi_callback_info info)2007 napi_value NapiCallManager::GetCallTransferInfo(napi_env env, napi_callback_info info)
2008 {
2009     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2010     if (!MatchTwoNumberParameters(env, argv, argc)) {
2011         TELEPHONY_LOGE("NapiCallManager::GetCallTransferInfo MatchTwoNumberParameters failed.");
2012         NapiUtil::ThrowParameterError(env);
2013         return nullptr;
2014     }
2015     auto asyncContext = std::make_unique<SupplementAsyncContext>();
2016     if (asyncContext == nullptr) {
2017         TELEPHONY_LOGE("NapiCallManager::GetCallTransferInfo asyncContext is nullptr.");
2018         NapiUtil::ThrowParameterError(env);
2019         return nullptr;
2020     }
2021     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
2022     napi_get_value_int32(env, argv[ARRAY_INDEX_SECOND], &asyncContext->type);
2023     if (argc == VALUE_MAXIMUM_LIMIT) {
2024         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2025     }
2026     asyncContext->env = env;
2027     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
2028     return HandleAsyncWork(env, asyncContext.release(), "GetCallTransferInfo", NativeGetTransferNumber, NativeCallBack);
2029 }
2030 
SetCallTransferInfo(napi_env env,napi_callback_info info)2031 napi_value NapiCallManager::SetCallTransferInfo(napi_env env, napi_callback_info info)
2032 {
2033     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2034     if (!MatchNumberAndObjectParameters(env, argv, argc)) {
2035         TELEPHONY_LOGE("NapiCallManager::SetCallTransferInfo MatchNumberAndObjectParameters failed.");
2036         NapiUtil::ThrowParameterError(env);
2037         return nullptr;
2038     }
2039     auto asyncContext = std::make_unique<CallTransferAsyncContext>();
2040     if (asyncContext == nullptr) {
2041         TELEPHONY_LOGE("NapiCallManager::SetCallTransferInfo asyncContext is nullptr.");
2042         NapiUtil::ThrowParameterError(env);
2043         return nullptr;
2044     }
2045     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
2046     asyncContext->errorCode = GetTransferInfo(env, argv[ARRAY_INDEX_SECOND], *asyncContext);
2047     if (asyncContext->errorCode == ERROR_PARAMETER_TYPE_INVALID) {
2048         NapiUtil::ThrowParameterError(env);
2049         return nullptr;
2050     }
2051     if (argc == VALUE_MAXIMUM_LIMIT) {
2052         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2053     }
2054     asyncContext->env = env;
2055     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
2056     return HandleAsyncWork(env, asyncContext.release(), "SetCallTransferInfo", NativeSetTransferNumber, NativeCallBack);
2057 }
2058 
IsValidSlotId(int32_t slotId)2059 static inline bool IsValidSlotId(int32_t slotId)
2060 {
2061     return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
2062 }
2063 
CanSetCallTransferTime(napi_env env,napi_callback_info info)2064 napi_value NapiCallManager::CanSetCallTransferTime(napi_env env, napi_callback_info info)
2065 {
2066     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2067     if (!MatchOneNumberParameter(env, argv, argc)) {
2068         TELEPHONY_LOGE("MatchOneNumberParameter failed.");
2069         NapiUtil::ThrowParameterError(env);
2070         return nullptr;
2071     }
2072     auto asyncContext = std::make_unique<BoolResultAsyncContext>();
2073     asyncContext->eventId = CALL_MANAGER_CAN_SET_CALL_TRANSFER_TIME;
2074     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
2075     if (argc == TWO_VALUE_LIMIT) {
2076         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2077     }
2078     return HandleAsyncWork(env, asyncContext.release(), "CanSetCallTransferTime", NativeCanSetCallTransferTime,
2079         NativeBoolCallBackWithErrorCode);
2080 }
2081 
EnableImsSwitch(napi_env env,napi_callback_info info)2082 napi_value NapiCallManager::EnableImsSwitch(napi_env env, napi_callback_info info)
2083 {
2084     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2085     if (!MatchOneNumberParameter(env, argv, argc)) {
2086         TELEPHONY_LOGE("NapiCallManager::EnableImsSwitch MatchOneNumberParameter failed.");
2087         NapiUtil::ThrowParameterError(env);
2088         return nullptr;
2089     }
2090     auto asyncContext = std::make_unique<ImsSwitchAsyncContext>();
2091     if (asyncContext == nullptr) {
2092         TELEPHONY_LOGE("NapiCallManager::EnableImsSwitch asyncContext is nullptr.");
2093         NapiUtil::ThrowParameterError(env);
2094         return nullptr;
2095     }
2096     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
2097     if (argc == TWO_VALUE_LIMIT) {
2098         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2099     }
2100 
2101     return HandleAsyncWork(
2102         env, asyncContext.release(), "EnableImsSwitch", NativeEnableImsSwitch, NativeVoidCallBackWithErrorCode);
2103 }
2104 
DisableImsSwitch(napi_env env,napi_callback_info info)2105 napi_value NapiCallManager::DisableImsSwitch(napi_env env, napi_callback_info info)
2106 {
2107     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2108     if (!MatchOneNumberParameter(env, argv, argc)) {
2109         TELEPHONY_LOGE("NapiCallManager::DisableImsSwitch MatchOneNumberParameter failed.");
2110         NapiUtil::ThrowParameterError(env);
2111         return nullptr;
2112     }
2113     auto asyncContext = std::make_unique<ImsSwitchAsyncContext>();
2114     if (asyncContext == nullptr) {
2115         TELEPHONY_LOGE("NapiCallManager::DisableImsSwitch asyncContext is nullptr.");
2116         NapiUtil::ThrowParameterError(env);
2117         return nullptr;
2118     }
2119     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
2120     if (argc == TWO_VALUE_LIMIT) {
2121         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2122     }
2123 
2124     return HandleAsyncWork(
2125         env, asyncContext.release(), "DisableImsSwitch", NativeDisableImsSwitch, NativeVoidCallBackWithErrorCode);
2126 }
2127 
IsImsSwitchEnabled(napi_env env,napi_callback_info info)2128 napi_value NapiCallManager::IsImsSwitchEnabled(napi_env env, napi_callback_info info)
2129 {
2130     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2131     if (!MatchOneNumberParameter(env, argv, argc)) {
2132         TELEPHONY_LOGE("NapiCallManager::IsImsSwitchEnabled MatchOneNumberParameter failed.");
2133         NapiUtil::ThrowParameterError(env);
2134         return nullptr;
2135     }
2136     auto asyncContext = std::make_unique<ImsSwitchAsyncContext>();
2137     if (asyncContext == nullptr) {
2138         TELEPHONY_LOGE("NapiCallManager::IsImsSwitchEnabled asyncContext is nullptr.");
2139         NapiUtil::ThrowParameterError(env);
2140         return nullptr;
2141     }
2142     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
2143     if (argc == TWO_VALUE_LIMIT) {
2144         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2145     }
2146     return HandleAsyncWork(
2147         env, asyncContext.release(), "IsImsSwitchEnabled", NativeIsImsSwitchEnabled, NativeIsImsSwitchEnabledCallBack);
2148 }
2149 
SetVoNRState(napi_env env,napi_callback_info info)2150 napi_value NapiCallManager::SetVoNRState(napi_env env, napi_callback_info info)
2151 {
2152     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2153     if (!MatchTwoNumberParameters(env, argv, argc)) {
2154         TELEPHONY_LOGE("NapiCallManager::SetVoNRState MatchTwoNumberParameters failed.");
2155         NapiUtil::ThrowParameterError(env);
2156         return nullptr;
2157     }
2158     auto asyncContext = std::make_unique<VoNRSwitchAsyncContext>();
2159     if (asyncContext == nullptr) {
2160         TELEPHONY_LOGE("NapiCallManager::SetVoNRState asyncContext is nullptr.");
2161         NapiUtil::ThrowParameterError(env);
2162         return nullptr;
2163     }
2164     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
2165     napi_get_value_int32(env, argv[ARRAY_INDEX_SECOND], &asyncContext->state);
2166     if (argc == VALUE_MAXIMUM_LIMIT) {
2167         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2168     }
2169     return HandleAsyncWork(
2170         env, asyncContext.release(), "SetVoNRState", NativeSetVoNRState, NativeVoidCallBackWithErrorCode);
2171 }
2172 
GetVoNRState(napi_env env,napi_callback_info info)2173 napi_value NapiCallManager::GetVoNRState(napi_env env, napi_callback_info info)
2174 {
2175     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2176     if (!MatchOneNumberParameter(env, argv, argc)) {
2177         TELEPHONY_LOGE("NapiCallManager::GetVoNRState MatchOneNumberParameter failed.");
2178         NapiUtil::ThrowParameterError(env);
2179         return nullptr;
2180     }
2181     auto asyncContext = std::make_unique<VoNRSwitchAsyncContext>();
2182     if (asyncContext == nullptr) {
2183         TELEPHONY_LOGE("NapiCallManager::GetVoNRState asyncContext is nullptr.");
2184         NapiUtil::ThrowParameterError(env);
2185         return nullptr;
2186     }
2187     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
2188     if (argc == TWO_VALUE_LIMIT) {
2189         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2190     }
2191     return HandleAsyncWork(
2192         env, asyncContext.release(), "GetVoNRState", NativeGetVoNRState, NativeGetVoNRStateCallBack);
2193 }
2194 
StartDTMF(napi_env env,napi_callback_info info)2195 napi_value NapiCallManager::StartDTMF(napi_env env, napi_callback_info info)
2196 {
2197     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2198     if (!MatchNumberAndStringParameters(env, argv, argc)) {
2199         TELEPHONY_LOGE("NapiCallManager::StartDTMF MatchNumberAndStringParameters failed.");
2200         NapiUtil::ThrowParameterError(env);
2201         return nullptr;
2202     }
2203     auto asyncContext = std::make_unique<SupplementAsyncContext>();
2204     if (asyncContext == nullptr) {
2205         TELEPHONY_LOGE("NapiCallManager::StartDTMF asyncContext is nullptr.");
2206         NapiUtil::ThrowParameterError(env);
2207         return nullptr;
2208     }
2209     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2210     napi_get_value_string_utf8(
2211         env, argv[ARRAY_INDEX_SECOND], asyncContext->number, PHONE_NUMBER_MAXIMUM_LIMIT, &(asyncContext->numberLen));
2212     if (argc == VALUE_MAXIMUM_LIMIT) {
2213         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2214     }
2215     return HandleAsyncWork(env, asyncContext.release(), "StartDTMF", NativeStartDTMF, NativeVoidCallBackWithErrorCode);
2216 }
2217 
StopDTMF(napi_env env,napi_callback_info info)2218 napi_value NapiCallManager::StopDTMF(napi_env env, napi_callback_info info)
2219 {
2220     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2221     if (!MatchOneNumberParameter(env, argv, argc)) {
2222         TELEPHONY_LOGE("NapiCallManager::StopDTMF MatchOneNumberParameter failed.");
2223         NapiUtil::ThrowParameterError(env);
2224         return nullptr;
2225     }
2226     auto asyncContext = std::make_unique<AsyncContext>();
2227     if (asyncContext == nullptr) {
2228         TELEPHONY_LOGE("NapiCallManager::StopDTMF asyncContext is nullptr.");
2229         NapiUtil::ThrowParameterError(env);
2230         return nullptr;
2231     }
2232     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2233     if (argc == TWO_VALUE_LIMIT) {
2234         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2235     }
2236     return HandleAsyncWork(env, asyncContext.release(), "StopDTMF", NativeStopDTMF, NativeVoidCallBackWithErrorCode);
2237 }
2238 
PostDialProceed(napi_env env,napi_callback_info info)2239 napi_value NapiCallManager::PostDialProceed(napi_env env, napi_callback_info info)
2240 {
2241     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2242     if (!MatchNumberAndBoolParameters(env, argv, argc)) {
2243         TELEPHONY_LOGE("NapiCallManager::PostDialProceed MatchNumberAndBoolParameters failed.");
2244         NapiUtil::ThrowParameterError(env);
2245         return nullptr;
2246     }
2247     auto asyncContext = std::make_unique<PostDialAsyncContext>();
2248     if (asyncContext == nullptr) {
2249         TELEPHONY_LOGE("NapiCallManager::PostDialProceed asyncContext is nullptr.");
2250         NapiUtil::ThrowParameterError(env);
2251         return nullptr;
2252     }
2253     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2254     napi_get_value_bool(env, argv[ARRAY_INDEX_SECOND], &asyncContext->proceed);
2255     if (argc == VALUE_MAXIMUM_LIMIT) {
2256         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2257     }
2258     return HandleAsyncWork(env, asyncContext.release(), "PostDialProceed", NativePostDialProceed,
2259         NativeVoidCallBackWithErrorCode);
2260 }
2261 
GetCallState(napi_env env,napi_callback_info info)2262 napi_value NapiCallManager::GetCallState(napi_env env, napi_callback_info info)
2263 {
2264     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2265     NAPI_ASSERT(env, argc < TWO_VALUE_LIMIT, "parameter error!");
2266     auto asyncContext = std::make_unique<AsyncContext>();
2267     if (asyncContext == nullptr) {
2268         std::string errorCode = std::to_string(napi_generic_failure);
2269         std::string errorMessage = "GetCallState error at asyncContext is nullptr";
2270         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2271         return nullptr;
2272     }
2273     if (argc == ONLY_ONE_VALUE) {
2274         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2275     }
2276     return HandleAsyncWork(env, asyncContext.release(), "GetCallState", NativeGetCallState, NativePropertyCallBack);
2277 }
2278 
GetCallStateSync(napi_env env,napi_callback_info info)2279 napi_value NapiCallManager::GetCallStateSync(napi_env env, napi_callback_info info)
2280 {
2281     size_t parameterCount = 0;
2282     napi_value parameters[] = { nullptr };
2283     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
2284     int32_t callState = static_cast<int32_t>(CallStateToApp::CALL_STATE_UNKNOWN);
2285     if (parameterCount == 0) {
2286         callState = DelayedSingleton<CallManagerClient>::GetInstance()->GetCallState();
2287     }
2288     napi_value value = nullptr;
2289     NAPI_CALL(env, napi_create_int32(env, callState, &value));
2290     return value;
2291 }
2292 
IsRinging(napi_env env,napi_callback_info info)2293 napi_value NapiCallManager::IsRinging(napi_env env, napi_callback_info info)
2294 {
2295     GET_PARAMS(env, info, ONLY_ONE_VALUE);
2296     if (!MatchEmptyParameter(env, argv, argc)) {
2297         TELEPHONY_LOGE("NapiCallManager::IsRinging MatchEmptyParameter failed.");
2298         NapiUtil::ThrowParameterError(env);
2299         return nullptr;
2300     }
2301     auto asyncContext = std::make_unique<BoolResultAsyncContext>();
2302     if (asyncContext == nullptr) {
2303         TELEPHONY_LOGE("NapiCallManager::IsRinging asyncContext is nullptr.");
2304         NapiUtil::ThrowParameterError(env);
2305         return nullptr;
2306     }
2307     if (argc == ONLY_ONE_VALUE) {
2308         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2309     }
2310     return HandleAsyncWork(env, asyncContext.release(), "IsRinging", NativeIsRinging, NativeBoolCallBackWithErrorCode);
2311 }
2312 
HasCall(napi_env env,napi_callback_info info)2313 napi_value NapiCallManager::HasCall(napi_env env, napi_callback_info info)
2314 {
2315     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2316     NAPI_ASSERT(env, argc < TWO_VALUE_LIMIT, "parameter error!");
2317     auto asyncContext = std::make_unique<AsyncContext>();
2318     if (asyncContext == nullptr) {
2319         std::string errorCode = std::to_string(napi_generic_failure);
2320         std::string errorMessage = "HasCall error at asyncContext is nullptr";
2321         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2322         return nullptr;
2323     }
2324     if (argc == ONLY_ONE_VALUE) {
2325         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2326     }
2327     return HandleAsyncWork(env, asyncContext.release(), "HasCall", NativeHasCall, NativeBoolCallBack);
2328 }
2329 
HasCallSync(napi_env env,napi_callback_info info)2330 napi_value NapiCallManager::HasCallSync(napi_env env, napi_callback_info info)
2331 {
2332     size_t parameterCount = 0;
2333     napi_value parameters[] = { nullptr };
2334     napi_get_cb_info(env, info, &parameterCount, parameters, nullptr, nullptr);
2335     bool hasCall = false;
2336     if (parameterCount == 0) {
2337         hasCall = DelayedSingleton<CallManagerClient>::GetInstance()->HasCall();
2338     }
2339     napi_value value = nullptr;
2340     NAPI_CALL(env, napi_get_boolean(env, hasCall, &value));
2341     return value;
2342 }
2343 
IsNewCallAllowed(napi_env env,napi_callback_info info)2344 napi_value NapiCallManager::IsNewCallAllowed(napi_env env, napi_callback_info info)
2345 {
2346     GET_PARAMS(env, info, ONLY_ONE_VALUE);
2347     if (!MatchEmptyParameter(env, argv, argc)) {
2348         TELEPHONY_LOGE("NapiCallManager::IsNewCallAllowed MatchEmptyParameter failed.");
2349         NapiUtil::ThrowParameterError(env);
2350         return nullptr;
2351     }
2352     auto asyncContext = std::make_unique<BoolResultAsyncContext>();
2353     if (asyncContext == nullptr) {
2354         TELEPHONY_LOGE("NapiCallManager::IsNewCallAllowed asyncContext is nullptr.");
2355         NapiUtil::ThrowParameterError(env);
2356         return nullptr;
2357     }
2358     if (argc == ONLY_ONE_VALUE) {
2359         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2360     }
2361     return HandleAsyncWork(
2362         env, asyncContext.release(), "IsNewCallAllowed", NativeIsNewCallAllowed, NativeBoolCallBackWithErrorCode);
2363 }
2364 
IsInEmergencyCall(napi_env env,napi_callback_info info)2365 napi_value NapiCallManager::IsInEmergencyCall(napi_env env, napi_callback_info info)
2366 {
2367     GET_PARAMS(env, info, ONLY_ONE_VALUE);
2368     if (!MatchEmptyParameter(env, argv, argc)) {
2369         TELEPHONY_LOGE("NapiCallManager::IsInEmergencyCall MatchEmptyParameter failed.");
2370         NapiUtil::ThrowParameterError(env);
2371         return nullptr;
2372     }
2373     auto asyncContext = std::make_unique<BoolResultAsyncContext>();
2374     if (asyncContext == nullptr) {
2375         TELEPHONY_LOGE("NapiCallManager::IsInEmergencyCall asyncContext is nullptr.");
2376         NapiUtil::ThrowParameterError(env);
2377         return nullptr;
2378     }
2379     if (argc == ONLY_ONE_VALUE) {
2380         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2381     }
2382     return HandleAsyncWork(
2383         env, asyncContext.release(), "IsInEmergencyCall", NativeIsInEmergencyCall, NativeBoolCallBackWithErrorCode);
2384 }
2385 
IsEmergencyPhoneNumber(napi_env env,napi_callback_info info)2386 napi_value NapiCallManager::IsEmergencyPhoneNumber(napi_env env, napi_callback_info info)
2387 {
2388     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2389     if (!MatchStringAndVariableObjectParameters(env, argv, argc)) {
2390         TELEPHONY_LOGE("MatchStringAndVariableObjectParameters failed.");
2391         NapiUtil::ThrowParameterError(env);
2392         return nullptr;
2393     }
2394     auto emergencyAsyncContext = std::make_unique<UtilsAsyncContext>();
2395     if (emergencyAsyncContext == nullptr) {
2396         TELEPHONY_LOGE("emergencyAsyncContext is nullptr.");
2397         NapiUtil::ThrowParameterError(env);
2398         return nullptr;
2399     }
2400     napi_get_value_string_utf8(env, argv[ARRAY_INDEX_FIRST], emergencyAsyncContext->number, PHONE_NUMBER_MAXIMUM_LIMIT,
2401         &(emergencyAsyncContext->numberLen));
2402     emergencyAsyncContext->slotId = 0;
2403     if (argc == TWO_VALUE_LIMIT) {
2404         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function)) {
2405             napi_create_reference(
2406                 env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(emergencyAsyncContext->callbackRef));
2407         } else {
2408             emergencyAsyncContext->slotId =
2409                 NapiCallManagerUtils::GetIntProperty(env, argv[ARRAY_INDEX_SECOND], "slotId");
2410         }
2411     }
2412     if (argc == VALUE_MAXIMUM_LIMIT) {
2413         emergencyAsyncContext->slotId = NapiCallManagerUtils::GetIntProperty(env, argv[ARRAY_INDEX_SECOND], "slotId");
2414         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(emergencyAsyncContext->callbackRef));
2415     }
2416     return HandleAsyncWork(env, emergencyAsyncContext.release(), "IsEmergencyPhoneNumber", NativeIsEmergencyPhoneNumber,
2417         NativeIsEmergencyPhoneNumberCallBack);
2418 }
2419 
FormatPhoneNumber(napi_env env,napi_callback_info info)2420 napi_value NapiCallManager::FormatPhoneNumber(napi_env env, napi_callback_info info)
2421 {
2422     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2423     if (!MatchStringAndVariableObjectParameters(env, argv, argc)) {
2424         TELEPHONY_LOGE("MatchStringAndVariableObjectParameters failed.");
2425         NapiUtil::ThrowParameterError(env);
2426         return nullptr;
2427     }
2428     auto asyncContext = std::make_unique<UtilsAsyncContext>();
2429     if (asyncContext == nullptr) {
2430         TELEPHONY_LOGE("asyncContext is nullptr.");
2431         NapiUtil::ThrowParameterError(env);
2432         return nullptr;
2433     }
2434     asyncContext->code = "cn";
2435     napi_get_value_string_utf8(
2436         env, argv[ARRAY_INDEX_FIRST], asyncContext->number, PHONE_NUMBER_MAXIMUM_LIMIT, &(asyncContext->numberLen));
2437     if (argc == TWO_VALUE_LIMIT) {
2438         if (NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function)) {
2439             napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2440         } else {
2441             asyncContext->code = NapiCallManagerUtils::GetStringProperty(env, argv[ARRAY_INDEX_SECOND], "countryCode");
2442         }
2443     }
2444     if (argc == VALUE_MAXIMUM_LIMIT) {
2445         asyncContext->code = NapiCallManagerUtils::GetStringProperty(env, argv[ARRAY_INDEX_SECOND], "countryCode");
2446         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2447     }
2448     if ((argc >= TWO_VALUE_LIMIT) && (asyncContext->code == "")) {
2449         TELEPHONY_LOGI("country code is undefined, using default country code: 'cn'.");
2450         asyncContext->code = "cn";
2451     }
2452     return HandleAsyncWork(
2453         env, asyncContext.release(), "FormatPhoneNumber", NativeFormatPhoneNumber, NativeFormatNumberCallBack);
2454 }
2455 
FormatPhoneNumberToE164(napi_env env,napi_callback_info info)2456 napi_value NapiCallManager::FormatPhoneNumberToE164(napi_env env, napi_callback_info info)
2457 {
2458     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2459     if (!MatchTwoStringParameter(env, argv, argc)) {
2460         TELEPHONY_LOGE("NapiCallManager::FormatPhoneNumberToE164 MatchTwoStringParameter failed.");
2461         NapiUtil::ThrowParameterError(env);
2462         return nullptr;
2463     }
2464     auto asyncContext = std::make_unique<UtilsAsyncContext>();
2465     if (asyncContext == nullptr) {
2466         TELEPHONY_LOGE("NapiCallManager::FormatPhoneNumberToE164 asyncContext is nullptr.");
2467         NapiUtil::ThrowParameterError(env);
2468         return nullptr;
2469     }
2470     napi_get_value_string_utf8(
2471         env, argv[ARRAY_INDEX_FIRST], asyncContext->number, PHONE_NUMBER_MAXIMUM_LIMIT, &(asyncContext->numberLen));
2472     char tmpStr[kMaxNumberLen + 1] = {0};
2473     size_t strLen = 0;
2474     napi_get_value_string_utf8(env, argv[ARRAY_INDEX_SECOND], tmpStr, PHONE_NUMBER_MAXIMUM_LIMIT, &strLen);
2475     std::string tmpCode(tmpStr, strLen);
2476     asyncContext->code = tmpCode;
2477     if (argc == VALUE_MAXIMUM_LIMIT) {
2478         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2479     }
2480     return HandleAsyncWork(env, asyncContext.release(), "FormatPhoneNumberToE164", NativeFormatPhoneNumberToE164,
2481         NativeFormatNumberCallBack);
2482 }
2483 
ObserverOn(napi_env env,napi_callback_info info)2484 napi_value NapiCallManager::ObserverOn(napi_env env, napi_callback_info info)
2485 {
2486     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2487     if ((argc != TWO_VALUE_LIMIT) ||
2488         (!NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_string)) ||
2489         (!NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_function))) {
2490         NapiUtil::ThrowParameterError(env);
2491         return nullptr;
2492     }
2493     if (registerStatus_ != TELEPHONY_SUCCESS) {
2494         TELEPHONY_LOGE("RegisterCallBack failed!");
2495         if (registerStatus_ == TELEPHONY_ERR_PERMISSION_ERR) {
2496             NapiUtil::ThrowError(env, JS_ERROR_TELEPHONY_PERMISSION_DENIED, OBSERVER_ON_JS_PERMISSION_ERROR_STRING);
2497             return nullptr;
2498         }
2499         JsError error = NapiUtil::ConverErrorMessageForJs(registerStatus_);
2500         NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
2501         return nullptr;
2502     }
2503     char listenerType[PHONE_NUMBER_MAXIMUM_LIMIT + 1] = { 0 };
2504     size_t strLength = 0;
2505     napi_get_value_string_utf8(env, argv[ARRAY_INDEX_FIRST], listenerType, PHONE_NUMBER_MAXIMUM_LIMIT, &strLength);
2506     std::string tmpStr = listenerType;
2507     TELEPHONY_LOGI("listenerType == %{public}s", tmpStr.c_str());
2508     EventCallback stateCallback;
2509     (void)memset_s(&stateCallback, sizeof(EventCallback), 0, sizeof(EventCallback));
2510     stateCallback.env = env;
2511     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &stateCallback.thisVar);
2512     napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &stateCallback.callbackRef);
2513     RegisterNapiCallFuncCallback(tmpStr, stateCallback);
2514     napi_value result = nullptr;
2515     return result;
2516 }
2517 
RegisterNapiCallFuncCallback(std::string tmpStr,EventCallback stateCallback)2518 void NapiCallManager::RegisterNapiCallFuncCallback(std::string tmpStr, EventCallback stateCallback)
2519 {
2520     if (tmpStr == "callDetailsChange") {
2521         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterCallStateCallback(stateCallback);
2522         DelayedSingleton<CallManagerClient>::GetInstance()->ObserverOnCallDetailsChange();
2523     } else if (tmpStr == "callEventChange") {
2524         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterCallEventCallback(stateCallback);
2525     } else if (tmpStr == "callOttRequest") {
2526         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterCallOttRequestCallback(stateCallback);
2527     } else if (tmpStr == "callDisconnectedCause") {
2528         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterDisconnectedCauseCallback(stateCallback);
2529     } else if (tmpStr == "mmiCodeResult") {
2530         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterMmiCodeCallback(stateCallback);
2531     } else if (tmpStr == "audioDeviceChange") {
2532         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterAudioDeviceCallback(stateCallback);
2533         int32_t result = DelayedSingleton<CallManagerClient>::GetInstance()->ReportAudioDeviceInfo();
2534         TELEPHONY_LOGI("result == %{public}d", result);
2535     } else if (tmpStr == "postDialDelay") {
2536         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterPostDialDelay(stateCallback);
2537     } else if (tmpStr == "imsCallModeChange") {
2538         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterImsCallModeChangeCallback(stateCallback);
2539     } else if (tmpStr == "callSessionEvent") {
2540         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterCallSessionEventChangeCallback(
2541             stateCallback);
2542     } else if (tmpStr == "peerDimensionsChange") {
2543         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterPeerDimensionsChangeCallback(stateCallback);
2544     } else if (tmpStr == "cameraCapabilitiesChange") {
2545         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterCameraCapabilitiesChangeCallback(
2546             stateCallback);
2547     }
2548 }
2549 
ObserverOff(napi_env env,napi_callback_info info)2550 napi_value NapiCallManager::ObserverOff(napi_env env, napi_callback_info info)
2551 {
2552     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2553     if (!MatchObserverOffParameter(env, argv, argc)) {
2554         TELEPHONY_LOGE("MatchObserverOffParameter failed.");
2555         NapiUtil::ThrowParameterError(env);
2556         return nullptr;
2557     }
2558     auto asyncContext = std::make_unique<AsyncContext>();
2559     if (asyncContext == nullptr) {
2560         TELEPHONY_LOGE("asyncContext is nullptr.");
2561         NapiUtil::ThrowParameterError(env);
2562         return nullptr;
2563     }
2564     if (registerStatus_ != TELEPHONY_SUCCESS) {
2565         TELEPHONY_LOGE("RegisterCallBack failed!");
2566         if (registerStatus_ == TELEPHONY_ERR_PERMISSION_ERR) {
2567             NapiUtil::ThrowError(env, JS_ERROR_TELEPHONY_PERMISSION_DENIED, OBSERVER_OFF_JS_PERMISSION_ERROR_STRING);
2568             return nullptr;
2569         }
2570         JsError error = NapiUtil::ConverErrorMessageForJs(registerStatus_);
2571         NapiUtil::ThrowError(env, error.errorCode, error.errorMessage);
2572         return nullptr;
2573     }
2574     char listenerType[PHONE_NUMBER_MAXIMUM_LIMIT + 1] = { 0 };
2575     size_t strLength = 0;
2576     napi_get_value_string_utf8(env, argv[ARRAY_INDEX_FIRST], listenerType, PHONE_NUMBER_MAXIMUM_LIMIT, &strLength);
2577     std::string tmpStr = listenerType;
2578     TELEPHONY_LOGI("listenerType == %{public}s", tmpStr.c_str());
2579     UnRegisterCallbackWithListenerType(tmpStr);
2580     if (argc == TWO_VALUE_LIMIT) {
2581         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2582     }
2583     return HandleAsyncWork(
2584         env, asyncContext.release(), "Off", [](napi_env env, void *data) {}, NativeOffCallBack);
2585 }
2586 
UnRegisterCallbackWithListenerType(std::string tmpStr)2587 void NapiCallManager::UnRegisterCallbackWithListenerType(std::string tmpStr)
2588 {
2589     if (tmpStr == "callDetailsChange") {
2590         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterCallStateCallback();
2591     } else if (tmpStr == "callEventChange") {
2592         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterCallEventCallback();
2593     } else if (tmpStr == "callOttRequest") {
2594         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterCallOttRequestCallback();
2595     } else if (tmpStr == "callDisconnectedCause") {
2596         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterDisconnectedCauseCallback();
2597     } else if (tmpStr == "mmiCodeResult") {
2598         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterMmiCodeCallback();
2599     } else if (tmpStr == "audioDeviceChange") {
2600         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterAudioDeviceCallback();
2601     } else if (tmpStr == "postDialDelay") {
2602         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterPostDialDelayCallback();
2603     } else if (tmpStr == "imsCallModeChange") {
2604         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterImsCallModeChangeCallback();
2605     } else if (tmpStr == "callSessionEvent") {
2606         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterCallSessionEventChangeCallback();
2607     } else if (tmpStr == "peerDimensionsChange") {
2608         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterPeerDimensionsChangeCallback();
2609     } else if (tmpStr == "cameraCapabilitiesChange") {
2610         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterCameraCapabilitiesChangeCallback();
2611     }
2612 }
2613 
SetMuted(napi_env env,napi_callback_info info)2614 napi_value NapiCallManager::SetMuted(napi_env env, napi_callback_info info)
2615 {
2616     GET_PARAMS(env, info, ONLY_ONE_VALUE);
2617     if (!MatchEmptyParameter(env, argv, argc)) {
2618         TELEPHONY_LOGE("NapiCallManager::SetMuted MatchEmptyParameter failed.");
2619         NapiUtil::ThrowParameterError(env);
2620         return nullptr;
2621     }
2622     auto asyncContext = std::make_unique<AudioAsyncContext>();
2623     if (asyncContext == nullptr) {
2624         TELEPHONY_LOGE("NapiCallManager::SetMuted asyncContext is nullptr.");
2625         NapiUtil::ThrowParameterError(env);
2626         return nullptr;
2627     }
2628     if (argc == ONLY_ONE_VALUE) {
2629         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2630     }
2631     return HandleAsyncWork(env, asyncContext.release(), "SetMuted", NativeSetMuted, NativeVoidCallBackWithErrorCode);
2632 }
2633 
CancelMuted(napi_env env,napi_callback_info info)2634 napi_value NapiCallManager::CancelMuted(napi_env env, napi_callback_info info)
2635 {
2636     GET_PARAMS(env, info, ONLY_ONE_VALUE);
2637     if (!MatchEmptyParameter(env, argv, argc)) {
2638         TELEPHONY_LOGE("NapiCallManager::CancelMuted MatchEmptyParameter failed.");
2639         NapiUtil::ThrowParameterError(env);
2640         return nullptr;
2641     }
2642     auto asyncContext = std::make_unique<AudioAsyncContext>();
2643     if (asyncContext == nullptr) {
2644         TELEPHONY_LOGE("NapiCallManager::CancelMuted asyncContext is nullptr.");
2645         NapiUtil::ThrowParameterError(env);
2646         return nullptr;
2647     }
2648     if (argc == ONLY_ONE_VALUE) {
2649         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2650     }
2651     return HandleAsyncWork(
2652         env, asyncContext.release(), "CancelMuted", NativeCancelMuted, NativeVoidCallBackWithErrorCode);
2653 }
2654 
MuteRinger(napi_env env,napi_callback_info info)2655 napi_value NapiCallManager::MuteRinger(napi_env env, napi_callback_info info)
2656 {
2657     GET_PARAMS(env, info, ONLY_ONE_VALUE);
2658     if (!MatchEmptyParameter(env, argv, argc)) {
2659         TELEPHONY_LOGE("NapiCallManager::MuteRinger MatchEmptyParameter failed.");
2660         NapiUtil::ThrowParameterError(env);
2661         return nullptr;
2662     }
2663     auto asyncContext = std::make_unique<AudioAsyncContext>();
2664     if (asyncContext == nullptr) {
2665         TELEPHONY_LOGE("NapiCallManager::MuteRinger asyncContext is nullptr.");
2666         NapiUtil::ThrowParameterError(env);
2667         return nullptr;
2668     }
2669     if (argc == ONLY_ONE_VALUE) {
2670         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2671     }
2672     return HandleAsyncWork(
2673         env, asyncContext.release(), "MuteRinger", NativeMuteRinger, NativeVoidCallBackWithErrorCode);
2674 }
2675 
SetAudioDevice(napi_env env,napi_callback_info info)2676 napi_value NapiCallManager::SetAudioDevice(napi_env env, napi_callback_info info)
2677 {
2678     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2679     if (!MatchAudioDeviceParameters(env, argv, argc)) {
2680         TELEPHONY_LOGE("NapiCallManager::SetAudioDevice MatchAudioDeviceParameters failed.");
2681         NapiUtil::ThrowParameterError(env);
2682         return nullptr;
2683     }
2684     auto asyncContext = std::make_unique<AudioAsyncContext>();
2685     if (asyncContext == nullptr) {
2686         TELEPHONY_LOGE("NapiCallManager::SetAudioDevice asyncContext is nullptr.");
2687         NapiUtil::ThrowParameterError(env);
2688         return nullptr;
2689     }
2690     asyncContext->deviceType = NapiCallManagerUtils::GetIntProperty(env, argv[ARRAY_INDEX_FIRST], "deviceType");
2691     asyncContext->address = NapiCallManagerUtils::GetStringProperty(env, argv[ARRAY_INDEX_FIRST], "address");
2692     if (argc == TWO_VALUE_LIMIT) {
2693         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2694     }
2695 
2696     return HandleAsyncWork(
2697         env, asyncContext.release(), "SetAudioDevice", NativeSetAudioDevice, NativeVoidCallBackWithErrorCode);
2698 }
2699 
ControlCamera(napi_env env,napi_callback_info info)2700 napi_value NapiCallManager::ControlCamera(napi_env env, napi_callback_info info)
2701 {
2702     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2703     if (!MatchNumberAndStringParameters(env, argv, argc)) {
2704         TELEPHONY_LOGE("MatchNumberAndStringParameters failed.");
2705         NapiUtil::ThrowParameterError(env);
2706         return nullptr;
2707     }
2708     auto asyncContext = std::make_unique<VideoAsyncContext>();
2709     if (asyncContext == nullptr) {
2710         std::string errorCode = std::to_string(napi_generic_failure);
2711         std::string errorMessage = "ControlCamera error at baseContext is nullptr";
2712         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2713         return nullptr;
2714     }
2715     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2716     char tmpStr[kMaxNumberLen + 1] = {0};
2717     size_t strLen = 0;
2718     napi_get_value_string_utf8(env, argv[ARRAY_INDEX_SECOND], tmpStr, PHONE_NUMBER_MAXIMUM_LIMIT, &strLen);
2719     std::string tmpCode(tmpStr, strLen);
2720     asyncContext->cameraId = tmpCode;
2721     if (argc == THREE_VALUE_MAXIMUM_LIMIT) {
2722         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2723     }
2724     return HandleAsyncWork(
2725         env, asyncContext.release(), "ControlCamera", NativeControlCamera, NativeVoidCallBackWithErrorCode);
2726 }
2727 
SetPreviewWindow(napi_env env,napi_callback_info info)2728 napi_value NapiCallManager::SetPreviewWindow(napi_env env, napi_callback_info info)
2729 {
2730     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2731     if (!MatchNumberAndStringParameters(env, argv, argc)) {
2732         TELEPHONY_LOGE("MatchNumberAndStringParameters failed.");
2733         NapiUtil::ThrowParameterError(env);
2734         return nullptr;
2735     }
2736 
2737     auto previwWindowContext = std::make_unique<VideoAsyncContext>();
2738     if (previwWindowContext == nullptr) {
2739         std::string errorCode = std::to_string(napi_generic_failure);
2740         std::string errorMessage = "SetPreviewWindow error at baseContext is nullptr";
2741         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2742         return nullptr;
2743     }
2744     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &previwWindowContext->callId);
2745     char tmpStr[kMaxNumberLen + 1] = { 0 };
2746     size_t strLen = 0;
2747     napi_get_value_string_utf8(env, argv[ARRAY_INDEX_SECOND], tmpStr, MESSAGE_CONTENT_MAXIMUM_LIMIT, &strLen);
2748     std::string tmpCode(tmpStr, strLen);
2749     previwWindowContext->surfaceId = tmpCode;
2750     if (argc == THREE_VALUE_MAXIMUM_LIMIT) {
2751         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(previwWindowContext->callbackRef));
2752     }
2753     return HandleAsyncWork(env, previwWindowContext.release(), "SetPreviewWindow", NativeSetPreviewWindow,
2754         NativeVoidCallBackWithErrorCode);
2755 }
2756 
SetDisplayWindow(napi_env env,napi_callback_info info)2757 napi_value NapiCallManager::SetDisplayWindow(napi_env env, napi_callback_info info)
2758 {
2759     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2760     if (!MatchNumberAndStringParameters(env, argv, argc)) {
2761         TELEPHONY_LOGE("MatchNumberAndStringParameters failed.");
2762         NapiUtil::ThrowParameterError(env);
2763         return nullptr;
2764     }
2765 
2766     auto dislpayWindowContext = std::make_unique<VideoAsyncContext>();
2767     if (dislpayWindowContext == nullptr) {
2768         std::string errorCode = std::to_string(napi_generic_failure);
2769         std::string errorMessage = "SetDisplayWindow error at baseContext is nullptr";
2770         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2771         return nullptr;
2772     }
2773     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &dislpayWindowContext->callId);
2774     char tmpStr[kMaxNumberLen + 1] = { 0 };
2775     size_t strLen = 0;
2776     napi_get_value_string_utf8(env, argv[ARRAY_INDEX_SECOND], tmpStr, MESSAGE_CONTENT_MAXIMUM_LIMIT, &strLen);
2777     std::string tmpCode(tmpStr, strLen);
2778     dislpayWindowContext->surfaceId = tmpCode;
2779     if (argc == THREE_VALUE_MAXIMUM_LIMIT) {
2780         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(dislpayWindowContext->callbackRef));
2781     }
2782     return HandleAsyncWork(env, dislpayWindowContext.release(), "SetDisplayWindow", NativeSetDisplayWindow,
2783         NativeVoidCallBackWithErrorCode);
2784 }
2785 
SetCameraZoom(napi_env env,napi_callback_info info)2786 napi_value NapiCallManager::SetCameraZoom(napi_env env, napi_callback_info info)
2787 {
2788     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2789     NAPI_ASSERT(env, argc < VALUE_MAXIMUM_LIMIT, "parameter error!");
2790     bool matchFlag = NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_number);
2791     NAPI_ASSERT(env, matchFlag, "SetCameraZoom type error, should be number type");
2792 
2793     auto asyncContext = std::make_unique<VideoAsyncContext>();
2794     if (asyncContext == nullptr) {
2795         std::string errorCode = std::to_string(napi_generic_failure);
2796         std::string errorMessage = "SetCameraZoom error at baseContext is nullptr";
2797         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2798         return nullptr;
2799     }
2800     napi_get_value_double(env, argv[ARRAY_INDEX_FIRST], &asyncContext->zoomRatio);
2801     if (argc == TWO_VALUE_LIMIT) {
2802         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2803     }
2804     return HandleAsyncWork(env, asyncContext.release(), "SetCameraZoom", NativeSetCameraZoom, NativeVoidCallBack);
2805 }
2806 
SetPausePicture(napi_env env,napi_callback_info info)2807 napi_value NapiCallManager::SetPausePicture(napi_env env, napi_callback_info info)
2808 {
2809     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2810     if (!MatchOneNumberParameter(env, argv, argc)) {
2811         TELEPHONY_LOGE("MatchNumberAndStringParameters failed.");
2812         NapiUtil::ThrowParameterError(env);
2813         return nullptr;
2814     }
2815 
2816     auto asyncContext = std::make_unique<VideoAsyncContext>();
2817     if (asyncContext == nullptr) {
2818         std::string errorCode = std::to_string(napi_generic_failure);
2819         std::string errorMessage = "SetPausePicture error at baseContext is nullptr";
2820         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2821         return nullptr;
2822     }
2823     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2824     if (argc == TWO_VALUE_LIMIT) {
2825         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2826     }
2827     return HandleAsyncWork(
2828         env, asyncContext.release(), "SetPausePicture", NativeSetPausePicture, NativeVoidCallBackWithErrorCode);
2829 }
2830 
SetDeviceDirection(napi_env env,napi_callback_info info)2831 napi_value NapiCallManager::SetDeviceDirection(napi_env env, napi_callback_info info)
2832 {
2833     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2834     if (!MatchTwoNumberParameters(env, argv, argc)) {
2835         TELEPHONY_LOGE("NapiCallManager::SetDeviceDirection MatchTwoNumberParameters failed.");
2836         NapiUtil::ThrowParameterError(env);
2837         return nullptr;
2838     }
2839 
2840     auto asyncContext = std::make_unique<VideoAsyncContext>();
2841     if (asyncContext == nullptr) {
2842         std::string errorCode = std::to_string(napi_generic_failure);
2843         std::string errorMessage = "SetDeviceDirection error at baseContext is nullptr";
2844         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2845         return nullptr;
2846     }
2847     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2848     napi_get_value_int32(env, argv[ARRAY_INDEX_SECOND], &asyncContext->rotation);
2849     if (argc == THREE_VALUE_MAXIMUM_LIMIT) {
2850         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2851     }
2852     return HandleAsyncWork(
2853         env, asyncContext.release(), "SetDeviceDirection", NativeSetDeviceDirection, NativeVoidCallBackWithErrorCode);
2854 }
2855 
RequestCameraCapabilities(napi_env env,napi_callback_info info)2856 napi_value NapiCallManager::RequestCameraCapabilities(napi_env env, napi_callback_info info)
2857 {
2858     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2859     if (!MatchOneNumberParameter(env, argv, argc)) {
2860         TELEPHONY_LOGE("NapiCallManager::RequestCameraCapabilities MatchOneNumberParameter failed.");
2861         NapiUtil::ThrowParameterError(env);
2862         return nullptr;
2863     }
2864     auto asyncContext = std::make_unique<AsyncContext>();
2865     if (asyncContext == nullptr) {
2866         TELEPHONY_LOGE("NapiCallManager::RequestCameraCapabilities asyncContext is nullptr.");
2867         NapiUtil::ThrowParameterError(env);
2868         return nullptr;
2869     }
2870     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2871     if (argc == TWO_VALUE_LIMIT) {
2872         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2873     }
2874     return HandleAsyncWork(env, asyncContext.release(), "RequestCameraCapabilities",
2875         NativeRequestCameraCapabilities, NativeVoidCallBackWithErrorCode);
2876 }
2877 
CancelCallUpgrade(napi_env env,napi_callback_info info)2878 napi_value NapiCallManager::CancelCallUpgrade(napi_env env, napi_callback_info info)
2879 {
2880     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
2881     if (!MatchOneNumberParameter(env, argv, argc)) {
2882         TELEPHONY_LOGE("NapiCallManager::CancelCallUpgrade MatchOneNumberParameter failed.");
2883         NapiUtil::ThrowParameterError(env);
2884         return nullptr;
2885     }
2886     auto asyncContext = std::make_unique<AsyncContext>();
2887     if (asyncContext == nullptr) {
2888         TELEPHONY_LOGE("NapiCallManager::CancelCallUpgrade asyncContext is nullptr.");
2889         NapiUtil::ThrowParameterError(env);
2890         return nullptr;
2891     }
2892     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2893     if (argc == TWO_VALUE_LIMIT) {
2894         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2895     }
2896     return HandleAsyncWork(env, asyncContext.release(), "CancelCallUpgrade", NativeCancelCallUpgrade,
2897         NativeVoidCallBackWithErrorCode);
2898 }
2899 
SetCallPreferenceMode(napi_env env,napi_callback_info info)2900 napi_value NapiCallManager::SetCallPreferenceMode(napi_env env, napi_callback_info info)
2901 {
2902     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2903     NAPI_ASSERT(env, argc <= VALUE_MAXIMUM_LIMIT, "parameter error!");
2904     bool matchFlag = NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_number);
2905     NAPI_ASSERT(env, matchFlag, "SetCallPreferenceMode type error, should be number type");
2906     matchFlag = NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_number);
2907     NAPI_ASSERT(env, matchFlag, "SetCallPreferenceMode type error, should be number type");
2908     auto asyncContext = std::make_unique<SupplementAsyncContext>();
2909     if (asyncContext == nullptr) {
2910         std::string errorCode = std::to_string(napi_generic_failure);
2911         std::string errorMessage = "SetCallPreferenceMode error at baseContext is nullptr";
2912         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2913         return nullptr;
2914     }
2915     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2916     napi_get_value_int32(env, argv[ARRAY_INDEX_SECOND], &asyncContext->mode);
2917     if (argc == VALUE_MAXIMUM_LIMIT) {
2918         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2919     }
2920     return HandleAsyncWork(
2921         env, asyncContext.release(), "SetCallPreferenceMode", NativeSetCallPreferenceMode, NativeVoidCallBack);
2922 }
2923 
StartRTT(napi_env env,napi_callback_info info)2924 napi_value NapiCallManager::StartRTT(napi_env env, napi_callback_info info)
2925 {
2926     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2927     NAPI_ASSERT(env, argc <= VALUE_MAXIMUM_LIMIT, "parameter error!");
2928     bool matchFlag = NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_number);
2929     NAPI_ASSERT(env, matchFlag, "StartRTT type error, should be number type");
2930     matchFlag = NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_SECOND], napi_string);
2931     NAPI_ASSERT(env, matchFlag, "StartRTT type error, should be string type");
2932     auto asyncContext = std::make_unique<SupplementAsyncContext>();
2933     if (asyncContext == nullptr) {
2934         std::string errorCode = std::to_string(napi_generic_failure);
2935         std::string errorMessage = "StartRTT error at supplementAsyncContext is nullptr";
2936         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2937         return nullptr;
2938     }
2939     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2940     char tmpStr[kMaxNumberLen + 1] = {0};
2941     size_t strLen = 0;
2942     napi_get_value_string_utf8(env, argv[ARRAY_INDEX_SECOND], tmpStr, PHONE_NUMBER_MAXIMUM_LIMIT, &strLen);
2943     std::string tmpCode(tmpStr, strLen);
2944     asyncContext->content = tmpCode;
2945     if (argc == VALUE_MAXIMUM_LIMIT) {
2946         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2947     }
2948     asyncContext->env = env;
2949     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
2950     return HandleAsyncWork(env, asyncContext.release(), "StartRTT", NativeStartRTT, NativeVoidCallBack);
2951 }
2952 
StopRTT(napi_env env,napi_callback_info info)2953 napi_value NapiCallManager::StopRTT(napi_env env, napi_callback_info info)
2954 {
2955     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
2956     NAPI_ASSERT(env, argc < VALUE_MAXIMUM_LIMIT, "parameter error!");
2957     bool matchFlag = NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_number);
2958     NAPI_ASSERT(env, matchFlag, "StopRTT type error, should be number type");
2959     auto asyncContext = std::make_unique<SupplementAsyncContext>();
2960     if (asyncContext == nullptr) {
2961         std::string errorCode = std::to_string(napi_generic_failure);
2962         std::string errorMessage = "StopRTT error at supplementAsyncContext is nullptr";
2963         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
2964         return nullptr;
2965     }
2966     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2967     if (argc == TWO_VALUE_LIMIT) {
2968         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
2969     }
2970     asyncContext->env = env;
2971     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
2972     return HandleAsyncWork(env, asyncContext.release(), "StopRTT", NativeStopRTT, NativeVoidCallBack);
2973 }
2974 
JoinConference(napi_env env,napi_callback_info info)2975 napi_value NapiCallManager::JoinConference(napi_env env, napi_callback_info info)
2976 {
2977     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
2978     if (!MatchNumberAndObjectParameters(env, argv, argc)) {
2979         TELEPHONY_LOGE("NapiCallManager::JoinConference MatchNumberAndObjectParameters failed.");
2980         NapiUtil::ThrowParameterError(env);
2981         return nullptr;
2982     }
2983     uint32_t arrayLength = 0;
2984     NAPI_CALL(env, napi_get_array_length(env, argv[ARRAY_INDEX_SECOND], &arrayLength));
2985     if (!NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_number) || arrayLength == 0) {
2986         TELEPHONY_LOGE("NapiCallManager::JoinConference parameter type matching failed.");
2987         NapiUtil::ThrowParameterError(env);
2988         return nullptr;
2989     }
2990     auto asyncContext = std::make_unique<ListAsyncContext>();
2991     if (asyncContext == nullptr) {
2992         TELEPHONY_LOGE("NapiCallManager::JoinConference asyncContext is nullptr.");
2993         NapiUtil::ThrowParameterError(env);
2994         return nullptr;
2995     }
2996     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
2997     (asyncContext->listResult).clear();
2998 
2999     napi_value napiFormId;
3000     std::string str = "";
3001     size_t len = 0;
3002     char chars[PHONE_NUMBER_MAXIMUM_LIMIT + 1] = { 0 };
3003     napi_status getStringStatus = napi_invalid_arg;
3004     for (uint32_t i = 0; i < arrayLength; i++) {
3005         napi_get_element(env, argv[ARRAY_INDEX_SECOND], i, &napiFormId);
3006         if (!NapiCallManagerUtils::MatchValueType(env, napiFormId, napi_string)) {
3007             TELEPHONY_LOGE("NapiCallManager::JoinConference parameter type matching failed.");
3008             NapiUtil::ThrowParameterError(env);
3009             return nullptr;
3010         }
3011         getStringStatus = napi_get_value_string_utf8(env, napiFormId, chars, PHONE_NUMBER_MAXIMUM_LIMIT, &len);
3012         if (getStringStatus == napi_ok && len > 0) {
3013             str = std::string(chars, len);
3014             (asyncContext->listResult).push_back(Str8ToStr16(str));
3015             TELEPHONY_LOGI("napi_string  %{public}s", str.c_str());
3016         }
3017     }
3018 
3019     if (argc == VALUE_MAXIMUM_LIMIT) {
3020         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
3021     }
3022     return HandleAsyncWork(
3023         env, asyncContext.release(), "JoinConference", NativeJoinConference, NativeVoidCallBackWithErrorCode);
3024 }
3025 
UpdateImsCallMode(napi_env env,napi_callback_info info)3026 napi_value NapiCallManager::UpdateImsCallMode(napi_env env, napi_callback_info info)
3027 {
3028     GET_PARAMS(env, info, THREE_VALUE_MAXIMUM_LIMIT);
3029     if (!MatchTwoNumberParameters(env, argv, argc)) {
3030         TELEPHONY_LOGE("NapiCallManager::UpdateImsCallMode MatchTwoNumberParameters failed.");
3031         NapiUtil::ThrowParameterError(env);
3032         return nullptr;
3033     }
3034     auto asyncContext = std::make_unique<SupplementAsyncContext>();
3035     if (asyncContext == nullptr) {
3036         TELEPHONY_LOGE("NapiCallManager::UpdateImsCallMode asyncContext is nullptr.");
3037         NapiUtil::ThrowParameterError(env);
3038         return nullptr;
3039     }
3040     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->callId);
3041     napi_get_value_int32(env, argv[ARRAY_INDEX_SECOND], &asyncContext->type);
3042     if (argc == VALUE_MAXIMUM_LIMIT) {
3043         napi_create_reference(env, argv[ARRAY_INDEX_THIRD], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
3044     }
3045     asyncContext->env = env;
3046     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
3047     return HandleAsyncWork(
3048         env, asyncContext.release(), "UpdateImsCallMode", NativeUpdateImsCallMode, NativeVoidCallBackWithErrorCode);
3049 }
3050 
ReportOttCallDetailsInfo(napi_env env,napi_callback_info info)3051 napi_value NapiCallManager::ReportOttCallDetailsInfo(napi_env env, napi_callback_info info)
3052 {
3053     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
3054     NAPI_ASSERT(env, argc <= VALUE_MAXIMUM_LIMIT, "parameter error!");
3055     uint32_t arrayLength = 0;
3056     NAPI_CALL(env, napi_get_array_length(env, argv[ARRAY_INDEX_FIRST], &arrayLength));
3057     NAPI_ASSERT(env, arrayLength > 0, "Parameter cannot be empty");
3058     auto asyncContext = std::make_unique<OttCallAsyncContext>();
3059     if (asyncContext == nullptr) {
3060         std::string errorCode = std::to_string(napi_generic_failure);
3061         std::string errorMessage = "ReportOttCallDetailsInfo error at baseContext is nullptr";
3062         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
3063         return nullptr;
3064     }
3065     (asyncContext->ottVec).clear();
3066 
3067     napi_value napiFormId;
3068     OttCallDetailsInfo tmpOttVec;
3069     (void)memset_s(&tmpOttVec, sizeof(OttCallDetailsInfo), 0, sizeof(OttCallDetailsInfo));
3070     for (uint32_t i = 0; i < arrayLength; i++) {
3071         napi_get_element(env, argv[ARRAY_INDEX_FIRST], i, &napiFormId);
3072         bool matchFlag = NapiCallManagerUtils::MatchValueType(env, napiFormId, napi_object);
3073         NAPI_ASSERT(env, matchFlag, "ReportOttCallDetailsInfo type error, should be napi_object type");
3074         std::string tmpStr = NapiCallManagerUtils::GetStringProperty(env, napiFormId, "phoneNumber");
3075         if (tmpStr.length() > static_cast<size_t>(kMaxNumberLen)) {
3076             TELEPHONY_LOGE("Number out of limit!");
3077             return (napi_value) nullptr;
3078         }
3079         if (memcpy_s(tmpOttVec.phoneNum, kMaxNumberLen, tmpStr.c_str(), tmpStr.length()) != EOK) {
3080             return (napi_value) nullptr;
3081         }
3082         tmpStr = NapiCallManagerUtils::GetStringProperty(env, napiFormId, "bundleName");
3083         if (tmpStr.length() > static_cast<size_t>(kMaxNumberLen)) {
3084             TELEPHONY_LOGE("Number out of limit!");
3085             return (napi_value) nullptr;
3086         }
3087         if (memcpy_s(tmpOttVec.bundleName, kMaxNumberLen, tmpStr.c_str(), tmpStr.length()) != EOK) {
3088             return (napi_value) nullptr;
3089         }
3090         int32_t tmpValue = NapiCallManagerUtils::GetIntProperty(env, napiFormId, "videoState");
3091         tmpOttVec.videoState = static_cast<VideoStateType>(tmpValue);
3092         tmpValue = NapiCallManagerUtils::GetIntProperty(env, napiFormId, "callState");
3093         tmpOttVec.callState = static_cast<TelCallState>(tmpValue);
3094         (asyncContext->ottVec).push_back(tmpOttVec);
3095     }
3096 
3097     return HandleAsyncWork(
3098         env, asyncContext.release(), "ReportOttCallDetailsInfo", NativeReportOttCallDetailsInfo, NativeVoidCallBack);
3099 }
3100 
ReportOttCallEventInfo(napi_env env,napi_callback_info info)3101 napi_value NapiCallManager::ReportOttCallEventInfo(napi_env env, napi_callback_info info)
3102 {
3103     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
3104     NAPI_ASSERT(env, argc < VALUE_MAXIMUM_LIMIT, "parameter error!");
3105     bool matchFlag = NapiCallManagerUtils::MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_object);
3106     NAPI_ASSERT(env, matchFlag, "ReportOttCallEventInfo type error, should be object type");
3107     auto asyncContext = std::make_unique<OttEventAsyncContext>();
3108     if (asyncContext == nullptr) {
3109         std::string errorCode = std::to_string(napi_generic_failure);
3110         std::string errorMessage = "ReportOttCallEventInfo error at baseContext is nullptr";
3111         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
3112         return nullptr;
3113     }
3114     (void)memset_s(&asyncContext->eventInfo, sizeof(OttCallEventInfo), 0, sizeof(OttCallEventInfo));
3115     int32_t eventId = NapiCallManagerUtils::GetIntProperty(env, argv[ARRAY_INDEX_FIRST], "eventId");
3116     std::string tmpStr = NapiCallManagerUtils::GetStringProperty(env, argv[ARRAY_INDEX_FIRST], "bundleName");
3117     if (tmpStr.length() > static_cast<size_t>(kMaxNumberLen)) {
3118         TELEPHONY_LOGE("Number out of limit!");
3119         return (napi_value) nullptr;
3120     }
3121     asyncContext->eventInfo.ottCallEventId = static_cast<OttCallEventId>(eventId);
3122     if (memcpy_s(asyncContext->eventInfo.bundleName, kMaxNumberLen, tmpStr.c_str(), tmpStr.length()) != EOK) {
3123         return (napi_value) nullptr;
3124     }
3125     return HandleAsyncWork(
3126         env, asyncContext.release(), "ReportOttCallEventInfo", NativeReportOttCallEventInfo, NativeVoidCallBack);
3127 }
3128 
CloseUnFinishedUssd(napi_env env,napi_callback_info info)3129 napi_value NapiCallManager::CloseUnFinishedUssd(napi_env env, napi_callback_info info)
3130 {
3131     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
3132     if (!MatchOneNumberParameter(env, argv, argc)) {
3133         TELEPHONY_LOGE("NapiCallManager::CloseUnFinishedUssd MatchOneNumberParameter failed.");
3134         NapiUtil::ThrowParameterError(env);
3135         return nullptr;
3136     }
3137     auto asyncContext = std::make_unique<SupplementAsyncContext>();
3138     if (asyncContext == nullptr) {
3139         TELEPHONY_LOGE("NapiCallManager::CloseUnFinishedUssd asyncContext is nullptr.");
3140         NapiUtil::ThrowParameterError(env);
3141         return nullptr;
3142     }
3143     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->slotId);
3144     if (argc == TWO_VALUE_LIMIT) {
3145         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
3146     }
3147     asyncContext->env = env;
3148     napi_create_reference(env, thisVar, DATA_LENGTH_ONE, &(asyncContext->thisVar));
3149     return HandleAsyncWork(
3150         env, asyncContext.release(), "CloseUnFinishedUssd", NativeCloseUnFinishedUssd, NativeVoidCallBackWithErrorCode);
3151 }
3152 
InputDialerSpecialCode(napi_env env,napi_callback_info info)3153 napi_value NapiCallManager::InputDialerSpecialCode(napi_env env, napi_callback_info info)
3154 {
3155     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
3156     if (!MatchOneStringParameter(env, argv, argc)) {
3157         TELEPHONY_LOGE("NapiCallManager::InputDialerSpecialCode MatchOneStringParameter failed.");
3158         NapiUtil::ThrowParameterError(env);
3159         return nullptr;
3160     }
3161 
3162     auto asyncContext = std::make_unique<AsyncContext>();
3163     if (asyncContext == nullptr) {
3164         TELEPHONY_LOGE("NapiCallManager::InputDialerSpecialCode asyncContext is nullptr.");
3165         NapiUtil::ThrowParameterError(env);
3166         return nullptr;
3167     }
3168     napi_get_value_string_utf8(
3169         env, argv[ARRAY_INDEX_FIRST], asyncContext->number, PHONE_NUMBER_MAXIMUM_LIMIT, &(asyncContext->numberLen));
3170     if (argc == TWO_VALUE_LIMIT) {
3171         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
3172     }
3173     return HandleAsyncWork(env, asyncContext.release(), "InputDialerSpecialCode", NativeInputDialerSpecialCode,
3174         NativeVoidCallBackWithErrorCode);
3175 }
3176 
RemoveMissedIncomingCallNotification(napi_env env,napi_callback_info info)3177 napi_value NapiCallManager::RemoveMissedIncomingCallNotification(napi_env env, napi_callback_info info)
3178 {
3179     GET_PARAMS(env, info, VALUE_MAXIMUM_LIMIT);
3180     if (!MatchEmptyParameter(env, argv, argc)) {
3181         TELEPHONY_LOGE("NapiCallManager::RemoveMissedIncomingCallNotification "
3182                        "MatchEmptyParameter failed.");
3183         NapiUtil::ThrowParameterError(env);
3184         return nullptr;
3185     }
3186 
3187     auto asyncContext = std::make_unique<AsyncContext>();
3188     if (asyncContext == nullptr) {
3189         TELEPHONY_LOGE("NapiCallManager::RemoveMissedIncomingCallNotification "
3190                        "asyncContext is nullptr.");
3191         NapiUtil::ThrowParameterError(env);
3192         return nullptr;
3193     }
3194 
3195     if (argc == ONLY_ONE_VALUE) {
3196         napi_create_reference(env, argv[ARRAY_INDEX_FIRST], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
3197     }
3198     return HandleAsyncWork(env, asyncContext.release(), "RemoveMissedIncomingCallNotification",
3199         NativeRemoveMissedIncomingCallNotification, NativeVoidCallBackWithErrorCode);
3200 }
3201 
SetVoIPCallState(napi_env env,napi_callback_info info)3202 napi_value NapiCallManager::SetVoIPCallState(napi_env env, napi_callback_info info)
3203 {
3204     GET_PARAMS(env, info, TWO_VALUE_LIMIT);
3205     if (!MatchOneNumberParameter(env, argv, argc)) {
3206         TELEPHONY_LOGE("NapiCallManager::SetVoIPCallState MatchEmptyParameter failed.");
3207         NapiUtil::ThrowParameterError(env);
3208         return nullptr;
3209     }
3210     auto asyncContext = std::make_unique<VoIPCallStateAsyncContext>();
3211     if (asyncContext == nullptr) {
3212         TELEPHONY_LOGE("NapiCallManager::SetVoIPCallState asyncContext is nullptr.");
3213         NapiUtil::ThrowParameterError(env);
3214         return nullptr;
3215     }
3216     napi_get_value_int32(env, argv[ARRAY_INDEX_FIRST], &asyncContext->state);
3217     if (argc == TWO_VALUE_LIMIT) {
3218         napi_create_reference(env, argv[ARRAY_INDEX_SECOND], DATA_LENGTH_ONE, &(asyncContext->callbackRef));
3219     }
3220     return HandleAsyncWork(
3221         env, asyncContext.release(), "SetVoIPCallState", NativeSetVoIPCallState, NativeVoidCallBackWithErrorCode);
3222 }
3223 
HasVoiceCapability(napi_env env,napi_callback_info)3224 napi_value NapiCallManager::HasVoiceCapability(napi_env env, napi_callback_info)
3225 {
3226     TELEPHONY_LOGI("napi_call HasVoiceCapability");
3227     napi_value result = nullptr;
3228     napi_get_boolean(env, DelayedSingleton<CallManagerClient>::GetInstance()->HasVoiceCapability(), &result);
3229     return result;
3230 }
3231 
NativeCallBack(napi_env env,napi_status status,void * data)3232 void NapiCallManager::NativeCallBack(napi_env env, napi_status status, void *data)
3233 {
3234     if (data == nullptr) {
3235         TELEPHONY_LOGE("data is nullptr");
3236         NapiUtil::ThrowParameterError(env);
3237         return;
3238     }
3239     auto callBackContext = (AsyncContext *)data;
3240     if (callBackContext->deferred != nullptr) {
3241         if (callBackContext->resolved == TELEPHONY_SUCCESS) {
3242             napi_value promiseValue = nullptr;
3243             napi_create_int32(env, callBackContext->resolved, &promiseValue);
3244             napi_resolve_deferred(env, callBackContext->deferred, promiseValue);
3245         } else {
3246             napi_reject_deferred(env, callBackContext->deferred,
3247                 NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3248                     env, callBackContext->errorCode, callBackContext->eventId));
3249         }
3250     } else if (callBackContext->callbackRef != nullptr) {
3251         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3252         if (callBackContext->resolved == TELEPHONY_SUCCESS) {
3253             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3254             napi_create_int32(env, callBackContext->resolved, &callbackValue[ARRAY_INDEX_SECOND]);
3255         } else {
3256             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3257                 env, callBackContext->errorCode, callBackContext->eventId);
3258             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3259         }
3260         napi_value callback = nullptr;
3261         napi_value result = nullptr;
3262         napi_get_reference_value(env, callBackContext->callbackRef, &callback);
3263         napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3264         napi_delete_reference(env, callBackContext->callbackRef);
3265     }
3266     napi_delete_async_work(env, callBackContext->work);
3267     delete callBackContext;
3268     callBackContext = nullptr;
3269 }
3270 
NativeDialCallBack(napi_env env,napi_status status,void * data)3271 void NapiCallManager::NativeDialCallBack(napi_env env, napi_status status, void *data)
3272 {
3273     if (data == nullptr) {
3274         TELEPHONY_LOGE("data is nullptr");
3275         return;
3276     }
3277     auto asyncContext = (AsyncContext *)data;
3278     if (asyncContext->deferred != nullptr) {
3279         if (asyncContext->resolved == TELEPHONY_SUCCESS) {
3280             napi_value promiseValue = nullptr;
3281             napi_get_boolean(env, true, &promiseValue);
3282             napi_resolve_deferred(env, asyncContext->deferred, promiseValue);
3283         } else {
3284             if (asyncContext->errorCode == SLOT_ID_INVALID) {
3285                 napi_reject_deferred(env, asyncContext->deferred,
3286                     NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, "slotId is invalid", SLOT_ID_INVALID));
3287             } else {
3288                 std::string errTip = std::to_string(asyncContext->resolved);
3289                 napi_reject_deferred(
3290                     env, asyncContext->deferred, NapiCallManagerUtils::CreateErrorMessage(env, errTip));
3291             }
3292         }
3293     } else if (asyncContext->callbackRef != nullptr) {
3294         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3295         if (asyncContext->resolved == TELEPHONY_SUCCESS) {
3296             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3297             napi_get_boolean(env, true, &callbackValue[ARRAY_INDEX_SECOND]);
3298         } else {
3299             if (asyncContext->errorCode == SLOT_ID_INVALID) {
3300                 callbackValue[ARRAY_INDEX_FIRST] =
3301                     NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, "slotId is invalid", SLOT_ID_INVALID);
3302                 callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3303             } else {
3304                 std::string errTip = std::to_string(asyncContext->resolved);
3305                 callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorMessage(env, errTip);
3306                 callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3307             }
3308         }
3309         napi_value callback = nullptr;
3310         napi_value result = nullptr;
3311         napi_get_reference_value(env, asyncContext->callbackRef, &callback);
3312         napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3313         napi_delete_reference(env, asyncContext->callbackRef);
3314     }
3315     napi_delete_async_work(env, asyncContext->work);
3316     delete asyncContext;
3317     asyncContext = nullptr;
3318 }
3319 
NativeVoidCallBack(napi_env env,napi_status status,void * data)3320 void NapiCallManager::NativeVoidCallBack(napi_env env, napi_status status, void *data)
3321 {
3322     if (data == nullptr) {
3323         TELEPHONY_LOGE("data is nullptr");
3324         return;
3325     }
3326     auto voidCallBackContext = (AsyncContext *)data;
3327     if (voidCallBackContext->deferred != nullptr) {
3328         if (voidCallBackContext->resolved == TELEPHONY_SUCCESS) {
3329             napi_value promiseValue = nullptr;
3330             napi_get_null(env, &promiseValue);
3331             napi_status ret = napi_resolve_deferred(env, voidCallBackContext->deferred, promiseValue);
3332             TELEPHONY_LOGI("promise successful result = %{public}d", ret);
3333         } else {
3334             std::string errTip = std::to_string(voidCallBackContext->resolved);
3335             napi_status ret = napi_reject_deferred(
3336                 env, voidCallBackContext->deferred, NapiCallManagerUtils::CreateErrorMessage(env, errTip));
3337             TELEPHONY_LOGI("promise failed result = %{public}d", ret);
3338         }
3339     } else if (voidCallBackContext->callbackRef != nullptr) {
3340         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3341         if (voidCallBackContext->resolved == TELEPHONY_SUCCESS) {
3342             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3343             napi_get_null(env, &callbackValue[ARRAY_INDEX_SECOND]);
3344         } else {
3345             std::string errTip = std::to_string(voidCallBackContext->resolved);
3346             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorMessage(env, errTip);
3347             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3348         }
3349         napi_value callback = nullptr;
3350         napi_value result = nullptr;
3351         napi_get_reference_value(env, voidCallBackContext->callbackRef, &callback);
3352         napi_status ret = napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3353         TELEPHONY_LOGI("callback result = %{public}d", ret);
3354         napi_delete_reference(env, voidCallBackContext->callbackRef);
3355     }
3356     napi_delete_async_work(env, voidCallBackContext->work);
3357     delete voidCallBackContext;
3358     voidCallBackContext = nullptr;
3359 }
3360 
NativeVoidCallBackWithErrorCode(napi_env env,napi_status status,void * data)3361 void NapiCallManager::NativeVoidCallBackWithErrorCode(napi_env env, napi_status status, void *data)
3362 {
3363     if (data == nullptr) {
3364         TELEPHONY_LOGE("NapiCallManager::NativeVoidCallBackWithErrorCode data is nullptr");
3365         NapiUtil::ThrowParameterError(env);
3366         return;
3367     }
3368     auto asyncContext = (AsyncContext *)data;
3369     if (asyncContext->deferred != nullptr) {
3370         if (asyncContext->resolved == TELEPHONY_SUCCESS) {
3371             napi_value promiseValue = nullptr;
3372             napi_get_null(env, &promiseValue);
3373             napi_status ret = napi_resolve_deferred(env, asyncContext->deferred, promiseValue);
3374             TELEPHONY_LOGI("promise successful result = %{public}d", ret);
3375         } else {
3376             napi_status ret = napi_reject_deferred(env, asyncContext->deferred,
3377                 NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3378                     env, asyncContext->errorCode, asyncContext->eventId));
3379             TELEPHONY_LOGI("promise failed result = %{public}d", ret);
3380         }
3381     } else if (asyncContext->callbackRef != nullptr) {
3382         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3383         if (asyncContext->resolved == TELEPHONY_SUCCESS) {
3384             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3385             napi_get_null(env, &callbackValue[ARRAY_INDEX_SECOND]);
3386         } else {
3387             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3388                 env, asyncContext->errorCode, asyncContext->eventId);
3389             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3390         }
3391         napi_value callback = nullptr;
3392         napi_get_reference_value(env, asyncContext->callbackRef, &callback);
3393         napi_value result = nullptr;
3394         napi_status ret = napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3395         TELEPHONY_LOGI("callback result = %{public}d", ret);
3396         napi_delete_reference(env, asyncContext->callbackRef);
3397     }
3398     napi_delete_async_work(env, asyncContext->work);
3399     delete asyncContext;
3400     asyncContext = nullptr;
3401 }
3402 
NativePropertyCallBack(napi_env env,napi_status status,void * data)3403 void NapiCallManager::NativePropertyCallBack(napi_env env, napi_status status, void *data)
3404 {
3405     if (data == nullptr) {
3406         TELEPHONY_LOGE("data is nullptr");
3407         return;
3408     }
3409     auto asyncContext = (AsyncContext *)data;
3410     if (asyncContext->deferred != nullptr) {
3411         napi_value promiseValue = nullptr;
3412         napi_create_int32(env, asyncContext->resolved, &promiseValue);
3413         napi_resolve_deferred(env, asyncContext->deferred, promiseValue);
3414     } else {
3415         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3416         callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3417         napi_create_int32(env, asyncContext->resolved, &callbackValue[ARRAY_INDEX_SECOND]);
3418         napi_value callback = nullptr;
3419         napi_value result = nullptr;
3420         napi_get_reference_value(env, asyncContext->callbackRef, &callback);
3421         napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3422         napi_delete_reference(env, asyncContext->callbackRef);
3423     }
3424     napi_delete_async_work(env, asyncContext->work);
3425     delete asyncContext;
3426     asyncContext = nullptr;
3427 }
3428 
NativeGetMainCallIdCallBack(napi_env env,napi_status status,void * data)3429 void NapiCallManager::NativeGetMainCallIdCallBack(napi_env env, napi_status status, void *data)
3430 {
3431     if (data == nullptr) {
3432         TELEPHONY_LOGE("NapiCallManager::NativeGetMainCallIdCallBack data is nullptr");
3433         NapiUtil::ThrowParameterError(env);
3434         return;
3435     }
3436     auto asyncContext = (IntResultAsyncContext *)data;
3437     if (asyncContext->deferred != nullptr) {
3438         if (asyncContext->resolved == TELEPHONY_SUCCESS) {
3439             napi_value promiseValue = nullptr;
3440             napi_create_int32(env, asyncContext->result, &promiseValue);
3441             napi_status ret = napi_resolve_deferred(env, asyncContext->deferred, promiseValue);
3442             TELEPHONY_LOGI("promise successful result = %{public}d", ret);
3443         } else {
3444             JsError error = NapiUtil::ConverErrorMessageForJs(asyncContext->errorCode);
3445             napi_status ret = napi_reject_deferred(env, asyncContext->deferred,
3446                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode));
3447             TELEPHONY_LOGI("promise failed result = %{public}d", ret);
3448         }
3449     } else if (asyncContext->callbackRef != nullptr) {
3450         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3451         if (asyncContext->resolved == TELEPHONY_SUCCESS) {
3452             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3453             napi_create_int32(env, asyncContext->result, &callbackValue[ARRAY_INDEX_SECOND]);
3454         } else {
3455             JsError error = NapiUtil::ConverErrorMessageForJs(asyncContext->errorCode);
3456             callbackValue[ARRAY_INDEX_FIRST] =
3457                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode);
3458             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3459         }
3460         napi_value callback = nullptr;
3461         napi_get_reference_value(env, asyncContext->callbackRef, &callback);
3462         napi_value result = nullptr;
3463         napi_status ret = napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3464         TELEPHONY_LOGI("callback result = %{public}d", ret);
3465         napi_delete_reference(env, asyncContext->callbackRef);
3466     }
3467     napi_delete_async_work(env, asyncContext->work);
3468     delete asyncContext;
3469     asyncContext = nullptr;
3470 }
3471 
NativeIsImsSwitchEnabledCallBack(napi_env env,napi_status status,void * data)3472 void NapiCallManager::NativeIsImsSwitchEnabledCallBack(napi_env env, napi_status status, void *data)
3473 {
3474     if (data == nullptr) {
3475         TELEPHONY_LOGE("NapiCallManager::NativeIsImsSwitchEnabledCallBack data is nullptr");
3476         NapiUtil::ThrowParameterError(env);
3477         return;
3478     }
3479     auto asyncContext = (ImsSwitchAsyncContext *)data;
3480     if (asyncContext->deferred != nullptr) {
3481         if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
3482             napi_value promiseValue = nullptr;
3483             napi_get_boolean(env, asyncContext->enabled, &promiseValue);
3484             napi_resolve_deferred(env, asyncContext->deferred, promiseValue);
3485         } else {
3486             JsError error = NapiUtil::ConverErrorMessageForJs(asyncContext->errorCode);
3487             napi_reject_deferred(env, asyncContext->deferred,
3488                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode));
3489         }
3490     } else {
3491         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3492         if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
3493             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3494             napi_get_boolean(env, asyncContext->enabled, &callbackValue[ARRAY_INDEX_SECOND]);
3495         } else {
3496             JsError error = NapiUtil::ConverErrorMessageForJs(asyncContext->errorCode);
3497             callbackValue[ARRAY_INDEX_FIRST] =
3498                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode);
3499             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3500         }
3501         napi_value callback = nullptr;
3502         napi_value result = nullptr;
3503         napi_get_reference_value(env, asyncContext->callbackRef, &callback);
3504         napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3505         napi_delete_reference(env, asyncContext->callbackRef);
3506     }
3507     napi_delete_async_work(env, asyncContext->work);
3508     delete asyncContext;
3509     asyncContext = nullptr;
3510 }
3511 
NativeGetVoNRStateCallBack(napi_env env,napi_status status,void * data)3512 void NapiCallManager::NativeGetVoNRStateCallBack(napi_env env, napi_status status, void *data)
3513 {
3514     if (data == nullptr) {
3515         TELEPHONY_LOGE("NapiCallManager::NativeGetVoNRStateCallBack data is nullptr");
3516         NapiUtil::ThrowParameterError(env);
3517         return;
3518     }
3519     auto getVoNRStateContext = (VoNRSwitchAsyncContext *)data;
3520     if (getVoNRStateContext->deferred != nullptr) {
3521         if (getVoNRStateContext->errorCode == TELEPHONY_SUCCESS) {
3522             napi_value promiseValue = nullptr;
3523             napi_create_int32(env, getVoNRStateContext->state, &promiseValue);
3524             napi_resolve_deferred(env, getVoNRStateContext->deferred, promiseValue);
3525         } else {
3526             napi_reject_deferred(env, getVoNRStateContext->deferred,
3527                 NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3528                     env, getVoNRStateContext->errorCode, getVoNRStateContext->eventId));
3529         }
3530     } else {
3531         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3532         if (getVoNRStateContext->errorCode == TELEPHONY_SUCCESS) {
3533             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3534             napi_create_int32(env, getVoNRStateContext->state, &callbackValue[ARRAY_INDEX_SECOND]);
3535         } else {
3536             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3537                 env, getVoNRStateContext->errorCode, getVoNRStateContext->eventId);
3538             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3539         }
3540         napi_value callback = nullptr;
3541         napi_value result = nullptr;
3542         napi_get_reference_value(env, getVoNRStateContext->callbackRef, &callback);
3543         napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3544         napi_delete_reference(env, getVoNRStateContext->callbackRef);
3545     }
3546     napi_delete_async_work(env, getVoNRStateContext->work);
3547     delete getVoNRStateContext;
3548     getVoNRStateContext = nullptr;
3549 }
3550 
NativeBoolCallBack(napi_env env,napi_status status,void * data)3551 void NapiCallManager::NativeBoolCallBack(napi_env env, napi_status status, void *data)
3552 {
3553     if (data == nullptr) {
3554         TELEPHONY_LOGE("data is nullptr");
3555         return;
3556     }
3557     auto boolCallBackContext = (AsyncContext *)data;
3558     if (boolCallBackContext->deferred != nullptr) {
3559         if (boolCallBackContext->resolved == BOOL_VALUE_IS_TRUE) {
3560             napi_value promiseValue = nullptr;
3561             napi_get_boolean(env, true, &promiseValue);
3562             napi_resolve_deferred(env, boolCallBackContext->deferred, promiseValue);
3563         } else if (boolCallBackContext->errorCode == TELEPHONY_SUCCESS) {
3564             napi_value promiseValue = nullptr;
3565             napi_get_boolean(env, false, &promiseValue);
3566             napi_resolve_deferred(env, boolCallBackContext->deferred, promiseValue);
3567         } else if (boolCallBackContext->errorCode == SLOT_ID_INVALID) {
3568             napi_reject_deferred(env, boolCallBackContext->deferred,
3569                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, "slotId is invalid", SLOT_ID_INVALID));
3570         } else {
3571             std::string errTip = std::to_string(boolCallBackContext->errorCode);
3572             napi_reject_deferred(
3573                 env, boolCallBackContext->deferred, NapiCallManagerUtils::CreateErrorMessage(env, errTip));
3574         }
3575     } else {
3576         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3577         if (boolCallBackContext->resolved == BOOL_VALUE_IS_TRUE) {
3578             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3579             napi_get_boolean(env, true, &callbackValue[ARRAY_INDEX_SECOND]);
3580         } else if (boolCallBackContext->errorCode == TELEPHONY_SUCCESS) {
3581             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3582             napi_get_boolean(env, false, &callbackValue[ARRAY_INDEX_SECOND]);
3583         } else if (boolCallBackContext->errorCode == SLOT_ID_INVALID) {
3584             callbackValue[ARRAY_INDEX_FIRST] =
3585                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, "slotId is invalid", SLOT_ID_INVALID);
3586             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3587         } else {
3588             std::string errTip = std::to_string(boolCallBackContext->errorCode);
3589             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorMessage(env, errTip);
3590             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3591         }
3592         napi_value callback = nullptr;
3593         napi_value result = nullptr;
3594         napi_get_reference_value(env, boolCallBackContext->callbackRef, &callback);
3595         napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3596         napi_delete_reference(env, boolCallBackContext->callbackRef);
3597     }
3598     napi_delete_async_work(env, boolCallBackContext->work);
3599     delete boolCallBackContext;
3600     boolCallBackContext = nullptr;
3601 }
3602 
NativeIsEmergencyPhoneNumberCallBack(napi_env env,napi_status status,void * data)3603 void NapiCallManager::NativeIsEmergencyPhoneNumberCallBack(napi_env env, napi_status status, void *data)
3604 {
3605     if (data == nullptr) {
3606         TELEPHONY_LOGE("NapiCallManager::NativeIsEmergencyPhoneNumberCallBack data is nullptr");
3607         NapiUtil::ThrowParameterError(env);
3608         return;
3609     }
3610     auto asyncContext = (UtilsAsyncContext *)data;
3611     if (asyncContext->deferred != nullptr) {
3612         if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
3613             napi_value promiseValue = nullptr;
3614             napi_get_boolean(env, asyncContext->enabled, &promiseValue);
3615             napi_status ret = napi_resolve_deferred(env, asyncContext->deferred, promiseValue);
3616             TELEPHONY_LOGI("promise failed result = %{public}d", ret);
3617         } else {
3618             JsError error = NapiUtil::ConverErrorMessageForJs(asyncContext->errorCode);
3619             napi_status ret = napi_reject_deferred(env, asyncContext->deferred,
3620                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode));
3621             TELEPHONY_LOGI("promise failed result = %{public}d", ret);
3622         }
3623     } else if (asyncContext->callbackRef != nullptr) {
3624         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3625         if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
3626             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3627             napi_get_boolean(env, asyncContext->enabled, &callbackValue[ARRAY_INDEX_SECOND]);
3628         } else {
3629             JsError error = NapiUtil::ConverErrorMessageForJs(asyncContext->errorCode);
3630             callbackValue[ARRAY_INDEX_FIRST] =
3631                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode);
3632             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3633         }
3634         napi_value callback = nullptr;
3635         napi_value result = nullptr;
3636         napi_get_reference_value(env, asyncContext->callbackRef, &callback);
3637         napi_status ret = napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3638         TELEPHONY_LOGI("callback result = %{public}d", ret);
3639         napi_delete_reference(env, asyncContext->callbackRef);
3640     }
3641     napi_delete_async_work(env, asyncContext->work);
3642     delete asyncContext;
3643     asyncContext = nullptr;
3644 }
3645 
NativeBoolCallBackWithErrorCode(napi_env env,napi_status status,void * data)3646 void NapiCallManager::NativeBoolCallBackWithErrorCode(napi_env env, napi_status status, void *data)
3647 {
3648     if (data == nullptr) {
3649         TELEPHONY_LOGE("NapiCallManager::NativeBoolCallBackWithErrorCode data is nullptr");
3650         NapiUtil::ThrowParameterError(env);
3651         return;
3652     }
3653     auto asyncContext = (BoolResultAsyncContext *)data;
3654     if (asyncContext->deferred != nullptr) {
3655         if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
3656             napi_value promiseValue = nullptr;
3657             napi_get_boolean(env, asyncContext->enabled, &promiseValue);
3658             napi_status ret = napi_resolve_deferred(env, asyncContext->deferred, promiseValue);
3659             TELEPHONY_LOGI("promise failed result = %{public}d", ret);
3660         } else {
3661             napi_status ret = napi_reject_deferred(env, asyncContext->deferred,
3662                 NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3663                     env, asyncContext->errorCode, asyncContext->eventId));
3664             TELEPHONY_LOGI("promise failed result = %{public}d", ret);
3665         }
3666     } else if (asyncContext->callbackRef != nullptr) {
3667         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3668         if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
3669             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3670             napi_get_boolean(env, asyncContext->enabled, &callbackValue[ARRAY_INDEX_SECOND]);
3671         } else {
3672             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3673                 env, asyncContext->errorCode, asyncContext->eventId);
3674             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3675         }
3676         napi_value callback = nullptr;
3677         napi_value result = nullptr;
3678         napi_get_reference_value(env, asyncContext->callbackRef, &callback);
3679         napi_status ret = napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3680         TELEPHONY_LOGI("callback result = %{public}d", ret);
3681         napi_delete_reference(env, asyncContext->callbackRef);
3682     }
3683     napi_delete_async_work(env, asyncContext->work);
3684     delete asyncContext;
3685     asyncContext = nullptr;
3686 }
3687 
NativeFormatNumberCallBack(napi_env env,napi_status status,void * data)3688 void NapiCallManager::NativeFormatNumberCallBack(napi_env env, napi_status status, void *data)
3689 {
3690     if (data == nullptr) {
3691         TELEPHONY_LOGE("NapiCallManager::NativeFormatNumberCallBack data is nullptr");
3692         NapiUtil::ThrowParameterError(env);
3693         return;
3694     }
3695     auto formatNumberContext = (UtilsAsyncContext *)data;
3696     if (formatNumberContext->deferred != nullptr) {
3697         if (formatNumberContext->resolved == TELEPHONY_SUCCESS) {
3698             napi_value promiseValue = nullptr;
3699             napi_create_string_utf8(env, Str16ToStr8(formatNumberContext->formatNumber).data(),
3700                 formatNumberContext->formatNumber.length(), &promiseValue);
3701             napi_status ret = napi_resolve_deferred(env, formatNumberContext->deferred, promiseValue);
3702             TELEPHONY_LOGD("promise successful result = %{public}d", ret);
3703         } else {
3704             JsError error = NapiUtil::ConverErrorMessageForJs(formatNumberContext->errorCode);
3705             napi_status ret = napi_reject_deferred(env, formatNumberContext->deferred,
3706                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode));
3707             TELEPHONY_LOGI("promise failed result = %{public}d", ret);
3708         }
3709     } else if (formatNumberContext->callbackRef != nullptr) {
3710         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3711         if (formatNumberContext->resolved == TELEPHONY_SUCCESS) {
3712             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3713             napi_create_string_utf8(env, Str16ToStr8(formatNumberContext->formatNumber).data(),
3714                 formatNumberContext->formatNumber.length(), &callbackValue[ARRAY_INDEX_SECOND]);
3715         } else {
3716             JsError error = NapiUtil::ConverErrorMessageForJs(formatNumberContext->errorCode);
3717             callbackValue[ARRAY_INDEX_FIRST] =
3718                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode);
3719             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3720         }
3721         napi_value callback = nullptr;
3722         napi_value result = nullptr;
3723         napi_get_reference_value(env, formatNumberContext->callbackRef, &callback);
3724         napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3725         napi_delete_reference(env, formatNumberContext->callbackRef);
3726     }
3727     napi_delete_async_work(env, formatNumberContext->work);
3728     delete formatNumberContext;
3729     formatNumberContext = nullptr;
3730 }
3731 
NativeListCallBack(napi_env env,napi_status status,void * data)3732 void NapiCallManager::NativeListCallBack(napi_env env, napi_status status, void *data)
3733 {
3734     if (data == nullptr) {
3735         NapiUtil::ThrowParameterError(env);
3736         return;
3737     }
3738     int32_t i = 0;
3739     napi_value info = nullptr;
3740     auto listCallBakcContext = (ListAsyncContext *)data;
3741     std::vector<std::u16string>::iterator it = listCallBakcContext->listResult.begin();
3742     if (listCallBakcContext->deferred != nullptr) {
3743         if (listCallBakcContext->resolved == TELEPHONY_SUCCESS) {
3744             napi_value promiseValue = nullptr;
3745             napi_create_array(env, &promiseValue);
3746             for (; it != listCallBakcContext->listResult.end(); ++it) {
3747                 napi_create_string_utf8(env, Str16ToStr8(*it).data(), (*it).length(), &info);
3748                 napi_set_element(env, promiseValue, i, info);
3749                 ++i;
3750             }
3751             napi_resolve_deferred(env, listCallBakcContext->deferred, promiseValue);
3752         } else {
3753             napi_reject_deferred(env, listCallBakcContext->deferred,
3754                 NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3755                     env, listCallBakcContext->errorCode, listCallBakcContext->eventId));
3756         }
3757     } else if (listCallBakcContext->callbackRef != nullptr) {
3758         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3759         if (listCallBakcContext->resolved == TELEPHONY_SUCCESS) {
3760             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3761             napi_create_array(env, &callbackValue[ARRAY_INDEX_SECOND]);
3762             for (; it != listCallBakcContext->listResult.end(); ++it) {
3763                 napi_create_string_utf8(env, Str16ToStr8(*it).data(), (*it).length(), &info);
3764                 napi_set_element(env, callbackValue[ARRAY_INDEX_SECOND], i, info);
3765                 ++i;
3766             }
3767         } else {
3768             callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorCodeAndMessageForJs(
3769                 env, listCallBakcContext->errorCode, listCallBakcContext->eventId);
3770             callbackValue[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
3771         }
3772         napi_value callback = nullptr;
3773         napi_value result = nullptr;
3774         napi_get_reference_value(env, listCallBakcContext->callbackRef, &callback);
3775         napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &result);
3776         napi_delete_reference(env, listCallBakcContext->callbackRef);
3777     }
3778     napi_delete_async_work(env, listCallBakcContext->work);
3779     delete listCallBakcContext;
3780     listCallBakcContext = nullptr;
3781 }
3782 
NativeOffCallBack(napi_env env,napi_status status,void * data)3783 void NapiCallManager::NativeOffCallBack(napi_env env, napi_status status, void *data)
3784 {
3785     if (data == nullptr) {
3786         TELEPHONY_LOGE("NapiCallManager::NativeOffCallBack data is nullptr");
3787         NapiUtil::ThrowParameterError(env);
3788         return;
3789     }
3790     auto asyncContext = (AsyncContext *)data;
3791     if (asyncContext->deferred != nullptr) {
3792         napi_value promiseValue = nullptr;
3793         napi_get_null(env, &promiseValue);
3794         napi_status ret = napi_resolve_deferred(env, asyncContext->deferred, promiseValue);
3795         TELEPHONY_LOGI("promise result = %{public}d", ret);
3796     } else if (asyncContext->callbackRef != nullptr) {
3797         napi_value callbackValue[ARRAY_INDEX_THIRD] = { 0 };
3798         callbackValue[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
3799         napi_value callback = nullptr;
3800         napi_value result = nullptr;
3801         napi_get_reference_value(env, asyncContext->callbackRef, &callback);
3802         napi_status ret = napi_call_function(env, nullptr, callback, DATA_LENGTH_ONE, callbackValue, &result);
3803         TELEPHONY_LOGI("callback result = %{public}d", ret);
3804         napi_delete_reference(env, asyncContext->callbackRef);
3805     }
3806     napi_delete_async_work(env, asyncContext->work);
3807     delete asyncContext;
3808     asyncContext = nullptr;
3809 }
3810 
GetDialInfo(napi_env env,napi_value objValue,DialAsyncContext & asyncContext)3811 void NapiCallManager::GetDialInfo(napi_env env, napi_value objValue, DialAsyncContext &asyncContext)
3812 {
3813     asyncContext.accountId = NapiCallManagerUtils::GetIntProperty(env, objValue, "accountId");
3814     asyncContext.videoState = NapiCallManagerUtils::GetIntProperty(env, objValue, "videoState");
3815     asyncContext.dialScene = NapiCallManagerUtils::GetIntProperty(env, objValue, "dialScene");
3816     asyncContext.dialType = NapiCallManagerUtils::GetIntProperty(env, objValue, "dialType");
3817 }
3818 
GetSmsInfo(napi_env env,napi_value objValue,RejectAsyncContext & asyncContext)3819 void NapiCallManager::GetSmsInfo(napi_env env, napi_value objValue, RejectAsyncContext &asyncContext)
3820 {
3821     asyncContext.isSendSms = true;
3822     asyncContext.messageContent = NapiCallManagerUtils::GetStringProperty(env, objValue, "messageContent");
3823 }
3824 
GetRestrictionInfo(napi_env env,napi_value objValue,CallRestrictionAsyncContext & asyncContext)3825 int32_t NapiCallManager::GetRestrictionInfo(
3826     napi_env env, napi_value objValue, CallRestrictionAsyncContext &asyncContext)
3827 {
3828     int32_t type = 0;
3829     int32_t mode = 0;
3830     std::string pw = "";
3831     if (!NapiCallManagerUtils::GetUssdIntProperty(env, objValue, "type", type) ||
3832         !NapiCallManagerUtils::GetUssdIntProperty(env, objValue, "mode", mode) ||
3833         !NapiCallManagerUtils::GetUssdStringProperty(env, objValue, "password", pw)) {
3834         NapiUtil::ThrowParameterError(env);
3835         return ERROR_PARAMETER_TYPE_INVALID;
3836     }
3837     if (pw.length() > static_cast<size_t>(kMaxNumberLen)) {
3838         TELEPHONY_LOGE("Number out of limit!");
3839         return TELEPHONY_ERR_ARGUMENT_INVALID;
3840     }
3841     if (memcpy_s(asyncContext.info.password, kMaxNumberLen, pw.c_str(), pw.length()) != EOK) {
3842         TELEPHONY_LOGE("memcpy_s failed!");
3843         return TELEPHONY_ERR_MEMCPY_FAIL;
3844     }
3845     asyncContext.info.fac = static_cast<CallRestrictionType>(type);
3846     asyncContext.info.mode = static_cast<CallRestrictionMode>(mode);
3847     TELEPHONY_LOGI("GetRestrictionInfo: type = %{public}d, mode = %{public}d",
3848         asyncContext.info.fac, asyncContext.info.mode);
3849     return TELEPHONY_SUCCESS;
3850 }
3851 
GetTransferInfo(napi_env env,napi_value objValue,CallTransferAsyncContext & asyncContext)3852 int32_t NapiCallManager::GetTransferInfo(napi_env env, napi_value objValue, CallTransferAsyncContext &asyncContext)
3853 {
3854     int32_t type = 0;
3855     int32_t settingType = 0;
3856     std::string transferNum = "";
3857     if (!NapiCallManagerUtils::GetUssdIntProperty(env, objValue, "type", type) ||
3858         !NapiCallManagerUtils::GetUssdIntProperty(env, objValue, "settingType", settingType) ||
3859         !NapiCallManagerUtils::GetUssdStringProperty(env, objValue, "transferNum", transferNum)) {
3860         return ERROR_PARAMETER_TYPE_INVALID;
3861     }
3862     int32_t startHour = NapiCallManagerUtils::GetIntProperty(env, objValue, "startHour");
3863     int32_t startMinute = NapiCallManagerUtils::GetIntProperty(env, objValue, "startMinute");
3864     int32_t endHour = NapiCallManagerUtils::GetIntProperty(env, objValue, "endHour");
3865     int32_t endMinute = NapiCallManagerUtils::GetIntProperty(env, objValue, "endMinute");
3866     if (transferNum.length() > static_cast<size_t>(kMaxNumberLen)) {
3867         TELEPHONY_LOGE("Number out of limit!");
3868         return TELEPHONY_ERR_ARGUMENT_INVALID;
3869     }
3870     if (memcpy_s(asyncContext.info.transferNum, kMaxNumberLen, transferNum.c_str(), transferNum.length()) != EOK) {
3871         TELEPHONY_LOGE("memcpy_s failed!");
3872         return TELEPHONY_ERR_MEMCPY_FAIL;
3873     }
3874     asyncContext.info.settingType = static_cast<CallTransferSettingType>(settingType);
3875     asyncContext.info.type = static_cast<CallTransferType>(type);
3876     asyncContext.info.startHour = startHour;
3877     asyncContext.info.startMinute = startMinute;
3878     asyncContext.info.endHour = endHour;
3879     asyncContext.info.endMinute = endMinute;
3880     TELEPHONY_LOGI(
3881         "GetTransferInfo: type = %{public}d, settingType = %{public}d, startHour = %{public}d, startMinute = "
3882         "%{public}d, endHour = %{public}d, endMinute = %{public}d",
3883         asyncContext.info.type, asyncContext.info.settingType, asyncContext.info.startHour,
3884         asyncContext.info.startMinute, asyncContext.info.endHour, asyncContext.info.endMinute);
3885     return TELEPHONY_SUCCESS;
3886 }
3887 
NativeDial(napi_env env,void * data)3888 void NapiCallManager::NativeDial(napi_env env, void *data)
3889 {
3890     if (data == nullptr) {
3891         TELEPHONY_LOGE("data is nullptr");
3892         return;
3893     }
3894     auto asyncContext = (DialAsyncContext *)data;
3895     if (!IsValidSlotId(asyncContext->accountId)) {
3896         TELEPHONY_LOGE("NativeDial slotId is invalid");
3897         asyncContext->errorCode = SLOT_ID_INVALID;
3898         return;
3899     }
3900     std::string phoneNumber(asyncContext->number, asyncContext->numberLen);
3901     OHOS::AppExecFwk::PacMap dialInfo;
3902     dialInfo.PutIntValue("accountId", asyncContext->accountId);
3903     dialInfo.PutIntValue("videoState", asyncContext->videoState);
3904     dialInfo.PutIntValue("dialScene", asyncContext->dialScene);
3905     dialInfo.PutIntValue("dialType", asyncContext->dialType);
3906     asyncContext->resolved =
3907         DelayedSingleton<CallManagerClient>::GetInstance()->DialCall(Str8ToStr16(phoneNumber), dialInfo);
3908 }
3909 
NativeDialCall(napi_env env,void * data)3910 void NapiCallManager::NativeDialCall(napi_env env, void *data)
3911 {
3912     if (data == nullptr) {
3913         TELEPHONY_LOGE("NapiCallManager::NativeDialCall data is nullptr");
3914         NapiUtil::ThrowParameterError(env);
3915         return;
3916     }
3917     auto asyncContext = (DialAsyncContext *)data;
3918     if (!IsValidSlotId(asyncContext->accountId)) {
3919         TELEPHONY_LOGE("NativeDialCall slotId is invalid");
3920         asyncContext->errorCode = SLOT_ID_INVALID;
3921         return;
3922     }
3923     asyncContext->eventId = CALL_MANAGER_DIAL_CALL;
3924     std::string phoneNumber(asyncContext->number, asyncContext->numberLen);
3925     std::u16string tmpPhoneNumber = Str8ToStr16(phoneNumber);
3926     bool isEmergencyNumber = false;
3927     if (!(DelayedSingleton<CallManagerClient>::GetInstance()->IsEmergencyPhoneNumber(
3928         tmpPhoneNumber, asyncContext->accountId, isEmergencyNumber) == TELEPHONY_SUCCESS && isEmergencyNumber)) {
3929         int32_t state;
3930         DelayedSingleton<CallManagerClient>::GetInstance()->GetVoIPCallState(state);
3931         if (state == (int32_t)CallStateToApp::CALL_STATE_OFFHOOK
3932             || state == (int32_t)CallStateToApp::CALL_STATE_RINGING) {
3933             TELEPHONY_LOGE("VoIP CALL is active, cannot dial now");
3934             asyncContext->errorCode = CALL_ERR_CALL_COUNTS_EXCEED_LIMIT;
3935             return;
3936         }
3937     }
3938 
3939     OHOS::AppExecFwk::PacMap dialInfo;
3940     dialInfo.PutIntValue("accountId", asyncContext->accountId);
3941     dialInfo.PutIntValue("videoState", asyncContext->videoState);
3942     dialInfo.PutIntValue("dialScene", asyncContext->dialScene);
3943     dialInfo.PutIntValue("dialType", asyncContext->dialType);
3944     asyncContext->errorCode =
3945         DelayedSingleton<CallManagerClient>::GetInstance()->DialCall(Str8ToStr16(phoneNumber), dialInfo);
3946     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
3947         asyncContext->resolved = TELEPHONY_SUCCESS;
3948     }
3949 }
3950 
NativeMakeCall(napi_env env,void * data)3951 void NapiCallManager::NativeMakeCall(napi_env env, void *data)
3952 {
3953     if (data == nullptr) {
3954         TELEPHONY_LOGE("NapiCallManager::NativeMakeCall data is nullptr");
3955         NapiUtil::ThrowParameterError(env);
3956         return;
3957     }
3958     auto asyncContext = (AsyncContext *)data;
3959     std::string phoneNumber(asyncContext->number, asyncContext->numberLen);
3960     AAFwk::Want want;
3961     AppExecFwk::ElementName element("", "com.ohos.contacts", "com.ohos.contacts.MainAbility");
3962     want.SetElement(element);
3963     AAFwk::WantParams wantParams;
3964     wantParams.SetParam("phoneNumber", AAFwk::String::Box(phoneNumber));
3965     wantParams.SetParam("pageFlag", AAFwk::String::Box("page_flag_edit_before_calling"));
3966     wantParams.SetParam(AAFwk::Want::PARAM_BACK_TO_OTHER_MISSION_STACK, AAFwk::Boolean::Box(true));
3967     want.SetParams(wantParams);
3968     ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want);
3969     if (err != ERR_OK) {
3970         TELEPHONY_LOGE("Fail to make call, err:%{public}d", err);
3971         asyncContext->errorCode = TELEPHONY_ERR_UNINIT;
3972         return;
3973     }
3974     asyncContext->resolved = TELEPHONY_SUCCESS;
3975 }
3976 
NativeAnswerCall(napi_env env,void * data)3977 void NapiCallManager::NativeAnswerCall(napi_env env, void *data)
3978 {
3979     if (data == nullptr) {
3980         TELEPHONY_LOGE("NapiCallManager::NativeAnswerCall data is nullptr");
3981         NapiUtil::ThrowParameterError(env);
3982         return;
3983     }
3984     auto asyncContext = (AnswerAsyncContext *)data;
3985     asyncContext->errorCode =
3986         DelayedSingleton<CallManagerClient>::GetInstance()->AnswerCall(asyncContext->callId, asyncContext->videoState);
3987     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
3988         asyncContext->resolved = TELEPHONY_SUCCESS;
3989     }
3990     asyncContext->eventId = CALL_MANAGER_ANSWER_CALL;
3991 }
3992 
NativeRejectCall(napi_env env,void * data)3993 void NapiCallManager::NativeRejectCall(napi_env env, void *data)
3994 {
3995     if (data == nullptr) {
3996         TELEPHONY_LOGE("NapiCallManager::NativeRejectCall data is nullptr");
3997         NapiUtil::ThrowParameterError(env);
3998         return;
3999     }
4000     auto asyncContext = (RejectAsyncContext *)data;
4001     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->RejectCall(
4002         asyncContext->callId, asyncContext->isSendSms, Str8ToStr16(asyncContext->messageContent));
4003     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4004         asyncContext->resolved = TELEPHONY_SUCCESS;
4005     }
4006     asyncContext->eventId = CALL_MANAGER_REJECT_CALL;
4007 }
4008 
NativeHangUpCall(napi_env env,void * data)4009 void NapiCallManager::NativeHangUpCall(napi_env env, void *data)
4010 {
4011     if (data == nullptr) {
4012         TELEPHONY_LOGE("NapiCallManager::NativeHangUpCall data is nullptr");
4013         NapiUtil::ThrowParameterError(env);
4014         return;
4015     }
4016     auto asyncContext = (AsyncContext *)data;
4017     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->HangUpCall(asyncContext->callId);
4018     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4019         asyncContext->resolved = TELEPHONY_SUCCESS;
4020     }
4021     asyncContext->eventId = CALL_MANAGER_DISCONNECT_CALL;
4022 }
4023 
NativeHoldCall(napi_env env,void * data)4024 void NapiCallManager::NativeHoldCall(napi_env env, void *data)
4025 {
4026     if (data == nullptr) {
4027         TELEPHONY_LOGE("NapiCallManager::NativeHoldCall data is nullptr");
4028         NapiUtil::ThrowParameterError(env);
4029         return;
4030     }
4031     auto asyncContext = (AsyncContext *)data;
4032     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->HoldCall(asyncContext->callId);
4033     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4034         asyncContext->resolved = TELEPHONY_SUCCESS;
4035     }
4036     asyncContext->eventId = CALL_MANAGER_HOLD_CALL;
4037 }
4038 
NativeUnHoldCall(napi_env env,void * data)4039 void NapiCallManager::NativeUnHoldCall(napi_env env, void *data)
4040 {
4041     if (data == nullptr) {
4042         TELEPHONY_LOGE("NapiCallManager::NativeUnHoldCall data is nullptr");
4043         NapiUtil::ThrowParameterError(env);
4044         return;
4045     }
4046     auto asyncContext = (AsyncContext *)data;
4047     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->UnHoldCall(asyncContext->callId);
4048     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4049         asyncContext->resolved = TELEPHONY_SUCCESS;
4050     }
4051     asyncContext->eventId = CALL_MANAGER_UNHOLD_CALL;
4052 }
4053 
NativeSwitchCall(napi_env env,void * data)4054 void NapiCallManager::NativeSwitchCall(napi_env env, void *data)
4055 {
4056     if (data == nullptr) {
4057         TELEPHONY_LOGE("NapiCallManager::NativeSwitchCall data is nullptr");
4058         NapiUtil::ThrowParameterError(env);
4059         return;
4060     }
4061     auto asyncContext = (AsyncContext *)data;
4062     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SwitchCall(asyncContext->callId);
4063     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4064         asyncContext->resolved = TELEPHONY_SUCCESS;
4065     }
4066     asyncContext->eventId = CALL_MANAGER_SWITCH_CALL;
4067 }
4068 
NativeCombineConference(napi_env env,void * data)4069 void NapiCallManager::NativeCombineConference(napi_env env, void *data)
4070 {
4071     if (data == nullptr) {
4072         TELEPHONY_LOGE("NapiCallManager::NativeCombineConference data is nullptr");
4073         NapiUtil::ThrowParameterError(env);
4074         return;
4075     }
4076     auto asyncContext = (AsyncContext *)data;
4077     asyncContext->errorCode =
4078         DelayedSingleton<CallManagerClient>::GetInstance()->CombineConference(asyncContext->callId);
4079     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4080         asyncContext->resolved = TELEPHONY_SUCCESS;
4081     }
4082 }
4083 
NativeSeparateConference(napi_env env,void * data)4084 void NapiCallManager::NativeSeparateConference(napi_env env, void *data)
4085 {
4086     if (data == nullptr) {
4087         TELEPHONY_LOGE("NapiCallManager::NativeSeparateConference data is nullptr");
4088         NapiUtil::ThrowParameterError(env);
4089         return;
4090     }
4091     auto asyncContext = (AsyncContext *)data;
4092     asyncContext->errorCode =
4093         DelayedSingleton<CallManagerClient>::GetInstance()->SeparateConference(asyncContext->callId);
4094     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4095         asyncContext->resolved = TELEPHONY_SUCCESS;
4096     }
4097 }
4098 
NativeKickOutFromConference(napi_env env,void * data)4099 void NapiCallManager::NativeKickOutFromConference(napi_env env, void *data)
4100 {
4101     if (data == nullptr) {
4102         TELEPHONY_LOGE("NapiCallManager::NativeKickOutFromConference data is nullptr");
4103         NapiUtil::ThrowParameterError(env);
4104         return;
4105     }
4106     auto asyncContext = (AsyncContext *)data;
4107     asyncContext->errorCode =
4108         DelayedSingleton<CallManagerClient>::GetInstance()->KickOutFromConference(asyncContext->callId);
4109     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4110         asyncContext->resolved = TELEPHONY_SUCCESS;
4111     }
4112 }
4113 
NativeGetMainCallId(napi_env env,void * data)4114 void NapiCallManager::NativeGetMainCallId(napi_env env, void *data)
4115 {
4116     if (data == nullptr) {
4117         TELEPHONY_LOGE("NapiCallManager::NativeGetMainCallId data is nullptr");
4118         NapiUtil::ThrowParameterError(env);
4119         return;
4120     }
4121     auto asyncContext = (IntResultAsyncContext *)data;
4122     asyncContext->result = 0;
4123     asyncContext->errorCode =
4124         DelayedSingleton<CallManagerClient>::GetInstance()->GetMainCallId(asyncContext->callId, asyncContext->result);
4125     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4126         asyncContext->resolved = TELEPHONY_SUCCESS;
4127     }
4128 }
4129 
NativeGetSubCallIdList(napi_env env,void * data)4130 void NapiCallManager::NativeGetSubCallIdList(napi_env env, void *data)
4131 {
4132     if (data == nullptr) {
4133         TELEPHONY_LOGE("NapiCallManager::NativeGetSubCallIdList data is nullptr");
4134         NapiUtil::ThrowParameterError(env);
4135         return;
4136     }
4137     auto asyncContext = (ListAsyncContext *)data;
4138     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->GetSubCallIdList(
4139         asyncContext->callId, asyncContext->listResult);
4140     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4141         asyncContext->resolved = TELEPHONY_SUCCESS;
4142     }
4143 }
4144 
NativeGetCallIdListForConference(napi_env env,void * data)4145 void NapiCallManager::NativeGetCallIdListForConference(napi_env env, void *data)
4146 {
4147     if (data == nullptr) {
4148         TELEPHONY_LOGE("NapiCallManager::NativeGetCallIdListForConference data is nullptr");
4149         NapiUtil::ThrowParameterError(env);
4150         return;
4151     }
4152     auto asyncContext = (ListAsyncContext *)data;
4153     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->GetCallIdListForConference(
4154         asyncContext->callId, asyncContext->listResult);
4155     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4156         asyncContext->resolved = TELEPHONY_SUCCESS;
4157     }
4158 }
4159 
4160 /**
4161  * Register a callback to NapiCallAbilityCallback. When call_manager has data returned,
4162  * NapiCallAbilityCallback will notify JavaScript via the registered callback.
4163  * The whole process is asynchronous.
4164  */
NativeGetCallWaiting(napi_env env,void * data)4165 void NapiCallManager::NativeGetCallWaiting(napi_env env, void *data)
4166 {
4167     if (data == nullptr) {
4168         TELEPHONY_LOGE("NapiCallManager::NativeGetCallWaiting data is nullptr");
4169         NapiUtil::ThrowParameterError(env);
4170         return;
4171     }
4172     auto asyncContext = (SupplementAsyncContext *)data;
4173     if (!IsValidSlotId(asyncContext->slotId)) {
4174         TELEPHONY_LOGE("NativeGetCallWaiting slotId is invalid");
4175         asyncContext->errorCode = SLOT_ID_INVALID;
4176         return;
4177     }
4178     EventCallback infoListener;
4179     infoListener.env = asyncContext->env;
4180     infoListener.thisVar = asyncContext->thisVar;
4181     infoListener.callbackRef = asyncContext->callbackRef;
4182     infoListener.deferred = asyncContext->deferred;
4183     asyncContext->errorCode =
4184         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterGetWaitingCallback(infoListener);
4185     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4186         TELEPHONY_LOGE("RegisterGetWaitingCallback failed!");
4187         return;
4188     }
4189     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->GetCallWaiting(asyncContext->slotId);
4190     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4191         asyncContext->eventId = CALL_MANAGER_GET_CALL_WAITING;
4192         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterGetWaitingCallback();
4193         TELEPHONY_LOGE("GetCallWaiting failed!");
4194         return;
4195     }
4196     asyncContext->resolved = TELEPHONY_SUCCESS;
4197     asyncContext->callbackRef = nullptr;
4198     asyncContext->deferred = nullptr;
4199 }
4200 
NativeSetCallWaiting(napi_env env,void * data)4201 void NapiCallManager::NativeSetCallWaiting(napi_env env, void *data)
4202 {
4203     if (data == nullptr) {
4204         TELEPHONY_LOGE("NapiCallManager::NativeSetCallWaiting data is nullptr");
4205         NapiUtil::ThrowParameterError(env);
4206         return;
4207     }
4208     auto asyncContext = (SupplementAsyncContext *)data;
4209     if (!IsValidSlotId(asyncContext->slotId)) {
4210         TELEPHONY_LOGE("NativeSetCallWaiting slotId is invalid");
4211         asyncContext->errorCode = SLOT_ID_INVALID;
4212         return;
4213     }
4214 
4215     EventCallback infoListener;
4216     infoListener.env = asyncContext->env;
4217     infoListener.thisVar = asyncContext->thisVar;
4218     infoListener.callbackRef = asyncContext->callbackRef;
4219     infoListener.deferred = asyncContext->deferred;
4220     asyncContext->errorCode =
4221         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterSetWaitingCallback(infoListener);
4222     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4223         TELEPHONY_LOGE("RegisterSetWaitingCallback failed!");
4224         return;
4225     }
4226     asyncContext->errorCode =
4227         DelayedSingleton<CallManagerClient>::GetInstance()->SetCallWaiting(asyncContext->slotId, asyncContext->flag);
4228     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4229         asyncContext->eventId = CALL_MANAGER_SET_CALL_WAITING;
4230         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterSetWaitingCallback();
4231         TELEPHONY_LOGE("SetCallWaiting failed!");
4232         return;
4233     }
4234     asyncContext->resolved = TELEPHONY_SUCCESS;
4235     asyncContext->callbackRef = nullptr;
4236     asyncContext->deferred = nullptr;
4237 }
4238 
NativeGetCallRestriction(napi_env env,void * data)4239 void NapiCallManager::NativeGetCallRestriction(napi_env env, void *data)
4240 {
4241     if (data == nullptr) {
4242         TELEPHONY_LOGE("NapiCallManager::NativeGetCallRestriction data is nullptr");
4243         NapiUtil::ThrowParameterError(env);
4244         return;
4245     }
4246     auto asyncContext = (SupplementAsyncContext *)data;
4247     if (!IsValidSlotId(asyncContext->slotId)) {
4248         TELEPHONY_LOGE("NativeGetCallRestriction slotId is invalid");
4249         asyncContext->errorCode = SLOT_ID_INVALID;
4250         return;
4251     }
4252     EventCallback infoListener;
4253     infoListener.env = asyncContext->env;
4254     infoListener.thisVar = asyncContext->thisVar;
4255     infoListener.callbackRef = asyncContext->callbackRef;
4256     infoListener.deferred = asyncContext->deferred;
4257     asyncContext->errorCode =
4258         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterGetRestrictionCallback(infoListener);
4259     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4260         TELEPHONY_LOGE("RegisterGetRestrictionCallback failed!");
4261         return;
4262     }
4263     CallRestrictionType type = static_cast<CallRestrictionType>(asyncContext->type);
4264     asyncContext->errorCode =
4265         DelayedSingleton<CallManagerClient>::GetInstance()->GetCallRestriction(asyncContext->slotId, type);
4266     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4267         asyncContext->eventId = CALL_MANAGER_GET_CALL_RESTRICTION;
4268         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterGetRestrictionCallback();
4269         TELEPHONY_LOGE("GetCallRestriction failed!");
4270         return;
4271     }
4272     asyncContext->resolved = TELEPHONY_SUCCESS;
4273     asyncContext->callbackRef = nullptr;
4274     asyncContext->deferred = nullptr;
4275 }
4276 
NativeSetCallRestriction(napi_env env,void * data)4277 void NapiCallManager::NativeSetCallRestriction(napi_env env, void *data)
4278 {
4279     if (data == nullptr) {
4280         TELEPHONY_LOGE("NapiCallManager::NativeSetCallRestriction data is nullptr");
4281         NapiUtil::ThrowParameterError(env);
4282         return;
4283     }
4284     auto asyncContext = (CallRestrictionAsyncContext *)data;
4285     if (!IsValidSlotId(asyncContext->slotId)) {
4286         TELEPHONY_LOGE("NativeSetCallRestriction slotId is invalid");
4287         asyncContext->errorCode = SLOT_ID_INVALID;
4288         return;
4289     }
4290     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4291         TELEPHONY_LOGE("Data acquisition failure!");
4292         return;
4293     }
4294     EventCallback infoListener;
4295     infoListener.env = asyncContext->env;
4296     infoListener.thisVar = asyncContext->thisVar;
4297     infoListener.callbackRef = asyncContext->callbackRef;
4298     infoListener.deferred = asyncContext->deferred;
4299     asyncContext->errorCode =
4300         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterSetRestrictionCallback(infoListener);
4301     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4302         TELEPHONY_LOGE("RegisterSetRestrictionCallback failed!");
4303         return;
4304     }
4305     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetCallRestriction(
4306         asyncContext->slotId, asyncContext->info);
4307     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4308         asyncContext->eventId = CALL_MANAGER_SET_CALL_RESTRICTION;
4309         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterSetRestrictionCallback();
4310         TELEPHONY_LOGE("SetCallRestriction failed!");
4311         return;
4312     }
4313     asyncContext->resolved = TELEPHONY_SUCCESS;
4314     asyncContext->callbackRef = nullptr;
4315     asyncContext->deferred = nullptr;
4316 }
4317 
NativeSetCallRestrictionPassword(napi_env env,void * data)4318 void NapiCallManager::NativeSetCallRestrictionPassword(napi_env env, void *data)
4319 {
4320     if (data == nullptr) {
4321         TELEPHONY_LOGE("data is nullptr");
4322         NapiUtil::ThrowParameterError(env);
4323         return;
4324     }
4325     auto asyncContext = (CallBarringPasswordAsyncContext *)data;
4326     if (!IsValidSlotId(asyncContext->slotId)) {
4327         TELEPHONY_LOGE("slotId is invalid");
4328         asyncContext->errorCode = SLOT_ID_INVALID;
4329         return;
4330     }
4331     EventCallback infoListener;
4332     infoListener.env = asyncContext->env;
4333     infoListener.thisVar = asyncContext->thisVar;
4334     infoListener.callbackRef = asyncContext->callbackRef;
4335     infoListener.deferred = asyncContext->deferred;
4336     asyncContext->errorCode =
4337         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterSetRestrictionPasswordCallback(infoListener);
4338     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4339         TELEPHONY_LOGE("RegisterSetRestrictionPasswordCallback failed!");
4340         return;
4341     }
4342     asyncContext->errorCode =
4343         DelayedSingleton<CallManagerClient>::GetInstance()->SetCallRestrictionPassword(asyncContext->slotId,
4344         CallRestrictionType::RESTRICTION_TYPE_ALL_CALLS, asyncContext->oldPassword, asyncContext->newPassword);
4345     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4346         asyncContext->eventId = CALL_MANAGER_SET_CALL_RESTRICTION_PASSWORD;
4347         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterSetRestrictionPasswordCallback();
4348         TELEPHONY_LOGE("SetCallRestrictionPassword failed!");
4349         return;
4350     }
4351     asyncContext->resolved = TELEPHONY_SUCCESS;
4352     asyncContext->callbackRef = nullptr;
4353     asyncContext->deferred = nullptr;
4354     (void)memset_s(asyncContext->oldPassword, sizeof(asyncContext->oldPassword), 0, sizeof(asyncContext->oldPassword));
4355     (void)memset_s(asyncContext->newPassword, sizeof(asyncContext->newPassword), 0, sizeof(asyncContext->newPassword));
4356 }
4357 
NativeGetTransferNumber(napi_env env,void * data)4358 void NapiCallManager::NativeGetTransferNumber(napi_env env, void *data)
4359 {
4360     if (data == nullptr) {
4361         TELEPHONY_LOGE("NapiCallManager::NativeGetTransferNumber data is nullptr");
4362         NapiUtil::ThrowParameterError(env);
4363         return;
4364     }
4365     auto asyncContext = (SupplementAsyncContext *)data;
4366     if (!IsValidSlotId(asyncContext->slotId)) {
4367         TELEPHONY_LOGE("NativeGetTransferNumber slotId is invalid");
4368         asyncContext->errorCode = SLOT_ID_INVALID;
4369         return;
4370     }
4371     EventCallback infoListener;
4372     infoListener.env = asyncContext->env;
4373     infoListener.thisVar = asyncContext->thisVar;
4374     infoListener.callbackRef = asyncContext->callbackRef;
4375     infoListener.deferred = asyncContext->deferred;
4376     asyncContext->errorCode = DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterGetTransferCallback(
4377         infoListener, asyncContext->type);
4378     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4379         TELEPHONY_LOGE("RegisterGetTransferCallback failed!");
4380         return;
4381     }
4382     CallTransferType type = static_cast<CallTransferType>(asyncContext->type);
4383     asyncContext->errorCode =
4384         DelayedSingleton<CallManagerClient>::GetInstance()->GetCallTransferInfo(asyncContext->slotId, type);
4385     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4386         asyncContext->eventId = CALL_MANAGER_GET_CALL_TRANSFER;
4387         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterGetTransferCallback();
4388         TELEPHONY_LOGE("GetCallTransferInfo failed!");
4389         return;
4390     }
4391     asyncContext->resolved = TELEPHONY_SUCCESS;
4392     asyncContext->callbackRef = nullptr;
4393     asyncContext->deferred = nullptr;
4394 }
4395 
NativeSetTransferNumber(napi_env env,void * data)4396 void NapiCallManager::NativeSetTransferNumber(napi_env env, void *data)
4397 {
4398     if (data == nullptr) {
4399         TELEPHONY_LOGE("NapiCallManager::NativeSetTransferNumber data is nullptr");
4400         NapiUtil::ThrowParameterError(env);
4401         return;
4402     }
4403     auto asyncContext = (CallTransferAsyncContext *)data;
4404     if (!IsValidSlotId(asyncContext->slotId)) {
4405         TELEPHONY_LOGE("NativeSetTransferNumber slotId is invalid");
4406         asyncContext->errorCode = SLOT_ID_INVALID;
4407         return;
4408     }
4409 
4410     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4411         TELEPHONY_LOGE("Data acquisition failure!");
4412         return;
4413     }
4414     EventCallback infoListener;
4415     infoListener.env = asyncContext->env;
4416     infoListener.thisVar = asyncContext->thisVar;
4417     infoListener.callbackRef = asyncContext->callbackRef;
4418     infoListener.deferred = asyncContext->deferred;
4419     asyncContext->errorCode =
4420         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterSetTransferCallback(infoListener);
4421     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4422         TELEPHONY_LOGE("RegisterSetTransferCallback failed!");
4423         return;
4424     }
4425     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetCallTransferInfo(
4426         asyncContext->slotId, asyncContext->info);
4427     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
4428         asyncContext->eventId = CALL_MANAGER_SET_CALL_TRANSFER;
4429         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterSetTransferCallback();
4430         TELEPHONY_LOGE("SetCallTransferInfo failed!");
4431         return;
4432     }
4433     asyncContext->resolved = TELEPHONY_SUCCESS;
4434     asyncContext->callbackRef = nullptr;
4435     asyncContext->deferred = nullptr;
4436 }
4437 
NativeCanSetCallTransferTime(napi_env env,void * data)4438 void NapiCallManager::NativeCanSetCallTransferTime(napi_env env, void *data)
4439 {
4440     if (data == nullptr) {
4441         TELEPHONY_LOGE("data is nullptr");
4442         NapiUtil::ThrowParameterError(env);
4443         return;
4444     }
4445     auto asyncContext = (BoolResultAsyncContext *)data;
4446     if (!IsValidSlotId(asyncContext->slotId)) {
4447         TELEPHONY_LOGE("[slot%{public}d]slotId is invalid", asyncContext->slotId);
4448         asyncContext->errorCode = SLOT_ID_INVALID;
4449         return;
4450     }
4451     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->CanSetCallTransferTime(
4452         asyncContext->slotId, asyncContext->enabled);
4453 }
4454 
NativeEnableImsSwitch(napi_env env,void * data)4455 void NapiCallManager::NativeEnableImsSwitch(napi_env env, void *data)
4456 {
4457     if (data == nullptr) {
4458         TELEPHONY_LOGE("NapiCallManager::NativeEnableImsSwitch data is nullptr");
4459         NapiUtil::ThrowParameterError(env);
4460         return;
4461     }
4462     auto asyncContext = (ImsSwitchAsyncContext *)data;
4463     if (!IsValidSlotId(asyncContext->slotId)) {
4464         TELEPHONY_LOGE("NativeEnableImsSwitch slotId is invalid");
4465         asyncContext->errorCode = SLOT_ID_INVALID;
4466         return;
4467     }
4468     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->EnableImsSwitch(asyncContext->slotId);
4469     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4470         asyncContext->resolved = TELEPHONY_SUCCESS;
4471     }
4472     asyncContext->eventId = CALL_MANAGER_ENABLE_IMS_SWITCH;
4473 }
4474 
NativeDisableImsSwitch(napi_env env,void * data)4475 void NapiCallManager::NativeDisableImsSwitch(napi_env env, void *data)
4476 {
4477     if (data == nullptr) {
4478         TELEPHONY_LOGE("NapiCallManager::NativeDisableImsSwitch data is nullptr");
4479         NapiUtil::ThrowParameterError(env);
4480         return;
4481     }
4482     auto asyncContext = (ImsSwitchAsyncContext *)data;
4483     if (!IsValidSlotId(asyncContext->slotId)) {
4484         TELEPHONY_LOGE("NativeDisableImsSwitch slotId is invalid");
4485         asyncContext->errorCode = SLOT_ID_INVALID;
4486         return;
4487     }
4488     asyncContext->errorCode =
4489         DelayedSingleton<CallManagerClient>::GetInstance()->DisableImsSwitch(asyncContext->slotId);
4490     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4491         asyncContext->resolved = TELEPHONY_SUCCESS;
4492     }
4493     asyncContext->eventId = CALL_MANAGER_DISABLE_IMS_SWITCH;
4494 }
4495 
NativeIsImsSwitchEnabled(napi_env env,void * data)4496 void NapiCallManager::NativeIsImsSwitchEnabled(napi_env env, void *data)
4497 {
4498     if (data == nullptr) {
4499         TELEPHONY_LOGE("NapiCallManager::NativeIsImsSwitchEnabled data is nullptr");
4500         NapiUtil::ThrowParameterError(env);
4501         return;
4502     }
4503     auto asyncContext = (ImsSwitchAsyncContext *)data;
4504     if (!IsValidSlotId(asyncContext->slotId)) {
4505         TELEPHONY_LOGE("NativeIsImsSwitchEnabled slotId is invalid");
4506         asyncContext->errorCode = SLOT_ID_INVALID;
4507         return;
4508     }
4509     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->IsImsSwitchEnabled(
4510         asyncContext->slotId, asyncContext->enabled);
4511     if (asyncContext->enabled) {
4512         asyncContext->resolved = BOOL_VALUE_IS_TRUE;
4513     }
4514 }
4515 
NativeSetVoNRState(napi_env env,void * data)4516 void NapiCallManager::NativeSetVoNRState(napi_env env, void *data)
4517 {
4518     if (data == nullptr) {
4519         TELEPHONY_LOGE("NapiCallManager::NativeSetVoNRState data is nullptr");
4520         NapiUtil::ThrowParameterError(env);
4521         return;
4522     }
4523     auto asyncContext = (VoNRSwitchAsyncContext *)data;
4524     if (!IsValidSlotId(asyncContext->slotId)) {
4525         TELEPHONY_LOGE("NativeSetVoNRState slotId is invalid");
4526         asyncContext->errorCode = SLOT_ID_INVALID;
4527         return;
4528     }
4529     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetVoNRState(
4530         asyncContext->slotId, asyncContext->state);
4531     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4532         asyncContext->resolved = TELEPHONY_SUCCESS;
4533     }
4534     asyncContext->eventId = CALL_MANAGER_SET_VONR_STATE;
4535 }
4536 
NativeGetVoNRState(napi_env env,void * data)4537 void NapiCallManager::NativeGetVoNRState(napi_env env, void *data)
4538 {
4539     if (data == nullptr) {
4540         TELEPHONY_LOGE("NapiCallManager::NativeGetVoNRState data is nullptr");
4541         NapiUtil::ThrowParameterError(env);
4542         return;
4543     }
4544     auto asyncContext = (VoNRSwitchAsyncContext *)data;
4545     if (!IsValidSlotId(asyncContext->slotId)) {
4546         TELEPHONY_LOGE("NativeIsImsSwitchEnabled slotId is invalid");
4547         asyncContext->errorCode = SLOT_ID_INVALID;
4548         return;
4549     }
4550     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->GetVoNRState(
4551         asyncContext->slotId, asyncContext->state);
4552     asyncContext->eventId = CALL_MANAGER_GET_VONR_STATE;
4553 }
4554 
NativeStartDTMF(napi_env env,void * data)4555 void NapiCallManager::NativeStartDTMF(napi_env env, void *data)
4556 {
4557     if (data == nullptr) {
4558         TELEPHONY_LOGE("NapiCallManager::NativeStartDTMF data is nullptr");
4559         NapiUtil::ThrowParameterError(env);
4560         return;
4561     }
4562     auto asyncContext = (AsyncContext *)data;
4563     if (asyncContext->numberLen < TWO_VALUE_LIMIT) {
4564         asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->StartDtmf(
4565             asyncContext->callId, asyncContext->number[ARRAY_INDEX_FIRST]);
4566     } else {
4567         asyncContext->errorCode = TELEPHONY_ERR_ARGUMENT_INVALID;
4568     }
4569     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4570         asyncContext->resolved = TELEPHONY_SUCCESS;
4571     }
4572 }
4573 
NativeStopDTMF(napi_env env,void * data)4574 void NapiCallManager::NativeStopDTMF(napi_env env, void *data)
4575 {
4576     if (data == nullptr) {
4577         TELEPHONY_LOGE("NapiCallManager::NativeStopDTMF data is nullptr");
4578         NapiUtil::ThrowParameterError(env);
4579         return;
4580     }
4581     auto asyncContext = (AsyncContext *)data;
4582     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->StopDtmf(asyncContext->callId);
4583     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4584         asyncContext->resolved = TELEPHONY_SUCCESS;
4585     }
4586 }
4587 
NativePostDialProceed(napi_env env,void * data)4588 void NapiCallManager::NativePostDialProceed(napi_env env, void *data)
4589 {
4590     if (data == nullptr) {
4591         TELEPHONY_LOGE("NapiCallManager::NativePostDialProceed data is nullptr");
4592         NapiUtil::ThrowParameterError(env);
4593         return;
4594     }
4595     auto asyncContext = (PostDialAsyncContext *)data;
4596     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->PostDialProceed(
4597         asyncContext->callId, asyncContext->proceed);
4598     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4599         asyncContext->resolved = TELEPHONY_SUCCESS;
4600     }
4601 }
4602 
NativeGetCallState(napi_env env,void * data)4603 void NapiCallManager::NativeGetCallState(napi_env env, void *data)
4604 {
4605     if (data == nullptr) {
4606         TELEPHONY_LOGE("data is nullptr");
4607         return;
4608     }
4609     auto asyncContext = (AsyncContext *)data;
4610     asyncContext->resolved = DelayedSingleton<CallManagerClient>::GetInstance()->GetCallState();
4611 }
4612 
NativeIsRinging(napi_env env,void * data)4613 void NapiCallManager::NativeIsRinging(napi_env env, void *data)
4614 {
4615     if (data == nullptr) {
4616         TELEPHONY_LOGE("NapiCallManager::NativeIsRinging data is nullptr");
4617         NapiUtil::ThrowParameterError(env);
4618         return;
4619     }
4620     auto asyncContext = (BoolResultAsyncContext *)data;
4621     asyncContext->enabled = false;
4622     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->IsRinging(asyncContext->enabled);
4623     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4624         asyncContext->resolved = TELEPHONY_SUCCESS;
4625     }
4626     asyncContext->eventId = CALL_MANAGER_IS_RINGING;
4627 }
4628 
NativeHasCall(napi_env env,void * data)4629 void NapiCallManager::NativeHasCall(napi_env env, void *data)
4630 {
4631     if (data == nullptr) {
4632         TELEPHONY_LOGE("data is nullptr");
4633         return;
4634     }
4635     auto asyncContext = (AsyncContext *)data;
4636     asyncContext->resolved = DelayedSingleton<CallManagerClient>::GetInstance()->HasCall();
4637 }
4638 
NativeIsNewCallAllowed(napi_env env,void * data)4639 void NapiCallManager::NativeIsNewCallAllowed(napi_env env, void *data)
4640 {
4641     if (data == nullptr) {
4642         TELEPHONY_LOGE("NapiCallManager::NativeIsNewCallAllowed data is nullptr");
4643         NapiUtil::ThrowParameterError(env);
4644         return;
4645     }
4646     auto asyncContext = (BoolResultAsyncContext *)data;
4647     asyncContext->errorCode =
4648         DelayedSingleton<CallManagerClient>::GetInstance()->IsNewCallAllowed(asyncContext->enabled);
4649     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4650         asyncContext->resolved = TELEPHONY_SUCCESS;
4651     }
4652 }
4653 
NativeIsInEmergencyCall(napi_env env,void * data)4654 void NapiCallManager::NativeIsInEmergencyCall(napi_env env, void *data)
4655 {
4656     if (data == nullptr) {
4657         TELEPHONY_LOGE("NapiCallManager::NativeIsInEmergencyCall data is nullptr");
4658         NapiUtil::ThrowParameterError(env);
4659         return;
4660     }
4661     auto asyncContext = (BoolResultAsyncContext *)data;
4662     asyncContext->errorCode =
4663         DelayedSingleton<CallManagerClient>::GetInstance()->IsInEmergencyCall(asyncContext->enabled);
4664     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4665         asyncContext->resolved = TELEPHONY_SUCCESS;
4666     }
4667     asyncContext->eventId = CALL_MANAGER_IS_EMERGENCY_CALL;
4668 }
4669 
NativeIsEmergencyPhoneNumber(napi_env env,void * data)4670 void NapiCallManager::NativeIsEmergencyPhoneNumber(napi_env env, void *data)
4671 {
4672     if (data == nullptr) {
4673         TELEPHONY_LOGE("NapiCallManager::NativeIsEmergencyPhoneNumber data is nullptr");
4674         NapiUtil::ThrowParameterError(env);
4675         return;
4676     }
4677     auto asyncContext = (UtilsAsyncContext *)data;
4678     if (!IsValidSlotId(asyncContext->slotId)) {
4679         TELEPHONY_LOGE("NativeIsEmergencyPhoneNumber slotId is invalid");
4680         asyncContext->errorCode = SLOT_ID_INVALID;
4681         return;
4682     }
4683     std::string tmpPhoneNumber(asyncContext->number, asyncContext->numberLen);
4684     std::u16string phoneNumber = Str8ToStr16(tmpPhoneNumber);
4685     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->IsEmergencyPhoneNumber(
4686         phoneNumber, asyncContext->slotId, asyncContext->enabled);
4687     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4688         asyncContext->resolved = TELEPHONY_SUCCESS;
4689     }
4690 }
4691 
NativeFormatPhoneNumber(napi_env env,void * data)4692 void NapiCallManager::NativeFormatPhoneNumber(napi_env env, void *data)
4693 {
4694     if (data == nullptr) {
4695         TELEPHONY_LOGE("NapiCallManager::NativeFormatPhoneNumber data is nullptr");
4696         NapiUtil::ThrowParameterError(env);
4697         return;
4698     }
4699     auto asyncContext = (UtilsAsyncContext *)data;
4700     std::string tmpPhoneNumber(asyncContext->number, asyncContext->numberLen);
4701     std::u16string phoneNumber = Str8ToStr16(tmpPhoneNumber);
4702     std::u16string countryCode = Str8ToStr16(asyncContext->code);
4703     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->FormatPhoneNumber(
4704         phoneNumber, countryCode, asyncContext->formatNumber);
4705     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4706         asyncContext->resolved = TELEPHONY_SUCCESS;
4707     }
4708 }
4709 
NativeFormatPhoneNumberToE164(napi_env env,void * data)4710 void NapiCallManager::NativeFormatPhoneNumberToE164(napi_env env, void *data)
4711 {
4712     if (data == nullptr) {
4713         TELEPHONY_LOGE("NapiCallManager::NativeFormatPhoneNumberToE164 data is nullptr");
4714         NapiUtil::ThrowParameterError(env);
4715         return;
4716     }
4717     auto asyncContext = (UtilsAsyncContext *)data;
4718     std::string tmpPhoneNumber(asyncContext->number, asyncContext->numberLen);
4719     std::u16string phoneNumber = Str8ToStr16(tmpPhoneNumber);
4720     std::u16string countryCode = Str8ToStr16(asyncContext->code);
4721     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->FormatPhoneNumberToE164(
4722         phoneNumber, countryCode, asyncContext->formatNumber);
4723     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4724         asyncContext->resolved = TELEPHONY_SUCCESS;
4725     }
4726 }
4727 
NativeSetMuted(napi_env env,void * data)4728 void NapiCallManager::NativeSetMuted(napi_env env, void *data)
4729 {
4730     if (data == nullptr) {
4731         TELEPHONY_LOGE("NapiCallManager::NativeSetMuted data is nullptr");
4732         NapiUtil::ThrowParameterError(env);
4733         return;
4734     }
4735     auto asyncContext = (AudioAsyncContext *)data;
4736     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetMuted(true);
4737     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4738         asyncContext->resolved = TELEPHONY_SUCCESS;
4739     }
4740 }
4741 
NativeCancelMuted(napi_env env,void * data)4742 void NapiCallManager::NativeCancelMuted(napi_env env, void *data)
4743 {
4744     if (data == nullptr) {
4745         TELEPHONY_LOGE("NapiCallManager::NativeCancelMuted data is nullptr");
4746         NapiUtil::ThrowParameterError(env);
4747         return;
4748     }
4749     auto asyncContext = (AudioAsyncContext *)data;
4750     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetMuted(false);
4751     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4752         asyncContext->resolved = TELEPHONY_SUCCESS;
4753     }
4754 }
4755 
NativeMuteRinger(napi_env env,void * data)4756 void NapiCallManager::NativeMuteRinger(napi_env env, void *data)
4757 {
4758     if (data == nullptr) {
4759         TELEPHONY_LOGE("NapiCallManager::NativeMuteRinger data is nullptr");
4760         NapiUtil::ThrowParameterError(env);
4761         return;
4762     }
4763     auto asyncContext = (AudioAsyncContext *)data;
4764     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->MuteRinger();
4765     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4766         asyncContext->resolved = TELEPHONY_SUCCESS;
4767     }
4768     asyncContext->eventId = CALL_MANAGER_MUTE_RINGER;
4769 }
4770 
NativeSetAudioDevice(napi_env env,void * data)4771 void NapiCallManager::NativeSetAudioDevice(napi_env env, void *data)
4772 {
4773     if (data == nullptr) {
4774         TELEPHONY_LOGE("NapiCallManager::NativeSetAudioDevice data is nullptr");
4775         NapiUtil::ThrowParameterError(env);
4776         return;
4777     }
4778     auto asyncContext = (AudioAsyncContext *)data;
4779     AudioDevice device;
4780     if (memset_s(&device, sizeof(AudioDevice), 0, sizeof(AudioDevice)) != EOK) {
4781         TELEPHONY_LOGE("memset_s fail");
4782         return;
4783     }
4784     device.deviceType = static_cast<AudioDeviceType>(asyncContext->deviceType);
4785     if (asyncContext->address.length() > kMaxAddressLen) {
4786         TELEPHONY_LOGE("address is not too long");
4787         return;
4788     }
4789     if (memcpy_s(device.address, kMaxAddressLen, asyncContext->address.c_str(), asyncContext->address.length()) !=
4790         EOK) {
4791         TELEPHONY_LOGE("memcpy_s address fail");
4792         return;
4793     }
4794     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetAudioDevice(device);
4795     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4796         asyncContext->resolved = TELEPHONY_SUCCESS;
4797     }
4798 }
4799 
NativeUpdateImsCallMode(napi_env env,void * data)4800 void NapiCallManager::NativeUpdateImsCallMode(napi_env env, void *data)
4801 {
4802     if (data == nullptr) {
4803         TELEPHONY_LOGE("NapiCallManager::NativeUpdateImsCallMode data is nullptr");
4804         NapiUtil::ThrowParameterError(env);
4805         return;
4806     }
4807     auto asyncContext = (SupplementAsyncContext *)data;
4808     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->UpdateImsCallMode(
4809         asyncContext->callId, (ImsCallMode)asyncContext->type);
4810     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4811         asyncContext->resolved = TELEPHONY_SUCCESS;
4812     }
4813 }
4814 
NativeControlCamera(napi_env env,void * data)4815 void NapiCallManager::NativeControlCamera(napi_env env, void *data)
4816 {
4817     if (data == nullptr) {
4818         TELEPHONY_LOGE("data is nullptr");
4819         return;
4820     }
4821     auto asyncContext = (VideoAsyncContext *)data;
4822     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->ControlCamera(
4823         asyncContext->callId, Str8ToStr16(asyncContext->cameraId));
4824     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4825         asyncContext->resolved = TELEPHONY_SUCCESS;
4826     }
4827 }
4828 
NativeSetPreviewWindow(napi_env env,void * data)4829 void NapiCallManager::NativeSetPreviewWindow(napi_env env, void *data)
4830 {
4831     if (data == nullptr) {
4832         TELEPHONY_LOGE("data is nullptr");
4833         return;
4834     }
4835     auto asyncContext = (VideoAsyncContext *)data;
4836     TELEPHONY_LOGI("surfaceId: %{public}s", asyncContext->surfaceId.c_str());
4837     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetPreviewWindow(
4838         asyncContext->callId, asyncContext->surfaceId);
4839     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4840         asyncContext->resolved = TELEPHONY_SUCCESS;
4841     }
4842 }
4843 
NativeSetDisplayWindow(napi_env env,void * data)4844 void NapiCallManager::NativeSetDisplayWindow(napi_env env, void *data)
4845 {
4846     if (data == nullptr) {
4847         TELEPHONY_LOGE("data is nullptr");
4848         return;
4849     }
4850     auto asyncContext = (VideoAsyncContext *)data;
4851     TELEPHONY_LOGI("surfaceId: %{public}s", asyncContext->surfaceId.c_str());
4852     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetDisplayWindow(
4853         asyncContext->callId, asyncContext->surfaceId);
4854     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4855         asyncContext->resolved = TELEPHONY_SUCCESS;
4856     }
4857 }
4858 
NativeSetCameraZoom(napi_env env,void * data)4859 void NapiCallManager::NativeSetCameraZoom(napi_env env, void *data)
4860 {
4861     if (data == nullptr) {
4862         TELEPHONY_LOGE("data is nullptr");
4863         return;
4864     }
4865     auto asyncContext = (VideoAsyncContext *)data;
4866     asyncContext->resolved = DelayedSingleton<CallManagerClient>::GetInstance()->SetCameraZoom(asyncContext->zoomRatio);
4867 }
4868 
NativeSetPausePicture(napi_env env,void * data)4869 void NapiCallManager::NativeSetPausePicture(napi_env env, void *data)
4870 {
4871     if (data == nullptr) {
4872         TELEPHONY_LOGE("data is nullptr");
4873         return;
4874     }
4875     auto asyncContext = (VideoAsyncContext *)data;
4876     asyncContext->errorCode =
4877         DelayedSingleton<CallManagerClient>::GetInstance()->SetPausePicture(
4878             asyncContext->callId, Str8ToStr16(asyncContext->path));
4879     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4880         asyncContext->resolved = TELEPHONY_SUCCESS;
4881     }
4882 }
4883 
NativeSetDeviceDirection(napi_env env,void * data)4884 void NapiCallManager::NativeSetDeviceDirection(napi_env env, void *data)
4885 {
4886     if (data == nullptr) {
4887         TELEPHONY_LOGE("data is nullptr");
4888         return;
4889     }
4890     auto asyncContext = (VideoAsyncContext *)data;
4891     asyncContext->errorCode =
4892         DelayedSingleton<CallManagerClient>::GetInstance()->SetDeviceDirection(
4893             asyncContext->callId, asyncContext->rotation);
4894     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4895         asyncContext->resolved = TELEPHONY_SUCCESS;
4896     }
4897 }
4898 
NativeRequestCameraCapabilities(napi_env env,void * data)4899 void NapiCallManager::NativeRequestCameraCapabilities(napi_env env, void *data)
4900 {
4901     if (data == nullptr) {
4902         TELEPHONY_LOGE("data is nullptr");
4903         return;
4904     }
4905     auto asyncContext = (AsyncContext *)data;
4906     asyncContext->resolved =
4907         DelayedSingleton<CallManagerClient>::GetInstance()->RequestCameraCapabilities(asyncContext->callId);
4908     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4909         asyncContext->resolved = TELEPHONY_SUCCESS;
4910     }
4911 }
4912 
NativeCancelCallUpgrade(napi_env env,void * data)4913 void NapiCallManager::NativeCancelCallUpgrade(napi_env env, void *data)
4914 {
4915     if (data == nullptr) {
4916         TELEPHONY_LOGE("NapiCallManager::NativeCancelCallUpgrade data is nullptr");
4917         NapiUtil::ThrowParameterError(env);
4918         return;
4919     }
4920     auto asyncContext = (AsyncContext *)data;
4921     asyncContext->errorCode =
4922         DelayedSingleton<CallManagerClient>::GetInstance()->CancelCallUpgrade(asyncContext->callId);
4923     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
4924         asyncContext->resolved = TELEPHONY_SUCCESS;
4925     }
4926 }
4927 
NativeSetCallPreferenceMode(napi_env env,void * data)4928 void NapiCallManager::NativeSetCallPreferenceMode(napi_env env, void *data)
4929 {
4930     if (data == nullptr) {
4931         TELEPHONY_LOGE("data is nullptr");
4932         return;
4933     }
4934     auto asyncContext = (SupplementAsyncContext *)data;
4935     asyncContext->resolved = DelayedSingleton<CallManagerClient>::GetInstance()->SetCallPreferenceMode(
4936         asyncContext->callId, asyncContext->mode);
4937 }
4938 
NativeStartRTT(napi_env env,void * data)4939 void NapiCallManager::NativeStartRTT(napi_env env, void *data)
4940 {
4941     if (data == nullptr) {
4942         TELEPHONY_LOGE("data is nullptr");
4943         return;
4944     }
4945     auto startRTTContext = (SupplementAsyncContext *)data;
4946     EventCallback infoListener;
4947     infoListener.env = startRTTContext->env;
4948     infoListener.thisVar = startRTTContext->thisVar;
4949     infoListener.callbackRef = startRTTContext->callbackRef;
4950     infoListener.deferred = startRTTContext->deferred;
4951     startRTTContext->resolved =
4952         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterStartRttCallback(infoListener);
4953     if (startRTTContext->resolved != TELEPHONY_SUCCESS) {
4954         TELEPHONY_LOGE("RegisterStartRttCallback failed!");
4955         return;
4956     }
4957 
4958     std::u16string msg = Str8ToStr16(startRTTContext->content);
4959     startRTTContext->resolved =
4960         DelayedSingleton<CallManagerClient>::GetInstance()->StartRtt(startRTTContext->callId, msg);
4961     if (startRTTContext->resolved != TELEPHONY_SUCCESS) {
4962         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterStartRttCallback();
4963         TELEPHONY_LOGE("StartRtt failed!");
4964         return;
4965     }
4966     startRTTContext->callbackRef = nullptr;
4967     startRTTContext->deferred = nullptr;
4968 }
4969 
NativeStopRTT(napi_env env,void * data)4970 void NapiCallManager::NativeStopRTT(napi_env env, void *data)
4971 {
4972     if (data == nullptr) {
4973         TELEPHONY_LOGE("data is nullptr");
4974         return;
4975     }
4976     auto stopRTTContext = (SupplementAsyncContext *)data;
4977     EventCallback infoListener;
4978     infoListener.env = stopRTTContext->env;
4979     infoListener.thisVar = stopRTTContext->thisVar;
4980     infoListener.callbackRef = stopRTTContext->callbackRef;
4981     infoListener.deferred = stopRTTContext->deferred;
4982     stopRTTContext->resolved =
4983         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterStopRttCallback(infoListener);
4984     if (stopRTTContext->resolved != TELEPHONY_SUCCESS) {
4985         TELEPHONY_LOGE("RegisterStopRttCallback failed!");
4986         return;
4987     }
4988     stopRTTContext->resolved = DelayedSingleton<CallManagerClient>::GetInstance()->StopRtt(stopRTTContext->callId);
4989     if (stopRTTContext->resolved != TELEPHONY_SUCCESS) {
4990         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterStopRttCallback();
4991         TELEPHONY_LOGE("StopRtt failed!");
4992         return;
4993     }
4994     stopRTTContext->callbackRef = nullptr;
4995     stopRTTContext->deferred = nullptr;
4996 }
4997 
NativeJoinConference(napi_env env,void * data)4998 void NapiCallManager::NativeJoinConference(napi_env env, void *data)
4999 {
5000     if (data == nullptr) {
5001         TELEPHONY_LOGE("NapiCallManager::NativeJoinConference data is nullptr");
5002         NapiUtil::ThrowParameterError(env);
5003         return;
5004     }
5005     auto asyncContext = (ListAsyncContext *)data;
5006     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->JoinConference(
5007         asyncContext->callId, asyncContext->listResult);
5008     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
5009         asyncContext->resolved = TELEPHONY_SUCCESS;
5010     }
5011 }
5012 
NativeReportOttCallDetailsInfo(napi_env env,void * data)5013 void NapiCallManager::NativeReportOttCallDetailsInfo(napi_env env, void *data)
5014 {
5015     if (data == nullptr) {
5016         TELEPHONY_LOGE("data is nullptr");
5017         return;
5018     }
5019     auto asyncContext = (OttCallAsyncContext *)data;
5020     asyncContext->resolved =
5021         DelayedSingleton<CallManagerClient>::GetInstance()->ReportOttCallDetailsInfo(asyncContext->ottVec);
5022 }
5023 
NativeReportOttCallEventInfo(napi_env env,void * data)5024 void NapiCallManager::NativeReportOttCallEventInfo(napi_env env, void *data)
5025 {
5026     if (data == nullptr) {
5027         TELEPHONY_LOGE("data is nullptr");
5028         return;
5029     }
5030     auto asyncContext = (OttEventAsyncContext *)data;
5031     asyncContext->resolved =
5032         DelayedSingleton<CallManagerClient>::GetInstance()->ReportOttCallEventInfo(asyncContext->eventInfo);
5033 }
5034 
NativeCloseUnFinishedUssd(napi_env env,void * data)5035 void NapiCallManager::NativeCloseUnFinishedUssd(napi_env env, void *data)
5036 {
5037     if (data == nullptr) {
5038         TELEPHONY_LOGE("NapiCallManager::NativeCloseUnFinishedUssd data is nullptr");
5039         NapiUtil::ThrowParameterError(env);
5040         return;
5041     }
5042 
5043     SupplementAsyncContext *asyncContext = static_cast<SupplementAsyncContext *>(data);
5044     if (!IsValidSlotId(asyncContext->slotId)) {
5045         TELEPHONY_LOGE("NativeCloseUnFinishedUssd slotId is invalid");
5046         asyncContext->errorCode = SLOT_ID_INVALID;
5047         return;
5048     }
5049     EventCallback infoListener;
5050     infoListener.env = asyncContext->env;
5051     infoListener.thisVar = asyncContext->thisVar;
5052     infoListener.callbackRef = asyncContext->callbackRef;
5053     infoListener.deferred = asyncContext->deferred;
5054     asyncContext->errorCode =
5055         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->RegisterCloseUnFinishedUssdCallback(infoListener);
5056     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
5057         TELEPHONY_LOGE("RegisterSetWaitingCallback failed!");
5058         return;
5059     }
5060 
5061     asyncContext->errorCode =
5062         DelayedSingleton<CallManagerClient>::GetInstance()->CloseUnFinishedUssd(asyncContext->slotId);
5063     if (asyncContext->errorCode != TELEPHONY_SUCCESS) {
5064         asyncContext->eventId = CALL_MANAGER_CLOSE_UNFINISHED_USSD;
5065         DelayedSingleton<NapiCallAbilityCallback>::GetInstance()->UnRegisterCloseUnFinishedUssdCallback();
5066         TELEPHONY_LOGE("NativeCloseUnFinishedUssd failed!");
5067         return;
5068     }
5069     asyncContext->resolved = TELEPHONY_SUCCESS;
5070     asyncContext->callbackRef = nullptr;
5071     asyncContext->deferred = nullptr;
5072 }
5073 
NativeInputDialerSpecialCode(napi_env env,void * data)5074 void NapiCallManager::NativeInputDialerSpecialCode(napi_env env, void *data)
5075 {
5076     if (data == nullptr) {
5077         TELEPHONY_LOGE("NapiCallManager::NativeInputDialerSpecialCode data is nullptr");
5078         NapiUtil::ThrowParameterError(env);
5079         return;
5080     }
5081     AsyncContext *asyncContext = static_cast<AsyncContext *>(data);
5082     std::string specialCode(asyncContext->number, asyncContext->numberLen);
5083     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->InputDialerSpecialCode(specialCode);
5084     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
5085         asyncContext->resolved = TELEPHONY_SUCCESS;
5086     }
5087 }
5088 
NativeRemoveMissedIncomingCallNotification(napi_env env,void * data)5089 void NapiCallManager::NativeRemoveMissedIncomingCallNotification(napi_env env, void *data)
5090 {
5091     if (data == nullptr) {
5092         TELEPHONY_LOGE("NapiCallManager::NativeRemoveMissedIncomingCallNotification data is nullptr");
5093         NapiUtil::ThrowParameterError(env);
5094         return;
5095     }
5096     AsyncContext *asyncContext = static_cast<AsyncContext *>(data);
5097     asyncContext->errorCode =
5098         DelayedSingleton<CallManagerClient>::GetInstance()->RemoveMissedIncomingCallNotification();
5099     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
5100         asyncContext->resolved = TELEPHONY_SUCCESS;
5101     }
5102 }
5103 
NativeSetVoIPCallState(napi_env env,void * data)5104 void NapiCallManager::NativeSetVoIPCallState(napi_env env, void *data)
5105 {
5106     if (data == nullptr) {
5107         TELEPHONY_LOGE("NapiCallManager::NativeSetVoIPCallState data is nullptr");
5108         NapiUtil::ThrowParameterError(env);
5109         return;
5110     }
5111     auto asyncContext = (VoIPCallStateAsyncContext *)data;
5112     asyncContext->errorCode = DelayedSingleton<CallManagerClient>::GetInstance()->SetVoIPCallState(
5113         asyncContext->state);
5114     if (asyncContext->errorCode == TELEPHONY_SUCCESS) {
5115         asyncContext->resolved = TELEPHONY_SUCCESS;
5116     }
5117     asyncContext->eventId = CALL_MANAGER_SET_VOIP_CALL_STATE;
5118 }
5119 
RegisterCallBack()5120 void NapiCallManager::RegisterCallBack()
5121 {
5122     if (registerStatus_ == TELEPHONY_SUCCESS) {
5123         TELEPHONY_LOGW("you are already registered!");
5124         return;
5125     }
5126     std::unique_ptr<NapiCallManagerCallback> callbackPtr = std::make_unique<NapiCallManagerCallback>();
5127     if (callbackPtr == nullptr) {
5128         TELEPHONY_LOGE("make_unique NapiCallManagerCallback failed!");
5129         return;
5130     }
5131     registerStatus_ = DelayedSingleton<CallManagerClient>::GetInstance()->RegisterCallBack(std::move(callbackPtr));
5132     if (registerStatus_ != TELEPHONY_SUCCESS) {
5133         TELEPHONY_LOGE("RegisterCallBack failed!");
5134         return;
5135     }
5136 }
5137 
HandleAsyncWork(napi_env env,AsyncContext * context,std::string workName,napi_async_execute_callback execute,napi_async_complete_callback complete)5138 napi_value NapiCallManager::HandleAsyncWork(napi_env env, AsyncContext *context, std::string workName,
5139     napi_async_execute_callback execute, napi_async_complete_callback complete)
5140 {
5141     TELEPHONY_LOGI("HandleAsyncWork start workName = %{public}s", workName.c_str());
5142     napi_value result = nullptr;
5143     if (context->callbackRef == nullptr) {
5144         napi_create_promise(env, &context->deferred, &result);
5145     } else {
5146         napi_get_undefined(env, &result);
5147     }
5148     napi_value resource = NapiCallManagerUtils::CreateUndefined(env);
5149     napi_value resourceName = nullptr;
5150     napi_create_string_utf8(env, workName.data(), NAPI_AUTO_LENGTH, &resourceName);
5151     napi_create_async_work(env, resource, resourceName, execute, complete, (void *)context, &context->work);
5152     napi_queue_async_work_with_qos(env, context->work, napi_qos_default);
5153     return result;
5154 }
5155 
5156 static napi_module g_nativeCallManagerModule = {
5157     .nm_version = NATIVE_VERSION,
5158     .nm_flags = NATIVE_FLAGS,
5159     .nm_filename = nullptr,
5160     .nm_register_func = NapiCallManager::RegisterCallManagerFunc,
5161     .nm_modname = "telephony.call",
5162     .nm_priv = ((void *)0),
5163     .reserved = {0},
5164 };
5165 
RegisterModule(void)5166 extern "C" __attribute__((constructor)) void RegisterModule(void)
5167 {
5168     napi_module_register(&g_nativeCallManagerModule);
5169 }
5170 } // namespace Telephony
5171 } // namespace OHOS
5172