summaryrefslogtreecommitdiff
path: root/xfa/fgas/font/cfx_fontsourceenum_file.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fgas/font/cfx_fontsourceenum_file.cpp')
-rw-r--r--xfa/fgas/font/cfx_fontsourceenum_file.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/xfa/fgas/font/cfx_fontsourceenum_file.cpp b/xfa/fgas/font/cfx_fontsourceenum_file.cpp
new file mode 100644
index 0000000000..c92fba5eea
--- /dev/null
+++ b/xfa/fgas/font/cfx_fontsourceenum_file.cpp
@@ -0,0 +1,92 @@
+// Copyright 2018 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 "xfa/fgas/font/cfx_fontsourceenum_file.h"
+
+namespace {
+
+constexpr wchar_t kFolderSeparator = L'/';
+
+constexpr const char* g_FontFolders[] = {
+#if _FX_PLATFORM_ == _FX_PLATFORM_LINUX_
+ "/usr/share/fonts", "/usr/share/X11/fonts/Type1",
+ "/usr/share/X11/fonts/TTF", "/usr/local/share/fonts",
+#elif _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
+ "~/Library/Fonts", "/Library/Fonts", "/System/Library/Fonts",
+#elif _FX_PLATFORM_ == _FX_PLATFORM_ANDROID_
+ "/system/fonts",
+#endif
+};
+
+} // namespace
+
+CFX_FontSourceEnum_File::CFX_FontSourceEnum_File() {
+ for (size_t i = 0; i < FX_ArraySize(g_FontFolders); ++i)
+ m_FolderPaths.push_back(g_FontFolders[i]);
+}
+
+CFX_FontSourceEnum_File::~CFX_FontSourceEnum_File() {}
+
+ByteString CFX_FontSourceEnum_File::GetNextFile() {
+ FX_FileHandle* pCurHandle =
+ !m_FolderQueue.empty() ? m_FolderQueue.back().pFileHandle : nullptr;
+ if (!pCurHandle) {
+ if (m_FolderPaths.empty())
+ return "";
+ pCurHandle = FX_OpenFolder(m_FolderPaths.back().c_str());
+ HandleParentPath hpp;
+ hpp.pFileHandle = pCurHandle;
+ hpp.bsParentPath = m_FolderPaths.back();
+ m_FolderQueue.push_back(hpp);
+ }
+ ByteString bsName;
+ bool bFolder;
+ ByteString bsFolderSeparator = WideString(kFolderSeparator).ToDefANSI();
+ while (true) {
+ if (!FX_GetNextFile(pCurHandle, &bsName, &bFolder)) {
+ FX_CloseFolder(pCurHandle);
+ if (!m_FolderQueue.empty())
+ m_FolderQueue.pop_back();
+ if (m_FolderQueue.empty()) {
+ if (!m_FolderPaths.empty())
+ m_FolderPaths.pop_back();
+ return !m_FolderPaths.empty() ? GetNextFile() : "";
+ }
+ pCurHandle = m_FolderQueue.back().pFileHandle;
+ continue;
+ }
+ if (bsName == "." || bsName == "..")
+ continue;
+ if (bFolder) {
+ HandleParentPath hpp;
+ hpp.bsParentPath =
+ m_FolderQueue.back().bsParentPath + bsFolderSeparator + bsName;
+ hpp.pFileHandle = FX_OpenFolder(hpp.bsParentPath.c_str());
+ if (!hpp.pFileHandle)
+ continue;
+ m_FolderQueue.push_back(hpp);
+ pCurHandle = hpp.pFileHandle;
+ continue;
+ }
+ bsName = m_FolderQueue.back().bsParentPath + bsFolderSeparator + bsName;
+ break;
+ }
+ return bsName;
+}
+
+void CFX_FontSourceEnum_File::GetNext() {
+ m_wsNext = GetNextFile().UTF8Decode();
+}
+
+bool CFX_FontSourceEnum_File::HasNext() const {
+ return !m_wsNext.IsEmpty();
+}
+
+RetainPtr<IFX_SeekableStream> CFX_FontSourceEnum_File::GetStream() const {
+ ASSERT(HasNext());
+ return IFX_SeekableStream::CreateFromFilename(m_wsNext.c_str(),
+ FX_FILEMODE_ReadOnly);
+}