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