1 /*
2 * Copyright (c) 2022-2025 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 <map>
21 #include <mutex>
22
23 #include "device_manager.h"
24 #include "dm_constants.h"
25 #include "dm_device_info.h"
26 #include "dm_device_profile_info.h"
27 #include "dm_log.h"
28 #include "dm_native_util.h"
29 #include "ipc_skeleton.h"
30 #include "js_native_api.h"
31 #include "tokenid_kit.h"
32 #include "json_object.h"
33
34 using namespace OHOS::DistributedHardware;
35
36 namespace {
37 #define GET_PARAMS(env, info, num) \
38 size_t argc = num; \
39 napi_value argv[num] = {nullptr}; \
40 napi_value thisVar = nullptr; \
41 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr))
42
43 const std::string DM_NAPI_EVENT_DEVICE_STATE_CHANGE = "deviceStateChange";
44 const std::string DM_NAPI_EVENT_DEVICE_DISCOVER_SUCCESS = "discoverSuccess";
45 const std::string DM_NAPI_EVENT_DEVICE_DISCOVER_FAIL = "discoverFail";
46 const std::string DM_NAPI_EVENT_DEVICE_PUBLISH_SUCCESS = "publishSuccess";
47 const std::string DM_NAPI_EVENT_DEVICE_PUBLISH_FAIL = "publishFail";
48 const std::string DM_NAPI_EVENT_DEVICE_SERVICE_DIE = "serviceDie";
49 const std::string DEVICE_MANAGER_NAPI_CLASS_NAME = "DeviceManager";
50 const std::string DM_NAPI_EVENT_REPLY_RESULT = "replyResult";
51 const std::string DM_NAPI_EVENT_DEVICE_NAME_CHANGE = "deviceNameChange";
52
53 const int32_t DM_NAPI_ARGS_ZERO = 0;
54 const int32_t DM_NAPI_ARGS_ONE = 1;
55 const int32_t DM_NAPI_ARGS_TWO = 2;
56 const int32_t DM_NAPI_ARGS_THREE = 3;
57 const int32_t DM_AUTH_REQUEST_SUCCESS_STATUS = 7;
58 const int32_t DM_MAX_DEVICE_SIZE = 100;
59
60 napi_ref deviceStateChangeActionEnumConstructor_ = nullptr;
61 napi_ref g_strategyForHeartbeatEnumConstructor = nullptr;
62
63 std::map<std::string, DeviceManagerNapi *> g_deviceManagerMap;
64 std::map<std::string, std::shared_ptr<DmNapiInitCallback>> g_initCallbackMap;
65 std::map<std::string, std::shared_ptr<DmNapiDeviceStatusCallback>> g_deviceStatusCallbackMap;
66 std::map<std::string, std::shared_ptr<DmNapiDiscoveryCallback>> g_DiscoveryCallbackMap;
67 std::map<std::string, std::shared_ptr<DmNapiPublishCallback>> g_publishCallbackMap;
68 std::map<std::string, std::shared_ptr<DmNapiAuthenticateCallback>> g_authCallbackMap;
69 std::map<std::string, std::shared_ptr<DmNapiBindTargetCallback>> g_bindCallbackMap;
70 std::map<std::string, std::shared_ptr<DmNapiDeviceManagerUiCallback>> g_dmUiCallbackMap;
71
72 std::mutex g_deviceManagerMapMutex;
73 std::mutex g_initCallbackMapMutex;
74 std::mutex g_deviceStatusCallbackMapMutex;
75 std::mutex g_discoveryCallbackMapMutex;
76 std::mutex g_publishCallbackMapMutex;
77 std::mutex g_authCallbackMapMutex;
78 std::mutex g_bindCallbackMapMutex;
79 std::mutex g_dmUiCallbackMapMutex;
80
DeleteUvWork(uv_work_t * work)81 void DeleteUvWork(uv_work_t *work)
82 {
83 if (work == nullptr) {
84 return;
85 }
86 delete work;
87 work = nullptr;
88 LOGI("delete work!");
89 }
90
DeleteDmNapiStatusJsCallbackPtr(DmNapiStatusJsCallback * pJsCallbackPtr)91 void DeleteDmNapiStatusJsCallbackPtr(DmNapiStatusJsCallback *pJsCallbackPtr)
92 {
93 if (pJsCallbackPtr == nullptr) {
94 return;
95 }
96 delete pJsCallbackPtr;
97 pJsCallbackPtr = nullptr;
98 LOGI("delete DmNapiStatusJsCallback callbackPtr!");
99 }
100
DeleteAsyncCallbackInfo(DeviceBasicInfoListAsyncCallbackInfo * pAsynCallbackInfo)101 void DeleteAsyncCallbackInfo(DeviceBasicInfoListAsyncCallbackInfo *pAsynCallbackInfo)
102 {
103 if (pAsynCallbackInfo == nullptr) {
104 return;
105 }
106 delete pAsynCallbackInfo;
107 pAsynCallbackInfo = nullptr;
108 }
109
IsDeviceManagerNapiNull(napi_env env,napi_value thisVar,DeviceManagerNapi ** pDeviceManagerWrapper)110 bool IsDeviceManagerNapiNull(napi_env env, napi_value thisVar, DeviceManagerNapi **pDeviceManagerWrapper)
111 {
112 napi_unwrap(env, thisVar, reinterpret_cast<void **>(pDeviceManagerWrapper));
113 if (pDeviceManagerWrapper != nullptr && *pDeviceManagerWrapper != nullptr) {
114 return false;
115 }
116 CreateBusinessError(env, ERR_DM_POINT_NULL);
117 LOGE("DeviceManagerNapi object is nullptr!");
118 return true;
119 }
120 } // namespace
121
122 thread_local napi_ref DeviceManagerNapi::sConstructor_ = nullptr;
123 AuthAsyncCallbackInfo DeviceManagerNapi::authAsyncCallbackInfo_;
124
OnRemoteDied()125 void DmNapiInitCallback::OnRemoteDied()
126 {
127 uv_loop_s *loop = nullptr;
128 napi_get_uv_event_loop(env_, &loop);
129 if (loop == nullptr) {
130 return;
131 }
132 uv_work_t *work = new (std::nothrow) uv_work_t;
133 if (work == nullptr) {
134 LOGE("DmNapiInitCallback: OnRemoteDied, No memory");
135 return;
136 }
137
138 DmDeviceBasicInfo info;
139 DmNapiStatusJsCallback *jsCallback = new DmNapiStatusJsCallback(bundleName_, 0, 0, info);
140 if (jsCallback == nullptr) {
141 DeleteUvWork(work);
142 return;
143 }
144 work->data = reinterpret_cast<void *>(jsCallback);
145
146 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
147 LOGD("OnRemoteDied uv_queue_work_with_qos");
148 }, [] (uv_work_t *work, int status) {
149 DmNapiStatusJsCallback *callback = reinterpret_cast<DmNapiStatusJsCallback *>(work->data);
150 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
151 if (deviceManagerNapi == nullptr) {
152 LOGE("OnRemoteDied, deviceManagerNapi not find for bundleName %{public}s", callback->bundleName_.c_str());
153 } else {
154 deviceManagerNapi->OnEvent("serviceDie", 0, nullptr);
155 }
156 LOGI("OnRemoteDied, deviceManagerNapi bundleName %{public}s", callback->bundleName_.c_str());
157 DeleteDmNapiStatusJsCallbackPtr(callback);
158 DeleteUvWork(work);
159 }, uv_qos_user_initiated);
160 if (ret != 0) {
161 LOGE("Failed to execute OnRemoteDied work queue");
162 DeleteDmNapiStatusJsCallbackPtr(jsCallback);
163 DeleteUvWork(work);
164 }
165 }
166
OnDeviceOnline(const DmDeviceBasicInfo & deviceBasicInfo)167 void DmNapiDeviceStatusCallback::OnDeviceOnline(const DmDeviceBasicInfo &deviceBasicInfo)
168 {
169 uv_loop_s *loop = nullptr;
170 napi_get_uv_event_loop(env_, &loop);
171 if (loop == nullptr) {
172 return;
173 }
174 uv_work_t *work = new (std::nothrow) uv_work_t;
175 if (work == nullptr) {
176 LOGE("DmNapiDeviceStatusCallback: OnDeviceOnline, No memory");
177 return;
178 }
179
180 DmNapiStatusJsCallback *jsCallback = new DmNapiStatusJsCallback(bundleName_, 0, 0, deviceBasicInfo);
181 if (jsCallback == nullptr) {
182 DeleteUvWork(work);
183 return;
184 }
185 work->data = reinterpret_cast<void *>(jsCallback);
186
187 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
188 LOGD("OnDeviceOnline uv_queue_work_with_qos");
189 }, [] (uv_work_t *work, int status) {
190 DmNapiStatusJsCallback *callback = reinterpret_cast<DmNapiStatusJsCallback *>(work->data);
191 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
192 if (deviceManagerNapi == nullptr) {
193 LOGE("OnDeviceOnline, deviceManagerNapi not find for bundleName %{public}s", callback->bundleName_.c_str());
194 } else {
195 deviceManagerNapi->OnDeviceStatusChange(DmNapiDevStatusChange::UNKNOWN, callback->deviceBasicInfo_);
196 }
197 DeleteDmNapiStatusJsCallbackPtr(callback);
198 DeleteUvWork(work);
199 }, uv_qos_user_initiated);
200 if (ret != 0) {
201 LOGE("Failed to execute OnDeviceOnline work queue");
202 DeleteDmNapiStatusJsCallbackPtr(jsCallback);
203 DeleteUvWork(work);
204 }
205 }
206
OnDeviceReady(const DmDeviceBasicInfo & deviceBasicInfo)207 void DmNapiDeviceStatusCallback::OnDeviceReady(const DmDeviceBasicInfo &deviceBasicInfo)
208 {
209 uv_loop_s *loop = nullptr;
210 napi_get_uv_event_loop(env_, &loop);
211 if (loop == nullptr) {
212 return;
213 }
214 uv_work_t *work = new (std::nothrow) uv_work_t;
215 if (work == nullptr) {
216 LOGE("DmNapiDeviceStateCallback: OnDeviceReady, No memory");
217 return;
218 }
219
220 DmNapiStatusJsCallback *jsCallback = new DmNapiStatusJsCallback(bundleName_, 0, 0, deviceBasicInfo);
221 if (jsCallback == nullptr) {
222 DeleteUvWork(work);
223 return;
224 }
225 work->data = reinterpret_cast<void *>(jsCallback);
226
227 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
228 LOGD("OnDeviceReady uv_queue_work_with_qos");
229 }, [] (uv_work_t *work, int status) {
230 DmNapiStatusJsCallback *callback = reinterpret_cast<DmNapiStatusJsCallback *>(work->data);
231 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
232 if (deviceManagerNapi == nullptr) {
233 LOGE("OnDeviceReady, deviceManagerNapi not find for bundleName %{public}s", callback->bundleName_.c_str());
234 } else {
235 deviceManagerNapi->OnDeviceStatusChange(DmNapiDevStatusChange::AVAILABLE, callback->deviceBasicInfo_);
236 }
237 DeleteDmNapiStatusJsCallbackPtr(callback);
238 DeleteUvWork(work);
239 }, uv_qos_user_initiated);
240 if (ret != 0) {
241 LOGE("Failed to execute OnDeviceReady work queue");
242 DeleteDmNapiStatusJsCallbackPtr(jsCallback);
243 DeleteUvWork(work);
244 }
245 }
246
OnDeviceOffline(const DmDeviceBasicInfo & deviceBasicInfo)247 void DmNapiDeviceStatusCallback::OnDeviceOffline(const DmDeviceBasicInfo &deviceBasicInfo)
248 {
249 uv_loop_s *loop = nullptr;
250 napi_get_uv_event_loop(env_, &loop);
251 if (loop == nullptr) {
252 return;
253 }
254 uv_work_t *work = new (std::nothrow) uv_work_t;
255 if (work == nullptr) {
256 LOGE("DmNapiDeviceStatusCallback: OnDeviceOffline, No memory");
257 return;
258 }
259
260 DmNapiStatusJsCallback *jsCallback = new DmNapiStatusJsCallback(bundleName_, 0, 0, deviceBasicInfo);
261 if (jsCallback == nullptr) {
262 DeleteUvWork(work);
263 return;
264 }
265 work->data = reinterpret_cast<void *>(jsCallback);
266
267 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
268 LOGD("OnDeviceOffline uv_queue_work_with_qos");
269 }, [] (uv_work_t *work, int status) {
270 DmNapiStatusJsCallback *callback = reinterpret_cast<DmNapiStatusJsCallback *>(work->data);
271 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
272 if (deviceManagerNapi == nullptr) {
273 LOGE("OnDeviceOffline, deviceManagerNapi not find for bundleName %{public}s",
274 callback->bundleName_.c_str());
275 } else {
276 deviceManagerNapi->OnDeviceStatusChange(DmNapiDevStatusChange::UNAVAILABLE, callback->deviceBasicInfo_);
277 }
278 DeleteDmNapiStatusJsCallbackPtr(callback);
279 DeleteUvWork(work);
280 }, uv_qos_user_initiated);
281 if (ret != 0) {
282 LOGE("Failed to execute OnDeviceOffline work queue");
283 DeleteDmNapiStatusJsCallbackPtr(jsCallback);
284 DeleteUvWork(work);
285 }
286 }
287
OnDeviceChanged(const DmDeviceBasicInfo & deviceBasicInfo)288 void DmNapiDeviceStatusCallback::OnDeviceChanged(const DmDeviceBasicInfo &deviceBasicInfo)
289 {
290 uv_loop_s *loop = nullptr;
291 napi_get_uv_event_loop(env_, &loop);
292 if (loop == nullptr) {
293 return;
294 }
295 uv_work_t *work = new (std::nothrow) uv_work_t;
296 if (work == nullptr) {
297 LOGE("DmNapiDeviceStatusCallback: OnDeviceChanged, No memory");
298 return;
299 }
300
301 DmNapiStatusJsCallback *jsCallback = new DmNapiStatusJsCallback(bundleName_, 0, 0, deviceBasicInfo);
302 if (jsCallback == nullptr) {
303 DeleteUvWork(work);
304 return;
305 }
306 work->data = reinterpret_cast<void *>(jsCallback);
307
308 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
309 LOGD("OnDeviceChanged uv_queue_work_with_qos");
310 }, [] (uv_work_t *work, int status) {
311 DmNapiStatusJsCallback *callback = reinterpret_cast<DmNapiStatusJsCallback *>(work->data);
312 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
313 if (deviceManagerNapi == nullptr) {
314 LOGE("OnDeviceChanged, deviceManagerNapi not find for bundleName %{public}s",
315 callback->bundleName_.c_str());
316 } else {
317 std::string deviceName = callback->deviceBasicInfo_.deviceName;
318 deviceManagerNapi->OnDeviceStatusChange(DmNapiDevStatusChange::CHANGE, callback->deviceBasicInfo_);
319 }
320 DeleteDmNapiStatusJsCallbackPtr(callback);
321 DeleteUvWork(work);
322 }, uv_qos_user_initiated);
323 if (ret != 0) {
324 LOGE("Failed to execute OnDeviceChanged work queue");
325 DeleteDmNapiStatusJsCallbackPtr(jsCallback);
326 DeleteUvWork(work);
327 }
328 }
329
OnDeviceFound(uint16_t subscribeId,const DmDeviceBasicInfo & deviceBasicInfo)330 void DmNapiDiscoveryCallback::OnDeviceFound(uint16_t subscribeId,
331 const DmDeviceBasicInfo &deviceBasicInfo)
332 {
333 LOGI("OnDeviceFound for %{public}s, subscribeId %{public}d", bundleName_.c_str(), (int32_t)subscribeId);
334 uv_loop_s *loop = nullptr;
335 napi_get_uv_event_loop(env_, &loop);
336 if (loop == nullptr) {
337 return;
338 }
339 uv_work_t *work = new (std::nothrow) uv_work_t;
340 if (work == nullptr) {
341 LOGE("DmNapiDiscoveryCallback: OnDeviceFound, No memory");
342 return;
343 }
344
345 DmNapiStatusJsCallback *jsCallback = new DmNapiStatusJsCallback(bundleName_, subscribeId, 0, deviceBasicInfo);
346 if (jsCallback == nullptr) {
347 DeleteUvWork(work);
348 return;
349 }
350 work->data = reinterpret_cast<void *>(jsCallback);
351
352 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
353 LOGD("OnDeviceFound uv_queue_work_with_qos");
354 }, [] (uv_work_t *work, int status) {
355 DmNapiStatusJsCallback *callback = reinterpret_cast<DmNapiStatusJsCallback *>(work->data);
356 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
357 if (deviceManagerNapi == nullptr) {
358 LOGE("OnDeviceFound, deviceManagerNapi not find for bundleName %{public}s", callback->bundleName_.c_str());
359 } else {
360 deviceManagerNapi->OnDeviceFound(callback->subscribeId_, callback->deviceBasicInfo_);
361 }
362 DeleteDmNapiStatusJsCallbackPtr(callback);
363 DeleteUvWork(work);
364 }, uv_qos_user_initiated);
365 if (ret != 0) {
366 LOGE("Failed to execute OnDeviceFound work queue");
367 DeleteDmNapiStatusJsCallbackPtr(jsCallback);
368 DeleteUvWork(work);
369 }
370 }
371
OnDiscoveryFailed(uint16_t subscribeId,int32_t failedReason)372 void DmNapiDiscoveryCallback::OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason)
373 {
374 LOGI("OnDiscoveryFailed for %{public}s, subscribeId %{public}d", bundleName_.c_str(), (int32_t)subscribeId);
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("DmNapiDiscoveryCallback: OnDiscoveryFailed, No memory");
384 return;
385 }
386
387 DmDeviceBasicInfo info;
388 DmNapiStatusJsCallback *jsCallback = new DmNapiStatusJsCallback(bundleName_, subscribeId,
389 failedReason, info);
390 if (jsCallback == nullptr) {
391 DeleteUvWork(work);
392 return;
393 }
394 work->data = reinterpret_cast<void *>(jsCallback);
395
396 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
397 LOGD("OnDiscoveryFailed uv_queue_work_with_qos");
398 }, [] (uv_work_t *work, int status) {
399 DmNapiStatusJsCallback *callback = reinterpret_cast<DmNapiStatusJsCallback *>(work->data);
400 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
401 if (deviceManagerNapi == nullptr) {
402 LOGE("OnDiscoveryFailed, deviceManagerNapi not find for bundleName %{public}s",
403 callback->bundleName_.c_str());
404 } else {
405 deviceManagerNapi->OnDiscoveryFailed(callback->subscribeId_, callback->reason_);
406 }
407 DeleteDmNapiStatusJsCallbackPtr(callback);
408 DeleteUvWork(work);
409 }, uv_qos_user_initiated);
410 if (ret != 0) {
411 LOGE("Failed to execute OnDiscoveryFailed work queue");
412 DeleteDmNapiStatusJsCallbackPtr(jsCallback);
413 DeleteUvWork(work);
414 }
415 }
416
OnDiscoverySuccess(uint16_t subscribeId)417 void DmNapiDiscoveryCallback::OnDiscoverySuccess(uint16_t subscribeId)
418 {
419 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(bundleName_);
420 if (deviceManagerNapi == nullptr) {
421 LOGE("OnDiscoverySuccess, deviceManagerNapi not find for bundleName %{public}s", bundleName_.c_str());
422 return;
423 }
424 LOGI("DiscoverySuccess for %{public}s, subscribeId %{public}d", bundleName_.c_str(), (int32_t)subscribeId);
425 }
426
IncreaseRefCount()427 void DmNapiDiscoveryCallback::IncreaseRefCount()
428 {
429 refCount_++;
430 }
431
DecreaseRefCount()432 void DmNapiDiscoveryCallback::DecreaseRefCount()
433 {
434 refCount_--;
435 }
436
GetRefCount()437 int32_t DmNapiDiscoveryCallback::GetRefCount()
438 {
439 return refCount_;
440 }
441
OnPublishResult(int32_t publishId,int32_t publishResult)442 void DmNapiPublishCallback::OnPublishResult(int32_t publishId, int32_t publishResult)
443 {
444 LOGI("OnPublishResult for %{public}s, publishId %{public}d, publishResult %{public}d", bundleName_.c_str(),
445 publishId, publishResult);
446 uv_loop_s *loop = nullptr;
447 napi_get_uv_event_loop(env_, &loop);
448 if (loop == nullptr) {
449 return;
450 }
451 uv_work_t *work = new (std::nothrow) uv_work_t;
452 if (work == nullptr) {
453 LOGE("DmNapiPublishCallback: OnPublishResult, No memory");
454 return;
455 }
456
457 DmNapiPublishJsCallback *jsCallback = new DmNapiPublishJsCallback(bundleName_, publishId, publishResult);
458 if (jsCallback == nullptr) {
459 DeleteUvWork(work);
460 return;
461 }
462 work->data = reinterpret_cast<void *>(jsCallback);
463
464 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
465 LOGD("OnPublishResult uv_queue_work_with_qos");
466 }, [] (uv_work_t *work, int status) {
467 DmNapiPublishJsCallback *callback = reinterpret_cast<DmNapiPublishJsCallback *>(work->data);
468 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
469 if (deviceManagerNapi == nullptr) {
470 LOGE("OnPublishResult, deviceManagerNapi failed for bundleName %{public}s", callback->bundleName_.c_str());
471 } else {
472 deviceManagerNapi->OnPublishResult(callback->publishId_, callback->reason_);
473 }
474 delete callback;
475 callback = nullptr;
476 DeleteUvWork(work);
477 }, uv_qos_user_initiated);
478 if (ret != 0) {
479 LOGE("Failed to execute OnPublishResult work queue");
480 delete jsCallback;
481 jsCallback = nullptr;
482 DeleteUvWork(work);
483 }
484 }
485
IncreaseRefCount()486 void DmNapiPublishCallback::IncreaseRefCount()
487 {
488 refCount_++;
489 }
490
DecreaseRefCount()491 void DmNapiPublishCallback::DecreaseRefCount()
492 {
493 refCount_--;
494 }
495
GetRefCount()496 int32_t DmNapiPublishCallback::GetRefCount()
497 {
498 return refCount_;
499 }
500
OnAuthResult(const std::string & deviceId,const std::string & token,int32_t status,int32_t reason)501 void DmNapiAuthenticateCallback::OnAuthResult(const std::string &deviceId, const std::string &token, int32_t status,
502 int32_t reason)
503 {
504 uv_loop_s *loop = nullptr;
505 napi_get_uv_event_loop(env_, &loop);
506 if (loop == nullptr) {
507 return;
508 }
509 uv_work_t *work = new (std::nothrow) uv_work_t;
510 if (work == nullptr) {
511 LOGE("js4.0 DmNapiAuthenticateCallback::OnAuthResult, No memory");
512 return;
513 }
514
515 DmNapiAuthJsCallback *jsCallback = new DmNapiAuthJsCallback(bundleName_, deviceId, token, status, reason);
516 if (jsCallback == nullptr) {
517 DeleteUvWork(work);
518 return;
519 }
520 work->data = reinterpret_cast<void *>(jsCallback);
521
522 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
523 LOGD("OnAuthResult uv_queue_work_with_qos");
524 }, [] (uv_work_t *work, int status) {
525 DmNapiAuthJsCallback *callback = reinterpret_cast<DmNapiAuthJsCallback *>(work->data);
526 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
527 if (deviceManagerNapi == nullptr) {
528 LOGE("OnAuthResult, deviceManagerNapi not find for bundleName %{public}s", callback->bundleName_.c_str());
529 } else {
530 deviceManagerNapi->OnAuthResult(callback->deviceId_, callback->token_,
531 callback->status_, callback->reason_);
532 }
533 delete callback;
534 callback = nullptr;
535 DeleteUvWork(work);
536 }, uv_qos_user_initiated);
537 if (ret != 0) {
538 LOGE("Failed to execute OnAuthResult work queue");
539 delete jsCallback;
540 jsCallback = nullptr;
541 DeleteUvWork(work);
542 }
543 }
544
OnResult(const std::vector<DmDeviceProfileInfo> & deviceProfileInfos,int32_t code)545 void DmNapiGetDeviceProfileInfoListCallback::OnResult(const std::vector<DmDeviceProfileInfo> &deviceProfileInfos,
546 int32_t code)
547 {
548 LOGI("In code:%{public}d, size:%{public}zu", code, deviceProfileInfos.size());
549 uv_loop_s *loop = nullptr;
550 napi_get_uv_event_loop(env_, &loop);
551 if (loop == nullptr) {
552 LOGE("get loop fail");
553 return;
554 }
555 uv_work_t *work = new (std::nothrow) uv_work_t;
556 if (work == nullptr) {
557 LOGE("OnResult, No memory");
558 return;
559 }
560 auto *jsCallback = new DeviceProfileInfosAsyncCallbackInfo();
561 if (jsCallback == nullptr) {
562 LOGE("create jsCallback fail");
563 DeleteUvWork(work);
564 return;
565 }
566 jsCallback->env = env_;
567 jsCallback->bundleName = bundleName_;
568 jsCallback->deferred = deferred_;
569 jsCallback->deviceProfileInfos = deviceProfileInfos;
570 jsCallback->code = code;
571 work->data = reinterpret_cast<void *>(jsCallback);
572 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
573 LOGD("OnResult uv_queue_work_with_qos");
574 }, [] (uv_work_t *work, int status) {
575 DeviceProfileInfosAsyncCallbackInfo *callback =
576 reinterpret_cast<DeviceProfileInfosAsyncCallbackInfo *>(work->data);
577 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName);
578 if (deviceManagerNapi == nullptr) {
579 LOGE("deviceManagerNapi not find for bundleName %{public}s", callback->bundleName.c_str());
580 } else {
581 deviceManagerNapi->OnGetDeviceProfileInfoListCallbackResult(callback);
582 }
583 delete callback;
584 callback = nullptr;
585 DeleteUvWork(work);
586 }, uv_qos_user_initiated);
587 if (ret != 0) {
588 LOGE("Failed to execute OnBindResult work queue");
589 delete jsCallback;
590 jsCallback = nullptr;
591 DeleteUvWork(work);
592 }
593 }
594
DeviceManagerNapi(napi_env env,napi_value thisVar)595 DeviceManagerNapi::DeviceManagerNapi(napi_env env, napi_value thisVar) : DmNativeEvent(env, thisVar)
596 {
597 env_ = env;
598 }
599
~DeviceManagerNapi()600 DeviceManagerNapi::~DeviceManagerNapi()
601 {
602 }
603
GetDeviceManagerNapi(std::string & bundleName)604 DeviceManagerNapi *DeviceManagerNapi::GetDeviceManagerNapi(std::string &bundleName)
605 {
606 std::lock_guard<std::mutex> autoLock(g_deviceManagerMapMutex);
607 auto iter = g_deviceManagerMap.find(bundleName);
608 if (iter == g_deviceManagerMap.end()) {
609 return nullptr;
610 }
611 return iter->second;
612 }
613
OnDeviceStatusChange(DmNapiDevStatusChange action,const OHOS::DistributedHardware::DmDeviceBasicInfo & deviceBasicInfo)614 void DeviceManagerNapi::OnDeviceStatusChange(DmNapiDevStatusChange action,
615 const OHOS::DistributedHardware::DmDeviceBasicInfo &deviceBasicInfo)
616 {
617 napi_handle_scope scope;
618 napi_open_handle_scope(env_, &scope);
619 napi_value result = nullptr;
620 napi_create_object(env_, &result);
621 SetValueInt32(env_, "action", (int)action, result);
622
623 napi_value device = nullptr;
624 napi_create_object(env_, &device);
625 DmDeviceBasicToJsObject(env_, deviceBasicInfo, device);
626
627 napi_set_named_property(env_, result, "device", device);
628 OnEvent("deviceStateChange", DM_NAPI_ARGS_ONE, &result);
629 napi_close_handle_scope(env_, scope);
630 }
631
OnDeviceFound(uint16_t subscribeId,const DmDeviceBasicInfo & deviceBasicInfo)632 void DeviceManagerNapi::OnDeviceFound(uint16_t subscribeId, const DmDeviceBasicInfo &deviceBasicInfo)
633 {
634 LOGI("OnDeviceFound DmDeviceBasicInfo for subscribeId %{public}d", (int32_t)subscribeId);
635 napi_handle_scope scope;
636 napi_open_handle_scope(env_, &scope);
637 napi_value result = nullptr;
638 napi_create_object(env_, &result);
639
640 napi_value device = nullptr;
641 napi_create_object(env_, &device);
642 DmDeviceBasicToJsObject(env_, deviceBasicInfo, device);
643
644 napi_set_named_property(env_, result, "device", device);
645 OnEvent("discoverSuccess", DM_NAPI_ARGS_ONE, &result);
646 napi_close_handle_scope(env_, scope);
647 }
648
OnDiscoveryFailed(uint16_t subscribeId,int32_t failedReason)649 void DeviceManagerNapi::OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason)
650 {
651 LOGI("OnDiscoveryFailed for subscribeId %{public}d", (int32_t)subscribeId);
652 napi_handle_scope scope;
653 napi_open_handle_scope(env_, &scope);
654 napi_value result = nullptr;
655 napi_create_object(env_, &result);
656 SetValueInt32(env_, "reason", (int)failedReason, result);
657 std::string errCodeInfo = OHOS::DistributedHardware::GetErrorString((int)failedReason);
658 SetValueUtf8String(env_, "errInfo", errCodeInfo, result);
659 OnEvent("discoverFail", DM_NAPI_ARGS_ONE, &result);
660 napi_close_handle_scope(env_, scope);
661 }
662
OnPublishResult(int32_t publishId,int32_t publishResult)663 void DeviceManagerNapi::OnPublishResult(int32_t publishId, int32_t publishResult)
664 {
665 LOGI("OnPublishResult for publishId %{public}d, publishResult %{public}d", publishId, publishResult);
666 napi_handle_scope scope;
667 napi_open_handle_scope(env_, &scope);
668 napi_value result = nullptr;
669 napi_create_object(env_, &result);
670 SetValueInt32(env_, "publishId", publishId, result);
671 if (publishResult == 0) {
672 OnEvent("publishSuccess", DM_NAPI_ARGS_ONE, &result);
673 } else {
674 SetValueInt32(env_, "reason", publishResult, result);
675 std::string errCodeInfo = OHOS::DistributedHardware::GetErrorString(publishResult);
676 SetValueUtf8String(env_, "errInfo", errCodeInfo, result);
677 OnEvent("publishFail", DM_NAPI_ARGS_ONE, &result);
678 }
679 NAPI_CALL_RETURN_VOID(env_, napi_close_handle_scope(env_, scope));
680 }
681
OnAuthResult(const std::string & deviceId,const std::string & token,int32_t status,int32_t reason)682 void DeviceManagerNapi::OnAuthResult(const std::string &deviceId, const std::string &token, int32_t status,
683 int32_t reason)
684 {
685 LOGI("OnAuthResult for status: %{public}d, reason: %{public}d", status, reason);
686 napi_handle_scope scope;
687 napi_open_handle_scope(env_, &scope);
688 napi_value thisVar = nullptr;
689 napi_get_reference_value(env_, thisVarRef_, &thisVar);
690 napi_value result[DM_NAPI_ARGS_TWO] = {0};
691
692 if (status == DM_AUTH_REQUEST_SUCCESS_STATUS && reason == 0) {
693 LOGI("OnAuthResult success");
694 napi_get_undefined(env_, &result[0]);
695 napi_create_object(env_, &result[1]);
696 SetValueUtf8String(env_, "deviceId", deviceId, result[1]);
697 } else {
698 LOGI("OnAuthResult failed");
699 napi_create_object(env_, &result[0]);
700 SetValueInt32(env_, "code", status, result[0]);
701 SetValueInt32(env_, "reason", reason, result[0]);
702 std::string errCodeInfo = OHOS::DistributedHardware::GetErrorString((int)reason);
703 SetValueUtf8String(env_, "errInfo", errCodeInfo, result[0]);
704 napi_get_undefined(env_, &result[1]);
705 }
706
707 if (reason == DM_OK && (status <= STATUS_DM_CLOSE_PIN_INPUT_UI && status >= STATUS_DM_SHOW_AUTHORIZE_UI)) {
708 LOGI("update ui change, status: %{public}d, reason: %{public}d", status, reason);
709 } else {
710 napi_value callResult = nullptr;
711 napi_value handler = nullptr;
712 napi_get_reference_value(env_, authAsyncCallbackInfo_.callback, &handler);
713 if (handler != nullptr) {
714 napi_call_function(env_, nullptr, handler, DM_NAPI_ARGS_TWO, &result[0], &callResult);
715 napi_delete_reference(env_, authAsyncCallbackInfo_.callback);
716 authAsyncCallbackInfo_.callback = nullptr;
717 } else {
718 LOGE("handler is nullptr");
719 }
720 {
721 std::lock_guard<std::mutex> autoLock(g_authCallbackMapMutex);
722 g_authCallbackMap.erase(bundleName_);
723 }
724 }
725 napi_close_handle_scope(env_, scope);
726 }
727
OnGetDeviceProfileInfoListCallbackResult(DeviceProfileInfosAsyncCallbackInfo * jsCallback)728 void DeviceManagerNapi::OnGetDeviceProfileInfoListCallbackResult(DeviceProfileInfosAsyncCallbackInfo *jsCallback)
729 {
730 LOGI("In");
731 napi_handle_scope scope;
732 napi_open_handle_scope(env_, &scope);
733 if (jsCallback->code != DM_OK) {
734 napi_value error = CreateBusinessError(env_, jsCallback->code, false);
735 napi_reject_deferred(env_, jsCallback->deferred, error);
736 LOGE("jsCallback->code(%{public}d) != DM_OK", jsCallback->code);
737 napi_close_handle_scope(env_, scope);
738 return;
739 }
740 napi_value devInfosJsObj;
741 napi_create_array(env_, &devInfosJsObj);
742 bool isArray = false;
743 napi_is_array(env_, devInfosJsObj, &isArray);
744 if (!isArray) {
745 LOGE("napi_create_array failed");
746 napi_value error = CreateBusinessError(env_, ERR_DM_POINT_NULL, false);
747 napi_reject_deferred(env_, jsCallback->deferred, error);
748 napi_close_handle_scope(env_, scope);
749 return;
750 }
751 DmDeviceProfileInfoToJsArray(env_, jsCallback->deviceProfileInfos, devInfosJsObj);
752 napi_resolve_deferred(env_, jsCallback->deferred, devInfosJsObj);
753 napi_close_handle_scope(env_, scope);
754 }
755
OnGetDeviceIconInfoCallbackResult(DeviceIconInfoAsyncCallbackInfo * jsCallback)756 void DeviceManagerNapi::OnGetDeviceIconInfoCallbackResult(DeviceIconInfoAsyncCallbackInfo *jsCallback)
757 {
758 LOGI("In");
759 napi_handle_scope scope;
760 napi_open_handle_scope(env_, &scope);
761 if (jsCallback->code != DM_OK) {
762 napi_value error = CreateBusinessError(env_, jsCallback->code, false);
763 napi_reject_deferred(env_, jsCallback->deferred, error);
764 LOGE("jsCallback->code(%{public}d) != DM_OK", jsCallback->code);
765 napi_close_handle_scope(env_, scope);
766 return;
767 }
768 napi_value deviceIconInfoJsObj;
769 napi_create_object(env_, &deviceIconInfoJsObj);
770 DmDeviceIconInfoToJs(env_, jsCallback->deviceIconInfo, deviceIconInfoJsObj);
771 napi_resolve_deferred(env_, jsCallback->deferred, deviceIconInfoJsObj);
772 napi_close_handle_scope(env_, scope);
773 }
774
OnSetLocalDeviceNameCallbackResult(SetLocalDeviceNameAsyncCallbackInfo * jsCallback)775 void DeviceManagerNapi::OnSetLocalDeviceNameCallbackResult(SetLocalDeviceNameAsyncCallbackInfo *jsCallback)
776 {
777 LOGI("In");
778 napi_handle_scope scope;
779 napi_open_handle_scope(env_, &scope);
780 if (jsCallback->code != DM_OK) {
781 napi_value error = CreateBusinessError(env_, jsCallback->code, false);
782 napi_reject_deferred(env_, jsCallback->deferred, error);
783 LOGE("jsCallback->code(%{public}d) != DM_OK", jsCallback->code);
784 napi_close_handle_scope(env_, scope);
785 return;
786 }
787 napi_value value = nullptr;
788 napi_create_int32(env_, jsCallback->code, &value);
789 napi_resolve_deferred(env_, jsCallback->deferred, value);
790 napi_close_handle_scope(env_, scope);
791 }
792
OnSetRemoteDeviceNameCallbackResult(SetRemoteDeviceNameAsyncCallbackInfo * jsCallback)793 void DeviceManagerNapi::OnSetRemoteDeviceNameCallbackResult(SetRemoteDeviceNameAsyncCallbackInfo *jsCallback)
794 {
795 LOGI("In");
796 napi_handle_scope scope;
797 napi_open_handle_scope(env_, &scope);
798 if (jsCallback->code != DM_OK) {
799 napi_value error = CreateBusinessError(env_, jsCallback->code, false);
800 napi_reject_deferred(env_, jsCallback->deferred, error);
801 LOGE("jsCallback->code(%{public}d) != DM_OK", jsCallback->code);
802 napi_close_handle_scope(env_, scope);
803 return;
804 }
805 napi_value value = nullptr;
806 napi_create_int32(env_, jsCallback->code, &value);
807 napi_resolve_deferred(env_, jsCallback->deferred, value);
808 napi_close_handle_scope(env_, scope);
809 }
810
CreateDmCallback(napi_env env,std::string & bundleName,std::string & eventType)811 void DeviceManagerNapi::CreateDmCallback(napi_env env, std::string &bundleName, std::string &eventType)
812 {
813 LOGI("CreateDmCallback for bundleName %{public}s eventType %{public}s", bundleName.c_str(), eventType.c_str());
814 if (eventType == DM_NAPI_EVENT_DEVICE_STATE_CHANGE || eventType == DM_NAPI_EVENT_DEVICE_NAME_CHANGE) {
815 RegisterDevStatusCallback(env, bundleName);
816 return;
817 }
818 if (eventType == DM_NAPI_EVENT_DEVICE_DISCOVER_SUCCESS || eventType == DM_NAPI_EVENT_DEVICE_DISCOVER_FAIL) {
819 auto callback = std::make_shared<DmNapiDiscoveryCallback>(env, bundleName);
820 {
821 std::lock_guard<std::mutex> autoLock(g_discoveryCallbackMapMutex);
822 g_DiscoveryCallbackMap[bundleName] = callback;
823 }
824 std::shared_ptr<DmNapiDiscoveryCallback> discoveryCallback = callback;
825 discoveryCallback->IncreaseRefCount();
826 return;
827 }
828
829 if (eventType == DM_NAPI_EVENT_DEVICE_PUBLISH_SUCCESS || eventType == DM_NAPI_EVENT_DEVICE_PUBLISH_FAIL) {
830 auto callback = std::make_shared<DmNapiPublishCallback>(env, bundleName);
831 {
832 std::lock_guard<std::mutex> autoLock(g_publishCallbackMapMutex);
833 g_publishCallbackMap[bundleName] = callback;
834 }
835 std::shared_ptr<DmNapiPublishCallback> publishCallback = callback;
836 publishCallback->IncreaseRefCount();
837 return;
838 }
839
840 if (eventType == DM_NAPI_EVENT_REPLY_RESULT) {
841 auto callback = std::make_shared<DmNapiDeviceManagerUiCallback>(env, bundleName);
842 int32_t ret = DeviceManager::GetInstance().RegisterDeviceManagerFaCallback(bundleName, callback);
843 if (ret != 0) {
844 LOGE("RegisterDeviceManagerFaCallback failed for bundleName %{public}s", bundleName.c_str());
845 return;
846 }
847 {
848 std::lock_guard<std::mutex> autoLock(g_dmUiCallbackMapMutex);
849 g_dmUiCallbackMap[bundleName] = callback;
850 }
851 return;
852 }
853 }
854
RegisterDevStatusCallback(napi_env env,std::string & bundleName)855 void DeviceManagerNapi::RegisterDevStatusCallback(napi_env env, std::string &bundleName)
856 {
857 LOGI("RegisterDevStatusCallback start for bundleName %{public}s", bundleName.c_str());
858 {
859 std::lock_guard<std::mutex> autoLock(g_deviceStatusCallbackMapMutex);
860 if (g_deviceStatusCallbackMap.find(bundleName) != g_deviceStatusCallbackMap.end()) {
861 LOGI("bundleName already register.");
862 return;
863 }
864 }
865 auto callback = std::make_shared<DmNapiDeviceStatusCallback>(env, bundleName);
866 std::string extra = "";
867 int32_t ret = DeviceManager::GetInstance().RegisterDevStatusCallback(bundleName, extra, callback);
868 if (ret != 0) {
869 LOGE("RegisterDevStatusCallback failed ret %{public}d", ret);
870 return;
871 }
872 {
873 std::lock_guard<std::mutex> autoLock(g_deviceStatusCallbackMapMutex);
874 g_deviceStatusCallbackMap[bundleName] = callback;
875 }
876 return;
877 }
878
CreateDmCallback(napi_env env,std::string & bundleName,std::string & eventType,std::string & extra)879 void DeviceManagerNapi::CreateDmCallback(napi_env env, std::string &bundleName,
880 std::string &eventType, std::string &extra)
881 {
882 LOGI("CreateDmCallback for bundleName %{public}s eventType %{public}s extra = %{public}s",
883 bundleName.c_str(), eventType.c_str(), extra.c_str());
884 if (eventType == DM_NAPI_EVENT_DEVICE_STATE_CHANGE) {
885 auto callback = std::make_shared<DmNapiDeviceStatusCallback>(env, bundleName);
886 int32_t ret = DeviceManager::GetInstance().RegisterDevStatusCallback(bundleName, extra, callback);
887 if (ret != 0) {
888 LOGE("RegisterDevStatusCallback failed for bundleName %{public}s", bundleName.c_str());
889 return;
890 }
891 {
892 std::lock_guard<std::mutex> autoLock(g_deviceStatusCallbackMapMutex);
893 g_deviceStatusCallbackMap[bundleName] = callback;
894 }
895 }
896 }
897
ReleasePublishCallback(std::string & bundleName)898 void DeviceManagerNapi::ReleasePublishCallback(std::string &bundleName)
899 {
900 LOGI("ReleasePublishCallback for bundleName %{public}s", bundleName.c_str());
901 std::shared_ptr<DmNapiPublishCallback> publishCallback = nullptr;
902 {
903 std::lock_guard<std::mutex> autoLock(g_publishCallbackMapMutex);
904 auto iter = g_publishCallbackMap.find(bundleName);
905 if (iter == g_publishCallbackMap.end()) {
906 return;
907 }
908 publishCallback = iter->second;
909 }
910 publishCallback->DecreaseRefCount();
911 if (publishCallback->GetRefCount() == 0) {
912 std::lock_guard<std::mutex> autoLock(g_publishCallbackMapMutex);
913 g_publishCallbackMap.erase(bundleName);
914 }
915 return;
916 }
917
ReleaseDiscoveryCallback(std::string & bundleName)918 void DeviceManagerNapi::ReleaseDiscoveryCallback(std::string &bundleName)
919 {
920 LOGI("ReleaseDiscoveryCallback for bundleName %{public}s", bundleName.c_str());
921 std::shared_ptr<DmNapiDiscoveryCallback> DiscoveryCallback = nullptr;
922 {
923 std::lock_guard<std::mutex> autoLock(g_discoveryCallbackMapMutex);
924 auto iter = g_DiscoveryCallbackMap.find(bundleName);
925 if (iter == g_DiscoveryCallbackMap.end()) {
926 return;
927 }
928 DiscoveryCallback = iter->second;
929 }
930 DiscoveryCallback->DecreaseRefCount();
931 if (DiscoveryCallback->GetRefCount() == 0) {
932 std::lock_guard<std::mutex> autoLock(g_discoveryCallbackMapMutex);
933 g_DiscoveryCallbackMap.erase(bundleName);
934 }
935 return;
936 }
937
ReleaseDmCallback(std::string & bundleName,std::string & eventType)938 void DeviceManagerNapi::ReleaseDmCallback(std::string &bundleName, std::string &eventType)
939 {
940 if (eventType == DM_NAPI_EVENT_DEVICE_STATE_CHANGE) {
941 {
942 std::lock_guard<std::mutex> autoLock(g_deviceStatusCallbackMapMutex);
943 auto iter = g_deviceStatusCallbackMap.find(bundleName);
944 if (iter == g_deviceStatusCallbackMap.end()) {
945 LOGE("ReleaseDmCallback: cannot find statusCallback for bundleName %{public}s", bundleName.c_str());
946 return;
947 }
948 }
949 int32_t ret = DeviceManager::GetInstance().UnRegisterDevStatusCallback(bundleName);
950 if (ret != 0) {
951 LOGE("UnRegisterDevStatusCallback failed for bundleName %{public}s", bundleName.c_str());
952 return;
953 }
954 {
955 std::lock_guard<std::mutex> autoLock(g_deviceStatusCallbackMapMutex);
956 g_deviceStatusCallbackMap.erase(bundleName);
957 }
958 return;
959 }
960
961 if (eventType == DM_NAPI_EVENT_DEVICE_DISCOVER_SUCCESS || eventType == DM_NAPI_EVENT_DEVICE_DISCOVER_FAIL) {
962 ReleaseDiscoveryCallback(bundleName);
963 return;
964 }
965
966 if (eventType == DM_NAPI_EVENT_DEVICE_PUBLISH_SUCCESS || eventType == DM_NAPI_EVENT_DEVICE_PUBLISH_FAIL) {
967 ReleasePublishCallback(bundleName);
968 return;
969 }
970
971 if (eventType == DM_NAPI_EVENT_REPLY_RESULT) {
972 {
973 std::lock_guard<std::mutex> autoLock(g_dmUiCallbackMapMutex);
974 auto iter = g_dmUiCallbackMap.find(bundleName);
975 if (iter == g_dmUiCallbackMap.end()) {
976 LOGE("cannot find dmFaCallback for bundleName %{public}s", bundleName.c_str());
977 return;
978 }
979 }
980 int32_t ret = DeviceManager::GetInstance().UnRegisterDeviceManagerFaCallback(bundleName);
981 if (ret != 0) {
982 LOGE("UnRegisterDeviceManagerFaCallback failed for bundleName %{public}s", bundleName.c_str());
983 return;
984 }
985 {
986 std::lock_guard<std::mutex> autoLock(g_dmUiCallbackMapMutex);
987 g_dmUiCallbackMap.erase(bundleName);
988 }
989 return;
990 }
991 }
992
SetUserOperationSync(napi_env env,napi_callback_info info)993 napi_value DeviceManagerNapi::SetUserOperationSync(napi_env env, napi_callback_info info)
994 {
995 LOGI("SetUserOperationSync in");
996 if (!IsSystemApp()) {
997 LOGI("SetUserOperationSync not SystemApp");
998 CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
999 return nullptr;
1000 }
1001 GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
1002 napi_valuetype valueType;
1003 napi_typeof(env, argv[0], &valueType);
1004 if (!CheckArgsType(env, valueType == napi_number, "action", "number")) {
1005 return nullptr;
1006 }
1007 int32_t action = 0;
1008 napi_get_value_int32(env, argv[0], &action);
1009
1010 std::string params;
1011 if (!JsToStringAndCheck(env, argv[1], "actionResult", params)) {
1012 return nullptr;
1013 }
1014 napi_value result = nullptr;
1015 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1016 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1017 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1018 return result;
1019 }
1020 int32_t ret = DeviceManager::GetInstance().SetUserOperation(deviceManagerWrapper->bundleName_, action, params);
1021 if (ret != 0) {
1022 LOGE("SetUserOperation for bundleName %{public}s failed, ret %{public}d",
1023 deviceManagerWrapper->bundleName_.c_str(), ret);
1024 CreateBusinessError(env, ret);
1025 }
1026 napi_get_undefined(env, &result);
1027 return result;
1028 }
1029
OnCall(const std::string & paramJson)1030 void DmNapiDeviceManagerUiCallback::OnCall(const std::string ¶mJson)
1031 {
1032 uv_loop_s *loop = nullptr;
1033 napi_get_uv_event_loop(env_, &loop);
1034 if (loop == nullptr) {
1035 return;
1036 }
1037 uv_work_t *work = new (std::nothrow) uv_work_t;
1038 if (work == nullptr) {
1039 LOGE("DmNapiDeviceManagerUiCallback: OnCall, No memory");
1040 return;
1041 }
1042
1043 DmNapiAuthJsCallback *jsCallback = new DmNapiAuthJsCallback(bundleName_, "", paramJson, 0, 0);
1044 if (jsCallback == nullptr) {
1045 DeleteUvWork(work);
1046 return;
1047 }
1048 work->data = reinterpret_cast<void *>(jsCallback);
1049
1050 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
1051 LOGD("OnCall uv_queue_work_with_qos");
1052 }, [] (uv_work_t *work, int status) {
1053 DmNapiAuthJsCallback *callback = reinterpret_cast<DmNapiAuthJsCallback *>(work->data);
1054 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
1055 if (deviceManagerNapi == nullptr) {
1056 LOGE("OnCall, deviceManagerNapi not find for bundleName %{public}s", callback->bundleName_.c_str());
1057 } else {
1058 deviceManagerNapi->OnDmUiCall(callback->token_);
1059 }
1060 delete callback;
1061 callback = nullptr;
1062 DeleteUvWork(work);
1063 }, uv_qos_user_initiated);
1064 if (ret != 0) {
1065 LOGE("Failed to execute OnCall work queue");
1066 delete jsCallback;
1067 jsCallback = nullptr;
1068 DeleteUvWork(work);
1069 }
1070 }
1071
OnDmUiCall(const std::string & paramJson)1072 void DeviceManagerNapi::OnDmUiCall(const std::string ¶mJson)
1073 {
1074 LOGI("OnCall for paramJson");
1075 napi_handle_scope scope;
1076 napi_open_handle_scope(env_, &scope);
1077 napi_value result;
1078 napi_create_object(env_, &result);
1079 SetValueUtf8String(env_, "param", paramJson, result);
1080 OnEvent(DM_NAPI_EVENT_REPLY_RESULT, DM_NAPI_ARGS_ONE, &result);
1081 napi_close_handle_scope(env_, scope);
1082 }
1083
OnBindResult(const PeerTargetId & targetId,int32_t result,int32_t status,std::string content)1084 void DmNapiBindTargetCallback::OnBindResult(const PeerTargetId &targetId, int32_t result, int32_t status,
1085 std::string content)
1086 {
1087 (void)targetId;
1088 uv_loop_s *loop = nullptr;
1089 napi_get_uv_event_loop(env_, &loop);
1090 if (loop == nullptr) {
1091 return;
1092 }
1093 uv_work_t *work = new (std::nothrow) uv_work_t;
1094 if (work == nullptr) {
1095 LOGE("js4.0 DmNapiBindTargetCallback::OnBindResult, No memory");
1096 return;
1097 }
1098
1099 DmNapiAuthJsCallback *jsCallback = new DmNapiAuthJsCallback(bundleName_, content, "", status, result);
1100 if (jsCallback == nullptr) {
1101 DeleteUvWork(work);
1102 return;
1103 }
1104 work->data = reinterpret_cast<void *>(jsCallback);
1105
1106 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
1107 LOGD("OnBindResult uv_queue_work_with_qos");
1108 }, [] (uv_work_t *work, int status) {
1109 DmNapiAuthJsCallback *callback = reinterpret_cast<DmNapiAuthJsCallback *>(work->data);
1110 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName_);
1111 if (deviceManagerNapi == nullptr) {
1112 LOGE("OnBindResult, deviceManagerNapi not find for bundleName %{public}s", callback->bundleName_.c_str());
1113 } else {
1114 deviceManagerNapi->OnAuthResult(callback->deviceId_, callback->token_,
1115 callback->status_, callback->reason_);
1116 }
1117 delete callback;
1118 callback = nullptr;
1119 DeleteUvWork(work);
1120 }, uv_qos_user_initiated);
1121 if (ret != 0) {
1122 LOGE("Failed to execute OnBindResult work queue");
1123 delete jsCallback;
1124 jsCallback = nullptr;
1125 DeleteUvWork(work);
1126 }
1127 }
1128
DumpDeviceInfo(DeviceBasicInfoListAsyncCallbackInfo * deviceBasicInfoListAsyncCallbackInfo)1129 int32_t DeviceManagerNapi::DumpDeviceInfo(
1130 DeviceBasicInfoListAsyncCallbackInfo *deviceBasicInfoListAsyncCallbackInfo)
1131 {
1132 CHECK_NULL_RETURN(deviceBasicInfoListAsyncCallbackInfo, ERR_DM_POINT_NULL);
1133 if (deviceBasicInfoListAsyncCallbackInfo->devList.size() > DM_MAX_DEVICE_SIZE) {
1134 LOGE("CallGetAvailableDeviceListStatus invalid devList size");
1135 return DM_ERR_FAILED;
1136 }
1137 for (unsigned int i = 0; i < deviceBasicInfoListAsyncCallbackInfo->devList.size(); i++) {
1138 LOGI("DeviceId:%{public}s deviceName:%{public}s deviceTypeId:%{public}d ",
1139 GetAnonyString(deviceBasicInfoListAsyncCallbackInfo->devList[i].deviceId).c_str(),
1140 GetAnonyString(deviceBasicInfoListAsyncCallbackInfo->devList[i].deviceName).c_str(),
1141 deviceBasicInfoListAsyncCallbackInfo->devList[i].deviceTypeId);
1142 }
1143 return DM_OK;
1144 }
1145
CallGetAvailableDeviceListStatus(napi_env env,napi_status & status,DeviceBasicInfoListAsyncCallbackInfo * deviceBasicInfoListAsyncCallbackInfo)1146 void DeviceManagerNapi::CallGetAvailableDeviceListStatus(napi_env env, napi_status &status,
1147 DeviceBasicInfoListAsyncCallbackInfo *deviceBasicInfoListAsyncCallbackInfo)
1148 {
1149 if (DumpDeviceInfo(deviceBasicInfoListAsyncCallbackInfo) != DM_OK) {
1150 return;
1151 }
1152 napi_value array[DM_NAPI_ARGS_TWO] = {0};
1153 bool isArray = false;
1154 NAPI_CALL_RETURN_VOID(env, napi_create_array(env, &array[1]));
1155 NAPI_CALL_RETURN_VOID(env, napi_is_array(env, array[1], &isArray));
1156 if (!isArray) {
1157 LOGE("napi_create_array fail");
1158 }
1159 if (deviceBasicInfoListAsyncCallbackInfo->status == 0) {
1160 if (deviceBasicInfoListAsyncCallbackInfo->devList.size() > 0) {
1161 for (size_t i = 0; i != deviceBasicInfoListAsyncCallbackInfo->devList.size(); ++i) {
1162 DeviceBasicInfoToJsArray(env, deviceBasicInfoListAsyncCallbackInfo->devList, i, array[1]);
1163 }
1164 LOGI("devList is OK");
1165 } else {
1166 LOGE("devList is null"); // CB come here
1167 }
1168 } else {
1169 array[0] = CreateBusinessError(env, deviceBasicInfoListAsyncCallbackInfo->ret, false);
1170 }
1171 if (deviceBasicInfoListAsyncCallbackInfo->deferred) {
1172 if (deviceBasicInfoListAsyncCallbackInfo->status == 0) {
1173 napi_resolve_deferred(env, deviceBasicInfoListAsyncCallbackInfo->deferred, array[1]);
1174 } else {
1175 napi_reject_deferred(env, deviceBasicInfoListAsyncCallbackInfo->deferred, array[0]);
1176 }
1177 } else {
1178 napi_value callResult = nullptr;
1179 napi_value handler = nullptr;
1180 NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, deviceBasicInfoListAsyncCallbackInfo->callback,
1181 &handler));
1182 if (handler != nullptr) {
1183 NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, handler, DM_NAPI_ARGS_TWO, &array[0],
1184 &callResult));
1185 NAPI_CALL_RETURN_VOID(env, napi_delete_reference(env, deviceBasicInfoListAsyncCallbackInfo->callback));
1186 deviceBasicInfoListAsyncCallbackInfo->callback = nullptr;
1187 } else {
1188 LOGE("handler is nullptr");
1189 }
1190 }
1191 }
1192
CallAsyncWork(napi_env env,DeviceBasicInfoListAsyncCallbackInfo * deviceBasicInfoListAsyncCallbackInfo)1193 void DeviceManagerNapi::CallAsyncWork(napi_env env,
1194 DeviceBasicInfoListAsyncCallbackInfo *deviceBasicInfoListAsyncCallbackInfo)
1195 {
1196 napi_value resourceName;
1197 napi_create_string_latin1(env, "GetAvailableListInfo", NAPI_AUTO_LENGTH, &resourceName);
1198 napi_create_async_work(
1199 env, nullptr, resourceName,
1200 [](napi_env env, void *data) {
1201 DeviceBasicInfoListAsyncCallbackInfo *devBasicInfoListAsyncCallbackInfo =
1202 reinterpret_cast<DeviceBasicInfoListAsyncCallbackInfo *>(data);
1203 int32_t ret = 0;
1204 ret = DeviceManager::GetInstance().GetAvailableDeviceList(devBasicInfoListAsyncCallbackInfo->bundleName,
1205 devBasicInfoListAsyncCallbackInfo->devList);
1206 if (ret != 0) {
1207 LOGE("CallAsyncWork for bundleName %{public}s failed, ret %{public}d",
1208 devBasicInfoListAsyncCallbackInfo->bundleName.c_str(), ret);
1209 devBasicInfoListAsyncCallbackInfo->status = -1;
1210 devBasicInfoListAsyncCallbackInfo->ret = ret;
1211 } else {
1212 devBasicInfoListAsyncCallbackInfo->status = 0;
1213 }
1214 LOGI("CallAsyncWork status %{public}d , ret %{public}d", devBasicInfoListAsyncCallbackInfo->status,
1215 devBasicInfoListAsyncCallbackInfo->ret);
1216 },
1217 [](napi_env env, napi_status status, void *data) {
1218 (void)status;
1219 DeviceBasicInfoListAsyncCallbackInfo *dBasicInfoListAsyncCallbackInfo =
1220 reinterpret_cast<DeviceBasicInfoListAsyncCallbackInfo *>(data);
1221 CallGetAvailableDeviceListStatus(env, status, dBasicInfoListAsyncCallbackInfo);
1222 napi_delete_async_work(env, dBasicInfoListAsyncCallbackInfo->asyncWork);
1223 delete dBasicInfoListAsyncCallbackInfo;
1224 dBasicInfoListAsyncCallbackInfo = nullptr;
1225 },
1226 (void *)deviceBasicInfoListAsyncCallbackInfo, &deviceBasicInfoListAsyncCallbackInfo->asyncWork);
1227 napi_queue_async_work_with_qos(env, deviceBasicInfoListAsyncCallbackInfo->asyncWork, napi_qos_user_initiated);
1228 }
1229
CallDeviceList(napi_env env,napi_callback_info info,DeviceBasicInfoListAsyncCallbackInfo * deviceBasicInfoListAsyncCallbackInfo)1230 napi_value DeviceManagerNapi::CallDeviceList(napi_env env, napi_callback_info info,
1231 DeviceBasicInfoListAsyncCallbackInfo *deviceBasicInfoListAsyncCallbackInfo)
1232 {
1233 napi_value result = nullptr;
1234 std::string extra = "";
1235 deviceBasicInfoListAsyncCallbackInfo->extra = extra;
1236 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1237 napi_valuetype eventHandleType = napi_undefined;
1238 napi_typeof(env, argv[0], &eventHandleType);
1239 if (eventHandleType == napi_function) {
1240 LOGI("CallDeviceList for argc %{public}zu Type = %{public}d", argc, (int)eventHandleType);
1241 napi_create_reference(env, argv[0], 1, &deviceBasicInfoListAsyncCallbackInfo->callback);
1242 CallAsyncWork(env, deviceBasicInfoListAsyncCallbackInfo);
1243 }
1244 napi_get_undefined(env, &result);
1245 return result;
1246 }
1247
GetAvailableDeviceListSync(napi_env env,napi_callback_info info)1248 napi_value DeviceManagerNapi::GetAvailableDeviceListSync(napi_env env, napi_callback_info info)
1249 {
1250 LOGI("In");
1251 int32_t ret = DeviceManager::GetInstance().CheckNewAPIAccessPermission();
1252 if (ret != 0) {
1253 CreateBusinessError(env, ret);
1254 return nullptr;
1255 }
1256 napi_value result = nullptr;
1257 napi_value thisVar = nullptr;
1258 size_t argc = 0;
1259 bool isArray = false;
1260 napi_create_array(env, &result);
1261 napi_is_array(env, result, &isArray);
1262 if (!isArray) {
1263 LOGE("napi_create_array fail");
1264 }
1265 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1266 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1267 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1268 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1269 return result;
1270 }
1271 std::vector<DmDeviceBasicInfo> devList;
1272 ret = DeviceManager::GetInstance().GetAvailableDeviceList(deviceManagerWrapper->bundleName_, devList);
1273 if (ret != 0) {
1274 LOGE("GetTrustedDeviceList for bundleName %{public}s failed, ret %{public}d",
1275 deviceManagerWrapper->bundleName_.c_str(), ret);
1276 CreateBusinessError(env, ret);
1277 return result;
1278 }
1279 LOGD("DeviceManager::GetAvailableDeviceListSync");
1280 if (devList.size() > 0) {
1281 for (size_t i = 0; i != devList.size(); ++i) {
1282 DeviceBasicInfoToJsArray(env, devList, (int32_t)i, result);
1283 }
1284 }
1285 return result;
1286 }
1287
GetAvailableDeviceListPromise(napi_env env,DeviceBasicInfoListAsyncCallbackInfo * deviceBasicInfoListAsyncCallbackInfo)1288 napi_value DeviceManagerNapi::GetAvailableDeviceListPromise(napi_env env,
1289 DeviceBasicInfoListAsyncCallbackInfo *deviceBasicInfoListAsyncCallbackInfo)
1290 {
1291 std::string extra = "";
1292 deviceBasicInfoListAsyncCallbackInfo->extra = extra;
1293 napi_deferred deferred;
1294 napi_value promise = 0;
1295 napi_create_promise(env, &deferred, &promise);
1296 deviceBasicInfoListAsyncCallbackInfo->deferred = deferred;
1297 CallAsyncWork(env, deviceBasicInfoListAsyncCallbackInfo);
1298 return promise;
1299 }
1300
GetAvailableDeviceList(napi_env env,napi_callback_info info)1301 napi_value DeviceManagerNapi::GetAvailableDeviceList(napi_env env, napi_callback_info info)
1302 {
1303 int32_t ret = DeviceManager::GetInstance().CheckNewAPIAccessPermission();
1304 if (ret != 0) {
1305 CreateBusinessError(env, ret);
1306 return nullptr;
1307 }
1308 napi_value result = nullptr;
1309 napi_value thisVar = nullptr;
1310 size_t argc = 0;
1311 std::vector<DmDeviceBasicInfo> devList;
1312 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1313
1314 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1315 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1316 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1317 return result;
1318 }
1319
1320 auto *deviceBasicInfoListAsyncCallbackInfo = new DeviceBasicInfoListAsyncCallbackInfo();
1321 if (deviceBasicInfoListAsyncCallbackInfo == nullptr) {
1322 return nullptr;
1323 }
1324 deviceBasicInfoListAsyncCallbackInfo->env = env;
1325 deviceBasicInfoListAsyncCallbackInfo->devList = devList;
1326 deviceBasicInfoListAsyncCallbackInfo->bundleName = deviceManagerWrapper->bundleName_;
1327 if (argc == DM_NAPI_ARGS_ZERO) {
1328 return GetAvailableDeviceListPromise(env, deviceBasicInfoListAsyncCallbackInfo);
1329 } else if (argc == DM_NAPI_ARGS_ONE) {
1330 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1331 if (!IsFunctionType(env, argv[0])) {
1332 DeleteAsyncCallbackInfo(deviceBasicInfoListAsyncCallbackInfo);
1333 return nullptr;
1334 }
1335 return CallDeviceList(env, info, deviceBasicInfoListAsyncCallbackInfo);
1336 }
1337 napi_get_undefined(env, &result);
1338 return result;
1339 }
1340
GetLocalDeviceNetworkId(napi_env env,napi_callback_info info)1341 napi_value DeviceManagerNapi::GetLocalDeviceNetworkId(napi_env env, napi_callback_info info)
1342 {
1343 LOGI("GetLocalDeviceNetworkId in");
1344 if (DeviceManager::GetInstance().CheckNewAPIAccessPermission() != 0) {
1345 CreateBusinessError(env, ERR_DM_NO_PERMISSION);
1346 return nullptr;
1347 }
1348 napi_value result = nullptr;
1349 napi_value thisVar = nullptr;
1350 std::string networkId;
1351 size_t argc = 0;
1352
1353 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1354 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1355 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1356 napi_create_int32(env, ERR_DM_POINT_NULL, &result);
1357 return result;
1358 }
1359
1360 int32_t ret = DeviceManager::GetInstance().GetLocalDeviceNetWorkId(deviceManagerWrapper->bundleName_, networkId);
1361 if (ret != 0) {
1362 LOGE("GetLocalDeviceNetworkId for failed, ret %{public}d", ret);
1363 CreateBusinessError(env, ret);
1364 return result;
1365 }
1366 LOGI("DeviceManager::GetLocalDeviceNetworkId networkId:%{public}s", GetAnonyString(std::string(networkId)).c_str());
1367 napi_create_string_utf8(env, networkId.c_str(), networkId.size(), &result);
1368 return result;
1369 }
1370
GetLocalDeviceId(napi_env env,napi_callback_info info)1371 napi_value DeviceManagerNapi::GetLocalDeviceId(napi_env env, napi_callback_info info)
1372 {
1373 LOGI("GetLocalDeviceId in");
1374 if (DeviceManager::GetInstance().CheckNewAPIAccessPermission() != 0) {
1375 CreateBusinessError(env, ERR_DM_NO_PERMISSION);
1376 return nullptr;
1377 }
1378 napi_value result = nullptr;
1379 napi_value thisVar = nullptr;
1380 std::string deviceId;
1381 size_t argc = 0;
1382
1383 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1384 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1385 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1386 napi_create_int32(env, ERR_DM_POINT_NULL, &result);
1387 return result;
1388 }
1389
1390 int32_t ret = DeviceManager::GetInstance().GetLocalDeviceId(deviceManagerWrapper->bundleName_, deviceId);
1391 if (ret != 0) {
1392 LOGE("GetLocalDeviceId for failed, ret %{public}d", ret);
1393 CreateBusinessError(env, ret);
1394 return result;
1395 }
1396 LOGI("DeviceManager::GetLocalDeviceId deviceId:%{public}s", GetAnonyString(std::string(deviceId)).c_str());
1397 napi_create_string_utf8(env, deviceId.c_str(), deviceId.size(), &result);
1398 return result;
1399 }
1400
GetLocalDeviceName(napi_env env,napi_callback_info info)1401 napi_value DeviceManagerNapi::GetLocalDeviceName(napi_env env, napi_callback_info info)
1402 {
1403 LOGI("GetLocalDeviceName in");
1404 if (DeviceManager::GetInstance().CheckNewAPIAccessPermission() != 0) {
1405 CreateBusinessError(env, ERR_DM_NO_PERMISSION);
1406 return nullptr;
1407 }
1408 napi_value result = nullptr;
1409 napi_value thisVar = nullptr;
1410 std::string deviceName;
1411 size_t argc = 0;
1412
1413 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1414 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1415 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1416 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1417 return result;
1418 }
1419
1420 int32_t ret = DeviceManager::GetInstance().GetLocalDeviceName(deviceManagerWrapper->bundleName_, deviceName);
1421 if (ret != 0) {
1422 LOGE("GetLocalDeviceName for failed, ret %{public}d", ret);
1423 CreateBusinessError(env, ret);
1424 return result;
1425 }
1426 LOGI("DeviceManager::GetLocalDeviceName deviceName:%{public}s", GetAnonyString(std::string(deviceName)).c_str());
1427 napi_create_string_utf8(env, deviceName.c_str(), deviceName.size(), &result);
1428 return result;
1429 }
1430
GetLocalDeviceType(napi_env env,napi_callback_info info)1431 napi_value DeviceManagerNapi::GetLocalDeviceType(napi_env env, napi_callback_info info)
1432 {
1433 LOGI("GetLocalDeviceType in");
1434 if (DeviceManager::GetInstance().CheckNewAPIAccessPermission() != 0) {
1435 CreateBusinessError(env, ERR_DM_NO_PERMISSION);
1436 return nullptr;
1437 }
1438 napi_value result = nullptr;
1439 napi_value thisVar = nullptr;
1440 int32_t deviceType = 0;
1441 size_t argc = 0;
1442
1443 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1444 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1445 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1446 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1447 return result;
1448 }
1449
1450 int32_t ret = DeviceManager::GetInstance().GetLocalDeviceType(deviceManagerWrapper->bundleName_, deviceType);
1451 if (ret != 0) {
1452 LOGE("GetLocalDeviceType for failed, ret %{public}d", ret);
1453 CreateBusinessError(env, ret);
1454 return result;
1455 }
1456 LOGI("DeviceManager::GetLocalDeviceType deviceType:%{public}d", deviceType);
1457 napi_create_int32(env, deviceType, &result);
1458 return result;
1459 }
1460
GetDeviceName(napi_env env,napi_callback_info info)1461 napi_value DeviceManagerNapi::GetDeviceName(napi_env env, napi_callback_info info)
1462 {
1463 LOGI("GetDeviceName in");
1464 napi_value result = nullptr;
1465 std::string deviceName;
1466 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1467 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
1468 return nullptr;
1469 }
1470 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1471 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1472 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1473 return result;
1474 }
1475 std::string networkId;
1476 if (!JsToStringAndCheck(env, argv[0], "networkId", networkId)) {
1477 return nullptr;
1478 }
1479
1480 int32_t ret = DeviceManager::GetInstance().GetDeviceName(deviceManagerWrapper->bundleName_, networkId, deviceName);
1481 if (ret != 0) {
1482 LOGE("GetDeviceName for failed, ret %{public}d", ret);
1483 CreateBusinessError(env, ret);
1484 return result;
1485 }
1486 LOGI("DeviceManager::GetDeviceName deviceName:%{public}s", GetAnonyString(std::string(deviceName)).c_str());
1487 napi_create_string_utf8(env, deviceName.c_str(), deviceName.size(), &result);
1488 return result;
1489 }
1490
GetDeviceType(napi_env env,napi_callback_info info)1491 napi_value DeviceManagerNapi::GetDeviceType(napi_env env, napi_callback_info info)
1492 {
1493 LOGI("GetDeviceType in");
1494 napi_value result = nullptr;
1495 int32_t deviceType;
1496 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1497 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
1498 return nullptr;
1499 }
1500 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1501 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1502 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1503 return result;
1504 }
1505 std::string networkId;
1506 if (!JsToStringAndCheck(env, argv[0], "networkId", networkId)) {
1507 return nullptr;
1508 }
1509
1510 int32_t ret = DeviceManager::GetInstance().GetDeviceType(deviceManagerWrapper->bundleName_, networkId, deviceType);
1511 if (ret != 0) {
1512 LOGE("GetDeviceType for failed, ret %{public}d", ret);
1513 CreateBusinessError(env, ret);
1514 return result;
1515 }
1516 LOGI("DeviceManager::GetDeviceType deviceType:%{public}d", deviceType);
1517 napi_create_int32(env, deviceType, &result);
1518 return result;
1519 }
1520
LockDiscoveryCallbackMutex(napi_env env,std::string & bundleName,std::map<std::string,std::string> discParam,std::string & extra,uint32_t subscribeId)1521 void DeviceManagerNapi::LockDiscoveryCallbackMutex(napi_env env, std::string &bundleName,
1522 std::map<std::string, std::string> discParam, std::string &extra, uint32_t subscribeId)
1523 {
1524 std::shared_ptr<DmNapiDiscoveryCallback> discoveryCallback = nullptr;
1525 {
1526 std::lock_guard<std::mutex> autoLock(g_discoveryCallbackMapMutex);
1527 auto iter = g_DiscoveryCallbackMap.find(bundleName);
1528 if (iter == g_DiscoveryCallbackMap.end()) {
1529 discoveryCallback = std::make_shared<DmNapiDiscoveryCallback>(env, bundleName);
1530 g_DiscoveryCallbackMap[bundleName] = discoveryCallback;
1531 } else {
1532 discoveryCallback = iter->second;
1533 }
1534 }
1535 uint64_t tokenId = OHOS::IPCSkeleton::GetSelfTokenID();
1536 discParam.insert(std::pair<std::string, std::string>(PARAM_KEY_SUBSCRIBE_ID, std::to_string(tokenId)));
1537 std::map<std::string, std::string> filterOps;
1538 filterOps.insert(std::pair<std::string, std::string>(PARAM_KEY_FILTER_OPTIONS, extra));
1539 int32_t ret = DeviceManager::GetInstance().StartDiscovering(bundleName, discParam, filterOps, discoveryCallback);
1540 if (ret != 0) {
1541 LOGE("Discovery failed, bundleName %{public}s, ret %{public}d", bundleName.c_str(), ret);
1542 CreateBusinessError(env, ret);
1543 discoveryCallback->OnDiscoveryFailed(static_cast<uint16_t>(subscribeId), ret);
1544 }
1545 return;
1546 }
1547
StartDeviceDiscover(napi_env env,napi_callback_info info)1548 napi_value DeviceManagerNapi::StartDeviceDiscover(napi_env env, napi_callback_info info)
1549 {
1550 LOGI("StartDeviceDiscover in");
1551 std::string extra = "";
1552 std::map<std::string, std::string> discParam;
1553 napi_value result = nullptr;
1554 napi_value thisVar = nullptr;
1555 size_t argcNum = 0;
1556 int32_t discoverTargetType = -1;
1557 uint32_t subscribeId = 0;
1558 NAPI_CALL(env, napi_get_cb_info(env, info, &argcNum, nullptr, &thisVar, nullptr));
1559 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1560 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1561 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1562 return result;
1563 }
1564 if (argcNum == DM_NAPI_ARGS_ONE) {
1565 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1566 if (!JsToDiscoverTargetType(env, argv[DM_NAPI_ARGS_ZERO], discoverTargetType) || discoverTargetType != 1) {
1567 return nullptr;
1568 }
1569 JsToDiscoveryParam(env, argv[DM_NAPI_ARGS_ZERO], discParam);
1570 } else if (argcNum == DM_NAPI_ARGS_TWO) {
1571 GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
1572 if (!JsToDiscoverTargetType(env, argv[DM_NAPI_ARGS_ZERO], discoverTargetType) || discoverTargetType != 1) {
1573 return nullptr;
1574 }
1575 JsToDiscoveryParam(env, argv[DM_NAPI_ARGS_ZERO], discParam);
1576 napi_valuetype objectType = napi_undefined;
1577 napi_typeof(env, argv[DM_NAPI_ARGS_ONE], &objectType);
1578 if (!(CheckArgsType(env, objectType == napi_object, "filterOptions", "object or undefined"))) {
1579 return nullptr;
1580 }
1581 JsToDmDiscoveryExtra(env, argv[DM_NAPI_ARGS_ONE], extra);
1582 }
1583 LockDiscoveryCallbackMutex(env, deviceManagerWrapper->bundleName_, discParam, extra, subscribeId);
1584 napi_get_undefined(env, &result);
1585 return result;
1586 }
1587
StopDeviceDiscover(napi_env env,napi_callback_info info)1588 napi_value DeviceManagerNapi::StopDeviceDiscover(napi_env env, napi_callback_info info)
1589 {
1590 LOGI("StopDeviceDiscover in");
1591 napi_value result = nullptr;
1592 napi_value thisVar = nullptr;
1593 size_t argc = 0;
1594 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1595 if (argc != 0) {
1596 return nullptr;
1597 }
1598 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1599 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1600 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1601 return result;
1602 }
1603 uint64_t tokenId = OHOS::IPCSkeleton::GetSelfTokenID();
1604 int32_t ret = DeviceManager::GetInstance().StopDeviceDiscovery(tokenId, deviceManagerWrapper->bundleName_);
1605 if (ret != 0) {
1606 LOGE("StopDeviceDiscovery for bundleName %{public}s failed, ret %{public}d",
1607 deviceManagerWrapper->bundleName_.c_str(), ret);
1608 CreateBusinessError(env, ret);
1609 return result;
1610 }
1611 napi_get_undefined(env, &result);
1612 return result;
1613 }
1614
PublishDeviceDiscoverySync(napi_env env,napi_callback_info info)1615 napi_value DeviceManagerNapi::PublishDeviceDiscoverySync(napi_env env, napi_callback_info info)
1616 {
1617 LOGI("PublishDeviceDiscoverySync in");
1618 if (!IsSystemApp()) {
1619 LOGI("PublishDeviceDiscoverySync not SystemApp");
1620 CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
1621 return nullptr;
1622 }
1623 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1624 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
1625 return nullptr;
1626 }
1627
1628 napi_value result = nullptr;
1629 napi_valuetype valueType = napi_undefined;
1630 napi_typeof(env, argv[0], &valueType);
1631 if (!CheckArgsType(env, valueType == napi_object, "publishInfo", "object")) {
1632 return nullptr;
1633 }
1634 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1635 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1636 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1637 return result;
1638 }
1639
1640 std::shared_ptr<DmNapiPublishCallback> publishCallback = nullptr;
1641 {
1642 std::lock_guard<std::mutex> autoLock(g_publishCallbackMapMutex);
1643 auto iter = g_publishCallbackMap.find(deviceManagerWrapper->bundleName_);
1644 if (iter == g_publishCallbackMap.end()) {
1645 publishCallback = std::make_shared<DmNapiPublishCallback>(env, deviceManagerWrapper->bundleName_);
1646 g_publishCallbackMap[deviceManagerWrapper->bundleName_] = publishCallback;
1647 } else {
1648 publishCallback = iter->second;
1649 }
1650 }
1651 DmPublishInfo publishInfo;
1652 JsToDmPublishInfo(env, argv[0], publishInfo);
1653 int32_t ret = DeviceManager::GetInstance().PublishDeviceDiscovery(deviceManagerWrapper->bundleName_, publishInfo,
1654 publishCallback);
1655 if (ret != 0) {
1656 LOGE("PublishDeviceDiscovery for bundleName %{public}s failed, ret %{public}d",
1657 deviceManagerWrapper->bundleName_.c_str(), ret);
1658 CreateBusinessError(env, ret);
1659 publishCallback->OnPublishResult(publishInfo.publishId, ret);
1660 return result;
1661 }
1662
1663 napi_get_undefined(env, &result);
1664 return result;
1665 }
1666
UnPublishDeviceDiscoverySync(napi_env env,napi_callback_info info)1667 napi_value DeviceManagerNapi::UnPublishDeviceDiscoverySync(napi_env env, napi_callback_info info)
1668 {
1669 LOGI("UnPublishDeviceDiscoverySync in");
1670 if (!IsSystemApp()) {
1671 LOGI("UnPublishDeviceDiscoverySync not SystemApp");
1672 CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
1673 return nullptr;
1674 }
1675 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1676 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
1677 return nullptr;
1678 }
1679 napi_value result = nullptr;
1680 napi_valuetype valueType = napi_undefined;
1681 napi_typeof(env, argv[0], &valueType);
1682 if (!CheckArgsType(env, valueType == napi_number, "publishId", "number")) {
1683 return nullptr;
1684 }
1685 int32_t publishId = 0;
1686 napi_get_value_int32(env, argv[0], &publishId);
1687
1688 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1689 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1690 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1691 return result;
1692 }
1693
1694 int32_t ret = DeviceManager::GetInstance().UnPublishDeviceDiscovery(deviceManagerWrapper->bundleName_, publishId);
1695 if (ret != 0) {
1696 LOGE("UnPublishDeviceDiscovery bundleName %{public}s failed, ret %{public}d",
1697 deviceManagerWrapper->bundleName_.c_str(), ret);
1698 CreateBusinessError(env, ret);
1699 return result;
1700 }
1701
1702 napi_get_undefined(env, &result);
1703 return result;
1704 }
1705
BindDevOrTarget(DeviceManagerNapi * deviceManagerWrapper,const std::string & deviceId,napi_env env,napi_value & object)1706 void DeviceManagerNapi::BindDevOrTarget(DeviceManagerNapi *deviceManagerWrapper, const std::string &deviceId,
1707 napi_env env, napi_value &object)
1708 {
1709 LOGI("Bind devices or target start");
1710 std::string bindParam;
1711 bool isMetaType = false;
1712 JsToBindParam(env, object, bindParam, authAsyncCallbackInfo_.authType, isMetaType);
1713
1714 if (isMetaType) {
1715 std::shared_ptr<DmNapiBindTargetCallback> bindTargetCallback = nullptr;
1716 {
1717 std::lock_guard<std::mutex> autoLock(g_bindCallbackMapMutex);
1718 auto iter = g_bindCallbackMap.find(deviceManagerWrapper->bundleName_);
1719 if (iter == g_bindCallbackMap.end()) {
1720 bindTargetCallback = std::make_shared<DmNapiBindTargetCallback>(env, deviceManagerWrapper->bundleName_);
1721 g_bindCallbackMap[deviceManagerWrapper->bundleName_] = bindTargetCallback;
1722 } else {
1723 bindTargetCallback = iter->second;
1724 }
1725 }
1726 int32_t ret = BindTargetWarpper(deviceManagerWrapper->bundleName_, deviceId, bindParam, bindTargetCallback);
1727 if (ret != 0) {
1728 LOGE("BindTarget for bundleName %{public}s failed, ret %{public}d",
1729 deviceManagerWrapper->bundleName_.c_str(), ret);
1730 CreateBusinessError(env, ret);
1731 }
1732 return;
1733 }
1734
1735 std::shared_ptr<DmNapiAuthenticateCallback> bindDeviceCallback = nullptr;
1736 {
1737 std::lock_guard<std::mutex> autoLock(g_authCallbackMapMutex);
1738 auto iter = g_authCallbackMap.find(deviceManagerWrapper->bundleName_);
1739 if (iter == g_authCallbackMap.end()) {
1740 bindDeviceCallback = std::make_shared<DmNapiAuthenticateCallback>(env, deviceManagerWrapper->bundleName_);
1741 g_authCallbackMap[deviceManagerWrapper->bundleName_] = bindDeviceCallback;
1742 } else {
1743 bindDeviceCallback = iter->second;
1744 }
1745 }
1746 int32_t ret = DeviceManager::GetInstance().BindDevice(deviceManagerWrapper->bundleName_,
1747 authAsyncCallbackInfo_.authType, deviceId, bindParam, bindDeviceCallback);
1748 if (ret != 0) {
1749 LOGE("BindDevice for bundleName %{public}s failed, ret %{public}d",
1750 deviceManagerWrapper->bundleName_.c_str(), ret);
1751 CreateBusinessError(env, ret);
1752 }
1753 return;
1754 }
1755
BindTarget(napi_env env,napi_callback_info info)1756 napi_value DeviceManagerNapi::BindTarget(napi_env env, napi_callback_info info)
1757 {
1758 GET_PARAMS(env, info, DM_NAPI_ARGS_THREE);
1759 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_THREE, "Wrong number of arguments, required 3")) {
1760 return nullptr;
1761 }
1762 napi_valuetype bindPramType = napi_undefined;
1763 napi_typeof(env, argv[DM_NAPI_ARGS_ONE], &bindPramType);
1764 if (!CheckArgsType(env, bindPramType == napi_object, "bindParam", "object")) {
1765 return nullptr;
1766 }
1767 if (!IsFunctionType(env, argv[DM_NAPI_ARGS_TWO])) {
1768 return nullptr;
1769 }
1770 napi_value result = nullptr;
1771 authAsyncCallbackInfo_.env = env;
1772 napi_create_reference(env, argv[DM_NAPI_ARGS_TWO], 1, &authAsyncCallbackInfo_.callback);
1773 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1774 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1775 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1776 return result;
1777 }
1778 std::string deviceId;
1779 if (!JsToStringAndCheck(env, argv[DM_NAPI_ARGS_ZERO], "deviceId", deviceId)) {
1780 return nullptr;
1781 }
1782
1783 napi_value object = argv[DM_NAPI_ARGS_ONE];
1784 BindDevOrTarget(deviceManagerWrapper, deviceId, env, object);
1785 napi_get_undefined(env, &result);
1786 return result;
1787 }
1788
UnBindTarget(napi_env env,napi_callback_info info)1789 napi_value DeviceManagerNapi::UnBindTarget(napi_env env, napi_callback_info info)
1790 {
1791 LOGI("UnBindDevice");
1792 napi_value result = nullptr;
1793 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
1794 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
1795 return nullptr;
1796 }
1797 std::string deviceId;
1798 if (!JsToStringAndCheck(env, argv[0], "deviceId", deviceId)) {
1799 return nullptr;
1800 }
1801
1802 LOGI("UnBindDevice deviceId = %{public}s", GetAnonyString(deviceId).c_str());
1803 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1804 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1805 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1806 return result;
1807 }
1808
1809 int32_t ret = DeviceManager::GetInstance().UnBindDevice(deviceManagerWrapper->bundleName_, deviceId);
1810 if (ret != 0) {
1811 LOGE("UnBindDevice for bundleName %{public}s failed, ret %{public}d",
1812 deviceManagerWrapper->bundleName_.c_str(), ret);
1813 CreateBusinessError(env, ret);
1814 }
1815
1816 napi_get_undefined(env, &result);
1817 return result;
1818 }
1819
JsOnFrench(napi_env env,int32_t num,napi_value thisVar,napi_value argv[])1820 napi_value DeviceManagerNapi::JsOnFrench(napi_env env, int32_t num, napi_value thisVar, napi_value argv[])
1821 {
1822 std::string eventType;
1823 if (!JsToStringAndCheck(env, argv[0], "type", eventType)) {
1824 return nullptr;
1825 }
1826
1827 napi_value result = nullptr;
1828 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1829 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1830 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1831 return result;
1832 }
1833
1834 LOGI("JsOn for bundleName %{public}s, eventType %{public}s ", deviceManagerWrapper->bundleName_.c_str(),
1835 eventType.c_str());
1836 deviceManagerWrapper->On(eventType, argv[num + 1]);
1837
1838 if (eventType == DM_NAPI_EVENT_DEVICE_STATE_CHANGE) {
1839 if (num == 1) {
1840 std::string extraString;
1841 if (!JsToStringAndCheck(env, argv[1], "extra", extraString)) {
1842 return nullptr;
1843 }
1844 LOGI("extra = %{public}s", extraString.c_str());
1845 CreateDmCallback(env, deviceManagerWrapper->bundleName_, eventType, extraString);
1846 } else {
1847 CreateDmCallback(env, deviceManagerWrapper->bundleName_, eventType);
1848 }
1849 } else {
1850 CreateDmCallback(env, deviceManagerWrapper->bundleName_, eventType);
1851 }
1852
1853 napi_get_undefined(env, &result);
1854 return result;
1855 }
1856
JsOn(napi_env env,napi_callback_info info)1857 napi_value DeviceManagerNapi::JsOn(napi_env env, napi_callback_info info)
1858 {
1859 int32_t ret = DeviceManager::GetInstance().CheckNewAPIAccessPermission();
1860 if (ret != 0) {
1861 CreateBusinessError(env, ret);
1862 return nullptr;
1863 }
1864 size_t argc = 0;
1865 napi_value thisVar = nullptr;
1866 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1867 if (argc == DM_NAPI_ARGS_THREE) {
1868 LOGI("JsOn in argc == 3");
1869 GET_PARAMS(env, info, DM_NAPI_ARGS_THREE);
1870 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_THREE, "Wrong number of arguments, required 3")) {
1871 return nullptr;
1872 }
1873 napi_valuetype eventValueType = napi_undefined;
1874 napi_typeof(env, argv[0], &eventValueType);
1875 if (!CheckArgsType(env, eventValueType == napi_string, "type", "string")) {
1876 return nullptr;
1877 }
1878 napi_valuetype valueType;
1879 napi_typeof(env, argv[1], &valueType);
1880 if (!CheckArgsType(env, (valueType == napi_string || valueType == napi_object),
1881 "extra", "string | object")) {
1882 return nullptr;
1883 }
1884 if (!IsFunctionType(env, argv[DM_NAPI_ARGS_TWO])) {
1885 return nullptr;
1886 }
1887 return JsOnFrench(env, 1, thisVar, argv);
1888 } else {
1889 GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
1890 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_TWO, "Wrong number of arguments, required 2")) {
1891 return nullptr;
1892 }
1893 napi_valuetype eventValueType = napi_undefined;
1894 napi_typeof(env, argv[0], &eventValueType);
1895 if (!CheckArgsType(env, eventValueType == napi_string, "type", "string")) {
1896 return nullptr;
1897 }
1898 if (!IsFunctionType(env, argv[1])) {
1899 return nullptr;
1900 }
1901 return JsOnFrench(env, 0, thisVar, argv);
1902 }
1903 }
1904
JsOffFrench(napi_env env,int32_t num,napi_value thisVar,napi_value argv[])1905 napi_value DeviceManagerNapi::JsOffFrench(napi_env env, int32_t num, napi_value thisVar, napi_value argv[])
1906 {
1907 int32_t ret = DeviceManager::GetInstance().CheckNewAPIAccessPermission();
1908 if (ret != 0) {
1909 CreateBusinessError(env, ret);
1910 return nullptr;
1911 }
1912 std::string eventType;
1913 if (!JsToStringAndCheck(env, argv[0], "type", eventType)) {
1914 return nullptr;
1915 }
1916 napi_value result = nullptr;
1917 DeviceManagerNapi *deviceManagerWrapper = nullptr;
1918 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
1919 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
1920 return result;
1921 }
1922
1923 LOGI("JsOff for bundleName %{public}s, eventType %{public}s ", deviceManagerWrapper->bundleName_.c_str(),
1924 eventType.c_str());
1925 deviceManagerWrapper->Off(eventType);
1926 ReleaseDmCallback(deviceManagerWrapper->bundleName_, eventType);
1927
1928 napi_get_undefined(env, &result);
1929 return result;
1930 }
1931
JsOff(napi_env env,napi_callback_info info)1932 napi_value DeviceManagerNapi::JsOff(napi_env env, napi_callback_info info)
1933 {
1934 size_t argc = 0;
1935 napi_value thisVar = nullptr;
1936 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
1937 if (argc == DM_NAPI_ARGS_THREE) {
1938 LOGI("JsOff in argc == 3");
1939 GET_PARAMS(env, info, DM_NAPI_ARGS_THREE);
1940 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
1941 return nullptr;
1942 }
1943 napi_valuetype eventValueType = napi_undefined;
1944 napi_typeof(env, argv[0], &eventValueType);
1945 if (!CheckArgsType(env, eventValueType == napi_string, "type", "string")) {
1946 return nullptr;
1947 }
1948 napi_valuetype valueType;
1949 napi_typeof(env, argv[1], &valueType);
1950 if (!CheckArgsType(env, (valueType == napi_string || valueType == napi_object), "extra", "string or object")) {
1951 return nullptr;
1952 }
1953 if (argc > DM_NAPI_ARGS_ONE) {
1954 if (!IsFunctionType(env, argv[DM_NAPI_ARGS_TWO])) {
1955 return nullptr;
1956 }
1957 }
1958 return JsOffFrench(env, 1, thisVar, argv);
1959 } else {
1960 GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
1961 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
1962 return nullptr;
1963 }
1964 napi_valuetype eventValueType = napi_undefined;
1965 napi_typeof(env, argv[0], &eventValueType);
1966 if (!CheckArgsType(env, eventValueType == napi_string, "type", "string")) {
1967 return nullptr;
1968 }
1969 if (argc > DM_NAPI_ARGS_ONE) {
1970 if (!IsFunctionType(env, argv[1])) {
1971 return nullptr;
1972 }
1973 }
1974 return JsOffFrench(env, 0, thisVar, argv);
1975 }
1976 }
1977
GetDeviceProfileInfoListPromise(napi_env env,DeviceProfileInfosAsyncCallbackInfo * asyncCallback)1978 napi_value DeviceManagerNapi::GetDeviceProfileInfoListPromise(napi_env env,
1979 DeviceProfileInfosAsyncCallbackInfo *asyncCallback)
1980 {
1981 LOGI("In");
1982 napi_value promise = 0;
1983 napi_deferred deferred;
1984 napi_create_promise(env, &deferred, &promise);
1985 asyncCallback->deferred = deferred;
1986 napi_value workName;
1987 napi_create_string_latin1(env, "GetDeviceProfileInfoListPromise", NAPI_AUTO_LENGTH, &workName);
1988 napi_create_async_work(env, nullptr, workName,
1989 [](napi_env env, void *data) {
1990 DeviceProfileInfosAsyncCallbackInfo *jsCallback =
1991 reinterpret_cast<DeviceProfileInfosAsyncCallbackInfo *>(data);
1992 std::shared_ptr<DmNapiGetDeviceProfileInfoListCallback> callback =
1993 std::make_shared<DmNapiGetDeviceProfileInfoListCallback>(jsCallback->env, jsCallback->bundleName,
1994 jsCallback->deferred);
1995 int32_t ret = DeviceManager::GetInstance().GetDeviceProfileInfoList(jsCallback->bundleName,
1996 jsCallback->filterOptions, callback);
1997 jsCallback->code = ret;
1998 if (ret != DM_OK) {
1999 LOGE("GetDeviceProfileInfoList failed, bundleName:%{public}s, ret=%{public}d",
2000 jsCallback->bundleName.c_str(), ret);
2001 }
2002 },
2003 [](napi_env env, napi_status status, void *data) {
2004 (void)status;
2005 DeviceProfileInfosAsyncCallbackInfo *jsCallback =
2006 reinterpret_cast<DeviceProfileInfosAsyncCallbackInfo *>(data);
2007 if (jsCallback->code != DM_OK) {
2008 napi_value error = CreateBusinessError(env, jsCallback->code, false);
2009 napi_reject_deferred(env, jsCallback->deferred, error);
2010 }
2011 napi_delete_async_work(env, jsCallback->asyncWork);
2012 delete jsCallback;
2013 jsCallback = nullptr;
2014 },
2015 (void *)asyncCallback, &asyncCallback->asyncWork);
2016 napi_queue_async_work_with_qos(env, asyncCallback->asyncWork, napi_qos_user_initiated);
2017 return promise;
2018 }
2019
GetDeviceNetworkIdListPromise(napi_env env,GetDeviceNetworkIdListAsyncCallbackInfo * asyncCallback)2020 napi_value DeviceManagerNapi::GetDeviceNetworkIdListPromise(napi_env env,
2021 GetDeviceNetworkIdListAsyncCallbackInfo *asyncCallback)
2022 {
2023 napi_value promise = 0;
2024 napi_deferred deferred;
2025 napi_create_promise(env, &deferred, &promise);
2026 asyncCallback->deferred = deferred;
2027 napi_value workName;
2028 napi_create_string_latin1(env, "GetDeviceNetworkIdListPromise", NAPI_AUTO_LENGTH, &workName);
2029 napi_create_async_work(env, nullptr, workName,
2030 [](napi_env env, void *data) {
2031 GetDeviceNetworkIdListAsyncCallbackInfo *jsCallback =
2032 reinterpret_cast<GetDeviceNetworkIdListAsyncCallbackInfo *>(data);
2033 jsCallback->code = DeviceManager::GetInstance().GetDeviceNetworkIdList(jsCallback->bundleName,
2034 jsCallback->filterOptions, jsCallback->deviceNetworkIds);
2035 },
2036 [](napi_env env, napi_status status, void *data) {
2037 (void)status;
2038 GetDeviceNetworkIdListAsyncCallbackInfo *jsCallback =
2039 reinterpret_cast<GetDeviceNetworkIdListAsyncCallbackInfo *>(data);
2040 if (jsCallback->code != DM_OK) {
2041 napi_value error = CreateBusinessError(env, jsCallback->code, false);
2042 napi_reject_deferred(env, jsCallback->deferred, error);
2043 } else {
2044 napi_value result = nullptr;
2045 napi_create_array(env, &result);
2046 for (uint32_t i = 0; i < jsCallback->deviceNetworkIds.size(); i++) {
2047 napi_value element = nullptr;
2048 napi_create_string_utf8(env, jsCallback->deviceNetworkIds[i].c_str(), NAPI_AUTO_LENGTH, &element);
2049 napi_set_element(env, result, i, element);
2050 }
2051 napi_resolve_deferred(env, jsCallback->deferred, result);
2052 }
2053 napi_delete_async_work(env, jsCallback->asyncWork);
2054 delete jsCallback;
2055 jsCallback = nullptr;
2056 },
2057 (void *)asyncCallback, &asyncCallback->asyncWork);
2058 napi_queue_async_work_with_qos(env, asyncCallback->asyncWork, napi_qos_user_initiated);
2059 return promise;
2060 }
2061
JsGetDeviceNetworkIdList(napi_env env,napi_callback_info info)2062 napi_value DeviceManagerNapi::JsGetDeviceNetworkIdList(napi_env env, napi_callback_info info)
2063 {
2064 LOGI("In");
2065 if (!IsSystemApp()) {
2066 LOGE("Caller is not systemApp");
2067 CreateBusinessError(env, static_cast<int32_t>(DMBussinessErrorCode::ERR_NOT_SYSTEM_APP));
2068 return nullptr;
2069 }
2070 int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2071 if (ret != DM_OK) {
2072 LOGE("Do not have correct access");
2073 CreateBusinessError(env, ret);
2074 return nullptr;
2075 }
2076 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2077 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2078
2079 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2080 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2081 LOGE("deviceManagerWrapper is NULL");
2082 CreateBusinessError(env, ERR_DM_POINT_NULL);
2083 return nullptr;
2084 }
2085 auto *jsCallback = new GetDeviceNetworkIdListAsyncCallbackInfo();
2086 if (jsCallback == nullptr) {
2087 LOGE("jsCallback is nullptr");
2088 CreateBusinessError(env, ERR_DM_POINT_NULL);
2089 return nullptr;
2090 }
2091 NetworkIdQueryFilter filterOptions;
2092 JsToDmDeviceNetworkIdFilterOptions(env, argv[0], filterOptions);
2093 jsCallback->env = env;
2094 jsCallback->bundleName = deviceManagerWrapper->bundleName_;
2095 jsCallback->filterOptions = filterOptions;
2096 return GetDeviceNetworkIdListPromise(env, jsCallback);
2097 }
2098
JsGetDeviceProfileInfoList(napi_env env,napi_callback_info info)2099 napi_value DeviceManagerNapi::JsGetDeviceProfileInfoList(napi_env env, napi_callback_info info)
2100 {
2101 LOGI("In");
2102 if (!IsSystemApp()) {
2103 LOGE("Caller is not systemApp");
2104 CreateBusinessError(env, static_cast<int32_t>(DMBussinessErrorCode::ERR_NOT_SYSTEM_APP));
2105 return nullptr;
2106 }
2107 int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2108 if (ret != DM_OK) {
2109 CreateBusinessError(env, ret);
2110 return nullptr;
2111 }
2112
2113 size_t argc = 0;
2114 napi_value thisVar = nullptr;
2115 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2116 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2117 return nullptr;
2118 }
2119 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2120 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2121 LOGE("deviceManagerWrapper is NULL");
2122 CreateBusinessError(env, ERR_DM_POINT_NULL);
2123 return nullptr;
2124 }
2125 napi_value argv[DM_NAPI_ARGS_ONE] = {nullptr};
2126 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
2127 DmDeviceProfileInfoFilterOptions filterOptions;
2128 JsToDmDeviceProfileInfoFilterOptions(env, argv[0], filterOptions);
2129 auto *jsCallback = new DeviceProfileInfosAsyncCallbackInfo();
2130 if (jsCallback == nullptr) {
2131 LOGE("jsCallback is nullptr");
2132 CreateBusinessError(env, ERR_DM_POINT_NULL);
2133 return nullptr;
2134 }
2135
2136 jsCallback->env = env;
2137 jsCallback->bundleName = deviceManagerWrapper->bundleName_;
2138 jsCallback->filterOptions = filterOptions;
2139 return GetDeviceProfileInfoListPromise(env, jsCallback);
2140 }
2141
GetDeviceIconInfoPromise(napi_env env,DeviceIconInfoAsyncCallbackInfo * asyncCallback)2142 napi_value DeviceManagerNapi::GetDeviceIconInfoPromise(napi_env env, DeviceIconInfoAsyncCallbackInfo *asyncCallback)
2143 {
2144 LOGI("In");
2145 napi_value promise = 0;
2146 napi_deferred deferred;
2147 napi_create_promise(env, &deferred, &promise);
2148 asyncCallback->deferred = deferred;
2149 napi_value workName;
2150 napi_create_string_latin1(env, "GetDeviceIconInfoPromise", NAPI_AUTO_LENGTH, &workName);
2151 napi_create_async_work(env, nullptr, workName,
2152 [](napi_env env, void *data) {
2153 DeviceIconInfoAsyncCallbackInfo *jsCallback =
2154 reinterpret_cast<DeviceIconInfoAsyncCallbackInfo *>(data);
2155 std::shared_ptr<DmNapiGetDeviceIconInfoCallback> callback =
2156 std::make_shared<DmNapiGetDeviceIconInfoCallback>(jsCallback->env, jsCallback->bundleName,
2157 jsCallback->deferred);
2158 int32_t ret = DeviceManager::GetInstance().GetDeviceIconInfo(jsCallback->bundleName,
2159 jsCallback->filterOptions, callback);
2160 jsCallback->code = ret;
2161 if (ret != DM_OK) {
2162 LOGE("GetDeviceIconInfoPromise failed, bundleName:%{public}s, ret=%{public}d",
2163 jsCallback->bundleName.c_str(), ret);
2164 }
2165 },
2166 [](napi_env env, napi_status status, void *data) {
2167 (void)status;
2168 DeviceIconInfoAsyncCallbackInfo *jsCallback =
2169 reinterpret_cast<DeviceIconInfoAsyncCallbackInfo *>(data);
2170 if (jsCallback->code != DM_OK) {
2171 napi_value error = CreateBusinessError(env, jsCallback->code, false);
2172 napi_reject_deferred(env, jsCallback->deferred, error);
2173 }
2174 napi_delete_async_work(env, jsCallback->asyncWork);
2175 delete jsCallback;
2176 jsCallback = nullptr;
2177 },
2178 (void *)asyncCallback, &asyncCallback->asyncWork);
2179 napi_queue_async_work_with_qos(env, asyncCallback->asyncWork, napi_qos_user_initiated);
2180 return promise;
2181 }
2182
JsGetDeviceIconInfo(napi_env env,napi_callback_info info)2183 napi_value DeviceManagerNapi::JsGetDeviceIconInfo(napi_env env, napi_callback_info info)
2184 {
2185 LOGI("In");
2186 if (!IsSystemApp()) {
2187 LOGE("Caller is not systemApp");
2188 CreateBusinessError(env, static_cast<int32_t>(DMBussinessErrorCode::ERR_NOT_SYSTEM_APP));
2189 return nullptr;
2190 }
2191 int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2192 if (ret != DM_OK) {
2193 CreateBusinessError(env, ret);
2194 return nullptr;
2195 }
2196
2197 size_t argc = 0;
2198 napi_value thisVar = nullptr;
2199 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2200 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2201 return nullptr;
2202 }
2203 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2204 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2205 LOGE("deviceManagerWrapper is NULL");
2206 CreateBusinessError(env, ERR_DM_POINT_NULL);
2207 return nullptr;
2208 }
2209 napi_value argv[DM_NAPI_ARGS_ONE] = {nullptr};
2210 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
2211 DmDeviceIconInfoFilterOptions filterOptions;
2212 JsToDmDeviceIconInfoFilterOptions(env, argv[0], filterOptions);
2213 auto *jsCallback = new DeviceIconInfoAsyncCallbackInfo();
2214 if (jsCallback == nullptr) {
2215 LOGE("jsCallback is nullptr");
2216 CreateBusinessError(env, ERR_DM_POINT_NULL);
2217 return nullptr;
2218 }
2219
2220 jsCallback->env = env;
2221 jsCallback->bundleName = deviceManagerWrapper->bundleName_;
2222 jsCallback->filterOptions = filterOptions;
2223 return GetDeviceIconInfoPromise(env, jsCallback);
2224 }
2225
SetHeartbeatPolicy(napi_env env,napi_callback_info info)2226 napi_value DeviceManagerNapi::SetHeartbeatPolicy(napi_env env, napi_callback_info info)
2227 {
2228 LOGI("in");
2229 size_t argsCount = 0;
2230 napi_value thisArg = nullptr;
2231 NAPI_CALL(env, napi_get_cb_info(env, info, &argsCount, nullptr, &thisArg, nullptr));
2232 if (!CheckArgsCount(env, argsCount >= DM_NAPI_ARGS_TWO, "Wrong number of arguments, required 2")) {
2233 return nullptr;
2234 }
2235 if (!IsSystemApp()) {
2236 LOGI("The caller is not SystemApp");
2237 CreateBusinessError(env, ERR_NOT_SYSTEM_APP);
2238 return nullptr;
2239 }
2240 GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
2241 napi_valuetype valueType;
2242 napi_typeof(env, argv[0], &valueType);
2243 if (!CheckArgsType(env, valueType == napi_number, "policy", "number")) {
2244 return nullptr;
2245 }
2246 int32_t policy = 0;
2247 napi_get_value_int32(env, argv[0], &policy);
2248
2249 napi_typeof(env, argv[DM_NAPI_ARGS_ONE], &valueType);
2250 if (!CheckArgsType(env, valueType == napi_number, "delayTime", "number")) {
2251 return nullptr;
2252 }
2253 int32_t delayTime = 0;
2254 napi_get_value_int32(env, argv[DM_NAPI_ARGS_ONE], &delayTime);
2255
2256 napi_value result = nullptr;
2257 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2258 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2259 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2260 return result;
2261 }
2262 std::map<std::string, std::string> policyParam;
2263 policyParam[PARAM_KEY_POLICY_STRATEGY_FOR_BLE] = std::to_string(policy);
2264 policyParam[PARAM_KEY_POLICY_TIME_OUT] = std::to_string(delayTime);
2265 int32_t ret = DeviceManager::GetInstance().SetDnPolicy(deviceManagerWrapper->bundleName_, policyParam);
2266 if (ret != 0) {
2267 LOGE("bundleName %{public}s failed, ret %{public}d",
2268 deviceManagerWrapper->bundleName_.c_str(), ret);
2269 CreateBusinessError(env, ret);
2270 }
2271 napi_get_undefined(env, &result);
2272 return result;
2273 }
2274
PutDeviceProfileInfoListPromise(napi_env env,PutDeviceProfileInfoListAsyncCallbackInfo * asyncCallback)2275 napi_value DeviceManagerNapi::PutDeviceProfileInfoListPromise(napi_env env,
2276 PutDeviceProfileInfoListAsyncCallbackInfo *asyncCallback)
2277 {
2278 LOGI("In");
2279 napi_value promise = 0;
2280 napi_deferred deferred;
2281 napi_create_promise(env, &deferred, &promise);
2282 asyncCallback->deferred = deferred;
2283 napi_value workName;
2284 napi_create_string_latin1(env, "PutDeviceProfileInfoListPromise", NAPI_AUTO_LENGTH, &workName);
2285 napi_create_async_work(env, nullptr, workName,
2286 [](napi_env env, void *data) {
2287 PutDeviceProfileInfoListAsyncCallbackInfo *jsCallback =
2288 reinterpret_cast<PutDeviceProfileInfoListAsyncCallbackInfo *>(data);
2289 jsCallback->code = DeviceManager::GetInstance().PutDeviceProfileInfoList(jsCallback->bundleName,
2290 jsCallback->deviceProfileInfos);
2291 },
2292 [](napi_env env, napi_status status, void *data) {
2293 (void)status;
2294 PutDeviceProfileInfoListAsyncCallbackInfo *jsCallback =
2295 reinterpret_cast<PutDeviceProfileInfoListAsyncCallbackInfo *>(data);
2296 if (jsCallback->code != DM_OK) {
2297 napi_value error = CreateBusinessError(env, jsCallback->code, false);
2298 napi_reject_deferred(env, jsCallback->deferred, error);
2299 } else {
2300 napi_value result = nullptr;
2301 napi_create_int32(env, DM_OK, &result);
2302 napi_resolve_deferred(env, jsCallback->deferred, result);
2303 }
2304 napi_delete_async_work(env, jsCallback->asyncWork);
2305 delete jsCallback;
2306 jsCallback = nullptr;
2307 },
2308 (void *)asyncCallback, &asyncCallback->asyncWork);
2309 napi_queue_async_work_with_qos(env, asyncCallback->asyncWork, napi_qos_user_initiated);
2310 return promise;
2311 }
2312
JsPutDeviceProfileInfoList(napi_env env,napi_callback_info info)2313 napi_value DeviceManagerNapi::JsPutDeviceProfileInfoList(napi_env env, napi_callback_info info)
2314 {
2315 LOGI("In");
2316 if (!IsSystemApp()) {
2317 LOGE("Caller is not systemApp");
2318 CreateBusinessError(env, static_cast<int32_t>(DMBussinessErrorCode::ERR_NOT_SYSTEM_APP));
2319 return nullptr;
2320 }
2321 int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2322 if (ret != DM_OK) {
2323 CreateBusinessError(env, ret);
2324 return nullptr;
2325 }
2326
2327 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2328 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2329 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2330 return nullptr;
2331 }
2332 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2333 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2334 LOGE("deviceManagerWrapper is NULL");
2335 CreateBusinessError(env, ERR_DM_POINT_NULL);
2336 return nullptr;
2337 }
2338 std::vector<DmDeviceProfileInfo> deviceProfileInfos;
2339 if (!JsToDmDeviceProfileInfos(env, argv[0], deviceProfileInfos)) {
2340 LOGE("JsToDmDeviceProfileInfos fail");
2341 CreateBusinessError(env, ERR_INVALID_PARAMS);
2342 return nullptr;
2343 }
2344 auto *jsCallback = new PutDeviceProfileInfoListAsyncCallbackInfo();
2345 if (jsCallback == nullptr) {
2346 LOGE("jsCallback is nullptr");
2347 CreateBusinessError(env, ERR_DM_POINT_NULL);
2348 return nullptr;
2349 }
2350 jsCallback->env = env;
2351 jsCallback->bundleName = deviceManagerWrapper->bundleName_;
2352 jsCallback->deviceProfileInfos = deviceProfileInfos;
2353 return PutDeviceProfileInfoListPromise(env, jsCallback);
2354 }
2355
GetLocalDisplayDeviceNamePromise(napi_env env,GetLocalDisplayDeviceNameAsyncCallbackInfo * asyncCallback)2356 napi_value DeviceManagerNapi::GetLocalDisplayDeviceNamePromise(napi_env env,
2357 GetLocalDisplayDeviceNameAsyncCallbackInfo *asyncCallback)
2358 {
2359 LOGI("In");
2360 napi_value promise = 0;
2361 napi_deferred deferred;
2362 napi_create_promise(env, &deferred, &promise);
2363 asyncCallback->deferred = deferred;
2364 napi_value workName;
2365 napi_create_string_latin1(env, "GetLocalDisplayDeviceNamePromise", NAPI_AUTO_LENGTH, &workName);
2366 napi_create_async_work(env, nullptr, workName,
2367 [](napi_env env, void *data) {
2368 GetLocalDisplayDeviceNameAsyncCallbackInfo *jsCallback =
2369 reinterpret_cast<GetLocalDisplayDeviceNameAsyncCallbackInfo *>(data);
2370 jsCallback->code = DeviceManager::GetInstance().GetLocalDisplayDeviceName(jsCallback->bundleName,
2371 jsCallback->maxNameLength, jsCallback->displayName);
2372 },
2373 [](napi_env env, napi_status status, void *data) {
2374 (void)status;
2375 GetLocalDisplayDeviceNameAsyncCallbackInfo *jsCallback =
2376 reinterpret_cast<GetLocalDisplayDeviceNameAsyncCallbackInfo *>(data);
2377 if (jsCallback->code != DM_OK) {
2378 napi_value error = CreateBusinessError(env, jsCallback->code, false);
2379 napi_reject_deferred(env, jsCallback->deferred, error);
2380 } else {
2381 napi_value result = nullptr;
2382 napi_create_string_utf8(env, jsCallback->displayName.c_str(), NAPI_AUTO_LENGTH, &result);
2383 napi_resolve_deferred(env, jsCallback->deferred, result);
2384 }
2385 napi_delete_async_work(env, jsCallback->asyncWork);
2386 delete jsCallback;
2387 jsCallback = nullptr;
2388 },
2389 (void *)asyncCallback, &asyncCallback->asyncWork);
2390 napi_queue_async_work_with_qos(env, asyncCallback->asyncWork, napi_qos_user_initiated);
2391 return promise;
2392 }
2393
JsGetLocalDisplayDeviceName(napi_env env,napi_callback_info info)2394 napi_value DeviceManagerNapi::JsGetLocalDisplayDeviceName(napi_env env, napi_callback_info info)
2395 {
2396 LOGI("In");
2397 if (!IsSystemApp()) {
2398 LOGE("Caller is not systemApp");
2399 CreateBusinessError(env, static_cast<int32_t>(DMBussinessErrorCode::ERR_NOT_SYSTEM_APP));
2400 return nullptr;
2401 }
2402 int32_t ret = DeviceManager::GetInstance().CheckAPIAccessPermission();
2403 if (ret != DM_OK) {
2404 CreateBusinessError(env, ret);
2405 return nullptr;
2406 }
2407 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2408 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &thisVar, nullptr));
2409 int32_t maxNameLength = 0;
2410 if (argc >= DM_NAPI_ARGS_ONE) {
2411 napi_valuetype maxNameLengthType = napi_undefined;
2412 napi_typeof(env, argv[0], &maxNameLengthType);
2413 if (!CheckArgsType(env, maxNameLengthType == napi_number, "maxNameLength", "number")) {
2414 return nullptr;
2415 }
2416 napi_get_value_int32(env, argv[0], &maxNameLength);
2417 }
2418
2419 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2420 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2421 LOGE("deviceManagerWrapper is NULL");
2422 CreateBusinessError(env, ERR_DM_POINT_NULL);
2423 return nullptr;
2424 }
2425 auto *jsCallback = new GetLocalDisplayDeviceNameAsyncCallbackInfo();
2426 if (jsCallback == nullptr) {
2427 LOGE("jsCallback is nullptr");
2428 CreateBusinessError(env, ERR_DM_POINT_NULL);
2429 return nullptr;
2430 }
2431
2432 jsCallback->env = env;
2433 jsCallback->bundleName = deviceManagerWrapper->bundleName_;
2434 jsCallback->maxNameLength = maxNameLength;
2435 return GetLocalDisplayDeviceNamePromise(env, jsCallback);
2436 }
2437
SetLocalDeviceNamePromise(napi_env env,SetLocalDeviceNameAsyncCallbackInfo * asyncCallback)2438 napi_value DeviceManagerNapi::SetLocalDeviceNamePromise(napi_env env,
2439 SetLocalDeviceNameAsyncCallbackInfo *asyncCallback)
2440 {
2441 LOGI("In");
2442 napi_value promise = 0;
2443 napi_deferred deferred;
2444 napi_create_promise(env, &deferred, &promise);
2445 asyncCallback->deferred = deferred;
2446 napi_value workName;
2447 napi_create_string_latin1(env, "SetLocalDeviceNamePromise", NAPI_AUTO_LENGTH, &workName);
2448 napi_create_async_work(env, nullptr, workName,
2449 [](napi_env env, void *data) {
2450 SetLocalDeviceNameAsyncCallbackInfo *jsCallback =
2451 reinterpret_cast<SetLocalDeviceNameAsyncCallbackInfo *>(data);
2452 std::shared_ptr<DmNapiSetLocalDeviceNameCallback> callback =
2453 std::make_shared<DmNapiSetLocalDeviceNameCallback>(jsCallback->env, jsCallback->bundleName,
2454 jsCallback->deferred);
2455 int32_t ret = DeviceManager::GetInstance().SetLocalDeviceName(jsCallback->bundleName,
2456 jsCallback->deviceName, callback);
2457 jsCallback->code = ret;
2458 if (ret != DM_OK) {
2459 LOGE("SetLocalDeviceName failed, bundleName:%{public}s, ret=%{public}d",
2460 jsCallback->bundleName.c_str(), ret);
2461 }
2462 },
2463 [](napi_env env, napi_status status, void *data) {
2464 (void)status;
2465 SetLocalDeviceNameAsyncCallbackInfo *jsCallback =
2466 reinterpret_cast<SetLocalDeviceNameAsyncCallbackInfo *>(data);
2467 if (jsCallback->code != DM_OK) {
2468 napi_value error = CreateBusinessError(env, jsCallback->code, false);
2469 napi_reject_deferred(env, jsCallback->deferred, error);
2470 }
2471 napi_delete_async_work(env, jsCallback->asyncWork);
2472 delete jsCallback;
2473 jsCallback = nullptr;
2474 },
2475 (void *)asyncCallback, &asyncCallback->asyncWork);
2476 napi_queue_async_work_with_qos(env, asyncCallback->asyncWork, napi_qos_user_initiated);
2477 return promise;
2478 }
2479
SetRemoteDeviceNamePromise(napi_env env,SetRemoteDeviceNameAsyncCallbackInfo * asyncCallback)2480 napi_value DeviceManagerNapi::SetRemoteDeviceNamePromise(napi_env env,
2481 SetRemoteDeviceNameAsyncCallbackInfo *asyncCallback)
2482 {
2483 LOGI("In");
2484 napi_value promise = 0;
2485 napi_deferred deferred;
2486 napi_create_promise(env, &deferred, &promise);
2487 asyncCallback->deferred = deferred;
2488 napi_value workName;
2489 napi_create_string_latin1(env, "SetRemoteDeviceNamePromise", NAPI_AUTO_LENGTH, &workName);
2490 napi_create_async_work(env, nullptr, workName,
2491 [](napi_env env, void *data) {
2492 SetRemoteDeviceNameAsyncCallbackInfo *jsCallback =
2493 reinterpret_cast<SetRemoteDeviceNameAsyncCallbackInfo *>(data);
2494 std::shared_ptr<DmNapiSetRemoteDeviceNameCallback> callback =
2495 std::make_shared<DmNapiSetRemoteDeviceNameCallback>(jsCallback->env, jsCallback->bundleName,
2496 jsCallback->deferred);
2497 int32_t ret = DeviceManager::GetInstance().SetRemoteDeviceName(jsCallback->bundleName,
2498 jsCallback->deviceId, jsCallback->deviceName, callback);
2499 jsCallback->code = ret;
2500 if (ret != DM_OK) {
2501 LOGE("SetRemoteDeviceName failed, bundleName:%{public}s, ret=%{public}d",
2502 jsCallback->bundleName.c_str(), ret);
2503 }
2504 },
2505 [](napi_env env, napi_status status, void *data) {
2506 (void)status;
2507 SetRemoteDeviceNameAsyncCallbackInfo *jsCallback =
2508 reinterpret_cast<SetRemoteDeviceNameAsyncCallbackInfo *>(data);
2509 if (jsCallback->code != DM_OK) {
2510 napi_value error = CreateBusinessError(env, jsCallback->code, false);
2511 napi_reject_deferred(env, jsCallback->deferred, error);
2512 }
2513 napi_delete_async_work(env, jsCallback->asyncWork);
2514 delete jsCallback;
2515 jsCallback = nullptr;
2516 },
2517 (void *)asyncCallback, &asyncCallback->asyncWork);
2518 napi_queue_async_work_with_qos(env, asyncCallback->asyncWork, napi_qos_user_initiated);
2519 return promise;
2520 }
2521
JsSetLocalDeviceName(napi_env env,napi_callback_info info)2522 napi_value DeviceManagerNapi::JsSetLocalDeviceName(napi_env env, napi_callback_info info)
2523 {
2524 LOGI("In");
2525 if (!IsSystemApp()) {
2526 LOGE("Caller is not systemApp");
2527 CreateBusinessError(env, static_cast<int32_t>(DMBussinessErrorCode::ERR_NOT_SYSTEM_APP));
2528 return nullptr;
2529 }
2530 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2531 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2532 return nullptr;
2533 }
2534 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2535 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2536 LOGE("deviceManagerWrapper is NULL");
2537 CreateBusinessError(env, ERR_DM_POINT_NULL);
2538 return nullptr;
2539 }
2540 std::string deviceName = "";
2541 if (!JsToStringAndCheck(env, argv[0], "deviceName", deviceName)) {
2542 return nullptr;
2543 }
2544 if (deviceName.size() > DEVICE_NAME_MAX_BYTES) {
2545 LOGE("deviceName is too long");
2546 CreateBusinessError(env, ERR_DM_INPUT_PARA_INVALID);
2547 return nullptr;
2548 }
2549 auto *jsCallback = new SetLocalDeviceNameAsyncCallbackInfo();
2550 if (jsCallback == nullptr) {
2551 LOGE("jsCallback is nullptr");
2552 CreateBusinessError(env, ERR_DM_POINT_NULL);
2553 return nullptr;
2554 }
2555 jsCallback->env = env;
2556 jsCallback->bundleName = deviceManagerWrapper->bundleName_;
2557 jsCallback->deviceName = deviceName;
2558 return SetLocalDeviceNamePromise(env, jsCallback);
2559 }
2560
JsSetRemoteDeviceName(napi_env env,napi_callback_info info)2561 napi_value DeviceManagerNapi::JsSetRemoteDeviceName(napi_env env, napi_callback_info info)
2562 {
2563 LOGI("In");
2564 if (!IsSystemApp()) {
2565 LOGE("Caller is not systemApp");
2566 CreateBusinessError(env, static_cast<int32_t>(DMBussinessErrorCode::ERR_NOT_SYSTEM_APP));
2567 return nullptr;
2568 }
2569 GET_PARAMS(env, info, DM_NAPI_ARGS_TWO);
2570 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_TWO, "Wrong number of arguments, required 2")) {
2571 return nullptr;
2572 }
2573 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2574 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2575 LOGE("deviceManagerWrapper is NULL");
2576 CreateBusinessError(env, ERR_DM_POINT_NULL);
2577 return nullptr;
2578 }
2579 std::string deviceName = "";
2580 if (!JsToStringAndCheck(env, argv[0], "deviceName", deviceName)) {
2581 return nullptr;
2582 }
2583 if (deviceName.size() > DEVICE_NAME_MAX_BYTES) {
2584 LOGE("deviceName is too long");
2585 CreateBusinessError(env, ERR_DM_INPUT_PARA_INVALID);
2586 return nullptr;
2587 }
2588 std::string deviceId = "";
2589 if (!JsToStringAndCheck(env, argv[1], "deviceId", deviceId)) {
2590 return nullptr;
2591 }
2592 auto *jsCallback = new SetRemoteDeviceNameAsyncCallbackInfo();
2593 if (jsCallback == nullptr) {
2594 LOGE("jsCallback is nullptr");
2595 CreateBusinessError(env, ERR_DM_POINT_NULL);
2596 return nullptr;
2597 }
2598
2599 jsCallback->env = env;
2600 jsCallback->bundleName = deviceManagerWrapper->bundleName_;
2601 jsCallback->deviceId = deviceId;
2602 jsCallback->deviceName = deviceName;
2603 return SetRemoteDeviceNamePromise(env, jsCallback);
2604 }
2605
JsRestoreLocalDeviceName(napi_env env,napi_callback_info info)2606 napi_value DeviceManagerNapi::JsRestoreLocalDeviceName(napi_env env, napi_callback_info info)
2607 {
2608 LOGI("In");
2609 if (!IsSystemApp()) {
2610 LOGE("Caller is not systemApp");
2611 CreateBusinessError(env, static_cast<int32_t>(DMBussinessErrorCode::ERR_NOT_SYSTEM_APP));
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 napi_value result = nullptr;
2618 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2619 if (IsDeviceManagerNapiNull(env, thisVar, &deviceManagerWrapper)) {
2620 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2621 return result;
2622 }
2623 int32_t ret = DeviceManager::GetInstance().RestoreLocalDeviceName(deviceManagerWrapper->bundleName_);
2624 if (ret != 0) {
2625 LOGE("bundleName %{public}s failed, ret %{public}d",
2626 deviceManagerWrapper->bundleName_.c_str(), ret);
2627 CreateBusinessError(env, ret);
2628 }
2629 napi_get_undefined(env, &result);
2630 return result;
2631 }
2632
ClearBundleCallbacks(std::string & bundleName)2633 void DeviceManagerNapi::ClearBundleCallbacks(std::string &bundleName)
2634 {
2635 LOGI("ClearBundleCallbacks start for bundleName %{public}s", bundleName.c_str());
2636 {
2637 std::lock_guard<std::mutex> autoLock(g_deviceManagerMapMutex);
2638 g_deviceManagerMap.erase(bundleName);
2639 }
2640 {
2641 std::lock_guard<std::mutex> autoLock(g_initCallbackMapMutex);
2642 g_initCallbackMap.erase(bundleName);
2643 }
2644 {
2645 std::lock_guard<std::mutex> autoLock(g_deviceStatusCallbackMapMutex);
2646 g_deviceStatusCallbackMap.erase(bundleName);
2647 }
2648 {
2649 std::lock_guard<std::mutex> autoLock(g_discoveryCallbackMapMutex);
2650 g_DiscoveryCallbackMap.erase(bundleName);
2651 }
2652 {
2653 std::lock_guard<std::mutex> autoLock(g_publishCallbackMapMutex);
2654 g_publishCallbackMap.erase(bundleName);
2655 }
2656 {
2657 std::lock_guard<std::mutex> autoLock(g_authCallbackMapMutex);
2658 g_authCallbackMap.erase(bundleName);
2659 }
2660 {
2661 std::lock_guard<std::mutex> autoLock(g_bindCallbackMapMutex);
2662 g_bindCallbackMap.erase(bundleName);
2663 }
2664 return;
2665 }
2666
ReleaseDeviceManager(napi_env env,napi_callback_info info)2667 napi_value DeviceManagerNapi::ReleaseDeviceManager(napi_env env, napi_callback_info info)
2668 {
2669 LOGI("ReleaseDeviceManager in");
2670 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2671 if (!CheckArgsCount(env, argc == DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2672 return nullptr;
2673 }
2674 napi_valuetype argvType = napi_undefined;
2675 napi_typeof(env, argv[0], &argvType);
2676 if (!CheckArgsType(env, argvType == napi_object, "DeviceManager", "object")) {
2677 return nullptr;
2678 }
2679 napi_value result = nullptr;
2680 DeviceManagerNapi *deviceManagerWrapper = nullptr;
2681 if (IsDeviceManagerNapiNull(env, argv[0], &deviceManagerWrapper)) {
2682 napi_create_uint32(env, ERR_DM_POINT_NULL, &result);
2683 return result;
2684 }
2685 LOGI("ReleaseDeviceManager for bundleName %{public}s", deviceManagerWrapper->bundleName_.c_str());
2686 int32_t ret = DeviceManager::GetInstance().UnInitDeviceManager(deviceManagerWrapper->bundleName_);
2687 if (ret != 0) {
2688 LOGE("ReleaseDeviceManager for bundleName %{public}s failed, ret %{public}d",
2689 deviceManagerWrapper->bundleName_.c_str(), ret);
2690 CreateBusinessError(env, ret);
2691 napi_create_uint32(env, static_cast<uint32_t>(ret), &result);
2692 return result;
2693 }
2694 ClearBundleCallbacks(deviceManagerWrapper->bundleName_);
2695 napi_get_undefined(env, &result);
2696 NAPI_CALL(env, napi_remove_wrap(env, argv[0], (void**)&deviceManagerWrapper));
2697 return result;
2698 }
2699
CreateDeviceManager(napi_env env,napi_callback_info info)2700 napi_value DeviceManagerNapi::CreateDeviceManager(napi_env env, napi_callback_info info)
2701 {
2702 LOGI("In");
2703 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2704 if (!CheckArgsCount(env, argc == DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2705 return nullptr;
2706 }
2707 std::string bundleName;
2708 if (!JsToStringAndCheck(env, argv[0], "bundleName", bundleName)) {
2709 return nullptr;
2710 }
2711 std::shared_ptr<DmNapiInitCallback> initCallback = std::make_shared<DmNapiInitCallback>(env, bundleName);
2712 int32_t ret = DeviceManager::GetInstance().InitDeviceManager(bundleName, initCallback);
2713 if (ret != 0) {
2714 LOGE("CreateDeviceManager for bundleName %{public}s failed, ret %{public}d.", bundleName.c_str(), ret);
2715 CreateBusinessError(env, ret);
2716 return nullptr;
2717 }
2718 {
2719 std::lock_guard<std::mutex> autoLock(g_initCallbackMapMutex);
2720 g_initCallbackMap[bundleName] = initCallback;
2721 }
2722 napi_value ctor = nullptr;
2723 napi_value napiName = nullptr;
2724 napi_value result = nullptr;
2725 napi_get_reference_value(env, sConstructor_, &ctor);
2726 napi_create_string_utf8(env, bundleName.c_str(), NAPI_AUTO_LENGTH, &napiName);
2727 napi_status status = napi_new_instance(env, ctor, DM_NAPI_ARGS_ONE, &napiName, &result);
2728 if (status != napi_ok) {
2729 LOGE("Create DeviceManagerNapi for bundleName %{public}s failed", bundleName.c_str());
2730 }
2731 return result;
2732 }
2733
Constructor(napi_env env,napi_callback_info info)2734 napi_value DeviceManagerNapi::Constructor(napi_env env, napi_callback_info info)
2735 {
2736 LOGI("In");
2737 GET_PARAMS(env, info, DM_NAPI_ARGS_ONE);
2738 if (!CheckArgsCount(env, argc >= DM_NAPI_ARGS_ONE, "Wrong number of arguments, required 1")) {
2739 return nullptr;
2740 }
2741 std::string bundleName;
2742 if (!JsToStringAndCheck(env, argv[0], "bundleName", bundleName)) {
2743 return nullptr;
2744 }
2745
2746 LOGI("Create for packageName:%{public}s", bundleName.c_str());
2747 DeviceManagerNapi *obj = new DeviceManagerNapi(env, thisVar);
2748 if (obj == nullptr) {
2749 return nullptr;
2750 }
2751
2752 obj->bundleName_ = bundleName;
2753 std::lock_guard<std::mutex> autoLock(g_deviceManagerMapMutex);
2754 g_deviceManagerMap[obj->bundleName_] = obj;
2755 napi_status status = napi_wrap(
2756 env, thisVar, reinterpret_cast<void *>(obj),
2757 [](napi_env env, void *data, void *hint) {
2758 (void)env;
2759 (void)hint;
2760 DeviceManagerNapi *deviceManager = reinterpret_cast<DeviceManagerNapi *>(data);
2761 delete deviceManager;
2762 deviceManager = nullptr;
2763 LOGI("delete deviceManager");
2764 },
2765 nullptr, nullptr);
2766 if (status != napi_ok) {
2767 delete obj;
2768 obj = nullptr;
2769 LOGE("failed to wrap JS object");
2770 return nullptr;
2771 }
2772 return thisVar;
2773 }
2774
Init(napi_env env,napi_value exports)2775 napi_value DeviceManagerNapi::Init(napi_env env, napi_value exports)
2776 {
2777 napi_value dmClass = nullptr;
2778 napi_property_descriptor dmProperties[] = {
2779 DECLARE_NAPI_FUNCTION("getAvailableDeviceListSync", GetAvailableDeviceListSync),
2780 DECLARE_NAPI_FUNCTION("getAvailableDeviceList", GetAvailableDeviceList),
2781 DECLARE_NAPI_FUNCTION("getLocalDeviceNetworkId", GetLocalDeviceNetworkId),
2782 DECLARE_NAPI_FUNCTION("getLocalDeviceId", GetLocalDeviceId),
2783 DECLARE_NAPI_FUNCTION("getLocalDeviceName", GetLocalDeviceName),
2784 DECLARE_NAPI_FUNCTION("getLocalDeviceType", GetLocalDeviceType),
2785 DECLARE_NAPI_FUNCTION("getDeviceName", GetDeviceName),
2786 DECLARE_NAPI_FUNCTION("getDeviceType", GetDeviceType),
2787 DECLARE_NAPI_FUNCTION("startDiscovering", StartDeviceDiscover),
2788 DECLARE_NAPI_FUNCTION("stopDiscovering", StopDeviceDiscover),
2789 DECLARE_NAPI_FUNCTION("unbindTarget", UnBindTarget),
2790 DECLARE_NAPI_FUNCTION("bindTarget", BindTarget),
2791 DECLARE_NAPI_FUNCTION("replyUiAction", SetUserOperationSync),
2792 DECLARE_NAPI_FUNCTION("on", JsOn),
2793 DECLARE_NAPI_FUNCTION("off", JsOff),
2794 DECLARE_NAPI_FUNCTION("getDeviceProfileInfoList", JsGetDeviceProfileInfoList),
2795 DECLARE_NAPI_FUNCTION("getDeviceIconInfo", JsGetDeviceIconInfo),
2796 DECLARE_NAPI_FUNCTION("putDeviceProfileInfoList", JsPutDeviceProfileInfoList),
2797 DECLARE_NAPI_FUNCTION("getLocalDisplayDeviceName", JsGetLocalDisplayDeviceName),
2798 DECLARE_NAPI_FUNCTION("setLocalDeviceName", JsSetLocalDeviceName),
2799 DECLARE_NAPI_FUNCTION("setRemoteDeviceName", JsSetRemoteDeviceName),
2800 DECLARE_NAPI_FUNCTION("restoreLocalDeviceName", JsRestoreLocalDeviceName),
2801 DECLARE_NAPI_FUNCTION("restoreLocalDeivceName", JsRestoreLocalDeviceName),
2802 DECLARE_NAPI_FUNCTION("getDeviceNetworkIdList", JsGetDeviceNetworkIdList),
2803 DECLARE_NAPI_FUNCTION("setHeartbeatPolicy", SetHeartbeatPolicy)};
2804
2805 napi_property_descriptor static_prop[] = {
2806 DECLARE_NAPI_STATIC_FUNCTION("createDeviceManager", CreateDeviceManager),
2807 DECLARE_NAPI_STATIC_FUNCTION("releaseDeviceManager", ReleaseDeviceManager),
2808 };
2809
2810 LOGI("DeviceManagerNapi::Init() is called!");
2811 NAPI_CALL(env, napi_define_class(env, DEVICE_MANAGER_NAPI_CLASS_NAME.c_str(), NAPI_AUTO_LENGTH, Constructor,
2812 nullptr, sizeof(dmProperties) / sizeof(dmProperties[0]), dmProperties, &dmClass));
2813 NAPI_CALL(env, napi_create_reference(env, dmClass, 1, &sConstructor_));
2814 NAPI_CALL(env, napi_set_named_property(env, exports, DEVICE_MANAGER_NAPI_CLASS_NAME.c_str(), dmClass));
2815 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(static_prop) / sizeof(static_prop[0]), static_prop));
2816 LOGI("All props and functions are configured..");
2817 return exports;
2818 }
2819
EnumTypeConstructor(napi_env env,napi_callback_info info)2820 napi_value DeviceManagerNapi::EnumTypeConstructor(napi_env env, napi_callback_info info)
2821 {
2822 size_t argc = 0;
2823 napi_value res = nullptr;
2824 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, nullptr, &res, nullptr));
2825 return res;
2826 }
2827
InitDeviceStatusChangeActionEnum(napi_env env,napi_value exports)2828 napi_value DeviceManagerNapi::InitDeviceStatusChangeActionEnum(napi_env env, napi_value exports)
2829 {
2830 napi_value device_state_online;
2831 napi_value device_state_ready;
2832 napi_value device_state_offline;
2833 int32_t refCount = 1;
2834
2835 napi_create_uint32(env, static_cast<uint32_t>(DmDeviceState::DEVICE_STATE_ONLINE),
2836 &device_state_online);
2837 napi_create_uint32(env, static_cast<uint32_t>(DmDeviceState::DEVICE_INFO_READY),
2838 &device_state_ready);
2839 napi_create_uint32(env, static_cast<uint32_t>(DmDeviceState::DEVICE_STATE_OFFLINE),
2840 &device_state_offline);
2841
2842 napi_property_descriptor desc[] = {
2843 DECLARE_NAPI_STATIC_PROPERTY("UNKNOWN", device_state_online),
2844 DECLARE_NAPI_STATIC_PROPERTY("AVAILABLE", device_state_ready),
2845 DECLARE_NAPI_STATIC_PROPERTY("UNAVAILABLE", device_state_offline),
2846 };
2847
2848 napi_value result = nullptr;
2849 napi_define_class(env, "DeviceStateChange", NAPI_AUTO_LENGTH, EnumTypeConstructor,
2850 nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
2851 napi_create_reference(env, result, refCount, &deviceStateChangeActionEnumConstructor_);
2852 napi_set_named_property(env, exports, "DeviceStateChange", result);
2853 return exports;
2854 }
2855
InitStrategyForHeartbeatEnum(napi_env env,napi_value exports)2856 napi_value DeviceManagerNapi::InitStrategyForHeartbeatEnum(napi_env env, napi_value exports)
2857 {
2858 const uint32_t stop_heartbeat = 100;
2859 const uint32_t start_heartbeat = 101;
2860
2861 napi_value start_heartbeat_value;
2862 napi_value stop_heartbeat_value;
2863 int32_t refCount = 1;
2864
2865 napi_create_uint32(env, start_heartbeat, &start_heartbeat_value);
2866 napi_create_uint32(env, stop_heartbeat, &stop_heartbeat_value);
2867
2868 napi_property_descriptor desc[] = {
2869 DECLARE_NAPI_STATIC_PROPERTY("START_HEARTBEAT", start_heartbeat_value),
2870 DECLARE_NAPI_STATIC_PROPERTY("TEMP_STOP_HEARTBEAT", stop_heartbeat_value),
2871 };
2872
2873 napi_value result = nullptr;
2874 napi_define_class(env, "StrategyForHeartbeat", NAPI_AUTO_LENGTH, EnumTypeConstructor,
2875 nullptr, sizeof(desc) / sizeof(*desc), desc, &result);
2876 napi_create_reference(env, result, refCount, &g_strategyForHeartbeatEnumConstructor);
2877 napi_set_named_property(env, exports, "StrategyForHeartbeat", result);
2878 return exports;
2879 }
2880
BindTargetWarpper(const std::string & pkgName,const std::string & deviceId,const std::string & bindParam,std::shared_ptr<DmNapiBindTargetCallback> callback)2881 int32_t DeviceManagerNapi::BindTargetWarpper(const std::string &pkgName, const std::string &deviceId,
2882 const std::string &bindParam, std::shared_ptr<DmNapiBindTargetCallback> callback)
2883 {
2884 if (bindParam.empty()) {
2885 return ERR_DM_INPUT_PARA_INVALID;
2886 }
2887 JsonObject bindParamObj(bindParam);
2888 if (bindParamObj.IsDiscarded()) {
2889 return ERR_DM_INPUT_PARA_INVALID;
2890 }
2891 PeerTargetId targetId;
2892 targetId.deviceId = deviceId;
2893 if (IsString(bindParamObj, PARAM_KEY_BR_MAC)) {
2894 targetId.brMac = bindParamObj[PARAM_KEY_BR_MAC].Get<std::string>();
2895 }
2896 if (IsString(bindParamObj, PARAM_KEY_BLE_MAC)) {
2897 targetId.bleMac = bindParamObj[PARAM_KEY_BLE_MAC].Get<std::string>();
2898 }
2899 if (IsString(bindParamObj, PARAM_KEY_WIFI_IP)) {
2900 targetId.wifiIp = bindParamObj[PARAM_KEY_WIFI_IP].Get<std::string>();
2901 }
2902 if (IsInt32(bindParamObj, PARAM_KEY_WIFI_PORT)) {
2903 targetId.wifiPort = (uint16_t)(bindParamObj[PARAM_KEY_WIFI_PORT].Get<int32_t>());
2904 }
2905
2906 std::map<std::string, std::string> bindParamMap;
2907 InsertMapParames(bindParamObj, bindParamMap);
2908 return DeviceManager::GetInstance().BindTarget(pkgName, targetId, bindParamMap, callback);
2909 }
2910
2911 /*
2912 * Function registering all props and functions of ohos.distributedhardware
2913 */
Export(napi_env env,napi_value exports)2914 static napi_value Export(napi_env env, napi_value exports)
2915 {
2916 LOGI("Export() is called!");
2917 DeviceManagerNapi::Init(env, exports);
2918 DeviceManagerNapi::InitDeviceStatusChangeActionEnum(env, exports);
2919 DeviceManagerNapi::InitStrategyForHeartbeatEnum(env, exports);
2920 return exports;
2921 }
2922
2923 /*
2924 * module define
2925 */
2926 static napi_module g_dmModule = {.nm_version = 1,
2927 .nm_flags = 0,
2928 .nm_filename = nullptr,
2929 .nm_register_func = Export,
2930 .nm_modname = "distributedDeviceManager",
2931 .nm_priv = ((void *)0),
2932 .reserved = {0}};
2933
2934 /*
2935 * module register
2936 */
RegisterModule(void)2937 extern "C" __attribute__((constructor)) void RegisterModule(void)
2938 {
2939 LOGI("RegisterModule() is called!");
2940 napi_module_register(&g_dmModule);
2941 }
2942
OnResult(const OHOS::DistributedHardware::DmDeviceIconInfo & deviceIconInfo,int32_t code)2943 void DmNapiGetDeviceIconInfoCallback::OnResult(const OHOS::DistributedHardware::DmDeviceIconInfo &deviceIconInfo,
2944 int32_t code)
2945 {
2946 LOGI("In code:%{public}d", code);
2947 uv_loop_s *loop = nullptr;
2948 napi_get_uv_event_loop(env_, &loop);
2949 if (loop == nullptr) {
2950 LOGE("get loop fail");
2951 return;
2952 }
2953 uv_work_t *work = new (std::nothrow) uv_work_t;
2954 if (work == nullptr) {
2955 LOGE("OnResult, No memory");
2956 return;
2957 }
2958 auto *jsCallback = new DeviceIconInfoAsyncCallbackInfo();
2959 if (jsCallback == nullptr) {
2960 LOGE("create jsCallback fail");
2961 DeleteUvWork(work);
2962 return;
2963 }
2964 jsCallback->env = env_;
2965 jsCallback->bundleName = bundleName_;
2966 jsCallback->deferred = deferred_;
2967 jsCallback->deviceIconInfo = deviceIconInfo;
2968 jsCallback->code = code;
2969 work->data = reinterpret_cast<void *>(jsCallback);
2970 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
2971 LOGD("OnResult uv_queue_work_with_qos");
2972 }, [] (uv_work_t *work, int status) {
2973 DeviceIconInfoAsyncCallbackInfo *callback =
2974 reinterpret_cast<DeviceIconInfoAsyncCallbackInfo *>(work->data);
2975 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName);
2976 if (deviceManagerNapi == nullptr) {
2977 LOGE("deviceManagerNapi not find for bundleName %{public}s", callback->bundleName.c_str());
2978 } else {
2979 deviceManagerNapi->OnGetDeviceIconInfoCallbackResult(callback);
2980 }
2981 delete callback;
2982 callback = nullptr;
2983 DeleteUvWork(work);
2984 }, uv_qos_user_initiated);
2985 if (ret != 0) {
2986 LOGE("Failed to execute OnBindResult work queue");
2987 delete jsCallback;
2988 jsCallback = nullptr;
2989 DeleteUvWork(work);
2990 }
2991 }
2992
OnResult(int32_t code)2993 void DmNapiSetLocalDeviceNameCallback::OnResult(int32_t code)
2994 {
2995 LOGI("In code:%{public}d", code);
2996 uv_loop_s *loop = nullptr;
2997 napi_get_uv_event_loop(env_, &loop);
2998 if (loop == nullptr) {
2999 LOGE("get loop fail");
3000 return;
3001 }
3002 uv_work_t *work = new (std::nothrow) uv_work_t;
3003 if (work == nullptr) {
3004 LOGE("OnResult, No memory");
3005 return;
3006 }
3007 auto *jsCallback = new SetLocalDeviceNameAsyncCallbackInfo();
3008 if (jsCallback == nullptr) {
3009 LOGE("create jsCallback fail");
3010 DeleteUvWork(work);
3011 return;
3012 }
3013 jsCallback->env = env_;
3014 jsCallback->bundleName = bundleName_;
3015 jsCallback->deferred = deferred_;
3016 jsCallback->code = code;
3017 work->data = reinterpret_cast<void *>(jsCallback);
3018 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
3019 LOGD("OnResult uv_queue_work_with_qos");
3020 }, [] (uv_work_t *work, int status) {
3021 SetLocalDeviceNameAsyncCallbackInfo *callback =
3022 reinterpret_cast<SetLocalDeviceNameAsyncCallbackInfo *>(work->data);
3023 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName);
3024 if (deviceManagerNapi == nullptr) {
3025 LOGE("deviceManagerNapi not find for bundleName %{public}s", callback->bundleName.c_str());
3026 } else {
3027 deviceManagerNapi->OnSetLocalDeviceNameCallbackResult(callback);
3028 }
3029 delete callback;
3030 callback = nullptr;
3031 DeleteUvWork(work);
3032 }, uv_qos_user_initiated);
3033 if (ret != 0) {
3034 LOGE("Failed to execute OnBindResult work queue");
3035 delete jsCallback;
3036 jsCallback = nullptr;
3037 DeleteUvWork(work);
3038 }
3039 }
3040
OnResult(int32_t code)3041 void DmNapiSetRemoteDeviceNameCallback::OnResult(int32_t code)
3042 {
3043 LOGI("In code:%{public}d", code);
3044 uv_loop_s *loop = nullptr;
3045 napi_get_uv_event_loop(env_, &loop);
3046 if (loop == nullptr) {
3047 LOGE("get loop fail");
3048 return;
3049 }
3050 uv_work_t *work = new (std::nothrow) uv_work_t;
3051 if (work == nullptr) {
3052 LOGE("OnResult, No memory");
3053 return;
3054 }
3055 auto *jsCallback = new SetRemoteDeviceNameAsyncCallbackInfo();
3056 if (jsCallback == nullptr) {
3057 LOGE("create jsCallback fail");
3058 DeleteUvWork(work);
3059 return;
3060 }
3061 jsCallback->env = env_;
3062 jsCallback->bundleName = bundleName_;
3063 jsCallback->deferred = deferred_;
3064 jsCallback->code = code;
3065 work->data = reinterpret_cast<void *>(jsCallback);
3066 int ret = uv_queue_work_with_qos(loop, work, [] (uv_work_t *work) {
3067 LOGD("OnResult uv_queue_work_with_qos");
3068 }, [] (uv_work_t *work, int status) {
3069 SetRemoteDeviceNameAsyncCallbackInfo *callback =
3070 reinterpret_cast<SetRemoteDeviceNameAsyncCallbackInfo *>(work->data);
3071 DeviceManagerNapi *deviceManagerNapi = DeviceManagerNapi::GetDeviceManagerNapi(callback->bundleName);
3072 if (deviceManagerNapi == nullptr) {
3073 LOGE("deviceManagerNapi not find for bundleName %{public}s", callback->bundleName.c_str());
3074 } else {
3075 deviceManagerNapi->OnSetRemoteDeviceNameCallbackResult(callback);
3076 }
3077 delete callback;
3078 callback = nullptr;
3079 DeleteUvWork(work);
3080 }, uv_qos_user_initiated);
3081 if (ret != 0) {
3082 LOGE("Failed to execute OnBindResult work queue");
3083 delete jsCallback;
3084 jsCallback = nullptr;
3085 DeleteUvWork(work);
3086 }
3087 }
3088