From e4639c9d3b3be854d34ca43bb5d8065c03ca131e Mon Sep 17 00:00:00 2001 From: zhang-xiaobo1997 Date: Thu, 14 Apr 2022 20:58:59 +0800 Subject: [PATCH] modify for issue Signed-off-by: zhang-xiaobo1997 --- .../kits/js/common/image_packer_napi.cpp | 76 ++++++++++++++----- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/frameworks/kits/js/common/image_packer_napi.cpp b/frameworks/kits/js/common/image_packer_napi.cpp index 5bf318eee..e24522bcb 100644 --- a/frameworks/kits/js/common/image_packer_napi.cpp +++ b/frameworks/kits/js/common/image_packer_napi.cpp @@ -51,6 +51,7 @@ struct ImagePackerAsyncContext { napi_async_work work; napi_deferred deferred; napi_ref callbackRef = nullptr; + napi_value errorMsg = nullptr; ImagePackerNapi *constructor_; bool status = false; std::shared_ptr rImageSource; @@ -89,6 +90,10 @@ static void CommonCallbackRoutine(napi_env env, ImagePackerAsyncContext* &connec if (connect->status == SUCCESS) { result[NUM_1] = valueParam; + } else if (connect->errorMsg != nullptr) { + result[NUM_0] = connect->errorMsg; + } else { + napi_create_string_utf8(env, "Internal error", NAPI_AUTO_LENGTH, &(result[NUM_0])); } if (connect->deferred) { @@ -150,6 +155,17 @@ STATIC_EXEC_FUNC(Packing) HiLog::Debug(LABEL, "PackingExec exit"); } +STATIC_COMPLETE_FUNC(PackingError) +{ + HiLog::Debug(LABEL, "PackingErrorComplete IN"); + napi_value result = nullptr; + napi_get_undefined(env, &result); + auto context = static_cast(data); + context->status = ERROR; + HiLog::Debug(LABEL, "PackingErrorComplete OUT"); + CommonCallbackRoutine(env, context, result); +} + STATIC_COMPLETE_FUNC(Packing) { HiLog::Debug(LABEL, "PackingComplete enter"); @@ -402,6 +418,35 @@ static int32_t ParserPackingArguments(napi_env env, napi_value argv) return TYPE_IMAGE_SOURCE; } +static std::shared_ptr GetImageSourceFromNapi(napi_env env, napi_value value) +{ + if (env == nullptr || value == nullptr) { + HiLog::Error(LABEL, "GetImageSourceFromNapi input is null"); + } + std::unique_ptr imageSourceNapi = std::make_unique(); + napi_status status = napi_unwrap(env, value, reinterpret_cast(&imageSourceNapi)); + if (!IMG_IS_OK(status)) { + HiLog::Error(LABEL, "GetImageSourceFromNapi napi unwrap failed"); + return nullptr; + } + if (imageSourceNapi == nullptr) { + HiLog::Error(LABEL, "GetImageSourceFromNapi imageSourceNapi is nullptr"); + return nullptr; + } + return imageSourceNapi->nativeImgSrc; +} + +static void BuildMsgOnError(napi_env env, + std::unique_ptr &context, + bool assertion, + const std::string msg) +{ + if (!assertion) { + HiLog::Error(LABEL, "%{public}s", msg.c_str()); + napi_create_string_utf8(env, msg.c_str(), NAPI_AUTO_LENGTH, &(context->errorMsg)); + } +} + napi_value ImagePackerNapi::Packing(napi_env env, napi_callback_info info) { napi_status status; @@ -415,14 +460,14 @@ napi_value ImagePackerNapi::Packing(napi_env env, napi_callback_info info) std::shared_ptr imagesourceObj = nullptr; std::unique_ptr pixelMap = nullptr; HiLog::Debug(LABEL, "Packing IN"); + napi_get_undefined(env, &result); IMG_JS_ARGS(env, info, status, argc, argv, thisVar); - IMG_NAPI_CHECK_RET_D(IMG_IS_OK(status), nullptr, HiLog::Error(LABEL, "fail to napi_get_cb_info")); + NAPI_ASSERT(env, IMG_IS_OK(status), "fail to napi_get_cb_info"); std::unique_ptr asyncContext = std::make_unique(); status = napi_unwrap(env, thisVar, reinterpret_cast(&asyncContext->constructor_)); - IMG_NAPI_CHECK_RET_D(IMG_IS_READY(status, asyncContext->constructor_), - nullptr, HiLog::Error(LABEL, "fail to unwrap constructor_")); + NAPI_ASSERT(env, IMG_IS_READY(status, asyncContext->constructor_), "fail to unwrap constructor_"); asyncContext->rImagePacker = std::move(asyncContext->constructor_->nativeImgPck); for (size_t i = PARAM0; i < argc; i++) { @@ -430,21 +475,17 @@ napi_value ImagePackerNapi::Packing(napi_env env, napi_callback_info info) if (i == PARAM0 && argvType == napi_object) { packType = ParserPackingArguments(env, argv[0]); if (packType == TYPE_IMAGE_SOURCE) { - std::shared_ptr imageSourceNapi = std::make_unique(); - status = napi_unwrap(env, argv[i], reinterpret_cast(&imageSourceNapi)); - IMG_NAPI_CHECK_RET_D(IMG_IS_READY(status, imageSourceNapi), nullptr, - HiLog::Error(LABEL, "fail to unwrap ImageSourceNapi")); - asyncContext->rImageSource = imageSourceNapi->nativeImgSrc; - IMG_NAPI_CHECK_RET_D(IMG_IS_OK(asyncContext->rImageSource == nullptr), nullptr, - HiLog::Error(LABEL, "fail to napi_get rImageSource")); + asyncContext->rImageSource = GetImageSourceFromNapi(env, argv[i]); + BuildMsgOnError(env, asyncContext, + asyncContext->rImageSource != nullptr, "ImageSource mismatch"); } else { asyncContext->rPixelMap = PixelMapNapi::GetPixelMap(env, argv[i]); - IMG_NAPI_CHECK_RET_D(IMG_IS_OK(asyncContext->rPixelMap == nullptr), nullptr, - HiLog::Error(LABEL, "fail to napi_get rPixelMap")); + BuildMsgOnError(env, asyncContext, + asyncContext->rPixelMap != nullptr, "PixelMap mismatch"); } } else if (i == PARAM1 && ImageNapiUtils::getType(env, argv[i]) == napi_object) { - IMG_NAPI_CHECK_RET_D(parsePackOptions(env, argv[i], &(asyncContext->packOption)), - nullptr, HiLog::Error(LABEL, "PackOptions mismatch")); + BuildMsgOnError(env, asyncContext, + parsePackOptions(env, argv[i], &(asyncContext->packOption)), "PackOptions mismatch"); } else if (i == PARAM2 && ImageNapiUtils::getType(env, argv[i]) == napi_function) { napi_create_reference(env, argv[i], refCount, &asyncContext->callbackRef); break; @@ -453,13 +494,14 @@ napi_value ImagePackerNapi::Packing(napi_env env, napi_callback_info info) if (asyncContext->callbackRef == nullptr) { napi_create_promise(env, &(asyncContext->deferred), &result); - } else { - napi_get_undefined(env, &result); } ImageNapiUtils::HicheckerReport(); - if (packType == TYPE_IMAGE_SOURCE) { + if (asyncContext->errorMsg != nullptr) { + IMG_CREATE_CREATE_ASYNC_WORK(env, status, "PackingError", + [](napi_env env, void *data) {}, PackingErrorComplete, asyncContext, asyncContext->work); + } else if (packType == TYPE_IMAGE_SOURCE) { IMG_CREATE_CREATE_ASYNC_WORK(env, status, "Packing", PackingExec, PackingComplete, asyncContext, asyncContext->work); } else { -- Gitee