• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "napi_call_ability_callback.h"
17 
18 #include <ctime>
19 #include <securec.h>
20 
21 #include "call_manager_errors.h"
22 #include "napi_call_manager_utils.h"
23 #include "napi_util.h"
24 #include "telephony_log_wrapper.h"
25 
26 namespace OHOS {
27 namespace Telephony {
NapiCallAbilityCallback()28 NapiCallAbilityCallback::NapiCallAbilityCallback()
29 {
30     (void)memset_s(&stateCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
31     (void)memset_s(&eventCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
32     (void)memset_s(&ottRequestCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
33     (void)memset_s(&getWaitingCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
34     (void)memset_s(&setWaitingCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
35     (void)memset_s(&getRestrictionCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
36     (void)memset_s(&setRestrictionCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
37     (void)memset_s(&getTransferCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
38     (void)memset_s(&setTransferCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
39     (void)memset_s(&startRttCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
40     (void)memset_s(&stopRttCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
41     (void)memset_s(&updateCallMediaModeCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
42     (void)memset_s(&callDisconnectCauseCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
43     (void)memset_s(&mmiCodeCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
44     memberFuncMap_[CallResultReportId::GET_CALL_WAITING_REPORT_ID] = &NapiCallAbilityCallback::ReportGetWaitingInfo;
45     memberFuncMap_[CallResultReportId::SET_CALL_WAITING_REPORT_ID] = &NapiCallAbilityCallback::ReportSetWaitingInfo;
46     memberFuncMap_[CallResultReportId::GET_CALL_RESTRICTION_REPORT_ID] =
47         &NapiCallAbilityCallback::ReportGetRestrictionInfo;
48     memberFuncMap_[CallResultReportId::SET_CALL_RESTRICTION_REPORT_ID] =
49         &NapiCallAbilityCallback::ReportSetRestrictionInfo;
50     memberFuncMap_[CallResultReportId::GET_CALL_TRANSFER_REPORT_ID] =
51         &NapiCallAbilityCallback::ReportGetTransferInfo;
52     memberFuncMap_[CallResultReportId::SET_CALL_TRANSFER_REPORT_ID] =
53         &NapiCallAbilityCallback::ReportSetTransferInfo;
54     memberFuncMap_[CallResultReportId::START_RTT_REPORT_ID] = &NapiCallAbilityCallback::ReportStartRttInfo;
55     memberFuncMap_[CallResultReportId::STOP_RTT_REPORT_ID] = &NapiCallAbilityCallback::ReportStopRttInfo;
56     memberFuncMap_[CallResultReportId::UPDATE_MEDIA_MODE_REPORT_ID] =
57         &NapiCallAbilityCallback::ReportCallMediaModeInfo;
58 }
59 
~NapiCallAbilityCallback()60 NapiCallAbilityCallback::~NapiCallAbilityCallback() {}
61 
RegisterCallStateCallback(EventCallback stateCallback)62 void NapiCallAbilityCallback::RegisterCallStateCallback(EventCallback stateCallback)
63 {
64     stateCallback_ = stateCallback;
65 }
66 
UnRegisterCallStateCallback()67 void NapiCallAbilityCallback::UnRegisterCallStateCallback()
68 {
69     if (stateCallback_.callbackRef) {
70         (void)memset_s(&stateCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
71     }
72 }
73 
RegisterMmiCodeCallback(EventCallback eventCallback)74 void NapiCallAbilityCallback::RegisterMmiCodeCallback(EventCallback eventCallback)
75 {
76     mmiCodeCallback_ = eventCallback;
77 }
78 
UnRegisterMmiCodeCallback()79 void NapiCallAbilityCallback::UnRegisterMmiCodeCallback()
80 {
81     if (mmiCodeCallback_.callbackRef) {
82         (void)memset_s(&mmiCodeCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
83     }
84 }
85 
RegisterCallEventCallback(EventCallback eventCallback)86 void NapiCallAbilityCallback::RegisterCallEventCallback(EventCallback eventCallback)
87 {
88     eventCallback_ = eventCallback;
89 }
90 
UnRegisterCallEventCallback()91 void NapiCallAbilityCallback::UnRegisterCallEventCallback()
92 {
93     if (eventCallback_.callbackRef) {
94         (void)memset_s(&eventCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
95     }
96 }
97 
RegisterDisconnectedCauseCallback(EventCallback eventCallback)98 void NapiCallAbilityCallback::RegisterDisconnectedCauseCallback(EventCallback eventCallback)
99 {
100     callDisconnectCauseCallback_ = eventCallback;
101 }
102 
UnRegisterDisconnectedCauseCallback()103 void NapiCallAbilityCallback::UnRegisterDisconnectedCauseCallback()
104 {
105     if (callDisconnectCauseCallback_.callbackRef) {
106         (void)memset_s(&callDisconnectCauseCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
107     }
108 }
109 
RegisterCallOttRequestCallback(EventCallback ottRequestCallback)110 void NapiCallAbilityCallback::RegisterCallOttRequestCallback(EventCallback ottRequestCallback)
111 {
112     ottRequestCallback_ = ottRequestCallback;
113 }
114 
UnRegisterCallOttRequestCallback()115 void NapiCallAbilityCallback::UnRegisterCallOttRequestCallback()
116 {
117     if (ottRequestCallback_.callbackRef) {
118         (void)memset_s(&ottRequestCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
119     }
120 }
121 
RegisterGetWaitingCallback(EventCallback callback)122 int32_t NapiCallAbilityCallback::RegisterGetWaitingCallback(EventCallback callback)
123 {
124     if (getWaitingCallback_.thisVar) {
125         TELEPHONY_LOGE("callback already exist!");
126         return CALL_ERR_CALLBACK_ALREADY_EXIST;
127     }
128     getWaitingCallback_ = callback;
129     return TELEPHONY_SUCCESS;
130 }
131 
UnRegisterGetWaitingCallback()132 void NapiCallAbilityCallback::UnRegisterGetWaitingCallback()
133 {
134     (void)memset_s(&getWaitingCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
135 }
136 
RegisterSetWaitingCallback(EventCallback callback)137 int32_t NapiCallAbilityCallback::RegisterSetWaitingCallback(EventCallback callback)
138 {
139     if (setWaitingCallback_.thisVar) {
140         TELEPHONY_LOGE("callback already exist!");
141         return CALL_ERR_CALLBACK_ALREADY_EXIST;
142     }
143     setWaitingCallback_ = callback;
144     return TELEPHONY_SUCCESS;
145 }
146 
UnRegisterSetWaitingCallback()147 void NapiCallAbilityCallback::UnRegisterSetWaitingCallback()
148 {
149     (void)memset_s(&setWaitingCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
150 }
151 
RegisterGetRestrictionCallback(EventCallback callback)152 int32_t NapiCallAbilityCallback::RegisterGetRestrictionCallback(EventCallback callback)
153 {
154     if (getRestrictionCallback_.thisVar) {
155         TELEPHONY_LOGE("callback already exist!");
156         return CALL_ERR_CALLBACK_ALREADY_EXIST;
157     }
158     getRestrictionCallback_ = callback;
159     return TELEPHONY_SUCCESS;
160 }
161 
UnRegisterGetRestrictionCallback()162 void NapiCallAbilityCallback::UnRegisterGetRestrictionCallback()
163 {
164     (void)memset_s(&getRestrictionCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
165 }
166 
RegisterSetRestrictionCallback(EventCallback callback)167 int32_t NapiCallAbilityCallback::RegisterSetRestrictionCallback(EventCallback callback)
168 {
169     if (setRestrictionCallback_.thisVar) {
170         TELEPHONY_LOGE("callback already exist!");
171         return CALL_ERR_CALLBACK_ALREADY_EXIST;
172     }
173     setRestrictionCallback_ = callback;
174     return TELEPHONY_SUCCESS;
175 }
176 
UnRegisterSetRestrictionCallback()177 void NapiCallAbilityCallback::UnRegisterSetRestrictionCallback()
178 {
179     (void)memset_s(&setRestrictionCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
180 }
181 
RegisterGetTransferCallback(EventCallback callback)182 int32_t NapiCallAbilityCallback::RegisterGetTransferCallback(EventCallback callback)
183 {
184     if (getTransferCallback_.thisVar) {
185         TELEPHONY_LOGE("callback already exist!");
186         return CALL_ERR_CALLBACK_ALREADY_EXIST;
187     }
188     getTransferCallback_ = callback;
189     return TELEPHONY_SUCCESS;
190 }
191 
UnRegisterGetTransferCallback()192 void NapiCallAbilityCallback::UnRegisterGetTransferCallback()
193 {
194     (void)memset_s(&getTransferCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
195 }
196 
RegisterSetTransferCallback(EventCallback callback)197 int32_t NapiCallAbilityCallback::RegisterSetTransferCallback(EventCallback callback)
198 {
199     if (setTransferCallback_.thisVar) {
200         TELEPHONY_LOGE("callback already exist!");
201         return CALL_ERR_CALLBACK_ALREADY_EXIST;
202     }
203     setTransferCallback_ = callback;
204     return TELEPHONY_SUCCESS;
205 }
206 
UnRegisterSetTransferCallback()207 void NapiCallAbilityCallback::UnRegisterSetTransferCallback()
208 {
209     (void)memset_s(&setTransferCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
210 }
211 
RegisterStartRttCallback(EventCallback callback)212 int32_t NapiCallAbilityCallback::RegisterStartRttCallback(EventCallback callback)
213 {
214     if (startRttCallback_.thisVar) {
215         TELEPHONY_LOGE("callback already exist!");
216         return CALL_ERR_CALLBACK_ALREADY_EXIST;
217     }
218     startRttCallback_ = callback;
219     return TELEPHONY_SUCCESS;
220 }
221 
UnRegisterStartRttCallback()222 void NapiCallAbilityCallback::UnRegisterStartRttCallback()
223 {
224     (void)memset_s(&startRttCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
225 }
226 
RegisterStopRttCallback(EventCallback callback)227 int32_t NapiCallAbilityCallback::RegisterStopRttCallback(EventCallback callback)
228 {
229     if (stopRttCallback_.thisVar) {
230         TELEPHONY_LOGE("callback already exist!");
231         return CALL_ERR_CALLBACK_ALREADY_EXIST;
232     }
233     stopRttCallback_ = callback;
234     return TELEPHONY_SUCCESS;
235 }
236 
UnRegisterStopRttCallback()237 void NapiCallAbilityCallback::UnRegisterStopRttCallback()
238 {
239     (void)memset_s(&stopRttCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
240 }
241 
RegisterUpdateCallMediaModeCallback(EventCallback callback)242 int32_t NapiCallAbilityCallback::RegisterUpdateCallMediaModeCallback(EventCallback callback)
243 {
244     if (updateCallMediaModeCallback_.thisVar) {
245         TELEPHONY_LOGE("callback already exist!");
246         return CALL_ERR_CALLBACK_ALREADY_EXIST;
247     }
248     updateCallMediaModeCallback_ = callback;
249     return TELEPHONY_SUCCESS;
250 }
251 
UnRegisterUpdateCallMediaModeCallback()252 void NapiCallAbilityCallback::UnRegisterUpdateCallMediaModeCallback()
253 {
254     (void)memset_s(&updateCallMediaModeCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
255 }
256 
ReportStartRttInfo(AppExecFwk::PacMap & resultInfo)257 int32_t NapiCallAbilityCallback::ReportStartRttInfo(AppExecFwk::PacMap &resultInfo)
258 {
259     if (startRttCallback_.thisVar == nullptr) {
260         TELEPHONY_LOGE("startRttCallback_ is null!");
261         return CALL_ERR_CALLBACK_NOT_EXIST;
262     }
263     uv_loop_s *loop = nullptr;
264 #if NAPI_VERSION >= 2
265     napi_get_uv_event_loop(startRttCallback_.env, &loop);
266 #endif
267     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
268     if (dataWorker == nullptr) {
269         TELEPHONY_LOGE("dataWorker is nullptr!");
270         return TELEPHONY_ERR_LOCAL_PTR_NULL;
271     }
272     dataWorker->info = resultInfo;
273     dataWorker->callback = startRttCallback_;
274     uv_work_t *work = std::make_unique<uv_work_t>().release();
275     if (work == nullptr) {
276         TELEPHONY_LOGE("work is nullptr!");
277         return TELEPHONY_ERR_LOCAL_PTR_NULL;
278     }
279     work->data = (void *)dataWorker;
280     uv_queue_work(
281         loop, work, [](uv_work_t *work) {}, ReportStartRttInfoWork);
282     if (startRttCallback_.thisVar) {
283         (void)memset_s(&startRttCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
284     }
285     return TELEPHONY_SUCCESS;
286 }
287 
ReportStopRttInfo(AppExecFwk::PacMap & resultInfo)288 int32_t NapiCallAbilityCallback::ReportStopRttInfo(AppExecFwk::PacMap &resultInfo)
289 {
290     if (stopRttCallback_.thisVar == nullptr) {
291         TELEPHONY_LOGE("startRttCallback_ is null!");
292         return CALL_ERR_CALLBACK_NOT_EXIST;
293     }
294     uv_loop_s *loop = nullptr;
295 #if NAPI_VERSION >= 2
296     napi_get_uv_event_loop(stopRttCallback_.env, &loop);
297 #endif
298     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
299     if (dataWorker == nullptr) {
300         TELEPHONY_LOGE("dataWorker is nullptr!");
301         return TELEPHONY_ERR_LOCAL_PTR_NULL;
302     }
303     dataWorker->info = resultInfo;
304     dataWorker->callback = stopRttCallback_;
305     uv_work_t *work = std::make_unique<uv_work_t>().release();
306     if (work == nullptr) {
307         TELEPHONY_LOGE("work is nullptr!");
308         return TELEPHONY_ERR_LOCAL_PTR_NULL;
309     }
310     work->data = (void *)dataWorker;
311     uv_queue_work(
312         loop, work, [](uv_work_t *work) {}, ReportStopRttInfoWork);
313     if (stopRttCallback_.thisVar) {
314         (void)memset_s(&stopRttCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
315     }
316     return TELEPHONY_SUCCESS;
317 }
318 
ReportCallMediaModeInfo(AppExecFwk::PacMap & resultInfo)319 int32_t NapiCallAbilityCallback::ReportCallMediaModeInfo(AppExecFwk::PacMap &resultInfo)
320 {
321     if (updateCallMediaModeCallback_.thisVar == nullptr) {
322         TELEPHONY_LOGE("updateCallMediaModeCallback_ is null!");
323         return CALL_ERR_CALLBACK_NOT_EXIST;
324     }
325     uv_loop_s *loop = nullptr;
326 #if NAPI_VERSION >= 2
327     napi_get_uv_event_loop(updateCallMediaModeCallback_.env, &loop);
328 #endif
329     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
330     if (dataWorker == nullptr) {
331         TELEPHONY_LOGE("dataWorker is nullptr!");
332         return TELEPHONY_ERR_LOCAL_PTR_NULL;
333     }
334     dataWorker->info = resultInfo;
335     dataWorker->callback = updateCallMediaModeCallback_;
336     uv_work_t *work = std::make_unique<uv_work_t>().release();
337     if (work == nullptr) {
338         TELEPHONY_LOGE("work is nullptr!");
339         return TELEPHONY_ERR_LOCAL_PTR_NULL;
340     }
341     work->data = (void *)dataWorker;
342     uv_queue_work(
343         loop, work, [](uv_work_t *work) {}, ReportCallMediaModeInfoWork);
344     if (updateCallMediaModeCallback_.thisVar) {
345         (void)memset_s(&updateCallMediaModeCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
346     }
347     return TELEPHONY_SUCCESS;
348 }
349 
UpdateCallStateInfo(const CallAttributeInfo & info)350 int32_t NapiCallAbilityCallback::UpdateCallStateInfo(const CallAttributeInfo &info)
351 {
352     if (stateCallback_.thisVar == nullptr) {
353         TELEPHONY_LOGE("stateCallback is null!");
354         return CALL_ERR_CALLBACK_NOT_EXIST;
355     }
356     uv_loop_s *loop = nullptr;
357 #if NAPI_VERSION >= 2
358     napi_get_uv_event_loop(stateCallback_.env, &loop);
359 #endif
360     CallStateWorker *dataWorker = std::make_unique<CallStateWorker>().release();
361     if (dataWorker == nullptr) {
362         TELEPHONY_LOGE("dataWorker is nullptr!");
363         return TELEPHONY_ERR_LOCAL_PTR_NULL;
364     }
365     dataWorker->info = info;
366     dataWorker->callback = stateCallback_;
367     uv_work_t *work = std::make_unique<uv_work_t>().release();
368     if (work == nullptr) {
369         TELEPHONY_LOGE("work is nullptr!");
370         return TELEPHONY_ERR_LOCAL_PTR_NULL;
371     }
372     work->data = (void *)dataWorker;
373     uv_queue_work(
374         loop, work, [](uv_work_t *work) {}, ReportCallStateWork);
375 
376     return TELEPHONY_SUCCESS;
377 }
378 
ReportCallStateWork(uv_work_t * work,int32_t status)379 void NapiCallAbilityCallback::ReportCallStateWork(uv_work_t *work, int32_t status)
380 {
381     CallStateWorker *dataWorkerData = (CallStateWorker *)work->data;
382     if (dataWorkerData == nullptr) {
383         TELEPHONY_LOGE("dataWorkerData is nullptr!");
384         return;
385     }
386     int32_t ret = ReportCallState(dataWorkerData->info, dataWorkerData->callback);
387     TELEPHONY_LOGI("ReportCallState result = %{public}d", ret);
388     delete dataWorkerData;
389     dataWorkerData = nullptr;
390     delete work;
391     work = nullptr;
392 }
393 
394 /**
395  * To notify an application of a call status change, register a callback with on() first.
396  */
ReportCallState(CallAttributeInfo & info,EventCallback stateCallback)397 int32_t NapiCallAbilityCallback::ReportCallState(CallAttributeInfo &info, EventCallback stateCallback)
398 {
399     napi_value callbackFunc = nullptr;
400     napi_env env = stateCallback.env;
401     napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
402     napi_create_object(env, &callbackValues[ARRAY_INDEX_FIRST]);
403     NapiCallManagerUtils::SetPropertyStringUtf8(
404         env, callbackValues[ARRAY_INDEX_FIRST], "accountNumber", info.accountNumber);
405     NapiCallManagerUtils::SetPropertyInt32(env, callbackValues[ARRAY_INDEX_FIRST], "accountId", info.accountId);
406     NapiCallManagerUtils::SetPropertyInt32(
407         env, callbackValues[ARRAY_INDEX_FIRST], "videoState", static_cast<int32_t>(info.videoState));
408     NapiCallManagerUtils::SetPropertyInt32(env, callbackValues[ARRAY_INDEX_FIRST], "startTime", info.startTime);
409     NapiCallManagerUtils::SetPropertyBoolean(env, callbackValues[ARRAY_INDEX_FIRST], "isEcc", info.isEcc);
410     NapiCallManagerUtils::SetPropertyInt32(
411         env, callbackValues[ARRAY_INDEX_FIRST], "callType", static_cast<int32_t>(info.callType));
412     NapiCallManagerUtils::SetPropertyInt32(env, callbackValues[ARRAY_INDEX_FIRST], "callId", info.callId);
413     NapiCallManagerUtils::SetPropertyInt32(
414         env, callbackValues[ARRAY_INDEX_FIRST], "callState", static_cast<int32_t>(info.callState));
415     NapiCallManagerUtils::SetPropertyInt32(
416         env, callbackValues[ARRAY_INDEX_FIRST], "conferenceState", static_cast<int32_t>(info.conferenceState));
417     napi_get_reference_value(env, stateCallback.callbackRef, &callbackFunc);
418     if (callbackFunc == nullptr) {
419         TELEPHONY_LOGE("callbackFunc is null!");
420         return CALL_ERR_CALLBACK_NOT_EXIST;
421     }
422     napi_value thisVar = nullptr;
423     napi_get_reference_value(env, stateCallback.thisVar, &thisVar);
424     napi_value callbackResult = nullptr;
425     napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_ONE, callbackValues, &callbackResult);
426     return TELEPHONY_SUCCESS;
427 }
428 
UpdateCallEvent(const CallEventInfo & info)429 int32_t NapiCallAbilityCallback::UpdateCallEvent(const CallEventInfo &info)
430 {
431     if (eventCallback_.thisVar == nullptr) {
432         TELEPHONY_LOGE("eventCallback is null!");
433         return CALL_ERR_CALLBACK_NOT_EXIST;
434     }
435     uv_loop_s *loop = nullptr;
436 #if NAPI_VERSION >= 2
437     napi_get_uv_event_loop(eventCallback_.env, &loop);
438 #endif
439     CallEventWorker *dataWorker = std::make_unique<CallEventWorker>().release();
440     if (dataWorker == nullptr) {
441         TELEPHONY_LOGE("dataWorker is nullptr!");
442         return TELEPHONY_ERR_LOCAL_PTR_NULL;
443     }
444     dataWorker->info = info;
445     dataWorker->callback = eventCallback_;
446     uv_work_t *work = std::make_unique<uv_work_t>().release();
447     if (work == nullptr) {
448         TELEPHONY_LOGE("work is nullptr!");
449         return TELEPHONY_ERR_LOCAL_PTR_NULL;
450     }
451     work->data = (void *)dataWorker;
452     uv_queue_work(
453         loop, work, [](uv_work_t *work) {}, ReportCallEventWork);
454     return TELEPHONY_SUCCESS;
455 }
456 
ReportCallEventWork(uv_work_t * work,int32_t status)457 void NapiCallAbilityCallback::ReportCallEventWork(uv_work_t *work, int32_t status)
458 {
459     CallEventWorker *dataWorkerData = (CallEventWorker *)work->data;
460     if (dataWorkerData == nullptr) {
461         TELEPHONY_LOGE("dataWorkerData is nullptr!");
462         return;
463     }
464     int32_t ret = ReportCallEvent(dataWorkerData->info, dataWorkerData->callback);
465     TELEPHONY_LOGI("ReportCallEvent results %{public}d", ret);
466     delete dataWorkerData;
467     dataWorkerData = nullptr;
468     delete work;
469     work = nullptr;
470 }
471 
ReportCallEvent(CallEventInfo & info,EventCallback eventCallback)472 int32_t NapiCallAbilityCallback::ReportCallEvent(CallEventInfo &info, EventCallback eventCallback)
473 {
474     napi_value callbackFunc = nullptr;
475     napi_env env = eventCallback.env;
476     napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
477     napi_create_object(env, &callbackValues[ARRAY_INDEX_FIRST]);
478     NapiCallManagerUtils::SetPropertyInt32(
479         env, callbackValues[ARRAY_INDEX_FIRST], "eventId", static_cast<int32_t>(info.eventId));
480     NapiCallManagerUtils::SetPropertyStringUtf8(env, callbackValues[ARRAY_INDEX_FIRST], "accountNumber", info.phoneNum);
481     NapiCallManagerUtils::SetPropertyStringUtf8(env, callbackValues[ARRAY_INDEX_FIRST], "bundleName", info.bundleName);
482     napi_get_reference_value(env, eventCallback.callbackRef, &callbackFunc);
483     if (callbackFunc == nullptr) {
484         TELEPHONY_LOGE("callbackFunc is null!");
485         return CALL_ERR_CALLBACK_NOT_EXIST;
486     }
487     napi_value thisVar = nullptr;
488     napi_get_reference_value(env, eventCallback.thisVar, &thisVar);
489     napi_value callbackResult = nullptr;
490     napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_ONE, callbackValues, &callbackResult);
491     return TELEPHONY_SUCCESS;
492 }
493 
UpdateCallDisconnectedCause(const DisconnectedDetails & details)494 int32_t NapiCallAbilityCallback::UpdateCallDisconnectedCause(const DisconnectedDetails &details)
495 {
496     if (callDisconnectCauseCallback_.thisVar == nullptr) {
497         TELEPHONY_LOGE("callDisconnectCauseCallback_ is null!");
498         return CALL_ERR_CALLBACK_NOT_EXIST;
499     }
500     uv_loop_s *loop = nullptr;
501 #if NAPI_VERSION >= 2
502     napi_get_uv_event_loop(callDisconnectCauseCallback_.env, &loop);
503 #endif
504     CallDisconnectedCauseWorker *dataWorker = std::make_unique<CallDisconnectedCauseWorker>().release();
505     if (dataWorker == nullptr) {
506         TELEPHONY_LOGE("dataWorker is nullptr!");
507         return TELEPHONY_ERR_LOCAL_PTR_NULL;
508     }
509     dataWorker->details = details;
510     dataWorker->callback = callDisconnectCauseCallback_;
511     uv_work_t *work = std::make_unique<uv_work_t>().release();
512     if (work == nullptr) {
513         TELEPHONY_LOGE("work is nullptr!");
514         return TELEPHONY_ERR_LOCAL_PTR_NULL;
515     }
516     work->data = (void *)dataWorker;
517     uv_queue_work(
518         loop, work, [](uv_work_t *work) {}, ReportCallDisconnectedCauseWork);
519     if (callDisconnectCauseCallback_.thisVar) {
520         (void)memset_s(&callDisconnectCauseCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
521     }
522     return TELEPHONY_SUCCESS;
523 }
524 
ReportCallDisconnectedCauseWork(uv_work_t * work,int32_t status)525 void NapiCallAbilityCallback::ReportCallDisconnectedCauseWork(uv_work_t *work, int32_t status)
526 {
527     CallDisconnectedCauseWorker *dataWorkerData = (CallDisconnectedCauseWorker *)work->data;
528     if (dataWorkerData == nullptr) {
529         TELEPHONY_LOGE("dataWorkerData is nullptr!");
530         return;
531     }
532     int32_t ret = ReportDisconnectedCause(dataWorkerData->details, dataWorkerData->callback);
533     TELEPHONY_LOGI("ReportDisconnectedCause results %{public}d", ret);
534     delete dataWorkerData;
535     dataWorkerData = nullptr;
536     delete work;
537     work = nullptr;
538 }
539 
ReportDisconnectedCause(const DisconnectedDetails & details,EventCallback eventCallback)540 int32_t NapiCallAbilityCallback::ReportDisconnectedCause(
541     const DisconnectedDetails &details, EventCallback eventCallback)
542 {
543     napi_value callbackFunc = nullptr;
544     napi_env env = eventCallback.env;
545     napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
546     napi_create_object(env, &callbackValues[ARRAY_INDEX_SECOND]);
547     NapiCallManagerUtils::SetPropertyInt32(
548         env, callbackValues[ARRAY_INDEX_SECOND], "disconnectedCause", static_cast<int32_t>(details.reason));
549     NapiCallManagerUtils::SetPropertyStringUtf8(env, callbackValues[ARRAY_INDEX_SECOND], "message", details.message);
550     napi_get_reference_value(env, eventCallback.callbackRef, &callbackFunc);
551     if (callbackFunc == nullptr) {
552         TELEPHONY_LOGE("callbackFunc is null!");
553         return CALL_ERR_CALLBACK_NOT_EXIST;
554     }
555     napi_value thisVar = nullptr;
556     napi_get_reference_value(env, eventCallback.thisVar, &thisVar);
557     napi_value callbackResult = nullptr;
558     napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_ONE, callbackValues, &callbackResult);
559     return TELEPHONY_SUCCESS;
560 }
561 
UpdateAsyncResultsInfo(const CallResultReportId reportId,AppExecFwk::PacMap & resultInfo)562 int32_t NapiCallAbilityCallback::UpdateAsyncResultsInfo(
563     const CallResultReportId reportId, AppExecFwk::PacMap &resultInfo)
564 {
565     int32_t result = TELEPHONY_ERR_FAIL;
566     TELEPHONY_LOGI("UpdateAsyncResultsInfo reportId = %{public}d", reportId);
567     auto itFunc = memberFuncMap_.find(reportId);
568     if (itFunc != memberFuncMap_.end() && itFunc->second != nullptr) {
569         auto memberFunc = itFunc->second;
570         result = (this->*memberFunc)(resultInfo);
571     }
572     return result;
573 }
574 
UpdateMmiCodeResultsInfo(const MmiCodeInfo & info)575 int32_t NapiCallAbilityCallback::UpdateMmiCodeResultsInfo(const MmiCodeInfo &info)
576 {
577     if (mmiCodeCallback_.thisVar == nullptr) {
578         TELEPHONY_LOGE("mmiCodeCallback is null!");
579         return CALL_ERR_CALLBACK_NOT_EXIST;
580     }
581     uv_loop_s *loop = nullptr;
582 #if NAPI_VERSION >= 2
583     napi_get_uv_event_loop(mmiCodeCallback_.env, &loop);
584 #endif
585     MmiCodeWorker *dataWorker = std::make_unique<MmiCodeWorker>().release();
586     if (dataWorker == nullptr) {
587         TELEPHONY_LOGE("dataWorker is nullptr!");
588         return TELEPHONY_ERR_LOCAL_PTR_NULL;
589     }
590     dataWorker->info = info;
591     dataWorker->callback = mmiCodeCallback_;
592     uv_work_t *work = std::make_unique<uv_work_t>().release();
593     if (work == nullptr) {
594         TELEPHONY_LOGE("work is nullptr!");
595         return TELEPHONY_ERR_LOCAL_PTR_NULL;
596     }
597     work->data = (void *)dataWorker;
598     uv_queue_work(
599         loop, work, [](uv_work_t *work) {}, ReportMmiCodeWork);
600 
601     return TELEPHONY_SUCCESS;
602 }
603 
ReportMmiCodeWork(uv_work_t * work,int32_t status)604 void NapiCallAbilityCallback::ReportMmiCodeWork(uv_work_t *work, int32_t status)
605 {
606     MmiCodeWorker *dataWorkerData = (MmiCodeWorker *)work->data;
607     if (dataWorkerData == nullptr) {
608         TELEPHONY_LOGE("dataWorkerData is nullptr!");
609         return;
610     }
611     int32_t ret = ReportMmiCode(dataWorkerData->info, dataWorkerData->callback);
612     TELEPHONY_LOGI("ReportMmiCode result = %{public}d", ret);
613     delete dataWorkerData;
614     dataWorkerData = nullptr;
615     delete work;
616     work = nullptr;
617 }
618 
619 /**
620  * To notify an application of MMI code result, register a callback with on() first.
621  */
ReportMmiCode(MmiCodeInfo & info,EventCallback eventCallback)622 int32_t NapiCallAbilityCallback::ReportMmiCode(MmiCodeInfo &info, EventCallback eventCallback)
623 {
624     napi_value callbackFunc = nullptr;
625     napi_env env = eventCallback.env;
626     napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
627     callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
628     napi_create_object(env, &callbackValues[ARRAY_INDEX_SECOND]);
629     NapiCallManagerUtils::SetPropertyInt32(
630         env, callbackValues[ARRAY_INDEX_SECOND], "result", static_cast<int32_t>(info.result));
631     NapiCallManagerUtils::SetPropertyStringUtf8(env, callbackValues[ARRAY_INDEX_SECOND], "message", info.message);
632     napi_get_reference_value(env, eventCallback.callbackRef, &callbackFunc);
633     if (callbackFunc == nullptr) {
634         TELEPHONY_LOGE("callbackFunc is null!");
635         return CALL_ERR_CALLBACK_NOT_EXIST;
636     }
637     napi_value thisVar = nullptr;
638     napi_get_reference_value(env, eventCallback.thisVar, &thisVar);
639     napi_value callbackResult = nullptr;
640     napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_TWO, callbackValues, &callbackResult);
641     return TELEPHONY_SUCCESS;
642 }
643 
OttCallRequest(OttCallRequestId requestId,AppExecFwk::PacMap & info)644 int32_t NapiCallAbilityCallback::OttCallRequest(OttCallRequestId requestId, AppExecFwk::PacMap &info)
645 {
646     if (ottRequestCallback_.thisVar == nullptr) {
647         TELEPHONY_LOGE("stateCallback is null!");
648         return CALL_ERR_CALLBACK_NOT_EXIST;
649     }
650     uv_loop_s *loop = nullptr;
651 #if NAPI_VERSION >= 2
652     napi_get_uv_event_loop(ottRequestCallback_.env, &loop);
653 #endif
654     CallOttWorker *dataWorker = std::make_unique<CallOttWorker>().release();
655     if (dataWorker == nullptr) {
656         TELEPHONY_LOGE("dataWorker is nullptr!");
657         return TELEPHONY_ERR_LOCAL_PTR_NULL;
658     }
659     dataWorker->requestId = requestId;
660     dataWorker->info = info;
661     dataWorker->callback = ottRequestCallback_;
662     uv_work_t *work = std::make_unique<uv_work_t>().release();
663     if (work == nullptr) {
664         TELEPHONY_LOGE("work is nullptr!");
665         return TELEPHONY_ERR_LOCAL_PTR_NULL;
666     }
667     work->data = (void *)dataWorker;
668     uv_queue_work(
669         loop, work, [](uv_work_t *work) {}, ReportCallOttWork);
670 
671     return TELEPHONY_SUCCESS;
672 }
673 
ReportGetWaitingInfo(AppExecFwk::PacMap & resultInfo)674 int32_t NapiCallAbilityCallback::ReportGetWaitingInfo(AppExecFwk::PacMap &resultInfo)
675 {
676     if (getWaitingCallback_.thisVar == nullptr) {
677         TELEPHONY_LOGE("getWaitingCallback is null!");
678         return CALL_ERR_CALLBACK_NOT_EXIST;
679     }
680     uv_loop_s *loop = nullptr;
681 #if NAPI_VERSION >= 2
682     napi_get_uv_event_loop(getWaitingCallback_.env, &loop);
683 #endif
684     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
685     if (dataWorker == nullptr) {
686         TELEPHONY_LOGE("dataWorker is nullptr!");
687         return TELEPHONY_ERR_LOCAL_PTR_NULL;
688     }
689     dataWorker->info = resultInfo;
690     dataWorker->callback = getWaitingCallback_;
691     uv_work_t *work = std::make_unique<uv_work_t>().release();
692     if (work == nullptr) {
693         TELEPHONY_LOGE("work is nullptr!");
694         return TELEPHONY_ERR_LOCAL_PTR_NULL;
695     }
696     work->data = (void *)dataWorker;
697     uv_queue_work(
698         loop, work, [](uv_work_t *work) {}, ReportWaitAndLimitInfoWork);
699     if (getWaitingCallback_.thisVar) {
700         (void)memset_s(&getWaitingCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
701     }
702     return TELEPHONY_SUCCESS;
703 }
704 
ReportSetWaitingInfo(AppExecFwk::PacMap & resultInfo)705 int32_t NapiCallAbilityCallback::ReportSetWaitingInfo(AppExecFwk::PacMap &resultInfo)
706 {
707     if (setWaitingCallback_.thisVar == nullptr) {
708         TELEPHONY_LOGE("setWaitingCallback is null!");
709         return CALL_ERR_CALLBACK_NOT_EXIST;
710     }
711     uv_loop_s *loop = nullptr;
712 #if NAPI_VERSION >= 2
713     napi_get_uv_event_loop(setWaitingCallback_.env, &loop);
714 #endif
715     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
716     if (dataWorker == nullptr) {
717         TELEPHONY_LOGE("dataWorker is nullptr!");
718         return TELEPHONY_ERR_LOCAL_PTR_NULL;
719     }
720     dataWorker->info = resultInfo;
721     dataWorker->callback = setWaitingCallback_;
722     uv_work_t *work = std::make_unique<uv_work_t>().release();
723     if (work == nullptr) {
724         TELEPHONY_LOGE("work is nullptr!");
725         return TELEPHONY_ERR_LOCAL_PTR_NULL;
726     }
727     work->data = (void *)dataWorker;
728     uv_queue_work(
729         loop, work, [](uv_work_t *work) {}, ReportExecutionResultWork);
730     if (setWaitingCallback_.thisVar) {
731         (void)memset_s(&setWaitingCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
732     }
733     return TELEPHONY_SUCCESS;
734 }
735 
ReportGetRestrictionInfo(AppExecFwk::PacMap & resultInfo)736 int32_t NapiCallAbilityCallback::ReportGetRestrictionInfo(AppExecFwk::PacMap &resultInfo)
737 {
738     if (getRestrictionCallback_.thisVar == nullptr) {
739         TELEPHONY_LOGE("getRestrictionCallback is null!");
740         return CALL_ERR_CALLBACK_NOT_EXIST;
741     }
742     uv_loop_s *loop = nullptr;
743 #if NAPI_VERSION >= 2
744     napi_get_uv_event_loop(getRestrictionCallback_.env, &loop);
745 #endif
746     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
747     if (dataWorker == nullptr) {
748         TELEPHONY_LOGE("dataWorker is nullptr!");
749         return TELEPHONY_ERR_LOCAL_PTR_NULL;
750     }
751     dataWorker->info = resultInfo;
752     dataWorker->callback = getRestrictionCallback_;
753     uv_work_t *work = std::make_unique<uv_work_t>().release();
754     if (work == nullptr) {
755         TELEPHONY_LOGE("work is nullptr!");
756         return TELEPHONY_ERR_LOCAL_PTR_NULL;
757     }
758     work->data = (void *)dataWorker;
759     uv_queue_work(
760         loop, work, [](uv_work_t *work) {}, ReportWaitAndLimitInfoWork);
761     if (getRestrictionCallback_.thisVar) {
762         (void)memset_s(&getRestrictionCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
763     }
764     return TELEPHONY_SUCCESS;
765 }
766 
ReportSetRestrictionInfo(AppExecFwk::PacMap & resultInfo)767 int32_t NapiCallAbilityCallback::ReportSetRestrictionInfo(AppExecFwk::PacMap &resultInfo)
768 {
769     if (setRestrictionCallback_.thisVar == nullptr) {
770         TELEPHONY_LOGE("setRestrictionCallback is null!");
771         return CALL_ERR_CALLBACK_NOT_EXIST;
772     }
773     uv_loop_s *loop = nullptr;
774 #if NAPI_VERSION >= 2
775     napi_get_uv_event_loop(setRestrictionCallback_.env, &loop);
776 #endif
777     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
778     if (dataWorker == nullptr) {
779         TELEPHONY_LOGE("dataWorker is nullptr!");
780         return TELEPHONY_ERR_LOCAL_PTR_NULL;
781     }
782     dataWorker->info = resultInfo;
783     dataWorker->callback = setRestrictionCallback_;
784     uv_work_t *work = std::make_unique<uv_work_t>().release();
785     if (work == nullptr) {
786         TELEPHONY_LOGE("work is nullptr!");
787         return TELEPHONY_ERR_LOCAL_PTR_NULL;
788     }
789     work->data = (void *)dataWorker;
790     uv_queue_work(
791         loop, work, [](uv_work_t *work) {}, ReportExecutionResultWork);
792     if (setRestrictionCallback_.thisVar) {
793         (void)memset_s(&setRestrictionCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
794     }
795     return TELEPHONY_SUCCESS;
796 }
797 
ReportGetTransferInfo(AppExecFwk::PacMap & resultInfo)798 int32_t NapiCallAbilityCallback::ReportGetTransferInfo(AppExecFwk::PacMap &resultInfo)
799 {
800     if (getTransferCallback_.thisVar == nullptr) {
801         TELEPHONY_LOGE("getTransferCallback is null!");
802         return CALL_ERR_CALLBACK_NOT_EXIST;
803     }
804     uv_loop_s *loop = nullptr;
805 #if NAPI_VERSION >= 2
806     napi_get_uv_event_loop(getTransferCallback_.env, &loop);
807 #endif
808     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
809     if (dataWorker == nullptr) {
810         TELEPHONY_LOGE("dataWorker is nullptr!");
811         return TELEPHONY_ERR_LOCAL_PTR_NULL;
812     }
813     dataWorker->info = resultInfo;
814     dataWorker->callback = getTransferCallback_;
815     uv_work_t *work = std::make_unique<uv_work_t>().release();
816     if (work == nullptr) {
817         TELEPHONY_LOGE("work is nullptr!");
818         return TELEPHONY_ERR_LOCAL_PTR_NULL;
819     }
820     work->data = (void *)dataWorker;
821     uv_queue_work(
822         loop, work, [](uv_work_t *work) {}, ReportSupplementInfoWork);
823     if (getTransferCallback_.thisVar) {
824         (void)memset_s(&getTransferCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
825     }
826     return TELEPHONY_SUCCESS;
827 }
828 
ReportSetTransferInfo(AppExecFwk::PacMap & resultInfo)829 int32_t NapiCallAbilityCallback::ReportSetTransferInfo(AppExecFwk::PacMap &resultInfo)
830 {
831     if (setTransferCallback_.thisVar == nullptr) {
832         TELEPHONY_LOGE("setTransferCallback is null!");
833         return CALL_ERR_CALLBACK_NOT_EXIST;
834     }
835     uv_loop_s *loop = nullptr;
836 #if NAPI_VERSION >= 2
837     napi_get_uv_event_loop(setTransferCallback_.env, &loop);
838 #endif
839     CallSupplementWorker *dataWorker = std::make_unique<CallSupplementWorker>().release();
840     if (dataWorker == nullptr) {
841         TELEPHONY_LOGE("dataWorker is nullptr!");
842         return TELEPHONY_ERR_LOCAL_PTR_NULL;
843     }
844     dataWorker->info = resultInfo;
845     dataWorker->callback = setTransferCallback_;
846     uv_work_t *work = std::make_unique<uv_work_t>().release();
847     if (work == nullptr) {
848         TELEPHONY_LOGE("work is nullptr!");
849         return TELEPHONY_ERR_LOCAL_PTR_NULL;
850     }
851     work->data = (void *)dataWorker;
852     uv_queue_work(
853         loop, work, [](uv_work_t *work) {}, ReportExecutionResultWork);
854     if (setTransferCallback_.thisVar) {
855         (void)memset_s(&setTransferCallback_, sizeof(EventCallback), 0, sizeof(EventCallback));
856     }
857     return TELEPHONY_SUCCESS;
858 }
859 
ReportWaitAndLimitInfoWork(uv_work_t * work,int32_t status)860 void NapiCallAbilityCallback::ReportWaitAndLimitInfoWork(uv_work_t *work, int32_t status)
861 {
862     CallSupplementWorker *dataWorkerData = (CallSupplementWorker *)work->data;
863     if (dataWorkerData == nullptr) {
864         TELEPHONY_LOGE("dataWorkerData is nullptr!");
865         return;
866     }
867     ReportWaitAndLimitInfo(dataWorkerData->info, dataWorkerData->callback);
868     delete dataWorkerData;
869     dataWorkerData = nullptr;
870     delete work;
871     work = nullptr;
872 }
873 
ReportWaitAndLimitInfo(AppExecFwk::PacMap & resultInfo,EventCallback supplementInfo)874 void NapiCallAbilityCallback::ReportWaitAndLimitInfo(AppExecFwk::PacMap &resultInfo, EventCallback supplementInfo)
875 {
876     napi_env env = supplementInfo.env;
877     int32_t result = resultInfo.GetIntValue("result");
878     int32_t status = resultInfo.GetIntValue("status");
879     if (supplementInfo.callbackRef != nullptr) {
880         napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
881         if (result == TELEPHONY_SUCCESS) {
882             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
883             napi_create_int32(env, status, &callbackValues[ARRAY_INDEX_SECOND]);
884         } else {
885             std::string errTip = std::to_string(CALL_ERR_NAPI_INTERFACE_FAILED);
886             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorMessage(env, errTip);
887             callbackValues[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
888         }
889         napi_value callbackFunc = nullptr;
890         napi_get_reference_value(env, supplementInfo.callbackRef, &callbackFunc);
891         napi_value thisVar = nullptr;
892         napi_get_reference_value(env, supplementInfo.thisVar, &thisVar);
893         napi_value callbackResult = nullptr;
894         napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_TWO, callbackValues, &callbackResult);
895         napi_delete_reference(env, supplementInfo.callbackRef);
896         napi_delete_reference(env, supplementInfo.thisVar);
897     } else if (supplementInfo.deferred != nullptr) {
898         if (result == TELEPHONY_SUCCESS) {
899             napi_value promiseValue = nullptr;
900             napi_create_int32(env, status, &promiseValue);
901             napi_resolve_deferred(env, supplementInfo.deferred, promiseValue);
902         } else {
903             std::string errTip = std::to_string(CALL_ERR_NAPI_INTERFACE_FAILED);
904             napi_reject_deferred(env, supplementInfo.deferred, NapiCallManagerUtils::CreateErrorMessage(env, errTip));
905         }
906     }
907 }
908 
ReportSupplementInfoWork(uv_work_t * work,int32_t status)909 void NapiCallAbilityCallback::ReportSupplementInfoWork(uv_work_t *work, int32_t status)
910 {
911     CallSupplementWorker *dataWorkerData = (CallSupplementWorker *)work->data;
912     if (dataWorkerData == nullptr) {
913         TELEPHONY_LOGE("dataWorkerData is nullptr!");
914         return;
915     }
916     ReportSupplementInfo(dataWorkerData->info, dataWorkerData->callback);
917     delete dataWorkerData;
918     dataWorkerData = nullptr;
919     delete work;
920     work = nullptr;
921 }
922 
ReportSupplementInfo(AppExecFwk::PacMap & resultInfo,EventCallback supplementInfo)923 void NapiCallAbilityCallback::ReportSupplementInfo(AppExecFwk::PacMap &resultInfo, EventCallback supplementInfo)
924 {
925     napi_env env = supplementInfo.env;
926     napi_value callbackValue = nullptr;
927     napi_create_object(env, &callbackValue);
928     NapiCallManagerUtils::SetPropertyInt32(env, callbackValue, "status", resultInfo.GetIntValue("status"));
929     NapiCallManagerUtils::SetPropertyStringUtf8(env, callbackValue, "number", resultInfo.GetStringValue("number"));
930     int32_t result = resultInfo.GetIntValue("result");
931     if (supplementInfo.callbackRef != nullptr) {
932         napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
933         if (result == TELEPHONY_SUCCESS) {
934             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
935             callbackValues[ARRAY_INDEX_SECOND] = callbackValue;
936         } else {
937             std::string errTip = std::to_string(CALL_ERR_NAPI_INTERFACE_FAILED);
938             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorMessage(env, errTip);
939             callbackValues[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
940         }
941         napi_value callbackFunc = nullptr;
942         napi_get_reference_value(env, supplementInfo.callbackRef, &callbackFunc);
943         napi_value thisVar = nullptr;
944         napi_get_reference_value(env, supplementInfo.thisVar, &thisVar);
945         napi_value callbackResult = nullptr;
946         napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_TWO, callbackValues, &callbackResult);
947         napi_delete_reference(env, supplementInfo.callbackRef);
948         napi_delete_reference(env, supplementInfo.thisVar);
949     } else if (supplementInfo.deferred != nullptr) {
950         if (result == TELEPHONY_SUCCESS) {
951             napi_resolve_deferred(env, supplementInfo.deferred, callbackValue);
952         } else {
953             std::string errTip = std::to_string(CALL_ERR_NAPI_INTERFACE_FAILED);
954             napi_reject_deferred(
955                 env, supplementInfo.deferred, NapiCallManagerUtils::CreateErrorMessage(env, errTip));
956         }
957     }
958 }
959 
ReportExecutionResultWork(uv_work_t * work,int32_t status)960 void NapiCallAbilityCallback::ReportExecutionResultWork(uv_work_t *work, int32_t status)
961 {
962     CallSupplementWorker *dataWorkerData = (CallSupplementWorker *)work->data;
963     if (dataWorkerData == nullptr) {
964         TELEPHONY_LOGE("dataWorkerData is nullptr!");
965         return;
966     }
967     ReportExecutionResult(dataWorkerData->callback, dataWorkerData->info);
968     delete dataWorkerData;
969     dataWorkerData = nullptr;
970     delete work;
971     work = nullptr;
972 }
973 
ReportExecutionResult(EventCallback & settingInfo,AppExecFwk::PacMap & resultInfo)974 void NapiCallAbilityCallback::ReportExecutionResult(EventCallback &settingInfo, AppExecFwk::PacMap &resultInfo)
975 {
976     napi_env env = settingInfo.env;
977     napi_value callbackValue = nullptr;
978     napi_create_object(env, &callbackValue);
979     int32_t result = resultInfo.GetIntValue("result");
980     if (settingInfo.callbackRef != nullptr) {
981         napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
982         if (result == TELEPHONY_SUCCESS) {
983             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
984             napi_get_null(env, &callbackValues[ARRAY_INDEX_SECOND]);
985         } else {
986             JsError error = NapiUtil::ConverErrorMessageForJs(result);
987             callbackValues[ARRAY_INDEX_FIRST] =
988                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode);
989             callbackValues[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
990         }
991         napi_value callbackFunc = nullptr;
992         napi_get_reference_value(env, settingInfo.callbackRef, &callbackFunc);
993         napi_value thisVar = nullptr;
994         napi_get_reference_value(env, settingInfo.thisVar, &thisVar);
995         napi_value callbackResult = nullptr;
996         napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_TWO, callbackValues, &callbackResult);
997         napi_delete_reference(env, settingInfo.callbackRef);
998         napi_delete_reference(env, settingInfo.thisVar);
999     } else if (settingInfo.deferred != nullptr) {
1000         if (result == TELEPHONY_SUCCESS) {
1001             napi_value promiseValue = nullptr;
1002             napi_get_null(env, &promiseValue);
1003             napi_resolve_deferred(env, settingInfo.deferred, promiseValue);
1004         } else {
1005             JsError error = NapiUtil::ConverErrorMessageForJs(result);
1006             napi_reject_deferred(env, settingInfo.deferred,
1007                 NapiCallManagerUtils::CreateErrorMessageWithErrorCode(env, error.errorMessage, error.errorCode));
1008         }
1009     }
1010 }
1011 
ReportStartRttInfoWork(uv_work_t * work,int32_t status)1012 void NapiCallAbilityCallback::ReportStartRttInfoWork(uv_work_t *work, int32_t status)
1013 {
1014     CallSupplementWorker *dataWorkerData = (CallSupplementWorker *)work->data;
1015     if (dataWorkerData == nullptr) {
1016         TELEPHONY_LOGE("dataWorkerData is nullptr!");
1017         return;
1018     }
1019     ReportStartRttInfo(dataWorkerData->info, dataWorkerData->callback);
1020     delete dataWorkerData;
1021     dataWorkerData = nullptr;
1022     delete work;
1023     work = nullptr;
1024 }
1025 
ReportStartRttInfo(AppExecFwk::PacMap & resultInfo,EventCallback supplementInfo)1026 void NapiCallAbilityCallback::ReportStartRttInfo(AppExecFwk::PacMap &resultInfo, EventCallback supplementInfo)
1027 {
1028     napi_env env = supplementInfo.env;
1029     int32_t result = resultInfo.GetIntValue("result");
1030     if (supplementInfo.callbackRef != nullptr) {
1031         napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
1032         if (result == TELEPHONY_SUCCESS) {
1033             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
1034         } else {
1035             std::string errTip = std::to_string(CALL_ERR_NAPI_INTERFACE_FAILED);
1036             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorMessage(env, errTip);
1037             callbackValues[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
1038         }
1039         napi_value callbackFunc = nullptr;
1040         napi_get_reference_value(env, supplementInfo.callbackRef, &callbackFunc);
1041         napi_value thisVar = nullptr;
1042         napi_get_reference_value(env, supplementInfo.thisVar, &thisVar);
1043         napi_value callbackResult = nullptr;
1044         napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_TWO, callbackValues, &callbackResult);
1045         napi_delete_reference(env, supplementInfo.callbackRef);
1046         napi_delete_reference(env, supplementInfo.thisVar);
1047     } else if (supplementInfo.deferred != nullptr) {
1048         if (result == TELEPHONY_SUCCESS) {
1049             napi_value promiseValue = nullptr;
1050             napi_get_null(env, &promiseValue);
1051             napi_resolve_deferred(env, supplementInfo.deferred, promiseValue);
1052         } else {
1053             std::string errTip = std::to_string(CALL_ERR_NAPI_INTERFACE_FAILED);
1054             napi_reject_deferred(env, supplementInfo.deferred, NapiCallManagerUtils::CreateErrorMessage(env, errTip));
1055         }
1056     }
1057 }
1058 
ReportStopRttInfoWork(uv_work_t * work,int32_t status)1059 void NapiCallAbilityCallback::ReportStopRttInfoWork(uv_work_t *work, int32_t status)
1060 {
1061     CallSupplementWorker *dataWorkerData = (CallSupplementWorker *)work->data;
1062     if (dataWorkerData == nullptr) {
1063         TELEPHONY_LOGE("dataWorkerData is nullptr!");
1064         return;
1065     }
1066     ReportStopRttInfo(dataWorkerData->info, dataWorkerData->callback);
1067     delete dataWorkerData;
1068     dataWorkerData = nullptr;
1069     delete work;
1070     work = nullptr;
1071 }
1072 
ReportStopRttInfo(AppExecFwk::PacMap & resultInfo,EventCallback supplementInfo)1073 void NapiCallAbilityCallback::ReportStopRttInfo(AppExecFwk::PacMap &resultInfo, EventCallback supplementInfo)
1074 {
1075     napi_env env = supplementInfo.env;
1076     int32_t result = resultInfo.GetIntValue("result");
1077     if (supplementInfo.callbackRef != nullptr) {
1078         napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
1079         if (result == TELEPHONY_SUCCESS) {
1080             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
1081         } else {
1082             std::string errTip = std::to_string(CALL_ERR_NAPI_INTERFACE_FAILED);
1083             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorMessage(env, errTip);
1084             callbackValues[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
1085         }
1086         napi_value callbackFunc = nullptr;
1087         napi_get_reference_value(env, supplementInfo.callbackRef, &callbackFunc);
1088         napi_value thisVar = nullptr;
1089         napi_get_reference_value(env, supplementInfo.thisVar, &thisVar);
1090         napi_value callbackResult = nullptr;
1091         napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_TWO, callbackValues, &callbackResult);
1092         napi_delete_reference(env, supplementInfo.callbackRef);
1093         napi_delete_reference(env, supplementInfo.thisVar);
1094     } else if (supplementInfo.deferred != nullptr) {
1095         if (result == TELEPHONY_SUCCESS) {
1096             napi_value promiseValue = nullptr;
1097             napi_get_null(env, &promiseValue);
1098             napi_resolve_deferred(env, supplementInfo.deferred, promiseValue);
1099         } else {
1100             std::string errTip = std::to_string(CALL_ERR_NAPI_INTERFACE_FAILED);
1101             napi_reject_deferred(env, supplementInfo.deferred, NapiCallManagerUtils::CreateErrorMessage(env, errTip));
1102         }
1103     }
1104 }
1105 
ReportCallMediaModeInfoWork(uv_work_t * work,int32_t status)1106 void NapiCallAbilityCallback::ReportCallMediaModeInfoWork(uv_work_t *work, int32_t status)
1107 {
1108     CallSupplementWorker *dataWorkerData = (CallSupplementWorker *)work->data;
1109     if (dataWorkerData == nullptr) {
1110         TELEPHONY_LOGE("dataWorkerData is nullptr!");
1111         return;
1112     }
1113     ReportCallMediaModeInfo(dataWorkerData->info, dataWorkerData->callback);
1114     delete dataWorkerData;
1115     dataWorkerData = nullptr;
1116     delete work;
1117     work = nullptr;
1118 }
1119 
ReportCallMediaModeInfo(AppExecFwk::PacMap & resultInfo,EventCallback supplementInfo)1120 void NapiCallAbilityCallback::ReportCallMediaModeInfo(AppExecFwk::PacMap &resultInfo, EventCallback supplementInfo)
1121 {
1122     napi_env env = supplementInfo.env;
1123     int32_t result = resultInfo.GetIntValue("result");
1124     if (supplementInfo.callbackRef != nullptr) {
1125         napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
1126         if (result == TELEPHONY_SUCCESS) {
1127             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateUndefined(env);
1128         } else {
1129             std::string errTip = std::to_string(result);
1130             callbackValues[ARRAY_INDEX_FIRST] = NapiCallManagerUtils::CreateErrorMessage(env, errTip);
1131             callbackValues[ARRAY_INDEX_SECOND] = NapiCallManagerUtils::CreateUndefined(env);
1132         }
1133         napi_value callbackFunc = nullptr;
1134         napi_get_reference_value(env, supplementInfo.callbackRef, &callbackFunc);
1135         napi_value thisVar = nullptr;
1136         napi_get_reference_value(env, supplementInfo.thisVar, &thisVar);
1137         napi_value callbackResult = nullptr;
1138         napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_TWO, callbackValues, &callbackResult);
1139         napi_delete_reference(env, supplementInfo.callbackRef);
1140         napi_delete_reference(env, supplementInfo.thisVar);
1141     } else if (supplementInfo.deferred != nullptr) {
1142         if (result == TELEPHONY_SUCCESS) {
1143             napi_value promiseValue = nullptr;
1144             napi_get_null(env, &promiseValue);
1145             napi_resolve_deferred(env, supplementInfo.deferred, promiseValue);
1146         } else {
1147             std::string errTip = std::to_string(result);
1148             napi_reject_deferred(env, supplementInfo.deferred, NapiCallManagerUtils::CreateErrorMessage(env, errTip));
1149         }
1150     }
1151 }
1152 
ReportCallOttWork(uv_work_t * work,int32_t status)1153 void NapiCallAbilityCallback::ReportCallOttWork(uv_work_t *work, int32_t status)
1154 {
1155     CallOttWorker *dataWorkerData = (CallOttWorker *)work->data;
1156     if (dataWorkerData == nullptr) {
1157         TELEPHONY_LOGE("dataWorkerData is nullptr!");
1158         return;
1159     }
1160     ReportCallOtt(dataWorkerData->callback, dataWorkerData->info, dataWorkerData->requestId);
1161     delete dataWorkerData;
1162     dataWorkerData = nullptr;
1163     delete work;
1164     work = nullptr;
1165 }
1166 
ReportCallOtt(EventCallback & settingInfo,AppExecFwk::PacMap & resultInfo,OttCallRequestId requestId)1167 int32_t NapiCallAbilityCallback::ReportCallOtt(
1168     EventCallback &settingInfo, AppExecFwk::PacMap &resultInfo, OttCallRequestId requestId)
1169 {
1170     napi_value callbackFunc = nullptr;
1171     napi_env env = settingInfo.env;
1172     napi_value callbackValues[ARRAY_INDEX_THIRD] = { 0 };
1173     napi_create_object(env, &callbackValues[ARRAY_INDEX_FIRST]);
1174     NapiCallManagerUtils::SetPropertyInt32(
1175         env, callbackValues[ARRAY_INDEX_FIRST], "requestId", static_cast<int32_t>(requestId));
1176     NapiCallManagerUtils::SetPropertyStringUtf8(
1177         env, callbackValues[ARRAY_INDEX_FIRST], "phoneNumber", resultInfo.GetStringValue("phoneNumber").c_str());
1178     NapiCallManagerUtils::SetPropertyStringUtf8(
1179         env, callbackValues[ARRAY_INDEX_FIRST], "bundleName", resultInfo.GetStringValue("bundleName").c_str());
1180     NapiCallManagerUtils::SetPropertyInt32(
1181         env, callbackValues[ARRAY_INDEX_FIRST], "videoState", resultInfo.GetIntValue("videoState"));
1182     switch (requestId) {
1183         case OttCallRequestId::OTT_REQUEST_INVITE_TO_CONFERENCE:
1184             NapiCallManagerUtils::SetPropertyStringUtf8(
1185                 env, callbackValues[ARRAY_INDEX_FIRST], "number", resultInfo.GetStringValue("number").c_str());
1186             break;
1187         case OttCallRequestId::OTT_REQUEST_UPDATE_CALL_MEDIA_MODE:
1188             NapiCallManagerUtils::SetPropertyInt32(
1189                 env, callbackValues[ARRAY_INDEX_FIRST], "callMediaMode", resultInfo.GetIntValue("callMediaMode"));
1190             break;
1191         default:
1192             break;
1193     }
1194 
1195     napi_get_reference_value(env, settingInfo.callbackRef, &callbackFunc);
1196     if (callbackFunc == nullptr) {
1197         TELEPHONY_LOGE("callbackFunc is null!");
1198         return CALL_ERR_CALLBACK_NOT_EXIST;
1199     }
1200     napi_value thisVar = nullptr;
1201     napi_get_reference_value(env, settingInfo.thisVar, &thisVar);
1202     napi_value callbackResult = nullptr;
1203     napi_call_function(env, thisVar, callbackFunc, DATA_LENGTH_ONE, callbackValues, &callbackResult);
1204     return TELEPHONY_SUCCESS;
1205 }
1206 } // namespace Telephony
1207 } // namespace OHOS
1208