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 7b981fd39e4621a0de6b31985d2a9564e8c35573..e034de13c977007129f3da3b72652613c0a12696 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 07db5e0b6889421845273502154b3416a2d774c9..0224dd0e13e3134a61595e4a8fed12160cf98cc8 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 692fd4d88be51fdcd2d41df850ce016c3448db96..88c3ae2387e8204c1a56cbf561505a9fe3a47b3b 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 f701609be01d88ff071c0c29d7bcc6188c2223c6..ddb7e1afd0c6ecd674e105fb8d0938d5f15b513c 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 18a286639a099a96dc7a07f163aed1e04576815e..639fbb6a0635af005d0d3782c0b62dff3313cbbc 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 e389bbcb5dc268cd9ffb1b8b5553a9d2e73a8ec2..eee6df2bf98c26f1d8d9e711bd8d7365fab0aefc 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 ed81bf4cd59ccc7d8fd720057dc2834c6230d438..3cc11685f8884faa0f62c6f0160755d5dd7db588 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;