From 25863077af924a0966c8234bf490b7a5ec9e146d Mon Sep 17 00:00:00 2001 From: renguang1116 Date: Sun, 27 Apr 2025 10:26:57 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8DMTP=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=8B=B7=E8=B4=9D=E8=BF=87=E7=A8=8B=E4=B8=AD=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E6=8B=B7=E8=B4=9D=E5=8A=9F=E8=83=BDbug=20Signed-off-by:=20reng?= =?UTF-8?q?uang1116=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- interfaces/kits/js/src/mod_fs/properties/copy.cpp | 13 +++++++++++++ interfaces/kits/js/src/mod_fs/properties/copy.h | 1 + interfaces/kits/native/task_signal/task_signal.cpp | 11 +++++++++++ 3 files changed, 25 insertions(+) diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.cpp b/interfaces/kits/js/src/mod_fs/properties/copy.cpp index ffd87bebc..2fb408fc6 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy.cpp @@ -97,6 +97,10 @@ static int OpenSrcFile(const string &srcPth, std::shared_ptr infos, i srcFd = open(srcPth.c_str(), O_RDONLY); if (srcFd < 0) { HILOGE("Error opening src file descriptor. errno = %{public}d", errno); + bool isCanceled = (infos->taskSignal != nullptr) && (infos->taskSignal->CheckCancelIfNeed(srcPth)); + if (isCanceled && Copy::IsMtpDeviceFilePath(srcPth)) { + return ECANCELED; + } return errno; } } @@ -850,6 +854,9 @@ tuple> Copy::CreateFileInfos( auto taskSignalEntity = NClass::GetEntityOf(infos->env, infos->copySignal.val_); if (taskSignalEntity != nullptr) { infos->taskSignal = taskSignalEntity->taskSignal_; + if (IsMtpDeviceFilePath(infos->srcPath)) { + infos->taskSignal->SetFileInfoOfRemoteTask("", infos->srcPath); + } } } return { ERRNO_NOERR, infos }; @@ -974,6 +981,12 @@ napi_value Copy::Async(napi_env env, napi_callback_info info) return NAsyncWorkCallback(env, thisVar, cb).Schedule(PROCEDURE_COPY_NAME, cbExec, cbCompl).val_; } } + +bool Copy::IsMtpDeviceFilePath(const std::string &path) +{ + const std::string MTP_PATH_PREFIX = "/storage/External/mtp"; + return path.rfind(MTP_PATH_PREFIX, 0) != std::string::npos; +} } // 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 b08fd68f6..1c2a2f913 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.h +++ b/interfaces/kits/js/src/mod_fs/properties/copy.h @@ -130,6 +130,7 @@ public: static std::map> jsCbMap_; static void UnregisterListener(std::shared_ptr fileInfos); static std::recursive_mutex mutex_; + static bool IsMtpDeviceFilePath(const std::string &path); private: // operator of napi diff --git a/interfaces/kits/native/task_signal/task_signal.cpp b/interfaces/kits/native/task_signal/task_signal.cpp index 4700448d2..c87de7055 100644 --- a/interfaces/kits/native/task_signal/task_signal.cpp +++ b/interfaces/kits/native/task_signal/task_signal.cpp @@ -17,12 +17,16 @@ #include "distributed_file_daemon_manager.h" #include "filemgmt_libhilog.h" +#include namespace OHOS { namespace DistributedFS { namespace ModuleTaskSignal { using namespace FileManagement; constexpr int CANCEL_ERR = -3; +const char CANCEL_XATTR_KEY[] = {"user.cancelcopy"}; +const std::string MTP_PATH_PREFIX = "/storage/External/mtp"; + int32_t TaskSignal::Cancel() { HILOGD("TaskSignal Cancel in."); @@ -40,6 +44,13 @@ int32_t TaskSignal::Cancel() } OnCancel(); return ret; + } else { + if (filePath_.rfind(MTP_PATH_PREFIX, 0) != std::string::npos) { + std::string value; + if (setxattr(filePath_.c_str(), CANCEL_XATTR_KEY, value.c_str(), value.size(), 0) < 0) { + HILOGE("cancelcopy setxattr fail, errno is %{public}d", errno); + } + } } needCancel_.store(true); return 0; -- Gitee From 385bcfa8a5be10a81f8b147a0f59dee2a8da8589 Mon Sep 17 00:00:00 2001 From: renguang1116 Date: Sun, 27 Apr 2025 03:18:13 +0000 Subject: [PATCH 2/3] update interfaces/kits/js/src/mod_fs/properties/copy.cpp. Signed-off-by: renguang1116 --- interfaces/kits/js/src/mod_fs/properties/copy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.cpp b/interfaces/kits/js/src/mod_fs/properties/copy.cpp index 2fb408fc6..ba09491ce 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy.cpp @@ -53,6 +53,7 @@ const std::string NETWORK_PARA = "?networkid="; const string PROCEDURE_COPY_NAME = "FileFSCopy"; const std::string MEDIALIBRARY_DATA_URI = "datashare:///media"; const std::string MEDIA = "media"; +const std::string MTP_PATH_PREFIX = "/storage/External/mtp"; const int SLEEP_TIME = 100000; constexpr int DISMATCH = 0; constexpr int MATCH = 1; @@ -984,7 +985,6 @@ napi_value Copy::Async(napi_env env, napi_callback_info info) bool Copy::IsMtpDeviceFilePath(const std::string &path) { - const std::string MTP_PATH_PREFIX = "/storage/External/mtp"; return path.rfind(MTP_PATH_PREFIX, 0) != std::string::npos; } } // namespace ModuleFileIO -- Gitee From c9a381cefd4f2205548a7ad36b240901bc8b25af Mon Sep 17 00:00:00 2001 From: renguang1116 Date: Sun, 27 Apr 2025 12:36:01 +0000 Subject: [PATCH 3/3] update interfaces/kits/native/task_signal/task_signal.cpp. Signed-off-by: renguang1116 --- interfaces/kits/native/task_signal/task_signal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/native/task_signal/task_signal.cpp b/interfaces/kits/native/task_signal/task_signal.cpp index c87de7055..e8c72d3bb 100644 --- a/interfaces/kits/native/task_signal/task_signal.cpp +++ b/interfaces/kits/native/task_signal/task_signal.cpp @@ -46,7 +46,7 @@ int32_t TaskSignal::Cancel() return ret; } else { if (filePath_.rfind(MTP_PATH_PREFIX, 0) != std::string::npos) { - std::string value; + std::string value = ""; if (setxattr(filePath_.c_str(), CANCEL_XATTR_KEY, value.c_str(), value.size(), 0) < 0) { HILOGE("cancelcopy setxattr fail, errno is %{public}d", errno); } -- Gitee