Revert "FX Bool considered harmful, part 3"
[pdfium.git] / core / src / fxcrt / fxcrt_platforms.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_platforms.h"
9
10 #if (_FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ && _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_CRT;
14 }
15 void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode)
16 {
17     if (dwModes & FX_FILEMODE_ReadOnly) {
18         bsMode = FX_BSTRC("rb");
19     } else if (dwModes & FX_FILEMODE_Truncate) {
20         bsMode = FX_BSTRC("w+b");
21     } else {
22         bsMode = FX_BSTRC("a+b");
23     }
24 }
25 void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode)
26 {
27     if (dwModes & FX_FILEMODE_ReadOnly) {
28         wsMode = FX_WSTRC(L"rb");
29     } else if (dwModes & FX_FILEMODE_Truncate) {
30         wsMode = FX_WSTRC(L"w+b");
31     } else {
32         wsMode = FX_WSTRC(L"a+b");
33     }
34 }
35 CFXCRT_FileAccess_CRT::CFXCRT_FileAccess_CRT()
36     : m_hFile(NULL)
37 {
38 }
39 CFXCRT_FileAccess_CRT::~CFXCRT_FileAccess_CRT()
40 {
41     Close();
42 }
43 FX_BOOL CFXCRT_FileAccess_CRT::Open(const CFX_ByteStringC& fileName, FX_DWORD dwMode)
44 {
45     if (m_hFile) {
46         return FALSE;
47     }
48     CFX_ByteString strMode;
49     FXCRT_GetFileModeString(dwMode, strMode);
50     m_hFile = FXSYS_fopen(fileName.GetCStr(), strMode.c_str());
51     return m_hFile != NULL;
52 }
53 FX_BOOL CFXCRT_FileAccess_CRT::Open(const CFX_WideStringC& fileName, FX_DWORD dwMode)
54 {
55     if (m_hFile) {
56         return FALSE;
57     }
58     CFX_WideString strMode;
59     FXCRT_GetFileModeString(dwMode, strMode);
60     m_hFile = FXSYS_wfopen(fileName.GetPtr(), strMode.c_str());
61     return m_hFile != NULL;
62 }
63 void CFXCRT_FileAccess_CRT::Close()
64 {
65     if (!m_hFile) {
66         return;
67     }
68     FXSYS_fclose(m_hFile);
69     m_hFile = NULL;
70 }
71 void CFXCRT_FileAccess_CRT::Release()
72 {
73     delete this;
74 }
75 FX_FILESIZE CFXCRT_FileAccess_CRT::GetSize() const
76 {
77     if (!m_hFile) {
78         return 0;
79     }
80     FX_FILESIZE pos = (FX_FILESIZE)FXSYS_ftell(m_hFile);
81     FXSYS_fseek(m_hFile, 0, FXSYS_SEEK_END);
82     FX_FILESIZE size = (FX_FILESIZE)FXSYS_ftell(m_hFile);
83     FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
84     return size;
85 }
86 FX_FILESIZE CFXCRT_FileAccess_CRT::GetPosition() const
87 {
88     if (!m_hFile) {
89         return (FX_FILESIZE) - 1;
90     }
91     return (FX_FILESIZE)FXSYS_ftell(m_hFile);
92 }
93 FX_FILESIZE CFXCRT_FileAccess_CRT::SetPosition(FX_FILESIZE pos)
94 {
95     if (!m_hFile) {
96         return (FX_FILESIZE) - 1;
97     }
98     FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
99     return (FX_FILESIZE)FXSYS_ftell(m_hFile);
100 }
101 size_t CFXCRT_FileAccess_CRT::Read(void* pBuffer, size_t szBuffer)
102 {
103     if (!m_hFile) {
104         return 0;
105     }
106     return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
107 }
108 size_t CFXCRT_FileAccess_CRT::Write(const void* pBuffer, size_t szBuffer)
109 {
110     if (!m_hFile) {
111         return 0;
112     }
113     return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
114 }
115 size_t CFXCRT_FileAccess_CRT::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
116 {
117     if (!m_hFile) {
118         return (FX_FILESIZE) - 1;
119     }
120     FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
121     return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
122 }
123 size_t CFXCRT_FileAccess_CRT::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
124 {
125     if (!m_hFile) {
126         return (FX_FILESIZE) - 1;
127     }
128     FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
129     return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
130 }
131 FX_BOOL CFXCRT_FileAccess_CRT::Flush()
132 {
133     if (!m_hFile) {
134         return FALSE;
135     }
136     return !FXSYS_fflush(m_hFile);
137 }
138 FX_BOOL CFXCRT_FileAccess_CRT::Truncate(FX_FILESIZE szFile)
139 {
140     return FALSE;
141 }
142 FX_BOOL FX_File_Exist(const CFX_ByteStringC& fileName)
143 {
144     return access(fileName.GetCStr(), F_OK) > -1;
145 }
146 FX_BOOL FX_File_Exist(const CFX_WideStringC& fileName)
147 {
148     return FX_File_Exist(FX_UTF8Encode(fileName));
149 }
150 FX_BOOL FX_File_Delete(const CFX_ByteStringC& fileName)
151 {
152     return remove(fileName.GetCStr()) > -1;
153 }
154 FX_BOOL FX_File_Delete(const CFX_WideStringC& fileName)
155 {
156     return FX_File_Delete(FX_UTF8Encode(fileName));
157 }
158 FX_BOOL FX_File_Copy(const CFX_ByteStringC& fileNameSrc, const CFX_ByteStringC& fileNameDst)
159 {
160     CFXCRT_FileAccess_CRT src, dst;
161     if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
162         return FALSE;
163     }
164     FX_FILESIZE size = src.GetSize();
165     if (!size) {
166         return FALSE;
167     }
168     if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
169         return FALSE;
170     }
171     FX_FILESIZE num = 0;
172     uint8_t* pBuffer = FX_Alloc(uint8_t, 32768);
173     while (num = src.Read(pBuffer, 32768)) {
174         if (dst.Write(pBuffer, num) != num) {
175             break;
176         }
177     }
178     FX_Free(pBuffer);
179     return TRUE;
180 }
181 FX_BOOL FX_File_Copy(const CFX_WideStringC& fileNameSrc, const CFX_WideStringC& fileNameDst)
182 {
183     return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
184 }
185 FX_BOOL FX_File_Move(const CFX_ByteStringC& fileNameSrc, const CFX_ByteStringC& fileNameDst)
186 {
187     return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
188 }
189 FX_BOOL FX_File_Move(const CFX_WideStringC& fileNameSrc, const CFX_WideStringC& fileNameDst)
190 {
191     return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
192 }
193 #endif