From 2ab097ac0ac00ddb513197d67f096446cdac5da4 Mon Sep 17 00:00:00 2001 From: caochuan Date: Wed, 18 Oct 2023 16:31:36 +0800 Subject: [PATCH] feat: implement scanFile interface based on shared memory Signed-off-by: caochuan --- .../include/file_access_ext_proxy.h | 3 +- .../include/file_access_ext_stub_impl.h | 4 +- .../file_access/include/file_access_helper.h | 3 +- .../file_access/src/file_access_ext_proxy.cpp | 46 +++++++---------- .../file_access/src/file_access_ext_stub.cpp | 51 ++++++------------- .../src/file_access_ext_stub_impl.cpp | 30 +++++++++-- .../file_access/src/file_access_helper.cpp | 7 +-- 7 files changed, 68 insertions(+), 76 deletions(-) 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 7b981fd3..e034de13 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 @@ -48,8 +48,7 @@ public: 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 ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) override; + virtual int ScanFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, SharedMemoryInfo &memInfo) override; virtual int GetThumbnail(const Uri &uri, const ThumbnailSize &thumbnailSize, std::shared_ptr &pixelMap) override; virtual int Query(const Uri &uri, std::vector &columns, std::vector &results) override; 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 07db5e0b..0224dd0e 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 @@ -46,8 +46,8 @@ public: 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 ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) override; + int ScanFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, + SharedMemoryInfo &memInfo) override; int GetThumbnail(const Uri &uri, const ThumbnailSize &thumbnailSize, std::shared_ptr &pixelMap) override; int Query(const Uri &uri, std::vector &columns, std::vector &results) override; int GetFileInfoFromUri(const Uri &selectFile, FileInfo &fileInfo) 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 692fd4d8..88c3ae23 100644 --- a/interfaces/inner_api/file_access/include/file_access_helper.h +++ b/interfaces/inner_api/file_access/include/file_access_helper.h @@ -79,8 +79,7 @@ public: 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 ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, const FileFilter &filter, - std::vector &fileInfoVec); + int ScanFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, SharedMemoryInfo &memInfo); int GetThumbnail(Uri &uri, ThumbnailSize &thumbnailSize, std::shared_ptr &pixelMap); int Query(Uri &uri, std::string &metaJson); int GetFileInfoFromUri(Uri &selectFile, FileInfo &fileInfo); 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 f701609b..ddb7e1af 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 @@ -520,40 +520,32 @@ int FileAccessExtProxy::ScanFile(const FileInfo &fileInfo, const int64_t offset, return E_IPCS; } - if (!data.WriteParcelable(&fileInfo)) { - HILOG_ERROR("fail to WriteParcelable fileInfo"); - return E_IPCS; - } - - if (!data.WriteInt64(offset)) { - HILOG_ERROR("fail to WriteInt64 offset"); - return E_IPCS; - } - - if (!data.WriteInt64(maxCount)) { - HILOG_ERROR("fail to WriteInt64 maxCount"); - return E_IPCS; - } - - if (!data.WriteParcelable(&filter)) { - HILOG_ERROR("fail to WriteParcelable filter"); - return E_IPCS; + int ret = WriteFileFilterFuncArguments(data, std::make_tuple(&fileInfo, offset, &filter, &memInfo)); + if (ret != ERR_OK) { + return ret; } MessageParcel reply; MessageOption option; - int err = Remote()->SendRequest(CMD_SCAN_FILE, data, reply, option); - if (err != ERR_OK) { + ret = Remote()->SendRequest(CMD_SCAN_FILE, data, reply, option); + if (ret != ERR_OK) { HILOG_ERROR("fail to SendRequest. err: %{public}d", err); - return err; + return ret; } - - 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("ScanFile 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", err); + return ret; + } return ERR_OK; } @@ -950,4 +942,4 @@ int FileAccessExtProxy::StopWatcher(const Uri &uri, bool isUnregisterAll) 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 18a28663..639fbb6a 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 @@ -421,51 +421,30 @@ ErrCode FileAccessExtStub::CmdScanFile(MessageParcel &data, MessageParcel &reply { UserAccessTracer trace; trace.Start("CmdScanFile"); - std::shared_ptr fileInfo(data.ReadParcelable()); - if (fileInfo == nullptr) { - HILOG_ERROR("Parameter ScanFile fail to ReadParcelable fileInfo"); - return E_IPCS; - } - + int ret = E_IPCS; + std::shared_ptr fileInfo = nullptr; int64_t offset = 0; - if (!data.ReadInt64(offset)) { - HILOG_ERROR("parameter ScanFile offset is invalid"); - return E_IPCS; - } + std::shared_ptr filter = nullptr; + std::shared_ptr memInfo = nullptr; - int64_t maxCount = 0; - if (!data.ReadInt64(maxCount)) { - HILOG_ERROR("parameter ScanFile maxCount is invalid"); - return E_IPCS; + std::tie(ret, fileInfo, offset, filter, memInfo) = ReadFileFilterFuncArguments(data); + if (ret != ERR_OK) { + return ret; } - - std::shared_ptr filter(data.ReadParcelable()); - if (filter == nullptr) { - HILOG_ERROR("parameter ScanFile FileFilter is invalid"); - return E_IPCS; + ret = SharedMemoryOperation::MapSharedMemory(*memInfo); + if (ret != ERR_OK) { + return ret; } - std::vector fileInfoVec; - int ret = ScanFile(*fileInfo, offset, maxCount, *filter, fileInfoVec); + ret = ScanFile(*fileInfo, offset, *filter, *memInfo); if (!reply.WriteInt32(ret)) { HILOG_ERROR("Parameter ScanFile fail to WriteInt32 ret"); return E_IPCS; } - int64_t count {fileInfoVec.size()}; - if (!reply.WriteInt64(count)) { - HILOG_ERROR("Parameter ScanFile fail to WriteInt64 count"); - return E_IPCS; - } - - for (const auto &fileInfo : fileInfoVec) { - if (!reply.WriteParcelable(&fileInfo)) { - HILOG_ERROR("parameter ScanFile fail to WriteParcelable fileInfoVec"); - return E_IPCS; - } - } - - return ERR_OK; + ret = WriteFileFilterResults(reply, *memInfo); + SharedMemoryOperation::DestroySharedMemory(*memInfo); + return ret; } ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply) @@ -717,4 +696,4 @@ bool FileAccessExtStub::CheckCallingPermission(const std::string &permission) return true; } } // 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 e389bbcb..eee6df2b 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 @@ -133,8 +133,8 @@ int FileAccessExtStubImpl::ListFile(const FileInfo &fileInfo, const int64_t offs return ret; } -int FileAccessExtStubImpl::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) +int FileAccessExtStubImpl::ScanFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, + SharedMemoryInfo &memInfo) { UserAccessTracer trace; trace.Start("ScanFile"); @@ -143,7 +143,29 @@ int FileAccessExtStubImpl::ScanFile(const FileInfo &fileInfo, const int64_t offs return E_IPCS; } - int ret = extension_->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + std::vector fileInfoVec; + int ret = ERR_OK; + int64_t currentOffset = offset; + memInfo.isOver = false; + while (true) { + fileInfoVec.clear(); + ret = extension_->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + if (ret != ERR_OK) { + HILOG_ERROR("Extension ability ScanFile error"); + break; + } + + uint32_t currentWriteCounts = SharedMemoryOperation::WriteFileInfos(fileInfoVec, memInfo); + if (currentWriteCounts < fileInfoVec.size()) { + break; + } + if (fileInfoVec.empty() || maxCounts > fileInfoVec.size()) { + memInfo.isOver = true; + break; + } + currentOffset += fileInfoVec.size(); + } + return ret; } @@ -258,4 +280,4 @@ int FileAccessExtStubImpl::StopWatcher(const Uri &uri, bool isUnregisterAll) return ret; } } // 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 ed81bf4c..3cc11685 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -771,8 +771,8 @@ int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, c return ERR_OK; } -int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, const int64_t maxCount, - const FileFilter &filter, std::vector &fileInfoVec) +int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, const FileFilter &filter, + SharedMemoryInfo &memInfo) { UserAccessTracer trace; trace.Start("ScanFile"); @@ -793,7 +793,8 @@ int FileAccessHelper::ScanFile(const FileInfo &fileInfo, const int64_t offset, c return E_IPCS; } - int ret = fileExtProxy->ScanFile(fileInfo, offset, maxCount, filter, fileInfoVec); + memInfo.Clear(); + int ret = fileExtProxy->ScanFile(fileInfo, offset, filter, memInfo); if (ret != ERR_OK) { HILOG_ERROR("ScanFile get result error, code:%{public}d", ret); return ret; -- Gitee