• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef OHOS_DM_NATIVE_DEVICEMANAGER_JS_H
17 #define OHOS_DM_NATIVE_DEVICEMANAGER_JS_H
18 
19 #include <memory>
20 #include <string>
21 #include <mutex>
22 
23 #include "device_manager_callback.h"
24 #include "dm_app_image_info.h"
25 #include "dm_device_info.h"
26 #include "dm_native_event.h"
27 #include "dm_subscribe_info.h"
28 #include "dm_publish_info.h"
29 #include "dm_anonymous.h"
30 #include "dm_error_message.h"
31 #include "napi/native_api.h"
32 #include "napi/native_node_api.h"
33 #include "nlohmann/json.hpp"
34 #define DM_NAPI_BUF_LENGTH (256)
35 #define DM_NAPI_CREDENTIAL_BUF_LENGTH (6000)
36 #define DM_NAPI_DESCRIPTION_BUF_LENGTH (16384)
37 
38 struct AsyncCallbackInfo {
39     napi_env env = nullptr;
40     napi_async_work asyncWork = nullptr;
41 
42     char bundleName[DM_NAPI_BUF_LENGTH] = {0};
43     size_t bundleNameLen = 0;
44 
45     napi_ref callback = nullptr;
46     int32_t status = -1;
47     int32_t ret = 0;
48 };
49 
50 struct CredentialAsyncCallbackInfo {
51     napi_env env = nullptr;
52     napi_async_work asyncWork = nullptr;
53 
54     std::string bundleName;
55     std::string reqInfo;
56     std::string returnJsonStr;
57     int32_t status = -1;
58     int32_t ret = 0;
59     napi_ref callback = nullptr;
60 };
61 
62 struct DeviceInfoAsyncCallbackInfo {
63     napi_env env = nullptr;
64     napi_async_work asyncWork = nullptr;
65 
66     std::string bundleName;
67     size_t bundleNameLen = 0;
68     OHOS::DistributedHardware::DmDeviceInfo deviceInfo;
69     std::string extra;
70     // OHOS::DistributedHardware::DmFilterOptions filter;
71     napi_ref callback = nullptr;
72     napi_value thisVar = nullptr;
73     napi_deferred deferred = nullptr;
74     int32_t status = -1;
75     int32_t ret = 0;
76 };
77 
78 struct NetworkIdAsyncCallbackInfo {
79     napi_env env = nullptr;
80     napi_async_work asyncWork = nullptr;
81 
82     std::string bundleName;
83     std::string networkId;
84     size_t bundleNameLen = 0;
85     OHOS::DistributedHardware::DmDeviceInfo deviceInfo;
86 
87     napi_ref callback = nullptr;
88     napi_value thisVar = nullptr;
89     napi_deferred deferred = nullptr;
90     int32_t status = -1;
91     int32_t ret = 0;
92 };
93 
94 struct DeviceInfoListAsyncCallbackInfo {
95     napi_env env = nullptr;
96     napi_async_work asyncWork = nullptr;
97 
98     std::string bundleName;
99     size_t bundleNameLen = 0;
100     std::vector<OHOS::DistributedHardware::DmDeviceInfo> devList;
101     std::string extra;
102     // OHOS::DistributedHardware::DmFilterOptions filter;
103     napi_ref callback = nullptr;
104     napi_value thisVar = nullptr;
105     napi_deferred deferred = nullptr;
106     int32_t status = -1;
107     int32_t ret = 0;
108 };
109 
110 struct AuthAsyncCallbackInfo {
111     napi_env env = nullptr;
112 
113     char bundleName[DM_NAPI_BUF_LENGTH] = {0};
114     size_t bundleNameLen = 0;
115 
116     napi_ref callback = nullptr;
117     int32_t authType = -1;
118 };
119 
120 struct DmNapiStateJsCallback {
121     std::string bundleName_;
122     uint16_t subscribeId_;
123     int32_t reason_;
124     OHOS::DistributedHardware::DmDeviceInfo deviceInfo_;
125 
DmNapiStateJsCallbackDmNapiStateJsCallback126     DmNapiStateJsCallback(std::string bundleName, uint16_t subscribeId, int32_t reason,
127         OHOS::DistributedHardware::DmDeviceInfo deviceInfo)
128         : bundleName_(bundleName), subscribeId_(subscribeId), reason_(reason), deviceInfo_(deviceInfo) {}
129 };
130 
131 struct DmNapiPublishJsCallback {
132     std::string bundleName_;
133     int32_t publishId_;
134     int32_t reason_;
135 
DmNapiPublishJsCallbackDmNapiPublishJsCallback136     DmNapiPublishJsCallback(std::string bundleName, int32_t publishId, int32_t reason)
137         : bundleName_(bundleName), publishId_(publishId), reason_(reason) {}
138 };
139 
140 struct DmNapiCredentialJsCallback {
141     std::string bundleName_;
142     int32_t action_;
143     std::string credentialResult_;
144 
DmNapiCredentialJsCallbackDmNapiCredentialJsCallback145     DmNapiCredentialJsCallback(std::string bundleName, int32_t action, std::string credentialResult)
146         : bundleName_(bundleName), action_(action), credentialResult_(credentialResult) {}
147 };
148 
149 struct DmNapiAuthJsCallback {
150     std::string bundleName_;
151     std::string deviceId_;
152     std::string token_;
153     int32_t status_;
154     int32_t reason_;
155 
DmNapiAuthJsCallbackDmNapiAuthJsCallback156     DmNapiAuthJsCallback(std::string bundleName, std::string deviceId, std::string token, int32_t status,
157         int32_t reason)
158         : bundleName_(bundleName), deviceId_(deviceId), token_(token), status_(status), reason_(reason) {}
159 };
160 
161 struct DmNapiVerifyJsCallback {
162     std::string bundleName_;
163     std::string deviceId_;
164     int32_t resultCode_;
165     int32_t flag_;
166 
DmNapiVerifyJsCallbackDmNapiVerifyJsCallback167     DmNapiVerifyJsCallback(std::string bundleName, std::string deviceId, int32_t resultCode, int32_t flag)
168         : bundleName_(bundleName), deviceId_(deviceId), resultCode_(resultCode), flag_(flag) {}
169 };
170 
171 enum DmNapiDevStateChangeAction { ONLINE = 0, READY = 1, OFFLINE = 2, CHANGE = 3 };
172 
173 class DmNapiInitCallback : public OHOS::DistributedHardware::DmInitCallback {
174 public:
DmNapiInitCallback(napi_env env,std::string & bundleName)175     explicit DmNapiInitCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
176     {
177     }
~DmNapiInitCallback()178     ~DmNapiInitCallback() override {}
179     void OnRemoteDied() override;
180 
181 private:
182     napi_env env_;
183     std::string bundleName_;
184 };
185 
186 class DmNapiDeviceStateCallback : public OHOS::DistributedHardware::DeviceStateCallback {
187 public:
DmNapiDeviceStateCallback(napi_env env,std::string & bundleName)188     explicit DmNapiDeviceStateCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
189     {
190     }
~DmNapiDeviceStateCallback()191     ~DmNapiDeviceStateCallback() override {};
192     void OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
193     void OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
194     void OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
195     void OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
196 
197 private:
198     napi_env env_;
199     std::string bundleName_;
200 };
201 
202 class DmNapiDiscoveryCallback : public OHOS::DistributedHardware::DiscoveryCallback {
203 public:
DmNapiDiscoveryCallback(napi_env env,std::string & bundleName)204     explicit DmNapiDiscoveryCallback(napi_env env, std::string &bundleName)
205         : env_(env), refCount_(0), bundleName_(bundleName)
206     {
207     }
~DmNapiDiscoveryCallback()208     ~DmNapiDiscoveryCallback() override {};
209     void OnDeviceFound(uint16_t subscribeId, const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
210     void OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason) override;
211     void OnDiscoverySuccess(uint16_t subscribeId) override;
212     void IncreaseRefCount();
213     void DecreaseRefCount();
214     int32_t GetRefCount();
215 
216 private:
217     napi_env env_;
218     std::atomic<int32_t> refCount_;
219     std::string bundleName_;
220 };
221 
222 class DmNapiPublishCallback : public OHOS::DistributedHardware::PublishCallback {
223 public:
DmNapiPublishCallback(napi_env env,std::string & bundleName)224     explicit DmNapiPublishCallback(napi_env env, std::string &bundleName)
225         : env_(env), refCount_(0), bundleName_(bundleName)
226     {
227     }
~DmNapiPublishCallback()228     ~DmNapiPublishCallback() override {};
229     void OnPublishResult(int32_t publishId, int32_t publishResult) override;
230     void IncreaseRefCount();
231     void DecreaseRefCount();
232     int32_t GetRefCount();
233 
234 private:
235     napi_env env_;
236     std::atomic<int32_t> refCount_;
237     std::string bundleName_;
238 };
239 
240 class DmNapiDeviceManagerUiCallback : public OHOS::DistributedHardware::DeviceManagerUiCallback {
241 public:
DmNapiDeviceManagerUiCallback(napi_env env,std::string & bundleName)242     explicit DmNapiDeviceManagerUiCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
243     {
244     }
~DmNapiDeviceManagerUiCallback()245     ~DmNapiDeviceManagerUiCallback() override {};
246     void OnCall(const std::string &paramJson) override;
247 
248 private:
249     napi_env env_;
250     std::string bundleName_;
251 };
252 
253 class DmNapiCredentialCallback : public OHOS::DistributedHardware::CredentialCallback {
254 public:
DmNapiCredentialCallback(napi_env env,const std::string & bundleName)255     explicit DmNapiCredentialCallback(napi_env env, const std::string &bundleName) : env_(env), bundleName_(bundleName)
256     {
257     }
~DmNapiCredentialCallback()258     ~DmNapiCredentialCallback() override {};
259     void OnCredentialResult(int32_t &action, const std::string &credentialResult) override;
260 
261 private:
262     napi_env env_;
263     std::string bundleName_;
264 };
265 
266 class DmNapiAuthenticateCallback : public OHOS::DistributedHardware::AuthenticateCallback {
267 public:
DmNapiAuthenticateCallback(napi_env env,std::string & bundleName)268     explicit DmNapiAuthenticateCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
269     {
270     }
~DmNapiAuthenticateCallback()271     ~DmNapiAuthenticateCallback() override {};
272     void OnAuthResult(const std::string &deviceId, const std::string &token, int32_t status, int32_t reason) override;
273 
274 private:
275     napi_env env_;
276     std::string bundleName_;
277 };
278 
279 class DmNapiVerifyAuthCallback : public OHOS::DistributedHardware::VerifyAuthCallback {
280 public:
DmNapiVerifyAuthCallback(napi_env env,std::string & bundleName)281     explicit DmNapiVerifyAuthCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
282     {
283     }
~DmNapiVerifyAuthCallback()284     ~DmNapiVerifyAuthCallback() override {};
285     void OnVerifyAuthResult(const std::string &deviceId, int32_t resultCode, int32_t flag) override;
286 
287 private:
288     napi_env env_;
289     std::string bundleName_;
290 };
291 
292 class DeviceManagerNapi : public DmNativeEvent {
293 public:
294     explicit DeviceManagerNapi(napi_env env, napi_value thisVar);
295     ~DeviceManagerNapi() override;
296     static napi_value Init(napi_env env, napi_value exports);
297     static napi_value Constructor(napi_env env, napi_callback_info info);
298     static napi_value EnumTypeConstructor(napi_env env, napi_callback_info info);
299     static napi_value InitDeviceTypeEnum(napi_env env, napi_value exports);
300     static napi_value InitDeviceStateChangeActionEnum(napi_env env, napi_value exports);
301     static napi_value InitDiscoverModeEnum(napi_env env, napi_value exports);
302     static napi_value InitExchangeMediumEnum(napi_env env, napi_value exports);
303     static napi_value InitExchangeFreqEnum(napi_env env, napi_value exports);
304     static napi_value InitSubscribeCapEnum(napi_env env, napi_value exports);
305     static napi_value CreateDeviceManager(napi_env env, napi_callback_info info);
306     static napi_value ReleaseDeviceManager(napi_env env, napi_callback_info info);
307     static napi_value SetUserOperationSync(napi_env env, napi_callback_info info);
308     static napi_value GetTrustedDeviceListSync(napi_env env, napi_callback_info info);
309     static napi_value GetTrustedDeviceList(napi_env env, napi_callback_info info);
310     static napi_value GetLocalDeviceInfoSync(napi_env env, napi_callback_info info);
311     static napi_value GetLocalDeviceInfo(napi_env env, napi_callback_info info);
312     static napi_value GetDeviceInfo(napi_env env, napi_callback_info info);
313     static napi_value UnAuthenticateDevice(napi_env env, napi_callback_info info);
314     static napi_value StartDeviceDiscoverSync(napi_env env, napi_callback_info info);
315     static napi_value StopDeviceDiscoverSync(napi_env env, napi_callback_info info);
316     static napi_value PublishDeviceDiscoverySync(napi_env env, napi_callback_info info);
317     static napi_value UnPublishDeviceDiscoverySync(napi_env env, napi_callback_info info);
318     static napi_value AuthenticateDevice(napi_env env, napi_callback_info info);
319     static napi_value VerifyAuthInfo(napi_env env, napi_callback_info info);
320     static napi_value RequestCredential(napi_env env, napi_callback_info info);
321     static napi_value ImportCredential(napi_env env, napi_callback_info info);
322     static napi_value DeleteCredential(napi_env env, napi_callback_info info);
323     static napi_value JsOn(napi_env env, napi_callback_info info);
324     static napi_value JsOff(napi_env env, napi_callback_info info);
325     static napi_value GetAuthenticationParamSync(napi_env env, napi_callback_info info);
326     static void HandleCreateDmCallBack(const napi_env &env, AsyncCallbackInfo *asCallbackInfo);
327     static DeviceManagerNapi *GetDeviceManagerNapi(std::string &bundleName);
328     static void CreateDmCallback(napi_env env, std::string &bundleName, std::string &eventType);
329     static void CreateDmCallback(napi_env env, std::string &bundleName, std::string &eventType, std::string &extra);
330     static void ReleaseDmCallback(std::string &bundleName, std::string &eventType);
331     static void DeviceInfoToJsArray(const napi_env &env,
332                                     const std::vector<OHOS::DistributedHardware::DmDeviceInfo> &vecDevInfo,
333                                     const int32_t idx, napi_value &arrayResult);
334     static bool DmAuthParamDetection(const OHOS::DistributedHardware::DmAuthParam &authParam);
335     static void DmAuthParamToJsAuthParam(const napi_env &env, const OHOS::DistributedHardware::DmAuthParam &authParam,
336                                          napi_value &paramResult);
337     static void SetValueInt32(const napi_env &env, const std::string &fieldStr, const int32_t intValue,
338                               napi_value &result);
339     static void SetValueUtf8String(const napi_env &env, const std::string &fieldStr, const std::string &str,
340                                    napi_value &result);
341     static void JsObjectToString(const napi_env &env, const napi_value &object, const std::string &fieldStr, char *dest,
342                                  const int32_t destLen);
343     static void JsObjectToBool(const napi_env &env, const napi_value &object, const std::string &fieldStr,
344                                bool &fieldRef);
345     static void JsObjectToInt(const napi_env &env, const napi_value &object, const std::string &fieldStr,
346                               int32_t &fieldRef);
347     static std::string JsObjectToString(const napi_env &env, const napi_value &param);
348     static int32_t JsToDmSubscribeInfo(const napi_env &env, const napi_value &object,
349                                        OHOS::DistributedHardware::DmSubscribeInfo &info);
350     static void JsToDmPublishInfo(const napi_env &env, const napi_value &object,
351                                   OHOS::DistributedHardware::DmPublishInfo &info);
352     static void JsToDmDeviceInfo(const napi_env &env, const napi_value &object,
353                                  OHOS::DistributedHardware::DmDeviceInfo &info);
354     static void JsToDmExtra(const napi_env &env, const napi_value &object, std::string &extra, int32_t &authType);
355     static void JsToDmAuthInfo(const napi_env &env, const napi_value &object, std::string &extra);
356     static void JsToDmBuffer(const napi_env &env, const napi_value &object, const std::string &fieldStr,
357                              uint8_t **bufferPtr, int32_t &bufferLen);
358     static void JsToJsonObject(const napi_env &env, const napi_value &object, const std::string &fieldStr,
359                                nlohmann::json &jsonObj);
360     static void JsToDmTokenInfo(const napi_env &env, const napi_value &object, const std::string &fieldStr,
361                                 nlohmann::json &jsonObj);
362     static void JsToDmAuthExtra(const napi_env &env, const napi_value &param, nlohmann::json &jsonObj);
363     static void JsToDmDiscoveryExtra(const napi_env &env, const napi_value &object, std::string &extra);
364     static void DmDeviceInfotoJsDeviceInfo(const napi_env &env,
365                                            const OHOS::DistributedHardware::DmDeviceInfo &vecDevInfo,
366                                            napi_value &result);
367     static int32_t RegisterCredentialCallback(napi_env env, const std::string &pkgName);
368     static void AsyncAfterTaskCallback(napi_env env, napi_status status, void *data);
369     static void AsyncTaskCallback(napi_env env, void *data);
370     static void DeviceInfotoJsByNetworkId(const napi_env &env,
371                                           const OHOS::DistributedHardware::DmDeviceInfo &nidDevInfo,
372                                           napi_value &result);
373     void OnDeviceStateChange(DmNapiDevStateChangeAction action,
374                              const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo);
375     void OnDeviceFound(uint16_t subscribeId, const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo);
376     void OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason);
377     void OnPublishResult(int32_t publishId, int32_t publishResult);
378     void OnAuthResult(const std::string &deviceId, const std::string &token, int32_t status, int32_t reason);
379     void OnCredentialResult(int32_t &action, const std::string &credentialResult);
380     void OnVerifyResult(const std::string &deviceId, int32_t resultCode, int32_t flag);
381     void OnDmUiCall(const std::string &paramJson);
382 
383 private:
384     static void ReleasePublishCallback(std::string &bundleName);
385     static napi_value JsOffFrench(napi_env env, int32_t num, napi_value thisVar, napi_value argv[]);
386     static napi_value JsOnFrench(napi_env env, int32_t num, napi_value thisVar, napi_value argv[]);
387     static void CallAsyncWorkSync(napi_env env, DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo);
388     static void CallAsyncWork(napi_env env, DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo);
389     static void CallAsyncWorkSync(napi_env env, DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
390     static void CallAsyncWork(napi_env env, DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
391     static void CallCredentialAsyncWork(napi_env env, CredentialAsyncCallbackInfo *creAsyncCallbackInfo);
392     static void CallRequestCreInfoStatus(napi_env env, napi_status &status,
393                                          CredentialAsyncCallbackInfo *creAsyncCallbackInfo);
394     static void CallGetTrustedDeviceListStatusSync(napi_env env, napi_status &status,
395                                                    DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
396     static void CallGetTrustedDeviceListStatus(napi_env env, napi_status &status,
397                                                DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
398     static napi_value CallDeviceList(napi_env env, napi_callback_info info,
399                                      DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
400     static void CallGetLocalDeviceInfoSync(napi_env env, napi_status &status,
401                                            DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo);
402     static void CallGetLocalDeviceInfo(napi_env env, napi_status &status,
403                                        DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo);
404     static napi_value GetTrustedDeviceListPromise(napi_env env,
405                                                   DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
406     static napi_value GetTrustedDeviceListByFilter(napi_env env, napi_callback_info info,
407                                                     DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
408     static bool StartArgCheck(napi_env env, napi_value &argv, OHOS::DistributedHardware::DmSubscribeInfo &subInfo);
409     static void HandleCreateDmCallBackCompletedCB(napi_env env, napi_status status, void *data);
410     // get deviceInfo by networkId
411     static void CallGetDeviceInfo(napi_env env, NetworkIdAsyncCallbackInfo *networkIdAsyncCallbackInfo);
412     static void GetDeviceInfoCB(napi_env env, void *data);
413     static void CompleteGetDeviceInfoCB(napi_env env, napi_status status, void *data);
414     static void CallGetDeviceInfoPromise(napi_env env, napi_status &status,
415                                          NetworkIdAsyncCallbackInfo *networkIdAsyncCallbackInfo);
416     static void CallGetDeviceInfoCB(napi_env env, napi_status &status,
417                                     NetworkIdAsyncCallbackInfo *networkIdAsyncCallbackInfo);
418     static bool IsSystemApp();
419 private:
420     napi_env env_;
421     static thread_local napi_ref sConstructor_;
422     std::string bundleName_;
423     static std::mutex creMapLocks_;
424     static AuthAsyncCallbackInfo authAsyncCallbackInfo_;
425     static AuthAsyncCallbackInfo verifyAsyncCallbackInfo_;
426     static CredentialAsyncCallbackInfo creAsyncCallbackInfo_;
427 };
428 #endif // OHOS_DM_NATIVE_DEVICEMANAGER_JS_H
429