diff --git a/frameworks/js/napi/inc/asset_napi_common.h b/frameworks/js/napi/inc/asset_napi_common.h index 91674ae..522cc0f 100644 --- a/frameworks/js/napi/inc/asset_napi_common.h +++ b/frameworks/js/napi/inc/asset_napi_common.h @@ -28,6 +28,7 @@ namespace Security { namespace Asset { #define AS_USER_ARGS_NUM 2 +#define AS_USER_UPDATE_ARGS_NUM 2 #define UPDATE_ARGS_NUM 2 #define CHECK_RESULT_BREAK(env, ret) \ @@ -63,11 +64,14 @@ napi_value CreateJsMapArray(napi_env env, const AssetResultSet &resultSet); napi_status ParseParam(napi_env env, napi_callback_info info, std::vector &attrs); -napi_status ParseParam(napi_env env, napi_callback_info info, size_t expectArgNum, std::vector &attrs, - std::vector &updateAttrs, bool isUpdate, bool isApplintUserId); +napi_status ParseParam(napi_env env, napi_callback_info info, std::vector &attrs, + std::vector &updateAttrs, size_t expectArgNum); napi_value NapiEntry(napi_env env, napi_callback_info info, const char *funcName, napi_async_execute_callback execute, - size_t expectArgNum = 1, bool isUpdate = false, bool isSpecificUserId = false); + size_t expectArgNum = 1); + +napi_value NapiEntryAsUser(napi_env env, napi_callback_info info, const char *funcName, + napi_async_execute_callback execute, size_t expectArgNum = AS_USER_ARGS_NUM); } // Asset } // Security diff --git a/frameworks/js/napi/src/asset_napi.cpp b/frameworks/js/napi/src/asset_napi.cpp index e18cf90..e829e16 100755 --- a/frameworks/js/napi/src/asset_napi.cpp +++ b/frameworks/js/napi/src/asset_napi.cpp @@ -177,7 +177,7 @@ napi_value NapiAddAsUser(napi_env env, napi_callback_info info) AsyncContext *context = static_cast(data); context->result = AssetAdd(&context->attrs[0], context->attrs.size()); }; - return NapiEntry(env, info, __func__, execute, AS_USER_ARGS_NUM, false, true); + return NapiEntryAsUser(env, info, __func__, execute); } napi_value NapiRemove(napi_env env, napi_callback_info info) @@ -212,7 +212,7 @@ napi_value NapiRemoveAsUser(napi_env env, napi_callback_info info) AsyncContext *context = static_cast(data); context->result = AssetRemove(&context->attrs[0], context->attrs.size()); }; - return NapiEntry(env, info, __func__, execute, AS_USER_ARGS_NUM, false, true); + return NapiEntryAsUser(env, info, __func__, execute); } napi_value NapiUpdate(napi_env env, napi_callback_info info) @@ -223,7 +223,7 @@ napi_value NapiUpdate(napi_env env, napi_callback_info info) context->result = AssetUpdate(&context->attrs[0], context->attrs.size(), &context->updateAttrs[0], context->updateAttrs.size()); }; - return NapiEntry(env, info, __func__, execute, UPDATE_ARGS_NUM, true); + return NapiEntry(env, info, __func__, execute, UPDATE_ARGS_NUM); } napi_value NapiUpdateSync(napi_env env, napi_callback_info info) @@ -231,7 +231,7 @@ napi_value NapiUpdateSync(napi_env env, napi_callback_info info) std::vector attrs; std::vector updateAttrs; do { - if (ParseParam(env, info, UPDATE_ARGS_NUM, attrs, updateAttrs, true, false) != napi_ok) { + if (ParseParam(env, info, attrs, updateAttrs, UPDATE_ARGS_NUM) != napi_ok) { break; } int32_t result = AssetUpdate(&attrs[0], attrs.size(), &updateAttrs[0], updateAttrs.size()); @@ -250,7 +250,7 @@ napi_value NapiUpdateAsUser(napi_env env, napi_callback_info info) context->result = AssetUpdate(&context->attrs[0], context->attrs.size(), &context->updateAttrs[0], context->updateAttrs.size()); }; - return NapiEntry(env, info, __func__, execute, UPDATE_ARGS_NUM + 1, true, true); + return NapiEntryAsUser(env, info, __func__, execute, AS_USER_UPDATE_ARGS_NUM); } napi_value NapiPreQuery(napi_env env, napi_callback_info info) @@ -289,7 +289,7 @@ napi_value NapiPreQueryAsUser(napi_env env, napi_callback_info info) AsyncContext *context = static_cast(data); context->result = AssetPreQuery(&context->attrs[0], context->attrs.size(), &context->challenge); }; - return NapiEntry(env, info, __func__, execute, AS_USER_ARGS_NUM, false, true); + return NapiEntryAsUser(env, info, __func__, execute); } napi_value NapiQuery(napi_env env, napi_callback_info info) @@ -328,7 +328,7 @@ napi_value NapiQueryAsUser(napi_env env, napi_callback_info info) AsyncContext *context = static_cast(data); context->result = AssetQuery(&context->attrs[0], context->attrs.size(), &context->resultSet); }; - return NapiEntry(env, info, __func__, execute, AS_USER_ARGS_NUM, false, true); + return NapiEntryAsUser(env, info, __func__, execute); } napi_value NapiPostQuery(napi_env env, napi_callback_info info) @@ -363,7 +363,7 @@ napi_value NapiPostQueryAsUser(napi_env env, napi_callback_info info) AsyncContext *context = static_cast(data); context->result = AssetPostQuery(&context->attrs[0], context->attrs.size()); }; - return NapiEntry(env, info, __func__, execute, AS_USER_ARGS_NUM, false, true); + return NapiEntryAsUser(env, info, __func__, execute); } napi_value Register(napi_env env, napi_value exports) diff --git a/frameworks/js/napi/src/asset_napi_common.cpp b/frameworks/js/napi/src/asset_napi_common.cpp index 3e4d5eb..80e79c4 100644 --- a/frameworks/js/napi/src/asset_napi_common.cpp +++ b/frameworks/js/napi/src/asset_napi_common.cpp @@ -280,6 +280,28 @@ napi_status ParseMapParam(napi_env env, napi_value arg, std::vector & return napi_ok; } +napi_status ParseJsArgs(napi_env env, napi_callback_info info, napi_value *value, size_t valueSize) +{ + size_t argc = valueSize; + NAPI_CALL_RETURN_ERR(env, napi_get_cb_info(env, info, &argc, value, nullptr, nullptr)); + NAPI_THROW_RETURN_ERR(env, argc < valueSize, SEC_ASSET_INVALID_ARGUMENT, + "The number of arguments is insufficient."); + return napi_ok; +} + +napi_status ParseJsUserId(napi_env env, napi_value arg, std::vector &attrs) +{ + napi_valuetype type = napi_undefined; + NAPI_CALL_RETURN_ERR(env, napi_typeof(env, arg, &type)); + NAPI_THROW_RETURN_ERR(env, type != napi_number, SEC_ASSET_INVALID_ARGUMENT, "The type of userId should be number."); + + AssetAttr param = { 0 }; + param.tag = SEC_ASSET_TAG_USER_ID; + NAPI_CALL_RETURN_ERR(env, napi_get_value_uint32(env, arg, ¶m.value.u32)); + attrs.push_back(param); + return napi_ok; +} + } // anonymous namespace void FreeAssetAttrs(std::vector &attrs) @@ -343,40 +365,25 @@ napi_value CreateJsUint8Array(napi_env env, const AssetBlob &blob) napi_status ParseParam(napi_env env, napi_callback_info info, std::vector &attrs) { std::vector updateAttrs; - return ParseParam(env, info, NORMAL_ARGS_NUM, attrs, updateAttrs, false, false); + return ParseParam(env, info, attrs, updateAttrs, NORMAL_ARGS_NUM); } -napi_status ParseParam(napi_env env, napi_callback_info info, size_t expectArgNum, std::vector &attrs, - std::vector &updateAttrs, bool isUpdate = false, bool isSpecificUserId = false) +napi_status ParseParam(napi_env env, napi_callback_info info, std::vector &attrs, + std::vector &updateAttrs, size_t expectArgNum) { napi_value argv[MAX_ARGS_NUM] = { 0 }; - size_t argc = expectArgNum; - NAPI_CALL_RETURN_ERR(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr)); - NAPI_THROW_RETURN_ERR(env, argc < expectArgNum, SEC_ASSET_INVALID_ARGUMENT, - "The number of arguments is insufficient."); - size_t index = 0; - - napi_value specificUserId = nullptr; - // get SpecificUserId - if (isSpecificUserId) { - NAPI_CALL_RETURN_ERR(env, napi_get_element(env, argv[index++], 0, &specificUserId)); + napi_status ret = ParseJsArgs(env, info, argv, expectArgNum); + if (ret != napi_ok) { + return ret; } - napi_status ret = ParseMapParam(env, argv[index++], attrs); + size_t index = 0; + ret = ParseMapParam(env, argv[index++], attrs); if (ret != napi_ok) { LOGE("Parse first map parameter failed."); return ret; } - - // add SpecificUserId into map - if (isSpecificUserId) { - AssetAttr param = { 0 }; - param.tag = SEC_ASSET_TAG_USER_ID; - NAPI_CALL_RETURN_ERR(env, napi_get_value_uint32(env, specificUserId, ¶m.value.u32)); - attrs.push_back(param); - } - - if (isUpdate) { + if (expectArgNum == UPDATE_ARGS_NUM) { ret = ParseMapParam(env, argv[index++], updateAttrs); if (ret != napi_ok) { LOGE("Parse second map parameter failed."); @@ -387,17 +394,72 @@ napi_status ParseParam(napi_env env, napi_callback_info info, size_t expectArgNu } napi_value NapiEntry(napi_env env, napi_callback_info info, const char *funcName, napi_async_execute_callback execute, - size_t expectArgNum, bool isUpdate, bool isSpecificUserId) + size_t expectArgNum) { AsyncContext *context = CreateAsyncContext(); NAPI_THROW(env, context == nullptr, SEC_ASSET_OUT_OF_MEMORY, "Unable to allocate memory for AsyncContext."); do { - if (ParseParam( - env, info, expectArgNum, context->attrs, context->updateAttrs, isUpdate, isSpecificUserId) != napi_ok) { + napi_value argv[MAX_ARGS_NUM] = { 0 }; + if (ParseJsArgs(env, info, argv, expectArgNum) != napi_ok) { break; } + size_t index = 0; + napi_status ret = ParseMapParam(env, argv[index++], context->attrs); + if (ret != napi_ok) { + LOGE("Parse first map parameter failed."); + break; + } + if (expectArgNum == UPDATE_ARGS_NUM) { + ret = ParseMapParam(env, argv[index++], context->updateAttrs); + if (ret != napi_ok) { + LOGE("Parse second map parameter failed."); + break; + } + } + + napi_value promise = CreateAsyncWork(env, context, funcName, execute); + if (promise == nullptr) { + LOGE("Create async work failed."); + break; + } + return promise; + } while (0); + DestroyAsyncContext(env, context); + return nullptr; +} + +napi_value NapiEntryAsUser(napi_env env, napi_callback_info info, const char *funcName, + napi_async_execute_callback execute, size_t expectArgNum) +{ + AsyncContext *context = CreateAsyncContext(); + NAPI_THROW(env, context == nullptr, SEC_ASSET_OUT_OF_MEMORY, "Unable to allocate memory for AsyncContext."); + + do { + napi_value argv[MAX_ARGS_NUM] = { 0 }; + if (ParseJsArgs(env, info, argv, expectArgNum) != napi_ok) { + break; + } + + size_t index = 0; + if (ParseJsUserId(env, argv[index++], context->attrs) != napi_ok) { + break; + } + + napi_status ret = ParseMapParam(env, argv[index++], context->attrs); + if (ret != napi_ok) { + LOGE("Parse first map parameter failed."); + break; + } + if (expectArgNum == AS_USER_UPDATE_ARGS_NUM) { + ret = ParseMapParam(env, argv[index++], context->updateAttrs); + if (ret != napi_ok) { + LOGE("Parse second map parameter failed."); + break; + } + } + napi_value promise = CreateAsyncWork(env, context, funcName, execute); if (promise == nullptr) { LOGE("Create async work failed.");