From f2234fa52696e28de05fde0727d797ea7479ecf9 Mon Sep 17 00:00:00 2001 From: youqijing Date: Mon, 28 Feb 2022 20:43:32 +0800 Subject: [PATCH] =?UTF-8?q?screenshot=20save=E6=8E=A5=E5=8F=A3=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0callback=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: youqijing Change-Id: I05c43c695e2c742eff0fc43e7074d57277c5b38a --- interfaces/kits/napi/common/wm_napi_common.h | 52 ++++++++++----- .../screenshot/native_screenshot_module.cpp | 63 ++++++++++++++----- 2 files changed, 84 insertions(+), 31 deletions(-) diff --git a/interfaces/kits/napi/common/wm_napi_common.h b/interfaces/kits/napi/common/wm_napi_common.h index 6b8cabac50..d1a4f4b7a9 100644 --- a/interfaces/kits/napi/common/wm_napi_common.h +++ b/interfaces/kits/napi/common/wm_napi_common.h @@ -23,6 +23,8 @@ #include #include #include +#include "js_native_api.h" +#include "js_native_api_types.h" #include "wm_common.h" #include "window_manager_hilog.h" @@ -59,6 +61,7 @@ napi_value CreatePromise(napi_env env, std::string funcname, void(*async)(napi_env env, std::unique_ptr& param), napi_value(*resolve)(napi_env env, std::unique_ptr& param), + napi_ref& callbackRef, std::unique_ptr& param) { struct AsyncCallbackInfo { @@ -67,20 +70,26 @@ napi_value CreatePromise(napi_env env, void (*async)(napi_env env, std::unique_ptr& param); napi_value (*resolve)(napi_env env, std::unique_ptr& param); std::unique_ptr param; + napi_ref ref; }; - AsyncCallbackInfo *info = new AsyncCallbackInfo { .async = async, .resolve = resolve, .param = std::move(param), + .ref = callbackRef, }; - napi_value resourceName; - NAPI_CALL(env, napi_create_string_latin1(env, - funcname.c_str(), NAPI_AUTO_LENGTH, &resourceName)); - - napi_value promise; - NAPI_CALL(env, napi_create_promise(env, &info->deferred, &promise)); + NAPI_CALL(env, napi_create_string_latin1(env, funcname.c_str(), NAPI_AUTO_LENGTH, &resourceName)); + + // decide use promise or callback + napi_value result = nullptr; + if (info->ref == nullptr) { + GNAPI_LOG("yqj info->ref == nullptr"); + NAPI_CALL(env, napi_create_promise(env, &info->deferred, &result)); + } else { + GNAPI_LOG("yqj info->ref != nullptr"); + NAPI_CALL(env, napi_get_undefined(env, &result)); + } auto asyncFunc = [](napi_env env, void *data) { AsyncCallbackInfo *info = reinterpret_cast(data); @@ -91,21 +100,32 @@ napi_value CreatePromise(napi_env env, auto completeFunc = [](napi_env env, napi_status status, void *data) { AsyncCallbackInfo *info = reinterpret_cast(data); - napi_value resolveValue; + // napi_value resolveValue; + napi_value result[2] = {0}; + // napi_get_undefined(env, &result[0]); + // napi_get_undefined(env, &result[1]); if (info->resolve) { - resolveValue = info->resolve(env, info->param); + GNAPI_LOG("yqj info->resolve != nullptr"); + result[1] = info->resolve(env, info->param); } else { - napi_get_undefined(env, &resolveValue); + GNAPI_LOG("yqj info->resolve == nullptr"); + napi_get_undefined(env, &result[0]); } - if (info->deferred) { if (info->param->wret == OHOS::Rosen::WMError::WM_OK) { - GNAPI_LOG("CreatePromise, resolve"); - napi_resolve_deferred(env, info->deferred, resolveValue); + GNAPI_LOG("yqj CreatePromise, resolve"); + napi_resolve_deferred(env, info->deferred, result[1]); } else { - GNAPI_LOG("CreatePromise, reject"); - napi_reject_deferred(env, info->deferred, resolveValue); + GNAPI_LOG("yqj CreatePromise, reject"); + napi_reject_deferred(env, info->deferred, result[0]); } + } else { + GNAPI_LOG("yqj callback"); + napi_value callback = nullptr; + napi_value returnVal; + napi_get_reference_value(env, info->ref, &callback); + napi_call_function(env, nullptr, callback, 2, result, &returnVal); + napi_delete_reference(env, info->ref); } napi_delete_async_work(env, info->asyncWork); delete info; @@ -115,7 +135,7 @@ napi_value CreatePromise(napi_env env, reinterpret_cast(info), &info->asyncWork)); NAPI_CALL(env, napi_queue_async_work(env, info->asyncWork)); - return promise; + return result; }; } // namespace OHOS diff --git a/interfaces/kits/napi/screenshot/native_screenshot_module.cpp b/interfaces/kits/napi/screenshot/native_screenshot_module.cpp index 9fa8fe88f2..cf8f0ea6a5 100644 --- a/interfaces/kits/napi/screenshot/native_screenshot_module.cpp +++ b/interfaces/kits/napi/screenshot/native_screenshot_module.cpp @@ -146,28 +146,36 @@ static void GetImageSize(napi_env env, std::unique_ptr ¶m, napi_value } } -static void AsyncGetScreenshotByDisplayId(napi_env env, std::unique_ptr ¶m) +static void AsyncGetScreenshotByDefaultOption(napi_env env, std::unique_ptr ¶m) { - GNAPI_LOG("Get Screenshot by displayId"); + GNAPI_LOG("yqj Get Screenshot by displayId"); + GNAPI_LOG("yqj 11 GetDefaultDisplayId: displayId: %{public}" PRIu64"", param->option.displayId); param->image = DisplayManager::GetInstance().GetScreenshot(param->option.displayId); if (param->image == nullptr) { - GNAPI_LOG("Get Screenshot failed!"); + GNAPI_LOG("yqj 11 Get Screenshot failed!"); param->wret = WMError::WM_ERROR_NULLPTR; return; } + GNAPI_LOG("yqj 11 Get Screenshot failed!"); param->wret = WMError::WM_OK; } -static void AsyncGetScreenshotByOption(napi_env env, std::unique_ptr ¶m) +static void AsyncGetScreenshotByInputOption(napi_env env, std::unique_ptr ¶m) { - GNAPI_LOG("Get Screenshot by option"); + GNAPI_LOG("yqj Get Screenshot by option"); + GNAPI_LOG("yqj Get Screenshot by option: displayId: %{public}" PRIu64", rect: Height %{public}d, Width %{public}d, left %{public}d, top %{public}d, " + "size: Height %{public}d, Width %{public}d, rotation: %{public}d", + param->option.displayId, + param->option.rect.height, param->option.rect.width, param->option.rect.left, param->option.rect.top, + param->option.size.height, param->option.size.width, param->option.rotation); param->image = DisplayManager::GetInstance().GetScreenshot(param->option.displayId, param->option.rect, param->option.size, param->option.rotation); if (param->image == nullptr) { - GNAPI_LOG("Get Screenshot failed!"); + GNAPI_LOG("yqj Get Screenshot failed!"); param->wret = WMError::WM_ERROR_NULLPTR; return; } + GNAPI_LOG("yqj Get Screenshot success!"); param->wret = WMError::WM_OK; } @@ -188,32 +196,57 @@ napi_value Resolve(napi_env env, std::unique_ptr ¶m) napi_value MainFunc(napi_env env, napi_callback_info info) { GNAPI_LOG("%{public}s called", __PRETTY_FUNCTION__); - napi_value argv[1] = {0}; - size_t argc = 1; + napi_value argv[2] = {0}; + size_t argc = 2; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr)); auto param = std::make_unique(); param->option.displayId = DisplayManager::GetInstance().GetDefaultDisplayId(); + GNAPI_LOG("yqj GetDefaultDisplayId: displayId: %{public}" PRIu64"", param->option.displayId); + napi_ref ref = nullptr; + + GNAPI_LOG("yqj 111 argv[0]: %{public}d, argv[1]: %{public}d", GetType(env, argv[0]), GetType(env, argv[1])); + if (argc == 0) { - GNAPI_LOG("argc == 0"); - return CreatePromise(env, __PRETTY_FUNCTION__, AsyncGetScreenshotByDisplayId, Resolve, param); + GNAPI_LOG("yqj argc == 0"); + return CreatePromise(env, __PRETTY_FUNCTION__,AsyncGetScreenshotByDefaultOption, + Resolve, ref, param); } else if (argc == 1) { - GNAPI_LOG("argc == 1"); + GNAPI_LOG("yqj argc == 1"); if (GetType(env, argv[0]) == napi_object) { GNAPI_LOG("argv[0]'s type is napi_object"); GetDisplayId(env, param, argv[0]); GetRotation(env, param, argv[0]); GetScreenRect(env, param, argv[0]); GetImageSize(env, param, argv[0]); - return CreatePromise(env, __PRETTY_FUNCTION__, AsyncGetScreenshotByOption, Resolve, param); + return CreatePromise(env, __PRETTY_FUNCTION__, AsyncGetScreenshotByInputOption, + Resolve, ref, param); } - GNAPI_LOG("argv[0]'s type is not napi_object"); + if (GetType(env, argv[0]) == napi_function) { + GNAPI_LOG("yqj argv[0]'s type is napi_function"); + NAPI_CALL(env, napi_create_reference(env, argv[0], 1, &ref)); + return CreatePromise(env, __PRETTY_FUNCTION__, AsyncGetScreenshotByDefaultOption, + Resolve, ref, param); + } + GNAPI_LOG("yqj argv[0]'s type is not napi_object or napi_function"); return nullptr; + } else if (argc == 2) { + GNAPI_LOG("yqj argc == 2"); + if (GetType(env, argv[0]) == napi_object && GetType(env, argv[1]) == napi_function) { + GNAPI_LOG("yqj argv[0]'s type is napi_object, argv[0]'s type is napi_function"); + GetDisplayId(env, param, argv[0]); + GetRotation(env, param, argv[0]); + GetScreenRect(env, param, argv[0]); + GetImageSize(env, param, argv[0]); + NAPI_CALL(env, napi_create_reference(env, argv[1], 1, &ref)); + return CreatePromise(env, __PRETTY_FUNCTION__, AsyncGetScreenshotByInputOption, + Resolve, ref, param); + } } else { - GNAPI_LOG("argc number missmatch"); + GNAPI_LOG("yqj argc number missmatch"); return nullptr; } - GNAPI_LOG("argc number missmatch"); + GNAPI_LOG("yqj argc number missmatch"); return nullptr; } } // namespace save -- Gitee