1b1b8bc3fSopenharmony_ci/* 2b1b8bc3fSopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3b1b8bc3fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4b1b8bc3fSopenharmony_ci * you may not use this file except in compliance with the License. 5b1b8bc3fSopenharmony_ci * You may obtain a copy of the License at 6b1b8bc3fSopenharmony_ci * 7b1b8bc3fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8b1b8bc3fSopenharmony_ci * 9b1b8bc3fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10b1b8bc3fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11b1b8bc3fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b1b8bc3fSopenharmony_ci * See the License for the specific language governing permissions and 13b1b8bc3fSopenharmony_ci * limitations under the License. 14b1b8bc3fSopenharmony_ci */ 15b1b8bc3fSopenharmony_ci 16b1b8bc3fSopenharmony_ci#ifndef COMMUNICATIONNETMANAGER_BASE_NETMANAGER_BASE_MODULE_TEMPLATE_H 17b1b8bc3fSopenharmony_ci#define COMMUNICATIONNETMANAGER_BASE_NETMANAGER_BASE_MODULE_TEMPLATE_H 18b1b8bc3fSopenharmony_ci 19b1b8bc3fSopenharmony_ci#include <initializer_list> 20b1b8bc3fSopenharmony_ci 21b1b8bc3fSopenharmony_ci#include <napi/native_api.h> 22b1b8bc3fSopenharmony_ci#include <napi/native_common.h> 23b1b8bc3fSopenharmony_ci 24b1b8bc3fSopenharmony_ci#include "base_context.h" 25b1b8bc3fSopenharmony_ci#include "napi_utils.h" 26b1b8bc3fSopenharmony_ci#include "netmanager_base_log.h" 27b1b8bc3fSopenharmony_ci 28b1b8bc3fSopenharmony_ci#define MAX_PARAM_NUM 64 29b1b8bc3fSopenharmony_ci 30b1b8bc3fSopenharmony_cinamespace OHOS { 31b1b8bc3fSopenharmony_cinamespace NetManagerStandard { 32b1b8bc3fSopenharmony_cinamespace ModuleTemplate { 33b1b8bc3fSopenharmony_ciusing Finalizer = void (*)(napi_env env, void *data, void *); 34b1b8bc3fSopenharmony_ci 35b1b8bc3fSopenharmony_citemplate <class Context> 36b1b8bc3fSopenharmony_cinapi_value InterfaceWithoutManager(napi_env env, napi_callback_info info, const std::string &asyncWorkName, 37b1b8bc3fSopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor, 38b1b8bc3fSopenharmony_ci AsyncWorkCallback callback) 39b1b8bc3fSopenharmony_ci{ 40b1b8bc3fSopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 41b1b8bc3fSopenharmony_ci 42b1b8bc3fSopenharmony_ci napi_value thisVal = nullptr; 43b1b8bc3fSopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 44b1b8bc3fSopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 45b1b8bc3fSopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 46b1b8bc3fSopenharmony_ci 47b1b8bc3fSopenharmony_ci auto context = new Context(env, nullptr); 48b1b8bc3fSopenharmony_ci context->ParseParams(params, paramsCount); 49b1b8bc3fSopenharmony_ci if (context->IsNeedThrowException()) { // only api9 or later need throw exception. 50b1b8bc3fSopenharmony_ci napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str()); 51b1b8bc3fSopenharmony_ci delete context; 52b1b8bc3fSopenharmony_ci context = nullptr; 53b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(env); 54b1b8bc3fSopenharmony_ci } 55b1b8bc3fSopenharmony_ci if (Work != nullptr) { 56b1b8bc3fSopenharmony_ci if (!Work(env, thisVal, context)) { 57b1b8bc3fSopenharmony_ci NETMANAGER_BASE_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 58b1b8bc3fSopenharmony_ci } 59b1b8bc3fSopenharmony_ci } 60b1b8bc3fSopenharmony_ci 61b1b8bc3fSopenharmony_ci context->CreateAsyncWork(asyncWorkName, executor, callback); 62b1b8bc3fSopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 63b1b8bc3fSopenharmony_ci return context->CreatePromise(); 64b1b8bc3fSopenharmony_ci } 65b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(env); 66b1b8bc3fSopenharmony_ci} 67b1b8bc3fSopenharmony_ci 68b1b8bc3fSopenharmony_citemplate <class Context> 69b1b8bc3fSopenharmony_cinapi_value Interface(napi_env env, napi_callback_info info, const std::string &asyncWorkName, 70b1b8bc3fSopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor, 71b1b8bc3fSopenharmony_ci AsyncWorkCallback callback) 72b1b8bc3fSopenharmony_ci{ 73b1b8bc3fSopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 74b1b8bc3fSopenharmony_ci 75b1b8bc3fSopenharmony_ci napi_value thisVal = nullptr; 76b1b8bc3fSopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 77b1b8bc3fSopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 78b1b8bc3fSopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 79b1b8bc3fSopenharmony_ci 80b1b8bc3fSopenharmony_ci EventManager *manager = nullptr; 81b1b8bc3fSopenharmony_ci napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager)); 82b1b8bc3fSopenharmony_ci 83b1b8bc3fSopenharmony_ci auto context = new Context(env, manager); 84b1b8bc3fSopenharmony_ci context->ParseParams(params, paramsCount); 85b1b8bc3fSopenharmony_ci if (context->IsNeedThrowException()) { // only api9 or later need throw exception. 86b1b8bc3fSopenharmony_ci napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str()); 87b1b8bc3fSopenharmony_ci delete context; 88b1b8bc3fSopenharmony_ci context = nullptr; 89b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(env); 90b1b8bc3fSopenharmony_ci } 91b1b8bc3fSopenharmony_ci if (Work != nullptr) { 92b1b8bc3fSopenharmony_ci if (!Work(env, thisVal, context)) { 93b1b8bc3fSopenharmony_ci NETMANAGER_BASE_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 94b1b8bc3fSopenharmony_ci } 95b1b8bc3fSopenharmony_ci } 96b1b8bc3fSopenharmony_ci 97b1b8bc3fSopenharmony_ci context->CreateAsyncWork(asyncWorkName, executor, callback); 98b1b8bc3fSopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 99b1b8bc3fSopenharmony_ci return context->CreatePromise(); 100b1b8bc3fSopenharmony_ci } 101b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(env); 102b1b8bc3fSopenharmony_ci} 103b1b8bc3fSopenharmony_ci 104b1b8bc3fSopenharmony_citemplate <class Context> 105b1b8bc3fSopenharmony_cinapi_value InterfaceSync(napi_env env, napi_callback_info info, const std::string &asyncWorkName, 106b1b8bc3fSopenharmony_ci bool (*Work)(napi_env, napi_value, Context *), bool (*executor)(Context *), 107b1b8bc3fSopenharmony_ci napi_value (*callback)(Context *)) 108b1b8bc3fSopenharmony_ci{ 109b1b8bc3fSopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 110b1b8bc3fSopenharmony_ci 111b1b8bc3fSopenharmony_ci napi_value thisVal = nullptr; 112b1b8bc3fSopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 113b1b8bc3fSopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 114b1b8bc3fSopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 115b1b8bc3fSopenharmony_ci EventManager *manager = nullptr; 116b1b8bc3fSopenharmony_ci napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager)); 117b1b8bc3fSopenharmony_ci 118b1b8bc3fSopenharmony_ci auto deleter = [](Context *context) { delete context; }; 119b1b8bc3fSopenharmony_ci auto text = new Context(env, manager); 120b1b8bc3fSopenharmony_ci std::unique_ptr<Context, decltype(deleter)> context(text, deleter); 121b1b8bc3fSopenharmony_ci if (!context) { 122b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(env); 123b1b8bc3fSopenharmony_ci } 124b1b8bc3fSopenharmony_ci 125b1b8bc3fSopenharmony_ci context->ParseParams(params, paramsCount); 126b1b8bc3fSopenharmony_ci if (!context->IsParseOK()) { 127b1b8bc3fSopenharmony_ci napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str()); 128b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(env); 129b1b8bc3fSopenharmony_ci } 130b1b8bc3fSopenharmony_ci if (Work != nullptr) { 131b1b8bc3fSopenharmony_ci if (!Work(env, thisVal, context.get())) { 132b1b8bc3fSopenharmony_ci NETMANAGER_BASE_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 133b1b8bc3fSopenharmony_ci } 134b1b8bc3fSopenharmony_ci } 135b1b8bc3fSopenharmony_ci 136b1b8bc3fSopenharmony_ci if (!executor || !callback) { 137b1b8bc3fSopenharmony_ci NETMANAGER_BASE_LOGE("executor or callback is null"); 138b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(context->GetEnv()); 139b1b8bc3fSopenharmony_ci } 140b1b8bc3fSopenharmony_ci 141b1b8bc3fSopenharmony_ci if (!executor(context.get())) { 142b1b8bc3fSopenharmony_ci NETMANAGER_BASE_LOGE("executor is fail, errorcode= %{public}d", context->GetErrorCode()); 143b1b8bc3fSopenharmony_ci napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str()); 144b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(env); 145b1b8bc3fSopenharmony_ci } 146b1b8bc3fSopenharmony_ci return callback(context.get()); 147b1b8bc3fSopenharmony_ci} 148b1b8bc3fSopenharmony_ci 149b1b8bc3fSopenharmony_citemplate <class Context> 150b1b8bc3fSopenharmony_cinapi_value InterfaceWithOutAsyncWork(napi_env env, napi_callback_info info, 151b1b8bc3fSopenharmony_ci bool (*Work)(napi_env, napi_value, Context *)) 152b1b8bc3fSopenharmony_ci{ 153b1b8bc3fSopenharmony_ci static_assert(std::is_base_of<BaseContext, Context>::value); 154b1b8bc3fSopenharmony_ci 155b1b8bc3fSopenharmony_ci napi_value thisVal = nullptr; 156b1b8bc3fSopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 157b1b8bc3fSopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 158b1b8bc3fSopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 159b1b8bc3fSopenharmony_ci 160b1b8bc3fSopenharmony_ci EventManager *manager = nullptr; 161b1b8bc3fSopenharmony_ci napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager)); 162b1b8bc3fSopenharmony_ci 163b1b8bc3fSopenharmony_ci auto context = new Context(env, manager); 164b1b8bc3fSopenharmony_ci context->ParseParams(params, paramsCount); 165b1b8bc3fSopenharmony_ci if (Work != nullptr) { 166b1b8bc3fSopenharmony_ci if (!Work(env, thisVal, context)) { 167b1b8bc3fSopenharmony_ci NETMANAGER_BASE_LOGE("work failed error code = %{public}d", context->GetErrorCode()); 168b1b8bc3fSopenharmony_ci } 169b1b8bc3fSopenharmony_ci } 170b1b8bc3fSopenharmony_ci 171b1b8bc3fSopenharmony_ci if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) { 172b1b8bc3fSopenharmony_ci return context->CreatePromise(); 173b1b8bc3fSopenharmony_ci } 174b1b8bc3fSopenharmony_ci return NapiUtils::GetUndefined(env); 175b1b8bc3fSopenharmony_ci} 176b1b8bc3fSopenharmony_ci 177b1b8bc3fSopenharmony_cinapi_value On(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 178b1b8bc3fSopenharmony_ci bool asyncCallback); 179b1b8bc3fSopenharmony_ci 180b1b8bc3fSopenharmony_cinapi_value Once(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 181b1b8bc3fSopenharmony_ci bool asyncCallback); 182b1b8bc3fSopenharmony_ci 183b1b8bc3fSopenharmony_cinapi_value Off(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events); 184b1b8bc3fSopenharmony_ci 185b1b8bc3fSopenharmony_civoid DefineClass(napi_env env, napi_value exports, const std::initializer_list<napi_property_descriptor> &properties, 186b1b8bc3fSopenharmony_ci const std::string &className); 187b1b8bc3fSopenharmony_ci 188b1b8bc3fSopenharmony_cinapi_value NewInstance(napi_env env, napi_callback_info info, const std::string &className, 189b1b8bc3fSopenharmony_ci void *(*MakeData)(napi_env, size_t, napi_value *, EventManager *), Finalizer finalizer); 190b1b8bc3fSopenharmony_ci} // namespace ModuleTemplate 191b1b8bc3fSopenharmony_ci} // namespace NetManagerStandard 192b1b8bc3fSopenharmony_ci} // namespace OHOS 193b1b8bc3fSopenharmony_ci#endif // COMMUNICATIONNETMANAGER_BASE_NETMANAGER_BASE_MODULE_TEMPLATE_H 194