• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 
22 #include "device_manager_callback.h"
23 #include "dm_anonymous.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 "napi/native_api.h"
29 #include "napi/native_node_api.h"
30 #include "nlohmann/json.hpp"
31 #define DM_NAPI_BUF_LENGTH (256)
32 
33 struct AsyncCallbackInfo {
34     napi_env env = nullptr;
35     napi_async_work asyncWork = nullptr;
36 
37     char bundleName[DM_NAPI_BUF_LENGTH] = {0};
38     size_t bundleNameLen = 0;
39 
40     napi_ref callback = nullptr;
41     int32_t status = -1;
42 };
43 
44 struct DeviceInfoAsyncCallbackInfo {
45     napi_env env = nullptr;
46     napi_async_work asyncWork = nullptr;
47 
48     std::string bundleName;
49     size_t bundleNameLen = 0;
50     OHOS::DistributedHardware::DmDeviceInfo deviceInfo;
51     std::string extra;
52     // OHOS::DistributedHardware::DmFilterOptions filter;
53     napi_ref callback = nullptr;
54     napi_value thisVar = nullptr;
55     napi_deferred deferred = nullptr;
56     int32_t status = -1;
57 };
58 
59 struct DeviceInfoListAsyncCallbackInfo {
60     napi_env env = nullptr;
61     napi_async_work asyncWork = nullptr;
62 
63     std::string bundleName;
64     size_t bundleNameLen = 0;
65     std::vector<OHOS::DistributedHardware::DmDeviceInfo> devList;
66     std::string extra;
67     // OHOS::DistributedHardware::DmFilterOptions filter;
68     napi_ref callback = nullptr;
69     napi_value thisVar = nullptr;
70     napi_deferred deferred = nullptr;
71     int32_t status = -1;
72 };
73 
74 struct AuthAsyncCallbackInfo {
75     napi_env env = nullptr;
76 
77     char bundleName[DM_NAPI_BUF_LENGTH] = {0};
78     size_t bundleNameLen = 0;
79 
80     napi_ref callback = nullptr;
81     int32_t authType = -1;
82 };
83 
84 struct DmNapiStateJsCallback {
85     std::string bundleName_;
86     uint16_t subscribeId_;
87     int32_t reason_;
88     OHOS::DistributedHardware::DmDeviceInfo deviceInfo_;
89 
DmNapiStateJsCallbackDmNapiStateJsCallback90     DmNapiStateJsCallback(std::string bundleName, uint16_t subscribeId, int32_t reason,
91         OHOS::DistributedHardware::DmDeviceInfo deviceInfo)
92         : bundleName_(bundleName), subscribeId_(subscribeId), reason_(reason), deviceInfo_(deviceInfo) {}
93 };
94 
95 struct DmNapiAuthJsCallback {
96     std::string bundleName_;
97     std::string deviceId_;
98     std::string token_;
99     int32_t status_;
100     int32_t reason_;
101 
DmNapiAuthJsCallbackDmNapiAuthJsCallback102     DmNapiAuthJsCallback(std::string bundleName, std::string deviceId, std::string token, int32_t status,
103         int32_t reason)
104         : bundleName_(bundleName), deviceId_(deviceId), token_(token), status_(status), reason_(reason) {}
105 };
106 
107 struct DmNapiVerifyJsCallback {
108     std::string bundleName_;
109     std::string deviceId_;
110     int32_t resultCode_;
111     int32_t flag_;
112 
DmNapiVerifyJsCallbackDmNapiVerifyJsCallback113     DmNapiVerifyJsCallback(std::string bundleName, std::string deviceId, int32_t resultCode, int32_t flag)
114         : bundleName_(bundleName), deviceId_(deviceId), resultCode_(resultCode), flag_(flag) {}
115 };
116 
117 enum DmNapiDevStateChangeAction { ONLINE = 0, READY = 1, OFFLINE = 2, CHANGE = 3 };
118 
119 class DmNapiInitCallback : public OHOS::DistributedHardware::DmInitCallback {
120 public:
DmNapiInitCallback(napi_env env,std::string & bundleName)121     explicit DmNapiInitCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
122     {
123     }
~DmNapiInitCallback()124     virtual ~DmNapiInitCallback()
125     {
126     }
127     void OnRemoteDied() override;
128 
129 private:
130     napi_env env_;
131     std::string bundleName_;
132     std::unique_ptr<DmNapiStateJsCallback> jsCallback_;
133 };
134 
135 class DmNapiDeviceStateCallback : public OHOS::DistributedHardware::DeviceStateCallback {
136 public:
DmNapiDeviceStateCallback(napi_env env,std::string & bundleName)137     explicit DmNapiDeviceStateCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
138     {
139     }
~DmNapiDeviceStateCallback()140     virtual ~DmNapiDeviceStateCallback() {};
141     void OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
142     void OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
143     void OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
144     void OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
145 
146 private:
147     napi_env env_;
148     std::string bundleName_;
149     std::unique_ptr<DmNapiStateJsCallback> jsCallback_;
150 };
151 
152 class DmNapiDiscoveryCallback : public OHOS::DistributedHardware::DiscoveryCallback {
153 public:
DmNapiDiscoveryCallback(napi_env env,std::string & bundleName)154     explicit DmNapiDiscoveryCallback(napi_env env, std::string &bundleName)
155         : env_(env), refCount_(0), bundleName_(bundleName)
156     {
157     }
~DmNapiDiscoveryCallback()158     virtual ~DmNapiDiscoveryCallback() {};
159     void OnDeviceFound(uint16_t subscribeId, const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo) override;
160     void OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason) override;
161     void OnDiscoverySuccess(uint16_t subscribeId) override;
162     void IncreaseRefCount();
163     void DecreaseRefCount();
164     int32_t GetRefCount();
165 
166 private:
167     napi_env env_;
168     std::atomic<int32_t> refCount_;
169     std::string bundleName_;
170     std::unique_ptr<DmNapiStateJsCallback> jsCallback_;
171 };
172 
173 class DmNapiDeviceManagerUiCallback : public OHOS::DistributedHardware::DeviceManagerUiCallback {
174 public:
DmNapiDeviceManagerUiCallback(napi_env env,std::string & bundleName)175     explicit DmNapiDeviceManagerUiCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
176     {
177     }
~DmNapiDeviceManagerUiCallback()178     virtual ~DmNapiDeviceManagerUiCallback() {};
179     void OnCall(const std::string &paramJson) override;
180 
181 private:
182     napi_env env_;
183     std::string bundleName_;
184     std::unique_ptr<DmNapiAuthJsCallback> jsCallback_;
185 };
186 
187 class DmNapiAuthenticateCallback : public OHOS::DistributedHardware::AuthenticateCallback {
188 public:
DmNapiAuthenticateCallback(napi_env env,std::string & bundleName)189     explicit DmNapiAuthenticateCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
190     {
191     }
~DmNapiAuthenticateCallback()192     virtual ~DmNapiAuthenticateCallback() {};
193     void OnAuthResult(const std::string &deviceId, const std::string &token, int32_t status, int32_t reason) override;
194 
195 private:
196     napi_env env_;
197     std::string bundleName_;
198     std::unique_ptr<DmNapiAuthJsCallback> jsCallback_;
199 };
200 
201 class DmNapiVerifyAuthCallback : public OHOS::DistributedHardware::VerifyAuthCallback {
202 public:
DmNapiVerifyAuthCallback(napi_env env,std::string & bundleName)203     explicit DmNapiVerifyAuthCallback(napi_env env, std::string &bundleName) : env_(env), bundleName_(bundleName)
204     {
205     }
~DmNapiVerifyAuthCallback()206     virtual ~DmNapiVerifyAuthCallback() {};
207     void OnVerifyAuthResult(const std::string &deviceId, int32_t resultCode, int32_t flag) override;
208 
209 private:
210     napi_env env_;
211     std::string bundleName_;
212     std::unique_ptr<DmNapiVerifyJsCallback> jsCallback_;
213 };
214 
215 class DeviceManagerNapi : public DmNativeEvent {
216 public:
217     explicit DeviceManagerNapi(napi_env env, napi_value thisVar);
218     virtual ~DeviceManagerNapi();
219     static napi_value Init(napi_env env, napi_value exports);
220     static napi_value Constructor(napi_env env, napi_callback_info info);
221     static napi_value EnumTypeConstructor(napi_env env, napi_callback_info info);
222     static napi_value InitDeviceTypeEnum(napi_env env, napi_value exports);
223     static napi_value InitDeviceStateChangeActionEnum(napi_env env, napi_value exports);
224     static napi_value InitDiscoverModeEnum(napi_env env, napi_value exports);
225     static napi_value InitExchangeMediumEnum(napi_env env, napi_value exports);
226     static napi_value InitExchangeFreqEnum(napi_env env, napi_value exports);
227     static napi_value InitSubscribeCapEnum(napi_env env, napi_value exports);
228     static napi_value CreateDeviceManager(napi_env env, napi_callback_info info);
229     static napi_value ReleaseDeviceManager(napi_env env, napi_callback_info info);
230     static napi_value SetUserOperationSync(napi_env env, napi_callback_info info);
231     static napi_value GetTrustedDeviceListSync(napi_env env, napi_callback_info info);
232     static napi_value GetTrustedDeviceList(napi_env env, napi_callback_info info);
233     static napi_value GetLocalDeviceInfoSync(napi_env env, napi_callback_info info);
234     static napi_value GetLocalDeviceInfo(napi_env env, napi_callback_info info);
235     static napi_value UnAuthenticateDevice(napi_env env, napi_callback_info info);
236     static napi_value StartDeviceDiscoverSync(napi_env env, napi_callback_info info);
237     static napi_value StopDeviceDiscoverSync(napi_env env, napi_callback_info info);
238     static napi_value AuthenticateDevice(napi_env env, napi_callback_info info);
239     static napi_value VerifyAuthInfo(napi_env env, napi_callback_info info);
240     static napi_value JsOn(napi_env env, napi_callback_info info);
241     static napi_value JsOff(napi_env env, napi_callback_info info);
242     static napi_value GetAuthenticationParamSync(napi_env env, napi_callback_info info);
243     static void HandleCreateDmCallBack(const napi_env &env, AsyncCallbackInfo *asCallbackInfo);
244     static DeviceManagerNapi *GetDeviceManagerNapi(std::string &bundleName);
245     static void CreateDmCallback(napi_env env, std::string &bundleName, std::string &eventType);
246     static void CreateDmCallback(napi_env env, std::string &bundleName, std::string &eventType, std::string &extra);
247     static void ReleaseDmCallback(std::string &bundleName, std::string &eventType);
248     static void DeviceInfoToJsArray(const napi_env &env,
249                                     const std::vector<OHOS::DistributedHardware::DmDeviceInfo> &vecDevInfo,
250                                     const int32_t idx, napi_value &arrayResult);
251     static bool DmAuthParamDetection(const OHOS::DistributedHardware::DmAuthParam &authParam);
252     static void DmAuthParamToJsAuthParam(const napi_env &env, const OHOS::DistributedHardware::DmAuthParam &authParam,
253                                          napi_value &paramResult);
254     static void SetValueInt32(const napi_env &env, const std::string &fieldStr, const int32_t intValue,
255                               napi_value &result);
256     static void SetValueUtf8String(const napi_env &env, const std::string &fieldStr, const std::string &str,
257                                    napi_value &result);
258     static void JsObjectToString(const napi_env &env, const napi_value &object, const std::string &fieldStr, char *dest,
259                                  const int32_t destLen);
260     static void JsObjectToBool(const napi_env &env, const napi_value &object, const std::string &fieldStr,
261                                bool &fieldRef);
262     static void JsObjectToInt(const napi_env &env, const napi_value &object, const std::string &fieldStr,
263                               int &fieldRef);
264     static std::string JsObjectToString(const napi_env &env, const napi_value &object);
265     static int32_t JsToDmSubscribeInfo(const napi_env &env, const napi_value &object,
266                                        OHOS::DistributedHardware::DmSubscribeInfo &info);
267     static void JsToDmDeviceInfo(const napi_env &env, const napi_value &object,
268                                  OHOS::DistributedHardware::DmDeviceInfo &info);
269     static void JsToDmExtra(const napi_env &env, const napi_value &object, std::string &extra, int32_t &authType);
270     static void JsToDmAuthInfo(const napi_env &env, const napi_value &object, std::string &extra);
271     static void JsToDmBuffer(const napi_env &env, const napi_value &object, const std::string &fieldStr,
272                              uint8_t **bufferPtr, int32_t &bufferLen);
273     static void JsToJsonObject(const napi_env &env, const napi_value &object, const std::string &fieldStr,
274                                nlohmann::json &jsonObj);
275     static void JsToDmTokenInfo(const napi_env &env, const napi_value &object, const std::string &fieldStr,
276                                 nlohmann::json &jsonObj);
277     static void JsToDmAuthExtra(const napi_env &env, const napi_value &param, nlohmann::json &jsonObj);
278     static void DmDeviceInfotoJsDeviceInfo(const napi_env &env,
279                                            const OHOS::DistributedHardware::DmDeviceInfo &vecDevInfo,
280                                            napi_value &result);
281     void OnDeviceStateChange(DmNapiDevStateChangeAction action,
282                              const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo);
283     void OnDeviceFound(uint16_t subscribeId, const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo);
284     void OnDiscoveryFailed(uint16_t subscribeId, int32_t failedReason);
285     void OnAuthResult(const std::string &deviceId, const std::string &token, int32_t status, int32_t reason);
286     void OnVerifyResult(const std::string &deviceId, int32_t resultCode, int32_t flag);
287     void OnDmUiCall(const std::string &paramJson);
288 
289 private:
290     static napi_value JsOffFrench(napi_env env, int32_t num, napi_value thisVar, napi_value argv[]);
291     static napi_value JsOnFrench(napi_env env, int32_t num, napi_value thisVar, napi_value argv[]);
292     static void CallAsyncWorkSync(napi_env env, DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo);
293     static void CallAsyncWork(napi_env env, DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo);
294     static void CallAsyncWorkSync(napi_env env, DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
295     static void CallAsyncWork(napi_env env, DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
296     static void CallGetTrustedDeviceListStatusSync(napi_env env, napi_status &status,
297                                                    DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
298     static void CallGetTrustedDeviceListStatus(napi_env env, napi_status &status,
299                                                DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
300     static napi_value CallDeviceList(napi_env env, napi_callback_info info,
301                                      DeviceInfoListAsyncCallbackInfo *deviceInfoListAsyncCallbackInfo);
302     static void CallGetLocalDeviceInfoSync(napi_env env, napi_status &status,
303                                            DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo);
304     static void CallGetLocalDeviceInfo(napi_env env, napi_status &status,
305                                        DeviceInfoAsyncCallbackInfo *deviceInfoAsyncCallbackInfo);
306 
307 private:
308     napi_env env_;
309     napi_ref wrapper_;
310     static thread_local napi_ref sConstructor_;
311     std::string bundleName_;
312     static AuthAsyncCallbackInfo authAsyncCallbackInfo_;
313     static AuthAsyncCallbackInfo verifyAsyncCallbackInfo_;
314 };
315 
316 #endif // OHOS_DM_NATIVE_DEVICEMANAGER_JS_H
317