Clean up IFX_BidiChar
[pdfium.git] / core / src / fxcrt / fxcrt_posix.cpp
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 "../../include/fxcrt/fx_basic.h"
8 #include "fxcrt_posix.h"
9
10 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \
11     _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || \
12     _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
13 IFXCRT_FileAccess* FXCRT_FileAccess_Create() {
14   return new CFXCRT_FileAccess_Posix;
15 }
16 void FXCRT_Posix_GetFileMode(FX_DWORD dwModes,
17                              int32_t& nFlags,
18                              int32_t& nMasks) {
19   nFlags = O_BINARY | O_LARGEFILE;
20   if (dwModes & FX_FILEMODE_ReadOnly) {
21     nFlags |= O_RDONLY;
22     nMasks = 0;
23   } else {
24     nFlags |= O_RDWR | O_CREAT;
25     if (dwModes & FX_FILEMODE_Truncate) {
26       nFlags |= O_TRUNC;
27     }
28     nMasks = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
29   }
30 }
31 CFXCRT_FileAccess_Posix::CFXCRT_FileAccess_Posix() : m_nFD(-1) {}
32 CFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix() {
33   Close();
34 }
35 FX_BOOL CFXCRT_FileAccess_Posix::Open(const CFX_ByteStringC& fileName,
36                                       FX_DWORD dwMode) {
37   if (m_nFD > -1) {
38     return FALSE;
39   }
40   int32_t nFlags, nMasks;
41   FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);
42   m_nFD = open(fileName.GetCStr(), nFlags, nMasks);
43   return m_nFD > -1;
44 }
45 FX_BOOL CFXCRT_FileAccess_Posix::Open(const CFX_WideStringC& fileName,
46                                       FX_DWORD dwMode) {
47   return Open(FX_UTF8Encode(fileName), dwMode);
48 }
49 void CFXCRT_FileAccess_Posix::Close() {
50   if (m_nFD < 0) {
51     return;
52   }
53   close(m_nFD);
54   m_nFD = -1;
55 }
56 void CFXCRT_FileAccess_Posix::Release() {
57   delete this;
58 }
59 FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const {
60   if (m_nFD < 0) {
61     return 0;
62   }
63   struct stat s;
64   FXSYS_memset(&s, 0, sizeof(s));
65   fstat(m_nFD, &s);
66   return s.st_size;
67 }
68 FX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const {
69   if (m_nFD < 0) {
70     return (FX_FILESIZE)-1;
71   }
72   return lseek(m_nFD, 0, SEEK_CUR);
73 }
74 FX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos) {
75   if (m_nFD < 0) {
76     return (FX_FILESIZE)-1;
77   }
78   return lseek(m_nFD, pos, SEEK_SET);
79 }
80 size_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer) {
81   if (m_nFD < 0) {
82     return 0;
83   }
84   return read(m_nFD, pBuffer, szBuffer);
85 }
86 size_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer) {
87   if (m_nFD < 0) {
88     return 0;
89   }
90   return write(m_nFD, pBuffer, szBuffer);
91 }
92 size_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer,
93                                         size_t szBuffer,
94                                         FX_FILESIZE pos) {
95   if (m_nFD < 0) {
96     return 0;
97   }
98   if (pos >= GetSize()) {
99     return 0;
100   }
101   if (SetPosition(pos) == (FX_FILESIZE)-1) {
102     return 0;
103   }
104   return Read(pBuffer, szBuffer);
105 }
106 size_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer,
107                                          size_t szBuffer,
108                                          FX_FILESIZE pos) {
109   if (m_nFD < 0) {
110     return 0;
111   }
112   if (SetPosition(pos) == (FX_FILESIZE)-1) {
113     return 0;
114   }
115   return Write(pBuffer, szBuffer);
116 }
117 FX_BOOL CFXCRT_FileAccess_Posix::Flush() {
118   if (m_nFD < 0) {
119     return FALSE;
120   }
121   return fsync(m_nFD) > -1;
122 }
123 FX_BOOL CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile) {
124   if (m_nFD < 0) {
125     return FALSE;
126   }
127   return !ftruncate(m_nFD, szFile);
128 }
129 FX_BOOL FX_File_Exist(const CFX_ByteStringC& fileName) {
130   return access(fileName.GetCStr(), F_OK) > -1;
131 }
132 FX_BOOL FX_File_Exist(const CFX_WideStringC& fileName) {
133   return FX_File_Exist(FX_UTF8Encode(fileName));
134 }
135 FX_BOOL FX_File_Delete(const CFX_ByteStringC& fileName) {
136   return remove(fileName.GetCStr()) > -1;
137 }
138 FX_BOOL FX_File_Delete(const CFX_WideStringC& fileName) {
139   return FX_File_Delete(FX_UTF8Encode(fileName));
140 }
141 FX_BOOL FX_File_Copy(const CFX_ByteStringC& fileNameSrc,
142                      const CFX_ByteStringC& fileNameDst) {
143   CFXCRT_FileAccess_Posix src, dst;
144   if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
145     return FALSE;
146   }
147   FX_FILESIZE size = src.GetSize();
148   if (!size) {
149     return FALSE;
150   }
151   if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
152     return FALSE;
153   }
154   size_t num = 0;
155   uint8_t* pBuffer = FX_Alloc(uint8_t, 32768);
156   num = src.Read(pBuffer, 32768);
157   while (num) {
158     if (dst.Write(pBuffer, num) != num) {
159       break;
160     }
161     num = src.Read(pBuffer, 32768);
162   }
163   FX_Free(pBuffer);
164   return TRUE;
165 }
166 FX_BOOL FX_File_Copy(const CFX_WideStringC& fileNameSrc,
167                      const CFX_WideStringC& fileNameDst) {
168   return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
169 }
170 FX_BOOL FX_File_Move(const CFX_ByteStringC& fileNameSrc,
171                      const CFX_ByteStringC& fileNameDst) {
172   return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
173 }
174 FX_BOOL FX_File_Move(const CFX_WideStringC& fileNameSrc,
175                      const CFX_WideStringC& fileNameDst) {
176   return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
177 }
178 #endif