Convert all line endings to LF.
[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_ext.h"
8 #include "fxcrt_posix.h"
9 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
10 IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
11 {
12     if (pAllocator) {
13         return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Posix();
14     } else {
15         return FX_NEW CFXCRT_FileAccess_Posix;
16     }
17 }
18 void FXCRT_Posix_GetFileMode(FX_DWORD dwModes, FX_INT32 &nFlags, FX_INT32 &nMasks)
19 {
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()
33     : m_nFD(-1)
34 {
35 }
36 CFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix()
37 {
38     Close();
39 }
40 FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_BSTR fileName, FX_DWORD dwMode)
41 {
42     if (m_nFD > -1) {
43         return FALSE;
44     }
45     FX_INT32 nFlags, nMasks;
46     FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);
47     m_nFD = open(fileName.GetCStr(), nFlags, nMasks);
48     return m_nFD > -1;
49 }
50 FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_WSTR fileName, FX_DWORD dwMode)
51 {
52     return Open(FX_UTF8Encode(fileName), dwMode);
53 }
54 void CFXCRT_FileAccess_Posix::Close()
55 {
56     if (m_nFD < 0) {
57         return;
58     }
59     close(m_nFD);
60     m_nFD = -1;
61 }
62 void CFXCRT_FileAccess_Posix::Release(IFX_Allocator* pAllocator)
63 {
64     if (pAllocator) {
65         FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Posix);
66     } else {
67         delete this;
68     }
69 }
70 FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const
71 {
72     if (m_nFD < 0) {
73         return 0;
74     }
75     struct stat s;
76     FXSYS_memset32(&s, 0, sizeof(s));
77     fstat(m_nFD, &s);
78     return s.st_size;
79 }
80 FX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const
81 {
82     if (m_nFD < 0) {
83         return (FX_FILESIZE) - 1;
84     }
85     return lseek(m_nFD, 0, SEEK_CUR);
86 }
87 FX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos)
88 {
89     if (m_nFD < 0) {
90         return (FX_FILESIZE) - 1;
91     }
92     return lseek(m_nFD, pos, SEEK_SET);
93 }
94 size_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer)
95 {
96     if (m_nFD < 0) {
97         return 0;
98     }
99     return read(m_nFD, pBuffer, szBuffer);
100 }
101 size_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer)
102 {
103     if (m_nFD < 0) {
104         return 0;
105     }
106     return write(m_nFD, pBuffer, szBuffer);
107 }
108 size_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
109 {
110     if (m_nFD < 0) {
111         return 0;
112     }
113     if (pos >= GetSize()) {
114         return 0;
115     }
116     if (SetPosition(pos) == (FX_FILESIZE) - 1) {
117         return 0;
118     }
119     return Read(pBuffer, szBuffer);
120 }
121 size_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
122 {
123     if (m_nFD < 0) {
124         return 0;
125     }
126     if (SetPosition(pos) == (FX_FILESIZE) - 1) {
127         return 0;
128     }
129     return Write(pBuffer, szBuffer);
130 }
131 FX_BOOL CFXCRT_FileAccess_Posix::Flush()
132 {
133     if (m_nFD < 0) {
134         return FALSE;
135     }
136     return fsync(m_nFD) > -1;
137 }
138 FX_BOOL CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile)
139 {
140     if (m_nFD < 0) {
141         return FALSE;
142     }
143     return !ftruncate(m_nFD, szFile);
144 }
145 FX_BOOL FX_File_Exist(FX_BSTR fileName)
146 {
147     return access(fileName.GetCStr(), F_OK) > -1;
148 }
149 FX_BOOL FX_File_Exist(FX_WSTR fileName)
150 {
151     return FX_File_Exist(FX_UTF8Encode(fileName));
152 }
153 FX_BOOL FX_File_Delete(FX_BSTR fileName)
154 {
155     return remove(fileName.GetCStr()) > -1;
156 }
157 FX_BOOL FX_File_Delete(FX_WSTR fileName)
158 {
159     return FX_File_Delete(FX_UTF8Encode(fileName));
160 }
161 FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
162 {
163     CFXCRT_FileAccess_Posix src, dst;
164     if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
165         return FALSE;
166     }
167     FX_FILESIZE size = src.GetSize();
168     if (!size) {
169         return FALSE;
170     }
171     if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
172         return FALSE;
173     }
174     size_t num = 0;
175     FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);
176     if (!pBuffer) {
177         return FALSE;
178     }
179     num = src.Read(pBuffer, 32768);
180     while (num) {
181         if (dst.Write(pBuffer, num) != num) {
182             break;
183         }
184         num = src.Read(pBuffer, 32768);
185     }
186     FX_Free(pBuffer);
187     return TRUE;
188 }
189 FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
190 {
191     return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
192 }
193 FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
194 {
195     return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
196 }
197 FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
198 {
199     return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
200 }
201 #endif