diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp index 67a2d7543db24ae7728f76cca316c673fd70c7c5..4e9cb73282a1ec6e3812aa504a6aae4710071dc1 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp @@ -15,7 +15,11 @@ #include "napi_fileaccess_helper.h" +#include #include +#include +#include +#include #include #include @@ -214,7 +218,9 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("mkDir", NAPI_Mkdir), DECLARE_NAPI_FUNCTION("createFile", NAPI_CreateFile), DECLARE_NAPI_FUNCTION("delete", NAPI_Delete), + DECLARE_NAPI_FUNCTION("deleteList", NAPI_DeleteList), DECLARE_NAPI_FUNCTION("move", NAPI_Move), + DECLARE_NAPI_FUNCTION("moveList", NAPI_Move_List), DECLARE_NAPI_FUNCTION("query", NAPI_Query), DECLARE_NAPI_FUNCTION("copy", NAPI_Copy), DECLARE_NAPI_FUNCTION("copyFile", NAPI_CopyFile), @@ -293,6 +299,28 @@ static std::tuple, std::unique_ptr> GetRea return { true, std::move(uri), std::move(name) }; } +static std::tuple>, std::unique_ptr> GetReadListArg(napi_env env, + napi_value sourceFile, + napi_value targetParent) +{ + std::vector sourceUriList; + std::unique_ptr targetParentUri = nullptr; + bool succ = false; + std::tie(succ, sourceUriList, std::ignore) = NVal(env, sourceFile).ToStringArray(); + auto sourceUriListPrt = std::make_unique>(sourceUriList); + if (!succ) { + NError(EINVAL).ThrowErr(env); + return { false, std::move(sourceUriListPrt), std::move(targetParentUri) }; + } + std::tie(succ, targetParentUri, std::ignore) = NVal(env, targetParent).ToUTF8String(); + if (!succ) { + NError(EINVAL).ThrowErr(env); + return { false, std::move(sourceUriListPrt), std::move(targetParentUri) }; + } + + return { true, std::move(sourceUriListPrt), std::move(targetParentUri) }; +} + napi_value NAPI_OpenFile(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); @@ -456,6 +484,88 @@ napi_value NAPI_Mkdir(napi_env env, napi_callback_info info) return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; } +static napi_value CreateResultStringArray(napi_env env, std::shared_ptr> result) +{ + uint32_t status = napi_ok; + napi_value moveResultArray = nullptr; + status = napi_create_array_with_length(env, result -> size(), &moveResultArray); + if (status != napi_ok) { + HILOG_ERROR("Create napi array fail"); + return nullptr; + } + + for (size_t i = 0; i < result->size(); i++) { + std::string& tmpResult = result->at(i); + napi_value resultVal; + status |= napi_create_string_utf8(env, tmpResult.c_str(), tmpResult.length(), &resultVal); + status |= napi_set_element(env, moveResultArray, i, resultVal); + if (status != napi_ok) { + HILOG_ERROR("Create CopyResult object error"); + return nullptr; + } + } + + return moveResultArray; +} + +napi_value NAPI_DeleteList(napi_env env, napi_callback_info info) +{ + HILOG_INFO("NAPI_DeleteList"); + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::TWO)) { + NError(EINVAL).ThrowErr(env); + return nullptr; + } + std::vector sourceUriList; + bool succ = false; + std::tie(succ, sourceUriList, std::ignore) = NVal(env, funcArg[NARG_POS::FIRST]).ToStringArray(); + auto sourceUriListPtr = std::make_shared>(sourceUriList); + if (!succ) { + NError(EINVAL).ThrowErr(env); + return nullptr; + } + + HILOG_INFO("NAPI_DeleteList sourceUriList size: %{public}zu", sourceUriList.size()); + FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); + if (fileAccessHelper == nullptr) { + HILOG_ERROR("NAPI_DeleteList fileAccessHelper is null"); + return nullptr; + } + HILOG_INFO("NAPI_DeleteList"); + auto resultPtr=std::make_shared>(); + + auto cbExec = [sourceUriListPtr, resultPtr, fileAccessHelper]() -> NError { + HILOG_INFO("sourceUriList size: %{public}zu", sourceUriListPtr->size()); + std::vector result; + int ret = fileAccessHelper->DeleteList(*(sourceUriListPtr.get()), result); + HILOG_INFO("result size: %{public}zu", result.size()); + for(uint32_t i = 0;ipush_back(result[i]); + } + return NError(ret); + }; + auto cbComplete = [resultPtr](napi_env env, NError err) -> NVal { + if (err) { + return { env, err.GetNapiErr(env) }; + } + + return {env, CreateResultStringArray(env, resultPtr)}; + }; + + const std::string procedureName = "deleteList"; + NVal thisVar(env, funcArg.GetThisVar()); + HILOG_INFO("thisVar size: %{public}zu", funcArg.GetArgc()); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; + } + NVal cb(env, funcArg[NARG_POS::SECOND]); + if (!cb.TypeIs(napi_function)) { + return NapiFileInfoExporter::ThrowError(env, EINVAL); + } + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; +} + + napi_value NAPI_Delete(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); @@ -510,6 +620,61 @@ napi_value NAPI_Delete(napi_env env, napi_callback_info info) return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; } + + +napi_value NAPI_Move_List(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + HILOG_ERROR("NAPI_Move_List start"); + if (!funcArg.InitArgs(NARG_CNT::TWO, NARG_CNT::THREE)) { + return NapiFileInfoExporter::ThrowError(env, EINVAL); + } + bool succ = false; + std::shared_ptr> sourceFileList; + std::unique_ptr targetParent; + std::tie(succ, sourceFileList, targetParent) = GetReadListArg(env, funcArg[NARG_POS::FIRST], funcArg[NARG_POS::SECOND]); + if (!succ) { + return nullptr; + } + FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); + if (fileAccessHelper == nullptr) { + return nullptr; + } + auto result = std::make_shared>(); + if (!result) { + return NapiFileInfoExporter::ThrowError(env, E_GETRESULT); + } + string targetParentString(targetParent.get()); + HILOG_ERROR("sourceFileList size: %{public}zu", sourceFileList->size()); + auto cbExec = [sourceFileList, targetParentString, result, fileAccessHelper]() -> NError { + OHOS::Uri targetParentUri(targetParentString); + std::string newFile = ""; + std::vector newFileUri; + int ret = fileAccessHelper->MoveList(*(sourceFileList.get()), targetParentUri, newFileUri); + // 批量处理 + for(uint32_t i = 0; i < newFileUri.size(); i++) { + result->push_back(newFileUri[i]); + } + return NError(ret); + }; + auto cbComplete = [result](napi_env env, NError err) -> NVal { + if (err) { + return { env, err.GetNapiErr(env) }; + } + + return {env, CreateResultStringArray(env, result)}; + }; + const std::string procedureName = "moveList"; + NVal thisVar(env, funcArg.GetThisVar()); + if (funcArg.GetArgc() == NARG_CNT::TWO) { + return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; + } + NVal cb(env, funcArg[NARG_POS::THIRD]); + if (!cb.TypeIs(napi_function)) { + return NapiFileInfoExporter::ThrowError(env, EINVAL); + } + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; +} napi_value NAPI_Move(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h index 2a845b872c7c8488162c728526dc73fa1b61996b..e5c0610849d8bea0fa41ca13ac0bb32f259aa7a9 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.h @@ -28,7 +28,9 @@ namespace FileAccessFwk { napi_value NAPI_CreateFile(napi_env env, napi_callback_info info); napi_value NAPI_Mkdir(napi_env env, napi_callback_info info); napi_value NAPI_Delete(napi_env env, napi_callback_info info); + napi_value NAPI_DeleteList(napi_env env, napi_callback_info info); napi_value NAPI_Move(napi_env env, napi_callback_info info); + napi_value NAPI_Move_List(napi_env env, napi_callback_info info); napi_value NAPI_Query(napi_env env, napi_callback_info info); napi_value NAPI_Copy(napi_env env, napi_callback_info info); napi_value NAPI_CopyFile(napi_env env, napi_callback_info info); diff --git a/interfaces/inner_api/file_access/include/file_access_ext_ability.h b/interfaces/inner_api/file_access/include/file_access_ext_ability.h index 5febc8aee18f6e5b193f53e61c82b04120c433c5..bb7d124397edf31009b6277f424e72f677f81194 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_ability.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_ability.h @@ -47,7 +47,9 @@ public: virtual int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile); virtual int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile); virtual int Delete(const Uri &sourceFile); + virtual int DeleteList(const std::vector &sourceFileList, std::vector &resultList); virtual int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile); + virtual int MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList); virtual int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false); virtual int CopyFile(const Uri &sourceUri, const Uri &destUri, const std::string &fileName, Uri &newFileUri); virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile); diff --git a/interfaces/inner_api/file_access/include/file_access_ext_proxy.h b/interfaces/inner_api/file_access/include/file_access_ext_proxy.h index 5714a8bcb0451a62284d799cabfb87f4a5ccaed0..77911b5bd3969b3a1d2d8b49064e3ba7f3512aa4 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_proxy.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_proxy.h @@ -18,6 +18,7 @@ #include #include +#include #include #include "file_access_extension_info.h" @@ -42,7 +43,9 @@ public: virtual int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) override; virtual int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) override; virtual int Delete(const Uri &sourceFile) override; + virtual int DeleteList(const std::vector &sourceFileList, std::vector &resultList) override; virtual int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; + virtual int MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList) override; virtual int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false) override; virtual int CopyFile(const Uri &sourceUri, const Uri &destUri, const std::string &fileName, diff --git a/interfaces/inner_api/file_access/include/file_access_ext_stub.h b/interfaces/inner_api/file_access/include/file_access_ext_stub.h index a73dccc1d28518dda098c5f1117d73ddd96d5fe7..9d9db86dae00537995826a936777b0acc9c32d53 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_stub.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_stub.h @@ -39,7 +39,9 @@ private: ErrCode CmdCreateFile(MessageParcel &data, MessageParcel &reply); ErrCode CmdMkdir(MessageParcel &data, MessageParcel &reply); ErrCode CmdDelete(MessageParcel &data, MessageParcel &reply); + ErrCode CmdDeleteList(MessageParcel &data, MessageParcel &reply); ErrCode CmdMove(MessageParcel &data, MessageParcel &reply); + ErrCode CmdMoveList(MessageParcel &data, MessageParcel &reply); ErrCode CmdCopy(MessageParcel &data, MessageParcel &reply); ErrCode CmdCopyFile(MessageParcel &data, MessageParcel &reply); ErrCode CmdRename(MessageParcel &data, MessageParcel &reply); diff --git a/interfaces/inner_api/file_access/include/file_access_ext_stub_impl.h b/interfaces/inner_api/file_access/include/file_access_ext_stub_impl.h index 5049a65734227dfb5a1c2fa5fe393aad1c410ad2..25c3360700c60a44771a5db3525c606b695666bc 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_stub_impl.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_stub_impl.h @@ -40,7 +40,9 @@ public: int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) override; int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) override; int Delete(const Uri &sourceFile) override; + int DeleteList(const std::vector &sourceFileList, std::vector &resultList) override; int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; + int MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList) override; int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false) override; int CopyFile(const Uri &sourceUri, const Uri &destUri, const std::string &fileName, diff --git a/interfaces/inner_api/file_access/include/file_access_helper.h b/interfaces/inner_api/file_access/include/file_access_helper.h index bf1e9ae43272cf030666e3c58c27f5020936ee42..d3622c53b9f93c50f4af05576ac1ae1aa28efc58 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -75,7 +75,9 @@ public: int CreateFile(Uri &parent, const std::string &displayName, Uri &newFile); int Mkdir(Uri &parent, const std::string &displayName, Uri &newDir); int Delete(Uri &selectFile); + int DeleteList(std::vector &sourceFileList, std::vector &result); int Move(Uri &sourceFile, Uri &targetParent, Uri &newFile); + int MoveList(std::vector &sourceFileList, Uri &targetParent, std::vector &newFileList); int Copy(Uri &sourceUri, Uri &destUri, std::vector ©Result, bool force = false); int CopyFile(Uri &sourceUri, Uri &destUri, const std::string &fileName, Uri &newFileUri); int Rename(Uri &sourceFile, const std::string &displayName, Uri &newFile); diff --git a/interfaces/inner_api/file_access/include/ifile_access_ext_base.h b/interfaces/inner_api/file_access/include/ifile_access_ext_base.h index 145f491491d605ac11558584fc2a54c03d3234bc..5b30c6f395ddcfb8fb037465810891725c371b00 100644 --- a/interfaces/inner_api/file_access/include/ifile_access_ext_base.h +++ b/interfaces/inner_api/file_access/include/ifile_access_ext_base.h @@ -56,14 +56,18 @@ public: CMD_GET_FILEINFO_FROM_RELATIVE_PATH, CMD_COPY_FILE, CMD_MOVE_ITEM, - CMD_MOVE_FILE + CMD_MOVE_FILE, + CMD_MOVE_LIST, + CMD_DELETE_LIST }; virtual int OpenFile(const Uri &uri, const int flags, int &fd) = 0; virtual int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) = 0; virtual int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) = 0; virtual int Delete(const Uri &sourceFile) = 0; + virtual int DeleteList(const std::vector &sourceFileList, std::vector &resultList) = 0; virtual int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) = 0; + virtual int MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList) = 0; virtual int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false) = 0; virtual int CopyFile(const Uri &sourceUri, const Uri &destUri, const std::string &fileName, diff --git a/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h b/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h index c8a475a0b581216da32ad78906739a7fc93708ea..fa23235166218393ce60c0117d65890c143ec928 100644 --- a/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h +++ b/interfaces/inner_api/file_access/include/js_file_access_ext_ability.h @@ -23,6 +23,7 @@ #include "napi_common_fileaccess.h" #include "native_engine/native_reference.h" #include "native_engine/native_value.h" +#include namespace OHOS { namespace FileAccessFwk { @@ -76,7 +77,9 @@ public: int CreateFile(const Uri &parent, const std::string &displayName, Uri &newFile) override; int Mkdir(const Uri &parent, const std::string &displayName, Uri &newFile) override; int Delete(const Uri &sourceFile) override; + int DeleteList(const std::vector &sourceFileList, std::vector &resultList) override; int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; + int MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList) override; int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false) override; int CopyFile(const Uri &sourceUri, const Uri &destUri, const std::string &fileName, Uri &newFileUri) override; @@ -124,6 +127,8 @@ private: static napi_status GetFileInfoFromJs(napi_env &env, napi_value obj, FileInfo &fileInfo); static napi_status GetUriAndCodeFromJs(napi_env &env, napi_value result, const std::shared_ptr> &value); + static napi_status GetUriListAndCodeFromJs(napi_env &env, napi_value result, + const std::shared_ptr>> &returnValue); static napi_status GetFdAndCodeFromJs(napi_env &env, napi_value result, const std::shared_ptr> &value); static napi_status ConstructQueryArg(napi_env &env, napi_value *argv, size_t &argc, const Uri &uri, std::vector &columns); diff --git a/interfaces/inner_api/file_access/src/file_access_ext_ability.cpp b/interfaces/inner_api/file_access/src/file_access_ext_ability.cpp index 29cca7b509462d129923ef4c3497b5f9d53b530e..930bc257e6e25f79927903404384a0fecd21255e 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_ability.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_ability.cpp @@ -85,12 +85,24 @@ int FileAccessExtAbility::Delete(const Uri &sourceFile) return EPERM; } +int FileAccessExtAbility::DeleteList(const std::vector &sourceFileList, std::vector &resultList) +{ + HILOG_ERROR("FileAccessExtAbility::DeleteList Undefined operation"); + return EPERM; +} + int FileAccessExtAbility::Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) { HILOG_ERROR("FileAccessExtAbility::Move Undefined operation"); return EPERM; } +int FileAccessExtAbility::MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList) +{ + HILOG_ERROR("FileAccessExtAbility::Move Undefined operation"); + return EPERM; +} + int FileAccessExtAbility::Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force) { HILOG_ERROR("FileAccessExtAbility::Copy Undefined operation"); diff --git a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp index d55372a3323eeab2a9a5510cbb58ff8005844583..382a93fe80b4d3e76e6e1788a6d2f628f8ef3c32 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_proxy.cpp @@ -23,6 +23,7 @@ #include "message_option.h" #include "message_parcel.h" #include "user_access_tracer.h" +#include namespace OHOS { namespace FileAccessFwk { @@ -189,6 +190,72 @@ int FileAccessExtProxy::Mkdir(const Uri &parent, const std::string &displayName, return ERR_OK; } +int FileAccessExtProxy::DeleteList(const std::vector &sourceFileList, std::vector &resultList) +{ + UserAccessTracer trace; + trace.Start("DeleteList"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + return E_IPCS; + } + + int32_t sourceNum = sourceFileList.size(); + if(!data.WriteInt32(sourceNum)) { + HILOG_ERROR("fail to WriteParcelable sourceNum"); + return E_IPCS; + } + for(int i = 0; i < sourceNum; i++) { + std::string insideInputSourceUri = sourceFileList[i]; + if (!data.WriteString(insideInputSourceUri)) { + HILOG_ERROR("fail to WriteParcelable sourceFile"); + return E_IPCS; + } + } + + MessageParcel reply; + MessageOption option; + int err = Remote()->SendRequest(CMD_DELETE_LIST, data, reply, option); + + if (err != ERR_OK) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + return err; + } + + int ret = E_IPCS; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + return E_IPCS; + } + + if (ret != ERR_OK) { + HILOG_ERROR("Move operation failed ret : %{public}d", ret); + return ret; + } + + int resultNum = 0; + if(!reply.ReadInt32(resultNum)) { + HILOG_ERROR("deleteList operation read ret : %{public}d", ret); + return ret; + } + HILOG_ERROR("deleteList operation read resultNum : %{public}d", resultNum); + + for(int i = 0; i < resultNum; i++) { + std::string tempUri; + if (!reply.ReadString(tempUri)) { + HILOG_ERROR("ReadParcelable value is nullptr."); + return E_IPCS; + }; + + if (tempUri.empty()) { + HILOG_ERROR("get uri is empty."); + return E_GETRESULT; + } + resultList.push_back(tempUri); + } + return 0; +} + int FileAccessExtProxy::Delete(const Uri &sourceFile) { UserAccessTracer trace; @@ -283,6 +350,78 @@ int FileAccessExtProxy::Move(const Uri &sourceFile, const Uri &targetParent, Uri return ERR_OK; } +int FileAccessExtProxy::MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList) +{ + UserAccessTracer trace; + trace.Start("MoveList"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + return E_IPCS; + } + + int32_t sourceNum = sourceFileList.size(); + if(!data.WriteInt32(sourceNum)) { + HILOG_ERROR("fail to WriteParcelable sourceNum"); + return E_IPCS; + } + for(int i = 0; i < sourceNum; i++) { + std::string insideInputSourceUri = sourceFileList[i]; + if (!data.WriteString(insideInputSourceUri)) { + HILOG_ERROR("fail to WriteParcelable sourceFile"); + return E_IPCS; + } + } + + std::string insideInputTargetUri = targetParent.ToString(); + if (!data.WriteString(insideInputTargetUri)) { + HILOG_ERROR("fail to WriteParcelable targetParent"); + return E_IPCS; + } + + MessageParcel reply; + MessageOption option; + int err = Remote()->SendRequest(CMD_MOVE_LIST, data, reply, option); + if (err != ERR_OK) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + return err; + } + + int ret = E_IPCS; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + return E_IPCS; + } + + if (ret != ERR_OK) { + HILOG_ERROR("Move operation failed ret : %{public}d", ret); + return ret; + } + + int resultNum = 0; + if(!reply.ReadInt32(resultNum)) { + HILOG_ERROR("MoveList operation read ret : %{public}d", ret); + return ret; + } + HILOG_ERROR("MoveList operation read resultNum : %{public}d", resultNum); + + for(int i = 0; i < resultNum; i++) { + std::string tempUri; + if (!reply.ReadString(tempUri)) { + HILOG_ERROR("ReadParcelable value is nullptr."); + return E_IPCS; + }; + + if (tempUri.empty()) { + HILOG_ERROR("get uri is empty."); + return E_GETRESULT; + } + newFileList.push_back(tempUri); + } + + return ERR_OK; +} + static int WriteCopyFuncArguments(OHOS::MessageParcel &data, const Uri &sourceUri, const Uri &destUri, bool force) { UserAccessTracer trace; diff --git a/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp b/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp index 9c5aa5551b7110c2167dd4881a1401592ad8a156..766c4091a78360c3d1fa6826857d7f4eaa24aa55 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_stub.cpp @@ -63,6 +63,8 @@ FileAccessExtStub::FileAccessExtStub() stubFuncMap_[CMD_COPY_FILE] = &FileAccessExtStub::CmdCopyFile; stubFuncMap_[CMD_MOVE_ITEM] = &FileAccessExtStub::CmdMoveItem; stubFuncMap_[CMD_MOVE_FILE] = &FileAccessExtStub::CmdMoveFile; + stubFuncMap_[CMD_MOVE_LIST] = &FileAccessExtStub::CmdMoveList; + stubFuncMap_[CMD_DELETE_LIST] = &FileAccessExtStub::CmdDeleteList; } FileAccessExtStub::~FileAccessExtStub() @@ -224,6 +226,47 @@ ErrCode FileAccessExtStub::CmdMkdir(MessageParcel &data, MessageParcel &reply) return ERR_OK; } + +ErrCode FileAccessExtStub::CmdDeleteList(MessageParcel &data, MessageParcel &reply) +{ + UserAccessTracer trace; + trace.Start("CmdDeleteList"); + int32_t sourceNum = 0; + if(!data.ReadInt32(sourceNum)) { + HILOG_ERROR("Parameter CmdMoveList fail to ReadInt32"); + } + HILOG_ERROR("sourceNum: %{public}d", sourceNum); + std::vector sourceList; + for(int32_t i = 0; i < sourceNum; i++) { + std::string destUri; + if (!data.ReadString(destUri)) { + HILOG_ERROR("Parameter CmdMoveList fail to ReadParcelable uri"); + return E_IPCS; + } + sourceList.push_back(destUri); + } + HILOG_ERROR("sourceList size: %{public}zu", sourceList.size()); + std::vector result; + int ret = DeleteList(sourceList, result); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("Parameter DeleteList fail to WriteInt32 ret"); + return E_IPCS; + } + int32_t targetNum = result.size(); + if(!reply.WriteInt32(targetNum)) { + HILOG_ERROR("fail to WriteParcelable targetNum"); + return E_IPCS; + } + HILOG_ERROR("targetNum :%{public}d", targetNum); + for(int32_t i = 0; i < targetNum; i++) { + if (!reply.WriteString(result[i])) { + HILOG_ERROR("fail to WriteParcelable result index: %{public}d", i); + return E_IPCS; + } + } + return ERR_OK; +} + ErrCode FileAccessExtStub::CmdDelete(MessageParcel &data, MessageParcel &reply) { UserAccessTracer trace; @@ -249,6 +292,54 @@ ErrCode FileAccessExtStub::CmdDelete(MessageParcel &data, MessageParcel &reply) return ERR_OK; } +ErrCode FileAccessExtStub::CmdMoveList(MessageParcel &data, MessageParcel &reply) +{ + HILOG_ERROR("=====zxl=========: CmdMoveList"); + int32_t sourceNum = 0; + if(!data.ReadInt32(sourceNum)) { + HILOG_ERROR("Parameter CmdMoveList fail to ReadInt32"); + } + HILOG_ERROR("sourceNum: %{public}d", sourceNum); + std::vector sourceList; + for(uint32_t i = 0; i < sourceNum; i++) { + std::string destUri; + if (!data.ReadString(destUri)) { + HILOG_ERROR("Parameter CmdMoveList fail to ReadParcelable uri"); + return E_IPCS; + } + sourceList.push_back(destUri); + } + HILOG_ERROR("sourceList size: %{public}zu", sourceList.size()); + std::string targetParent; + if (!data.ReadString(targetParent)) { + HILOG_ERROR("Parameter CmdMoveList fail to ReadParcelable uri"); + return E_IPCS; + } + HILOG_ERROR("targetParent: %{public}s", targetParent.c_str()); + std::vector result; + Uri targetUri(targetParent); + int ret = MoveList(sourceList, targetUri, result); + HILOG_ERROR("ret :%{public}d", ret); + if(!reply.WriteInt32(ret)) { + HILOG_ERROR("fail to WriteParcelable ret"); + return E_IPCS; + } + + int32_t targetNum = result.size(); + if(!reply.WriteInt32(targetNum)) { + HILOG_ERROR("fail to WriteParcelable targetNum"); + return E_IPCS; + } + HILOG_ERROR("targetNum :%{public}d", targetNum); + for(int32_t i = 0; i < targetNum; i++) { + if (!reply.WriteString(result[i])) { + HILOG_ERROR("fail to WriteParcelable result index: %{public}d", i); + return E_IPCS; + } + } + return ERR_OK; +} + ErrCode FileAccessExtStub::CmdMove(MessageParcel &data, MessageParcel &reply) { UserAccessTracer trace; diff --git a/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp b/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp index 47e3bd4869c8bdb0d725787fbadf9508a9883a6a..6b799d2ec3c0e37404379c3462e91eb567cda2b3 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_stub_impl.cpp @@ -69,6 +69,19 @@ int FileAccessExtStubImpl::Mkdir(const Uri &parent, const std::string &displayNa return ret; } +int FileAccessExtStubImpl::DeleteList(const std::vector &sourceFileList, std::vector &resultList) +{ + UserAccessTracer trace; + trace.Start("DeleteList"); + if (extension_ == nullptr) { + HILOG_ERROR("DeleteList get extension failed."); + return E_IPCS; + } + + int ret = extension_->DeleteList(sourceFileList, resultList); + return ret; +} + int FileAccessExtStubImpl::Delete(const Uri &sourceFile) { UserAccessTracer trace; @@ -95,6 +108,30 @@ int FileAccessExtStubImpl::Move(const Uri &sourceFile, const Uri &targetParent, return ret; } + +int FileAccessExtStubImpl::MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList) +{ + UserAccessTracer trace; + trace.Start("MoveList"); + if (extension_ == nullptr) { + HILOG_ERROR("Move get extension failed."); + return E_IPCS; + } + + if (sourceFileList.size() == 0) { + HILOG_ERROR("Copy get extension failed."); + return E_IPCS; + } + + for(uint32_t i = 0; i< sourceFileList.size(); i++) { + HILOG_ERROR("=====zxl====: MoveList: sourceFileList: %{public}s", sourceFileList[i].c_str()); + } + + HILOG_ERROR("=====zxl=====: MoveList: targetParent: %{public}s", targetParent.ToString().c_str()); + return extension_->MoveList(sourceFileList, targetParent, newFileList); + +} + int FileAccessExtStubImpl::Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force) { diff --git a/interfaces/inner_api/file_access/src/file_access_helper.cpp b/interfaces/inner_api/file_access/src/file_access_helper.cpp index 3682cdc2c341ecfa055f61b8bf28ad3243a08331..70ba2c7198c541e055c3d2907b35a1bda2a5ad95 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -16,6 +16,7 @@ #include "file_access_helper.h" +#include #include #include "bundle_constants.h" #include "bundle_mgr_proxy.h" @@ -532,6 +533,40 @@ int FileAccessHelper::Mkdir(Uri &parent, const std::string &displayName, Uri &ne return ERR_OK; } + +int FileAccessHelper::DeleteList(std::vector &sourceFileList, std::vector &result) +{ + UserAccessTracer trace; + trace.Start("Delete"); + if (!IsSystemApp()) { + HILOG_ERROR("FileAccessHelper::Delete check IsSystemAppByFullTokenID failed"); + return E_PERMISSION_SYS; + } + + if(sourceFileList.size() == 0) { + return E_URIS; + } + + for(uint32_t i = 0;i < sourceFileList.size(); i++) { + Uri uri(sourceFileList[i]); + if (!CheckUri(uri)) { + HILOG_ERROR("Uri format check error."); + return E_URIS; + } + } + Uri firstUri(sourceFileList[0]); + sptr fileExtProxy = GetProxyByUri(firstUri); + + int ret = fileExtProxy->DeleteList(sourceFileList, result); + if (ret != ERR_OK) { + HILOG_ERROR("Delete get result error, code:%{public}d", ret); + return ret; + } + + return ERR_OK; + +} + int FileAccessHelper::Delete(Uri &selectFile) { UserAccessTracer trace; @@ -597,6 +632,27 @@ int FileAccessHelper::Move(Uri &sourceFile, Uri &targetParent, Uri &newFile) return ERR_OK; } +int FileAccessHelper::MoveList(std::vector &sourceFileList, Uri &targetParent, std::vector &newFileList) +{ + UserAccessTracer trace; + trace.Start("MoveList"); + if (!IsSystemApp()) { + HILOG_ERROR("FileAccessHelper::Move check IsSystemAppByFullTokenID failed"); + return E_PERMISSION_SYS; + } + + sptr fileExtProxy = GetProxyByUri(targetParent); + if (fileExtProxy == nullptr) { + HILOG_ERROR("failed with invalid fileAccessExtProxy"); + return E_IPCS; + } + + int ret = fileExtProxy->MoveList(sourceFileList, targetParent, newFileList); + HILOG_ERROR("newFileList size: %{public}zu", newFileList.size()); + + return ret; +} + int FileAccessHelper::IsDirectory(Uri &uri, bool &isDir) { sptr proxy = FileAccessHelper::GetProxyByUri(uri); diff --git a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp index 1250a6f30527621318971f451cff314fd8465313..4eac494b9c2dec58aa532f6a4565bb4be9cde92d 100644 --- a/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp +++ b/interfaces/inner_api/file_access/src/js_file_access_ext_ability.cpp @@ -40,6 +40,9 @@ #include "parameter.h" #include "system_ability_definition.h" #include "user_access_tracer.h" +#include +#include +#include namespace OHOS { namespace FileAccessFwk { @@ -543,6 +546,179 @@ int JsFileAccessExtAbility::Move(const Uri &sourceFile, const Uri &targetParent, return ERR_OK; } +static bool napiValue2String(napi_env env, napi_value param, std::string &value) +{ + size_t size = 0; + if(napi_get_value_string_utf8(env, param, nullptr, 0, &size) != napi_ok) { + return false; + } + value = ""; + if(size == 0) { + return true; + } + char *buf = new (std::nothrow) char[size + 1]; + if (buf == nullptr) { + HILOG_ERROR("buf new char fail size: %{public}zu", size); + return false; + } + + if(napi_get_value_string_utf8(env, param, buf, size+1, &size) != napi_ok) { + HILOG_ERROR("get char context fail"); + return false; + } + + value = buf; + return true; + +} + + +napi_status JsFileAccessExtAbility::GetUriListAndCodeFromJs(napi_env &env, napi_value result, + const std::shared_ptr>> &returnValue) +{ + napi_value code = nullptr; + napi_get_named_property(env,result, "code", &code); + if(napi_get_value_int32(env, code, &returnValue->code)!=napi_ok) { + HILOG_ERROR("Convert js value fail"); + return napi_generic_failure; + } + napi_value targetArray = nullptr; + napi_create_array(env, &targetArray); + napi_get_named_property(env, result, "results", &targetArray); + if(targetArray == nullptr) { + HILOG_ERROR("targetArray is fail"); + return napi_generic_failure; + } + uint32_t length = 0; + if(napi_get_array_length(env, targetArray, &length) != napi_ok) { + HILOG_ERROR("targetArray length fail"); + return napi_generic_failure; + } + for(uint32_t i = 0; i < length;i++) { + napi_value nativeItem = nullptr; + napi_get_element(env, targetArray, i, &nativeItem); + if(nativeItem == nullptr) { + HILOG_ERROR("get nativeItem fail"); + return napi_generic_failure; + } + std::string targetItem; + if(!napiValue2String(env, nativeItem, targetItem)) { + HILOG_ERROR("get targetItem fail"); + return napi_generic_failure; + } + returnValue->data.push_back(targetItem); + } + return napi_ok; +} + + +int JsFileAccessExtAbility::DeleteList(const std::vector &sourceFileList, std::vector &resultList) +{ + auto argParser = [&sourceFileList](napi_env &env, napi_value *argv, size_t &argc) -> bool { + napi_value sourceArray = nullptr; + uint32_t length = sourceFileList.size(); + if (napi_create_array_with_length(env, length, &sourceArray) != napi_ok) { + HILOG_ERROR("Get nativeArray length fail"); + return false; + } + + for (uint32_t i = 0; i < length; i++) { + napi_value nativeValue = nullptr; + napi_create_string_utf8(env, sourceFileList[i].c_str(), sourceFileList[i].length(), &nativeValue); + if (nativeValue == nullptr) { + HILOG_ERROR("Create NativeValue fail."); + return E_GETRESULT; + } + + if (napi_set_element(env, sourceArray, i, nativeValue) != napi_ok) { + HILOG_ERROR("Add NativeValue to NativeArray fail."); + return E_IPCS; + } + } + + argv[ARGC_ZERO] = sourceArray; + argc = ARGC_ONE; + return true; + }; + + auto returnValue = std::make_shared>>(); + if (returnValue == nullptr) { + HILOG_ERROR("Move value is nullptr."); + return E_GETRESULT; + } + auto retParser = [returnValue](napi_env &env, napi_value result) -> bool { + + if (GetUriListAndCodeFromJs(env, result, returnValue) != napi_ok) { + HILOG_ERROR("Convert js object fail."); + return false; + } + return true; + }; + auto errCode = CallJsMethod("deleteList", jsRuntime_, jsObj_.get(), argParser, retParser); + if (errCode != ERR_OK) { + HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode); + return errCode; + } + HILOG_ERROR("returnValue size, %{public}zu.", returnValue->data.size()); + resultList = std::move(returnValue->data); + return ERR_OK; +} + +int JsFileAccessExtAbility::MoveList(const std::vector &sourceFileList, const Uri &targetParent, std::vector &newFileList) +{ + auto argParser = [sourceFileList, targetParent](napi_env &env, napi_value *argv, size_t &argc) -> bool { + napi_value sourceArray = nullptr; + uint32_t length = sourceFileList.size(); + if (napi_create_array_with_length(env, length, &sourceArray) != napi_ok) { + HILOG_ERROR("Get nativeArray length fail"); + return false; + } + + for (uint32_t i = 0; i < length; i++) { + napi_value nativeValue = nullptr; + napi_create_string_utf8(env, sourceFileList[i].c_str(), sourceFileList[i].length(), &nativeValue); + if (nativeValue == nullptr) { + HILOG_ERROR("Create NativeValue fail."); + return E_GETRESULT; + } + + if (napi_set_element(env, sourceArray, i, nativeValue) != napi_ok) { + HILOG_ERROR("Add NativeValue to NativeArray fail."); + return E_IPCS; + } + } + + napi_value targetValue = nullptr; + napi_create_string_utf8(env, targetParent.ToString().c_str(), targetParent.ToString().length(), &targetValue); + argv[ARGC_ZERO] = sourceArray; + argv[ARGC_ONE] = targetValue; + argc = ARGC_TWO; + return true; + }; + + auto returnValue = std::make_shared>>(); + if (returnValue == nullptr) { + HILOG_ERROR("Move value is nullptr."); + return E_GETRESULT; + } + auto retParser = [returnValue](napi_env &env, napi_value result) -> bool { + + if (GetUriListAndCodeFromJs(env, result, returnValue) != napi_ok) { + HILOG_ERROR("Convert js object fail."); + return false; + } + return true; + }; + auto errCode = CallJsMethod("moveList", jsRuntime_, jsObj_.get(), argParser, retParser); + if (errCode != ERR_OK) { + HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode); + return errCode; + } + HILOG_ERROR("returnValue size, %{public}zu.", returnValue->data.size()); + newFileList = std::move(returnValue->data); + return ERR_OK; +} + static void TranslateResult(Result &result) { if (errCodeTable.find(result.errCode) != errCodeTable.end()) { @@ -691,7 +867,7 @@ int JsFileAccessExtAbility::CopyFile(const Uri &sourceUri, const Uri &destUri, c trace.Start("CopyFile"); auto value = std::make_shared>(); if (value == nullptr) { - HILOG_ERROR("Move value is nullptr."); + HILOG_ERROR("CopyFile value is nullptr."); return E_GETRESULT; } diff --git a/interfaces/kits/native/trash/include/file_trash_n_exporter.h b/interfaces/kits/native/trash/include/file_trash_n_exporter.h index f5cf87a7be66f6c9bbe75a1f2d0481efb9832d21..a3ad3dfd0f54e509def2f4aef604d331902c2b6a 100644 --- a/interfaces/kits/native/trash/include/file_trash_n_exporter.h +++ b/interfaces/kits/native/trash/include/file_trash_n_exporter.h @@ -44,6 +44,7 @@ public: inline static std::string trashPath_ {}; static napi_value ListFile(napi_env env, napi_callback_info info); static napi_value Recover(napi_env env, napi_callback_info info); + static napi_value RecoverList(napi_env env, napi_callback_info info); static napi_value CompletelyDelete(napi_env env, napi_callback_info info); bool Export() override; diff --git a/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp b/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp index 4f808c8b7ec750695955379b659eeb46d10c2803..7d5c41c455ca10a5df2b3ac4e84d6bfa9f47af2a 100644 --- a/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp +++ b/interfaces/kits/native/trash/src/file_trash_n_exporter.cpp @@ -553,6 +553,63 @@ static napi_value RecoverDir(napi_env env, const string &dirPath) return NVal::CreateUndefined(env).val_; } + +napi_value FileTrashNExporter::RecoverList(napi_env env, napi_callback_info info) +{ + HILOG_INFO("RecoverList start"); + if (!CheckCallingPermission(FILE_ACCESS_PERMISSION)) { + HILOG_ERROR("permission error"); + NError(E_PERMISSION).ThrowErr(env); + return nullptr; + } + HILOG_INFO("RecoverList CheckCallingPermission done"); + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ONE)) { + HILOG_ERROR("Number of arguments unmatched"); + NError(EINVAL).ThrowErr(env); + return nullptr; + } + HILOG_INFO("RecoverList funcArg done"); + std::vector sourceUriList; + bool succ = false; + HILOG_INFO("RecoverList ToStringArray start"); + std::tie(succ, sourceUriList, std::ignore) = NVal(env, funcArg[NARG_POS::FIRST]).ToStringArray(); + HILOG_INFO("RecoverList ToStringArray done"); + HILOG_INFO("sourceUriList size: %{public}zu", sourceUriList.size()); + for(uint32_t i = 0;i < sourceUriList.size(); i++) { + // 获取沙箱目录地址 + AppFileService::ModuleFileUri::FileUri fileUri(sourceUriList[i]); + string path = fileUri.GetPath(); + // 判断绝对路径 + if (!GetRealPath(path)) { + NError(EINVAL).ThrowErr(env); + HILOG_ERROR("Recover: Invalid Path"); + return nullptr; + } + HILOG_DEBUG("Recover: path = %{public}s", path.c_str()); + + // 判断是否是回收站路径 + if (path.find(FileTrashNExporter::trashPath_) == string::npos) { + NError(EINVAL).ThrowErr(env); + HILOG_ERROR("Recover: path = %{public}s is not Trash path", path.c_str()); + return nullptr; + } + + // 判断路径是否存在 + auto [isExist, ret] = Access(path); + if (!isExist) { + NError(EINVAL).ThrowErr(env); + HILOG_ERROR("Recover: Path is not exist"); + return nullptr; + } + + if (!CheckDir(path)) { + RecoverFile(env, path); + } + RecoverDir(env, path); + } + return NVal::CreateUndefined(env).val_;; +} napi_value FileTrashNExporter::Recover(napi_env env, napi_callback_info info) { if (!CheckCallingPermission(FILE_ACCESS_PERMISSION)) { @@ -675,6 +732,7 @@ bool FileTrashNExporter::Export() return exports_.AddProp({ NVal::DeclareNapiFunction("listFile", ListFile), NVal::DeclareNapiFunction("recover", Recover), + NVal::DeclareNapiFunction("recoverList", RecoverList), NVal::DeclareNapiFunction("completelyDelete", CompletelyDelete) }); } diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts index 747d59d5c06e2557e8ffdd6ce87e7a7956c7066c..e0ad84b47997216aaf91414dd69f91bc8efac130 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts @@ -313,6 +313,23 @@ export default class FileExtAbility extends Extension { return code; } + + deleteList(sourceListUri:string[]): {data: string[], code: number} { + hilog.error(DOMAIN_CODE, TAG, 'sourceListUri size ' + sourceListUri.length); + let successUri = []; + for(let i = 0;i