• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "native_devicemanager_js.h"
17 
18 #include <securec.h>
19 #include <uv.h>
20 #include <mutex>
21 
22 #include "device_manager.h"
23 #include "dm_constants.h"
24 #include "dm_device_info.h"
25 #include "dm_log.h"
26 #include "ipc_skeleton.h"
27 #include "js_native_api.h"
28 #include "tokenid_kit.h"
29 #include "nlohmann/json.hpp"
30 
31 using namespace OHOS::DistributedHardware;
32 
33 namespace {
34 #define GET_PARAMS(env, info, num)    \
35     size_t argc = num;                \
36     napi_value argv[num] = {nullptr}; \
37     napi_value thisVar = nullptr;     \
38     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr))
39 
40 const std::string DM_NAPI_EVENT_DEVICE_STATE_CHANGE = "deviceStateChange";
41 const std::string DM_NAPI_EVENT_DEVICE_FOUND = "deviceFound";
42 const std::string DM_NAPI_EVENT_DEVICE_DISCOVERY_FAIL = "discoveryFail";
43 const std::string DM_NAPI_EVENT_DEVICE_PUBLISH_SUCCESS = "publishSuccess";
44 const std::string DM_NAPI_EVENT_DEVICE_PUBLISH_FAIL = "publishFail";
45 const std::string DM_NAPI_EVENT_DEVICE_SERVICE_DIE = "serviceDie";
46 const std::string DEVICE_MANAGER_NAPI_CLASS_NAME = "DeviceManager";
47 const std::string DM_NAPI_EVENT_UI_STATE_CHANGE = "uiStateChange";
48 
49 const int32_t DM_NAPI_ARGS_ZERO = 0;
50 const int32_t DM_NAPI_ARGS_ONE = 1;
51 const int32_t DM_NAPI_ARGS_TWO = 2;
52 const int32_t DM_NAPI_ARGS_THREE = 3;
53 const int32_t DM_NAPI_SUB_ID_MAX = 65535;
54 const int32_t DM_AUTH_DIRECTION_CLIENT = 1;
55 const int32_t DM_AUTH_REQUEST_SUCCESS_STATUS = 7;
56 
57 const int32_t DM_NAPI_SUBSCRIBE_CAPABILITY_DDMP = 0;
58 const int32_t DM_NAPI_SUBSCRIBE_CAPABILITY_OSD = 1;
59 
60 napi_ref deviceTypeEnumConstructor_ = nullptr;
61 napi_ref deviceStateChangeActionEnumConstructor_ = nullptr;
62 napi_ref discoverModeEnumConstructor_ = nullptr;
63 napi_ref exchangeMediumEnumConstructor_ = nullptr;
64 napi_ref exchangeFreqEnumConstructor_ = nullptr;
65 napi_ref subscribeCapEnumConstructor_ = nullptr;
66 
67 std::map<std::string, DeviceManagerNapi *> g_deviceManagerMap;
68 std::map<std::string, std::shared_ptr<DmNapiInitCallback>> g_initCallbackMap;
69 std::map<std::string, std::shared_ptr<DmNapiDeviceStateCallback>> g_deviceStateCallbackMap;
70 std::map<std::string, std::shared_ptr<DmNapiDiscoveryCallback>> g_DiscoveryCallbackMap;
71 std::map<std::string, std::shared_ptr<DmNapiPublishCallback>> g_publishCallbackMap;
72 std::map<std::string, std::shared_ptr<DmNapiAuthenticateCallback>> g_authCallbackMap;
73 std::map<std::string, std::shared_ptr<DmNapiDeviceManagerUiCallback>> g_dmUiCallbackMap;
74 std::map<std::string, std::shared_ptr<DmNapiCredentialCallback>> g_creCallbackMap;
75 
76 std::mutex g_initCallbackMapMutex;
77 std::mutex g_deviceManagerMapMutex;
78 
79 enum DMBussinessErrorCode {
80     // Permission verify failed.
81     ERR_NO_PERMISSION = 201,
82     //The caller is not a system application.
83     ERR_NOT_SYSTEM_APP = 202,
84     // Input parameter error.
85     ERR_INVALID_PARAMS = 401,
86     // Failed to execute the function.
87     DM_ERR_FAILED = 11600101,
88     // Failed to obtain the service.
89     DM_ERR_OBTAIN_SERVICE = 11600102,
90     // Authentication invalid.
91     DM_ERR_AUTHENTICALTION_INVALID = 11600103,
92     // Discovery invalid.
93     DM_ERR_DISCOVERY_INVALID = 11600104,
94     // Publish invalid.
95     DM_ERR_PUBLISH_INVALID = 11600105,
96 };
97 
98 const std::string ERR_MESSAGE_NO_PERMISSION = "Permission verify failed.";
99 const std::string ERR_MESSAGE_NOT_SYSTEM_APP = "The caller is not a system application.";
100 const std::string ERR_MESSAGE_INVALID_PARAMS = "Input parameter error.";
101 const std::string ERR_MESSAGE_FAILED = "Failed to execute the function.";
102 const std::string ERR_MESSAGE_OBTAIN_SERVICE = "Failed to obtain the service.";
103 const std::string ERR_MESSAGE_AUTHENTICALTION_INVALID = "Authentication invalid.";
104 const std::string ERR_MESSAGE_DISCOVERY_INVALID = "Discovery invalid.";
105 const std::string ERR_MESSAGE_PUBLISH_INVALID = "Publish invalid.";
106 
GenerateBusinessError(napi_env env,int32_t err,const std::string & msg)107 napi_value GenerateBusinessError(napi_env env, int32_t err, const std::string &msg)
108 {
109     napi_value businessError = nullptr;
110     NAPI_CALL(env, napi_create_object(env, &businessError));
111     napi_value errorCode = nullptr;
112     NAPI_CALL(env, napi_create_int32(env, err, &errorCode));
113     napi_value errorMessage = nullptr;
114     NAPI_CALL(env, napi_create_string_utf8(env, msg.c_str(), NAPI_AUTO_LENGTH, &errorMessage));
115     NAPI_CALL(env, napi_set_named_property(env, businessError, "code", errorCode));
116     NAPI_CALL(env, napi_set_named_property(env, businessError, "message", errorMessage));
117 
118     return businessError;
119 }
120 
CheckArgsVal(napi_env env,bool assertion,const std::string & param,const std::string & msg)121 bool CheckArgsVal(napi_env env, bool assertion, const std::string &param, const std::string &msg)
122 {
123     if (!(assertion)) {
124         std::string errMsg = ERR_MESSAGE_INVALID_PARAMS + "The value of " + param + ": " + msg;
125         napi_throw_error(env, std::to_string(ERR_INVALID_PARAMS).c_str(), errMsg.c_str());
126         return false;
127     }
128     return true;
129 }
130 
CheckArgsCount(napi_env env,bool assertion,const std::string & message)131 bool CheckArgsCount(napi_env env, bool assertion, const std::string &message)
132 {
133     if (!(assertion)) {
134         std::string errMsg = ERR_MESSAGE_INVALID_PARAMS + message;
135         napi_throw_error(env, std::to_string(ERR_INVALID_PARAMS).c_str(), errMsg.c_str());
136         return false;
137     }
138     return true;
139 }
140 
CheckArgsType(napi_env env,bool assertion,const std::string & paramName,const std::string & type)141 bool CheckArgsType(napi_env env, bool assertion, const std::string &paramName, const std::string &type)
142 {
143     if (!(assertion)) {
144         std::string errMsg = ERR_MESSAGE_INVALID_PARAMS + "The type of " + paramName +
145                 " must be " + type;
146         napi_throw_error(env, std::to_string(ERR_INVALID_PARAMS).c_str(), errMsg.c_str());
147         return false;
148     }
149     return true;
150 }
151 
CreateErrorForCall(napi_env env,int32_t code,const std::string & errMsg,bool isAsync=true)152 napi_value CreateErrorForCall(napi_env env, int32_t code, const std::string &errMsg, bool isAsync = true)
153 {
154     LOGI("CreateErrorForCall code:%d, message:%s", code, errMsg.c_str());
155     napi_value error = nullptr;
156     if (isAsync) {
157         napi_throw_error(env, std::to_string(code).c_str(), errMsg.c_str());
158     } else {
159         error = GenerateBusinessError(env, code, errMsg);
160     }
161     return error;
162 }
163 
CreateBusinessError(napi_env env,int32_t errCode,bool isAsync=true)164 napi_value CreateBusinessError(napi_env env, int32_t errCode, bool isAsync = true)
165 {
166     napi_value error = nullptr;
167     switch (errCode) {
168         case ERR_DM_NO_PERMISSION:
169             error = CreateErrorForCall(env, ERR_NO_PERMISSION, ERR_MESSAGE_NO_PERMISSION, isAsync);
170             break;
171         case ERR_DM_DISCOVERY_REPEATED:
172             error = CreateErrorForCall(env, DM_ERR_DISCOVERY_INVALID, ERR_MESSAGE_DISCOVERY_INVALID, isAsync);
173             break;
174         case ERR_DM_PUBLISH_REPEATED:
175             error = CreateErrorForCall(env, DM_ERR_PUBLISH_INVALID, ERR_MESSAGE_PUBLISH_INVALID, isAsync);
176             break;
177         case ERR_DM_AUTH_BUSINESS_BUSY:
178             error = CreateErrorForCall(env, DM_ERR_AUTHENTICALTION_INVALID,
179                 ERR_MESSAGE_AUTHENTICALTION_INVALID, isAsync);
180             break;
181         case ERR_DM_INPUT_PARA_INVALID:
182         case ERR_DM_UNSUPPORTED_AUTH_TYPE:
183             error = CreateErrorForCall(env, ERR_INVALID_PARAMS, ERR_MESSAGE_INVALID_PARAMS, isAsync);
184             break;
185         case ERR_DM_INIT_FAILED:
186             error = CreateErrorForCall(env, DM_ERR_OBTAIN_SERVICE, ERR_MESSAGE_OBTAIN_SERVICE, isAsync);
187             break;
188         case ERR_NOT_SYSTEM_APP:
189             error = CreateErrorForCall(env, ERR_NOT_SYSTEM_APP, ERR_MESSAGE_NOT_SYSTEM_APP, isAsync);
190             break;
191         default:
192             error = CreateErrorForCall(env, DM_ERR_FAILED, ERR_MESSAGE_FAILED, isAsync);
193             break;
194     }
195     return error;
196 }
197 
DeleteUvWork(uv_work_t * work)198 void DeleteUvWork(uv_work_t *work)
199 {
200     if (work == nullptr) {
201         return;
202     }
203     delete work;
204     work = nullptr;
205     LOGI("delete work!");
206 }
207 
DeleteDmNapiStateJsCallbackPtr(DmNapiStateJsCallback * pJsCallbackPtr)208 void DeleteDmNapiStateJsCallbackPtr(DmNapiStateJsCallback *pJsCallbackPtr)
209 {
210     if (pJsCallbackPtr == nullptr) {
211         return;
212     }
213     delete pJsCallbackPtr;
214     pJsCallbackPtr = nullptr;
215     LOGI("delete DmNapiStateJsCallback callbackPtr!");
216 }
217 
DeleteAsyncCallbackInfo(DeviceInfoListAsyncCallbackInfo * pAsynCallbackInfo)218 void DeleteAsyncCallbackInfo(DeviceInfoListAsyncCallbackInfo *pAsynCallbackInfo)
219 {
220     if (pAsynCallbackInfo == nullptr) {
221         return;
222     }
223     delete pAsynCallbackInfo;
224     pAsynCallbackInfo = nullptr;
225 }
226 
IsJSObjectType(napi_env env,napi_value value,const std::string & param)227 bool IsJSObjectType(napi_env env, napi_value value, const std::string &param)
228 {
229     napi_valuetype authparamType = napi_undefined;
230     napi_typeof(env, value, &authparamType);
231     return CheckArgsType(env, authparamType == napi_object, param, "object");
232 }
233 
IsFunctionType(napi_env env,napi_value value)234 bool IsFunctionType(napi_env env, napi_value value)
235 {
236     napi_valuetype eventHandleType = napi_undefined;
237     napi_typeof(env, value, &eventHandleType);
238     return CheckArgsType(env, eventHandleType == napi_function, "callback", "function");
239 }
240 
IsDeviceManagerNapiNull(napi_env env,napi_value thisVar,DeviceManagerNapi ** pDeviceManagerWrapper)241 bool IsDeviceManagerNapiNull(napi_env env, napi_value thisVar, DeviceManagerNapi **pDeviceManagerWrapper)
242 {
243     napi_unwrap(env, thisVar, reinterpret_cast<void **>(pDeviceManagerWrapper));
244     if (pDeviceManagerWrapper != nullptr && *pDeviceManagerWrapper != nullptr) {
245         return false;
246     }
247     CreateBusinessError(env, ERR_DM_POINT_NULL);
248     LOGE(" DeviceManagerNapi object is nullptr!");
249     return true;
250 }
251 } // namespace
252 
253 thread_local napi_ref DeviceManagerNapi::sConstructor_ = nullptr;
254 AuthAsyncCallbackInfo DeviceManagerNapi::authAsyncCallbackInfo_;
255 CredentialAsyncCallbackInfo DeviceManagerNapi::creAsyncCallbackInfo_;
256 std::mutex DeviceManagerNapi::creMapLocks_;
257 
OnRemoteDied()258 void DmNapiInitCallback::OnRemoteDied()
259 {
260     uv_loop_s *loop = nullptr;
261     napi_get_uv_event_loop(env_, &loop);
262     if (loop == nullptr) {
263         return;
264     }
265     uv_work_t *work = new (std::nothrow) uv_work_t;
266     if (work == nullptr) {
267         LOGE("DmNapiInitCallback: OnRemoteDied, No memory");
268         return;
269     }
270 
271     DmDeviceInfo info;
272     DmNapiStateJsCallback *jsCallback = new DmNapiStateJsCallback(bundleName_, 0, 0, info);
273     if (jsCallback == nullptr) {
274         DeleteUvWork(work);
275         return;
276     }
277     work->data = reinterpret_cast<void *>(jsCallback);
278 
279     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
280         DmNapiStateJsCallback *callback = reinterpret_cast<DmNapiStateJsCallback *>(work->data);
281         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
282         if (deviceManagerNapi == nullptr) {
283             LOGE("OnRemoteDied, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
284         } else {
285             deviceManagerNapi->OnEvent("serviceDie", 0, nullptr);
286         }
287         LOGI("OnRemoteDied, deviceManagerNapi bundleName %s", callback->bundleName_.c_str());
288         DeleteDmNapiStateJsCallbackPtr(callback);
289         DeleteUvWork(work);
290     }, uv_qos_user_initiated);
291     if (ret != 0) {
292         LOGE("Failed to execute OnRemoteDied work queue");
293         DeleteDmNapiStateJsCallbackPtr(jsCallback);
294         DeleteUvWork(work);
295     }
296 }
297 
OnDeviceOnline(const DmDeviceInfo & deviceInfo)298 void DmNapiDeviceStateCallback::OnDeviceOnline(const DmDeviceInfo &deviceInfo)
299 {
300     uv_loop_s *loop = nullptr;
301     napi_get_uv_event_loop(env_, &loop);
302     if (loop == nullptr) {
303         return;
304     }
305     uv_work_t *work = new (std::nothrow) uv_work_t;
306     if (work == nullptr) {
307         LOGE("DmNapiDeviceStateCallback: OnDeviceOnline, No memory");
308         return;
309     }
310 
311     DmNapiStateJsCallback *jsCallback = new DmNapiStateJsCallback(bundleName_, 0, 0, deviceInfo);
312     if (jsCallback == nullptr) {
313         DeleteUvWork(work);
314         return;
315     }
316     work->data = reinterpret_cast<void *>(jsCallback);
317 
318     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
319         DmNapiStateJsCallback *callback = reinterpret_cast<DmNapiStateJsCallback *>(work->data);
320         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
321         if (deviceManagerNapi == nullptr) {
322             LOGE("OnDeviceOnline, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
323         } else {
324             deviceManagerNapi->OnDeviceStateChange(DmNapiDevStateChangeAction::ONLINE, callback->deviceInfo_);
325         }
326         DeleteDmNapiStateJsCallbackPtr(callback);
327         DeleteUvWork(work);
328     }, uv_qos_user_initiated);
329     if (ret != 0) {
330         LOGE("Failed to execute OnDeviceOnline work queue");
331         DeleteDmNapiStateJsCallbackPtr(jsCallback);
332         DeleteUvWork(work);
333     }
334 }
335 
OnDeviceReady(const DmDeviceInfo & deviceInfo)336 void DmNapiDeviceStateCallback::OnDeviceReady(const DmDeviceInfo &deviceInfo)
337 {
338     uv_loop_s *loop = nullptr;
339     napi_get_uv_event_loop(env_, &loop);
340     if (loop == nullptr) {
341         return;
342     }
343     uv_work_t *work = new (std::nothrow) uv_work_t;
344     if (work == nullptr) {
345         LOGE("DmNapiDeviceStateCallback: OnDeviceReady, No memory");
346         return;
347     }
348 
349     DmNapiStateJsCallback *jsCallback = new DmNapiStateJsCallback(bundleName_, 0, 0, deviceInfo);
350     if (jsCallback == nullptr) {
351         DeleteUvWork(work);
352         return;
353     }
354     work->data = reinterpret_cast<void *>(jsCallback);
355 
356     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
357         DmNapiStateJsCallback *callback = reinterpret_cast<DmNapiStateJsCallback *>(work->data);
358         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
359         if (deviceManagerNapi == nullptr) {
360             LOGE("OnDeviceReady, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
361         } else {
362             deviceManagerNapi->OnDeviceStateChange(DmNapiDevStateChangeAction::READY, callback->deviceInfo_);
363         }
364         DeleteDmNapiStateJsCallbackPtr(callback);
365         DeleteUvWork(work);
366     }, uv_qos_user_initiated);
367     if (ret != 0) {
368         LOGE("Failed to execute OnDeviceReady work queue");
369         DeleteDmNapiStateJsCallbackPtr(jsCallback);
370         DeleteUvWork(work);
371     }
372 }
373 
OnDeviceOffline(const DmDeviceInfo & deviceInfo)374 void DmNapiDeviceStateCallback::OnDeviceOffline(const DmDeviceInfo &deviceInfo)
375 {
376     uv_loop_s *loop = nullptr;
377     napi_get_uv_event_loop(env_, &loop);
378     if (loop == nullptr) {
379         return;
380     }
381     uv_work_t *work = new (std::nothrow) uv_work_t;
382     if (work == nullptr) {
383         LOGE("DmNapiDeviceStateCallback: OnDeviceOffline, No memory");
384         return;
385     }
386 
387     DmNapiStateJsCallback *jsCallback = new DmNapiStateJsCallback(bundleName_, 0, 0, deviceInfo);
388     if (jsCallback == nullptr) {
389         DeleteUvWork(work);
390         return;
391     }
392     work->data = reinterpret_cast<void *>(jsCallback);
393 
394     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
395         DmNapiStateJsCallback *callback = reinterpret_cast<DmNapiStateJsCallback *>(work->data);
396         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
397         if (deviceManagerNapi == nullptr) {
398             LOGE("OnDeviceOffline, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
399         } else {
400             deviceManagerNapi->OnDeviceStateChange(DmNapiDevStateChangeAction::OFFLINE, callback->deviceInfo_);
401         }
402         DeleteDmNapiStateJsCallbackPtr(callback);
403         DeleteUvWork(work);
404     }, uv_qos_user_initiated);
405     if (ret != 0) {
406         LOGE("Failed to execute OnDeviceOffline work queue");
407         DeleteDmNapiStateJsCallbackPtr(jsCallback);
408         DeleteUvWork(work);
409     }
410 }
411 
OnDeviceChanged(const DmDeviceInfo & deviceInfo)412 void DmNapiDeviceStateCallback::OnDeviceChanged(const DmDeviceInfo &deviceInfo)
413 {
414     uv_loop_s *loop = nullptr;
415     napi_get_uv_event_loop(env_, &loop);
416     if (loop == nullptr) {
417         return;
418     }
419     uv_work_t *work = new (std::nothrow) uv_work_t;
420     if (work == nullptr) {
421         LOGE("DmNapiDeviceStateCallback: OnDeviceChanged, No memory");
422         return;
423     }
424 
425     DmNapiStateJsCallback *jsCallback = new DmNapiStateJsCallback(bundleName_, 0, 0, deviceInfo);
426     if (jsCallback == nullptr) {
427         DeleteUvWork(work);
428         return;
429     }
430     work->data = reinterpret_cast<void *>(jsCallback);
431 
432     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
433         DmNapiStateJsCallback *callback = reinterpret_cast<DmNapiStateJsCallback *>(work->data);
434         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
435         if (deviceManagerNapi == nullptr) {
436             LOGE("OnDeviceChanged, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
437         } else {
438             deviceManagerNapi->OnDeviceStateChange(DmNapiDevStateChangeAction::CHANGE, callback->deviceInfo_);
439         }
440         DeleteDmNapiStateJsCallbackPtr(callback);
441         DeleteUvWork(work);
442     }, uv_qos_user_initiated);
443     if (ret != 0) {
444         LOGE("Failed to execute OnDeviceChanged work queue");
445         DeleteDmNapiStateJsCallbackPtr(jsCallback);
446         DeleteUvWork(work);
447     }
448 }
449 
OnDeviceFound(uint16_t subscribeId,const DmDeviceInfo & deviceInfo)450 void DmNapiDiscoveryCallback::OnDeviceFound(uint16_t subscribeId, const DmDeviceInfo &deviceInfo)
451 {
452     LOGI("OnDeviceFound for %s, subscribeId %d", bundleName_.c_str(), (int32_t)subscribeId);
453 
454     uv_loop_s *loop = nullptr;
455     napi_get_uv_event_loop(env_, &loop);
456     if (loop == nullptr) {
457         return;
458     }
459     uv_work_t *work = new (std::nothrow) uv_work_t;
460     if (work == nullptr) {
461         LOGE("DmNapiDiscoveryCallback: OnDeviceFound, No memory");
462         return;
463     }
464 
465     DmNapiStateJsCallback *jsCallback = new DmNapiStateJsCallback(bundleName_, subscribeId, 0, deviceInfo);
466     if (jsCallback == nullptr) {
467         DeleteUvWork(work);
468         return;
469     }
470     work->data = reinterpret_cast<void *>(jsCallback);
471 
472     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
473         DmNapiStateJsCallback *callback = reinterpret_cast<DmNapiStateJsCallback *>(work->data);
474         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
475         if (deviceManagerNapi == nullptr) {
476             LOGE("OnDeviceFound, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
477         } else {
478             deviceManagerNapi->OnDeviceFound(callback->subscribeId_, callback->deviceInfo_);
479         }
480         DeleteDmNapiStateJsCallbackPtr(callback);
481         DeleteUvWork(work);
482     }, uv_qos_user_initiated);
483     if (ret != 0) {
484         LOGE("Failed to execute OnDeviceFound work queue");
485         DeleteDmNapiStateJsCallbackPtr(jsCallback);
486         DeleteUvWork(work);
487     }
488 }
489 
OnDiscoveryFailed(uint16_t subscribeId,int32_t failedReason)490 void DmNapiDiscoveryCallback::OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason)
491 {
492     LOGI("OnDiscoveryFailed for %s, subscribeId %d", bundleName_.c_str(), (int32_t)subscribeId);
493 
494     uv_loop_s *loop = nullptr;
495     napi_get_uv_event_loop(env_, &loop);
496     if (loop == nullptr) {
497         return;
498     }
499     uv_work_t *work = new (std::nothrow) uv_work_t;
500     if (work == nullptr) {
501         LOGE("DmNapiDiscoveryCallback: OnDiscoveryFailed, No memory");
502         return;
503     }
504 
505     DmDeviceInfo info;
506     DmNapiStateJsCallback *jsCallback = new DmNapiStateJsCallback(bundleName_, subscribeId,
507         failedReason, info);
508     if (jsCallback == nullptr) {
509         DeleteUvWork(work);
510         return;
511     }
512     work->data = reinterpret_cast<void *>(jsCallback);
513 
514     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
515         DmNapiStateJsCallback *callback = reinterpret_cast<DmNapiStateJsCallback *>(work->data);
516         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
517         if (deviceManagerNapi == nullptr) {
518             LOGE("OnDiscoveryFailed, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
519         } else {
520             deviceManagerNapi->OnDiscoveryFailed(callback->subscribeId_, callback->reason_);
521         }
522         DeleteDmNapiStateJsCallbackPtr(callback);
523         DeleteUvWork(work);
524     }, uv_qos_user_initiated);
525     if (ret != 0) {
526         LOGE("Failed to execute OnDiscoveryFailed work queue");
527         DeleteDmNapiStateJsCallbackPtr(jsCallback);
528         DeleteUvWork(work);
529     }
530 }
531 
OnDiscoverySuccess(uint16_t subscribeId)532 void DmNapiDiscoveryCallback::OnDiscoverySuccess(uint16_t subscribeId)
533 {
534     DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(bundleName_);
535     if (deviceManagerNapi == nullptr) {
536         LOGE("OnDiscoverySuccess, deviceManagerNapi not find for bundleName %s", bundleName_.c_str());
537         return;
538     }
539     LOGI("DiscoverySuccess for %s, subscribeId %d", bundleName_.c_str(), (int32_t)subscribeId);
540 }
541 
IncreaseRefCount()542 void DmNapiDiscoveryCallback::IncreaseRefCount()
543 {
544     refCount_++;
545 }
546 
DecreaseRefCount()547 void DmNapiDiscoveryCallback::DecreaseRefCount()
548 {
549     refCount_--;
550 }
551 
GetRefCount()552 int32_t DmNapiDiscoveryCallback::GetRefCount()
553 {
554     return refCount_;
555 }
556 
OnPublishResult(int32_t publishId,int32_t publishResult)557 void DmNapiPublishCallback::OnPublishResult(int32_t publishId, int32_t publishResult)
558 {
559     LOGI("OnPublishResult for %s, publishId %d, publishResult %d", bundleName_.c_str(), publishId, publishResult);
560     uv_loop_s *loop = nullptr;
561     napi_get_uv_event_loop(env_, &loop);
562     if (loop == nullptr) {
563         return;
564     }
565     uv_work_t *work = new (std::nothrow) uv_work_t;
566     if (work == nullptr) {
567         LOGE("DmNapiPublishCallback: OnPublishResult, No memory");
568         return;
569     }
570 
571     DmNapiPublishJsCallback *jsCallback = new DmNapiPublishJsCallback(bundleName_, publishId, publishResult);
572     if (jsCallback == nullptr) {
573         DeleteUvWork(work);
574         return;
575     }
576     work->data = reinterpret_cast<void *>(jsCallback);
577 
578     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
579         DmNapiPublishJsCallback *callback = reinterpret_cast<DmNapiPublishJsCallback *>(work->data);
580         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
581         if (deviceManagerNapi == nullptr) {
582             LOGE("OnPublishResult, deviceManagerNapi failed for bundleName %s", callback->bundleName_.c_str());
583         } else {
584             deviceManagerNapi->OnPublishResult(callback->publishId_, callback->reason_);
585         }
586         delete callback;
587         callback = nullptr;
588         DeleteUvWork(work);
589     }, uv_qos_user_initiated);
590     if (ret != 0) {
591         LOGE("Failed to execute OnPublishResult work queue");
592         delete jsCallback;
593         jsCallback = nullptr;
594         DeleteUvWork(work);
595     }
596 }
597 
IncreaseRefCount()598 void DmNapiPublishCallback::IncreaseRefCount()
599 {
600     refCount_++;
601 }
602 
DecreaseRefCount()603 void DmNapiPublishCallback::DecreaseRefCount()
604 {
605     refCount_--;
606 }
607 
GetRefCount()608 int32_t DmNapiPublishCallback::GetRefCount()
609 {
610     return refCount_;
611 }
612 
OnAuthResult(const std::string & deviceId,const std::string & token,int32_t status,int32_t reason)613 void DmNapiAuthenticateCallback::OnAuthResult(const std::string &deviceId, const std::string &token, int32_t status,
614                                               int32_t reason)
615 {
616     uv_loop_s *loop = nullptr;
617     napi_get_uv_event_loop(env_, &loop);
618     if (loop == nullptr) {
619         return;
620     }
621     uv_work_t *work = new (std::nothrow) uv_work_t;
622     if (work == nullptr) {
623         LOGE("js DmNapiAuthenticateCallback::OnAuthResult, No memory");
624         return;
625     }
626 
627     DmNapiAuthJsCallback *jsCallback = new DmNapiAuthJsCallback(bundleName_, deviceId, token, status, reason);
628     if (jsCallback == nullptr) {
629         DeleteUvWork(work);
630         return;
631     }
632     work->data = reinterpret_cast<void *>(jsCallback);
633 
634     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
635         DmNapiAuthJsCallback *callback = reinterpret_cast<DmNapiAuthJsCallback *>(work->data);
636         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
637         if (deviceManagerNapi == nullptr) {
638             LOGE("OnAuthResult, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
639         } else {
640             deviceManagerNapi->OnAuthResult(callback->deviceId_, callback->token_,
641                 callback->status_, callback->reason_);
642         }
643         delete callback;
644         callback = nullptr;
645         DeleteUvWork(work);
646     }, uv_qos_user_initiated);
647     if (ret != 0) {
648         LOGE("Failed to execute OnAuthResult work queue");
649         delete jsCallback;
650         jsCallback = nullptr;
651         DeleteUvWork(work);
652     }
653 }
654 
OnCredentialResult(int32_t & action,const std::string & credentialResult)655 void DmNapiCredentialCallback::OnCredentialResult(int32_t &action, const std::string &credentialResult)
656 {
657     uv_loop_s *loop = nullptr;
658     napi_get_uv_event_loop(env_, &loop);
659     if (loop == nullptr) {
660         return;
661     }
662     uv_work_t *work = new (std::nothrow) uv_work_t;
663     if (work == nullptr) {
664         LOGE("js DmNapiAuthenticateCallback::OnAuthResult, No memory");
665         return;
666     }
667 
668     DmNapiCredentialJsCallback *jsCallback = new DmNapiCredentialJsCallback(bundleName_, action, credentialResult);
669     if (jsCallback == nullptr) {
670         delete work;
671         work = nullptr;
672         return;
673     }
674     work->data = reinterpret_cast<void *>(jsCallback);
675 
676     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
677         DmNapiCredentialJsCallback *callback = reinterpret_cast<DmNapiCredentialJsCallback *>(work->data);
678         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
679         if (deviceManagerNapi == nullptr) {
680             LOGE("OnCredentialResult, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
681         } else {
682             deviceManagerNapi->OnCredentialResult(callback->action_, callback->credentialResult_);
683         }
684         delete callback;
685         callback = nullptr;
686         delete work;
687         work = nullptr;
688     }, uv_qos_user_initiated);
689     if (ret != 0) {
690         LOGE("Failed to execute OnCredentialResult work queue");
691         delete jsCallback;
692         jsCallback = nullptr;
693         delete work;
694         work = nullptr;
695     }
696 }
697 
DeviceManagerNapi(napi_env env,napi_value thisVar)698 DeviceManagerNapi::DeviceManagerNapi(napi_env env, napi_value thisVar) : DmNativeEvent(env, thisVar)
699 {
700     env_ = env;
701 }
702 
~DeviceManagerNapi()703 DeviceManagerNapi::~DeviceManagerNapi()
704 {
705 }
706 
GetDeviceManagerNapi(std::string & bundleName)707 DeviceManagerNapi *DeviceManagerNapi::GetDeviceManagerNapi(std::string &bundleName)
708 {
709     std::lock_guard<std::mutex> autoLock(g_deviceManagerMapMutex);
710     auto iter = g_deviceManagerMap.find(bundleName);
711     if (iter == g_deviceManagerMap.end()) {
712         return nullptr;
713     }
714     return iter->second;
715 }
716 
OnDeviceStateChange(DmNapiDevStateChangeAction action,const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)717 void DeviceManagerNapi::OnDeviceStateChange(DmNapiDevStateChangeAction action,
718                                             const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
719 {
720     napi_handle_scope scope;
721     napi_open_handle_scope(env_, &scope);
722     napi_value result = nullptr;
723     napi_create_object(env_, &result);
724     SetValueInt32(env_, "action", (int)action, result);
725 
726     napi_value device = nullptr;
727     napi_create_object(env_, &device);
728     SetValueUtf8String(env_, "deviceId", deviceInfo.deviceId, device);
729     SetValueUtf8String(env_, "networkId", deviceInfo.networkId, device);
730     SetValueUtf8String(env_, "deviceName", deviceInfo.deviceName, device);
731     SetValueInt32(env_, "deviceType", (int)deviceInfo.deviceTypeId, device);
732     SetValueInt32(env_, "authForm", (int)deviceInfo.authForm, device);
733 
734     napi_set_named_property(env_, result, "device", device);
735     OnEvent("deviceStateChange", DM_NAPI_ARGS_ONE, &result);
736     napi_close_handle_scope(env_, scope);
737 }
738 
OnDeviceFound(uint16_t subscribeId,const DmDeviceInfo & deviceInfo)739 void DeviceManagerNapi::OnDeviceFound(uint16_t subscribeId, const DmDeviceInfo &deviceInfo)
740 {
741     LOGI("OnDeviceFound for subscribeId %d, range : %d", (int32_t)subscribeId, deviceInfo.range);
742     napi_handle_scope scope;
743     napi_open_handle_scope(env_, &scope);
744     napi_value result = nullptr;
745     napi_create_object(env_, &result);
746     SetValueInt32(env_, "subscribeId", (int)subscribeId, result);
747 
748     napi_value device = nullptr;
749     napi_create_object(env_, &device);
750     SetValueUtf8String(env_, "deviceId", deviceInfo.deviceId, device);
751     SetValueUtf8String(env_, "networkId", deviceInfo.networkId, device);
752     SetValueUtf8String(env_, "deviceName", deviceInfo.deviceName, device);
753     SetValueInt32(env_, "deviceType", (int)deviceInfo.deviceTypeId, device);
754     SetValueInt32(env_, "authForm", (int)deviceInfo.authForm, device);
755     SetValueInt32(env_, "range", deviceInfo.range, device);
756 
757     napi_set_named_property(env_, result, "device", device);
758     OnEvent("deviceFound", DM_NAPI_ARGS_ONE, &result);
759     napi_close_handle_scope(env_, scope);
760 }
761 
OnDiscoveryFailed(uint16_t subscribeId,int32_t failedReason)762 void DeviceManagerNapi::OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason)
763 {
764     LOGI("OnDiscoveryFailed for subscribeId %d", (int32_t)subscribeId);
765     napi_handle_scope scope;
766     napi_open_handle_scope(env_, &scope);
767     napi_value result = nullptr;
768     napi_create_object(env_, &result);
769     SetValueInt32(env_, "subscribeId", (int)subscribeId, result);
770     SetValueInt32(env_, "reason", (int)failedReason, result);
771     std::string errCodeInfo = OHOS::DistributedHardware::GetErrorString((int)failedReason);
772     SetValueUtf8String(env_, "errInfo", errCodeInfo, result);
773     OnEvent("discoverFail", DM_NAPI_ARGS_ONE, &result);
774     napi_close_handle_scope(env_, scope);
775 }
776 
OnPublishResult(int32_t publishId,int32_t publishResult)777 void DeviceManagerNapi::OnPublishResult(int32_t publishId, int32_t publishResult)
778 {
779     LOGI("OnPublishResult for publishId %d, publishResult %d", publishId, publishResult);
780     napi_handle_scope scope;
781     napi_open_handle_scope(env_, &scope);
782     napi_value result = nullptr;
783     napi_create_object(env_, &result);
784     SetValueInt32(env_, "publishId", publishId, result);
785     if (publishResult == 0) {
786         OnEvent("publishSuccess", DM_NAPI_ARGS_ONE, &result);
787     } else {
788         SetValueInt32(env_, "reason", publishResult, result);
789         std::string errCodeInfo = OHOS::DistributedHardware::GetErrorString(publishResult);
790         SetValueUtf8String(env_, "errInfo", errCodeInfo, result);
791         OnEvent("publishFail", DM_NAPI_ARGS_ONE, &result);
792     }
793     NAPI_CALL_RETURN_VOID(env_, napi_close_handle_scope(env_, scope));
794 }
795 
OnCredentialResult(int32_t & action,const std::string & credentialResult)796 void DeviceManagerNapi::OnCredentialResult(int32_t &action, const std::string &credentialResult)
797 {
798     LOGI("OnCredentialResult for action: %d, credentialResult: %s", action, credentialResult.c_str());
799     napi_handle_scope scope = nullptr;
800     napi_open_handle_scope(env_, &scope);
801     if (scope == nullptr) {
802         LOGE("scope is nullptr");
803         return;
804     }
805     napi_value result = nullptr;
806     napi_create_object(env_, &result);
807     SetValueUtf8String(env_, "resultInfo", credentialResult, result);
808 
809     napi_value callResult = nullptr;
810     napi_value handler = nullptr;
811     napi_get_reference_value(env_, creAsyncCallbackInfo_.callback, &handler);
812     if (handler != nullptr) {
813         napi_call_function(env_, nullptr, handler, DM_NAPI_ARGS_ONE, &result, &callResult);
814         napi_delete_reference(env_, creAsyncCallbackInfo_.callback);
815     } else {
816         LOGE("handler is nullptr");
817     }
818     napi_close_handle_scope(env_, scope);
819     DeviceManager::GetInstance().UnRegisterCredentialCallback(bundleName_);
820     {
821         std::lock_guard<std::mutex> autoLock(creMapLocks_);
822         g_creCallbackMap.erase(bundleName_);
823     }
824 }
825 
OnAuthResult(const std::string & deviceId,const std::string & token,int32_t status,int32_t reason)826 void DeviceManagerNapi::OnAuthResult(const std::string &deviceId, const std::string &token, int32_t status,
827                                      int32_t reason)
828 {
829     LOGI("OnAuthResult for status: %d, reason: %d", status, reason);
830     napi_handle_scope scope;
831     napi_open_handle_scope(env_, &scope);
832     napi_value thisVar = nullptr;
833     napi_get_reference_value(env_, thisVarRef_, &thisVar);
834     napi_value result[DM_NAPI_ARGS_TWO] = {0};
835 
836     if (status == DM_AUTH_REQUEST_SUCCESS_STATUS && reason == 0) {
837         LOGI("OnAuthResult success");
838         napi_get_undefined(env_, &result[0]);
839         napi_create_object(env_, &result[1]);
840         SetValueUtf8String(env_, "deviceId", deviceId, result[1]);
841     } else {
842         LOGI("OnAuthResult failed");
843         napi_create_object(env_, &result[0]);
844         SetValueInt32(env_, "code", status, result[0]);
845         SetValueInt32(env_, "reason", reason, result[0]);
846         std::string errCodeInfo = OHOS::DistributedHardware::GetErrorString((int)reason);
847         SetValueUtf8String(env_, "errInfo", errCodeInfo, result[0]);
848         napi_get_undefined(env_, &result[1]);
849     }
850 
851     napi_value callResult = nullptr;
852     napi_value handler = nullptr;
853     napi_get_reference_value(env_, authAsyncCallbackInfo_.callback, &handler);
854     if (handler != nullptr) {
855         if (reason == DM_OK && (status <= STATUS_DM_CLOSE_PIN_INPUT_UI && status >= STATUS_DM_SHOW_AUTHORIZE_UI)) {
856             LOGI("update ui change, status: %d, reason: %d", status, reason);
857         } else {
858             napi_call_function(env_, nullptr, handler, DM_NAPI_ARGS_TWO, &result[0], &callResult);
859             napi_delete_reference(env_, authAsyncCallbackInfo_.callback);
860         }
861     } else {
862         LOGE("handler is nullptr");
863     }
864     napi_close_handle_scope(env_, scope);
865     g_authCallbackMap.erase(bundleName_);
866 }
867 
SetValueUtf8String(const napi_env & env,const std::string & fieldStr,const std::string & str,napi_value & result)868 void DeviceManagerNapi::SetValueUtf8String(const napi_env &env, const std::string &fieldStr, const std::string &str,
869                                            napi_value &result)
870 {
871     napi_value value = nullptr;
872     napi_create_string_utf8(env, str.c_str(), NAPI_AUTO_LENGTH, &value);
873     napi_set_named_property(env, result, fieldStr.c_str(), value);
874 }
875 
SetValueInt32(const napi_env & env,const std::string & fieldStr,const int32_t intValue,napi_value & result)876 void DeviceManagerNapi::SetValueInt32(const napi_env &env, const std::string &fieldStr, const int32_t intValue,
877                                       napi_value &result)
878 {
879     napi_value value = nullptr;
880     napi_create_int32(env, intValue, &value);
881     napi_set_named_property(env, result, fieldStr.c_str(), value);
882 }
883 
DeviceInfoToJsArray(const napi_env & env,const std::vector<DmDeviceInfo> & vecDevInfo,const int32_t idx,napi_value & arrayResult)884 void DeviceManagerNapi::DeviceInfoToJsArray(const napi_env &env, const std::vector<DmDeviceInfo> &vecDevInfo,
885                                             const int32_t idx, napi_value &arrayResult)
886 {
887     napi_value result = nullptr;
888     napi_create_object(env, &result);
889 
890     SetValueUtf8String(env, "deviceId", vecDevInfo[idx].deviceId, result);
891     SetValueUtf8String(env, "networkId", vecDevInfo[idx].networkId, result);
892     SetValueUtf8String(env, "deviceName", vecDevInfo[idx].deviceName, result);
893     SetValueInt32(env, "deviceType", (int)vecDevInfo[idx].deviceTypeId, result);
894     SetValueInt32(env, "authForm", (int)vecDevInfo[idx].authForm, result);
895 
896     napi_status status = napi_set_element(env, arrayResult, idx, result);
897     if (status != napi_ok) {
898         LOGE("DmDeviceInfo To JsArray set element error: %d", status);
899     }
900 }
901 
DmAuthParamDetection(const DmAuthParam & authParam)902 bool DeviceManagerNapi::DmAuthParamDetection(const DmAuthParam &authParam)
903 {
904     LOGI("DeviceManagerNapi::DmAuthParamDetection");
905     const uint32_t maxIntValueLen = 10;
906     const std::string maxAuthToken = "2147483647";
907     if (authParam.authToken.length() > maxIntValueLen) {
908         LOGE("The authToken is illegal");
909         return false;
910     } else {
911         if (!IsNumberString(authParam.authToken)) {
912             LOGE("The authToken is Error");
913             return false;
914         } else {
915             if (authParam.authToken > maxAuthToken) {
916                 LOGE("The authToken is Cross the border");
917                 return false;
918             }
919         }
920     }
921     return true;
922 }
923 
DmAuthParamToJsAuthParam(const napi_env & env,const DmAuthParam & authParam,napi_value & paramResult)924 void DeviceManagerNapi::DmAuthParamToJsAuthParam(const napi_env &env, const DmAuthParam &authParam,
925                                                  napi_value &paramResult)
926 {
927     LOGI("DeviceManagerNapi::DmAuthParamToJsAuthParam");
928     if (!DmAuthParamDetection(authParam)) {
929         LOGE("The authToken is Error");
930         return;
931     }
932     napi_value extraInfo = nullptr;
933     napi_create_object(env, &extraInfo);
934     SetValueInt32(env, "direction", authParam.direction, extraInfo);
935     SetValueInt32(env, "authType", authParam.authType, paramResult);
936     SetValueInt32(env, "pinToken", stoi(authParam.authToken), extraInfo);
937 
938     if (authParam.direction == DM_AUTH_DIRECTION_CLIENT) {
939         napi_set_named_property(env, paramResult, "extraInfo", extraInfo);
940         return;
941     }
942 
943     SetValueUtf8String(env, "packageName", authParam.packageName, extraInfo);
944     SetValueUtf8String(env, "appName", authParam.appName, extraInfo);
945     SetValueUtf8String(env, "appDescription", authParam.appDescription, extraInfo);
946     SetValueInt32(env, "business", authParam.business, extraInfo);
947     SetValueInt32(env, "pinCode", authParam.pincode, extraInfo);
948     napi_set_named_property(env, paramResult, "extraInfo", extraInfo);
949 
950     size_t appIconLen = static_cast<size_t>(authParam.imageinfo.GetAppIconLen());
951     if (appIconLen > 0) {
952         void *appIcon = nullptr;
953         napi_value appIconBuffer = nullptr;
954         napi_create_arraybuffer(env, appIconLen, &appIcon, &appIconBuffer);
955         if (appIcon != nullptr &&
956             memcpy_s(appIcon, appIconLen, reinterpret_cast<const void *>(authParam.imageinfo.GetAppIcon()),
957                      appIconLen) == 0) {
958             napi_value appIconArray = nullptr;
959             napi_create_typedarray(env, napi_uint8_array, appIconLen, appIconBuffer, 0, &appIconArray);
960             napi_set_named_property(env, paramResult, "appIcon", appIconArray);
961         }
962     }
963 
964     size_t appThumbnailLen = static_cast<size_t>(authParam.imageinfo.GetAppThumbnailLen());
965     if (appThumbnailLen > 0) {
966         void *appThumbnail = nullptr;
967         napi_value appThumbnailBuffer = nullptr;
968         napi_create_arraybuffer(env, appThumbnailLen, &appThumbnail, &appThumbnailBuffer);
969         if (appThumbnail != nullptr &&
970             memcpy_s(appThumbnail, appThumbnailLen,
971                      reinterpret_cast<const void *>(authParam.imageinfo.GetAppThumbnail()), appThumbnailLen) == 0) {
972             napi_value appThumbnailArray = nullptr;
973             napi_create_typedarray(env, napi_uint8_array, appThumbnailLen, appThumbnailBuffer, 0, &appThumbnailArray);
974             napi_set_named_property(env, paramResult, "appThumbnail", appThumbnailArray);
975         }
976     }
977     return;
978 }
979 
JsObjectToString(const napi_env & env,const napi_value & object,const std::string & fieldStr,char * dest,const int32_t destLen)980 void DeviceManagerNapi::JsObjectToString(const napi_env &env, const napi_value &object, const std::string &fieldStr,
981                                          char *dest, const int32_t destLen)
982 {
983     bool hasProperty = false;
984     NAPI_CALL_RETURN_VOID(env, napi_has_named_property(env, object, fieldStr.c_str(), &hasProperty));
985     if (hasProperty) {
986         napi_value field = nullptr;
987         napi_valuetype valueType = napi_undefined;
988 
989         napi_get_named_property(env, object, fieldStr.c_str(), &field);
990         NAPI_CALL_RETURN_VOID(env, napi_typeof(env, field, &valueType));
991         if (!CheckArgsType(env, valueType == napi_string, fieldStr.c_str(), "string")) {
992             return;
993         }
994         size_t result = 0;
995         NAPI_CALL_RETURN_VOID(env, napi_get_value_string_utf8(env, field, dest, destLen, &result));
996     } else {
997         LOGE("devicemanager napi js to str no property: %s", fieldStr.c_str());
998     }
999 }
1000 
JsObjectToString(const napi_env & env,const napi_value & param)1001 std::string DeviceManagerNapi::JsObjectToString(const napi_env &env, const napi_value &param)
1002 {
1003     LOGI("JsObjectToString in.");
1004     size_t size = 0;
1005     if (napi_get_value_string_utf8(env, param, nullptr, 0, &size) != napi_ok) {
1006         return "";
1007     }
1008     if (size == 0) {
1009         return "";
1010     }
1011     char *buf = new (std::nothrow) char[size + 1];
1012     if (buf == nullptr) {
1013         return "";
1014     }
1015     int32_t ret = memset_s(buf, (size + 1), 0, (size + 1));
1016     if (ret != 0) {
1017         LOGE("devicemanager memset_s error.");
1018         delete[] buf;
1019         buf = nullptr;
1020         return "";
1021     }
1022     bool rev = napi_get_value_string_utf8(env, param, buf, size + 1, &size) == napi_ok;
1023 
1024     std::string value;
1025     if (rev) {
1026         value = buf;
1027     } else {
1028         value = "";
1029     }
1030     delete[] buf;
1031     buf = nullptr;
1032     return value;
1033 }
1034 
JsObjectToInt(const napi_env & env,const napi_value & object,const std::string & fieldStr,int32_t & fieldRef)1035 void DeviceManagerNapi::JsObjectToInt(const napi_env &env, const napi_value &object, const std::string &fieldStr,
1036                                       int32_t &fieldRef)
1037 {
1038     bool hasProperty = false;
1039     NAPI_CALL_RETURN_VOID(env, napi_has_named_property(env, object, fieldStr.c_str(), &hasProperty));
1040     if (hasProperty) {
1041         napi_value field = nullptr;
1042         napi_valuetype valueType = napi_undefined;
1043 
1044         napi_get_named_property(env, object, fieldStr.c_str(), &field);
1045         NAPI_CALL_RETURN_VOID(env, napi_typeof(env, field, &valueType));
1046         if (!CheckArgsType(env, valueType == napi_number, fieldStr.c_str(), "number")) {
1047             return;
1048         }
1049         napi_get_value_int32(env, field, &fieldRef);
1050     } else {
1051         LOGE("devicemanager napi js to int no property: %s", fieldStr.c_str());
1052     }
1053 }
1054 
JsObjectToBool(const napi_env & env,const napi_value & object,const std::string & fieldStr,bool & fieldRef)1055 void DeviceManagerNapi::JsObjectToBool(const napi_env &env, const napi_value &object, const std::string &fieldStr,
1056                                        bool &fieldRef)
1057 {
1058     bool hasProperty = false;
1059     NAPI_CALL_RETURN_VOID(env, napi_has_named_property(env, object, fieldStr.c_str(), &hasProperty));
1060     if (hasProperty) {
1061         napi_value field = nullptr;
1062         napi_valuetype valueType = napi_undefined;
1063 
1064         napi_get_named_property(env, object, fieldStr.c_str(), &field);
1065         NAPI_CALL_RETURN_VOID(env, napi_typeof(env, field, &valueType));
1066         if (!CheckArgsType(env, valueType == napi_boolean, fieldStr.c_str(), "bool")) {
1067             return;
1068         }
1069         napi_get_value_bool(env, field, &fieldRef);
1070     } else {
1071         LOGE("devicemanager napi js to bool no property: %s", fieldStr.c_str());
1072     }
1073 }
1074 
JsToDmPublishInfo(const napi_env & env,const napi_value & object,DmPublishInfo & info)1075 void DeviceManagerNapi::JsToDmPublishInfo(const napi_env &env, const napi_value &object, DmPublishInfo &info)
1076 {
1077     int32_t publishId = -1;
1078     JsObjectToInt(env, object, "publishId", publishId);
1079     info.publishId = publishId;
1080 
1081     int32_t mode = -1;
1082     JsObjectToInt(env, object, "mode", mode);
1083     info.mode = static_cast<DmDiscoverMode>(mode);
1084 
1085     int32_t freq = -1;
1086     JsObjectToInt(env, object, "freq", freq);
1087     info.freq = static_cast<DmExchangeFreq>(freq);
1088 
1089     JsObjectToBool(env, object, "ranging", info.ranging);
1090     return;
1091 }
1092 
JsToDmSubscribeInfo(const napi_env & env,const napi_value & object,DmSubscribeInfo & info)1093 int32_t DeviceManagerNapi::JsToDmSubscribeInfo(const napi_env &env, const napi_value &object, DmSubscribeInfo &info)
1094 {
1095     int32_t subscribeId = -1;
1096     JsObjectToInt(env, object, "subscribeId", subscribeId);
1097     if (subscribeId < 0 || subscribeId > DM_NAPI_SUB_ID_MAX) {
1098         LOGE("DeviceManagerNapi::JsToDmSubscribeInfo, subscribeId error, subscribeId: %d ", subscribeId);
1099         return -1;
1100     }
1101 
1102     info.subscribeId = static_cast<uint16_t>(subscribeId);
1103 
1104     int32_t mode = -1;
1105     JsObjectToInt(env, object, "mode", mode);
1106     info.mode = static_cast<DmDiscoverMode>(mode);
1107 
1108     int32_t medium = -1;
1109     JsObjectToInt(env, object, "medium", medium);
1110     info.medium = static_cast<DmExchangeMedium>(medium);
1111 
1112     int32_t freq = -1;
1113     JsObjectToInt(env, object, "freq", freq);
1114     info.freq = static_cast<DmExchangeFreq>(freq);
1115 
1116     JsObjectToBool(env, object, "isSameAccount", info.isSameAccount);
1117     JsObjectToBool(env, object, "isWakeRemote", info.isWakeRemote);
1118 
1119     int32_t capability = -1;
1120     JsObjectToInt(env, object, "capability", capability);
1121     if (capability == DM_NAPI_SUBSCRIBE_CAPABILITY_DDMP || capability == DM_NAPI_SUBSCRIBE_CAPABILITY_OSD) {
1122         (void)strncpy_s(info.capability, sizeof(info.capability), DM_CAPABILITY_OSD, strlen(DM_CAPABILITY_OSD));
1123     }
1124     return 0;
1125 }
1126 
JsToDmDeviceInfo(const napi_env & env,const napi_value & object,DmDeviceInfo & info)1127 void DeviceManagerNapi::JsToDmDeviceInfo(const napi_env &env, const napi_value &object, DmDeviceInfo &info)
1128 {
1129     JsObjectToString(env, object, "deviceId", info.deviceId, sizeof(info.deviceId));
1130     JsObjectToString(env, object, "deviceName", info.deviceName, sizeof(info.deviceName));
1131     JsObjectToString(env, object, "networkId", info.networkId, sizeof(info.networkId));
1132     int32_t deviceType = -1;
1133     JsObjectToInt(env, object, "deviceType", deviceType);
1134     info.deviceTypeId = static_cast<DmDeviceType>(deviceType);
1135     JsObjectToInt(env, object, "range", info.range);
1136 }
1137 
JsToDmExtra(const napi_env & env,const napi_value & object,std::string & extra,int32_t & authType)1138 void DeviceManagerNapi::JsToDmExtra(const napi_env &env, const napi_value &object, std::string &extra,
1139                                     int32_t &authType)
1140 {
1141     LOGI("JsToDmExtra in.");
1142     int32_t authTypeTemp = -1;
1143     JsObjectToInt(env, object, "authType", authTypeTemp);
1144     authType = authTypeTemp;
1145 
1146     char appOperation[DM_NAPI_DESCRIPTION_BUF_LENGTH] = "";
1147     JsObjectToString(env, object, "appOperation", appOperation, sizeof(appOperation));
1148     std::string appOperationStr = appOperation;
1149 
1150     char customDescription[DM_NAPI_DESCRIPTION_BUF_LENGTH] = "";
1151     JsObjectToString(env, object, "customDescription", customDescription, sizeof(customDescription));
1152     std::string customDescriptionStr = customDescription;
1153 
1154     int32_t bindLevel = 0;
1155     JsObjectToInt(env, object, "bindLevel", bindLevel);
1156 
1157     nlohmann::json jsonObj;
1158     jsonObj[AUTH_TYPE] = authType;
1159     jsonObj[APP_OPERATION] = appOperationStr;
1160     jsonObj[CUSTOM_DESCRIPTION] = customDescriptionStr;
1161     jsonObj[BIND_LEVEL] = bindLevel;
1162     jsonObj[TOKENID] = OHOS::IPCSkeleton::GetSelfTokenID();
1163     JsToJsonObject(env, object, "extraInfo", jsonObj);
1164     extra = jsonObj.dump();
1165     LOGI("appOperationLen %d, customDescriptionLen %d.", appOperationStr.size(), customDescriptionStr.size());
1166 }
1167 
JsToJsonObject(const napi_env & env,const napi_value & object,const std::string & fieldStr,nlohmann::json & jsonObj)1168 void DeviceManagerNapi::JsToJsonObject(const napi_env &env, const napi_value &object, const std::string &fieldStr,
1169                                        nlohmann::json &jsonObj)
1170 {
1171     bool hasProperty = false;
1172     NAPI_CALL_RETURN_VOID(env, napi_has_named_property(env, object, fieldStr.c_str(), &hasProperty));
1173     if (!hasProperty) {
1174         LOGE("devicemanager napi js to str no property: %s", fieldStr.c_str());
1175         return;
1176     }
1177 
1178     napi_value jsonField = nullptr;
1179     napi_get_named_property(env, object, fieldStr.c_str(), &jsonField);
1180     napi_valuetype jsValueType = napi_undefined;
1181     napi_value jsProNameList = nullptr;
1182     uint32_t jsProCount = 0;
1183     napi_get_property_names(env, jsonField, &jsProNameList);
1184     napi_get_array_length(env, jsProNameList, &jsProCount);
1185 
1186     napi_value jsProName = nullptr;
1187     napi_value jsProValue = nullptr;
1188     for (uint32_t index = 0; index < jsProCount; index++) {
1189         napi_get_element(env, jsProNameList, index, &jsProName);
1190         std::string strProName = JsObjectToString(env, jsProName);
1191         napi_get_named_property(env, jsonField, strProName.c_str(), &jsProValue);
1192         napi_typeof(env, jsProValue, &jsValueType);
1193         int32_t numberValue = 0;
1194         bool boolValue = false;
1195         std::string stringValue = "";
1196         switch (jsValueType) {
1197             case napi_string:
1198                 stringValue = JsObjectToString(env, jsProValue);
1199                 LOGI("Property name = %s, string, value = %s", strProName.c_str(), stringValue.c_str());
1200                 jsonObj[strProName] = stringValue;
1201                 break;
1202             case napi_boolean:
1203                 napi_get_value_bool(env, jsProValue, &boolValue);
1204                 LOGI("Property name = %s, boolean, value = %d.", strProName.c_str(), boolValue);
1205                 jsonObj[strProName] = boolValue;
1206                 break;
1207             case napi_number:
1208                 if (napi_get_value_int32(env, jsProValue, &numberValue) != napi_ok) {
1209                     LOGE("Property name = %s, Property int32_t parse error", strProName.c_str());
1210                 } else {
1211                     jsonObj[strProName] = numberValue;
1212                     LOGI("Property name = %s, number, value = %d.", strProName.c_str(), numberValue);
1213                 }
1214                 break;
1215             default:
1216                 LOGE("Property name = %s, value type not support.", strProName.c_str());
1217                 break;
1218         }
1219     }
1220 }
1221 
JsToDmAuthInfo(const napi_env & env,const napi_value & object,std::string & extra)1222 void DeviceManagerNapi::JsToDmAuthInfo(const napi_env &env, const napi_value &object, std::string &extra)
1223 {
1224     LOGI("%s called.", __func__);
1225     int32_t authType = -1;
1226     int32_t token = -1;
1227 
1228     JsObjectToInt(env, object, "authType", authType);
1229     JsObjectToInt(env, object, "token", token);
1230     nlohmann::json jsonObj;
1231     jsonObj[AUTH_TYPE] = authType;
1232     jsonObj[PIN_TOKEN] = token;
1233     JsToJsonObject(env, object, "extraInfo", jsonObj);
1234     extra = jsonObj.dump();
1235 }
1236 
JsToDmDiscoveryExtra(const napi_env & env,const napi_value & object,std::string & extra)1237 void DeviceManagerNapi::JsToDmDiscoveryExtra(const napi_env &env, const napi_value &object, std::string &extra)
1238 {
1239     napi_valuetype valueType1 = napi_undefined;
1240     napi_typeof(env, object, &valueType1);
1241     if (valueType1 == napi_undefined) {
1242         extra = "";
1243         return;
1244     }
1245     char filterOption[DM_NAPI_BUF_LENGTH] = {0};
1246     size_t typeLen = 0;
1247     NAPI_CALL_RETURN_VOID(env, napi_get_value_string_utf8(env, object, nullptr, 0, &typeLen));
1248     if (!CheckArgsVal(env, typeLen > 0, "extra", "typeLen == 0")) {
1249         return;
1250     }
1251 
1252     if (!CheckArgsVal(env, typeLen < DM_NAPI_BUF_LENGTH, "extra", "typeLen >= BUF_MAX_LENGTH")) {
1253         return;
1254     }
1255     NAPI_CALL_RETURN_VOID(env, napi_get_value_string_utf8(env, object, filterOption, typeLen + 1, &typeLen));
1256     extra = filterOption;
1257     LOGI("JsToDmDiscoveryExtra, extra :%s, typeLen : %d", extra.c_str(), typeLen);
1258 }
1259 
IsSystemApp()1260 bool DeviceManagerNapi::IsSystemApp()
1261 {
1262     uint64_t tokenId = OHOS::IPCSkeleton::GetSelfTokenID();
1263     return OHOS::Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(tokenId);
1264 }
1265 
DmDeviceInfotoJsDeviceInfo(const napi_env & env,const DmDeviceInfo & vecDevInfo,napi_value & result)1266 void DeviceManagerNapi::DmDeviceInfotoJsDeviceInfo(const napi_env &env, const DmDeviceInfo &vecDevInfo,
1267                                                    napi_value &result)
1268 {
1269     napi_create_object(env, &result);
1270 
1271     SetValueUtf8String(env, "deviceId", vecDevInfo.deviceId, result);
1272     SetValueUtf8String(env, "networkId", vecDevInfo.networkId, result);
1273     SetValueUtf8String(env, "deviceName", vecDevInfo.deviceName, result);
1274     SetValueInt32(env, "deviceType", (int)vecDevInfo.deviceTypeId, result);
1275 }
1276 
CreateDmCallback(napi_env env,std::string & bundleName,std::string & eventType)1277 void DeviceManagerNapi::CreateDmCallback(napi_env env, std::string &bundleName, std::string &eventType)
1278 {
1279     LOGI("CreateDmCallback for bundleName %s eventType %s", bundleName.c_str(), eventType.c_str());
1280     if (eventType == DM_NAPI_EVENT_DEVICE_STATE_CHANGE) {
1281         auto callback = std::make_shared<DmNapiDeviceStateCallback>(env, bundleName);
1282         std::string extra = "";
1283         int32_t ret = DeviceManager::GetInstance().RegisterDevStateCallback(bundleName, extra, callback);
1284         if (ret != 0) {
1285             LOGE("RegisterDevStateCallback failed for bundleName %s", bundleName.c_str());
1286             return;
1287         }
1288         g_deviceStateCallbackMap.erase(bundleName);
1289         g_deviceStateCallbackMap[bundleName] = callback;
1290         return;
1291     }
1292 
1293     if (eventType == DM_NAPI_EVENT_DEVICE_FOUND || eventType == DM_NAPI_EVENT_DEVICE_DISCOVERY_FAIL) {
1294         auto callback = std::make_shared<DmNapiDiscoveryCallback>(env, bundleName);
1295         g_DiscoveryCallbackMap.erase(bundleName);
1296         g_DiscoveryCallbackMap[bundleName] = callback;
1297         std::shared_ptr<DmNapiDiscoveryCallback> discoveryCallback = callback;
1298         discoveryCallback->IncreaseRefCount();
1299         return;
1300     }
1301 
1302     if (eventType == DM_NAPI_EVENT_DEVICE_PUBLISH_SUCCESS || eventType == DM_NAPI_EVENT_DEVICE_PUBLISH_FAIL) {
1303         auto callback = std::make_shared<DmNapiPublishCallback>(env, bundleName);
1304         g_publishCallbackMap.erase(bundleName);
1305         g_publishCallbackMap[bundleName] = callback;
1306         std::shared_ptr<DmNapiPublishCallback> publishCallback = callback;
1307         publishCallback->IncreaseRefCount();
1308         return;
1309     }
1310 
1311     if (eventType == DM_NAPI_EVENT_UI_STATE_CHANGE) {
1312         auto callback = std::make_shared<DmNapiDeviceManagerUiCallback>(env, bundleName);
1313         int32_t ret = DeviceManager::GetInstance().RegisterDeviceManagerFaCallback(bundleName, callback);
1314         if (ret != 0) {
1315             LOGE("RegisterDeviceManagerFaCallback failed for bundleName %s", bundleName.c_str());
1316             return;
1317         }
1318         g_dmUiCallbackMap.erase(bundleName);
1319         g_dmUiCallbackMap[bundleName] = callback;
1320     }
1321 }
1322 
CreateDmCallback(napi_env env,std::string & bundleName,std::string & eventType,std::string & extra)1323 void DeviceManagerNapi::CreateDmCallback(napi_env env, std::string &bundleName,
1324                                          std::string &eventType, std::string &extra)
1325 {
1326     LOGI("CreateDmCallback for bundleName %s eventType %s extra = %s",
1327          bundleName.c_str(), eventType.c_str(), extra.c_str());
1328     if (eventType == DM_NAPI_EVENT_DEVICE_STATE_CHANGE) {
1329         auto callback = std::make_shared<DmNapiDeviceStateCallback>(env, bundleName);
1330         int32_t ret = DeviceManager::GetInstance().RegisterDevStateCallback(bundleName, extra, callback);
1331         if (ret != 0) {
1332             LOGE("RegisterDevStateCallback failed for bundleName %s", bundleName.c_str());
1333             return;
1334         }
1335         g_deviceStateCallbackMap.erase(bundleName);
1336         g_deviceStateCallbackMap[bundleName] = callback;
1337     }
1338 }
1339 
ReleasePublishCallback(std::string & bundleName)1340 void DeviceManagerNapi::ReleasePublishCallback(std::string &bundleName)
1341 {
1342     std::shared_ptr<DmNapiPublishCallback> publishCallback = nullptr;
1343     auto iter = g_publishCallbackMap.find(bundleName);
1344     if (iter == g_publishCallbackMap.end()) {
1345         return;
1346     }
1347 
1348     publishCallback = iter->second;
1349     publishCallback->DecreaseRefCount();
1350     if (publishCallback->GetRefCount() == 0) {
1351         g_publishCallbackMap.erase(bundleName);
1352     }
1353     return;
1354 }
1355 
ReleaseDmCallback(std::string & bundleName,std::string & eventType)1356 void DeviceManagerNapi::ReleaseDmCallback(std::string &bundleName, std::string &eventType)
1357 {
1358     if (eventType == DM_NAPI_EVENT_DEVICE_STATE_CHANGE) {
1359         auto iter = g_deviceStateCallbackMap.find(bundleName);
1360         if (iter == g_deviceStateCallbackMap.end()) {
1361             LOGE("ReleaseDmCallback: cannot find stateCallback for bundleName %s", bundleName.c_str());
1362             return;
1363         }
1364         int32_t ret = DeviceManager::GetInstance().UnRegisterDevStateCallback(bundleName);
1365         if (ret != 0) {
1366             LOGE("UnRegisterDevStateCallback failed for bundleName %s", bundleName.c_str());
1367             return;
1368         }
1369         g_deviceStateCallbackMap.erase(bundleName);
1370         return;
1371     }
1372 
1373     if (eventType == DM_NAPI_EVENT_DEVICE_FOUND || eventType == DM_NAPI_EVENT_DEVICE_DISCOVERY_FAIL) {
1374         std::shared_ptr<DmNapiDiscoveryCallback> DiscoveryCallback = nullptr;
1375         auto iter = g_DiscoveryCallbackMap.find(bundleName);
1376         if (iter == g_DiscoveryCallbackMap.end()) {
1377             return;
1378         }
1379 
1380         DiscoveryCallback = iter->second;
1381         DiscoveryCallback->DecreaseRefCount();
1382         if (DiscoveryCallback->GetRefCount() == 0) {
1383             g_DiscoveryCallbackMap.erase(bundleName);
1384         }
1385         return;
1386     }
1387 
1388     if (eventType == DM_NAPI_EVENT_DEVICE_PUBLISH_SUCCESS || eventType == DM_NAPI_EVENT_DEVICE_PUBLISH_FAIL) {
1389         ReleasePublishCallback(bundleName);
1390         return;
1391     }
1392 
1393     if (eventType == DM_NAPI_EVENT_UI_STATE_CHANGE) {
1394         auto iter = g_dmUiCallbackMap.find(bundleName);
1395         if (iter == g_dmUiCallbackMap.end()) {
1396             LOGE("cannot find dmFaCallback for bundleName %s", bundleName.c_str());
1397             return;
1398         }
1399         int32_t ret = DeviceManager::GetInstance().UnRegisterDeviceManagerFaCallback(bundleName);
1400         if (ret != 0) {
1401             LOGE("UnRegisterDeviceManagerFaCallback failed for bundleName %s", bundleName.c_str());
1402             return;
1403         }
1404         g_dmUiCallbackMap.erase(bundleName);
1405         return;
1406     }
1407 }
1408 
SetUserOperationSync(napi_env env,napi_callback_info info)1409 napi_value DeviceManagerNapi::SetUserOperationSync(napi_env env, napi_callback_info info)
1410 {
1411     LOGI("SetUserOperationSync in");
1412     if (!IsSystemApp()) {
1413         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
1414         return nullptr;
1415     }
1416     GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
1417     napi_valuetype valueType;
1418     napi_typeof(env, argv[0], &valueType);
1419     if (!CheckArgsType(env, valueType == napi_number, "action", "number")) {
1420         return nullptr;
1421     }
1422 
1423     napi_valuetype strType;
1424     napi_typeof(env, argv[1], &strType);
1425     NAPI_ASSERT(env, strType == napi_string, "Wrong argument type, string expected.");
1426 
1427     int32_t action = 0;
1428     napi_get_value_int32(env, argv[0], &action);
1429 
1430     size_t typeLen = 0;
1431     napi_get_value_string_utf8(env, argv[1], nullptr, 0, &typeLen);
1432     NAPI_ASSERT(env, typeLen > 0, "typeLen == 0");
1433     NAPI_ASSERT(env, typeLen < DM_NAPI_BUF_LENGTH, "typeLen >= MAXLEN");
1434     char type[DM_NAPI_BUF_LENGTH] = {0};
1435     napi_get_value_string_utf8(env, argv[1], type, typeLen + 1, &typeLen);
1436 
1437     std::string params = type;
1438     napi_value result = nullptr;
1439     DeviceManagerNapi *deviceManagerWrapper = nullptr;
1440     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1441         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1442         return result;
1443     }
1444     int32_t ret = DeviceManager::GetInstance().SetUserOperation(deviceManagerWrapper->bundleName_, action, params);
1445     if (ret != 0) {
1446         LOGE("SetUserOperation for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
1447         CreateBusinessError(env, ret);
1448     }
1449     napi_get_undefined(env, &result);
1450     return result;
1451 }
1452 
CallGetTrustedDeviceListStatusSync(napi_env env,napi_status & status,DeviceInfoListAsyncCallbackInfo * deviceInfoListAsyncCallbackInfo)1453 void DeviceManagerNapi::CallGetTrustedDeviceListStatusSync(napi_env env, napi_status &status,
1454     DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo)
1455 {
1456     for (unsigned int i = 0; i < deviceInfoListAsyncCallbackInfo->devList.size(); i++) {
1457         LOGI("DeviceManager::GetTrustedDeviceList deviceId:%s deviceName:%s deviceTypeId:%d ",
1458              GetAnonyString(deviceInfoListAsyncCallbackInfo->devList[i].deviceId).c_str(),
1459              deviceInfoListAsyncCallbackInfo->devList[i].deviceName,
1460              deviceInfoListAsyncCallbackInfo->devList[i].deviceTypeId);
1461     }
1462 
1463     napi_value array[DM_NAPI_ARGS_TWO] = {0};
1464     if (deviceInfoListAsyncCallbackInfo->status == 0) {
1465         bool isArray = false;
1466         napi_create_array(env, &array[1]);
1467         napi_is_array(env, array[1], &isArray);
1468         if (!isArray) {
1469             LOGE("napi_create_array fail");
1470         }
1471         if (deviceInfoListAsyncCallbackInfo->devList.size() > 0) {
1472             for (unsigned int i = 0; i != deviceInfoListAsyncCallbackInfo->devList.size(); ++i) {
1473                 DeviceInfoToJsArray(env, deviceInfoListAsyncCallbackInfo->devList, (int32_t)i, array[1]);
1474             }
1475             LOGI("devList is OK");
1476         } else {
1477             LOGE("devList is null");
1478         }
1479         napi_resolve_deferred(env, deviceInfoListAsyncCallbackInfo->deferred, array[1]);
1480     } else {
1481         array[0] = CreateBusinessError(env, deviceInfoListAsyncCallbackInfo->ret, false);
1482         napi_reject_deferred(env, deviceInfoListAsyncCallbackInfo->deferred, array[0]);
1483     }
1484 }
1485 
OnCall(const std::string & paramJson)1486 void DmNapiDeviceManagerUiCallback::OnCall(const std::string &paramJson)
1487 {
1488     uv_loop_s *loop = nullptr;
1489     napi_get_uv_event_loop(env_, &loop);
1490     if (loop == nullptr) {
1491         return;
1492     }
1493     uv_work_t *work = new (std::nothrow) uv_work_t;
1494     if (work == nullptr) {
1495         LOGE("DmNapiDeviceManagerUiCallback: OnCall, No memory");
1496         return;
1497     }
1498 
1499     DmNapiAuthJsCallback *jsCallback = new DmNapiAuthJsCallback(bundleName_, "", paramJson, 0, 0);
1500     if (jsCallback == nullptr) {
1501         DeleteUvWork(work);
1502         return;
1503     }
1504     work->data = reinterpret_cast<void *>(jsCallback);
1505 
1506     int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {}, [] (uv_work_t *work, int status) {
1507         DmNapiAuthJsCallback *callback = reinterpret_cast<DmNapiAuthJsCallback *>(work->data);
1508         DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
1509         if (deviceManagerNapi == nullptr) {
1510             LOGE("OnCall, deviceManagerNapi not find for bundleName %s", callback->bundleName_.c_str());
1511         } else {
1512             deviceManagerNapi->OnDmUiCall(callback->token_);
1513         }
1514         delete callback;
1515         callback = nullptr;
1516         DeleteUvWork(work);
1517     }, uv_qos_user_initiated);
1518     if (ret != 0) {
1519         LOGE("Failed to execute OnCall work queue");
1520         delete jsCallback;
1521         jsCallback = nullptr;
1522         DeleteUvWork(work);
1523     }
1524 }
1525 
OnDmUiCall(const std::string & paramJson)1526 void DeviceManagerNapi::OnDmUiCall(const std::string &paramJson)
1527 {
1528     LOGI("OnCall for paramJson");
1529     napi_handle_scope scope;
1530     napi_open_handle_scope(env_, &scope);
1531     napi_value result;
1532     napi_create_object(env_, &result);
1533     SetValueUtf8String(env_, "param", paramJson, result);
1534     OnEvent(DM_NAPI_EVENT_UI_STATE_CHANGE, DM_NAPI_ARGS_ONE, &result);
1535     napi_close_handle_scope(env_, scope);
1536 }
1537 
CallGetTrustedDeviceListStatus(napi_env env,napi_status & status,DeviceInfoListAsyncCallbackInfo * deviceInfoListAsyncCallbackInfo)1538 void DeviceManagerNapi::CallGetTrustedDeviceListStatus(napi_env env, napi_status &status,
1539                                                        DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo)
1540 {
1541     for (unsigned int i = 0; i < deviceInfoListAsyncCallbackInfo->devList.size(); i++) {
1542         LOGI("DeviceManager::GetTrustedDeviceList deviceId:%s deviceName:%s deviceTypeId:%d ",
1543              GetAnonyString(deviceInfoListAsyncCallbackInfo->devList[i].deviceId).c_str(),
1544              deviceInfoListAsyncCallbackInfo->devList[i].deviceName,
1545              deviceInfoListAsyncCallbackInfo->devList[i].deviceTypeId);
1546     }
1547     napi_value callResult = nullptr;
1548     napi_value handler = nullptr;
1549     napi_value array[DM_NAPI_ARGS_TWO] = {0};
1550 
1551     if (deviceInfoListAsyncCallbackInfo->status == 0) {
1552         if (deviceInfoListAsyncCallbackInfo->devList.size() > 0) {
1553             bool isArray = false;
1554             NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &array[1]));
1555             NAPI_CALL_RETURN_VOID(env, napi_is_array(env, array[1], &isArray));
1556             if (!isArray) {
1557                 LOGE("napi_create_array fail");
1558             }
1559             for (size_t i = 0; i != deviceInfoListAsyncCallbackInfo->devList.size(); ++i) {
1560                 DeviceInfoToJsArray(env, deviceInfoListAsyncCallbackInfo->devList, i, array[1]);
1561             }
1562             LOGI("devList is OK");
1563         } else {
1564             LOGE("devList is null");
1565         }
1566     } else {
1567         array[0] = CreateBusinessError(env, deviceInfoListAsyncCallbackInfo->ret, false);
1568     }
1569 
1570     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, deviceInfoListAsyncCallbackInfo->callback, &handler));
1571     if (handler != nullptr) {
1572         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, handler, DM_NAPI_ARGS_TWO, &array[0], &callResult));
1573         NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, deviceInfoListAsyncCallbackInfo->callback));
1574     } else {
1575         LOGE("handler is nullptr");
1576     }
1577 }
1578 
CallRequestCreInfoStatus(napi_env env,napi_status & status,CredentialAsyncCallbackInfo * creAsyncCallbackInfo)1579 void DeviceManagerNapi::CallRequestCreInfoStatus(napi_env env, napi_status &status,
1580                                                  CredentialAsyncCallbackInfo *creAsyncCallbackInfo)
1581 {
1582     LOGI("DeviceManager::RequestCredential Info:%s", creAsyncCallbackInfo->returnJsonStr.c_str());
1583     napi_value callResult = nullptr;
1584     napi_value handler = nullptr;
1585     napi_value result = nullptr;
1586     napi_create_object(env, &result);
1587 
1588     if (creAsyncCallbackInfo->status == 0) {
1589         if (creAsyncCallbackInfo->returnJsonStr == "") {
1590             LOGE("creAsyncCallbackInfo returnJsonStr is null");
1591         }
1592         SetValueUtf8String(env, "registerInfo", creAsyncCallbackInfo->returnJsonStr, result);
1593     } else {
1594         result = CreateBusinessError(env, creAsyncCallbackInfo->ret, false);
1595     }
1596 
1597     napi_get_reference_value(env, creAsyncCallbackInfo->callback, &handler);
1598     if (handler != nullptr) {
1599         napi_call_function(env, nullptr, handler, DM_NAPI_ARGS_ONE, &result, &callResult);
1600         napi_delete_reference(env, creAsyncCallbackInfo->callback);
1601     } else {
1602         LOGE("handler is nullptr");
1603     }
1604 }
1605 
CallGetLocalDeviceInfoSync(napi_env env,napi_status & status,DeviceInfoAsyncCallbackInfo * deviceInfoAsyncCallbackInfo)1606 void DeviceManagerNapi::CallGetLocalDeviceInfoSync(napi_env env, napi_status &status,
1607                                                    DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo)
1608 {
1609     napi_value result[DM_NAPI_ARGS_TWO] = {0};
1610 
1611     LOGI("DeviceManager::CallGetLocalDeviceInfoSync deviceId:%s deviceName:%s deviceTypeId:%d ",
1612          GetAnonyString(deviceInfoAsyncCallbackInfo->deviceInfo.deviceId).c_str(),
1613          deviceInfoAsyncCallbackInfo->deviceInfo.deviceName,
1614          deviceInfoAsyncCallbackInfo->deviceInfo.deviceTypeId);
1615 
1616     if (deviceInfoAsyncCallbackInfo->status == 0) {
1617         DmDeviceInfotoJsDeviceInfo(env, deviceInfoAsyncCallbackInfo->deviceInfo, result[1]);
1618         napi_resolve_deferred(env, deviceInfoAsyncCallbackInfo->deferred, result[1]);
1619     } else {
1620         result[0] = CreateBusinessError(env, deviceInfoAsyncCallbackInfo->ret, false);
1621         napi_reject_deferred(env, deviceInfoAsyncCallbackInfo->deferred, result[0]);
1622     }
1623 }
1624 
CallGetLocalDeviceInfo(napi_env env,napi_status & status,DeviceInfoAsyncCallbackInfo * deviceInfoAsyncCallbackInfo)1625 void DeviceManagerNapi::CallGetLocalDeviceInfo(napi_env env, napi_status &status,
1626                                                DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo)
1627 {
1628     napi_value result[DM_NAPI_ARGS_TWO] = {0};
1629     LOGI("DeviceManager::CallGetLocalDeviceInfo deviceId:%s deviceName:%s deviceTypeId:%d ",
1630          GetAnonyString(deviceInfoAsyncCallbackInfo->deviceInfo.deviceId).c_str(),
1631          deviceInfoAsyncCallbackInfo->deviceInfo.deviceName,
1632          deviceInfoAsyncCallbackInfo->deviceInfo.deviceTypeId);
1633     napi_value callResult = nullptr;
1634     napi_value handler = nullptr;
1635 
1636     if (deviceInfoAsyncCallbackInfo->status == 0) {
1637         DmDeviceInfotoJsDeviceInfo(env, deviceInfoAsyncCallbackInfo->deviceInfo, result[1]);
1638     } else {
1639         result[0] = CreateBusinessError(env, deviceInfoAsyncCallbackInfo->ret, false);
1640     }
1641 
1642     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, deviceInfoAsyncCallbackInfo->callback, &handler));
1643     if (handler != nullptr) {
1644         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, handler, DM_NAPI_ARGS_TWO,
1645             &result[0], &callResult));
1646         NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, deviceInfoAsyncCallbackInfo->callback));
1647     } else {
1648         LOGE("handler is nullptr");
1649     }
1650 }
1651 
CallAsyncWorkSync(napi_env env,DeviceInfoAsyncCallbackInfo * deviceInfoAsyncCallbackInfo)1652 void DeviceManagerNapi::CallAsyncWorkSync(napi_env env, DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo)
1653 {
1654     napi_value resourceName;
1655     napi_create_string_latin1(env, "GetLocalDeviceInfo", NAPI_AUTO_LENGTH, &resourceName);
1656     napi_create_async_work(
1657         env, nullptr, resourceName,
1658         [](napi_env env, void *data) {
1659             (void)env;
1660             DeviceInfoAsyncCallbackInfo *devInfoAsyncCallbackInfo =
1661                 reinterpret_cast<DeviceInfoAsyncCallbackInfo *>(data);
1662             int32_t ret = 0;
1663             ret = DeviceManager::GetInstance().GetLocalDeviceInfo(devInfoAsyncCallbackInfo->bundleName,
1664                                                                   devInfoAsyncCallbackInfo->deviceInfo);
1665             if (ret != 0) {
1666                 LOGE("CallAsyncWorkSync for bundleName %s failed, ret %d",
1667                      devInfoAsyncCallbackInfo->bundleName.c_str(), ret);
1668                 devInfoAsyncCallbackInfo->status = -1;
1669                 devInfoAsyncCallbackInfo->ret = ret;
1670             } else {
1671                 devInfoAsyncCallbackInfo->status = 0;
1672                 LOGI("CallAsyncWorkSync status %d", devInfoAsyncCallbackInfo->status);
1673             }
1674         },
1675         [](napi_env env, napi_status status, void *data) {
1676             (void)status;
1677             DeviceInfoAsyncCallbackInfo *dInfoAsyncCallbackInfo =
1678                 reinterpret_cast<DeviceInfoAsyncCallbackInfo *>(data);
1679             CallGetLocalDeviceInfoSync(env, status, dInfoAsyncCallbackInfo);
1680             napi_delete_async_work(env, dInfoAsyncCallbackInfo->asyncWork);
1681             delete dInfoAsyncCallbackInfo;
1682         },
1683         (void *)deviceInfoAsyncCallbackInfo, &deviceInfoAsyncCallbackInfo->asyncWork);
1684     napi_queue_async_work_with_qos(env, deviceInfoAsyncCallbackInfo->asyncWork, napi_qos_user_initiated);
1685 }
1686 
CallAsyncWork(napi_env env,DeviceInfoAsyncCallbackInfo * deviceInfoAsyncCallbackInfo)1687 void DeviceManagerNapi::CallAsyncWork(napi_env env, DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo)
1688 {
1689     napi_value resourceName;
1690     napi_create_string_latin1(env, "GetLocalDeviceInfo", NAPI_AUTO_LENGTH, &resourceName);
1691     napi_create_async_work(
1692         env, nullptr, resourceName,
1693         [](napi_env env, void *data) {
1694             DeviceInfoAsyncCallbackInfo *devInfoAsyncCallbackInfo =
1695                 reinterpret_cast<DeviceInfoAsyncCallbackInfo *>(data);
1696             int32_t ret = 0;
1697             ret = DeviceManager::GetInstance().GetLocalDeviceInfo(devInfoAsyncCallbackInfo->bundleName,
1698                                                                   devInfoAsyncCallbackInfo->deviceInfo);
1699             if (ret != 0) {
1700                 LOGE("CallAsyncWork for bundleName %s failed, ret %d",
1701                      devInfoAsyncCallbackInfo->bundleName.c_str(), ret);
1702                 devInfoAsyncCallbackInfo->status = -1;
1703                 devInfoAsyncCallbackInfo->ret = ret;
1704             } else {
1705                 devInfoAsyncCallbackInfo->status = 0;
1706                 LOGI("CallAsyncWork status %d", devInfoAsyncCallbackInfo->status);
1707             }
1708         },
1709         [](napi_env env, napi_status status, void *data) {
1710             (void)status;
1711             DeviceInfoAsyncCallbackInfo *dInfoAsyncCallbackInfo =
1712                 reinterpret_cast<DeviceInfoAsyncCallbackInfo *>(data);
1713             CallGetLocalDeviceInfo(env, status, dInfoAsyncCallbackInfo);
1714             napi_delete_async_work(env, dInfoAsyncCallbackInfo->asyncWork);
1715             delete dInfoAsyncCallbackInfo;
1716         },
1717         (void *)deviceInfoAsyncCallbackInfo, &deviceInfoAsyncCallbackInfo->asyncWork);
1718     napi_queue_async_work_with_qos(env, deviceInfoAsyncCallbackInfo->asyncWork, napi_qos_user_initiated);
1719 }
1720 
CallAsyncWorkSync(napi_env env,DeviceInfoListAsyncCallbackInfo * deviceInfoListAsyncCallbackInfo)1721 void DeviceManagerNapi::CallAsyncWorkSync(napi_env env,
1722                                           DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo)
1723 {
1724     napi_value resourceName;
1725     napi_create_string_latin1(env, "GetTrustListInfo", NAPI_AUTO_LENGTH, &resourceName);
1726     napi_create_async_work(
1727         env, nullptr, resourceName,
1728         [](napi_env env, void *data) {
1729             (void)env;
1730             DeviceInfoListAsyncCallbackInfo *devInfoListAsyncCallbackInfo =
1731                 reinterpret_cast<DeviceInfoListAsyncCallbackInfo *>(data);
1732             int32_t ret = 0;
1733             ret = DeviceManager::GetInstance().GetTrustedDeviceList(devInfoListAsyncCallbackInfo->bundleName,
1734                                                                     devInfoListAsyncCallbackInfo->extra,
1735                                                                     devInfoListAsyncCallbackInfo->devList);
1736             if (ret != 0) {
1737                 LOGE("CallAsyncWorkSync for bundleName %s failed, ret %d",
1738                      devInfoListAsyncCallbackInfo->bundleName.c_str(), ret);
1739                      devInfoListAsyncCallbackInfo->status = -1;
1740                      devInfoListAsyncCallbackInfo->ret = ret;
1741             } else {
1742                 devInfoListAsyncCallbackInfo->status = 0;
1743             }
1744             LOGI("CallAsyncWorkSync status %d", devInfoListAsyncCallbackInfo->status);
1745         },
1746         [](napi_env env, napi_status status, void *data) {
1747             (void)status;
1748             DeviceInfoListAsyncCallbackInfo *dInfoListAsyncCallbackInfo =
1749                 reinterpret_cast<DeviceInfoListAsyncCallbackInfo *>(data);
1750             CallGetTrustedDeviceListStatusSync(env, status, dInfoListAsyncCallbackInfo);
1751             napi_delete_async_work(env, dInfoListAsyncCallbackInfo->asyncWork);
1752             delete dInfoListAsyncCallbackInfo;
1753         },
1754         (void *)deviceInfoListAsyncCallbackInfo, &deviceInfoListAsyncCallbackInfo->asyncWork);
1755     napi_queue_async_work_with_qos(env, deviceInfoListAsyncCallbackInfo->asyncWork, napi_qos_user_initiated);
1756 }
1757 
CallAsyncWork(napi_env env,DeviceInfoListAsyncCallbackInfo * deviceInfoListAsyncCallbackInfo)1758 void DeviceManagerNapi::CallAsyncWork(napi_env env, DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo)
1759 {
1760     napi_value resourceName;
1761     napi_create_string_latin1(env, "GetTrustListInfo", NAPI_AUTO_LENGTH, &resourceName);
1762     napi_create_async_work(
1763         env, nullptr, resourceName,
1764         [](napi_env env, void *data) {
1765             DeviceInfoListAsyncCallbackInfo *devInfoListAsyncCallbackInfo =
1766                 reinterpret_cast<DeviceInfoListAsyncCallbackInfo *>(data);
1767             int32_t ret = 0;
1768             ret = DeviceManager::GetInstance().GetTrustedDeviceList(devInfoListAsyncCallbackInfo->bundleName,
1769                                                                     devInfoListAsyncCallbackInfo->extra,
1770                                                                     devInfoListAsyncCallbackInfo->devList);
1771             if (ret != 0) {
1772                 LOGE("CallAsyncWork for bundleName %s failed, ret %d",
1773                     devInfoListAsyncCallbackInfo->bundleName.c_str(), ret);
1774                 devInfoListAsyncCallbackInfo->status = -1;
1775                 devInfoListAsyncCallbackInfo->ret = ret;
1776             } else {
1777                 devInfoListAsyncCallbackInfo->status = 0;
1778             }
1779             LOGI("CallAsyncWork status %d", devInfoListAsyncCallbackInfo->status);
1780         },
1781         [](napi_env env, napi_status status, void *data) {
1782             (void)status;
1783             DeviceInfoListAsyncCallbackInfo *dInfoListAsyncCallbackInfo =
1784                 reinterpret_cast<DeviceInfoListAsyncCallbackInfo *>(data);
1785             CallGetTrustedDeviceListStatus(env, status, dInfoListAsyncCallbackInfo);
1786             napi_delete_async_work(env, dInfoListAsyncCallbackInfo->asyncWork);
1787             delete dInfoListAsyncCallbackInfo;
1788             dInfoListAsyncCallbackInfo = nullptr;
1789         },
1790         (void *)deviceInfoListAsyncCallbackInfo, &deviceInfoListAsyncCallbackInfo->asyncWork);
1791     napi_queue_async_work_with_qos(env, deviceInfoListAsyncCallbackInfo->asyncWork, napi_qos_user_initiated);
1792 }
1793 
AsyncTaskCallback(napi_env env,void * data)1794 void DeviceManagerNapi::AsyncTaskCallback(napi_env env, void *data)
1795 {
1796     CredentialAsyncCallbackInfo *creAsyncCallbackInfo = reinterpret_cast<CredentialAsyncCallbackInfo *>(data);
1797     int32_t ret = DeviceManager::GetInstance().RequestCredential(creAsyncCallbackInfo->bundleName,
1798         creAsyncCallbackInfo->reqInfo, creAsyncCallbackInfo->returnJsonStr);
1799     if (ret != 0) {
1800         LOGE("CallCredentialAsyncWork for bundleName %s failed, ret %d",
1801             creAsyncCallbackInfo->bundleName.c_str(), ret);
1802         creAsyncCallbackInfo->status = -1;
1803         creAsyncCallbackInfo->ret = ret;
1804     } else {
1805         creAsyncCallbackInfo->status = 0;
1806     }
1807     LOGI("CallCredentialAsyncWork status %d", creAsyncCallbackInfo->status);
1808 }
1809 
AsyncAfterTaskCallback(napi_env env,napi_status status,void * data)1810 void DeviceManagerNapi::AsyncAfterTaskCallback(napi_env env, napi_status status, void *data)
1811 {
1812     (void)status;
1813     CredentialAsyncCallbackInfo *creAsyncCallbackInfo = reinterpret_cast<CredentialAsyncCallbackInfo *>(data);
1814     CallRequestCreInfoStatus(env, status, creAsyncCallbackInfo);
1815     napi_delete_async_work(env, creAsyncCallbackInfo->asyncWork);
1816     delete creAsyncCallbackInfo;
1817 }
1818 
CallCredentialAsyncWork(napi_env env,CredentialAsyncCallbackInfo * creAsyncCallbackInfo)1819 void DeviceManagerNapi::CallCredentialAsyncWork(napi_env env, CredentialAsyncCallbackInfo *creAsyncCallbackInfo)
1820 {
1821     napi_value resourceName;
1822     napi_create_string_latin1(env, "RequestCreInfo", NAPI_AUTO_LENGTH, &resourceName);
1823 
1824     napi_create_async_work(env, nullptr, resourceName, AsyncTaskCallback, AsyncAfterTaskCallback,
1825         (void *)creAsyncCallbackInfo, &creAsyncCallbackInfo->asyncWork);
1826     napi_queue_async_work_with_qos(env, creAsyncCallbackInfo->asyncWork, napi_qos_user_initiated);
1827 }
1828 
CallDeviceList(napi_env env,napi_callback_info info,DeviceInfoListAsyncCallbackInfo * deviceInfoListAsyncCallbackInfo)1829 napi_value DeviceManagerNapi::CallDeviceList(napi_env env, napi_callback_info info,
1830                                              DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo)
1831 {
1832     napi_value result = nullptr;
1833     std::string extra = "";
1834     deviceInfoListAsyncCallbackInfo->extra = extra;
1835     GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1836     napi_valuetype eventHandleType = napi_undefined;
1837     napi_typeof(env, argv[0], &eventHandleType);
1838     if (eventHandleType == napi_function) {
1839         LOGI("CallDeviceList for argc %d Type = %d", argc, (int)eventHandleType);
1840         napi_create_reference(env, argv[0], 1, &deviceInfoListAsyncCallbackInfo->callback);
1841         CallAsyncWork(env, deviceInfoListAsyncCallbackInfo);
1842         napi_get_undefined(env, &result);
1843         return result;
1844     } else {
1845         LOGI("CallDeviceList for argc %d Type = %d", argc, (int)eventHandleType);
1846         napi_deferred deferred;
1847         napi_value promise = 0;
1848         napi_create_promise(env, &deferred, &promise);
1849         deviceInfoListAsyncCallbackInfo->deferred = deferred;
1850         char extraString[20];
1851         JsObjectToString(env, argv[0], "extra", extraString, sizeof(extraString));
1852         deviceInfoListAsyncCallbackInfo->extra = extraString;
1853         CallAsyncWorkSync(env, deviceInfoListAsyncCallbackInfo);
1854         return promise;
1855     }
1856 }
1857 
GetTrustedDeviceListSync(napi_env env,napi_callback_info info)1858 napi_value DeviceManagerNapi::GetTrustedDeviceListSync(napi_env env, napi_callback_info info)
1859 {
1860     LOGI("GetTrustedDeviceListSync in");
1861     if (!CheckPermissions(env)) {
1862         return nullptr;
1863     }
1864     napi_value result = nullptr;
1865     napi_value thisVar = nullptr;
1866     size_t argc = 0;
1867     bool isArray = false;
1868     napi_create_array(env, &result);
1869     napi_is_array(env, result, &isArray);
1870     if (!isArray) {
1871         LOGE("napi_create_array fail");
1872     }
1873     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1874     DeviceManagerNapi *deviceManagerWrapper = nullptr;
1875     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1876         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1877         return result;
1878     }
1879     std::vector<OHOS::DistributedHardware::DmDeviceInfo> devList;
1880     int32_t ret = 0;
1881     if (argc == DM_NAPI_ARGS_ZERO) {
1882         std::string extra = "";
1883         ret = DeviceManager::GetInstance().GetTrustedDeviceList(deviceManagerWrapper->bundleName_, extra, devList);
1884     } else if (argc == DM_NAPI_ARGS_ONE) {
1885         GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1886         napi_valuetype valueType;
1887         napi_typeof(env, argv[0], &valueType);
1888         if (!CheckArgsType(env, valueType == napi_boolean, "refreshList", "bool")) {
1889             return nullptr;
1890         }
1891         bool isRefresh = false;
1892         napi_get_value_bool(env, argv[0], &isRefresh);
1893         std::string extra = "";
1894         ret = DeviceManager::GetInstance().GetTrustedDeviceList(deviceManagerWrapper->bundleName_, extra, isRefresh,
1895             devList);
1896     }
1897     if (ret != 0) {
1898         LOGE("GetTrustedDeviceList for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
1899         CreateBusinessError(env, ret);
1900         return result;
1901     }
1902     if (devList.size() > 0) {
1903         for (size_t i = 0; i != devList.size(); ++i) {
1904             DeviceInfoToJsArray(env, devList, (int32_t)i, result);
1905         }
1906     }
1907     return result;
1908 }
1909 
GetTrustedDeviceListPromise(napi_env env,DeviceInfoListAsyncCallbackInfo * deviceInfoListAsyncCallbackInfo)1910 napi_value DeviceManagerNapi::GetTrustedDeviceListPromise(napi_env env,
1911     DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo)
1912 {
1913     std::string extra = "";
1914     deviceInfoListAsyncCallbackInfo->extra = extra;
1915     napi_deferred deferred;
1916     napi_value promise = 0;
1917     napi_create_promise(env, &deferred, &promise);
1918     deviceInfoListAsyncCallbackInfo->deferred = deferred;
1919     CallAsyncWorkSync(env, deviceInfoListAsyncCallbackInfo);
1920     return promise;
1921 }
1922 
GetTrustedDeviceListByFilter(napi_env env,napi_callback_info info,DeviceInfoListAsyncCallbackInfo * deviceInfoListAsyncCallbackInfo)1923 napi_value DeviceManagerNapi::GetTrustedDeviceListByFilter(napi_env env, napi_callback_info info,
1924     DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo)
1925 {
1926     napi_value result = nullptr;
1927     napi_get_undefined(env, &result);
1928     GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
1929     napi_valuetype valueType;
1930     napi_typeof(env, argv[0], &valueType);
1931     if (!CheckArgsType(env, valueType == napi_string, "extra", "string")) {
1932         DeleteAsyncCallbackInfo(deviceInfoListAsyncCallbackInfo);
1933         return nullptr;
1934     }
1935 
1936     if (!IsFunctionType(env, argv[1])) {
1937         DeleteAsyncCallbackInfo(deviceInfoListAsyncCallbackInfo);
1938         return result;
1939     }
1940     char extra[DM_NAPI_BUF_LENGTH];
1941     JsObjectToString(env, argv[0], "extra", extra, sizeof(extra));
1942     deviceInfoListAsyncCallbackInfo->extra = extra;
1943     napi_create_reference(env, argv[1], 1, &deviceInfoListAsyncCallbackInfo->callback);
1944     CallAsyncWork(env, deviceInfoListAsyncCallbackInfo);
1945     return result;
1946 }
1947 
GetTrustedDeviceList(napi_env env,napi_callback_info info)1948 napi_value DeviceManagerNapi::GetTrustedDeviceList(napi_env env, napi_callback_info info)
1949 {
1950     if (!IsSystemApp()) {
1951         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
1952         return nullptr;
1953     }
1954     int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
1955     if (ret != 0) {
1956         CreateBusinessError(env, ret);
1957         return nullptr;
1958     }
1959     napi_value result = nullptr;
1960     napi_value thisVar = nullptr;
1961     size_t argc = 0;
1962     std::vector<DmDeviceInfo> devList;
1963     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1964 
1965     DeviceManagerNapi *deviceManagerWrapper = nullptr;
1966     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1967         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1968         return result;
1969     }
1970 
1971     auto *deviceInfoListAsyncCallbackInfo = new DeviceInfoListAsyncCallbackInfo();
1972     if (deviceInfoListAsyncCallbackInfo == nullptr) {
1973         return nullptr;
1974     }
1975     deviceInfoListAsyncCallbackInfo->env = env;
1976     deviceInfoListAsyncCallbackInfo->devList = devList;
1977     deviceInfoListAsyncCallbackInfo->bundleName = deviceManagerWrapper->bundleName_;
1978     if (argc == 0) {
1979         return GetTrustedDeviceListPromise(env, deviceInfoListAsyncCallbackInfo);
1980     } else if (argc == 1) {
1981         GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1982         if (!IsFunctionType(env, argv[0])) {
1983             DeleteAsyncCallbackInfo(deviceInfoListAsyncCallbackInfo);
1984             return nullptr;
1985         }
1986         return CallDeviceList(env, info, deviceInfoListAsyncCallbackInfo);
1987     } else if (argc == DM_NAPI_ARGS_TWO) {
1988         return GetTrustedDeviceListByFilter(env, info, deviceInfoListAsyncCallbackInfo);
1989     }
1990     napi_get_undefined(env, &result);
1991     return result;
1992 }
1993 
GetLocalDeviceInfoSync(napi_env env,napi_callback_info info)1994 napi_value DeviceManagerNapi::GetLocalDeviceInfoSync(napi_env env, napi_callback_info info)
1995 {
1996     LOGI("GetLocalDeviceInfoSync in");
1997     if (!IsSystemApp()) {
1998         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
1999         return nullptr;
2000     }
2001     int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2002     if (ret != 0) {
2003         CreateBusinessError(env, ret);
2004         return nullptr;
2005     }
2006     napi_value result = nullptr;
2007     napi_value thisVar = nullptr;
2008     DmDeviceInfo deviceInfo;
2009     size_t argc = 0;
2010 
2011     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2012     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2013     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2014         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2015         return result;
2016     }
2017 
2018     ret = DeviceManager::GetInstance().GetLocalDeviceInfo(deviceManagerWrapper->bundleName_, deviceInfo);
2019     if (ret != 0) {
2020         LOGE("GetLocalDeviceInfoSync for failed, ret %d", ret);
2021         CreateBusinessError(env, ret);
2022         return result;
2023     }
2024     LOGI("DeviceManager::GetLocalDeviceInfoSync deviceId:%s deviceName:%s deviceTypeId:%d ",
2025          GetAnonyString(std::string(deviceInfo.deviceId)).c_str(), deviceInfo.deviceName, deviceInfo.deviceTypeId);
2026     DmDeviceInfotoJsDeviceInfo(env, deviceInfo, result);
2027     return result;
2028 }
2029 
GetLocalDeviceInfo(napi_env env,napi_callback_info info)2030 napi_value DeviceManagerNapi::GetLocalDeviceInfo(napi_env env, napi_callback_info info)
2031 {
2032     LOGI("GetLocalDeviceInfo in");
2033     if (!IsSystemApp()) {
2034         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2035         return nullptr;
2036     }
2037     if (DeviceManager::GetInstance().CheckAPIAccessPermission() != 0) {
2038         CreateBusinessError(env, ERR_DM_NO_PERMISSION);
2039         return nullptr;
2040     }
2041     napi_value result = nullptr;
2042     napi_value thisVar = nullptr;
2043     size_t argc = 0;
2044     DmDeviceInfo deviceInfo;
2045     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2046     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2047     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2048         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2049         return result;
2050     }
2051     auto *deviceInfoAsyncCallbackInfo = new DeviceInfoAsyncCallbackInfo();
2052     if (deviceInfoAsyncCallbackInfo == nullptr) {
2053         return nullptr;
2054     }
2055     deviceInfoAsyncCallbackInfo->env = env;
2056     deviceInfoAsyncCallbackInfo->deviceInfo = deviceInfo;
2057     deviceInfoAsyncCallbackInfo->bundleName = deviceManagerWrapper->bundleName_;
2058     if (argc == 0) {
2059         std::string extra = "";
2060         deviceInfoAsyncCallbackInfo->extra = extra;
2061         napi_deferred deferred;
2062         napi_value promise = 0;
2063         napi_create_promise(env, &deferred, &promise);
2064         deviceInfoAsyncCallbackInfo->deferred = deferred;
2065         CallAsyncWorkSync(env, deviceInfoAsyncCallbackInfo);
2066         return promise;
2067     } else if (argc == 1) {
2068         GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2069         if (!IsFunctionType(env, argv[0])) {
2070             delete deviceInfoAsyncCallbackInfo;
2071             deviceInfoAsyncCallbackInfo = nullptr;
2072             return nullptr;
2073         }
2074         deviceInfoAsyncCallbackInfo->extra = "";
2075         napi_create_reference(env, argv[0], 1, &deviceInfoAsyncCallbackInfo->callback);
2076         CallAsyncWork(env, deviceInfoAsyncCallbackInfo);
2077     }
2078     napi_get_undefined(env, &result);
2079     return result;
2080 }
2081 
UnAuthenticateDevice(napi_env env,napi_callback_info info)2082 napi_value DeviceManagerNapi::UnAuthenticateDevice(napi_env env, napi_callback_info info)
2083 {
2084     LOGI("UnAuthenticateDevice");
2085     if (!IsSystemApp()) {
2086         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2087         return nullptr;
2088     }
2089     napi_value result = nullptr;
2090     GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2091     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE,  "Wrong number of arguments, required 1")) {
2092         return nullptr;
2093     }
2094     napi_valuetype deviceInfoType = napi_undefined;
2095     napi_typeof(env, argv[0], &deviceInfoType);
2096     if (!CheckArgsType(env, deviceInfoType == napi_object, "deviceInfo", "object")) {
2097         return nullptr;
2098     }
2099 
2100     DmDeviceInfo deviceInfo;
2101     JsToDmDeviceInfo(env, argv[0], deviceInfo);
2102     LOGI("UnAuthenticateDevice deviceId = %s", GetAnonyString(deviceInfo.deviceId).c_str());
2103     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2104     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2105         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2106         return result;
2107     }
2108 
2109     int32_t ret = DeviceManager::GetInstance().UnAuthenticateDevice(deviceManagerWrapper->bundleName_, deviceInfo);
2110     if (ret != 0) {
2111         LOGE("UnAuthenticateDevice for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2112         CreateBusinessError(env, ret);
2113     }
2114 
2115     napi_create_int32(env, ret, &result);
2116     return result;
2117 }
2118 
StartArgCheck(napi_env env,napi_value & argv,OHOS::DistributedHardware::DmSubscribeInfo & subInfo)2119 bool DeviceManagerNapi::StartArgCheck(napi_env env, napi_value &argv,
2120     OHOS::DistributedHardware::DmSubscribeInfo &subInfo)
2121 {
2122     napi_valuetype valueType = napi_undefined;
2123     napi_typeof(env, argv, &valueType);
2124     if (!CheckArgsType(env, valueType == napi_object, "subscribeInfo", "object")) {
2125         return false;
2126     }
2127     int32_t res = JsToDmSubscribeInfo(env, argv, subInfo);
2128     if (!CheckArgsVal(env, res == 0, "subscribeId", "Wrong subscribeId")) {
2129         return false;
2130     }
2131     return true;
2132 }
2133 
CheckPermissions(napi_env env)2134 bool DeviceManagerNapi::CheckPermissions(napi_env env)
2135 {
2136     LOGI("CheckPermissions in");
2137     if (!IsSystemApp()) {
2138         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2139         return false;
2140     }
2141     int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2142     if (ret != 0) {
2143         CreateBusinessError(env, ret);
2144         return false;
2145     }
2146     return true;
2147 }
2148 
StartDeviceDiscoverSync(napi_env env,napi_callback_info info)2149 napi_value DeviceManagerNapi::StartDeviceDiscoverSync(napi_env env, napi_callback_info info)
2150 {
2151     LOGI("StartDeviceDiscoverSync in");
2152     if (!IsSystemApp()) {
2153         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2154         return nullptr;
2155     }
2156     std::string extra = "";
2157     DmSubscribeInfo subInfo;
2158     napi_value result = nullptr;
2159     napi_value thisVar = nullptr;
2160     size_t argcNum = 0;
2161     NAPI_CALL(env, napi_get_cb_info(env, info, &argcNum, nullptr, &thisVar, nullptr));
2162     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2163     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2164         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2165         return result;
2166     }
2167     if (argcNum >= DM_NAPI_ARGS_ONE) {
2168         GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
2169         if (!StartArgCheck(env, argv[0], subInfo)) {
2170             return nullptr;
2171         }
2172         if (argcNum == DM_NAPI_ARGS_TWO) {
2173             napi_valuetype valueType1 = napi_undefined;
2174             napi_typeof(env, argv[1], &valueType1);
2175             if (!(CheckArgsType(env, (valueType1 == napi_undefined || valueType1 == napi_string), "filterOptions",
2176                 "string or undefined"))) {
2177                 return nullptr;
2178             }
2179             JsToDmDiscoveryExtra(env, argv[1], extra);
2180         }
2181     }
2182     std::shared_ptr<DmNapiDiscoveryCallback> DiscoveryCallback = nullptr;
2183     auto iter = g_DiscoveryCallbackMap.find(deviceManagerWrapper->bundleName_);
2184     if (iter == g_DiscoveryCallbackMap.end()) {
2185         DiscoveryCallback = std::make_shared<DmNapiDiscoveryCallback>(env, deviceManagerWrapper->bundleName_);
2186         g_DiscoveryCallbackMap[deviceManagerWrapper->bundleName_] = DiscoveryCallback;
2187     } else {
2188         DiscoveryCallback = iter->second;
2189     }
2190     int32_t ret = DeviceManager::GetInstance().StartDeviceDiscovery(deviceManagerWrapper->bundleName_, subInfo, extra,
2191                                                                     DiscoveryCallback);
2192     if (ret != 0) {
2193         LOGE("StartDeviceDiscovery for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2194         CreateBusinessError(env, ret);
2195         DiscoveryCallback->OnDiscoveryFailed(subInfo.subscribeId, ret);
2196     }
2197     napi_get_undefined(env, &result);
2198     return result;
2199 }
2200 
StopDeviceDiscoverSync(napi_env env,napi_callback_info info)2201 napi_value DeviceManagerNapi::StopDeviceDiscoverSync(napi_env env, napi_callback_info info)
2202 {
2203     LOGI("StopDeviceDiscoverSync in");
2204     if (!IsSystemApp()) {
2205         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2206         return nullptr;
2207     }
2208     GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2209     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE,  "Wrong number of arguments, required 1")) {
2210         return nullptr;
2211     }
2212 
2213     napi_value result = nullptr;
2214     napi_valuetype valueType = napi_undefined;
2215     napi_typeof(env, argv[0], &valueType);
2216     if (!CheckArgsType(env, valueType == napi_number, "subscribeId", "number")) {
2217         return nullptr;
2218     }
2219 
2220     int32_t subscribeId = 0;
2221     napi_get_value_int32(env, argv[0], &subscribeId);
2222     if (!CheckArgsVal(env, subscribeId <= DM_NAPI_SUB_ID_MAX, "subscribeId", "Wrong argument. subscribeId Too Big")) {
2223         return nullptr;
2224     }
2225     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2226     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2227         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2228         return result;
2229     }
2230     int32_t ret = DeviceManager::GetInstance().StopDeviceDiscovery(deviceManagerWrapper->bundleName_,
2231                                                                    static_cast<int16_t>(subscribeId));
2232     if (ret != 0) {
2233         LOGE("StopDeviceDiscovery for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2234         CreateBusinessError(env, ret);
2235         return result;
2236     }
2237 
2238     napi_get_undefined(env, &result);
2239     return result;
2240 }
2241 
PublishDeviceDiscoverySync(napi_env env,napi_callback_info info)2242 napi_value DeviceManagerNapi::PublishDeviceDiscoverySync(napi_env env, napi_callback_info info)
2243 {
2244     LOGI("PublishDeviceDiscoverySync in");
2245     if (!IsSystemApp()) {
2246         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2247         return nullptr;
2248     }
2249     GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2250     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE,  "Wrong number of arguments, required 1")) {
2251         return nullptr;
2252     }
2253 
2254     napi_value result = nullptr;
2255     napi_valuetype valueType = napi_undefined;
2256     napi_typeof(env, argv[0], &valueType);
2257     if (!CheckArgsType(env, valueType == napi_object, "publishInfo", "object")) {
2258         return nullptr;
2259     }
2260     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2261     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2262         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2263         return result;
2264     }
2265 
2266     std::shared_ptr<DmNapiPublishCallback> publishCallback = nullptr;
2267     auto iter = g_publishCallbackMap.find(deviceManagerWrapper->bundleName_);
2268     if (iter == g_publishCallbackMap.end()) {
2269         publishCallback = std::make_shared<DmNapiPublishCallback>(env, deviceManagerWrapper->bundleName_);
2270         g_publishCallbackMap[deviceManagerWrapper->bundleName_] = publishCallback;
2271     } else {
2272         publishCallback = iter->second;
2273     }
2274 
2275     DmPublishInfo publishInfo;
2276     JsToDmPublishInfo(env, argv[0], publishInfo);
2277     int32_t ret = DeviceManager::GetInstance().PublishDeviceDiscovery(deviceManagerWrapper->bundleName_, publishInfo,
2278         publishCallback);
2279     if (ret != 0) {
2280         LOGE("PublishDeviceDiscovery for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2281         CreateBusinessError(env, ret);
2282         publishCallback->OnPublishResult(publishInfo.publishId, ret);
2283         return result;
2284     }
2285 
2286     napi_get_undefined(env, &result);
2287     return result;
2288 }
2289 
UnPublishDeviceDiscoverySync(napi_env env,napi_callback_info info)2290 napi_value DeviceManagerNapi::UnPublishDeviceDiscoverySync(napi_env env, napi_callback_info info)
2291 {
2292     LOGI("UnPublishDeviceDiscoverySync in");
2293     if (!IsSystemApp()) {
2294         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2295         return nullptr;
2296     }
2297     GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2298     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE,  "Wrong number of arguments, required 1")) {
2299         return nullptr;
2300     }
2301 
2302     napi_value result = nullptr;
2303     napi_valuetype valueType = napi_undefined;
2304     napi_typeof(env, argv[0], &valueType);
2305     if (!CheckArgsType(env, valueType == napi_number, "publishId", "number")) {
2306         return nullptr;
2307     }
2308     int32_t publishId = 0;
2309     napi_get_value_int32(env, argv[0], &publishId);
2310 
2311     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2312     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2313         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2314         return result;
2315     }
2316 
2317     int32_t ret = DeviceManager::GetInstance().UnPublishDeviceDiscovery(deviceManagerWrapper->bundleName_, publishId);
2318     if (ret != 0) {
2319         LOGE("UnPublishDeviceDiscovery bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2320         CreateBusinessError(env, ret);
2321         return result;
2322     }
2323 
2324     napi_get_undefined(env, &result);
2325     return result;
2326 }
2327 
AuthenticateDevice(napi_env env,napi_callback_info info)2328 napi_value DeviceManagerNapi::AuthenticateDevice(napi_env env, napi_callback_info info)
2329 {
2330     if (!IsSystemApp()) {
2331         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2332         return nullptr;
2333     }
2334     GET_PARAMS(env, info, DM_NAPI_ARGS_THREE);
2335     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_THREE,  "Wrong number of arguments, required 3")) {
2336         return nullptr;
2337     }
2338     napi_value result = nullptr;
2339     if (!IsJSObjectType(env, argv[0], "deviceInfo")) {
2340         return nullptr;
2341     }
2342     if (!IsJSObjectType(env, argv[DM_NAPI_ARGS_ONE], "authParam")) {
2343         return nullptr;
2344     }
2345     if (!IsFunctionType(env, argv[DM_NAPI_ARGS_TWO])) {
2346         return nullptr;
2347     }
2348 
2349     authAsyncCallbackInfo_.env = env;
2350     napi_create_reference(env, argv[DM_NAPI_ARGS_TWO], 1, &authAsyncCallbackInfo_.callback);
2351     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2352     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2353         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2354         return result;
2355     }
2356 
2357     std::shared_ptr<DmNapiAuthenticateCallback> authCallback = nullptr;
2358     auto iter = g_authCallbackMap.find(deviceManagerWrapper->bundleName_);
2359     if (iter == g_authCallbackMap.end()) {
2360         authCallback = std::make_shared<DmNapiAuthenticateCallback>(env, deviceManagerWrapper->bundleName_);
2361         g_authCallbackMap[deviceManagerWrapper->bundleName_] = authCallback;
2362     } else {
2363         authCallback = iter->second;
2364     }
2365     DmDeviceInfo deviceInfo;
2366     JsToDmDeviceInfo(env, argv[0], deviceInfo);
2367     std::string extraString;
2368     JsToDmExtra(env, argv[DM_NAPI_ARGS_ONE], extraString, authAsyncCallbackInfo_.authType);
2369     int32_t ret = DeviceManager::GetInstance().AuthenticateDevice(deviceManagerWrapper->bundleName_,
2370         authAsyncCallbackInfo_.authType, deviceInfo, extraString, authCallback);
2371     if (ret != 0) {
2372         LOGE("AuthenticateDevice for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2373         CreateBusinessError(env, ret);
2374     }
2375     napi_get_undefined(env, &result);
2376     return result;
2377 }
2378 
RequestCredential(napi_env env,napi_callback_info info)2379 napi_value DeviceManagerNapi::RequestCredential(napi_env env, napi_callback_info info)
2380 {
2381     LOGI("RequestCredential function has been discarded");
2382     return nullptr;
2383     if (!IsSystemApp()) {
2384         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2385         return nullptr;
2386     }
2387     GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
2388 
2389     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_TWO, "Wrong number of arguments, required 2")) {
2390         return nullptr;
2391     }
2392 
2393     napi_value result = nullptr;
2394     napi_valuetype requestInfoValueType = napi_undefined;
2395     napi_typeof(env, argv[0], &requestInfoValueType);
2396     if (!CheckArgsType(env, requestInfoValueType == napi_string, "requestInfo", "string")) {
2397         return nullptr;
2398     }
2399 
2400     napi_valuetype funcValueType = napi_undefined;
2401     napi_typeof(env, argv[1], &funcValueType);
2402     if (!CheckArgsType(env, funcValueType == napi_function, "callback", "function")) {
2403         return nullptr;
2404     }
2405 
2406     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2407     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&deviceManagerWrapper));
2408     if (deviceManagerWrapper == nullptr) {
2409         LOGE(" DeviceManagerNapi object is nullptr!");
2410         return result;
2411     }
2412 
2413     size_t typeLen = 0;
2414     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeLen);
2415     NAPI_ASSERT(env, typeLen < DM_NAPI_BUF_LENGTH, "typeLen >= MAXLEN");
2416     char type[DM_NAPI_BUF_LENGTH] = {0};
2417     napi_get_value_string_utf8(env, argv[0], type, typeLen + 1, &typeLen);
2418 
2419     auto *creAsyncCallbackInfo = new CredentialAsyncCallbackInfo();
2420     creAsyncCallbackInfo->env = env;
2421     creAsyncCallbackInfo->bundleName = deviceManagerWrapper->bundleName_;
2422     creAsyncCallbackInfo->reqInfo = type;
2423 
2424     napi_create_reference(env, argv[1], 1, &creAsyncCallbackInfo->callback);
2425     CallCredentialAsyncWork(env, creAsyncCallbackInfo);
2426     napi_get_undefined(env, &result);
2427     return result;
2428 }
2429 
RegisterCredentialCallback(napi_env env,const std::string & pkgName)2430 int32_t DeviceManagerNapi::RegisterCredentialCallback(napi_env env, const std::string &pkgName)
2431 {
2432     std::shared_ptr<DmNapiCredentialCallback> creCallback = nullptr;
2433     {
2434         std::lock_guard<std::mutex> autoLock(creMapLocks_);
2435         auto iter = g_creCallbackMap.find(pkgName);
2436         if (iter == g_creCallbackMap.end()) {
2437             creCallback = std::make_shared<DmNapiCredentialCallback>(env, pkgName);
2438             g_creCallbackMap[pkgName] = creCallback;
2439         } else {
2440             creCallback = iter->second;
2441         }
2442     }
2443     int32_t ret = DeviceManager::GetInstance().RegisterCredentialCallback(pkgName,
2444         creCallback);
2445     if (ret != 0) {
2446         LOGE("RegisterCredentialCallback for bundleName %s failed, ret %d", pkgName.c_str(), ret);
2447         CreateBusinessError(env, ret);
2448     }
2449     return ret;
2450 }
2451 
ImportCredential(napi_env env,napi_callback_info info)2452 napi_value DeviceManagerNapi::ImportCredential(napi_env env, napi_callback_info info)
2453 {
2454     LOGI("ImportCredential start.");
2455     if (!IsSystemApp()) {
2456         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2457         return nullptr;
2458     }
2459     GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
2460     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_TWO, "Wrong number of arguments, required 2")) {
2461         return nullptr;
2462     }
2463     napi_value result = nullptr;
2464     napi_valuetype importInfoValueType = napi_undefined;
2465     napi_typeof(env, argv[0], &importInfoValueType);
2466     if (!CheckArgsType(env, importInfoValueType == napi_string, "credentialInfo", "string")) {
2467         return nullptr;
2468     }
2469     if (!IsFunctionType(env, argv[1])) {
2470         return nullptr;
2471     }
2472 
2473     creAsyncCallbackInfo_.env = env;
2474     napi_create_reference(env, argv[1], 1, &creAsyncCallbackInfo_.callback);
2475 
2476     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2477     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&deviceManagerWrapper));
2478     if (deviceManagerWrapper == nullptr) {
2479         LOGE(" DeviceManagerNapi object is nullptr!");
2480         return result;
2481     }
2482     if (RegisterCredentialCallback(env, deviceManagerWrapper->bundleName_) != 0) {
2483         LOGE("RegisterCredentialCallback failed!");
2484         return result;
2485     }
2486 
2487     size_t typeLen = 0;
2488     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeLen);
2489     NAPI_ASSERT(env, typeLen > 0, "typeLen == 0");
2490     NAPI_ASSERT(env, typeLen < DM_NAPI_CREDENTIAL_BUF_LENGTH, "typeLen >= MAXLEN");
2491     char type[DM_NAPI_CREDENTIAL_BUF_LENGTH] = {0};
2492     napi_get_value_string_utf8(env, argv[0], type, typeLen + 1, &typeLen);
2493     std::string credentialInfo = type;
2494     int32_t ret = DeviceManager::GetInstance().ImportCredential(deviceManagerWrapper->bundleName_, credentialInfo);
2495     if (ret != 0) {
2496         LOGE("ImportCredential for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2497         CreateBusinessError(env, ret);
2498     }
2499     napi_get_undefined(env, &result);
2500     return result;
2501 }
2502 
DeleteCredential(napi_env env,napi_callback_info info)2503 napi_value DeviceManagerNapi::DeleteCredential(napi_env env, napi_callback_info info)
2504 {
2505     LOGE("DeleteCredential function has been discarded");
2506     return nullptr;
2507     if (!IsSystemApp()) {
2508         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2509         return nullptr;
2510     }
2511     GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
2512     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_TWO, "Wrong number of arguments, required 2")) {
2513         return nullptr;
2514     }
2515 
2516     napi_value result = nullptr;
2517     napi_valuetype queryInfoValueType = napi_undefined;
2518     napi_typeof(env, argv[0], &queryInfoValueType);
2519     if (!CheckArgsType(env, queryInfoValueType == napi_string, "queryInfo", "string")) {
2520         return nullptr;
2521     }
2522     if (!IsFunctionType(env, argv[1])) {
2523         return nullptr;
2524     }
2525 
2526     creAsyncCallbackInfo_.env = env;
2527     napi_create_reference(env, argv[1], 1, &creAsyncCallbackInfo_.callback);
2528     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2529     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&deviceManagerWrapper));
2530     if (deviceManagerWrapper == nullptr) {
2531         LOGE(" DeviceManagerNapi object is nullptr!");
2532         return result;
2533     }
2534     if (RegisterCredentialCallback(env, deviceManagerWrapper->bundleName_) != 0) {
2535         LOGE("RegisterCredentialCallback failed!");
2536         return result;
2537     }
2538 
2539     size_t typeLen = 0;
2540     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeLen);
2541     NAPI_ASSERT(env, typeLen > 0, "typeLen == 0");
2542     NAPI_ASSERT(env, typeLen < DM_NAPI_CREDENTIAL_BUF_LENGTH, "typeLen >= MAXLEN");
2543     char type[DM_NAPI_CREDENTIAL_BUF_LENGTH] = {0};
2544     napi_get_value_string_utf8(env, argv[0], type, typeLen + 1, &typeLen);
2545     std::string queryInfo = type;
2546     int32_t ret = DeviceManager::GetInstance().DeleteCredential(deviceManagerWrapper->bundleName_, queryInfo);
2547     if (ret != 0) {
2548         LOGE("DeleteCredential for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2549         CreateBusinessError(env, ret);
2550     }
2551     napi_get_undefined(env, &result);
2552     return result;
2553 }
2554 
JsOnFrench(napi_env env,int32_t num,napi_value thisVar,napi_value argv[])2555 napi_value DeviceManagerNapi::JsOnFrench(napi_env env, int32_t num, napi_value thisVar, napi_value argv[])
2556 {
2557     size_t typeLen = 0;
2558     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeLen);
2559 
2560     if (!CheckArgsVal(env, typeLen > 0, "type", "typeLen == 0")) {
2561         return nullptr;
2562     }
2563     if (!CheckArgsVal(env, typeLen < DM_NAPI_BUF_LENGTH, "type", "typeLen >= MAXLEN")) {
2564         return nullptr;
2565     }
2566     char type[DM_NAPI_BUF_LENGTH] = {0};
2567     napi_get_value_string_utf8(env, argv[0], type, typeLen + 1, &typeLen);
2568 
2569     std::string eventType = type;
2570     napi_value result = nullptr;
2571     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2572     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2573         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2574         return result;
2575     }
2576 
2577     LOGI("JsOn for bundleName %s, eventType %s ", deviceManagerWrapper->bundleName_.c_str(), eventType.c_str());
2578     deviceManagerWrapper->On(eventType, argv[num + 1]);
2579 
2580     if (eventType == DM_NAPI_EVENT_DEVICE_STATE_CHANGE) {
2581         if (num == 1) {
2582             size_t extraLen = 0;
2583             napi_get_value_string_utf8(env, argv[1], nullptr, 0, &extraLen);
2584             if (!CheckArgsVal(env, extraLen < DM_NAPI_BUF_LENGTH, "extra", "extraLen >= MAXLEN")) {
2585                 return nullptr;
2586             }
2587             char extra[DM_NAPI_BUF_LENGTH] = {0};
2588             napi_get_value_string_utf8(env, argv[1], extra, extraLen + 1, &extraLen);
2589             std::string extraString = extra;
2590             LOGI("extra = %s", extraString.c_str());
2591             CreateDmCallback(env, deviceManagerWrapper->bundleName_, eventType, extraString);
2592         } else {
2593             CreateDmCallback(env, deviceManagerWrapper->bundleName_, eventType);
2594         }
2595     } else {
2596         CreateDmCallback(env, deviceManagerWrapper->bundleName_, eventType);
2597     }
2598 
2599     napi_get_undefined(env, &result);
2600     return result;
2601 }
2602 
JsOn(napi_env env,napi_callback_info info)2603 napi_value DeviceManagerNapi::JsOn(napi_env env, napi_callback_info info)
2604 {
2605     if (!IsSystemApp()) {
2606         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2607         return nullptr;
2608     }
2609     int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2610     if (ret != 0) {
2611         CreateBusinessError(env, ret);
2612         return nullptr;
2613     }
2614     size_t argc = 0;
2615     napi_value thisVar = nullptr;
2616     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2617     if (argc == DM_NAPI_ARGS_THREE) {
2618         GET_PARAMS(env, info, DM_NAPI_ARGS_THREE);
2619         if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_THREE, "Wrong number of arguments, required 3")) {
2620             return nullptr;
2621         }
2622         napi_valuetype eventValueType = napi_undefined;
2623         napi_typeof(env, argv[0], &eventValueType);
2624         if (!CheckArgsType(env, eventValueType == napi_string, "type", "string")) {
2625             return nullptr;
2626         }
2627         napi_valuetype valueType;
2628         napi_typeof(env, argv[1], &valueType);
2629         if (!CheckArgsType(env, (valueType == napi_string || valueType == napi_object),
2630             "extra", "string | object")) {
2631             return nullptr;
2632         }
2633         if (!IsFunctionType(env, argv[DM_NAPI_ARGS_TWO])) {
2634             return nullptr;
2635         }
2636         return JsOnFrench(env, 1, thisVar, argv);
2637     } else {
2638         GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
2639         if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_TWO, "Wrong number of arguments, required 2")) {
2640             return nullptr;
2641         }
2642         napi_valuetype eventValueType = napi_undefined;
2643         napi_typeof(env, argv[0], &eventValueType);
2644         if (!CheckArgsType(env, eventValueType == napi_string, "type", "string")) {
2645             return nullptr;
2646         }
2647         if (!IsFunctionType(env, argv[1])) {
2648             return nullptr;
2649         }
2650         return JsOnFrench(env, 0, thisVar, argv);
2651     }
2652 }
2653 
JsOffFrench(napi_env env,int32_t num,napi_value thisVar,napi_value argv[])2654 napi_value DeviceManagerNapi::JsOffFrench(napi_env env, int32_t num, napi_value thisVar, napi_value argv[])
2655 {
2656     int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2657     if (ret != 0) {
2658         CreateBusinessError(env, ret);
2659         return nullptr;
2660     }
2661     size_t typeLen = 0;
2662     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeLen);
2663     if (!CheckArgsVal(env, typeLen > 0, "type", "typeLen == 0")) {
2664         return nullptr;
2665     }
2666     if (!CheckArgsVal(env, typeLen < DM_NAPI_BUF_LENGTH, "type", "typeLen >= MAXLEN")) {
2667         return nullptr;
2668     }
2669     char type[DM_NAPI_BUF_LENGTH] = {0};
2670     napi_get_value_string_utf8(env, argv[0], type, typeLen + 1, &typeLen);
2671 
2672     napi_value result = nullptr;
2673     std::string eventType = type;
2674     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2675     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2676         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2677         return result;
2678     }
2679 
2680     LOGI("JsOff for bundleName %s, eventType %s ", deviceManagerWrapper->bundleName_.c_str(), eventType.c_str());
2681     deviceManagerWrapper->Off(eventType);
2682     ReleaseDmCallback(deviceManagerWrapper->bundleName_, eventType);
2683 
2684     napi_get_undefined(env, &result);
2685     return result;
2686 }
2687 
JsOff(napi_env env,napi_callback_info info)2688 napi_value DeviceManagerNapi::JsOff(napi_env env, napi_callback_info info)
2689 {
2690     if (!IsSystemApp()) {
2691         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2692         return nullptr;
2693     }
2694     size_t argc = 0;
2695     napi_value thisVar = nullptr;
2696     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2697     if (argc == DM_NAPI_ARGS_THREE) {
2698         LOGI("JsOff in argc == 3");
2699         GET_PARAMS(env, info, DM_NAPI_ARGS_THREE);
2700         if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2701             return nullptr;
2702         }
2703         napi_valuetype eventValueType = napi_undefined;
2704         napi_typeof(env, argv[0], &eventValueType);
2705         if (!CheckArgsType(env, eventValueType == napi_string, "type", "string")) {
2706             return nullptr;
2707         }
2708         napi_valuetype valueType;
2709         napi_typeof(env, argv[1], &valueType);
2710         if (!CheckArgsType(env, (valueType == napi_string || valueType == napi_object), "extra", "string or object")) {
2711             return nullptr;
2712         }
2713         if (argc > DM_NAPI_ARGS_ONE) {
2714             if (!IsFunctionType(env, argv[DM_NAPI_ARGS_TWO])) {
2715                 return nullptr;
2716             }
2717         }
2718         return JsOffFrench(env, 1, thisVar, argv);
2719     } else {
2720         GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
2721         if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2722             return nullptr;
2723         }
2724         napi_valuetype eventValueType = napi_undefined;
2725         napi_typeof(env, argv[0], &eventValueType);
2726         if (!CheckArgsType(env, eventValueType == napi_string, "type", "string")) {
2727             return nullptr;
2728         }
2729         if (argc > DM_NAPI_ARGS_ONE) {
2730             if (!IsFunctionType(env, argv[1])) {
2731                 return nullptr;
2732             }
2733         }
2734         return JsOffFrench(env, 0, thisVar, argv);
2735     }
2736 }
2737 
ReleaseDeviceManager(napi_env env,napi_callback_info info)2738 napi_value DeviceManagerNapi::ReleaseDeviceManager(napi_env env, napi_callback_info info)
2739 {
2740     LOGI("ReleaseDeviceManager in");
2741     if (!IsSystemApp()) {
2742         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2743         return nullptr;
2744     }
2745     int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2746     if (ret != 0) {
2747         CreateBusinessError(env, ret);
2748         return nullptr;
2749     }
2750     size_t argc = 0;
2751     napi_value thisVar = nullptr;
2752     napi_value result = nullptr;
2753     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2754     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2755     if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2756         napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2757         return result;
2758     }
2759     LOGI("ReleaseDeviceManager for bundleName %s", deviceManagerWrapper->bundleName_.c_str());
2760     ret = DeviceManager::GetInstance().UnInitDeviceManager(deviceManagerWrapper->bundleName_);
2761     if (ret != 0) {
2762         LOGE("ReleaseDeviceManager for bundleName %s failed, ret %d", deviceManagerWrapper->bundleName_.c_str(), ret);
2763         CreateBusinessError(env, ret);
2764         napi_create_uint32(env, static_cast<uint32_t>(ret), &result);
2765         return result;
2766     }
2767     {
2768         std::lock_guard<std::mutex> autoLock(g_deviceManagerMapMutex);
2769         g_deviceManagerMap.erase(deviceManagerWrapper->bundleName_);
2770     }
2771     {
2772         std::lock_guard<std::mutex> autoLock(g_initCallbackMapMutex);
2773         g_initCallbackMap.erase(deviceManagerWrapper->bundleName_);
2774     }
2775     g_deviceStateCallbackMap.erase(deviceManagerWrapper->bundleName_);
2776     g_DiscoveryCallbackMap.erase(deviceManagerWrapper->bundleName_);
2777     g_publishCallbackMap.erase(deviceManagerWrapper->bundleName_);
2778     g_authCallbackMap.erase(deviceManagerWrapper->bundleName_);
2779     {
2780         std::lock_guard<std::mutex> autoLock(creMapLocks_);
2781         g_creCallbackMap.erase(deviceManagerWrapper->bundleName_);
2782     }
2783     napi_get_undefined(env, &result);
2784     NAPI_CALL(env, napi_remove_wrap(env, thisVar, (void**)&deviceManagerWrapper));
2785     return result;
2786 }
2787 
HandleCreateDmCallBackCompletedCB(napi_env env,napi_status status,void * data)2788 void DeviceManagerNapi::HandleCreateDmCallBackCompletedCB(napi_env env, napi_status status, void *data)
2789 {
2790     (void)status;
2791     AsyncCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncCallbackInfo *>(data);
2792     napi_value result[DM_NAPI_ARGS_TWO] = {0};
2793     if (asyncCallbackInfo->status == 0) {
2794         napi_value ctor = nullptr;
2795         napi_value argv = nullptr;
2796         napi_get_reference_value(env, sConstructor_, &ctor);
2797         napi_create_string_utf8(env, asyncCallbackInfo->bundleName, NAPI_AUTO_LENGTH, &argv);
2798         napi_status ret = napi_new_instance(env, ctor, DM_NAPI_ARGS_ONE, &argv, &result[1]);
2799         if (ret != napi_ok) {
2800                 LOGE("Create DeviceManagerNapi for bundleName %s failed", asyncCallbackInfo->bundleName);
2801         } else {
2802                 LOGI("InitDeviceManager for bundleName %s success", asyncCallbackInfo->bundleName);
2803                 napi_get_undefined(env, &result[0]);
2804         }
2805     } else {
2806         LOGI("InitDeviceManager for bundleName %s failed", asyncCallbackInfo->bundleName);
2807         result[0] = CreateBusinessError(env, asyncCallbackInfo->ret, false);
2808     }
2809     napi_value callback = nullptr;
2810     napi_value callResult = nullptr;
2811     napi_get_reference_value(env, asyncCallbackInfo->callback, &callback);
2812     if (callback != nullptr) {
2813         napi_call_function(env, nullptr, callback, DM_NAPI_ARGS_TWO, &result[0], &callResult);
2814         napi_delete_reference(env, asyncCallbackInfo->callback);
2815     }
2816 
2817     napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
2818     delete asyncCallbackInfo;
2819     asyncCallbackInfo = nullptr;
2820 }
2821 
HandleCreateDmCallBack(const napi_env & env,AsyncCallbackInfo * asCallbackInfo)2822 void DeviceManagerNapi::HandleCreateDmCallBack(const napi_env &env, AsyncCallbackInfo *asCallbackInfo)
2823 {
2824     napi_value resourceName;
2825     napi_create_string_latin1(env, "createDeviceManagerCallback", NAPI_AUTO_LENGTH, &resourceName);
2826     napi_create_async_work(
2827         env, nullptr, resourceName,
2828         [](napi_env env, void *data) {
2829             (void)env;
2830             AsyncCallbackInfo *asyCallbackInfo = reinterpret_cast<AsyncCallbackInfo *>(data);
2831             std::string bundleName = std::string(asyCallbackInfo->bundleName);
2832             std::shared_ptr<DmNapiInitCallback> initCallback = std::make_shared<DmNapiInitCallback>(env, bundleName);
2833             int32_t ret = DeviceManager::GetInstance().InitDeviceManager(bundleName, initCallback);
2834             if (ret == 0) {
2835                 std::lock_guard<std::mutex> autoLock(g_initCallbackMapMutex);
2836                 g_initCallbackMap[bundleName] = initCallback;
2837                 asyCallbackInfo->status = 0;
2838             } else {
2839                 asyCallbackInfo->status = 1;
2840                 asyCallbackInfo->ret = ret;
2841             }
2842         }, HandleCreateDmCallBackCompletedCB, (void *)asCallbackInfo, &asCallbackInfo->asyncWork);
2843     napi_queue_async_work_with_qos(env, asCallbackInfo->asyncWork, napi_qos_user_initiated);
2844 }
2845 
CallGetDeviceInfo(napi_env env,NetworkIdAsyncCallbackInfo * networkIdAsyncCallbackInfo)2846 void DeviceManagerNapi::CallGetDeviceInfo(napi_env env, NetworkIdAsyncCallbackInfo *networkIdAsyncCallbackInfo)
2847 {
2848     napi_value resourceName;
2849     napi_create_string_latin1(env, "GetLocalDeviceInfo", NAPI_AUTO_LENGTH, &resourceName);
2850     napi_create_async_work(
2851         env, nullptr, resourceName,
2852         GetDeviceInfoCB,
2853         CompleteGetDeviceInfoCB,
2854         (void *)networkIdAsyncCallbackInfo, &networkIdAsyncCallbackInfo->asyncWork);
2855     napi_queue_async_work_with_qos(env, networkIdAsyncCallbackInfo->asyncWork, napi_qos_user_initiated);
2856 }
2857 
GetDeviceInfoCB(napi_env env,void * data)2858 void DeviceManagerNapi::GetDeviceInfoCB(napi_env env, void *data)
2859 {
2860     if (!data) {
2861         LOGE("Invalid async callback data");
2862         return;
2863     }
2864     (void)env;
2865     NetworkIdAsyncCallbackInfo *networkIdAsyncCallbackInfo = reinterpret_cast<NetworkIdAsyncCallbackInfo *>(data);
2866     int32_t ret = DeviceManager::GetInstance().GetDeviceInfo(networkIdAsyncCallbackInfo->bundleName,
2867                                                              networkIdAsyncCallbackInfo->networkId,
2868                                                              networkIdAsyncCallbackInfo->deviceInfo);
2869     if (ret != 0) {
2870         LOGE("GetDeviceInfoCB for bundleName %s networkId %s failed, ret %d",
2871              networkIdAsyncCallbackInfo->bundleName.c_str(),
2872              GetAnonyString(networkIdAsyncCallbackInfo->networkId).c_str(), ret);
2873         networkIdAsyncCallbackInfo->status = -1;
2874         networkIdAsyncCallbackInfo->ret = ret;
2875     } else {
2876         networkIdAsyncCallbackInfo->status = 0;
2877         LOGI("GetDeviceInfoCB status %d", networkIdAsyncCallbackInfo->status);
2878     }
2879 }
2880 
CompleteGetDeviceInfoCB(napi_env env,napi_status status,void * data)2881 void DeviceManagerNapi::CompleteGetDeviceInfoCB(napi_env env, napi_status status, void *data)
2882 {
2883     if (!data) {
2884         LOGE("Invalid async callback data");
2885         return;
2886     }
2887     (void)status;
2888     NetworkIdAsyncCallbackInfo *networkIdAsyncCallbackInfo = reinterpret_cast<NetworkIdAsyncCallbackInfo *>(data);
2889     if (networkIdAsyncCallbackInfo->deferred != nullptr) {
2890         CallGetDeviceInfoPromise(env, status, networkIdAsyncCallbackInfo);    // promise
2891     } else {
2892         CallGetDeviceInfoCB(env, status, networkIdAsyncCallbackInfo);         // callback
2893     }
2894     napi_delete_async_work(env, networkIdAsyncCallbackInfo->asyncWork);
2895     delete networkIdAsyncCallbackInfo;
2896 }
2897 
2898 // promise function
CallGetDeviceInfoPromise(napi_env env,napi_status & status,NetworkIdAsyncCallbackInfo * networkIdAsyncCallbackInfo)2899 void DeviceManagerNapi::CallGetDeviceInfoPromise(napi_env env, napi_status &status,
2900                                                  NetworkIdAsyncCallbackInfo *networkIdAsyncCallbackInfo)
2901 {
2902     napi_value result[DM_NAPI_ARGS_TWO] = {0};
2903 
2904     LOGI("DeviceManager::CallGetDeviceInfoSync deviceName:%s deviceTypeId:%d ",
2905          networkIdAsyncCallbackInfo->deviceInfo.deviceName,
2906          networkIdAsyncCallbackInfo->deviceInfo.deviceTypeId);
2907 
2908     if (networkIdAsyncCallbackInfo->status == 0) {
2909         DeviceInfotoJsByNetworkId(env, networkIdAsyncCallbackInfo->deviceInfo, result[1]);
2910         napi_resolve_deferred(env, networkIdAsyncCallbackInfo->deferred, result[1]);
2911     } else {
2912         result[0] = CreateBusinessError(env, networkIdAsyncCallbackInfo->ret, false);
2913         napi_reject_deferred(env, networkIdAsyncCallbackInfo->deferred, result[0]);
2914     }
2915 }
2916 
2917 // callback function
CallGetDeviceInfoCB(napi_env env,napi_status & status,NetworkIdAsyncCallbackInfo * networkIdAsyncCallbackInfo)2918 void DeviceManagerNapi::CallGetDeviceInfoCB(napi_env env, napi_status &status,
2919                                             NetworkIdAsyncCallbackInfo *networkIdAsyncCallbackInfo)
2920 {
2921     napi_value result[DM_NAPI_ARGS_TWO] = {0};
2922     LOGI("DeviceManager::CallGetDeviceInfo deviceName:%s deviceTypeId:%d ",
2923          networkIdAsyncCallbackInfo->deviceInfo.deviceName,
2924          networkIdAsyncCallbackInfo->deviceInfo.deviceTypeId);
2925     napi_value callResult = nullptr;
2926     napi_value handler = nullptr;
2927 
2928     if (networkIdAsyncCallbackInfo->status == 0) {
2929         DeviceInfotoJsByNetworkId(env, networkIdAsyncCallbackInfo->deviceInfo, result[1]);
2930     } else {
2931         result[0] = CreateBusinessError(env, networkIdAsyncCallbackInfo->ret, false);
2932     }
2933 
2934     napi_get_reference_value(env, networkIdAsyncCallbackInfo->callback, &handler);
2935     if (handler != nullptr) {
2936         napi_call_function(env, nullptr, handler, DM_NAPI_ARGS_TWO, &result[0], &callResult);
2937         napi_delete_reference(env, networkIdAsyncCallbackInfo->callback);
2938     } else {
2939         LOGE("handler is nullptr");
2940     }
2941 }
2942 
DeviceInfotoJsByNetworkId(const napi_env & env,const DmDeviceInfo & nidDevInfo,napi_value & result)2943 void DeviceManagerNapi::DeviceInfotoJsByNetworkId(const napi_env &env, const DmDeviceInfo &nidDevInfo,
2944                                                   napi_value &result)
2945 {
2946     napi_create_object(env, &result);
2947 
2948     SetValueUtf8String(env, "deviceName", nidDevInfo.deviceName, result);
2949     SetValueInt32(env, "deviceType", (int)nidDevInfo.deviceTypeId, result);
2950 }
2951 
GetDeviceInfo(napi_env env,napi_callback_info info)2952 napi_value DeviceManagerNapi::GetDeviceInfo(napi_env env, napi_callback_info info)
2953 {
2954     if (!IsSystemApp()) {
2955         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2956         return nullptr;
2957     }
2958     napi_value result = nullptr;
2959     size_t argc = 2;
2960     napi_value argv[2] = {nullptr};
2961     napi_value thisVar = nullptr;
2962     DmDeviceInfo deviceInfo;
2963     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
2964     NAPI_ASSERT(env, ((argc >= DM_NAPI_ARGS_ONE) && (argc <= DM_NAPI_ARGS_TWO)), "requires 1 or 2 parameter");
2965 
2966     napi_valuetype networkIdValueType = napi_undefined;
2967     napi_typeof(env, argv[0], &networkIdValueType);
2968     if (!CheckArgsType(env, networkIdValueType == napi_string, "networkId", "string")) {
2969         return nullptr;
2970     }
2971     size_t networkIdLen = 0;
2972     napi_get_value_string_utf8(env, argv[0], nullptr, 0, &networkIdLen);
2973     NAPI_ASSERT(env, networkIdLen < DM_NAPI_BUF_LENGTH, "typeLen >= MAXLEN");
2974     char networkIdValue[DM_NAPI_BUF_LENGTH] = {0};
2975     napi_get_value_string_utf8(env, argv[0], networkIdValue, networkIdLen + 1, &networkIdLen);
2976     DeviceManagerNapi *deviceManagerWrapper = nullptr;
2977     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&deviceManagerWrapper));
2978     auto *networkIdAsyncCallbackInfo = new NetworkIdAsyncCallbackInfo();
2979     networkIdAsyncCallbackInfo->env = env;
2980     networkIdAsyncCallbackInfo->deviceInfo = deviceInfo;
2981     networkIdAsyncCallbackInfo->bundleName = deviceManagerWrapper->bundleName_;
2982     networkIdAsyncCallbackInfo->networkId = std::string(networkIdValue);
2983 
2984     if (argc == DM_NAPI_ARGS_ONE) {    // promise
2985         napi_deferred deferred;
2986         napi_value promise = 0;
2987         napi_create_promise(env, &deferred, &promise);
2988         networkIdAsyncCallbackInfo->deferred = deferred;
2989         CallGetDeviceInfo(env, networkIdAsyncCallbackInfo);
2990         return promise;
2991     } else if (argc == DM_NAPI_ARGS_TWO) {    // callback
2992         if (!IsFunctionType(env, argv[1])) {
2993             delete networkIdAsyncCallbackInfo;
2994             networkIdAsyncCallbackInfo = nullptr;
2995             return nullptr;
2996         }
2997         napi_create_reference(env, argv[1], 1, &networkIdAsyncCallbackInfo->callback);
2998         CallGetDeviceInfo(env, networkIdAsyncCallbackInfo);
2999     }
3000     napi_get_undefined(env, &result);
3001     return result;
3002 }
CreateDeviceManager(napi_env env,napi_callback_info info)3003 napi_value DeviceManagerNapi::CreateDeviceManager(napi_env env, napi_callback_info info)
3004 {
3005     LOGI("CreateDeviceManager in");
3006     if (!IsSystemApp()) {
3007         CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
3008         return nullptr;
3009     }
3010     GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
3011 
3012     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_TWO, "Wrong number of arguments, required 2")) {
3013         return nullptr;
3014     }
3015 
3016     napi_valuetype bundleNameValueType = napi_undefined;
3017     napi_typeof(env, argv[0], &bundleNameValueType);
3018     if (!CheckArgsType(env, bundleNameValueType == napi_string, "bundleName", "string")) {
3019         return nullptr;
3020     }
3021 
3022     napi_valuetype funcValueType = napi_undefined;
3023     napi_typeof(env, argv[1], &funcValueType);
3024     if (!CheckArgsType(env, funcValueType == napi_function, "callback", "function")) {
3025         return nullptr;
3026     }
3027 
3028     auto *asCallbackInfo = new AsyncCallbackInfo();
3029     if (asCallbackInfo == nullptr) {
3030         return nullptr;
3031     }
3032     asCallbackInfo->env = env;
3033     napi_get_value_string_utf8(env, argv[0], asCallbackInfo->bundleName, DM_NAPI_BUF_LENGTH - 1,
3034                                &asCallbackInfo->bundleNameLen);
3035 
3036     napi_create_reference(env, argv[1], 1, &asCallbackInfo->callback);
3037 
3038     HandleCreateDmCallBack(env, asCallbackInfo);
3039 
3040     napi_value result = nullptr;
3041     napi_get_undefined(env, &result);
3042     return result;
3043 }
3044 
Constructor(napi_env env,napi_callback_info info)3045 napi_value DeviceManagerNapi::Constructor(napi_env env, napi_callback_info info)
3046 {
3047     LOGI("DeviceManagerNapi Constructor in");
3048     GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
3049     if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
3050         return nullptr;
3051     }
3052 
3053     napi_valuetype valueType = napi_undefined;
3054     napi_typeof(env, argv[0], &valueType);
3055     if (!CheckArgsType(env, valueType == napi_string, "bundleName", "string")) {
3056         return nullptr;
3057     }
3058 
3059     char bundleName[DM_NAPI_BUF_LENGTH] = {0};
3060     size_t typeLen = 0;
3061     napi_get_value_string_utf8(env, argv[0], bundleName, sizeof(bundleName), &typeLen);
3062 
3063     LOGI("create DeviceManagerNapi for packageName:%s", bundleName);
3064     DeviceManagerNapi *obj = new DeviceManagerNapi(env, thisVar);
3065     if (obj == nullptr) {
3066         return nullptr;
3067     }
3068 
3069     obj->bundleName_ = std::string(bundleName);
3070     std::lock_guard<std::mutex> autoLock(g_deviceManagerMapMutex);
3071     g_deviceManagerMap[obj->bundleName_] = obj;
3072     napi_wrap(
3073         env, thisVar, reinterpret_cast<void *>(obj),
3074         [](napi_env env, void *data, void *hint) {
3075             (void)env;
3076             (void)hint;
3077             DeviceManagerNapi *deviceManager = reinterpret_cast<DeviceManagerNapi *>(data);
3078             delete deviceManager;
3079             deviceManager = nullptr;
3080             LOGI("delete deviceManager");
3081         },
3082         nullptr, nullptr);
3083     return thisVar;
3084 }
3085 
Init(napi_env env,napi_value exports)3086 napi_value DeviceManagerNapi::Init(napi_env env, napi_value exports)
3087 {
3088     napi_value dmClass = nullptr;
3089     napi_property_descriptor dmProperties[] = {
3090         DECLARE_NAPI_FUNCTION("release", ReleaseDeviceManager),
3091         DECLARE_NAPI_FUNCTION("getTrustedDeviceListSync", GetTrustedDeviceListSync),
3092         DECLARE_NAPI_FUNCTION("getTrustedDeviceList", GetTrustedDeviceList),
3093         DECLARE_NAPI_FUNCTION("startDeviceDiscovery", StartDeviceDiscoverSync),
3094         DECLARE_NAPI_FUNCTION("stopDeviceDiscovery", StopDeviceDiscoverSync),
3095         DECLARE_NAPI_FUNCTION("publishDeviceDiscovery", PublishDeviceDiscoverySync),
3096         DECLARE_NAPI_FUNCTION("unPublishDeviceDiscovery", UnPublishDeviceDiscoverySync),
3097         DECLARE_NAPI_FUNCTION("getLocalDeviceInfoSync", GetLocalDeviceInfoSync),
3098         DECLARE_NAPI_FUNCTION("getLocalDeviceInfo", GetLocalDeviceInfo),
3099         DECLARE_NAPI_FUNCTION("getDeviceInfo", GetDeviceInfo),
3100         DECLARE_NAPI_FUNCTION("unAuthenticateDevice", UnAuthenticateDevice),
3101         DECLARE_NAPI_FUNCTION("authenticateDevice", AuthenticateDevice),
3102         DECLARE_NAPI_FUNCTION("setUserOperation", SetUserOperationSync),
3103         DECLARE_NAPI_FUNCTION("requestCredentialRegisterInfo", RequestCredential),
3104         DECLARE_NAPI_FUNCTION("importCredential", ImportCredential),
3105         DECLARE_NAPI_FUNCTION("deleteCredential", DeleteCredential),
3106         DECLARE_NAPI_FUNCTION("on", JsOn),
3107         DECLARE_NAPI_FUNCTION("off", JsOff)};
3108 
3109     napi_property_descriptor static_prop[] = {
3110         DECLARE_NAPI_STATIC_FUNCTION("createDeviceManager", CreateDeviceManager),
3111     };
3112 
3113     LOGI("DeviceManagerNapi::Init() is called!");
3114     NAPI_CALL(env, napi_define_class(env, DEVICE_MANAGER_NAPI_CLASS_NAME.c_str(), NAPI_AUTO_LENGTH, Constructor,
3115                                      nullptr, sizeof(dmProperties) / sizeof(dmProperties[0]), dmProperties, &dmClass));
3116     NAPI_CALL(env, napi_create_reference(env, dmClass, 1, &sConstructor_));
3117     NAPI_CALL(env, napi_set_named_property(env, exports, DEVICE_MANAGER_NAPI_CLASS_NAME.c_str(), dmClass));
3118     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(static_prop) / sizeof(static_prop[0]), static_prop));
3119     LOGI("All props and functions are configured..");
3120     return exports;
3121 }
3122 
EnumTypeConstructor(napi_env env,napi_callback_info info)3123 napi_value DeviceManagerNapi::EnumTypeConstructor(napi_env env, napi_callback_info info)
3124 {
3125     size_t argc = 0;
3126     napi_value res = nullptr;
3127     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &res, nullptr));
3128     return res;
3129 }
3130 
InitDeviceTypeEnum(napi_env env,napi_value exports)3131 napi_value DeviceManagerNapi::InitDeviceTypeEnum(napi_env env, napi_value exports)
3132 {
3133     napi_value unknown_type;
3134     napi_value speaker;
3135     napi_value phone;
3136     napi_value tablet;
3137     napi_value wearable;
3138     napi_value car;
3139     napi_value tv;
3140     int32_t refCount = 1;
3141 
3142     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceType::DEVICE_TYPE_UNKNOWN),
3143         &unknown_type);
3144     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceType::DEVICE_TYPE_AUDIO),
3145         &speaker);
3146     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceType::DEVICE_TYPE_PHONE),
3147         &phone);
3148     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceType::DEVICE_TYPE_PAD),
3149         &tablet);
3150     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceType::DEVICE_TYPE_WATCH),
3151         &wearable);
3152     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceType::DEVICE_TYPE_CAR),
3153         &car);
3154     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceType::DEVICE_TYPE_TV),
3155         &tv);
3156 
3157     napi_property_descriptor desc[] = {
3158         DECLARE_NAPI_STATIC_PROPERTY("UNKNOWN_TYPE", unknown_type),
3159         DECLARE_NAPI_STATIC_PROPERTY("SPEAKER", speaker),
3160         DECLARE_NAPI_STATIC_PROPERTY("PHONE", phone),
3161         DECLARE_NAPI_STATIC_PROPERTY("TABLET", tablet),
3162         DECLARE_NAPI_STATIC_PROPERTY("WEARABLE", wearable),
3163         DECLARE_NAPI_STATIC_PROPERTY("CAR", car),
3164         DECLARE_NAPI_STATIC_PROPERTY("TV", tv),
3165     };
3166 
3167     napi_value result = nullptr;
3168     napi_define_class(env, "DeviceType", NAPI_AUTO_LENGTH, EnumTypeConstructor,
3169         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
3170     napi_create_reference(env, result, refCount, &deviceTypeEnumConstructor_);
3171     napi_set_named_property(env, exports, "DeviceType", result);
3172     return exports;
3173 }
3174 
InitDeviceStateChangeActionEnum(napi_env env,napi_value exports)3175 napi_value DeviceManagerNapi::InitDeviceStateChangeActionEnum(napi_env env, napi_value exports)
3176 {
3177     napi_value device_state_online;
3178     napi_value device_state_ready;
3179     napi_value device_state_offline;
3180     napi_value device_state_change;
3181     int32_t refCount = 1;
3182 
3183     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceState::DEVICE_STATE_ONLINE),
3184         &device_state_online);
3185     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceState::DEVICE_INFO_READY),
3186         &device_state_ready);
3187     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceState::DEVICE_STATE_OFFLINE),
3188         &device_state_offline);
3189     napi_create_uint32(env, static_cast<uint32_t>(DmDeviceState::DEVICE_INFO_CHANGED),
3190         &device_state_change);
3191 
3192     napi_property_descriptor desc[] = {
3193         DECLARE_NAPI_STATIC_PROPERTY("ONLINE", device_state_online),
3194         DECLARE_NAPI_STATIC_PROPERTY("READY", device_state_ready),
3195         DECLARE_NAPI_STATIC_PROPERTY("OFFLINE", device_state_offline),
3196         DECLARE_NAPI_STATIC_PROPERTY("CHANGE", device_state_change),
3197     };
3198 
3199     napi_value result = nullptr;
3200     napi_define_class(env, "DeviceStateChangeAction", NAPI_AUTO_LENGTH, EnumTypeConstructor,
3201         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
3202     napi_create_reference(env, result, refCount, &deviceStateChangeActionEnumConstructor_);
3203     napi_set_named_property(env, exports, "DeviceStateChangeAction", result);
3204     return exports;
3205 }
3206 
InitDiscoverModeEnum(napi_env env,napi_value exports)3207 napi_value DeviceManagerNapi::InitDiscoverModeEnum(napi_env env, napi_value exports)
3208 {
3209     napi_value discover_mode_passive;
3210     napi_value discover_mode_active;
3211     int32_t refCount = 1;
3212 
3213     napi_create_uint32(env, static_cast<uint32_t>(DmDiscoverMode::DM_DISCOVER_MODE_PASSIVE),
3214         &discover_mode_passive);
3215     napi_create_uint32(env, static_cast<uint32_t>(DmDiscoverMode::DM_DISCOVER_MODE_ACTIVE),
3216         &discover_mode_active);
3217 
3218     napi_property_descriptor desc[] = {
3219         DECLARE_NAPI_STATIC_PROPERTY("DISCOVER_MODE_PASSIVE", discover_mode_passive),
3220         DECLARE_NAPI_STATIC_PROPERTY("DISCOVER_MODE_ACTIVE", discover_mode_active),
3221     };
3222 
3223     napi_value result = nullptr;
3224     napi_define_class(env, "DiscoverMode", NAPI_AUTO_LENGTH, EnumTypeConstructor,
3225         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
3226     napi_create_reference(env, result, refCount, &discoverModeEnumConstructor_);
3227     napi_set_named_property(env, exports, "DiscoverMode", result);
3228     return exports;
3229 }
3230 
InitExchangeMediumEnum(napi_env env,napi_value exports)3231 napi_value DeviceManagerNapi::InitExchangeMediumEnum(napi_env env, napi_value exports)
3232 {
3233     napi_value medium_auto;
3234     napi_value medium_ble;
3235     napi_value medium_coap;
3236     napi_value medium_usb;
3237     int32_t refCount = 1;
3238 
3239     napi_create_uint32(env, static_cast<uint32_t>(DmExchangeMedium::DM_AUTO),
3240         &medium_auto);
3241     napi_create_uint32(env, static_cast<uint32_t>(DmExchangeMedium::DM_BLE),
3242         &medium_ble);
3243     napi_create_uint32(env, static_cast<uint32_t>(DmExchangeMedium::DM_COAP),
3244         &medium_coap);
3245     napi_create_uint32(env, static_cast<uint32_t>(DmExchangeMedium::DM_USB),
3246         &medium_usb);
3247 
3248     napi_property_descriptor desc[] = {
3249         DECLARE_NAPI_STATIC_PROPERTY("AUTO", medium_auto),
3250         DECLARE_NAPI_STATIC_PROPERTY("BLE", medium_ble),
3251         DECLARE_NAPI_STATIC_PROPERTY("COAP", medium_coap),
3252         DECLARE_NAPI_STATIC_PROPERTY("USB", medium_usb),
3253     };
3254 
3255     napi_value result = nullptr;
3256     napi_define_class(env, "ExchangeMedium", NAPI_AUTO_LENGTH, EnumTypeConstructor,
3257         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
3258     napi_create_reference(env, result, refCount, &exchangeMediumEnumConstructor_);
3259     napi_set_named_property(env, exports, "ExchangeMedium", result);
3260     return exports;
3261 }
3262 
InitExchangeFreqEnum(napi_env env,napi_value exports)3263 napi_value DeviceManagerNapi::InitExchangeFreqEnum(napi_env env, napi_value exports)
3264 {
3265     napi_value low;
3266     napi_value mid;
3267     napi_value high;
3268     napi_value super_high;
3269     int32_t refCount = 1;
3270 
3271     napi_create_uint32(env, static_cast<uint32_t>(DmExchangeFreq::DM_LOW),
3272         &low);
3273     napi_create_uint32(env, static_cast<uint32_t>(DmExchangeFreq::DM_MID),
3274         &mid);
3275     napi_create_uint32(env, static_cast<uint32_t>(DmExchangeFreq::DM_HIGH),
3276         &high);
3277     napi_create_uint32(env, static_cast<uint32_t>(DmExchangeFreq::DM_SUPER_HIGH),
3278         &super_high);
3279 
3280     napi_property_descriptor desc[] = {
3281         DECLARE_NAPI_STATIC_PROPERTY("LOW", low),
3282         DECLARE_NAPI_STATIC_PROPERTY("MID", mid),
3283         DECLARE_NAPI_STATIC_PROPERTY("HIGH", high),
3284         DECLARE_NAPI_STATIC_PROPERTY("SUPER_HIGH", super_high),
3285     };
3286 
3287     napi_value result = nullptr;
3288     napi_define_class(env, "ExchangeFreq", NAPI_AUTO_LENGTH, EnumTypeConstructor,
3289         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
3290     napi_create_reference(env, result, refCount, &exchangeFreqEnumConstructor_);
3291     napi_set_named_property(env, exports, "ExchangeFreq", result);
3292     return exports;
3293 }
3294 
InitSubscribeCapEnum(napi_env env,napi_value exports)3295 napi_value DeviceManagerNapi::InitSubscribeCapEnum(napi_env env, napi_value exports)
3296 {
3297     napi_value subscribe_capability_ddmp;
3298     napi_value subscribe_capability_osd;
3299     int32_t refCount = 1;
3300 
3301     napi_create_uint32(env, static_cast<uint32_t>(DM_NAPI_SUBSCRIBE_CAPABILITY_DDMP),
3302         &subscribe_capability_ddmp);
3303     napi_create_uint32(env, static_cast<uint32_t>(DM_NAPI_SUBSCRIBE_CAPABILITY_OSD),
3304         &subscribe_capability_osd);
3305 
3306     napi_property_descriptor desc[] = {
3307         DECLARE_NAPI_STATIC_PROPERTY("SUBSCRIBE_CAPABILITY_DDMP", subscribe_capability_ddmp),
3308         DECLARE_NAPI_STATIC_PROPERTY("SUBSCRIBE_CAPABILITY_OSD", subscribe_capability_osd),
3309     };
3310 
3311     napi_value result = nullptr;
3312     napi_define_class(env, "SubscribeCap", NAPI_AUTO_LENGTH, EnumTypeConstructor,
3313         nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
3314     napi_create_reference(env, result, refCount, &subscribeCapEnumConstructor_);
3315     napi_set_named_property(env, exports, "SubscribeCap", result);
3316     return exports;
3317 }
3318 
3319 /*
3320  * Function registering all props and functions of ohos.distributedhardware
3321  */
Export(napi_env env,napi_value exports)3322 static napi_value Export(napi_env env, napi_value exports)
3323 {
3324     LOGI("Export() is called!");
3325     DeviceManagerNapi::Init(env, exports);
3326     DeviceManagerNapi::InitDeviceTypeEnum(env, exports);
3327     DeviceManagerNapi::InitDeviceStateChangeActionEnum(env, exports);
3328     DeviceManagerNapi::InitDiscoverModeEnum(env, exports);
3329     DeviceManagerNapi::InitExchangeMediumEnum(env, exports);
3330     DeviceManagerNapi::InitExchangeFreqEnum(env, exports);
3331     DeviceManagerNapi::InitSubscribeCapEnum(env, exports);
3332     return exports;
3333 }
3334 
3335 /*
3336  * module define
3337  */
3338 static napi_module g_dmModule = {.nm_version = 1,
3339                                  .nm_flags = 0,
3340                                  .nm_filename = nullptr,
3341                                  .nm_register_func = Export,
3342                                  .nm_modname = "distributedHardware.deviceManager",
3343                                  .nm_priv = ((void *)0),
3344                                  .reserved = {0}};
3345 
3346 /*
3347  * module register
3348  */
RegisterModule(void)3349 extern "C" __attribute__((constructor)) void RegisterModule(void)
3350 {
3351     LOGI("RegisterModule() is called!");
3352     napi_module_register(&g_dmModule);
3353 }
3354