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 "upload_task_napiV9.h"
17 #include <uv.h>
18 #include "uri.h"
19 #include "async_call.h"
20 #include "js_util.h"
21 #include "constant.h"
22 #include "upload_task.h"
23 #include "upload_config.h"
24 #include "napi_base_context.h"
25 #include "napi_data_ability_operation.h"
26
27 using namespace OHOS::AppExecFwk;
28 using namespace OHOS::Request::Upload;
29 namespace OHOS::Request::UploadNapi {
30 std::map<std::string, UploadTaskNapiV9::Exec> UploadTaskNapiV9::onTypeHandlers_ = {
31 {"progress", UploadTaskNapiV9::OnProgress},
32 {"headerReceive", UploadTaskNapiV9::OnHeaderReceive},
33 {"fail", UploadTaskNapiV9::OnFail},
34 {"complete", UploadTaskNapiV9::OnComplete},
35 };
36 std::map<std::string, UploadTaskNapiV9::Exec> UploadTaskNapiV9::offTypeHandlers_ = {
37 {"progress", UploadTaskNapiV9::OffProgress},
38 {"headerReceive", UploadTaskNapiV9::OffHeaderReceive},
39 {"fail", UploadTaskNapiV9::OffFail},
40 {"complete", UploadTaskNapiV9::OffComplete},
41 };
42
JsUploadFile(napi_env env,napi_callback_info info)43 napi_value UploadTaskNapiV9::JsUploadFile(napi_env env, napi_callback_info info)
44 {
45 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter JsUpload.");
46 struct ContextInfo {
47 napi_ref ref = nullptr;
48 };
49 auto ctxInfo = std::make_shared<ContextInfo>();
50 auto input = [ctxInfo](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
51 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Upload parser to native params %{public}d!", static_cast<int>(argc));
52 if (argc < 2) {
53 JSUtil::ThrowError(env, Download::EXCEPTION_PARAMETER_CHECK, "need 2 parameters!");
54 return napi_invalid_arg;
55 }
56
57 napi_value uploadProxy = nullptr;
58 napi_status status = napi_new_instance(env, GetCtor(env), argc, argv, &uploadProxy);
59 if ((uploadProxy == nullptr) || (status != napi_ok)) {
60 return napi_generic_failure;
61 }
62 napi_create_reference(env, uploadProxy, 1, &(ctxInfo->ref));
63 return napi_ok;
64 };
65 auto output = [ctxInfo](napi_env env, napi_value *result) -> napi_status {
66 napi_status status = napi_get_reference_value(env, ctxInfo->ref, result);
67 napi_delete_reference(env, ctxInfo->ref);
68 return status;
69 };
70 auto context = std::make_shared<AsyncCall::Context>(input, output);
71 AsyncCall asyncCall(env, info, context);
72 return asyncCall.Call(env);
73 }
74
GetCtor(napi_env env)75 napi_value UploadTaskNapiV9::GetCtor(napi_env env)
76 {
77 napi_value cons = nullptr;
78 napi_property_descriptor clzDes[] = {
79 DECLARE_NAPI_METHOD("on", JsOn),
80 DECLARE_NAPI_METHOD("off", JsOff),
81 DECLARE_NAPI_METHOD("delete", JsDelete),
82 DECLARE_NAPI_METHOD("remove", JsDelete),
83 };
84 napi_status status = napi_define_class(env, "UploadTaskNapiV9", NAPI_AUTO_LENGTH, Initialize, nullptr,
85 sizeof(clzDes) / sizeof(napi_property_descriptor), clzDes, &cons);
86 if (status != napi_ok || cons == nullptr) {
87 return nullptr;
88 }
89 return cons;
90 }
91
Initialize(napi_env env,napi_callback_info info)92 napi_value UploadTaskNapiV9::Initialize(napi_env env, napi_callback_info info)
93 {
94 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "constructor upload task!");
95 napi_value self = nullptr;
96 auto *proxy = new (std::nothrow) UploadTaskNapiV9();
97 if (proxy == nullptr) {
98 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "Failed to create UploadTaskNapiV9");
99 return nullptr;
100 }
101
102 napi_status status = InitParam(env, info, self, proxy);
103 if (status != napi_ok) {
104 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "Failed to InitParam");
105 delete proxy;
106 return nullptr;
107 }
108
109 proxy->napiUploadTask_ = std::make_shared<Upload::UploadTask>(proxy->napiUploadConfig_);
110 if (proxy->napiUploadTask_ == nullptr) {
111 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "Failed to create UploadTask");
112 delete proxy;
113 return nullptr;
114 }
115
116 proxy->napiUploadTask_->SetContext(proxy->context_);
117 proxy->napiUploadTask_->ExecuteTask();
118
119 auto finalize = [](napi_env env, void * data, void * hint) {
120 UploadTaskNapiV9 *proxy = reinterpret_cast<UploadTaskNapiV9 *>(data);
121 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "UploadTaskNapiV9. delete.");
122 proxy->napiUploadTask_->Remove();
123 delete proxy;
124 };
125 if (napi_wrap(env, self, proxy, finalize, nullptr, nullptr) != napi_ok) {
126 finalize(env, proxy, nullptr);
127 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "UploadTaskNapiV9. napi_wrap fail.");
128 return nullptr;
129 }
130
131 return self;
132 }
133
InitParam(napi_env env,napi_callback_info info,napi_value & self,UploadTaskNapiV9 * proxy)134 napi_status UploadTaskNapiV9::InitParam(napi_env env, napi_callback_info info, napi_value &self,
135 UploadTaskNapiV9 *proxy)
136 {
137 size_t argc = JSUtil::MAX_ARGC;
138 napi_value argv[JSUtil::MAX_ARGC] = {nullptr};
139 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &self, nullptr), napi_invalid_arg);
140
141 napi_status getStatus = GetContext(env, &argv[0], proxy->context_);
142 if (getStatus != napi_ok) {
143 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "Initialize. GetContext fail.");
144 JSUtil::ThrowError(env, Download::EXCEPTION_OTHER, "GetContext fail");
145 return napi_invalid_arg;
146 }
147
148 proxy->napiUploadConfig_ = JSUtil::ParseUploadConfig(env, argv[1], "API9");
149 if (proxy->napiUploadConfig_ == nullptr) {
150 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "Initialize. ParseConfig fail.");
151 JSUtil::ThrowError(env, Download::EXCEPTION_PARAMETER_CHECK, "config error!");
152 return napi_invalid_arg;
153 }
154 std::vector<TaskState> taskStates;
155 uint32_t ret = CheckFilePath(proxy->napiUploadConfig_, proxy->context_, taskStates);
156 if (ret != Download::EXCEPTION_OK) {
157 std::string msg;
158 JSUtil::GetMessage(taskStates, msg);
159 JSUtil::ThrowError(env, static_cast<Download::ExceptionErrorCode>(ret), msg);
160 return napi_invalid_arg;
161 }
162 return napi_ok;
163 }
164
GetContext(napi_env env,napi_value * argv,std::shared_ptr<OHOS::AbilityRuntime::Context> & context)165 napi_status UploadTaskNapiV9::GetContext(napi_env env, napi_value *argv,
166 std::shared_ptr<OHOS::AbilityRuntime::Context>& context)
167 {
168 bool stageMode = false;
169 napi_status status = OHOS::AbilityRuntime::IsStageContext(env, argv[0], stageMode);
170 if ((status != napi_ok) || (!stageMode)) {
171 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "GetContext fail");
172 return napi_generic_failure;
173 }
174
175 context = OHOS::AbilityRuntime::GetStageModeContext(env, argv[0]);
176 if (context == nullptr) {
177 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI,
178 "GetAndSetContext. API9. GetStageModeContext contextRtm == nullptr.");
179 return napi_generic_failure;
180 }
181 return napi_ok;
182 }
183
CheckFilePath(const std::shared_ptr<UploadConfig> & config,std::shared_ptr<OHOS::AbilityRuntime::Context> & context,std::vector<Upload::TaskState> & taskStates)184 uint32_t UploadTaskNapiV9::CheckFilePath(const std::shared_ptr<UploadConfig> &config,
185 std::shared_ptr<OHOS::AbilityRuntime::Context> &context, std::vector<Upload::TaskState> &taskStates)
186 {
187 uint32_t ret = Download::EXCEPTION_OK;
188 std::string dataAbilityHead("dataability");
189 std::string internalHead("internal");
190 TaskState taskState;
191 for (auto f : config->files) {
192 if (f.uri.compare(0, dataAbilityHead.size(), dataAbilityHead) == 0) {
193 ret = CheckAbilityPath(f.uri, context);
194 } else if (f.uri.compare(0, internalHead.size(), internalHead) == 0) {
195 ret = CheckInternalPath(f.uri, context);
196 } else {
197 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "wrong path");
198 ret = Download::EXCEPTION_FILE_PATH;
199 }
200 taskState.path = f.filename;
201 taskState.responseCode = static_cast<int32_t>(ret);
202 taskStates.push_back(taskState);
203 }
204 return ret;
205 }
206
CheckAbilityPath(const std::string & fileUri,std::shared_ptr<OHOS::AbilityRuntime::Context> & context)207 uint32_t UploadTaskNapiV9::CheckAbilityPath(const std::string &fileUri,
208 std::shared_ptr<OHOS::AbilityRuntime::Context> &context)
209 {
210 std::shared_ptr<OHOS::Uri> uri = std::make_shared<OHOS::Uri>(fileUri);
211 std::shared_ptr<DataAbilityHelper> dataAbilityHelper = DataAbilityHelper::Creator(context, uri);
212 if (dataAbilityHelper == nullptr) {
213 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "dataAbilityHelper is nullptr!");
214 return Download::EXCEPTION_FILE_PATH;
215 }
216 int32_t fd = dataAbilityHelper->OpenFile(*uri, "r");
217 if (fd < 0) {
218 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "ObtainFileV9::GetDataAbilityFile, open file error.");
219 return Download::EXCEPTION_FILE_PATH;
220 }
221 return Download::EXCEPTION_OK;
222 }
223
CheckInternalPath(const std::string & fileUri,std::shared_ptr<OHOS::AbilityRuntime::Context> & context)224 uint32_t UploadTaskNapiV9::CheckInternalPath(const std::string &fileUri,
225 std::shared_ptr<OHOS::AbilityRuntime::Context> &context)
226 {
227 std::string filePath;
228 std::vector<std::string> uriSplit;
229 std::string pattern = "/";
230 std::string pathTmp = fileUri + pattern;
231 size_t pos = pathTmp.find(pattern);
232 while (pos != pathTmp.npos) {
233 std::string temp = pathTmp.substr(0, pos);
234 uriSplit.push_back(temp);
235 pathTmp = pathTmp.substr(pos + 1, pathTmp.size());
236 pos = pathTmp.find(pattern);
237 }
238 if (uriSplit[SPLIT_ZERO] != "internal:" || uriSplit[SPLIT_ONE] != "" ||
239 uriSplit[SPLIT_TWO] != "cache" || uriSplit.size() <= SPLIT_THREE) {
240 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "ObtainFileV9::GetInternalFile, internal path woring");
241 return Download::EXCEPTION_FILE_PATH;
242 }
243 filePath = context->GetCacheDir();
244 if (filePath.size() == 0) {
245 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "ObtainFileV9::GetInternalFile, internal to cache error");
246 return Download::EXCEPTION_FILE_PATH;
247 }
248 return Download::EXCEPTION_OK;
249 }
250
ParseParam(napi_env env,napi_callback_info info,bool IsRequiredParam,JsParam & jsParam)251 napi_status UploadTaskNapiV9::ParseParam(napi_env env, napi_callback_info info, bool IsRequiredParam,
252 JsParam &jsParam)
253 {
254 size_t argc = JSUtil::MAX_ARGC;
255 napi_value argv[JSUtil::MAX_ARGC] = {nullptr};
256 napi_status status = napi_get_cb_info(env, info, &argc, argv, &jsParam.self, nullptr);
257 if (status != napi_ok) {
258 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "napi_get_cb_info is fail");
259 return napi_invalid_arg;
260 }
261 if (jsParam.self == nullptr) {
262 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "jsParam.self is nullptr");
263 return napi_invalid_arg;
264 }
265
266 if (!JSUtil::CheckParamNumber(argc, IsRequiredParam)) {
267 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "CheckParamNumber is fail");
268 return napi_invalid_arg;
269 }
270 if (!JSUtil::CheckParamType(env, argv[0], napi_string)) {
271 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "argv[0] CheckParamType is fail");
272 return napi_invalid_arg;
273 }
274 jsParam.type = JSUtil::Convert2String(env, argv[0]);
275 if (onTypeHandlers_.find(jsParam.type) == onTypeHandlers_.end()) {
276 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "type find fail");
277 return napi_invalid_arg;
278 }
279 if (argc == TWO_ARG) {
280 if (!JSUtil::CheckParamType(env, argv[1], napi_function)) {
281 UPLOAD_HILOGE(UPLOAD_MODULE_JS_NAPI, "argv[1] CheckParamType is fail");
282 return napi_invalid_arg;
283 }
284 jsParam.callback = argv[1];
285 }
286 return napi_ok;
287 }
288
JsOn(napi_env env,napi_callback_info info)289 napi_value UploadTaskNapiV9::JsOn(napi_env env, napi_callback_info info)
290 {
291 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter JsOn.");
292 bool IsRequiredParam = true;
293 JsParam jsParam;
294 napi_status status = ParseParam(env, info, IsRequiredParam, jsParam);
295 NAPI_ASSERT(env, status == napi_ok, "ParseParam fail");
296 auto handle = onTypeHandlers_.find(jsParam.type);
297 handle->second(env, jsParam.callback, jsParam.self);
298 return nullptr;
299 }
300
JsOff(napi_env env,napi_callback_info info)301 napi_value UploadTaskNapiV9::JsOff(napi_env env, napi_callback_info info)
302 {
303 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter JsOff.");
304 bool IsRequiredParam = false;
305 JsParam jsParam;
306 napi_status status = ParseParam(env, info, IsRequiredParam, jsParam);
307 NAPI_ASSERT(env, status == napi_ok, "ParseParam fail");
308 auto handle = offTypeHandlers_.find(jsParam.type);
309 handle->second(env, jsParam.callback, jsParam.self);
310 return nullptr;
311 }
312
JsDelete(napi_env env,napi_callback_info info)313 napi_value UploadTaskNapiV9::JsDelete(napi_env env, napi_callback_info info)
314 {
315 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter JsRemove.");
316 auto context = std::make_shared<RemoveContextInfo>();
317 auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> napi_status {
318 if (argc != 0) {
319 JSUtil::ThrowError(env, Download::EXCEPTION_PARAMETER_CHECK, "should 0 parameter!");
320 return napi_invalid_arg;
321 }
322 return napi_ok;
323 };
324 auto output = [context](napi_env env, napi_value *result) -> napi_status {
325 napi_status status = napi_get_boolean(env, context->removeStatus, result);
326 return status;
327 };
328 auto exec = [context](AsyncCall::Context *ctx) {
329 context->removeStatus = context->proxy->napiUploadTask_->Remove();
330 if (context->removeStatus == true) {
331 context->status = napi_ok;
332 }
333 };
334 context->SetAction(std::move(input), std::move(output));
335 AsyncCall asyncCall(env, info, std::dynamic_pointer_cast<AsyncCall::Context>(context));
336 return asyncCall.Call(env, exec);
337 }
338
OnProgress(napi_env env,napi_value callback,napi_value self)339 napi_status UploadTaskNapiV9::OnProgress(napi_env env, napi_value callback, napi_value self)
340 {
341 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter OnProgress.");
342 UploadTaskNapiV9 *proxy = nullptr;
343 NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast<void **>(&proxy)), napi_invalid_arg);
344 NAPI_ASSERT_BASE(env, proxy != nullptr, "there is no native upload task", napi_invalid_arg);
345
346 std::shared_ptr<IProgressCallback> progressCallback = std::make_shared<ProgressCallback>(env, callback);
347 if (JSUtil::Equals(env, callback, progressCallback->GetCallback()) && proxy->onProgress_ != nullptr) {
348 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "OnProgress callback already register!");
349 return napi_generic_failure;
350 }
351
352 proxy->napiUploadTask_->On(TYPE_PROGRESS_CALLBACK, (void *)(progressCallback.get()));
353 proxy->onProgress_ = std::move(progressCallback);
354 return napi_ok;
355 }
356
OnHeaderReceive(napi_env env,napi_value callback,napi_value self)357 napi_status UploadTaskNapiV9::OnHeaderReceive(napi_env env, napi_value callback, napi_value self)
358 {
359 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter OnHeaderReceive.");
360 UploadTaskNapiV9 *proxy = nullptr;
361 NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast<void **>(&proxy)), napi_invalid_arg);
362 NAPI_ASSERT_BASE(env, proxy != nullptr, "there is no native upload task", napi_invalid_arg);
363
364 std::shared_ptr<IHeaderReceiveCallback> headerReceiveCallback =
365 std::make_shared<HeaderReceiveCallback>(env, callback);
366 if (JSUtil::Equals(env, callback, headerReceiveCallback->GetCallback()) && proxy->onHeaderReceive_ != nullptr) {
367 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "OnHeaderReceive callback already register!");
368 return napi_generic_failure;
369 }
370
371 proxy->napiUploadTask_->On(TYPE_HEADER_RECEIVE_CALLBACK, (void *)(headerReceiveCallback.get()));
372 proxy->onHeaderReceive_ = std::move(headerReceiveCallback);
373 return napi_ok;
374 }
375
OnFail(napi_env env,napi_value callback,napi_value self)376 napi_status UploadTaskNapiV9::OnFail(napi_env env, napi_value callback, napi_value self)
377 {
378 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter OnFail.");
379 UploadTaskNapiV9 *proxy = nullptr;
380 NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast<void **>(&proxy)), napi_invalid_arg);
381 NAPI_ASSERT_BASE(env, proxy != nullptr, "there is no native upload task", napi_invalid_arg);
382
383 std::shared_ptr<INotifyCallback> failCallback = std::make_shared<NotifyCallback>(env, callback);
384 if (JSUtil::Equals(env, callback, failCallback->GetCallback()) && proxy->onFail_ != nullptr) {
385 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "OnFail callback already register!");
386 return napi_generic_failure;
387 }
388
389 proxy->napiUploadTask_->On(TYPE_FAIL_CALLBACK, (void *)(failCallback.get()));
390 proxy->onFail_ = std::move(failCallback);
391 return napi_ok;
392 }
393
OnComplete(napi_env env,napi_value callback,napi_value self)394 napi_status UploadTaskNapiV9::OnComplete(napi_env env, napi_value callback, napi_value self)
395 {
396 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter OnComplete.");
397 UploadTaskNapiV9 *proxy = nullptr;
398 NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast<void **>(&proxy)), napi_invalid_arg);
399 NAPI_ASSERT_BASE(env, proxy != nullptr, "there is no native upload task", napi_invalid_arg);
400
401 std::shared_ptr<INotifyCallback> completeCallback = std::make_shared<NotifyCallback>(env, callback);
402 if (JSUtil::Equals(env, callback, completeCallback->GetCallback()) && proxy->onComplete_ != nullptr) {
403 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "OnComplete callback already register!");
404 return napi_generic_failure;
405 }
406
407 proxy->napiUploadTask_->On(TYPE_COMPLETE_CALLBACK, (void *)(completeCallback.get()));
408 proxy->onComplete_ = std::move(completeCallback);
409 return napi_ok;
410 }
411
OffProgress(napi_env env,napi_value callback,napi_value self)412 napi_status UploadTaskNapiV9::OffProgress(napi_env env, napi_value callback, napi_value self)
413 {
414 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter OffProgress.");
415 UploadTaskNapiV9 *proxy = nullptr;
416 NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast<void **>(&proxy)), napi_invalid_arg);
417 NAPI_ASSERT_BASE(env, proxy != nullptr, "there is no native upload task", napi_invalid_arg);
418
419 if (proxy->onProgress_ == nullptr) {
420 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Progress. proxy->onProgress_ == nullptr.");
421 return napi_generic_failure;
422 } else {
423 std::shared_ptr<IProgressCallback> progressCallback =
424 std::make_shared<ProgressCallback>(env, callback);
425 proxy->napiUploadTask_->Off(TYPE_PROGRESS_CALLBACK, (void *)(progressCallback.get()));
426 proxy->onProgress_ = nullptr;
427 }
428 return napi_ok;
429 }
430
OffHeaderReceive(napi_env env,napi_value callback,napi_value self)431 napi_status UploadTaskNapiV9::OffHeaderReceive(napi_env env, napi_value callback, napi_value self)
432 {
433 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter OffHeaderReceive.");
434 UploadTaskNapiV9 *proxy = nullptr;
435 NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast<void **>(&proxy)), napi_invalid_arg);
436 NAPI_ASSERT_BASE(env, proxy != nullptr, "there is no native upload task", napi_invalid_arg);
437
438 if (proxy->onHeaderReceive_ == nullptr) {
439 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "HeaderReceive. proxy->onHeaderReceive_ == nullptr.");
440 return napi_generic_failure;
441 } else {
442 std::shared_ptr<IHeaderReceiveCallback> headerReceiveCallback =
443 std::make_shared<HeaderReceiveCallback>(env, callback);
444 proxy->napiUploadTask_->Off(TYPE_HEADER_RECEIVE_CALLBACK, (void *)(headerReceiveCallback.get()));
445 proxy->onHeaderReceive_ = nullptr;
446 }
447 return napi_ok;
448 }
449
450
OffFail(napi_env env,napi_value callback,napi_value self)451 napi_status UploadTaskNapiV9::OffFail(napi_env env, napi_value callback, napi_value self)
452 {
453 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter OffFail.");
454 UploadTaskNapiV9 *proxy = nullptr;
455 NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast<void **>(&proxy)), napi_invalid_arg);
456 NAPI_ASSERT_BASE(env, proxy != nullptr, "there is no native upload task", napi_invalid_arg);
457
458 if (proxy->onFail_ == nullptr) {
459 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Fail. proxy->onFail_ == nullptr.");
460 return napi_generic_failure;
461 } else {
462 std::shared_ptr<INotifyCallback> failCallback = std::make_shared<NotifyCallback>(env, callback);
463 proxy->napiUploadTask_->Off(TYPE_FAIL_CALLBACK, failCallback.get());
464 proxy->onFail_ = nullptr;
465 }
466 return napi_ok;
467 }
468
469
OffComplete(napi_env env,napi_value callback,napi_value self)470 napi_status UploadTaskNapiV9::OffComplete(napi_env env, napi_value callback, napi_value self)
471 {
472 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "Enter OffComplete.");
473 UploadTaskNapiV9 *proxy = nullptr;
474 NAPI_CALL_BASE(env, napi_unwrap(env, self, reinterpret_cast<void **>(&proxy)), napi_invalid_arg);
475 NAPI_ASSERT_BASE(env, proxy != nullptr, "there is no native upload task", napi_invalid_arg);
476 if (proxy->onComplete_ == nullptr) {
477 UPLOAD_HILOGD(UPLOAD_MODULE_JS_NAPI, "CompleteCallback. proxy->OffComplete_ == nullptr.");
478 return napi_generic_failure;
479 } else {
480 std::shared_ptr<INotifyCallback> completeCallback = std::make_shared<NotifyCallback>(env, callback);
481 proxy->napiUploadTask_->Off(TYPE_COMPLETE_CALLBACK, completeCallback.get());
482 proxy->onComplete_ = nullptr;
483 }
484 return napi_ok;
485 }
486
operator =(std::shared_ptr<Upload::UploadTask> && uploadTask)487 UploadTaskNapiV9 &UploadTaskNapiV9::operator=(std::shared_ptr<Upload::UploadTask> &&uploadTask)
488 {
489 if (napiUploadTask_ == uploadTask) {
490 return *this;
491 }
492 napiUploadTask_ = std::move(uploadTask);
493 return *this;
494 }
495
operator ==(const std::shared_ptr<Upload::UploadTask> & uploadTask)496 bool UploadTaskNapiV9::operator==(const std::shared_ptr<Upload::UploadTask> &uploadTask)
497 {
498 return napiUploadTask_ == uploadTask;
499 }
500 } // namespace OHOS::Request::UploadNapi