diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.cpp b/interfaces/kits/js/src/mod_fs/properties/copy.cpp index ffd87bebc2837bedbe60dee1932da8dd4acb3846..ba09491ce974dfd8590e8fdc212882d78f2488a5 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; @@ -97,6 +98,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 +855,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 +982,11 @@ 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) +{ + 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 b08fd68f6ca302fb8f2623f75c77a8174ccd622e..1c2a2f913c8d863e18e8b6b73d02c65bd91453c1 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 4700448d26139396a7eb2191a5aa9c1692c717da..e8c72d3bbecfec8d52f4471066bfac2d6d1f4b4d 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;