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