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 ¶m, 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 ¶mName, 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 ¶m)
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 ¶mResult)
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 ¶m)
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 ¶mJson)
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 ¶mJson)
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