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