// 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(FX_DWORD 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(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; } #endif