• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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