1 /*
2 * Copyright (c) 2021-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 "base_context.h"
17
18 #include "event_manager.h"
19 #include "napi/native_api.h"
20 #include "napi/native_common.h"
21 #include "napi_utils.h"
22 #include "node_api.h"
23
24 namespace OHOS::NetStack {
BaseContext(napi_env env,EventManager * manager)25 BaseContext::BaseContext(napi_env env, EventManager *manager)
26 : manager_(manager),
27 env_(env),
28 ref_(nullptr),
29 parseOK_(false),
30 requestOK_(false),
31 errorCode_(0),
32 callback_(nullptr),
33 promiseRef_(nullptr),
34 asyncWork_(nullptr),
35 deferred_(nullptr),
36 needPromise_(true),
37 needThrowException_(false),
38 permissionDenied_(false),
39 noAllowedHost_(false)
40 {
41 }
42
BaseContext(napi_env env,const std::shared_ptr<EventManager> & sharedManager)43 BaseContext::BaseContext(napi_env env, const std::shared_ptr<EventManager> &sharedManager)
44 : manager_(nullptr),
45 env_(env),
46 ref_(nullptr),
47 parseOK_(false),
48 requestOK_(false),
49 errorCode_(0),
50 callback_(nullptr),
51 promiseRef_(nullptr),
52 asyncWork_(nullptr),
53 deferred_(nullptr),
54 needPromise_(true),
55 needThrowException_(false),
56 permissionDenied_(false),
57 noAllowedHost_(false),
58 sharedManager_(sharedManager)
59 {
60 }
61
~BaseContext()62 BaseContext::~BaseContext()
63 {
64 DeleteCallback();
65 DeletePromise();
66 DeleteAsyncWork();
67 }
68
SetParseOK(bool parseOK)69 void BaseContext::SetParseOK(bool parseOK)
70 {
71 parseOK_ = parseOK;
72 }
73
SetExecOK(bool requestOK)74 void BaseContext::SetExecOK(bool requestOK)
75 {
76 requestOK_ = requestOK;
77 }
78
SetErrorCode(int32_t errorCode)79 void BaseContext::SetErrorCode(int32_t errorCode)
80 {
81 errorCode_ = errorCode;
82 }
83
SetError(int32_t errorCode,const std::string & errorMessage)84 void BaseContext::SetError(int32_t errorCode, const std::string &errorMessage)
85 {
86 errorCode_ = errorCode;
87 errorMessage_ = errorMessage;
88 }
89
SetCallback(napi_value callback)90 napi_status BaseContext::SetCallback(napi_value callback)
91 {
92 if (callback_ != nullptr) {
93 (void)napi_delete_reference(env_, callback_);
94 }
95 auto status = napi_create_reference(env_, callback, 1, &callback_);
96 callbackBak1_ = callback_;
97 callbackBak2_ = callback_;
98 callbackBak3_ = callback_;
99 callbackBak4_ = callback_;
100 return status;
101 }
102
DeleteCallback()103 void BaseContext::DeleteCallback()
104 {
105 if (callback_ == nullptr || callback_ != callbackBak1_ || callback_ != callbackBak2_ ||
106 callback_ != callbackBak3_ || callback_ != callbackBak4_) {
107 return;
108 }
109 (void)napi_delete_reference(env_, callback_);
110 callback_ = nullptr;
111 }
112
GetAsyncWork()113 napi_async_work BaseContext::GetAsyncWork()
114 {
115 return asyncWork_;
116 }
117
CreateAsyncWork(const std::string & name,AsyncWorkExecutor executor,AsyncWorkCallback callback)118 void BaseContext::CreateAsyncWork(const std::string &name, AsyncWorkExecutor executor, AsyncWorkCallback callback)
119 {
120 napi_status ret = napi_create_async_work(env_, nullptr, NapiUtils::CreateStringUtf8(env_, name), executor, callback,
121 this, &asyncWork_);
122 asyncWorkBack1_ = asyncWork_;
123 asyncWorkBack2_ = asyncWork_;
124 asyncWorkBack3_ = asyncWork_;
125 asyncWorkBack4_ = asyncWork_;
126 if (ret != napi_ok) {
127 return;
128 }
129 asyncWorkName_ = name;
130 (void)napi_queue_async_work_with_qos(env_, asyncWork_, napi_qos_default);
131 }
132
DeleteAsyncWork()133 void BaseContext::DeleteAsyncWork()
134 {
135 if (asyncWork_ == nullptr) {
136 return;
137 }
138 (void)napi_delete_async_work(env_, asyncWork_);
139 }
140
CreatePromise()141 napi_value BaseContext::CreatePromise()
142 {
143 napi_value result = nullptr;
144 NAPI_CALL(env_, napi_create_promise(env_, &deferred_, &result));
145 promiseRef_ = NapiUtils::CreateReference(env_, result);
146 deferredBack1_ = deferred_;
147 deferredBack2_ = deferred_;
148 deferredBack3_ = deferred_;
149 deferredBack4_ = deferred_;
150 return result;
151 }
152
DeletePromise()153 void BaseContext::DeletePromise()
154 {
155 if (promiseRef_ == nullptr) {
156 return;
157 }
158 (void)napi_delete_reference(env_, promiseRef_);
159 promiseRef_ = nullptr;
160 }
161
IsParseOK() const162 bool BaseContext::IsParseOK() const
163 {
164 return parseOK_;
165 }
166
IsExecOK() const167 bool BaseContext::IsExecOK() const
168 {
169 return requestOK_;
170 }
171
GetEnv() const172 napi_env BaseContext::GetEnv() const
173 {
174 return env_;
175 }
176
GetErrorCode() const177 int32_t BaseContext::GetErrorCode() const
178 {
179 return errorCode_;
180 }
181
GetErrorMessage() const182 std::string BaseContext::GetErrorMessage() const
183 {
184 return errorMessage_;
185 }
186
GetCallback() const187 napi_value BaseContext::GetCallback() const
188 {
189 if (callback_ == nullptr || callback_ != callbackBak1_ || callback_ != callbackBak2_ ||
190 callback_ != callbackBak3_ || callback_ != callbackBak4_) {
191 return nullptr;
192 }
193 napi_value callback = nullptr;
194 NAPI_CALL(env_, napi_get_reference_value(env_, callback_, &callback));
195 return callback;
196 }
197
GetDeferred() const198 napi_deferred BaseContext::GetDeferred() const
199 {
200 return deferred_;
201 }
202
GetAsyncWorkName() const203 const std::string &BaseContext::GetAsyncWorkName() const
204 {
205 return asyncWorkName_;
206 }
207
EmitSharedManager(const std::string & type,const std::pair<napi_value,napi_value> & argv)208 void BaseContext::EmitSharedManager(const std::string &type, const std::pair<napi_value, napi_value> &argv)
209 {
210 if (sharedManager_ != nullptr) {
211 sharedManager_->Emit(type, argv);
212 }
213 }
214
Emit(const std::string & type,const std::pair<napi_value,napi_value> & argv)215 void BaseContext::Emit(const std::string &type, const std::pair<napi_value, napi_value> &argv)
216 {
217 if (manager_ != nullptr) {
218 manager_->Emit(type, argv);
219 }
220 }
221
SetNeedPromise(bool needPromise)222 void BaseContext::SetNeedPromise(bool needPromise)
223 {
224 needPromise_ = needPromise;
225 }
226
IsNeedPromise() const227 bool BaseContext::IsNeedPromise() const
228 {
229 return needPromise_;
230 }
231
GetManager() const232 EventManager *BaseContext::GetManager() const
233 {
234 return manager_;
235 }
236
GetSharedManager() const237 std::shared_ptr<EventManager> BaseContext::GetSharedManager() const
238 {
239 return sharedManager_;
240 }
241
SetSharedManager(const std::shared_ptr<EventManager> & sharedManager)242 void BaseContext::SetSharedManager(const std::shared_ptr<EventManager> &sharedManager)
243 {
244 sharedManager_ = sharedManager;
245 }
246
ParseParams(napi_value * params,size_t paramsCount)247 void BaseContext::ParseParams(napi_value *params, size_t paramsCount)
248 {
249 if (paramsCount != 0 && paramsCount != 1) {
250 return;
251 }
252
253 if (paramsCount == 1 && NapiUtils::GetValueType(env_, params[0]) != napi_function) {
254 return;
255 }
256
257 if (paramsCount == 1) {
258 SetParseOK(SetCallback(params[0]) == napi_ok);
259 return;
260 }
261 SetParseOK(true);
262 }
263
SetNeedThrowException(bool needThrowException)264 void BaseContext::SetNeedThrowException(bool needThrowException)
265 {
266 needThrowException_ = needThrowException;
267 }
268
IsNeedThrowException() const269 bool BaseContext::IsNeedThrowException() const
270 {
271 return needThrowException_;
272 }
273
SetPermissionDenied(bool permissionDenied)274 void BaseContext::SetPermissionDenied(bool permissionDenied)
275 {
276 permissionDenied_ = permissionDenied;
277 }
278
IsPermissionDenied() const279 bool BaseContext::IsPermissionDenied() const
280 {
281 return permissionDenied_;
282 }
283
SetNoAllowedHost(bool noAllowed)284 void BaseContext::SetNoAllowedHost(bool noAllowed)
285 {
286 noAllowedHost_ = noAllowed;
287 }
288
IsNoAllowedHost() const289 bool BaseContext::IsNoAllowedHost() const
290 {
291 return noAllowedHost_;
292 }
293
CreateReference(napi_value value)294 void BaseContext::CreateReference(napi_value value)
295 {
296 if (env_ != nullptr && value != nullptr) {
297 ref_ = NapiUtils::CreateReference(env_, value);
298 }
299 }
300
DeleteReference()301 void BaseContext::DeleteReference()
302 {
303 if (env_ != nullptr && ref_ != nullptr) {
304 NapiUtils::DeleteReference(env_, ref_);
305 }
306 }
307 } // namespace OHOS::NetStack
308