1b1b8bc3fSopenharmony_ci/*
2b1b8bc3fSopenharmony_ci * Copyright (c) 2022 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#include "module_template.h"
17b1b8bc3fSopenharmony_ci#include "netmanager_base_log.h"
18b1b8bc3fSopenharmony_ci
19b1b8bc3fSopenharmony_ci#include <algorithm>
20b1b8bc3fSopenharmony_ci
21b1b8bc3fSopenharmony_cinamespace OHOS {
22b1b8bc3fSopenharmony_cinamespace NetManagerStandard {
23b1b8bc3fSopenharmony_cinamespace ModuleTemplate {
24b1b8bc3fSopenharmony_cinamespace {
25b1b8bc3fSopenharmony_cistatic constexpr const int EVENT_PARAM_NUM = 2;
26b1b8bc3fSopenharmony_ci} // namespace
27b1b8bc3fSopenharmony_ci
28b1b8bc3fSopenharmony_cinapi_value On(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
29b1b8bc3fSopenharmony_ci              bool asyncCallback)
30b1b8bc3fSopenharmony_ci{
31b1b8bc3fSopenharmony_ci    napi_value thisVal = nullptr;
32b1b8bc3fSopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
33b1b8bc3fSopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
34b1b8bc3fSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
35b1b8bc3fSopenharmony_ci
36b1b8bc3fSopenharmony_ci    if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string ||
37b1b8bc3fSopenharmony_ci        NapiUtils::GetValueType(env, params[1]) != napi_function) {
38b1b8bc3fSopenharmony_ci        NETMANAGER_BASE_LOGE("napi on interface para: [string, function]");
39b1b8bc3fSopenharmony_ci        return NapiUtils::GetUndefined(env);
40b1b8bc3fSopenharmony_ci    }
41b1b8bc3fSopenharmony_ci
42b1b8bc3fSopenharmony_ci    std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
43b1b8bc3fSopenharmony_ci    if (std::find(events.begin(), events.end(), event) == events.end()) {
44b1b8bc3fSopenharmony_ci        return NapiUtils::GetUndefined(env);
45b1b8bc3fSopenharmony_ci    }
46b1b8bc3fSopenharmony_ci
47b1b8bc3fSopenharmony_ci    EventManager *manager = nullptr;
48b1b8bc3fSopenharmony_ci    napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager));
49b1b8bc3fSopenharmony_ci    if (manager != nullptr) {
50b1b8bc3fSopenharmony_ci        manager->AddListener(env, event, params[1], false, asyncCallback);
51b1b8bc3fSopenharmony_ci    }
52b1b8bc3fSopenharmony_ci
53b1b8bc3fSopenharmony_ci    return NapiUtils::GetUndefined(env);
54b1b8bc3fSopenharmony_ci}
55b1b8bc3fSopenharmony_ci
56b1b8bc3fSopenharmony_cinapi_value Once(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
57b1b8bc3fSopenharmony_ci                bool asyncCallback)
58b1b8bc3fSopenharmony_ci{
59b1b8bc3fSopenharmony_ci    napi_value thisVal = nullptr;
60b1b8bc3fSopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
61b1b8bc3fSopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
62b1b8bc3fSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
63b1b8bc3fSopenharmony_ci
64b1b8bc3fSopenharmony_ci    if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string ||
65b1b8bc3fSopenharmony_ci        NapiUtils::GetValueType(env, params[1]) != napi_function) {
66b1b8bc3fSopenharmony_ci        NETMANAGER_BASE_LOGE("napi once interface para: [string, function]");
67b1b8bc3fSopenharmony_ci        return NapiUtils::GetUndefined(env);
68b1b8bc3fSopenharmony_ci    }
69b1b8bc3fSopenharmony_ci
70b1b8bc3fSopenharmony_ci    std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
71b1b8bc3fSopenharmony_ci    if (std::find(events.begin(), events.end(), event) == events.end()) {
72b1b8bc3fSopenharmony_ci        return NapiUtils::GetUndefined(env);
73b1b8bc3fSopenharmony_ci    }
74b1b8bc3fSopenharmony_ci
75b1b8bc3fSopenharmony_ci    EventManager *manager = nullptr;
76b1b8bc3fSopenharmony_ci    napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager));
77b1b8bc3fSopenharmony_ci    if (manager != nullptr) {
78b1b8bc3fSopenharmony_ci        manager->AddListener(env, event, params[1], true, asyncCallback);
79b1b8bc3fSopenharmony_ci    }
80b1b8bc3fSopenharmony_ci
81b1b8bc3fSopenharmony_ci    return NapiUtils::GetUndefined(env);
82b1b8bc3fSopenharmony_ci}
83b1b8bc3fSopenharmony_ci
84b1b8bc3fSopenharmony_cinapi_value Off(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events)
85b1b8bc3fSopenharmony_ci{
86b1b8bc3fSopenharmony_ci    napi_value thisVal = nullptr;
87b1b8bc3fSopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
88b1b8bc3fSopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
89b1b8bc3fSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
90b1b8bc3fSopenharmony_ci
91b1b8bc3fSopenharmony_ci    if ((paramsCount != 1 && paramsCount != EVENT_PARAM_NUM) ||
92b1b8bc3fSopenharmony_ci        NapiUtils::GetValueType(env, params[0]) != napi_string) {
93b1b8bc3fSopenharmony_ci        NETMANAGER_BASE_LOGE("napi off interface para: [string, function?]");
94b1b8bc3fSopenharmony_ci        return NapiUtils::GetUndefined(env);
95b1b8bc3fSopenharmony_ci    }
96b1b8bc3fSopenharmony_ci
97b1b8bc3fSopenharmony_ci    if (paramsCount == EVENT_PARAM_NUM && NapiUtils::GetValueType(env, params[1]) != napi_function) {
98b1b8bc3fSopenharmony_ci        NETMANAGER_BASE_LOGE("napi off interface para: [string, function]");
99b1b8bc3fSopenharmony_ci        return NapiUtils::GetUndefined(env);
100b1b8bc3fSopenharmony_ci    }
101b1b8bc3fSopenharmony_ci
102b1b8bc3fSopenharmony_ci    std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
103b1b8bc3fSopenharmony_ci    if (std::find(events.begin(), events.end(), event) == events.end()) {
104b1b8bc3fSopenharmony_ci        return NapiUtils::GetUndefined(env);
105b1b8bc3fSopenharmony_ci    }
106b1b8bc3fSopenharmony_ci
107b1b8bc3fSopenharmony_ci    EventManager *manager = nullptr;
108b1b8bc3fSopenharmony_ci    napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager));
109b1b8bc3fSopenharmony_ci    if (manager != nullptr) {
110b1b8bc3fSopenharmony_ci        if (paramsCount == EVENT_PARAM_NUM) {
111b1b8bc3fSopenharmony_ci            manager->DeleteListener(event, params[1]);
112b1b8bc3fSopenharmony_ci        } else {
113b1b8bc3fSopenharmony_ci            manager->DeleteListener(event);
114b1b8bc3fSopenharmony_ci        }
115b1b8bc3fSopenharmony_ci    }
116b1b8bc3fSopenharmony_ci
117b1b8bc3fSopenharmony_ci    return NapiUtils::GetUndefined(env);
118b1b8bc3fSopenharmony_ci}
119b1b8bc3fSopenharmony_ci
120b1b8bc3fSopenharmony_civoid DefineClass(napi_env env, napi_value exports, const std::initializer_list<napi_property_descriptor> &properties,
121b1b8bc3fSopenharmony_ci                 const std::string &className)
122b1b8bc3fSopenharmony_ci{
123b1b8bc3fSopenharmony_ci    auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
124b1b8bc3fSopenharmony_ci        napi_value thisVal = nullptr;
125b1b8bc3fSopenharmony_ci        NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr));
126b1b8bc3fSopenharmony_ci
127b1b8bc3fSopenharmony_ci        return thisVal;
128b1b8bc3fSopenharmony_ci    };
129b1b8bc3fSopenharmony_ci
130b1b8bc3fSopenharmony_ci    napi_value jsConstructor = nullptr;
131b1b8bc3fSopenharmony_ci
132b1b8bc3fSopenharmony_ci    napi_property_descriptor descriptors[properties.size()];
133b1b8bc3fSopenharmony_ci    std::copy(properties.begin(), properties.end(), descriptors);
134b1b8bc3fSopenharmony_ci
135b1b8bc3fSopenharmony_ci    NAPI_CALL_RETURN_VOID(env, napi_define_class(env, className.c_str(), NAPI_AUTO_LENGTH, constructor, nullptr,
136b1b8bc3fSopenharmony_ci                                                 properties.size(), descriptors, &jsConstructor));
137b1b8bc3fSopenharmony_ci
138b1b8bc3fSopenharmony_ci    NapiUtils::SetNamedProperty(env, exports, className, jsConstructor);
139b1b8bc3fSopenharmony_ci}
140b1b8bc3fSopenharmony_ci
141b1b8bc3fSopenharmony_cinapi_value NewInstance(napi_env env, napi_callback_info info, const std::string &className,
142b1b8bc3fSopenharmony_ci                       void *(*MakeData)(napi_env, size_t, napi_value *, EventManager *), Finalizer finalizer)
143b1b8bc3fSopenharmony_ci{
144b1b8bc3fSopenharmony_ci    napi_value thisVal = nullptr;
145b1b8bc3fSopenharmony_ci    std::size_t argc = MAX_PARAM_NUM;
146b1b8bc3fSopenharmony_ci    napi_value argv[MAX_PARAM_NUM] = {nullptr};
147b1b8bc3fSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVal, nullptr));
148b1b8bc3fSopenharmony_ci
149b1b8bc3fSopenharmony_ci    napi_value jsConstructor = NapiUtils::GetNamedProperty(env, thisVal, className);
150b1b8bc3fSopenharmony_ci    if (NapiUtils::GetValueType(env, jsConstructor) == napi_undefined) {
151b1b8bc3fSopenharmony_ci        return nullptr;
152b1b8bc3fSopenharmony_ci    }
153b1b8bc3fSopenharmony_ci
154b1b8bc3fSopenharmony_ci    napi_value result = nullptr;
155b1b8bc3fSopenharmony_ci    NAPI_CALL(env, napi_new_instance(env, jsConstructor, 0, nullptr, &result));
156b1b8bc3fSopenharmony_ci
157b1b8bc3fSopenharmony_ci    auto manager = new EventManager();
158b1b8bc3fSopenharmony_ci    if (MakeData != nullptr) {
159b1b8bc3fSopenharmony_ci        auto data = MakeData(env, argc, argv, manager);
160b1b8bc3fSopenharmony_ci        if (data == nullptr) {
161b1b8bc3fSopenharmony_ci            return NapiUtils::GetUndefined(env);
162b1b8bc3fSopenharmony_ci        }
163b1b8bc3fSopenharmony_ci        manager->SetData(data);
164b1b8bc3fSopenharmony_ci    }
165b1b8bc3fSopenharmony_ci    napi_wrap(env, result, reinterpret_cast<void *>(manager), finalizer, nullptr, nullptr);
166b1b8bc3fSopenharmony_ci
167b1b8bc3fSopenharmony_ci    return result;
168b1b8bc3fSopenharmony_ci}
169b1b8bc3fSopenharmony_ci} // namespace ModuleTemplate
170b1b8bc3fSopenharmony_ci} // namespace NetManagerStandard
171b1b8bc3fSopenharmony_ci} // namespace OHOS
172