diff options
Diffstat (limited to 'core/fxcrt/fx_stream.cpp')
-rw-r--r-- | core/fxcrt/fx_stream.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/core/fxcrt/fx_stream.cpp b/core/fxcrt/fx_stream.cpp index a64b239546..0cf34aa22e 100644 --- a/core/fxcrt/fx_stream.cpp +++ b/core/fxcrt/fx_stream.cpp @@ -13,6 +13,7 @@ #include "core/fxcrt/fx_safe_types.h" #include "core/fxcrt/ifxcrt_fileaccess.h" +#include "third_party/base/ptr_util.h" namespace { @@ -97,3 +98,57 @@ bool IFX_SeekableStream::WriteBlock(const void* buffer, size_t size) { bool IFX_SeekableStream::WriteString(const CFX_ByteStringC& str) { return WriteBlock(str.unterminated_c_str(), str.GetLength()); } + +FX_FileHandle* FX_OpenFolder(const char* path) { +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + auto pData = pdfium::MakeUnique<CFindFileDataA>(); + pData->m_Handle = FindFirstFileExA((CFX_ByteString(path) + "/*.*").c_str(), + FindExInfoStandard, &pData->m_FindData, + FindExSearchNameMatch, nullptr, 0); + if (pData->m_Handle == INVALID_HANDLE_VALUE) + return nullptr; + + pData->m_bEnd = false; + return pData.release(); +#else + return opendir(path); +#endif +} + +bool FX_GetNextFile(FX_FileHandle* handle, + CFX_ByteString* filename, + bool* bFolder) { + if (!handle) + return false; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + if (handle->m_bEnd) + return false; + + *filename = handle->m_FindData.cFileName; + *bFolder = + (handle->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + if (!FindNextFileA(handle->m_Handle, &handle->m_FindData)) + handle->m_bEnd = true; + return true; +#else + struct dirent* de = readdir(handle); + if (!de) + return false; + *filename = de->d_name; + *bFolder = de->d_type == DT_DIR; + return true; +#endif +} + +void FX_CloseFolder(FX_FileHandle* handle) { + if (!handle) + return; + +#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ + FindClose(handle->m_Handle); + delete handle; +#else + closedir(handle); +#endif +} |