Home | History | Annotate | Download | only in fxcrt
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include "fxcrt_posix.h"
      8 
      9 #include "core/include/fxcrt/fx_basic.h"
     10 
     11 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \
     12     _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \
     13     _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
     14 IFXCRT_FileAccess* FXCRT_FileAccess_Create() {
     15   return new CFXCRT_FileAccess_Posix;
     16 }
     17 void FXCRT_Posix_GetFileMode(FX_DWORD dwModes,
     18                              int32_t& nFlags,
     19                              int32_t& nMasks) {
     20   nFlags = O_BINARY | O_LARGEFILE;
     21   if (dwModes & FX_FILEMODE_ReadOnly) {
     22     nFlags |= O_RDONLY;
     23     nMasks = 0;
     24   } else {
     25     nFlags |= O_RDWR | O_CREAT;
     26     if (dwModes & FX_FILEMODE_Truncate) {
     27       nFlags |= O_TRUNC;
     28     }
     29     nMasks = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
     30   }
     31 }
     32 CFXCRT_FileAccess_Posix::CFXCRT_FileAccess_Posix() : m_nFD(-1) {}
     33 CFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix() {
     34   Close();
     35 }
     36 FX_BOOL CFXCRT_FileAccess_Posix::Open(const CFX_ByteStringC& fileName,
     37                                       FX_DWORD dwMode) {
     38   if (m_nFD > -1) {
     39     return FALSE;
     40   }
     41   int32_t nFlags, nMasks;
     42   FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);
     43   m_nFD = open(fileName.GetCStr(), nFlags, nMasks);
     44   return m_nFD > -1;
     45 }
     46 FX_BOOL CFXCRT_FileAccess_Posix::Open(const CFX_WideStringC& fileName,
     47                                       FX_DWORD dwMode) {
     48   return Open(FX_UTF8Encode(fileName), dwMode);
     49 }
     50 void CFXCRT_FileAccess_Posix::Close() {
     51   if (m_nFD < 0) {
     52     return;
     53   }
     54   close(m_nFD);
     55   m_nFD = -1;
     56 }
     57 void CFXCRT_FileAccess_Posix::Release() {
     58   delete this;
     59 }
     60 FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const {
     61   if (m_nFD < 0) {
     62     return 0;
     63   }
     64   struct stat s;
     65   FXSYS_memset(&s, 0, sizeof(s));
     66   fstat(m_nFD, &s);
     67   return s.st_size;
     68 }
     69 FX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const {
     70   if (m_nFD < 0) {
     71     return (FX_FILESIZE)-1;
     72   }
     73   return lseek(m_nFD, 0, SEEK_CUR);
     74 }
     75 FX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos) {
     76   if (m_nFD < 0) {
     77     return (FX_FILESIZE)-1;
     78   }
     79   return lseek(m_nFD, pos, SEEK_SET);
     80 }
     81 size_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer) {
     82   if (m_nFD < 0) {
     83     return 0;
     84   }
     85   return read(m_nFD, pBuffer, szBuffer);
     86 }
     87 size_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer) {
     88   if (m_nFD < 0) {
     89     return 0;
     90   }
     91   return write(m_nFD, pBuffer, szBuffer);
     92 }
     93 size_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer,
     94                                         size_t szBuffer,
     95                                         FX_FILESIZE pos) {
     96   if (m_nFD < 0) {
     97     return 0;
     98   }
     99   if (pos >= GetSize()) {
    100     return 0;
    101   }
    102   if (SetPosition(pos) == (FX_FILESIZE)-1) {
    103     return 0;
    104   }
    105   return Read(pBuffer, szBuffer);
    106 }
    107 size_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer,
    108                                          size_t szBuffer,
    109                                          FX_FILESIZE pos) {
    110   if (m_nFD < 0) {
    111     return 0;
    112   }
    113   if (SetPosition(pos) == (FX_FILESIZE)-1) {
    114     return 0;
    115   }
    116   return Write(pBuffer, szBuffer);
    117 }
    118 FX_BOOL CFXCRT_FileAccess_Posix::Flush() {
    119   if (m_nFD < 0) {
    120     return FALSE;
    121   }
    122   return fsync(m_nFD) > -1;
    123 }
    124 FX_BOOL CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile) {
    125   if (m_nFD < 0) {
    126     return FALSE;
    127   }
    128   return !ftruncate(m_nFD, szFile);
    129 }
    130 #endif
    131