11e934351Sopenharmony_ci/* 21e934351Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 31e934351Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41e934351Sopenharmony_ci * you may not use this file except in compliance with the License. 51e934351Sopenharmony_ci * You may obtain a copy of the License at 61e934351Sopenharmony_ci * 71e934351Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81e934351Sopenharmony_ci * 91e934351Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101e934351Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111e934351Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121e934351Sopenharmony_ci * See the License for the specific language governing permissions and 131e934351Sopenharmony_ci * limitations under the License. 141e934351Sopenharmony_ci */ 151e934351Sopenharmony_ci 161e934351Sopenharmony_ci#ifndef COMMUNICATIONNETSTACK_NETSTACK_MODULE_TEMPLATE_H 171e934351Sopenharmony_ci#define COMMUNICATIONNETSTACK_NETSTACK_MODULE_TEMPLATE_H 181e934351Sopenharmony_ci 191e934351Sopenharmony_ci#include <cstddef> 201e934351Sopenharmony_ci#include <initializer_list> 211e934351Sopenharmony_ci#include <iosfwd> 221e934351Sopenharmony_ci#include <type_traits> 231e934351Sopenharmony_ci#include <vector> 241e934351Sopenharmony_ci 251e934351Sopenharmony_ci#include "base_async_work.h" 261e934351Sopenharmony_ci#include "base_context.h" 271e934351Sopenharmony_ci#include "napi/native_api.h" 281e934351Sopenharmony_ci#include "napi/native_common.h" 291e934351Sopenharmony_ci#include "napi_utils.h" 301e934351Sopenharmony_ci#include "netstack_log.h" 311e934351Sopenharmony_ci 321e934351Sopenharmony_cinamespace OHOS::NetStack { 331e934351Sopenharmony_ciclass EventManager; 341e934351Sopenharmony_cistruct EventManagerWrapper; 351e934351Sopenharmony_ci} // namespace OHOS::NetStack 361e934351Sopenharmony_ci 371e934351Sopenharmony_ci#define MAX_PARAM_NUM 64 381e934351Sopenharmony_ci 391e934351Sopenharmony_cinamespace OHOS::NetStack::ModuleTemplate { 401e934351Sopenharmony_citypedef void (*Finalizer)(napi_env, void *data, void *); 411e934351Sopenharmony_ci 421e934351Sopenharmony_citemplate <class Context> 431e934351Sopenharmony_cinapi_value InterfaceWithManagerWrapper(napi_env env, napi_callback_info info, const std::string &asyncWorkName, 441e934351Sopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor, 451e934351Sopenharmony_ci AsyncWorkCallback callback) 461e934351Sopenharmony_ci{ 471e934351Sopenharmony_ci NETSTACK_LOGI("js invoke %{public}s", asyncWorkName.c_str()); 481e934351Sopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 491e934351Sopenharmony_ci 501e934351Sopenharmony_ci napi_value thisVal = nullptr; 511e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 521e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 531e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 541e934351Sopenharmony_ci 551e934351Sopenharmony_ci EventManagerWrapper *wrapper = nullptr; 561e934351Sopenharmony_ci auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&wrapper)); 571e934351Sopenharmony_ci if (napi_ret != napi_ok) { 581e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret); 591e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 601e934351Sopenharmony_ci } 611e934351Sopenharmony_ci 621e934351Sopenharmony_ci auto context = new (std::nothrow) Context(env, nullptr); 631e934351Sopenharmony_ci if (!context) { 641e934351Sopenharmony_ci NETSTACK_LOGE("new context is nullptr"); 651e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 661e934351Sopenharmony_ci } 671e934351Sopenharmony_ci if (wrapper) { 681e934351Sopenharmony_ci context->SetSharedManager(wrapper->sharedManager); 691e934351Sopenharmony_ci } 701e934351Sopenharmony_ci context->ParseParams(params, paramsCount); 711e934351Sopenharmony_ci if (context->IsNeedThrowException()) { // only api9 or later need throw exception. 721e934351Sopenharmony_ci napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str()); 731e934351Sopenharmony_ci delete context; 741e934351Sopenharmony_ci context = nullptr; 751e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 761e934351Sopenharmony_ci } 771e934351Sopenharmony_ci if (Work != nullptr) { 781e934351Sopenharmony_ci if (!Work(env, thisVal, context)) { 791e934351Sopenharmony_ci NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 801e934351Sopenharmony_ci } 811e934351Sopenharmony_ci } 821e934351Sopenharmony_ci 831e934351Sopenharmony_ci context->CreateReference(thisVal); 841e934351Sopenharmony_ci context->CreateAsyncWork(asyncWorkName, executor, callback); 851e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 861e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s create promise", asyncWorkName.c_str()); 871e934351Sopenharmony_ci return context->CreatePromise(); 881e934351Sopenharmony_ci } 891e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 901e934351Sopenharmony_ci} 911e934351Sopenharmony_ci 921e934351Sopenharmony_citemplate <class Context> 931e934351Sopenharmony_cinapi_value InterfaceWithSharedManager(napi_env env, napi_callback_info info, const std::string &asyncWorkName, 941e934351Sopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor, 951e934351Sopenharmony_ci AsyncWorkCallback callback) 961e934351Sopenharmony_ci{ 971e934351Sopenharmony_ci NETSTACK_LOGI("js invoke %{public}s", asyncWorkName.c_str()); 981e934351Sopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 991e934351Sopenharmony_ci 1001e934351Sopenharmony_ci napi_value thisVal = nullptr; 1011e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 1021e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 1031e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 1041e934351Sopenharmony_ci 1051e934351Sopenharmony_ci std::shared_ptr<EventManager> *sharedManager = nullptr; 1061e934351Sopenharmony_ci auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager)); 1071e934351Sopenharmony_ci if (napi_ret != napi_ok) { 1081e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret); 1091e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1101e934351Sopenharmony_ci } 1111e934351Sopenharmony_ci 1121e934351Sopenharmony_ci auto context = new (std::nothrow) Context(env, nullptr); 1131e934351Sopenharmony_ci if (!context) { 1141e934351Sopenharmony_ci NETSTACK_LOGE("new context is nullptr"); 1151e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1161e934351Sopenharmony_ci } 1171e934351Sopenharmony_ci if (sharedManager) { 1181e934351Sopenharmony_ci context->SetSharedManager(*sharedManager); 1191e934351Sopenharmony_ci } 1201e934351Sopenharmony_ci context->ParseParams(params, paramsCount); 1211e934351Sopenharmony_ci if (context->IsNeedThrowException()) { // only api9 or later need throw exception. 1221e934351Sopenharmony_ci napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str()); 1231e934351Sopenharmony_ci delete context; 1241e934351Sopenharmony_ci context = nullptr; 1251e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1261e934351Sopenharmony_ci } 1271e934351Sopenharmony_ci if (Work != nullptr) { 1281e934351Sopenharmony_ci if (!Work(env, thisVal, context)) { 1291e934351Sopenharmony_ci NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 1301e934351Sopenharmony_ci } 1311e934351Sopenharmony_ci } 1321e934351Sopenharmony_ci 1331e934351Sopenharmony_ci context->CreateReference(thisVal); 1341e934351Sopenharmony_ci context->CreateAsyncWork(asyncWorkName, executor, callback); 1351e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 1361e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s create promise", asyncWorkName.c_str()); 1371e934351Sopenharmony_ci return context->CreatePromise(); 1381e934351Sopenharmony_ci } 1391e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1401e934351Sopenharmony_ci} 1411e934351Sopenharmony_ci 1421e934351Sopenharmony_citemplate <class Context> 1431e934351Sopenharmony_cinapi_value InterfaceWithOutAsyncWorkWithManagerWrapper(napi_env env, napi_callback_info info, 1441e934351Sopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), 1451e934351Sopenharmony_ci const std::string &asyncWorkName, AsyncWorkExecutor executor, 1461e934351Sopenharmony_ci AsyncWorkCallback callback) 1471e934351Sopenharmony_ci{ 1481e934351Sopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 1491e934351Sopenharmony_ci 1501e934351Sopenharmony_ci napi_value thisVal = nullptr; 1511e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 1521e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 1531e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 1541e934351Sopenharmony_ci 1551e934351Sopenharmony_ci EventManagerWrapper *wrapper = nullptr; 1561e934351Sopenharmony_ci auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&wrapper)); 1571e934351Sopenharmony_ci if (napi_ret != napi_ok) { 1581e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret); 1591e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1601e934351Sopenharmony_ci } 1611e934351Sopenharmony_ci 1621e934351Sopenharmony_ci auto context = new (std::nothrow) Context(env, nullptr); 1631e934351Sopenharmony_ci if (!context) { 1641e934351Sopenharmony_ci NETSTACK_LOGE("new context is nullptr"); 1651e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1661e934351Sopenharmony_ci } 1671e934351Sopenharmony_ci if (wrapper) { 1681e934351Sopenharmony_ci context->SetSharedManager(wrapper->sharedManager); 1691e934351Sopenharmony_ci } 1701e934351Sopenharmony_ci context->ParseParams(params, paramsCount); 1711e934351Sopenharmony_ci napi_value ret = NapiUtils::GetUndefined(env); 1721e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 1731e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s is invoked in promise mode", asyncWorkName.c_str()); 1741e934351Sopenharmony_ci ret = context->CreatePromise(); 1751e934351Sopenharmony_ci } else { 1761e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s is invoked in callback mode", asyncWorkName.c_str()); 1771e934351Sopenharmony_ci } 1781e934351Sopenharmony_ci context->CreateReference(thisVal); 1791e934351Sopenharmony_ci if (Work != nullptr) { 1801e934351Sopenharmony_ci if (!Work(env, thisVal, context)) { 1811e934351Sopenharmony_ci NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 1821e934351Sopenharmony_ci } 1831e934351Sopenharmony_ci } 1841e934351Sopenharmony_ci if (!context->IsParseOK() || context->IsPermissionDenied() || context->IsNoAllowedHost() || 1851e934351Sopenharmony_ci context->GetSharedManager()->IsEventDestroy()) { 1861e934351Sopenharmony_ci context->CreateAsyncWork(asyncWorkName, executor, callback); 1871e934351Sopenharmony_ci } 1881e934351Sopenharmony_ci return ret; 1891e934351Sopenharmony_ci} 1901e934351Sopenharmony_ci 1911e934351Sopenharmony_citemplate <class Context> 1921e934351Sopenharmony_cinapi_value InterfaceWithOutAsyncWorkWithSharedManager(napi_env env, napi_callback_info info, 1931e934351Sopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), 1941e934351Sopenharmony_ci const std::string &asyncWorkName, AsyncWorkExecutor executor, 1951e934351Sopenharmony_ci AsyncWorkCallback callback) 1961e934351Sopenharmony_ci{ 1971e934351Sopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 1981e934351Sopenharmony_ci 1991e934351Sopenharmony_ci napi_value thisVal = nullptr; 2001e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 2011e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 2021e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 2031e934351Sopenharmony_ci 2041e934351Sopenharmony_ci std::shared_ptr<EventManager> *sharedManager = nullptr; 2051e934351Sopenharmony_ci auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager)); 2061e934351Sopenharmony_ci if (napi_ret != napi_ok) { 2071e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret); 2081e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2091e934351Sopenharmony_ci } 2101e934351Sopenharmony_ci 2111e934351Sopenharmony_ci auto context = new (std::nothrow) Context(env, nullptr); 2121e934351Sopenharmony_ci if (!context) { 2131e934351Sopenharmony_ci NETSTACK_LOGE("new context is nullptr"); 2141e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2151e934351Sopenharmony_ci } 2161e934351Sopenharmony_ci if (sharedManager) { 2171e934351Sopenharmony_ci context->SetSharedManager(*sharedManager); 2181e934351Sopenharmony_ci } 2191e934351Sopenharmony_ci context->ParseParams(params, paramsCount); 2201e934351Sopenharmony_ci napi_value ret = NapiUtils::GetUndefined(env); 2211e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 2221e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s is invoked in promise mode", asyncWorkName.c_str()); 2231e934351Sopenharmony_ci ret = context->CreatePromise(); 2241e934351Sopenharmony_ci } else { 2251e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s is invoked in callback mode", asyncWorkName.c_str()); 2261e934351Sopenharmony_ci } 2271e934351Sopenharmony_ci context->CreateReference(thisVal); 2281e934351Sopenharmony_ci if (Work != nullptr) { 2291e934351Sopenharmony_ci if (!Work(env, thisVal, context)) { 2301e934351Sopenharmony_ci NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 2311e934351Sopenharmony_ci } 2321e934351Sopenharmony_ci } 2331e934351Sopenharmony_ci if (!context->IsParseOK() || context->IsPermissionDenied() || context->IsNoAllowedHost() || 2341e934351Sopenharmony_ci context->GetSharedManager()->IsEventDestroy()) { 2351e934351Sopenharmony_ci context->CreateAsyncWork(asyncWorkName, executor, callback); 2361e934351Sopenharmony_ci } 2371e934351Sopenharmony_ci return ret; 2381e934351Sopenharmony_ci} 2391e934351Sopenharmony_ci 2401e934351Sopenharmony_citemplate <class Context> 2411e934351Sopenharmony_cinapi_value Interface(napi_env env, napi_callback_info info, const std::string &asyncWorkName, 2421e934351Sopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor, 2431e934351Sopenharmony_ci AsyncWorkCallback callback) 2441e934351Sopenharmony_ci{ 2451e934351Sopenharmony_ci NETSTACK_LOGI("js invoke %{public}s", asyncWorkName.c_str()); 2461e934351Sopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 2471e934351Sopenharmony_ci 2481e934351Sopenharmony_ci napi_value thisVal = nullptr; 2491e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 2501e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 2511e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 2521e934351Sopenharmony_ci 2531e934351Sopenharmony_ci EventManager *manager = nullptr; 2541e934351Sopenharmony_ci auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager)); 2551e934351Sopenharmony_ci if (napi_ret != napi_ok) { 2561e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret); 2571e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2581e934351Sopenharmony_ci } 2591e934351Sopenharmony_ci 2601e934351Sopenharmony_ci auto context = new (std::nothrow) Context(env, manager); 2611e934351Sopenharmony_ci if (!context) { 2621e934351Sopenharmony_ci NETSTACK_LOGE("new context is nullptr"); 2631e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2641e934351Sopenharmony_ci } 2651e934351Sopenharmony_ci context->ParseParams(params, paramsCount); 2661e934351Sopenharmony_ci if (context->IsNeedThrowException()) { // only api9 or later need throw exception. 2671e934351Sopenharmony_ci napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str()); 2681e934351Sopenharmony_ci delete context; 2691e934351Sopenharmony_ci context = nullptr; 2701e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2711e934351Sopenharmony_ci } 2721e934351Sopenharmony_ci if (Work != nullptr) { 2731e934351Sopenharmony_ci if (!Work(env, thisVal, context)) { 2741e934351Sopenharmony_ci NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 2751e934351Sopenharmony_ci } 2761e934351Sopenharmony_ci } 2771e934351Sopenharmony_ci 2781e934351Sopenharmony_ci context->CreateReference(thisVal); 2791e934351Sopenharmony_ci context->CreateAsyncWork(asyncWorkName, executor, callback); 2801e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 2811e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s create promise", asyncWorkName.c_str()); 2821e934351Sopenharmony_ci return context->CreatePromise(); 2831e934351Sopenharmony_ci } 2841e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2851e934351Sopenharmony_ci} 2861e934351Sopenharmony_ci 2871e934351Sopenharmony_citemplate <class Context> 2881e934351Sopenharmony_cinapi_value InterfaceWithOutAsyncWork(napi_env env, napi_callback_info info, 2891e934351Sopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), const std::string &asyncWorkName, 2901e934351Sopenharmony_ci AsyncWorkExecutor executor, AsyncWorkCallback callback) 2911e934351Sopenharmony_ci{ 2921e934351Sopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 2931e934351Sopenharmony_ci 2941e934351Sopenharmony_ci napi_value thisVal = nullptr; 2951e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 2961e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 2971e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 2981e934351Sopenharmony_ci 2991e934351Sopenharmony_ci EventManager *manager = nullptr; 3001e934351Sopenharmony_ci auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager)); 3011e934351Sopenharmony_ci if (napi_ret != napi_ok) { 3021e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret); 3031e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3041e934351Sopenharmony_ci } 3051e934351Sopenharmony_ci 3061e934351Sopenharmony_ci auto context = new (std::nothrow) Context(env, manager); 3071e934351Sopenharmony_ci if (!context) { 3081e934351Sopenharmony_ci NETSTACK_LOGE("new context is nullptr"); 3091e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3101e934351Sopenharmony_ci } 3111e934351Sopenharmony_ci context->ParseParams(params, paramsCount); 3121e934351Sopenharmony_ci napi_value ret = NapiUtils::GetUndefined(env); 3131e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 3141e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s is invoked in promise mode", asyncWorkName.c_str()); 3151e934351Sopenharmony_ci ret = context->CreatePromise(); 3161e934351Sopenharmony_ci } else { 3171e934351Sopenharmony_ci NETSTACK_LOGD("%{public}s is invoked in callback mode", asyncWorkName.c_str()); 3181e934351Sopenharmony_ci } 3191e934351Sopenharmony_ci context->CreateReference(thisVal); 3201e934351Sopenharmony_ci if (Work != nullptr) { 3211e934351Sopenharmony_ci if (!Work(env, thisVal, context)) { 3221e934351Sopenharmony_ci NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 3231e934351Sopenharmony_ci } 3241e934351Sopenharmony_ci } 3251e934351Sopenharmony_ci if (!context->IsParseOK() || context->IsPermissionDenied() || context->IsNoAllowedHost() || 3261e934351Sopenharmony_ci context->GetManager()->IsEventDestroy()) { 3271e934351Sopenharmony_ci context->CreateAsyncWork(asyncWorkName, executor, callback); 3281e934351Sopenharmony_ci } 3291e934351Sopenharmony_ci return ret; 3301e934351Sopenharmony_ci} 3311e934351Sopenharmony_ci 3321e934351Sopenharmony_cinapi_value On(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 3331e934351Sopenharmony_ci bool asyncCallback); 3341e934351Sopenharmony_ci 3351e934351Sopenharmony_cinapi_value Once(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 3361e934351Sopenharmony_ci bool asyncCallback); 3371e934351Sopenharmony_ci 3381e934351Sopenharmony_cinapi_value Off(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events); 3391e934351Sopenharmony_ci 3401e934351Sopenharmony_civoid DefineClass(napi_env env, napi_value exports, const std::initializer_list<napi_property_descriptor> &properties, 3411e934351Sopenharmony_ci const std::string &className); 3421e934351Sopenharmony_ci 3431e934351Sopenharmony_cinapi_value NewInstance(napi_env env, napi_callback_info info, const std::string &className, Finalizer finalizer); 3441e934351Sopenharmony_ci 3451e934351Sopenharmony_cinapi_value NewInstanceNoManager(napi_env env, napi_callback_info info, const std::string &name, Finalizer finalizer); 3461e934351Sopenharmony_ci 3471e934351Sopenharmony_cinapi_value NewInstanceWithSharedManager(napi_env env, napi_callback_info info, const std::string &className, 3481e934351Sopenharmony_ci Finalizer finalizer); 3491e934351Sopenharmony_ci 3501e934351Sopenharmony_cinapi_value NewInstanceWithManagerWrapper(napi_env env, napi_callback_info info, const std::string &className, 3511e934351Sopenharmony_ci Finalizer finalizer); 3521e934351Sopenharmony_ci 3531e934351Sopenharmony_cinapi_value OnSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 3541e934351Sopenharmony_ci bool asyncCallback); 3551e934351Sopenharmony_ci 3561e934351Sopenharmony_cinapi_value OnceSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 3571e934351Sopenharmony_ci bool asyncCallback); 3581e934351Sopenharmony_ci 3591e934351Sopenharmony_cinapi_value OffSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events); 3601e934351Sopenharmony_ci 3611e934351Sopenharmony_cinapi_value OnManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 3621e934351Sopenharmony_ci bool asyncCallback); 3631e934351Sopenharmony_ci 3641e934351Sopenharmony_cinapi_value OnceManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 3651e934351Sopenharmony_ci bool asyncCallback); 3661e934351Sopenharmony_ci 3671e934351Sopenharmony_cinapi_value OffManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events); 3681e934351Sopenharmony_ci} // namespace OHOS::NetStack::ModuleTemplate 3691e934351Sopenharmony_ci#endif /* COMMUNICATIONNETSTACK_NETSTACK_MODULE_TEMPLATE_H */ 370