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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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