Split folder operations out of fx_stream.h into fx_folder.h Then implement in platform-specific .cpp files. Avoid dragging some additional bytes into the numerous files that use streams and not folders (and vice versa). -- add some comments about FX_FILEMODE_ in fx_stream while at it. -- make FX_FILEMODE_ definitions look more like bitmasks. Change-Id: I46f660f8d03c2593e6783266dd299e6a1c7515b9 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/82972 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/BUILD.gn b/core/fxcrt/BUILD.gn index 58e4c80..07beba6 100644 --- a/core/fxcrt/BUILD.gn +++ b/core/fxcrt/BUILD.gn
@@ -40,6 +40,7 @@ "fx_coordinates.h", "fx_extension.cpp", "fx_extension.h", + "fx_folder.h", "fx_memory.cpp", "fx_memory.h", "fx_memory_wrappers.h", @@ -119,12 +120,14 @@ sources += [ "cfx_fileaccess_posix.cpp", "cfx_fileaccess_posix.h", + "fx_folder_posix.cpp", ] } if (is_win) { sources += [ "cfx_fileaccess_windows.cpp", "cfx_fileaccess_windows.h", + "fx_folder_windows.cpp", ] } if (pdf_enable_xfa) {
diff --git a/core/fxcrt/fx_folder.h b/core/fxcrt/fx_folder.h new file mode 100644 index 0000000..921fbcd --- /dev/null +++ b/core/fxcrt/fx_folder.h
@@ -0,0 +1,25 @@ +// Copyright 2021 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef CORE_FXCRT_FX_FOLDER_H_ +#define CORE_FXCRT_FX_FOLDER_H_ + +#include "core/fxcrt/fx_string.h" + +struct FX_FolderHandle; + +FX_FolderHandle* FX_OpenFolder(const char* path); +bool FX_GetNextFile(FX_FolderHandle* handle, + ByteString* filename, + bool* bFolder); +void FX_CloseFolder(FX_FolderHandle* handle); + +// Used with std::unique_ptr to automatically call FX_CloseFolder(). +struct FxFolderHandleCloser { + inline void operator()(FX_FolderHandle* h) const { FX_CloseFolder(h); } +}; + +#endif // CORE_FXCRT_FX_FOLDER_H_
diff --git a/core/fxcrt/fx_folder_posix.cpp b/core/fxcrt/fx_folder_posix.cpp new file mode 100644 index 0000000..1e4ef9b --- /dev/null +++ b/core/fxcrt/fx_folder_posix.cpp
@@ -0,0 +1,64 @@ +// Copyright 2021 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_folder.h" + +#include <dirent.h> +#include <sys/stat.h> +#include <unistd.h> + +#include <memory> + +#include "build/build_config.h" +#include "core/fxcrt/unowned_ptr.h" + +#if defined(OS_WIN) +#error "built on wrong platform" +#endif + +struct FX_FolderHandle { + ByteString m_Path; + UnownedPtr<DIR> m_Dir; +}; + +FX_FolderHandle* FX_OpenFolder(const char* path) { + auto handle = std::make_unique<FX_FolderHandle>(); + DIR* dir = opendir(path); + if (!dir) + return nullptr; + + handle->m_Path = path; + handle->m_Dir = dir; + return handle.release(); +} + +bool FX_GetNextFile(FX_FolderHandle* handle, + ByteString* filename, + bool* bFolder) { + if (!handle) + return false; + + struct dirent* de = readdir(handle->m_Dir); + if (!de) + return false; + + ByteString fullpath = handle->m_Path + "/" + de->d_name; + struct stat deStat; + if (stat(fullpath.c_str(), &deStat) < 0) + return false; + + *filename = de->d_name; + *bFolder = S_ISDIR(deStat.st_mode); + return true; +} + +void FX_CloseFolder(FX_FolderHandle* handle) { + if (!handle) + return; + + closedir(handle->m_Dir.Release()); + delete handle; +}
diff --git a/core/fxcrt/fx_folder_windows.cpp b/core/fxcrt/fx_folder_windows.cpp new file mode 100644 index 0000000..d7a4a23 --- /dev/null +++ b/core/fxcrt/fx_folder_windows.cpp
@@ -0,0 +1,60 @@ +// Copyright 2021 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fxcrt/fx_folder.h" + +#include <direct.h> + +#include <memory> + +#include "build/build_config.h" + +#if !defined(OS_WIN) +#error "built on wrong platform" +#endif + +struct FX_FolderHandle { + HANDLE m_Handle; + bool m_bReachedEnd; + WIN32_FIND_DATAA m_FindData; +}; + +FX_FolderHandle* FX_OpenFolder(const char* path) { + auto handle = std::make_unique<FX_FolderHandle>(); + handle->m_Handle = + FindFirstFileExA((ByteString(path) + "/*.*").c_str(), FindExInfoStandard, + &handle->m_FindData, FindExSearchNameMatch, nullptr, 0); + if (handle->m_Handle == INVALID_HANDLE_VALUE) + return nullptr; + + handle->m_bReachedEnd = false; + return handle.release(); +} + +bool FX_GetNextFile(FX_FolderHandle* handle, + ByteString* filename, + bool* bFolder) { + if (!handle) + return false; + + if (handle->m_bReachedEnd) + 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_bReachedEnd = true; + return true; +} + +void FX_CloseFolder(FX_FolderHandle* handle) { + if (!handle) + return; + + FindClose(handle->m_Handle); + delete handle; +}
diff --git a/core/fxcrt/fx_stream.cpp b/core/fxcrt/fx_stream.cpp index 7eadefd..9a65181 100644 --- a/core/fxcrt/fx_stream.cpp +++ b/core/fxcrt/fx_stream.cpp
@@ -6,33 +6,10 @@ #include "core/fxcrt/fx_stream.h" -#include <algorithm> #include <memory> #include <utility> -#include "build/build_config.h" #include "core/fxcrt/fileaccess_iface.h" -#include "core/fxcrt/fx_safe_types.h" -#include "core/fxcrt/unowned_ptr.h" - -#if defined(OS_WIN) -#include <direct.h> - -struct FX_FolderHandle { - HANDLE m_Handle; - bool m_bReachedEnd; - WIN32_FIND_DATAA m_FindData; -}; -#else -#include <dirent.h> -#include <sys/stat.h> -#include <unistd.h> - -struct FX_FolderHandle { - ByteString m_Path; - UnownedPtr<DIR> m_Dir; -}; -#endif namespace { @@ -134,67 +111,3 @@ bool IFX_SeekableStream::WriteBlock(const void* buffer, size_t size) { return WriteBlockAtOffset(buffer, GetSize(), size); } - -FX_FolderHandle* FX_OpenFolder(const char* path) { - auto handle = std::make_unique<FX_FolderHandle>(); -#if defined(OS_WIN) - handle->m_Handle = - FindFirstFileExA((ByteString(path) + "/*.*").c_str(), FindExInfoStandard, - &handle->m_FindData, FindExSearchNameMatch, nullptr, 0); - if (handle->m_Handle == INVALID_HANDLE_VALUE) - return nullptr; - - handle->m_bReachedEnd = false; -#else - DIR* dir = opendir(path); - if (!dir) - return nullptr; - - handle->m_Path = path; - handle->m_Dir = dir; -#endif - return handle.release(); -} - -bool FX_GetNextFile(FX_FolderHandle* handle, - ByteString* filename, - bool* bFolder) { - if (!handle) - return false; - -#if defined(OS_WIN) - if (handle->m_bReachedEnd) - 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_bReachedEnd = true; - return true; -#else - struct dirent* de = readdir(handle->m_Dir); - if (!de) - return false; - ByteString fullpath = handle->m_Path + "/" + de->d_name; - struct stat deStat; - if (stat(fullpath.c_str(), &deStat) < 0) - return false; - - *filename = de->d_name; - *bFolder = S_ISDIR(deStat.st_mode); - return true; -#endif -} - -void FX_CloseFolder(FX_FolderHandle* handle) { - if (!handle) - return; - -#if defined(OS_WIN) - FindClose(handle->m_Handle); -#else - closedir(handle->m_Dir.Release()); -#endif - delete handle; -}
diff --git a/core/fxcrt/fx_stream.h b/core/fxcrt/fx_stream.h index 1e947b8..3e62890 100644 --- a/core/fxcrt/fx_stream.h +++ b/core/fxcrt/fx_stream.h
@@ -13,23 +13,9 @@ #include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_types.h" #include "core/fxcrt/retain_ptr.h" -#include "third_party/base/compiler_specific.h" -struct FX_FolderHandle; - -FX_FolderHandle* FX_OpenFolder(const char* path); -bool FX_GetNextFile(FX_FolderHandle* handle, - ByteString* filename, - bool* bFolder); -void FX_CloseFolder(FX_FolderHandle* handle); - -// Used with std::unique_ptr to automatically call FX_CloseFolder(). -struct FxFolderHandleCloser { - inline void operator()(FX_FolderHandle* h) const { FX_CloseFolder(h); } -}; - -#define FX_FILEMODE_ReadOnly 1 -#define FX_FILEMODE_Truncate 2 +constexpr uint32_t FX_FILEMODE_ReadOnly = 1 << 0; +constexpr uint32_t FX_FILEMODE_Truncate = 1 << 1; class IFX_WriteStream { public: @@ -87,9 +73,11 @@ class IFX_SeekableStream : public IFX_SeekableReadStream, public IFX_SeekableWriteStream { public: + // dwModes is a mask of FX_FILEMODE_* from above. static RetainPtr<IFX_SeekableStream> CreateFromFilename(const char* filename, uint32_t dwModes); + // dwModes is a mask of FX_FILEMODE_* from above. static RetainPtr<IFX_SeekableStream> CreateFromFilename( const wchar_t* filename, uint32_t dwModes);
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp index a9c0414..d6f593b 100644 --- a/core/fxge/android/cfpf_skiafontmgr.cpp +++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -11,7 +11,7 @@ #include "core/fxcrt/fx_codepage.h" #include "core/fxcrt/fx_extension.h" -#include "core/fxcrt/fx_stream.h" +#include "core/fxcrt/fx_folder.h" #include "core/fxcrt/fx_system.h" #include "core/fxge/android/cfpf_skiafont.h" #include "core/fxge/android/cfpf_skiapathfont.h"
diff --git a/core/fxge/cfx_folderfontinfo.cpp b/core/fxge/cfx_folderfontinfo.cpp index 657fa1c..a676534 100644 --- a/core/fxge/cfx_folderfontinfo.cpp +++ b/core/fxge/cfx_folderfontinfo.cpp
@@ -12,9 +12,9 @@ #include "build/build_config.h" #include "core/fxcrt/fx_codepage.h" #include "core/fxcrt/fx_extension.h" +#include "core/fxcrt/fx_folder.h" #include "core/fxcrt/fx_memory_wrappers.h" #include "core/fxcrt/fx_safe_types.h" -#include "core/fxcrt/fx_stream.h" #include "core/fxge/cfx_fontmapper.h" #include "core/fxge/fx_font.h" #include "third_party/base/containers/contains.h"