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