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