// 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 "core/fxcrt/fxcrt_platforms.h"

#include "core/fxcrt/include/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(uint32_t dwModes, CFX_ByteString& bsMode) {
  if (dwModes & FX_FILEMODE_ReadOnly) {
    bsMode = "rb";
  } else if (dwModes & FX_FILEMODE_Truncate) {
    bsMode = "w+b";
  } else {
    bsMode = "a+b";
  }
}
void FXCRT_GetFileModeString(uint32_t 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,
                                    uint32_t 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,
                                    uint32_t 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;
}
#endif
