summaryrefslogtreecommitdiff
path: root/core/fxcrt/fx_stream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcrt/fx_stream.cpp')
-rw-r--r--core/fxcrt/fx_stream.cpp55
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
+}