// Copyright 2014 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 "fxcrt_platforms.h"

#include "core/include/fxcrt/fx_basic.h"

#if (_FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ && \
     _FXM_PLATFORM_ != _FXM_PLATFORM_LINUX_ &&   \
     _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ &&   \
     _FXM_PLATFORM_ != _FXM_PLATFORM_ANDROID_)
IFXCRT_FileAccess* FXCRT_FileAccess_Create() {
  return new CFXCRT_FileAccess_CRT;
}
void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString& bsMode) {
  if (dwModes & FX_FILEMODE_ReadOnly) {
    bsMode = FX_BSTRC("rb");
  } else if (dwModes & FX_FILEMODE_Truncate) {
    bsMode = FX_BSTRC("w+b");
  } else {
    bsMode = FX_BSTRC("a+b");
  }
}
void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString& wsMode) {
  if (dwModes & FX_FILEMODE_ReadOnly) {
    wsMode = FX_WSTRC(L"rb");
  } else if (dwModes & FX_FILEMODE_Truncate) {
    wsMode = FX_WSTRC(L"w+b");
  } else {
    wsMode = FX_WSTRC(L"a+b");
  }
}
CFXCRT_FileAccess_CRT::CFXCRT_FileAccess_CRT() : m_hFile(NULL) {}
CFXCRT_FileAccess_CRT::~CFXCRT_FileAccess_CRT() {
  Close();
}
FX_BOOL CFXCRT_FileAccess_CRT::Open(const CFX_ByteStringC& fileName,
                                    FX_DWORD dwMode) {
  if (m_hFile) {
    return FALSE;
  }
  CFX_ByteString strMode;
  FXCRT_GetFileModeString(dwMode, strMode);
  m_hFile = FXSYS_fopen(fileName.GetCStr(), strMode.c_str());
  return m_hFile != NULL;
}
FX_BOOL CFXCRT_FileAccess_CRT::Open(const CFX_WideStringC& fileName,
                                    FX_DWORD dwMode) {
  if (m_hFile) {
    return FALSE;
  }
  CFX_WideString strMode;
  FXCRT_GetFileModeString(dwMode, strMode);
  m_hFile = FXSYS_wfopen(fileName.GetPtr(), strMode.c_str());
  return m_hFile != NULL;
}
void CFXCRT_FileAccess_CRT::Close() {
  if (!m_hFile) {
    return;
  }
  FXSYS_fclose(m_hFile);
  m_hFile = NULL;
}
void CFXCRT_FileAccess_CRT::Release() {
  delete this;
}
FX_FILESIZE CFXCRT_FileAccess_CRT::GetSize() const {
  if (!m_hFile) {
    return 0;
  }
  FX_FILESIZE pos = (FX_FILESIZE)FXSYS_ftell(m_hFile);
  FXSYS_fseek(m_hFile, 0, FXSYS_SEEK_END);
  FX_FILESIZE size = (FX_FILESIZE)FXSYS_ftell(m_hFile);
  FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
  return size;
}
FX_FILESIZE CFXCRT_FileAccess_CRT::GetPosition() const {
  if (!m_hFile) {
    return (FX_FILESIZE)-1;
  }
  return (FX_FILESIZE)FXSYS_ftell(m_hFile);
}
FX_FILESIZE CFXCRT_FileAccess_CRT::SetPosition(FX_FILESIZE pos) {
  if (!m_hFile) {
    return (FX_FILESIZE)-1;
  }
  FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
  return (FX_FILESIZE)FXSYS_ftell(m_hFile);
}
size_t CFXCRT_FileAccess_CRT::Read(void* pBuffer, size_t szBuffer) {
  if (!m_hFile) {
    return 0;
  }
  return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
}
size_t CFXCRT_FileAccess_CRT::Write(const void* pBuffer, size_t szBuffer) {
  if (!m_hFile) {
    return 0;
  }
  return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
}
size_t CFXCRT_FileAccess_CRT::ReadPos(void* pBuffer,
                                      size_t szBuffer,
                                      FX_FILESIZE pos) {
  if (!m_hFile) {
    return (FX_FILESIZE)-1;
  }
  FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
  return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
}
size_t CFXCRT_FileAccess_CRT::WritePos(const void* pBuffer,
                                       size_t szBuffer,
                                       FX_FILESIZE pos) {
  if (!m_hFile) {
    return (FX_FILESIZE)-1;
  }
  FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
  return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
}
FX_BOOL CFXCRT_FileAccess_CRT::Flush() {
  if (!m_hFile) {
    return FALSE;
  }
  return !FXSYS_fflush(m_hFile);
}
FX_BOOL CFXCRT_FileAccess_CRT::Truncate(FX_FILESIZE szFile) {
  return FALSE;
}
FX_BOOL FX_File_Exist(const CFX_ByteStringC& fileName) {
  return access(fileName.GetCStr(), F_OK) > -1;
}
FX_BOOL FX_File_Exist(const CFX_WideStringC& fileName) {
  return FX_File_Exist(FX_UTF8Encode(fileName));
}
FX_BOOL FX_File_Delete(const CFX_ByteStringC& fileName) {
  return remove(fileName.GetCStr()) > -1;
}
FX_BOOL FX_File_Delete(const CFX_WideStringC& fileName) {
  return FX_File_Delete(FX_UTF8Encode(fileName));
}
FX_BOOL FX_File_Copy(const CFX_ByteStringC& fileNameSrc,
                     const CFX_ByteStringC& fileNameDst) {
  CFXCRT_FileAccess_CRT src, dst;
  if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
    return FALSE;
  }
  FX_FILESIZE size = src.GetSize();
  if (!size) {
    return FALSE;
  }
  if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
    return FALSE;
  }
  FX_FILESIZE num = 0;
  uint8_t* pBuffer = FX_Alloc(uint8_t, 32768);
  while (num = src.Read(pBuffer, 32768)) {
    if (dst.Write(pBuffer, num) != num) {
      break;
    }
  }
  FX_Free(pBuffer);
  return TRUE;
}
FX_BOOL FX_File_Copy(const CFX_WideStringC& fileNameSrc,
                     const CFX_WideStringC& fileNameDst) {
  return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
}
FX_BOOL FX_File_Move(const CFX_ByteStringC& fileNameSrc,
                     const CFX_ByteStringC& fileNameDst) {
  return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
}
FX_BOOL FX_File_Move(const CFX_WideStringC& fileNameSrc,
                     const CFX_WideStringC& fileNameDst) {
  return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
}
#endif
