1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "module_template.h"
17 #include "netmanager_base_log.h"
18
19 #include <algorithm>
20 #ifndef CROSS_PLATFORM
21 #include "hi_app_event_report.h"
22 #endif
23
24 namespace OHOS {
25 namespace NetManagerStandard {
26 namespace ModuleTemplate {
27 namespace {
28 static constexpr const int EVENT_PARAM_NUM = 2;
29 } // namespace
30
On(napi_env env,napi_callback_info info,const std::initializer_list<std::string> & events,bool asyncCallback)31 napi_value On(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
32 bool asyncCallback)
33 {
34 #ifndef CROSS_PLATFORM
35 HiAppEventReport hiAppEventReport("NetworkKit", "ConnectionOn");
36 #endif
37 napi_value thisVal = nullptr;
38 size_t paramsCount = MAX_PARAM_NUM;
39 napi_value params[MAX_PARAM_NUM] = {nullptr};
40 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
41
42 if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string ||
43 NapiUtils::GetValueType(env, params[1]) != napi_function) {
44 NETMANAGER_BASE_LOGE("napi on interface para: [string, function]");
45 return NapiUtils::GetUndefined(env);
46 }
47
48 std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
49 if (std::find(events.begin(), events.end(), event) == events.end()) {
50 return NapiUtils::GetUndefined(env);
51 }
52
53 std::shared_ptr<EventManager> *sharedManager = nullptr;
54 napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
55 if (sharedManager != nullptr && *sharedManager != nullptr) {
56 auto manager = *sharedManager;
57 manager->AddListener(env, event, params[1], false, asyncCallback);
58 }
59 #ifndef CROSS_PLATFORM
60 hiAppEventReport.ReportSdkEvent(RESULT_SUCCESS, ERR_NONE);
61 #endif
62 return NapiUtils::GetUndefined(env);
63 }
64
Once(napi_env env,napi_callback_info info,const std::initializer_list<std::string> & events,bool asyncCallback)65 napi_value Once(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
66 bool asyncCallback)
67 {
68 napi_value thisVal = nullptr;
69 size_t paramsCount = MAX_PARAM_NUM;
70 napi_value params[MAX_PARAM_NUM] = {nullptr};
71 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
72
73 if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string ||
74 NapiUtils::GetValueType(env, params[1]) != napi_function) {
75 NETMANAGER_BASE_LOGE("napi once interface para: [string, function]");
76 return NapiUtils::GetUndefined(env);
77 }
78
79 std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
80 if (std::find(events.begin(), events.end(), event) == events.end()) {
81 return NapiUtils::GetUndefined(env);
82 }
83
84 std::shared_ptr<EventManager> *sharedManager = nullptr;
85 napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
86 if (sharedManager != nullptr && *sharedManager != nullptr) {
87 auto manager = *sharedManager;
88 manager->AddListener(env, event, params[1], true, asyncCallback);
89 }
90
91 return NapiUtils::GetUndefined(env);
92 }
93
Off(napi_env env,napi_callback_info info,const std::initializer_list<std::string> & events)94 napi_value Off(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events)
95 {
96 napi_value thisVal = nullptr;
97 size_t paramsCount = MAX_PARAM_NUM;
98 napi_value params[MAX_PARAM_NUM] = {nullptr};
99 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
100
101 if ((paramsCount != 1 && paramsCount != EVENT_PARAM_NUM) ||
102 NapiUtils::GetValueType(env, params[0]) != napi_string) {
103 NETMANAGER_BASE_LOGE("napi off interface para: [string, function?]");
104 return NapiUtils::GetUndefined(env);
105 }
106
107 if (paramsCount == EVENT_PARAM_NUM && NapiUtils::GetValueType(env, params[1]) != napi_function) {
108 NETMANAGER_BASE_LOGE("napi off interface para: [string, function]");
109 return NapiUtils::GetUndefined(env);
110 }
111
112 std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
113 if (std::find(events.begin(), events.end(), event) == events.end()) {
114 return NapiUtils::GetUndefined(env);
115 }
116
117 std::shared_ptr<EventManager> *sharedManager = nullptr;
118 napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
119 if (sharedManager != nullptr && *sharedManager != nullptr) {
120 auto manager = *sharedManager;
121 if (paramsCount == EVENT_PARAM_NUM) {
122 manager->DeleteListener(event, params[1]);
123 } else {
124 manager->DeleteListener(event);
125 }
126 }
127
128 return NapiUtils::GetUndefined(env);
129 }
130
DefineClass(napi_env env,napi_value exports,const std::initializer_list<napi_property_descriptor> & properties,const std::string & className)131 void DefineClass(napi_env env, napi_value exports, const std::initializer_list<napi_property_descriptor> &properties,
132 const std::string &className)
133 {
134 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
135 napi_value thisVal = nullptr;
136 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr));
137
138 return thisVal;
139 };
140
141 napi_value jsConstructor = nullptr;
142
143 napi_property_descriptor descriptors[properties.size()];
144 std::copy(properties.begin(), properties.end(), descriptors);
145
146 NAPI_CALL_RETURN_VOID(env, napi_define_class(env, className.c_str(), NAPI_AUTO_LENGTH, constructor, nullptr,
147 properties.size(), descriptors, &jsConstructor));
148
149 NapiUtils::SetNamedProperty(env, exports, className, jsConstructor);
150 }
151
NewInstance(napi_env env,napi_callback_info info,const std::string & className,void * (* MakeData)(napi_env,size_t,napi_value *,std::shared_ptr<EventManager> &),Finalizer finalizer)152 napi_value NewInstance(napi_env env, napi_callback_info info, const std::string &className,
153 void *(*MakeData)(napi_env, size_t, napi_value *, std::shared_ptr<EventManager>&), Finalizer finalizer)
154 {
155 napi_value thisVal = nullptr;
156 std::size_t argc = MAX_PARAM_NUM;
157 napi_value argv[MAX_PARAM_NUM] = {nullptr};
158 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVal, nullptr));
159
160 napi_value jsConstructor = NapiUtils::GetNamedProperty(env, thisVal, className);
161 if (NapiUtils::GetValueType(env, jsConstructor) == napi_undefined) {
162 return nullptr;
163 }
164
165 napi_value result = nullptr;
166 NAPI_CALL(env, napi_new_instance(env, jsConstructor, 0, nullptr, &result));
167
168 auto manager = std::make_shared<EventManager>();
169 if (MakeData != nullptr) {
170 auto data = MakeData(env, argc, argv, manager);
171 if (data == nullptr) {
172 return NapiUtils::GetUndefined(env);
173 }
174 manager->SetData(data);
175 }
176 auto sharedManager = new (std::nothrow) std::shared_ptr<EventManager>();
177 if (sharedManager == nullptr) {
178 return nullptr;
179 }
180 *sharedManager = manager;
181 napi_wrap(env, result, reinterpret_cast<void *>(sharedManager), finalizer, nullptr, nullptr);
182
183 return result;
184 }
185 } // namespace ModuleTemplate
186 } // namespace NetManagerStandard
187 } // namespace OHOS
188