modify napi

Signed-off-by: 尹耀德 <yinyaode1@huawei.com>
Change-Id: I4490611dff7b298d41da1771374b91771aa623a0
This commit is contained in:
尹耀德 2024-04-17 11:14:59 +08:00
parent 3a4dd47eda
commit 7d47ce99f4
3 changed files with 104 additions and 38 deletions

View File

@ -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<AssetAttr> &attrs);
napi_status ParseParam(napi_env env, napi_callback_info info, size_t expectArgNum, std::vector<AssetAttr> &attrs,
std::vector<AssetAttr> &updateAttrs, bool isUpdate, bool isApplintUserId);
napi_status ParseParam(napi_env env, napi_callback_info info, std::vector<AssetAttr> &attrs,
std::vector<AssetAttr> &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

View File

@ -177,7 +177,7 @@ napi_value NapiAddAsUser(napi_env env, napi_callback_info info)
AsyncContext *context = static_cast<AsyncContext *>(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<AsyncContext *>(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<AssetAttr> attrs;
std::vector<AssetAttr> 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<AsyncContext *>(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<AsyncContext *>(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<AsyncContext *>(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)

View File

@ -280,6 +280,28 @@ napi_status ParseMapParam(napi_env env, napi_value arg, std::vector<AssetAttr> &
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<AssetAttr> &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, &param.value.u32));
attrs.push_back(param);
return napi_ok;
}
} // anonymous namespace
void FreeAssetAttrs(std::vector<AssetAttr> &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<AssetAttr> &attrs)
{
std::vector<AssetAttr> 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<AssetAttr> &attrs,
std::vector<AssetAttr> &updateAttrs, bool isUpdate = false, bool isSpecificUserId = false)
napi_status ParseParam(napi_env env, napi_callback_info info, std::vector<AssetAttr> &attrs,
std::vector<AssetAttr> &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, &param.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.");