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