From 14745d21d51b8db7be36ca1a24178607e7da6a23 Mon Sep 17 00:00:00 2001 From: caochuan Date: Tue, 21 Nov 2023 16:46:58 +0800 Subject: [PATCH] feat: implement listFile interface based on shared memory Signed-off-by: caochuan --- filemanagement_aafwk.gni | 1 + .../file_info/file_iterator_entity.h | 10 +- .../file_info/napi_file_info_exporter.cpp | 22 +- .../file_info/napi_file_iterator_exporter.cpp | 70 ++++-- .../root_info/napi_root_info_exporter.cpp | 19 +- interfaces/inner_api/file_access/BUILD.gn | 1 + .../include/file_access_ext_proxy.h | 4 +- .../include/file_access_ext_stub_impl.h | 4 +- .../file_access/include/file_access_helper.h | 3 +- .../include/ifile_access_ext_base.h | 5 +- .../file_access/src/file_access_ext_proxy.cpp | 88 +++++-- .../file_access/src/file_access_ext_stub.cpp | 83 +++++-- .../src/file_access_ext_stub_impl.cpp | 39 +++- .../file_access/src/file_access_helper.cpp | 8 +- .../js/src/common/file_info_shared_memory.h | 6 +- .../external_file_access_fuzzer.cpp | 11 +- test/unittest/abnormal_file_access_test.cpp | 10 +- test/unittest/external_file_access_test.cpp | 215 ++++++++++-------- 18 files changed, 406 insertions(+), 193 deletions(-) diff --git a/filemanagement_aafwk.gni b/filemanagement_aafwk.gni index ae2dcc19..80abb43a 100644 --- a/filemanagement_aafwk.gni +++ b/filemanagement_aafwk.gni @@ -20,3 +20,4 @@ access_token_path = "//base/security/access_token" file_api_path = "//foundation/filemanagement/file_api" user_file_service_path = "//foundation/filemanagement/user_file_service" distributed_file_path = "//foundation/distributeddatamgr/distributedfile" +commonlibrary_path = "//commonlibrary" diff --git a/frameworks/js/napi/file_access_module/file_info/file_iterator_entity.h b/frameworks/js/napi/file_access_module/file_info/file_iterator_entity.h index f0257f77..09f41755 100644 --- a/frameworks/js/napi/file_access_module/file_info/file_iterator_entity.h +++ b/frameworks/js/napi/file_access_module/file_info/file_iterator_entity.h @@ -22,21 +22,29 @@ #include "file_access_helper.h" #include "hilog_wrapper.h" #include "file_filter.h" +#include "file_info_shared_memory.h" namespace OHOS { namespace FileAccessFwk { constexpr int64_t MAX_COUNT = 200; // ListFile get file's max count +constexpr int CALL_LISTFILE = 0; +constexpr int CALL_SCANFILE = 1; struct FileIteratorEntity { + ~FileIteratorEntity() { + SharedMemoryOperation::DestroySharedMemory(memInfo); + } FileAccessHelper *fileAccessHelper { nullptr }; std::mutex entityOperateMutex; FileInfo fileInfo; std::vector fileInfoVec; + SharedMemoryInfo memInfo; int64_t offset { 0 }; uint64_t pos { 0 }; + uint32_t currentDataCounts { 0 }; FileFilter filter { {}, {}, {}, FileFilter::INVALID_SIZE, FileFilter::INVALID_MODIFY_AFTER, false, false }; - int flag { 0 }; + int flag { CALL_LISTFILE }; }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/frameworks/js/napi/file_access_module/file_info/napi_file_info_exporter.cpp b/frameworks/js/napi/file_access_module/file_info/napi_file_info_exporter.cpp index c2258e14..c95ceeeb 100644 --- a/frameworks/js/napi/file_access_module/file_info/napi_file_info_exporter.cpp +++ b/frameworks/js/napi/file_access_module/file_info/napi_file_info_exporter.cpp @@ -119,18 +119,25 @@ napi_value NapiFileInfoExporter::ListFile(napi_env env, napi_callback_info info) } { std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + int ret = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfoList", DEFAULT_CAPACITY_200KB, + fileIteratorEntity->memInfo); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env); + return nullptr; + } + fileIteratorEntity->fileAccessHelper = fileInfoEntity->fileAccessHelper; fileIteratorEntity->fileInfo = fileInfoEntity->fileInfo; - fileIteratorEntity->fileInfoVec.clear(); fileIteratorEntity->offset = 0; - fileIteratorEntity->pos = 0; fileIteratorEntity->filter = std::move(filter); - fileIteratorEntity->flag = 0; - auto ret = fileInfoEntity->fileAccessHelper->ListFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, - MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); + fileIteratorEntity->flag = CALL_LISTFILE; + ret = fileInfoEntity->fileAccessHelper->ListFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, + fileIteratorEntity->filter, fileIteratorEntity->memInfo); if (ret != ERR_OK) { + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(fileIteratorEntity->memInfo); return ThrowError(env, ret); } + fileIteratorEntity->currentDataCounts = fileIteratorEntity->memInfo.totalDataCounts; } return NVal(env, objFileIteratorExporter).val_; } @@ -173,9 +180,8 @@ napi_value NapiFileInfoExporter::ScanFile(napi_env env, napi_callback_info info) fileIteratorEntity->fileInfo = fileInfoEntity->fileInfo; fileIteratorEntity->fileInfoVec.clear(); fileIteratorEntity->offset = 0; - fileIteratorEntity->pos = 0; fileIteratorEntity->filter = std::move(filter); - fileIteratorEntity->flag = 1; + fileIteratorEntity->flag = CALL_SCANFILE; auto ret = fileInfoEntity->fileAccessHelper->ScanFile(fileInfoEntity->fileInfo, fileIteratorEntity->offset, MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); if (ret != ERR_OK) { @@ -284,4 +290,4 @@ std::string NapiFileInfoExporter::GetClassName() return NapiFileInfoExporter::className_; } } // namespace FileAccessFwk -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/frameworks/js/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp b/frameworks/js/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp index b1703128..897e65ad 100644 --- a/frameworks/js/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp +++ b/frameworks/js/napi/file_access_module/file_info/napi_file_iterator_exporter.cpp @@ -74,7 +74,44 @@ napi_value NapiFileIteratorExporter::Constructor(napi_env env, napi_callback_inf return funcArg.GetThisVar(); } -static int MakeResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileIteratorEntity, +static int MakeListFileResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileIteratorEntity, + FileInfoEntity *fileInfoEntity, napi_env env, NVal &nVal, bool &isDone) +{ + SharedMemoryInfo &memInfo = fileIteratorEntity->memInfo; + std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + if (memInfo.Empty() && !memInfo.isOver) { + int ret = SharedMemoryOperation::ExpandSharedMemory(memInfo); + if (ret != ERR_OK) { + return ret; + } + + fileIteratorEntity->offset += fileIteratorEntity->currentDataCounts; + ret = fileIteratorEntity->fileAccessHelper->ListFile(fileIteratorEntity->fileInfo, + fileIteratorEntity->offset, fileIteratorEntity->filter, memInfo); + if (ret != ERR_OK) { + HILOG_ERROR("exec ListFile fail, code:%{public}d", ret); + return ret; + } + fileIteratorEntity->currentDataCounts = fileIteratorEntity->memInfo.totalDataCounts; + } + + fileInfoEntity->fileAccessHelper = fileIteratorEntity->fileAccessHelper; + auto ret = SharedMemoryOperation::ReadFileInfo(fileInfoEntity->fileInfo, memInfo); + if (!ret) { + fileInfoEntity = nullptr; + objFileInfoExporter = NVal::CreateUndefined(env).val_; + nVal.AddProp("value", objFileInfoExporter); + nVal.AddProp("done", NVal::CreateBool(env, true).val_); + isDone = true; + return ERR_OK; + } + nVal.AddProp("value", objFileInfoExporter); + nVal.AddProp("done", NVal::CreateBool(env, false).val_); + isDone = false; + return ERR_OK; +} + +static int MakeScanFileResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileIteratorEntity, FileInfoEntity *fileInfoEntity, napi_env env, NVal &nVal, bool &isDone) { std::lock_guard lock(fileIteratorEntity->entityOperateMutex); @@ -93,20 +130,11 @@ static int MakeResult(napi_value &objFileInfoExporter, FileIteratorEntity *fileI fileIteratorEntity->fileInfoVec.clear(); fileIteratorEntity->offset += MAX_COUNT; fileIteratorEntity->pos = 0; - if (fileIteratorEntity->flag == 0) { - int ret = fileIteratorEntity->fileAccessHelper->ListFile(fileIteratorEntity->fileInfo, - fileIteratorEntity->offset, MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); - if (ret != ERR_OK) { - HILOG_ERROR("exec ListFile fail, code:%{public}d", ret); - return ret; - } - } else if (fileIteratorEntity->flag == 1) { - int ret = fileIteratorEntity->fileAccessHelper->ScanFile(fileIteratorEntity->fileInfo, + int ret = fileIteratorEntity->fileAccessHelper->ScanFile(fileIteratorEntity->fileInfo, fileIteratorEntity->offset, MAX_COUNT, fileIteratorEntity->filter, fileIteratorEntity->fileInfoVec); - if (ret != ERR_OK) { - HILOG_ERROR("exec ScanFile fail, code:%{public}d", ret); - return ret; - } + if (ret != ERR_OK) { + HILOG_ERROR("exec ScanFile fail, code:%{public}d", ret); + return ret; } } if (fileIteratorEntity->pos == fileIteratorEntity->fileInfoVec.size()) { @@ -174,20 +202,28 @@ napi_value NapiFileIteratorExporter::Next(napi_env env, napi_callback_info info) } auto retNVal = NVal::CreateObject(env); + int ret = E_GETRESULT; bool isDone = false; - int ret = MakeResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + if (fileIteratorEntity->flag == CALL_LISTFILE) { + ret = MakeListFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + } else if (fileIteratorEntity->flag == CALL_SCANFILE) { + ret = MakeScanFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + } while (!isDone && FilterTrashAndRecentDir(fileInfoEntity->fileInfo.uri)) { fileInfoEntity = NClass::GetEntityOf(env, objFileInfoExporter); retNVal = NVal::CreateObject(env); HILOG_DEBUG("TRASH_DIR or RECENT_DIR: %{public}s", fileInfoEntity->fileInfo.uri.c_str()); - ret = MakeResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + if (fileIteratorEntity->flag == CALL_LISTFILE) { + ret = MakeListFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + } else if (fileIteratorEntity->flag == CALL_SCANFILE) { + ret = MakeScanFileResult(objFileInfoExporter, fileIteratorEntity, fileInfoEntity, env, retNVal, isDone); + } } if (ret != ERR_OK) { NError(ret).ThrowErr(env); return nullptr; } - return retNVal.val_; } diff --git a/frameworks/js/napi/file_access_module/root_info/napi_root_info_exporter.cpp b/frameworks/js/napi/file_access_module/root_info/napi_root_info_exporter.cpp index 8375f2f4..7c1f257b 100644 --- a/frameworks/js/napi/file_access_module/root_info/napi_root_info_exporter.cpp +++ b/frameworks/js/napi/file_access_module/root_info/napi_root_info_exporter.cpp @@ -115,16 +115,21 @@ napi_value NapiRootInfoExporter::ListFile(napi_env env, napi_callback_info info) fileInfo.mode = DOCUMENT_FLAG_REPRESENTS_DIR | DOCUMENT_FLAG_SUPPORTS_READ | DOCUMENT_FLAG_SUPPORTS_WRITE; { std::lock_guard lock(fileIteratorEntity->entityOperateMutex); + int ret = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("RootInfoList", DEFAULT_CAPACITY_200KB, + fileIteratorEntity->memInfo); + if (ret != ERR_OK) { + NError(ret).ThrowErr(env); + return nullptr; + } fileIteratorEntity->fileAccessHelper = rootEntity->fileAccessHelper; fileIteratorEntity->fileInfo = fileInfo; - fileIteratorEntity->fileInfoVec.clear(); fileIteratorEntity->offset = 0; - fileIteratorEntity->pos = 0; fileIteratorEntity->filter = std::move(filter); - fileIteratorEntity->flag = 0; - auto ret = rootEntity->fileAccessHelper->ListFile(fileInfo, fileIteratorEntity->offset, - MAX_COUNT, filter, fileIteratorEntity->fileInfoVec); + fileIteratorEntity->flag = CALL_LISTFILE; + ret = rootEntity->fileAccessHelper->ListFile(fileInfo, fileIteratorEntity->offset, filter, + fileIteratorEntity->memInfo); if (ret != ERR_OK) { + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(fileIteratorEntity->memInfo); return NapiFileInfoExporter::ThrowError(env, ret); } } @@ -170,7 +175,7 @@ napi_value NapiRootInfoExporter::ScanFile(napi_env env, napi_callback_info info) fileIteratorEntity->offset = 0; fileIteratorEntity->pos = 0; fileIteratorEntity->filter = std::move(filter); - fileIteratorEntity->flag = 1; + fileIteratorEntity->flag = CALL_SCANFILE; auto ret = rootEntity->fileAccessHelper->ScanFile(fileInfo, fileIteratorEntity->offset, MAX_COUNT, filter, fileIteratorEntity->fileInfoVec); if (ret != ERR_OK) { @@ -271,4 +276,4 @@ std::string NapiRootInfoExporter::GetClassName() } } // namespace FileAccessFwk } // namespace OHOS -#endif // NAPI_FILEACCESS_HELPER_H \ No newline at end of file +#endif // NAPI_FILEACCESS_HELPER_H diff --git a/interfaces/inner_api/file_access/BUILD.gn b/interfaces/inner_api/file_access/BUILD.gn index 4b0712f0..568a1df4 100644 --- a/interfaces/inner_api/file_access/BUILD.gn +++ b/interfaces/inner_api/file_access/BUILD.gn @@ -60,6 +60,7 @@ ohos_shared_library("file_access_extension_ability_kit") { include_dirs = [ "${ability_runtime_path}/interfaces/kits/native/appkit/ability_runtime/context", + "${commonlibrary_path}/c_utils/base/include", "${file_api_path}/utils/filemgmt_libn/include", "${user_file_service_path}/services/native/file_access_service/include", ] 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 09cd2d33..19fd4e6c 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 @@ -46,8 +46,8 @@ public: virtual int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false) override; virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; - virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) override; + virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, + SharedMemoryInfo &memInfo) override; virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; virtual int GetThumbnail(const Uri &uri, const ThumbnailSize &thumbnailSize, 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 c3dab25b..24bc4d2d 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 @@ -44,8 +44,8 @@ public: int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false) override; int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; - int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) override; + int ListFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, + SharedMemoryInfo &memInfo) override; int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) override; int GetThumbnail(const Uri &uri, const ThumbnailSize &thumbnailSize, std::shared_ptr &pixelMap) override; 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 c22de67a..d14277c3 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -78,8 +78,7 @@ public: int Move(Uri &sourceFile, Uri &targetParent, Uri &newFile); int Copy(Uri &sourceUri, Uri &destUri, std::vector ©Result, bool force = false); int Rename(Uri &sourceFile, const std::string &displayName, Uri &newFile); - int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, - std::vector &fileInfoVec); + int ListFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, SharedMemoryInfo &memInfo); int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec); int GetThumbnail(Uri &uri, ThumbnailSize &thumbnailSize, std::shared_ptr &pixelMap); 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 ab70e350..519b5f18 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 @@ -24,6 +24,7 @@ #include "file_access_extension_info.h" #include "file_access_framework_errno.h" #include "file_filter.h" +#include "file_info_shared_memory.h" #include "image_source.h" #include "uri.h" @@ -65,8 +66,8 @@ public: virtual int Copy(const Uri &sourceUri, const Uri &destUri, std::vector ©Result, bool force = false) = 0; virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) = 0; - virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) = 0; + virtual int ListFile(const FileInfo &fileInfo, const int64_t offset, + const FileFilter &filter, SharedMemoryInfo &memInfo) = 0; virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, std::vector &fileInfoVec) = 0; virtual int GetThumbnail(const Uri &uri, const ThumbnailSize &thumbnailSize, 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 7fe70562..6db8b587 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 @@ -460,18 +460,16 @@ static int GetListFileResult(MessageParcel &reply, std::vector &fileIn return ERR_OK; } -int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) +static int WriteFileFilterFuncArguments(MessageParcel &data, + std::tuple args) { - UserAccessTracer trace; - trace.Start("ListFile"); - MessageParcel data; - if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { - HILOG_ERROR("WriteInterfaceToken failed"); - return E_IPCS; - } + const FileInfo *fileInfo; + int64_t offset; + const FileFilter *filter; + SharedMemoryInfo *memInfo; + std::tie(fileInfo, offset, filter, memInfo) = args; - if (!data.WriteParcelable(&fileInfo)) { + if (!data.WriteParcelable(fileInfo)) { HILOG_ERROR("fail to WriteParcelable fileInfo"); return E_IPCS; } @@ -481,15 +479,58 @@ int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, return E_IPCS; } - if (!data.WriteInt64(maxCount)) { - HILOG_ERROR("fail to WriteInt64 maxCount"); + if (!data.WriteParcelable(filter)) { + HILOG_ERROR("fail to WriteParcelable filter"); return E_IPCS; } - if (!data.WriteParcelable(&filter)) { - HILOG_ERROR("fail to WriteParcelable filter"); + if (!data.WriteParcelable(memInfo)) { + HILOG_ERROR("fail to WriteParcelable memInfo"); return E_IPCS; } + return ERR_OK; +} + +static int ReadFileFilterResults(MessageParcel &reply, SharedMemoryInfo &memInfo) +{ + if (!reply.ReadUint32(memInfo.dataCounts)) { + HILOG_ERROR("fail to ReadUnt64 dataCounts"); + return E_IPCS; + } + memInfo.totalDataCounts = memInfo.dataCounts; + + if (!reply.ReadUint64(memInfo.dataSize)) { + HILOG_ERROR("fail to ReadUnt64 dataSize"); + return E_IPCS; + } + + if (!reply.ReadUint32(memInfo.leftDataCounts)) { + HILOG_ERROR("fail to ReadUnt64 leftDataCounts"); + return E_IPCS; + } + + if (!reply.ReadBool(memInfo.isOver)) { + HILOG_ERROR("fail to ReadBool isOver"); + return E_IPCS; + } + return ERR_OK; +} + +int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, + SharedMemoryInfo &memInfo) +{ + UserAccessTracer trace; + trace.Start("ListFile"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + return E_IPCS; + } + + int ret = WriteFileFilterFuncArguments(data, std::make_tuple(&fileInfo, offset, &filter, &memInfo)); + if (ret != ERR_OK) { + return ret; + } MessageParcel reply; MessageOption option; @@ -498,13 +539,20 @@ int FileAccessExtProxy::ListFile(const FileInfo &fileInfo, const int64_t offset, HILOG_ERROR("fail to SendRequest. err: %{public}d", err); return err; } - - err = GetListFileResult(reply, fileInfoVec); - if (err != ERR_OK) { - HILOG_ERROR("fail to GetListFileResult. err: %{public}d", err); - return err; + if (!reply.ReadInt32(ret)) { + HILOG_ERROR("fail to ReadInt32 ret"); + return E_IPCS; + } + if (ret != ERR_OK) { + HILOG_ERROR("ListFile operation failed ret : %{public}d", ret); + return ret; } + ret = ReadFileFilterResults(reply, memInfo); + if (ret != ERR_OK) { + HILOG_ERROR("fail to read server return results. ret: %{public}d", ret); + return ret; + } return ERR_OK; } @@ -1092,4 +1140,4 @@ int FileAccessExtProxy::MoveFile(const Uri &sourceFile, const Uri &targetParent, return ERR_OK; } } // namespace FileAccessFwk -} // namespace OHOS \ No newline at end of file +} // namespace OHOS 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 82b7300b..b3205270 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 @@ -368,57 +368,92 @@ ErrCode FileAccessExtStub::CmdRename(MessageParcel &data, MessageParcel &reply) return ERR_OK; } -ErrCode FileAccessExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply) +std::tuple, int64_t, std::shared_ptr, std::shared_ptr> + ReadFileFilterFuncArguments(MessageParcel &data) { - UserAccessTracer trace; - trace.Start("CmdListFile"); std::shared_ptr fileInfo(data.ReadParcelable()); if (fileInfo == nullptr) { HILOG_ERROR("Parameter ListFile fail to ReadParcelable fileInfo"); - return E_IPCS; + return std::make_tuple(E_IPCS, nullptr, 0, nullptr, nullptr); } int64_t offset = 0; if (!data.ReadInt64(offset)) { HILOG_ERROR("parameter ListFile offset is invalid"); - return E_IPCS; - } - - int64_t maxCount = 0; - if (!data.ReadInt64(maxCount)) { - HILOG_ERROR("parameter ListFile maxCount is invalid"); - return E_IPCS; + return std::make_tuple(E_IPCS, nullptr, 0, nullptr, nullptr); } std::shared_ptr filter(data.ReadParcelable()); if (filter == nullptr) { HILOG_ERROR("parameter ListFile FileFilter is invalid"); + return std::make_tuple(E_IPCS, nullptr, 0, nullptr, nullptr); + } + + std::shared_ptr memInfo(data.ReadParcelable()); + if (memInfo == nullptr) { + HILOG_ERROR("parameter ListFile SharedMemoryInfo is invalid"); + return std::make_tuple(E_IPCS, nullptr, 0, nullptr, nullptr); + } + + return std::make_tuple(ERR_OK, fileInfo, offset, filter, memInfo); +} + +int WriteFileFilterResults(MessageParcel &reply, SharedMemoryInfo &memInfo) +{ + if (!reply.WriteUint32(memInfo.dataCounts)) { + HILOG_ERROR("fail to WriteUint32 dataCounts"); return E_IPCS; } - std::vector fileInfoVec; - int ret = ListFile(*fileInfo, offset, maxCount, *filter, fileInfoVec); - if (!reply.WriteInt32(ret)) { - HILOG_ERROR("Parameter ListFile fail to WriteInt32 ret"); + if (!reply.WriteUint64(memInfo.dataSize)) { + HILOG_ERROR("fail to WriteUint32 dataSize"); return E_IPCS; } - int64_t count {fileInfoVec.size()}; - if (!reply.WriteInt64(count)) { - HILOG_ERROR("Parameter ListFile fail to WriteInt64 count"); + if (!reply.WriteUint32(memInfo.leftDataCounts)) { + HILOG_ERROR("fail to WriteUint32 leftDataCounts"); return E_IPCS; } - for (const auto &fileInfo : fileInfoVec) { - if (!reply.WriteParcelable(&fileInfo)) { - HILOG_ERROR("parameter ListFile fail to WriteParcelable fileInfoVec"); - return E_IPCS; - } + if (!reply.WriteBool(memInfo.isOver)) { + HILOG_ERROR("fail to WriteBool isOver"); + return E_IPCS; } return ERR_OK; } +ErrCode FileAccessExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply) +{ + UserAccessTracer trace; + trace.Start("CmdListFile"); + int ret = E_IPCS; + std::shared_ptr fileInfo = nullptr; + int64_t offset = 0; + std::shared_ptr filter = nullptr; + std::shared_ptr memInfo = nullptr; + + std::tie(ret, fileInfo, offset, filter, memInfo) = ReadFileFilterFuncArguments(data); + if (ret != ERR_OK) { + return ret; + } + ret = SharedMemoryOperation::MapSharedMemory(*memInfo); + if (ret != ERR_OK) { + return ret; + } + + ret = ListFile(*fileInfo, offset, *filter, *memInfo); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("ListFile fail to WriteInt32 ret"); + SharedMemoryOperation::DestroySharedMemory(*memInfo); + return E_IPCS; + } + + ret = WriteFileFilterResults(reply, *memInfo); + SharedMemoryOperation::DestroySharedMemory(*memInfo); + return ret; +} + ErrCode FileAccessExtStub::CmdScanFile(MessageParcel &data, MessageParcel &reply) { UserAccessTracer trace; @@ -805,4 +840,4 @@ ErrCode FileAccessExtStub::CmdMoveFile(MessageParcel &data, MessageParcel &reply return ERR_OK; } } // namespace FileAccessFwk -} // namespace OHOS \ No newline at end of file +} // namespace OHOS 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 f17d6e17..321acba9 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 @@ -23,6 +23,8 @@ namespace OHOS { namespace FileAccessFwk { +const int64_t FILEFILTER_DEFAULT_COUNTS = 2000; +const int64_t FILEFILTER_MAX_COUNTS = 20000; std::shared_ptr FileAccessExtStubImpl::GetOwner() { return extension_; @@ -119,8 +121,8 @@ int FileAccessExtStubImpl::Rename(const Uri &sourceFile, const std::string &disp return ret; } -int FileAccessExtStubImpl::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) +int FileAccessExtStubImpl::ListFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, + SharedMemoryInfo &memInfo) { UserAccessTracer trace; trace.Start("ListFile"); @@ -129,7 +131,36 @@ int FileAccessExtStubImpl::ListFile(const FileInfo &fileInfo, const int64_t offs return E_IPCS; } - int ret = extension_->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + std::vector fileInfoVec; + int ret = ERR_OK; + memInfo.isOver = false; + int64_t currentOffset = offset; + while (true) { + int64_t maxCounts = + memInfo.memSize > DEFAULT_CAPACITY_200KB ? FILEFILTER_MAX_COUNTS : FILEFILTER_DEFAULT_COUNTS; + fileInfoVec.clear(); + ret = extension_->ListFile(fileInfo, currentOffset, maxCounts, filter, fileInfoVec); + if (ret != ERR_OK) { + HILOG_ERROR("Extension ability ListFile error, code:%{public}d", ret); + break; + } + + uint32_t currentWriteCounts = SharedMemoryOperation::WriteFileInfos(fileInfoVec, memInfo); + if (currentWriteCounts < fileInfoVec.size()) { + if (memInfo.memSize == DEFAULT_CAPACITY_200KB) { + uint32_t counts = 0; + extension_->GetFileInfoNum(fileInfo.uri, filter, false, counts); + memInfo.leftDataCounts = counts - memInfo.dataCounts; + } + break; + } + if (fileInfoVec.empty() ||(maxCounts > fileInfoVec.size() && currentWriteCounts == fileInfoVec.size())) { + memInfo.isOver = true; + break; + } + currentOffset += currentWriteCounts; + } + return ret; } @@ -283,4 +314,4 @@ int FileAccessExtStubImpl::MoveFile(const Uri &sourceFile, const Uri &targetPare return extension_->MoveFile(sourceFile, targetParent, fileName, newFile); } } // namespace FileAccessFwk -} // namespace OHOS \ No newline at end of file +} // namespace OHOS 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 6fd66910..41168ab7 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -746,8 +746,8 @@ int FileAccessHelper::Rename(Uri &sourceFile, const std::string &displayName, Ur return ERR_OK; } -int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) +int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, + SharedMemoryInfo &memInfo) { UserAccessTracer trace; trace.Start("ListFile"); @@ -768,12 +768,12 @@ int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, c return E_IPCS; } - int ret = fileExtProxy->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + memInfo.Clear(); + int ret = fileExtProxy->ListFile(fileInfo, offset, filter, memInfo); if (ret != ERR_OK) { HILOG_ERROR("ListFile get result error, code:%{public}d", ret); return ret; } - return ERR_OK; } diff --git a/interfaces/kits/js/src/common/file_info_shared_memory.h b/interfaces/kits/js/src/common/file_info_shared_memory.h index d38b6b70..e19f5eba 100644 --- a/interfaces/kits/js/src/common/file_info_shared_memory.h +++ b/interfaces/kits/js/src/common/file_info_shared_memory.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef FILE_INFO_SHARED_MEMORY_H -#define FILE_INFO_SHARED_MEMORY_H +#ifndef _FILE_INFO_SHARED_MEMORY_H_ +#define _FILE_INFO_SHARED_MEMORY_H_ #include #include @@ -398,4 +398,4 @@ private: }; } // namespace FileAccessFwk } // namespace OHOS -#endif // FILE_INFO_SHARED_MEMORY_H +#endif // _FILE_INFO_SHARED_MEMORY_H_ diff --git a/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp b/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp index 4bfce42e..a4d9c9aa 100644 --- a/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp +++ b/test/fuzztest/externalfileaccess_fuzzer/external_file_access_fuzzer.cpp @@ -24,6 +24,7 @@ #include "nativetoken_kit.h" #include "file_access_framework_errno.h" #include "file_access_helper.h" +#include "file_info_shared_memory.h" #include "iservice_registry.h" #include "hilog_wrapper.h" @@ -370,10 +371,12 @@ bool ListFileFuzzTest(const uint8_t* data, size_t size) FileInfo fileInfo; fileInfo.uri = std::string(reinterpret_cast(data), size); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; + SharedMemoryInfo memInfo; + int result = SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); FileFilter filter; - int result = helper->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + result = helper->ListFile(fileInfo, offset, filter, memInfo); + SharedMemoryOperation::DestroySharedMemory(memInfo); if (result != OHOS::FileAccessFwk::ERR_OK) { HILOG_ERROR("ListFile failed. ret : %{public}d", result); return false; @@ -446,4 +449,4 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) OHOS::ScanFileFuzzTest(data, size); OHOS::GetFileInfoFromUriFuzzTest(data, size); return 0; -} \ No newline at end of file +} diff --git a/test/unittest/abnormal_file_access_test.cpp b/test/unittest/abnormal_file_access_test.cpp index e628dbda..b821bdad 100755 --- a/test/unittest/abnormal_file_access_test.cpp +++ b/test/unittest/abnormal_file_access_test.cpp @@ -288,11 +288,13 @@ HWTEST_F(AbnormalFileExtensionHelperTest, abnormal_external_file_access_ListFile try { FileInfo fileInfo; int64_t offset = 0; - int64_t maxCount = 0; FileFilter filter; - vector fileInfoVec; - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, E_PERMISSION_SYS); + SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "abnormal_external_file_access_ListFile_0000 occurs an exception."; } @@ -469,4 +471,4 @@ HWTEST_F(AbnormalFileExtensionHelperTest, abnormal_external_file_access_GetFileI GTEST_LOG_(INFO) << "AbnormalFileExtensionHelperTest-end" "abnormal_external_file_access_GetFileInfoFromRelativePath_0000"; } -} // namespace \ No newline at end of file +} // namespace diff --git a/test/unittest/external_file_access_test.cpp b/test/unittest/external_file_access_test.cpp index f7e113aa..48d4427d 100644 --- a/test/unittest/external_file_access_test.cpp +++ b/test/unittest/external_file_access_test.cpp @@ -23,6 +23,7 @@ #include "accesstoken_kit.h" #include "context_impl.h" #include "file_access_framework_errno.h" +#include "file_info_shared_memory.h" #include "iservice_registry.h" #include "nativetoken_kit.h" #include "token_setproc.h" @@ -3046,14 +3047,16 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0000, testing::e FileInfo fileInfo; fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0000 occurs an exception."; @@ -3078,12 +3081,14 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0001, testing::e FileInfo fileInfo; fileInfo.uri = sourceFileUri.ToString(); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0001 occurs an exception."; } @@ -3119,14 +3124,16 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0002, testing::e fileInfo.uri = sourceFileUri.ToString(); Uri sourceFile(fileInfo.uri); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0002 occurs an exception."; @@ -3152,23 +3159,25 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0003, testing::e fileInfo.uri = sourceFileUri.ToString(); Uri sourceFile(fileInfo.uri); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0003 occurs an exception."; } GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_ListFile_0003"; } -static void ListFileTdd(FileInfo fileInfo, int offset, int maxCount, FileFilter filter, - std::vector fileInfoVec) +static void ListFileTdd(FileInfo fileInfo, int offset, FileFilter filter, + SharedMemoryInfo &memInfo) { GTEST_LOG_(INFO) << "FileExtensionHelperTest-begin external_file_access_ListFileTdd"; - int ret = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int ret = g_fah->ListFile(fileInfo, offset, filter, memInfo); if (ret != OHOS::FileAccessFwk::ERR_OK) { GTEST_LOG_(ERROR) << "ListFile get result error, code:" << ret; return; @@ -3205,17 +3214,19 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0004, testing::e FileInfo fileInfo; fileInfo.uri = newDirUriTest.ToString(); int offset = 0; - int maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; g_num = 0; + SharedMemoryInfo memInfo; + result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); for (int j = 0; j < INIT_THREADS_NUMBER; j++) { - std::thread execthread(ListFileTdd, fileInfo, offset, maxCount, filter, fileInfoVec); + std::thread execthread(ListFileTdd, fileInfo, offset, filter, std::ref(memInfo)); execthread.join(); } EXPECT_EQ(g_num, INIT_THREADS_NUMBER); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0004 occurs an exception."; @@ -3256,13 +3267,15 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0005, testing::e FileInfo fileInfo; fileInfo.uri = str; int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::E_IPCS); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0005 occurs an exception."; @@ -3299,14 +3312,16 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0006, testing::e FileInfo fileInfo; fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; FileFilter filter; - result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + SharedMemoryInfo memInfo; + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GT(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GT(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_ListFile_0006 occurs an exception."; @@ -3314,7 +3329,6 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_ListFile_0006, testing::e GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_ListFile_0006"; } - static void WriteData(Uri &uri) { int fd = -1; @@ -3365,12 +3379,14 @@ static void ListFileFilter7(Uri newDirUriTest) FileInfo fileInfo; fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 4; - int64_t maxCount = 1; - std::vector fileInfoVec; + SharedMemoryInfo memInfo; FileFilter filter({".txt", ".docx"}, {}, {}, -1, -1, false, true); - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_1); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_1); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } /** @@ -3417,9 +3433,11 @@ static double InitListFileFolder(Uri newDirUriTest, const std::string &caseNumbe return time; } -static void ShowInfo(const std::vector &fileInfoVec, const std::string &caseNumber) +static void ShowInfo(SharedMemoryInfo &memInfo, const std::string &caseNumber) { - for (auto fileInfo : fileInfoVec) { + FileAccessFwk::FileInfo fileInfo; + for (size_t i = 0; i < memInfo.Size(); i++) { + FileAccessFwk::SharedMemoryOperation::ReadFileInfo(fileInfo, memInfo); GTEST_LOG_(INFO) << caseNumber << ", uri:" << fileInfo.uri << endl; } } @@ -3429,13 +3447,15 @@ static void ListFileFilter8(Uri newDirUriTest) FileInfo fileInfo; fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; + SharedMemoryInfo memInfo; FileFilter filter({}, {}, {}, -1, 0, false, true); - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_6); - ShowInfo(fileInfoVec, "external_file_access_ListFile_0008"); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_6); + ShowInfo(memInfo, "external_file_access_ListFile_0008"); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } /** @@ -3475,12 +3495,14 @@ static void ListFileFilter9(Uri newDirUriTest) FileInfo fileInfo; fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; + SharedMemoryInfo memInfo; FileFilter filter; - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_6); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_6); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } /** @@ -3520,33 +3542,35 @@ static void ListFileFilter10(Uri newDirUriTest, const double &time) FileInfo fileInfo; fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; + SharedMemoryInfo memInfo; FileFilter filter({".txt", ".docx"}, {}, {}, -1, -1, false, true); - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_5); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_5); FileFilter filter1({".txt", ".docx"}, {"0010.txt", "0010.docx"}, {}, -1, -1, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter1, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter1, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_4); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_4); FileFilter filter2({".txt", ".docx"}, {"0010.txt", "0010.docx"}, {}, 0, 0, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter2, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter2, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_1); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_1); FileFilter filter3({".txt", ".docx"}, {"0010.txt", "0010.docx"}, {}, -1, time, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter3, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter3, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_2); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_2); double nowTime = GetTime(); FileFilter filter4({".txt", ".docx"}, {"0010.txt", "0010.docx"}, {}, -1, nowTime, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter4, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter4, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), 0); + EXPECT_EQ(memInfo.Size(), 0); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } /** @@ -3586,33 +3610,35 @@ static void ListFileFilter11(Uri newDirUriTest, const double &time) FileInfo fileInfo; fileInfo.uri = newDirUriTest.ToString(); int64_t offset = 0; - int64_t maxCount = 1000; - std::vector fileInfoVec; + SharedMemoryInfo memInfo; + int result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); FileFilter filter({".txt", ".docx"}, {}, {}, -1, -1, false, true); - int result = g_fah->ListFile(fileInfo, offset, maxCount, filter, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_6); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_6); FileFilter filter1({".txt", ".docx"}, {"测试.txt", "测试.docx"}, {}, -1, -1, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter1, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter1, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_4); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_4); FileFilter filter2({".txt", ".docx"}, {"测试.txt", "测试.docx"}, {}, 0, 0, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter2, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter2, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_1); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_1); FileFilter filter3({".txt", ".docx"}, {"测试.txt", "测试.docx"}, {}, -1, time, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter3, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter3, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), FILE_COUNT_2); + EXPECT_EQ(memInfo.Size(), FILE_COUNT_2); double nowTime = GetTime(); FileFilter filter4({".txt", ".docx"}, {"测试.txt", "测试.docx"}, {}, -1, nowTime, false, true); - result = g_fah->ListFile(fileInfo, offset, maxCount, filter4, fileInfoVec); + result = g_fah->ListFile(fileInfo, offset, filter4, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVec.size(), 0); + EXPECT_EQ(memInfo.Size(), 0); + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } /** @@ -4140,6 +4166,9 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0000, vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + SharedMemoryInfo memInfo; + result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); for (size_t i = 0; i < info.size(); i++) { Uri parentUri(info[i].uri); FileInfo fileinfo; @@ -4147,13 +4176,12 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0000, EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); int64_t offset = 0; - int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVecTemp; - result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + result = g_fah->ListFile(fileinfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); } + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_GetFileInfoFromUri_0000 occurs an exception."; } @@ -4177,6 +4205,9 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0001, vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + SharedMemoryInfo memInfo; + result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); for (size_t i = 0; i < info.size(); i++) { Uri parentUri(info[i].uri); Uri newDirUriTest(""); @@ -4188,16 +4219,15 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0001, EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); int64_t offset = 0; - int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVec; - result = g_fah->ListFile(dirInfo, offset, maxCount, filter, fileInfoVec); + result = g_fah->ListFile(dirInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_GetFileInfoFromUri_0001 occurs an exception."; } @@ -4221,6 +4251,9 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0002, vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + SharedMemoryInfo memInfo; + result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); for (size_t i = 0; i < info.size(); i++) { Uri parentUri(info[i].uri); Uri newDirUriTest(""); @@ -4235,16 +4268,15 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0002, EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); int64_t offset = 0; - int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVecTemp; - result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + result = g_fah->ListFile(fileinfo, offset, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_GetFileInfoFromUri_0002 occurs an exception."; } @@ -4363,6 +4395,9 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0006, vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + SharedMemoryInfo memInfo; + result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); for (size_t i = 0; i < info.size(); i++) { Uri parentUri(info[i].uri); Uri newDirUriTest(""); @@ -4375,16 +4410,15 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0006, EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); int64_t offset = 0; - int64_t maxCount = 1000; FileFilter filter; - std::vector fileInfoVec; - result = g_fah->ListFile(dirInfo, offset, maxCount, filter, fileInfoVec); + result = g_fah->ListFile(dirInfo, offset, filter, memInfo); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_GE(fileInfoVec.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_GE(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_GetFileInfoFromUri_0006 occurs an exception."; } @@ -4408,6 +4442,9 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0007, vector info; int result = g_fah->GetRoots(info); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); + SharedMemoryInfo memInfo; + result = FileAccessFwk::SharedMemoryOperation::CreateSharedMemory("FileInfo List", DEFAULT_CAPACITY_200KB, + memInfo); for (size_t i = 0; i < info.size(); i++) { Uri parentUri(info[i].uri); Uri newDirUriTest(""); @@ -4424,16 +4461,16 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_GetFileInfoFromUri_0007, EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); int64_t offset = 0; - int64_t maxCount = 1000; FileFilter filter; std::vector fileInfoVecTemp; - result = g_fah->ListFile(fileinfo, offset, maxCount, filter, fileInfoVecTemp); + result = g_fah->ListFile(fileinfo, offset, filter, memInfo); EXPECT_NE(result, OHOS::FileAccessFwk::ERR_OK); - EXPECT_EQ(fileInfoVecTemp.size(), OHOS::FileAccessFwk::ERR_OK); + EXPECT_EQ(memInfo.Size(), OHOS::FileAccessFwk::ERR_OK); result = g_fah->Delete(newDirUriTest); EXPECT_EQ(result, OHOS::FileAccessFwk::ERR_OK); } + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfo); } catch (...) { GTEST_LOG_(ERROR) << "external_file_access_GetFileInfoFromUri_0007 occurs an exception."; } @@ -6074,4 +6111,4 @@ HWTEST_F(FileExtensionHelperTest, external_file_access_Move_file_005, testing::e } GTEST_LOG_(INFO) << "FileExtensionHelperTest-end external_file_access_Move_file_0005"; } -} // namespace \ No newline at end of file +} // namespace