diff --git a/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_n_exporter.cpp b/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_n_exporter.cpp index fb1d9a2dababab1a2459bb151ed35b88ccd3b65c..b2b801f9b48a25a694e4f5fa8bf7c1e9d68dfebe 100644 --- a/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_n_exporter.cpp +++ b/interfaces/kits/js/src/mod_fs/class_tasksignal/task_signal_n_exporter.cpp @@ -110,23 +110,51 @@ napi_value TaskSignalNExporter::OnCancel(napi_env env, napi_callback_info info) { HILOGD("TaskSignal OnCancel Func Run in."); NFuncArg funcArg(env, info); - if (!funcArg.InitArgs(NARG_CNT::ZERO)) { - HILOGE("Failed to get param when stop."); + if (!funcArg.InitArgs(NARG_CNT::ZERO, NARG_CNT::ONE)) { + HILOGE("Invalid number of parameters."); NError(EINVAL).ThrowErr(env); return nullptr; } + auto taskSignalEntity = NClass::GetEntityOf(env, funcArg.GetThisVar()); if (!taskSignalEntity || taskSignalEntity->taskSignal_ == nullptr) { - HILOGE("Failed to get watcherEntity when stop."); + HILOGE("Failed to get taskSignalEntity."); NError(EINVAL).ThrowErr(env); return nullptr; } - taskSignalEntity->taskSignal_->SetTaskSignalListener(taskSignalEntity); - auto callbackContext = std::make_shared(NVal(env, funcArg[0])); - callbackContext->env_ = env; - taskSignalEntity->callbackContext_ = callbackContext; - napi_value result = nullptr; - napi_get_null(env, &result); - return result; + + if (funcArg.GetArgc() == 1) { + // 确保传入的参数是函数类型 + if (!NVal(env, funcArg[0]).TypeIs(napi_function)) { + HILOGE("Callback is not a function."); + NError(EINVAL).ThrowErr(env); + return nullptr; + } + + // 异步处理逻辑 + auto cbExec = [taskSignalEntity]() -> NError { + taskSignalEntity->taskSignal_->SetTaskSignalListener(taskSignalEntity); + return NError(NO_ERROR); + }; + + auto cbCompl = [funcArg](napi_env env, NError err) -> NVal { + napi_value callback = funcArg[0]; + napi_value undefined = NVal::CreateUndefined(env).val_; + napi_value result = NVal::CreateUndefined(env).val_; + + napi_call_function(env, undefined, callback, 1, &result, nullptr); + return NVal::CreateUndefined(env); + }; + + const string procedureName = "OnCancel"; + NVal thisVar(env, funcArg.GetThisVar()); + NAsyncWorkCallback(env, thisVar).Schedule(procedureName, cbExec, cbCompl); + return NVal::CreateUndefined(env).val_; + } else { + taskSignalEntity->taskSignal_->SetTaskSignalListener(taskSignalEntity); + napi_value result = nullptr; + napi_get_null(env, &result); + return result; + } } } // namespace OHOS::FileManagement::ModuleFileIO \ No newline at end of file diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.cpp b/interfaces/kits/js/src/mod_fs/properties/copy.cpp index b800d5bc1453ac8869c954326c7f2176f3c2bad6..e2d0898a3cc8cdbd242eb7b4acc5f9b1166d5e0b 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy.cpp @@ -378,7 +378,7 @@ int32_t Copy::ExecCopy(std::shared_ptr infos, std::shared_ptrtaskSignal != nullptr) { infos->taskSignal->MarkDfsTask(); - infos->taskSignal->SetCopyTaskUri(infos->srcUri, infos->destUri); + infos->taskSignal->SetCopyTaskUri(infos->srcUri, infos->destUri, infos->srcPath); } LOGI("Copy begin"); auto result = Storage::DistributedFile::FileCopyManager::GetInstance()->Copy(infos->srcUri, infos->destUri, diff --git a/interfaces/kits/native/task_signal/task_signal.cpp b/interfaces/kits/native/task_signal/task_signal.cpp index cf0fd9d174baa1992436b4945cdd7806f7f42da7..1243caadddcbb35a3808ab58720afdc1ae913ad1 100644 --- a/interfaces/kits/native/task_signal/task_signal.cpp +++ b/interfaces/kits/native/task_signal/task_signal.cpp @@ -100,10 +100,11 @@ void TaskSignal::SetFileInfoOfRemoteTask(const std::string &sessionName, const s filePath_ = filePath; } -void TaskSignal::SetCopyTaskUri(const std::string &srcUri, const std::string &dstUri) +void TaskSignal::SetCopyTaskUri(const std::string &srcUri, const std::string &dstUri, const std::string &srcPath) { srcUri_ = srcUri; dstUri_ = dstUri; + filePath_ = srcPath; } } // namespace ModuleTaskSignal } // namespace DistributedFS diff --git a/interfaces/kits/native/task_signal/task_signal.h b/interfaces/kits/native/task_signal/task_signal.h index 40a91e7e75d156697b5b28d69d88495780aef42a..30955dce79431ff0a46e97f6199cb8c90313c07f 100644 --- a/interfaces/kits/native/task_signal/task_signal.h +++ b/interfaces/kits/native/task_signal/task_signal.h @@ -37,7 +37,7 @@ public: void MarkRemoteTask(); void SetFileInfoOfRemoteTask(const std::string &sessionName, const std::string &filePath); void MarkDfsTask(); - void SetCopyTaskUri(const std::string &srcUri, const std::string &dstUri); + void SetCopyTaskUri(const std::string &srcUri, const std::string &dstUri, const std::string &srcPath); std::atomic_bool needCancel_{ false }; std::atomic_bool remoteTask_{ false }; std::atomic_bool dfsCopyTask_{ false }; diff --git a/interfaces/test/unittest/task_signal/task_signal_test.cpp b/interfaces/test/unittest/task_signal/task_signal_test.cpp index fad6cbfc23853deef22d77ffeacff48415fecbca..64bd1aefa20786aeed8d2dd79323ce65e3a0cf7e 100644 --- a/interfaces/test/unittest/task_signal/task_signal_test.cpp +++ b/interfaces/test/unittest/task_signal/task_signal_test.cpp @@ -148,9 +148,10 @@ HWTEST_F(TaskSignalTest, Task_Signal_MarkDfsTask_0000, testing::ext::TestSize.Le GTEST_LOG_(INFO) << "TaskSignalTest-begin Task_Signal_MarkDfsTask_0000"; auto signal = std::make_shared(); signal->MarkDfsTask(); + std::string srcPath = "/data/test/data.txt"; std::string localUri = "/data/test/test.txt"; std::string dstUri = "/data/test/test.txt"; - signal->SetCopyTaskUri(localUri, dstUri); + signal->SetCopyTaskUri(localUri, dstUri, srcPath); auto ret = signal->Cancel(); EXPECT_EQ(ret, 0); }