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