From f07c93cb66f6cce0a58b99d22f843dc1ec643b29 Mon Sep 17 00:00:00 2001 From: wangkun Date: Thu, 26 Aug 2021 17:43:46 +0800 Subject: [PATCH] fixed some js interface bugs Signed-off-by: wangkun --- .../distributeddata/src/async_call.cpp | 15 +++--- .../distributeddata/src/js_util.cpp | 44 +++++++++++------ .../distributeddata/src/kv_manager.cpp | 49 +++++++++---------- .../distributeddata/src/single_kv_store.cpp | 10 ++-- 4 files changed, 67 insertions(+), 51 deletions(-) diff --git a/frameworks/jskitsimpl/distributeddata/src/async_call.cpp b/frameworks/jskitsimpl/distributeddata/src/async_call.cpp index 4682e1dea..06b1d91df 100644 --- a/frameworks/jskitsimpl/distributeddata/src/async_call.cpp +++ b/frameworks/jskitsimpl/distributeddata/src/async_call.cpp @@ -25,11 +25,11 @@ AsyncCall::AsyncCall(napi_env env, napi_callback_info info, std::shared_ptr= 0 && pos < argc) { napi_valuetype valueType = napi_undefined; napi_typeof(env, argv[pos], &valueType); if (valueType == napi_function) { @@ -37,8 +37,8 @@ AsyncCall::AsyncCall(napi_env env, napi_callback_info info, std::shared_ptrctx = std::move(context); - NAPI_CALL_RETURN_VOID(env, (*context_->ctx)(env, argc, argv, self)); } AsyncCall::~AsyncCall() @@ -52,7 +52,8 @@ AsyncCall::~AsyncCall() napi_value AsyncCall::Call(napi_env env, Context::ExecAction exec) { - if (context_ == nullptr) { + if ((context_ == nullptr) || (context_->ctx == nullptr)) { + ZLOGD("context_ or context_->ctx is null"); return nullptr; } ZLOGD("async call exec"); @@ -76,10 +77,10 @@ napi_value AsyncCall::Call(napi_env env, Context::ExecAction exec) napi_value AsyncCall::SyncCall(napi_env env, AsyncCall::Context::ExecAction exec) { - if (context_ == nullptr) { + if ((context_ == nullptr) || (context_->ctx == nullptr)) { + ZLOGD("context_ or context_->ctx is null"); return nullptr; } - context_->ctx->exec_ = std::move(exec); napi_value promise = nullptr; if (context_->callback == nullptr) { diff --git a/frameworks/jskitsimpl/distributeddata/src/js_util.cpp b/frameworks/jskitsimpl/distributeddata/src/js_util.cpp index 179cc645a..921a8858a 100644 --- a/frameworks/jskitsimpl/distributeddata/src/js_util.cpp +++ b/frameworks/jskitsimpl/distributeddata/src/js_util.cpp @@ -60,9 +60,21 @@ DistributedKv::Options JSUtil::Convert2Options(napi_env env, napi_value jsOption std::string JSUtil::Convert2String(napi_env env, napi_value jsString) { - char *buf = new char[JSUtil::MAX_LEN + 1]; + size_t maxLen = JSUtil::MAX_LEN; + napi_status status = napi_get_value_string_utf8(env, jsString, NULL, 0, &maxLen); + if (status != napi_ok) { + GET_AND_THROW_LAST_ERROR((env)); + maxLen = JSUtil::MAX_LEN; + } + if (maxLen <= 0) { + return std::string(); + } + char *buf = new char[maxLen + 1]; + if (buf == nullptr) { + return std::string(); + } size_t len = 0; - auto status = napi_get_value_string_utf8(env, jsString, buf, JSUtil::MAX_LEN, &len); + status = napi_get_value_string_utf8(env, jsString, buf, maxLen, &len); if (status != napi_ok) { GET_AND_THROW_LAST_ERROR((env)); } @@ -190,20 +202,18 @@ std::vector JSUtil::ConvertUint8Array2Vector(napi_env env, napi_value j } napi_typedarray_type type; - size_t length; - napi_value buffer; - size_t offset; - NAPI_CALL_BASE(env, napi_get_typedarray_info(env, jsValue, &type, &length, nullptr, &buffer, &offset), { INVALID }); - if (type != napi_uint8_array) { + size_t length = 0; + napi_value buffer = nullptr; + size_t offset = 0; + uint8_t *data = nullptr; + NAPI_CALL_BASE(env, napi_get_typedarray_info(env, jsValue, &type, + &length, reinterpret_cast(&data), &buffer, &offset), { INVALID }); + if (type != napi_uint8_array || length == 0 || data == nullptr) { return {INVALID}; } - uint8_t *data; - size_t total; - NAPI_CALL_BASE(env, napi_get_arraybuffer_info(env, buffer, reinterpret_cast(&data), &total), { INVALID }); - length = std::min(length, total - offset); std::vector result(sizeof(uint8_t) + length); result[TYPE_POS] = BYTE_ARRAY; - memcpy_s(result.data() + DATA_POS, result.size() - DATA_POS, &data[offset], length); + memcpy_s(result.data() + DATA_POS, result.size() - DATA_POS, data, length); return result; } @@ -227,8 +237,14 @@ std::vector JSUtil::ConvertNumber2Vector(napi_env env, napi_value jsVal std::vector result(sizeof(uint8_t) + sizeof(double)); result[TYPE_POS] = DOUBLE; uint8_t byteValue[MAX_NUMBER_BYTES]; - memcpy_s(byteValue, MAX_NUMBER_BYTES, &value, sizeof(double)); - memcpy_s(result.data() + DATA_POS, sizeof(double), byteValue, sizeof(byteValue)); + errno_t err = memcpy_s(byteValue, MAX_NUMBER_BYTES, &value, sizeof(double)); + if (err != EOK) { + return {INVALID}; + } + err = memcpy_s(result.data() + DATA_POS, sizeof(double), byteValue, sizeof(byteValue)); + if (err != EOK) { + return {INVALID}; + } return result; } diff --git a/frameworks/jskitsimpl/distributeddata/src/kv_manager.cpp b/frameworks/jskitsimpl/distributeddata/src/kv_manager.cpp index 4609114c4..8ee32dd69 100644 --- a/frameworks/jskitsimpl/distributeddata/src/kv_manager.cpp +++ b/frameworks/jskitsimpl/distributeddata/src/kv_manager.cpp @@ -28,31 +28,34 @@ napi_ref KVManager::ctor_ = nullptr; napi_value KVManager::CreateKVManager(napi_env env, napi_callback_info info) { ZLOGD("get kv manager!"); - // function createKVManager(config: KVManagerConfig, callback: AsyncCallback): void; - // AsyncCallback at position 1 struct ContextInfo { napi_ref ref = nullptr; - napi_env env = nullptr; - ~ContextInfo() - { - if (env != nullptr) { - napi_delete_reference(env, ref); - } - } }; auto ctxInfo = std::make_shared(); auto input = [ctxInfo](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status { - ZLOGD("CreateKVManager parser to native params %{public}d!", argc); - NAPI_ASSERT_BASE(env, 0 < argc && argc <= 2, " should 1 or 2 parameters!", napi_invalid_arg); + ZLOGD("CreateKVManager parser to native params %{public}d!", static_cast(argc)); + NAPI_ASSERT_BASE(env, (argc > 0) && (argc <= 2), " should 1 or 2 parameters!", napi_invalid_arg); + napi_value bundle = nullptr; + napi_status retStatus = napi_get_named_property(env, argv[0], "bundleName", &bundle); + NAPI_ASSERT_BASE(env, + ((retStatus == napi_ok) && (bundle != nullptr) && !(JSUtil::Convert2String(env, bundle).empty())), + " bundleName is null!", napi_invalid_arg); napi_value kvManger = nullptr; napi_status status = napi_new_instance(env, GetCtor(env), argc, argv, &kvManger); + if ((kvManger == nullptr) || (status != napi_ok)) { + return napi_generic_failure; + } napi_create_reference(env, kvManger, 1, &(ctxInfo->ref)); - return status; + return napi_ok; }; auto output = [ctxInfo](napi_env env, napi_value *result) -> napi_status { - return napi_get_reference_value(env, ctxInfo->ref, result); + napi_status status = napi_get_reference_value(env, ctxInfo->ref, result); + napi_delete_reference(env, ctxInfo->ref); + return status; }; auto context = std::make_shared(input, output); + // function createKVManager(config: KVManagerConfig, callback: AsyncCallback): void; + // AsyncCallback at position 1 AsyncCall asyncCall(env, info, context, 1); return asyncCall.Call(env); } @@ -60,25 +63,16 @@ napi_value KVManager::CreateKVManager(napi_env env, napi_callback_info info) napi_value KVManager::GetKVStore(napi_env env, napi_callback_info info) { ZLOGD("get kv store!"); - // getKVStore(storeId: string, options: Options, callback: AsyncCallback): void; - // AsyncCallback at position 2 struct ContextInfo { std::string storeId; Options options; KVManager *proxy = nullptr; SingleKVStore *kvStore = nullptr; napi_ref ref = nullptr; - napi_env env = nullptr; - ~ContextInfo() - { - if (env != nullptr) { - napi_delete_reference(env, ref); - } - } }; auto ctxInfo = std::make_shared(); auto input = [ctxInfo](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status { - ZLOGD("GetKVStore parser to native params %{public}d!", argc); + ZLOGD("GetKVStore parser to native params %{public}d!", static_cast(argc)); NAPI_ASSERT_BASE(env, self != nullptr, "self is nullptr", napi_invalid_arg); NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast(&ctxInfo->proxy)), napi_invalid_arg); NAPI_ASSERT_BASE(env, ctxInfo->proxy != nullptr, "there is no native kv store", napi_invalid_arg); @@ -97,10 +91,13 @@ napi_value KVManager::GetKVStore(napi_env env, napi_callback_info info) if (*(ctxInfo->kvStore) == nullptr) { ZLOGE("get kv store failed!"); *result = nullptr; + napi_delete_reference(env, ctxInfo->ref); return napi_object_expected; } ZLOGD("get kv store success!"); - return napi_get_reference_value(env, ctxInfo->ref, result); + napi_status status = napi_get_reference_value(env, ctxInfo->ref, result); + napi_delete_reference(env, ctxInfo->ref); + return status; }; auto exec = [ctxInfo](AsyncCall::Context *ctx) { ctxInfo->proxy->kvDataManager_.GetSingleKvStore( @@ -110,6 +107,8 @@ napi_value KVManager::GetKVStore(napi_env env, napi_callback_info info) }); }; auto context = std::make_shared(input, output); + // getKVStore(storeId: string, options: Options, callback: AsyncCallback): void; + // AsyncCallback at position 2 AsyncCall asyncCall(env, info, context, 2); return asyncCall.Call(env, exec); } @@ -136,7 +135,7 @@ napi_value KVManager::Initialize(napi_env env, napi_callback_info info) ZLOGD("constructor kv manager!"); napi_value self = nullptr; size_t argc = JSUtil::MAX_ARGC; - napi_value argv[JSUtil::MAX_ARGC]; + napi_value argv[JSUtil::MAX_ARGC] = {nullptr}; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &self, nullptr)); napi_value bundle = nullptr; NAPI_CALL(env, napi_get_named_property(env, argv[0], "bundleName", &bundle)); diff --git a/frameworks/jskitsimpl/distributeddata/src/single_kv_store.cpp b/frameworks/jskitsimpl/distributeddata/src/single_kv_store.cpp index 374010db6..0150561fa 100644 --- a/frameworks/jskitsimpl/distributeddata/src/single_kv_store.cpp +++ b/frameworks/jskitsimpl/distributeddata/src/single_kv_store.cpp @@ -138,7 +138,7 @@ napi_value SingleKVStore::OnEvent(napi_env env, napi_callback_info info) { napi_value self = nullptr; size_t argc = JSUtil::MAX_ARGC; - napi_value argv[JSUtil::MAX_ARGC] = {0}; + napi_value argv[JSUtil::MAX_ARGC] = {nullptr}; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &self, nullptr)); NAPI_ASSERT(env, argc > 0, "there is no args"); napi_valuetype type; @@ -158,7 +158,7 @@ napi_value SingleKVStore::Sync(napi_env env, napi_callback_info info) { napi_value self = nullptr; size_t argc = JSUtil::MAX_ARGC; - napi_value argv[JSUtil::MAX_ARGC]; + napi_value argv[JSUtil::MAX_ARGC] = {nullptr}; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &self, nullptr)); NAPI_ASSERT_BASE(env, argc >= 2, "args is out of range", nullptr); NAPI_ASSERT_BASE(env, self != nullptr, "self is nullptr", nullptr); @@ -173,7 +173,7 @@ napi_value SingleKVStore::Sync(napi_env env, napi_callback_info info) if (argc >= 3) { napi_get_value_uint32(env, argv[2], &delay); } - ZLOGD("sync data %{public}d, mode:%{public}d, devices:%{public}d", argc, mode, devices.size()); + ZLOGD("sync data %{public}d, mode:%{public}d, devices:%{public}zu", static_cast(argc), mode, devices.size()); Status status = proxy->kvStore_->Sync(devices, static_cast(mode), delay); NAPI_ASSERT_BASE(env, status == Status::SUCCESS, "call sync failed", nullptr); @@ -279,14 +279,14 @@ DataObserver::~DataObserver() void DataObserver::OnChange(const ChangeNotification ¬ification, std::unique_ptr snapshot) { - ZLOGD("data change insert:%{public}d, update:%{public}d, delete:%{public}d", + ZLOGD("data change insert:%{public}zu, update:%{public}zu, delete:%{public}zu", notification.GetInsertEntries().size(), notification.GetUpdateEntries().size(), notification.GetDeleteEntries().size()); } void DataObserver::OnChange(const ChangeNotification ¬ification) { - ZLOGD("data change insert:%{public}d, update:%{public}d, delete:%{public}d", + ZLOGD("data change insert:%{public}zu, update:%{public}zu, delete:%{public}zu", notification.GetInsertEntries().size(), notification.GetUpdateEntries().size(), notification.GetDeleteEntries().size()); KvStoreObserver::OnChange(notification); -- Gitee