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