// 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 <memory>

#include "build/build_config.h"
#include "third_party/base/ptr_util.h"

#if !defined(OS_WIN)
#error "built on wrong platform"
#endif

#include <direct.h>

class FX_WindowsFolder : public FX_Folder {
 public:
  ~FX_WindowsFolder() override;
  bool GetNextFile(ByteString* filename, bool* bFolder) override;

 private:
  friend class FX_Folder;
  FX_WindowsFolder();

  HANDLE m_Handle = INVALID_HANDLE_VALUE;
  bool m_bReachedEnd = false;
  WIN32_FIND_DATAA m_FindData;
};

std::unique_ptr<FX_Folder> FX_Folder::OpenFolder(const ByteString& path) {
  // Private ctor.
  auto handle = pdfium::WrapUnique(new FX_WindowsFolder());
  ByteString search_path = path + "/*.*";
  handle->m_Handle =
      FindFirstFileExA(search_path.c_str(), FindExInfoStandard,
                       &handle->m_FindData, FindExSearchNameMatch, nullptr, 0);
  if (handle->m_Handle == INVALID_HANDLE_VALUE)
    return nullptr;

  return handle;
}

FX_WindowsFolder::FX_WindowsFolder() = default;

FX_WindowsFolder::~FX_WindowsFolder() {
  if (m_Handle != INVALID_HANDLE_VALUE)
    FindClose(m_Handle);
}

bool FX_WindowsFolder::GetNextFile(ByteString* filename, bool* bFolder) {
  if (m_bReachedEnd)
    return false;

  *filename = m_FindData.cFileName;
  *bFolder = !!(m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
  if (!FindNextFileA(m_Handle, &m_FindData))
    m_bReachedEnd = true;
  return true;
}
