diff --git a/interfaces/kits/js/include/config_policy_napi.h b/interfaces/kits/js/include/config_policy_napi.h index edc0f9edb8e522091d1a49a124b434e7689ae8e0..38248ffb67609282e6c53813ea8b43d005f7383c 100644 --- a/interfaces/kits/js/include/config_policy_napi.h +++ b/interfaces/kits/js/include/config_policy_napi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -33,6 +33,8 @@ struct ConfigAsyncContext { CreateNapiValue createValueFunc_; std::string relPath_; + int32_t followMode_; + std::string extra_; std::string pathValue_; std::vector paths_; }; @@ -46,18 +48,27 @@ public: private: static napi_value NAPIGetOneCfgFile(napi_env env, napi_callback_info info); static napi_value NAPIGetCfgFiles(napi_env env, napi_callback_info info); + static napi_value NAPIGetOneCfgFileEx(napi_env env, napi_callback_info info); + static napi_value NAPIGetCfgFilesEx(napi_env env, napi_callback_info info); static napi_value NAPIGetCfgDirList(napi_env env, napi_callback_info info); static napi_value CreateUndefined(napi_env env); static std::string GetStringFromNAPI(napi_env env, napi_value value); static napi_value HandleAsyncWork(napi_env env, ConfigAsyncContext *context, std::string workName, napi_async_execute_callback execute, napi_async_complete_callback complete); + static napi_value GetOneCfgFileOrAllCfgFilesEx(napi_env env, napi_callback_info info, + const std::string &workName, napi_async_execute_callback execute); static bool MatchValueType(napi_env env, napi_value value, napi_valuetype targetType); static void NativeGetOneCfgFile(napi_env env, void *data); static void NativeGetCfgFiles(napi_env env, void *data); + static void NativeGetOneCfgFileEx(napi_env env, void *data); + static void NativeGetCfgFilesEx(napi_env env, void *data); static void NativeGetCfgDirList(napi_env env, void *data); static void NativeCallbackComplete(napi_env env, napi_status status, void *data); static napi_value ParseRelPath(napi_env env, std::string ¶m, napi_value args); + static napi_value ParseFollowMode(napi_env env, int32_t ¶m, napi_value args); + static napi_value ParseExtra(napi_env env, std::string ¶m, napi_value args); static void CreateArraysValueFunc(ConfigAsyncContext &context); + static void CreateFollowXModeObject(napi_env env, napi_value value); static napi_value ThrowNapiError(napi_env env, int32_t errCode, const std::string &errMessage); }; } // namespace ConfigPolicy diff --git a/interfaces/kits/js/src/config_policy_napi.cpp b/interfaces/kits/js/src/config_policy_napi.cpp index 60b371cb86cdefcd75834b98a4c78c6ff4e6da5a..4b3c87627f2ce69724b528dc6f2eeda531dac0d1 100644 --- a/interfaces/kits/js/src/config_policy_napi.cpp +++ b/interfaces/kits/js/src/config_policy_napi.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -28,8 +28,12 @@ using namespace OHOS::HiviewDFX; static constexpr size_t ARGS_SIZE_ONE = 1; static constexpr size_t ARGS_SIZE_TWO = 2; +static constexpr size_t ARGS_SIZE_THREE = 3; +static constexpr size_t ARGS_SIZE_FOUR = 4; static constexpr int32_t ARR_INDEX_ZERO = 0; static constexpr int32_t ARR_INDEX_ONE = 1; +static constexpr int32_t ARR_INDEX_TWO = 2; +static constexpr int32_t ARR_INDEX_THREE = 3; static constexpr int32_t NAPI_RETURN_ZERO = 0; static constexpr int32_t NAPI_RETURN_ONE = 1; // Param Error Code @@ -38,15 +42,47 @@ static constexpr HiLogLabel LABEL = { LOG_CORE, 0xD001E00, "ConfigPolicyJs" }; napi_value ConfigPolicyNapi::Init(napi_env env, napi_value exports) { + napi_value nFollowXMode = nullptr; + NAPI_CALL(env, napi_create_object(env, &nFollowXMode)); + CreateFollowXModeObject(env, nFollowXMode); + napi_property_descriptor property[] = { DECLARE_NAPI_FUNCTION("getOneCfgFile", ConfigPolicyNapi::NAPIGetOneCfgFile), DECLARE_NAPI_FUNCTION("getCfgFiles", ConfigPolicyNapi::NAPIGetCfgFiles), - DECLARE_NAPI_FUNCTION("getCfgDirList", ConfigPolicyNapi::NAPIGetCfgDirList) + DECLARE_NAPI_FUNCTION("getOneCfgFileEx", ConfigPolicyNapi::NAPIGetOneCfgFileEx), + DECLARE_NAPI_FUNCTION("getCfgFilesEx", ConfigPolicyNapi::NAPIGetCfgFilesEx), + DECLARE_NAPI_FUNCTION("getCfgDirList", ConfigPolicyNapi::NAPIGetCfgDirList), + + DECLARE_NAPI_PROPERTY("FollowXMode", nFollowXMode) }; NAPI_CALL(env, napi_define_properties(env, exports, sizeof(property) / sizeof(property[0]), property)); return exports; } +void ConfigPolicyNapi::CreateFollowXModeObject(napi_env env, napi_value value) +{ + napi_value nDefaultMode; + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast(FOLLOWX_MODE_DEFAULT), &nDefaultMode)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "DEFAULT", nDefaultMode)); + napi_value nNoFollowMode; + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast(FOLLOWX_MODE_NO_FOLLOW), &nNoFollowMode)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "NO_FOLLOW", nNoFollowMode)); + napi_value nSimDefaultMode; + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast(FOLLOWX_MODE_SIM_DEFAULT), + &nSimDefaultMode)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SIM_DEFAULT", nSimDefaultMode)); + napi_value nSim1Mode; + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast(FOLLOWX_MODE_SIM_1), &nSim1Mode)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SIM_1", nSim1Mode)); + napi_value nSim2Mode; + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast(FOLLOWX_MODE_SIM_2), &nSim2Mode)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "SIM_2", nSim2Mode)); + napi_value nUserDefineMode; + NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, static_cast(FOLLOWX_MODE_USER_DEFINE), + &nUserDefineMode)); + NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, value, "USER_DEFINE", nUserDefineMode)); +} + napi_value ConfigPolicyNapi::NAPIGetOneCfgFile(napi_env env, napi_callback_info info) { size_t argc = ARGS_SIZE_TWO; @@ -59,7 +95,9 @@ napi_value ConfigPolicyNapi::NAPIGetOneCfgFile(napi_env env, napi_callback_info } auto asyncContext = std::make_unique(); - ParseRelPath(env, asyncContext->relPath_, argv[ARR_INDEX_ZERO]); + if (ParseRelPath(env, asyncContext->relPath_, argv[ARR_INDEX_ZERO]) == nullptr) { + return nullptr; + } if (argc == ARGS_SIZE_TWO) { bool matchFlag = MatchValueType(env, argv[ARR_INDEX_ONE], napi_function); if (!matchFlag) { @@ -71,6 +109,61 @@ napi_value ConfigPolicyNapi::NAPIGetOneCfgFile(napi_env env, napi_callback_info NativeCallbackComplete); } +napi_value ConfigPolicyNapi::GetOneCfgFileOrAllCfgFilesEx(napi_env env, napi_callback_info info, + const std::string &workName, napi_async_execute_callback execute) +{ + size_t argc = ARGS_SIZE_FOUR; + napi_value argv[ARGS_SIZE_FOUR] = {nullptr}; + napi_value thisVar = nullptr; + void *data = nullptr; + napi_get_cb_info(env, info, &argc, argv, &thisVar, &data); + if (argc < ARGS_SIZE_TWO) { + return ThrowNapiError(env, PARAM_ERROR, "Parameter error. The number of parameters is incorrect."); + } + + auto asyncContext = std::make_unique(); + if (ParseRelPath(env, asyncContext->relPath_, argv[ARR_INDEX_ZERO]) == nullptr || + ParseFollowMode(env, asyncContext->followMode_, argv[ARR_INDEX_ONE]) == nullptr) { + return nullptr; + } + if (argc == ARGS_SIZE_TWO) { + if (asyncContext->followMode_ == FOLLOWX_MODE_USER_DEFINE) { + return ThrowNapiError(env, PARAM_ERROR, + "Parameter error. The followMode is USER_DEFINE, extra must be set."); + } + } + if (argc == ARGS_SIZE_THREE) { + bool matchFlag = MatchValueType(env, argv[ARR_INDEX_TWO], napi_function); + if (matchFlag) { + if (asyncContext->followMode_ == FOLLOWX_MODE_USER_DEFINE) { + return ThrowNapiError(env, PARAM_ERROR, + "Parameter error. The followMode is USER_DEFINE, extra must be set."); + } + napi_create_reference(env, argv[ARR_INDEX_TWO], NAPI_RETURN_ONE, &asyncContext->callbackRef_); + } + if (ParseExtra(env, asyncContext->extra_, argv[ARR_INDEX_TWO]) == nullptr) { + return nullptr; + } + } + if (argc >= ARGS_SIZE_FOUR) { + if (ParseExtra(env, asyncContext->extra_, argv[ARR_INDEX_TWO]) == nullptr) { + return nullptr; + } + bool matchFlag = MatchValueType(env, argv[ARR_INDEX_THREE], napi_function); + if (!matchFlag) { + return ThrowNapiError(env, PARAM_ERROR, "Parameter error. The fourth parameter must be Callback."); + } + napi_create_reference(env, argv[ARR_INDEX_THREE], NAPI_RETURN_ONE, &asyncContext->callbackRef_); + } + + return HandleAsyncWork(env, asyncContext.release(), workName, execute, NativeCallbackComplete); +} + +napi_value ConfigPolicyNapi::NAPIGetOneCfgFileEx(napi_env env, napi_callback_info info) +{ + return GetOneCfgFileOrAllCfgFilesEx(env, info, "NAPIGetOneCfgFileEx", NativeGetOneCfgFileEx); +} + napi_value ConfigPolicyNapi::NAPIGetCfgFiles(napi_env env, napi_callback_info info) { size_t argc = ARGS_SIZE_TWO; @@ -83,7 +176,9 @@ napi_value ConfigPolicyNapi::NAPIGetCfgFiles(napi_env env, napi_callback_info in } auto asyncContext = std::make_unique(); - ParseRelPath(env, asyncContext->relPath_, argv[ARR_INDEX_ZERO]); + if (ParseRelPath(env, asyncContext->relPath_, argv[ARR_INDEX_ZERO]) == nullptr) { + return nullptr; + } if (argc == ARGS_SIZE_TWO) { bool matchFlag = MatchValueType(env, argv[ARR_INDEX_ONE], napi_function); if (!matchFlag) { @@ -94,6 +189,11 @@ napi_value ConfigPolicyNapi::NAPIGetCfgFiles(napi_env env, napi_callback_info in return HandleAsyncWork(env, asyncContext.release(), "NAPIGetCfgFiles", NativeGetCfgFiles, NativeCallbackComplete); } +napi_value ConfigPolicyNapi::NAPIGetCfgFilesEx(napi_env env, napi_callback_info info) +{ + return GetOneCfgFileOrAllCfgFilesEx(env, info, "NAPIGetCfgFilesEx", NativeGetCfgFilesEx); +} + napi_value ConfigPolicyNapi::NAPIGetCfgDirList(napi_env env, napi_callback_info info) { size_t argc = ARGS_SIZE_ONE; @@ -187,6 +287,25 @@ void ConfigPolicyNapi::NativeGetOneCfgFile(napi_env env, void *data) }; } +void ConfigPolicyNapi::NativeGetOneCfgFileEx(napi_env env, void *data) +{ + if (data == nullptr) { + HiLog::Error(LABEL, "data is nullptr"); + return; + } + ConfigAsyncContext *asyncCallbackInfo = static_cast(data); + char outBuf[MAX_PATH_LEN] = {0}; + GetOneCfgFileEx(asyncCallbackInfo->relPath_.c_str(), outBuf, MAX_PATH_LEN, + asyncCallbackInfo->followMode_, asyncCallbackInfo->extra_.c_str()); + asyncCallbackInfo->pathValue_ = std::string(outBuf); + ReportConfigPolicyEvent(ReportType::CONFIG_POLICY_EVENT, "getOneCfgFileEx", ""); + asyncCallbackInfo->createValueFunc_ = [](napi_env env, ConfigAsyncContext &context) -> napi_value { + napi_value result; + NAPI_CALL(env, napi_create_string_utf8(env, context.pathValue_.c_str(), NAPI_AUTO_LENGTH, &result)); + return result; + }; +} + void ConfigPolicyNapi::NativeGetCfgFiles(napi_env env, void *data) { if (data == nullptr) { @@ -206,6 +325,26 @@ void ConfigPolicyNapi::NativeGetCfgFiles(napi_env env, void *data) ReportConfigPolicyEvent(ReportType::CONFIG_POLICY_EVENT, "getCfgFiles", ""); } +void ConfigPolicyNapi::NativeGetCfgFilesEx(napi_env env, void *data) +{ + if (data == nullptr) { + HiLog::Error(LABEL, "data is nullptr"); + return; + } + + ConfigAsyncContext *asyncCallbackInfo = static_cast(data); + CfgFiles *cfgFiles = GetCfgFilesEx(asyncCallbackInfo->relPath_.c_str(), + asyncCallbackInfo->followMode_, asyncCallbackInfo->extra_.c_str()); + for (size_t i = 0; i < MAX_CFG_POLICY_DIRS_CNT; i++) { + if (cfgFiles != nullptr && cfgFiles->paths[i] != nullptr) { + asyncCallbackInfo->paths_.push_back(cfgFiles->paths[i]); + } + } + FreeCfgFiles(cfgFiles); + CreateArraysValueFunc(*asyncCallbackInfo); + ReportConfigPolicyEvent(ReportType::CONFIG_POLICY_EVENT, "getCfgFilesEx", ""); +} + void ConfigPolicyNapi::NativeGetCfgDirList(napi_env env, void *data) { if (data == nullptr) { @@ -281,6 +420,52 @@ napi_value ConfigPolicyNapi::ParseRelPath(napi_env env, std::string ¶m, napi return result; } +napi_value ConfigPolicyNapi::ParseExtra(napi_env env, std::string ¶m, napi_value args) +{ + bool matchFlag = MatchValueType(env, args, napi_string); + if (!matchFlag) { + return ThrowNapiError(env, PARAM_ERROR, "Parameter error. The type of extra must be string."); + } + param = GetStringFromNAPI(env, args); + napi_value result = nullptr; + NAPI_CALL(env, napi_create_int32(env, NAPI_RETURN_ONE, &result)); + return result; +} + +napi_value ConfigPolicyNapi::ParseFollowMode(napi_env env, int32_t ¶m, napi_value args) +{ + bool matchFlag = MatchValueType(env, args, napi_number); + if (!matchFlag) { + return ThrowNapiError(env, PARAM_ERROR, "Parameter error. The type of followMode must be number."); + } + if (napi_get_value_int32(env, args, ¶m) != napi_ok) { + HiLog::Error(LABEL, "can not get int32 value."); + return ThrowNapiError(env, PARAM_ERROR, "Parameter error. Get the value of followMode failed."); + } + + switch (param) { + case FOLLOWX_MODE_DEFAULT: + [[fallthrough]]; + case FOLLOWX_MODE_NO_FOLLOW: + [[fallthrough]]; + case FOLLOWX_MODE_SIM_DEFAULT: + [[fallthrough]]; + case FOLLOWX_MODE_SIM_1: + [[fallthrough]]; + case FOLLOWX_MODE_SIM_2: + [[fallthrough]]; + case FOLLOWX_MODE_USER_DEFINE: + break; + default: + return ThrowNapiError(env, PARAM_ERROR, + "Parameter error. The value of followMode should be in the enumeration value of FollowXMode."); + } + + napi_value result = nullptr; + NAPI_CALL(env, napi_create_int32(env, NAPI_RETURN_ONE, &result)); + return result; +} + napi_value ConfigPolicyNapi::ThrowNapiError(napi_env env, int32_t errCode, const std::string &errMessage) { napi_throw_error(env, std::to_string(errCode).c_str(), errMessage.c_str());