| // 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" |
| |
| #include <iterator> |
| |
| #include "build/build_config.h" |
| |
| namespace { |
| |
| constexpr char kFolderSeparator = '/'; |
| |
| constexpr const char* kFontFolders[] = { |
| #if defined(OS_LINUX) || defined(OS_CHROMEOS) |
| "/usr/share/fonts", |
| "/usr/share/X11/fonts/Type1", |
| "/usr/share/X11/fonts/TTF", |
| "/usr/local/share/fonts", |
| #elif defined(OS_APPLE) |
| "~/Library/Fonts", |
| "/Library/Fonts", |
| "/System/Library/Fonts", |
| #elif defined(OS_ANDROID) |
| "/system/fonts", |
| #endif |
| }; |
| |
| } // namespace |
| |
| CFX_FontSourceEnum_File::CFX_FontSourceEnum_File() |
| : m_FolderPaths(std::begin(kFontFolders), std::end(kFontFolders)) {} |
| |
| CFX_FontSourceEnum_File::~CFX_FontSourceEnum_File() = default; |
| |
| ByteString CFX_FontSourceEnum_File::GetNextFile() { |
| FX_FolderHandle* pCurHandle = |
| !m_FolderQueue.empty() ? m_FolderQueue.back().pFolderHandle : nullptr; |
| if (!pCurHandle) { |
| if (m_FolderPaths.empty()) |
| return ByteString(); |
| pCurHandle = FX_OpenFolder(m_FolderPaths.back().c_str()); |
| HandleParentPath hpp; |
| hpp.pFolderHandle = pCurHandle; |
| hpp.bsParentPath = m_FolderPaths.back(); |
| m_FolderQueue.push_back(hpp); |
| } |
| ByteString bsName; |
| bool bFolder; |
| 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() : ByteString(); |
| } |
| pCurHandle = m_FolderQueue.back().pFolderHandle; |
| continue; |
| } |
| if (bsName == "." || bsName == "..") |
| continue; |
| if (bFolder) { |
| HandleParentPath hpp; |
| hpp.bsParentPath = |
| m_FolderQueue.back().bsParentPath + kFolderSeparator + bsName; |
| hpp.pFolderHandle = FX_OpenFolder(hpp.bsParentPath.c_str()); |
| if (!hpp.pFolderHandle) |
| continue; |
| m_FolderQueue.push_back(hpp); |
| pCurHandle = hpp.pFolderHandle; |
| continue; |
| } |
| bsName = m_FolderQueue.back().bsParentPath + kFolderSeparator + bsName; |
| break; |
| } |
| return bsName; |
| } |
| |
| void CFX_FontSourceEnum_File::GetNext() { |
| m_wsNext = WideString::FromUTF8(GetNextFile().AsStringView()); |
| } |
| |
| 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); |
| } |