diff --git a/interfaces/inner_api/file_access/IFileAccessExtBase.idl b/interfaces/inner_api/file_access/IFileAccessExtBase.idl index e90371e2398844dd3cc345b27157cda64b694f84..ee80fe6ca96fcdf640fabc4720f91ee2c8fb292f 100644 --- a/interfaces/inner_api/file_access/IFileAccessExtBase.idl +++ b/interfaces/inner_api/file_access/IFileAccessExtBase.idl @@ -19,6 +19,8 @@ sequenceable FileFilter..OHOS.FileAccessFwk.FileFilter; sequenceable FileInfoSharedMemory..OHOS.FileAccessFwk.SharedMemoryInfo; sequenceable FileAccessExtensionInfo..OHOS.FileAccessFwk.RootInfo; sequenceable UriExt..OHOS.FileAccessFwk.Urie; + +option_parcel_hooks on; interface OHOS.FileAccessFwk.IFileAccessExtBase { [ipccode 1] void OpenFile([in] Urie uri, [in] int flags, [out] FileDescriptor fd); [ipccode 2] void CreateFile([in] Urie parent, [in] String displayName, [out] Urie newFile); 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 121fe0b997f1f8f2271bf0f2995d57d9d543d06d..b51ed4d06233116ebff5f1fa4dfa3a59b128bf99 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 @@ -60,6 +60,7 @@ public: int MoveItem(const Urie &sourceFile, const Urie &targetParent, std::vector &moveResult, int32_t& retCode, bool force = false) override; int MoveFile(const Urie &sourceFile, const Urie &targetParent, const std::string &fileName, Urie &newFile) override; + int CallbackParcel(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; private: std::shared_ptr GetOwner(); std::shared_ptr extension_; 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 e484017ff138371ac07299e015cae9e3aa92cd89..8c328d730f575b2590b900ba9067ec74b6826b1e 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 @@ -453,5 +453,44 @@ int FileAccessExtStubImpl::MoveFile(const Urie &sourceFile, const Urie &targetPa newFile = Urie(newFileConvert.ToString()); return ret; } + +int FileAccessExtStubImpl::CallbackParcel(uint32_t code, + MessageParcel &data, MessageParcel &reply, MessageOption &option) +{ + if (code == static_cast(IFileAccessExtBaseIpcCode::COMMAND_LIST_FILE)) { + std::unique_ptr fileInfo(data.ReadParcelable()); + if (!fileInfo) { + HILOG_ERROR("Read FileInfo failed!"); + return ERR_INVALID_DATA; + } + int64_t offset = data.ReadInt64(); + std::unique_ptr filter(data.ReadParcelable()); + if (!filter) { + HILOG_ERROR("Read FileFilter failed!"); + return ERR_INVALID_DATA; + } + std::unique_ptr memInfo(data.ReadParcelable()); + if (!memInfo) { + HILOG_ERROR("Read SharedMemoryInfo failed!"); + return ERR_INVALID_DATA; + } + ErrCode errCode = ListFile(*fileInfo, offset, *filter, *memInfo); + if (!reply.WriteInt32(errCode)) { + HILOG_ERROR("Write errCode failed!"); + SharedMemoryOperation::DestroySharedMemory(*memInfo); + return ERR_INVALID_DATA; + } + if (SUCCEEDED(errCode)) { + if (!reply.WriteParcelable(memInfo.get())) { + HILOG_ERROR("Write memInfo failed!"); + SharedMemoryOperation::DestroySharedMemory(*memInfo); + return ERR_INVALID_DATA; + } + } + SharedMemoryOperation::DestroySharedMemory(*memInfo); + return ERR_INVALID_VALUE; + } + return ERR_NONE; +} } // namespace FileAccessFwk } // 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 58aa7a9e016df30181ab504faff6ffd78591674e..27a33df3ba1f1617ae1bf790f5a44122359d8102 100644 --- a/interfaces/inner_api/file_access/src/file_access_helper.cpp +++ b/interfaces/inner_api/file_access/src/file_access_helper.cpp @@ -826,6 +826,7 @@ int FileAccessHelper::ListFile(const FileInfo &fileInfo, const int64_t offset, c memInfo.memHead = memInfoTemp.memHead; memInfo.memTail = memInfoTemp.memTail; memInfo.dataPtr = memInfoTemp.dataPtr; + FileAccessFwk::SharedMemoryOperation::DestroySharedMemory(memInfoTemp); return ERR_OK; }