diff --git a/interfaces/kits/js/BUILD.gn b/interfaces/kits/js/BUILD.gn index 99d6eaa6dc3f3b476d754a2186df9f4e46e2886f..709ba7aee40ce9bcd1edac678d0edd7ac44c4cb7 100644 --- a/interfaces/kits/js/BUILD.gn +++ b/interfaces/kits/js/BUILD.gn @@ -207,11 +207,9 @@ ohos_shared_library("fs") { "src/mod_fs/properties/watcher.cpp", ] external_deps += [ - "ability_base:want", "ability_base:zuri", "ability_runtime:ability_manager", "ability_runtime:abilitykit_native", - "ability_runtime:uri_permission_mgr", "access_token:libtokenid_sdk", "app_file_service:fileuri_native", "bundle_framework:appexecfwk_base", diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.cpp b/interfaces/kits/js/src/mod_fs/properties/copy.cpp index 3960fea51ffee0686f550ba8595e62ce017ff092..77489b052655277b582300e7159efd357f22c4df 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy.cpp @@ -285,7 +285,9 @@ int Copy::CopyDirFunc(const string &src, const string &dest, std::shared_ptr infos) +int Copy::SubscribeLocalListener(napi_env env, + std::shared_ptr infos, + std::shared_ptr callback) { if (!infos->listener.TypeIs(napi_function)) { return ERRNO_NOERR; @@ -310,11 +312,6 @@ int Copy::SubscribeLocalListener(napi_env env, std::shared_ptr infos) return ENOMEM; } receiveInfo->path = infos->destPath; - auto callback = CreateSharedPtr(env, infos->listener); - if (callback == nullptr) { - HILOGE("Failed to request heap memory."); - return ENOMEM; - } callback->wds.push_back({ newWd, receiveInfo }); if (IsFile(infos->srcPath)) { auto [err, fileSize] = GetFileSize(infos->srcPath); @@ -325,25 +322,27 @@ int Copy::SubscribeLocalListener(napi_env env, std::shared_ptr infos) } else { callback->totalSize = GetDirSize(infos, infos->srcPath); } - if (RegisterListener(infos, callback)) { - return ERRNO_NOERR; - } inotify_rm_watch(infos->notifyFd, newWd); close(infos->notifyFd); HILOGE("Can not copy repeat."); return EINVAL; } -bool Copy::RegisterListener(std::shared_ptr infos, std::shared_ptr callback) +std::shared_ptr Copy::RegisterListener(napi_env env, const std::shared_ptr &infos) { + auto callback = CreateSharedPtr(env, infos->listener); + if (callback == nullptr) { + HILOGE("Failed to request heap memory."); + return nullptr; + } std::lock_guard lock(mutex_); auto iter = jsCbMap_.find(*infos); if (iter != jsCbMap_.end()) { HILOGI("Copy::RegisterListener, already registered."); - return false; + return nullptr; } jsCbMap_.insert({ *infos, callback }); - return true; + return callback; } void Copy::UnregisterListener(std::shared_ptr infos) @@ -710,18 +709,23 @@ napi_value Copy::Async(napi_env env, napi_callback_info info) NError(result).ThrowErr(env); return nullptr; } + auto callback = RegisterListener(env, infos); + if (callback == nullptr) { + NError(E_UNKNOWN_ERROR).ThrowErr(env); + return nullptr; + } if (!IsRemoteUri(infos->srcUri)) { - auto ret = SubscribeLocalListener(env, infos); + auto ret = SubscribeLocalListener(env, infos, callback); if (ret != ERRNO_NOERR) { NError(ret).ThrowErr(env); return nullptr; } } std::shared_ptr tempInfos = infos; - auto cbExec = [env, tempInfos]() -> NError { + auto cbExec = [env, tempInfos, callback]() -> NError { if (IsRemoteUri(tempInfos->srcUri)) { // copyRemoteUri - return SubscribeRemoteListener(env, tempInfos); + return TransListener::CopyFileFromSoftBus(tempInfos->srcUri, tempInfos->destUri, std::move(callback)); } StartNotify(tempInfos); auto result = ExecCopy(tempInfos); @@ -731,7 +735,8 @@ napi_value Copy::Async(napi_env env, napi_callback_info info) return NError(tempInfos->exceptionCode); }; - auto cbCompl = [](napi_env env, NError err) -> NVal { + auto cbCompl = [infos](napi_env env, NError err) -> NVal { + UnregisterListener(infos); if (err) { return { env, err.GetNapiErr(env) }; } @@ -747,17 +752,6 @@ napi_value Copy::Async(napi_env env, napi_callback_info info) return NAsyncWorkCallback(env, thisVar, cb).Schedule(PROCEDURE_COPY_NAME, cbExec, cbCompl).val_; } } - -NError Copy::SubscribeRemoteListener(napi_env env, std::shared_ptr infos) -{ - sptr transListener = new (std::nothrow) TransListener; - if (transListener == nullptr) { - HILOGE("transListener is empty"); - return NError(ENOMEM); - } - transListener->callback_ = std::make_shared(env, infos->listener); - return TransListener::CopyFileFromSoftBus(infos->srcUri, infos->destUri, transListener); -} } // namespace ModuleFileIO } // namespace FileManagement } // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.h b/interfaces/kits/js/src/mod_fs/properties/copy.h index 4cd9662aca85af8097502ce8f2a4a18dd6eb2981..a35d0ba334374dfa676421620fc83828ed0c1cab 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.h +++ b/interfaces/kits/js/src/mod_fs/properties/copy.h @@ -98,8 +98,9 @@ private: // operator of local listener static fd_set InitFds(int notifyFd); - static int SubscribeLocalListener(napi_env env, std::shared_ptr infos); - static bool RegisterListener(std::shared_ptr fileInfos, std::shared_ptr callback); + static int SubscribeLocalListener( + napi_env env, std::shared_ptr infos, std::shared_ptr callback); + static std::shared_ptr RegisterListener(napi_env env, const std::shared_ptr &infos); static void OnFileReceive(std::shared_ptr infos); static void GetNotifyEvent(std::shared_ptr infos); static void StartNotify(std::shared_ptr infos); @@ -109,7 +110,6 @@ private: static void UnregisterListenerComplete(uv_work_t *work, int stat); static std::shared_ptr GetRegisteredListener(std::shared_ptr infos); static void RemoveWatch(int notifyFd, std::shared_ptr callback); - static NError SubscribeRemoteListener(napi_env env, std::shared_ptr infos); // operator of file static int RecurCopyDir(const string &srcPath, const string &destPath, std::shared_ptr infos); diff --git a/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp b/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp index bc9ee320b8a7a0ff7ea4b6d1845ceb31f7a02ee2..8c0ecb9da09e5f272303689839d4741028dc989f 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.cpp @@ -18,36 +18,33 @@ #include "distributed_file_daemon_manager.h" #include "ipc_skeleton.h" #include "uri.h" -#include "uri_permission_manager_client.h" -#include "want.h" namespace OHOS { namespace FileManagement { namespace ModuleFileIO { -using namespace OHOS::AppExecFwk; const std::string NETWORK_PARA = "?networkid="; -NError TransListener::CopyFileFromSoftBus(const std::string &srcUri, const std::string &destUri, - sptr transListener) +NError TransListener::CopyFileFromSoftBus(const std::string &srcUri, + const std::string &destUri, + std::shared_ptr callback) { - auto &permissionClient = AAFwk::UriPermissionManagerClient::GetInstance(); - OHOS::Uri uri(srcUri); - auto isVerified = permissionClient.VerifyUriPermission(uri, AAFwk::Want::FLAG_AUTH_READ_URI_PERMISSION, - IPCSkeleton::GetCallingTokenID()); - if (!isVerified) { - return NError(E_PARAMS); + sptr transListener = new (std::nothrow) TransListener(); + if (transListener == nullptr) { + HILOGE("new trans listener failed"); + return NError(ENOMEM); } - + transListener->callback_ = std::move(callback); auto networkId = GetNetworkIdFromUri(srcUri); - auto ret = Storage::DistributedFile::DistributedFileDaemonManager::GetInstance().PrepareSession(srcUri, destUri, - networkId, transListener); + auto ret = Storage::DistributedFile::DistributedFileDaemonManager::GetInstance().PrepareSession( + srcUri, destUri, networkId, transListener); if (ret != ERRNO_NOERR) { HILOGE("PrepareSession failed, ret = %{public}d.", ret); return NError(ret); } std::unique_lock lock(transListener->cvMutex_); - transListener->cv_.wait(lock, - [&transListener]() { return transListener->copyEvent_ == SUCCESS || transListener->copyEvent_ == FAILED; }); + transListener->cv_.wait(lock, [&transListener]() { + return transListener->copyEvent_ == SUCCESS || transListener->copyEvent_ == FAILED; + }); if (transListener->copyEvent_ == FAILED) { return NError(EIO); } @@ -101,6 +98,7 @@ void TransListener::CallbackComplete(uv_work_t *work, int stat) int32_t TransListener::OnFileReceive(uint64_t totalBytes, uint64_t processedBytes) { + std::lock_guard lock(callbackMutex_); if (callback_ == nullptr) { HILOGE("Failed to parse watcher callback"); return ENOMEM; @@ -137,6 +135,10 @@ int32_t TransListener::OnFileReceive(uint64_t totalBytes, uint64_t processedByte int32_t TransListener::OnFinished(const std::string &sessionName) { HILOGD("OnFinished"); + { + std::lock_guard lock(callbackMutex_); + callback_ = nullptr; + } copyEvent_ = SUCCESS; cv_.notify_all(); return ERRNO_NOERR; @@ -145,6 +147,10 @@ int32_t TransListener::OnFinished(const std::string &sessionName) int32_t TransListener::OnFailed(const std::string &sessionName) { HILOGD("OnFailed"); + { + std::lock_guard lock(callbackMutex_); + callback_ = nullptr; + } copyEvent_ = FAILED; cv_.notify_all(); return ERRNO_NOERR; diff --git a/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.h b/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.h index a9357a42cd9b073318ae48bd11300b8900337026..5a4aecdab71a6d6dba8a8f971a330be87c115376 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.h +++ b/interfaces/kits/js/src/mod_fs/properties/copy_listener/trans_listener.h @@ -32,17 +32,19 @@ public: int32_t OnFileReceive(uint64_t totalBytes, uint64_t processedBytes) override; int32_t OnFinished(const std::string &sessionName) override; int32_t OnFailed(const std::string &sessionName) override; - static NError CopyFileFromSoftBus(const std::string &srcUri, const std::string &destUri, - sptr transListener); + static NError CopyFileFromSoftBus(const std::string &srcUri, + const std::string &destUri, + std::shared_ptr callback); static std::string GetNetworkIdFromUri(const std::string &uri); static void CallbackComplete(uv_work_t *work, int stat); std::mutex cvMutex_; std::condition_variable cv_; int copyEvent_ = NONE; + std::mutex callbackMutex_; std::shared_ptr callback_; }; } // namespace ModuleFileIO } // namespace FileManagement } // namespace OHOS -#endif //FILEMANAGEMENT_FILE_API_TRANS_LISTENER_H +#endif // FILEMANAGEMENT_FILE_API_TRANS_LISTENER_H