• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &paramJson)
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 &paramJson)
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