Initial commit.
[pdfium.git] / core / src / fxcrt / fxcrt_windows.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_windows.h"\r
9 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\r
10 FX_BOOL FX_File_Exist(FX_BSTR fileName)\r
11 {\r
12     FX_DWORD dwAttri = ::GetFileAttributesA(fileName.GetCStr());\r
13     if (dwAttri == -1) {\r
14         return FALSE;\r
15     }\r
16     return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;\r
17 }\r
18 FX_BOOL FX_File_Exist(FX_WSTR fileName)\r
19 {\r
20     FX_DWORD dwAttri = ::GetFileAttributesW((LPCWSTR)fileName.GetPtr());\r
21     if (dwAttri == -1) {\r
22         return FALSE;\r
23     }\r
24     return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;\r
25 }\r
26 IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)\r
27 {\r
28     if (pAllocator) {\r
29         return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Win64;\r
30     } else {\r
31         return FX_NEW CFXCRT_FileAccess_Win64;\r
32     }\r
33 }\r
34 void FXCRT_Windows_GetFileMode(FX_DWORD dwMode, FX_DWORD &dwAccess, FX_DWORD &dwShare, FX_DWORD &dwCreation)\r
35 {\r
36     dwAccess = GENERIC_READ;\r
37     dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;\r
38     if (!(dwMode & FX_FILEMODE_ReadOnly)) {\r
39         dwAccess |= GENERIC_WRITE;\r
40         dwCreation = (dwMode & FX_FILEMODE_Truncate) ? CREATE_ALWAYS : OPEN_ALWAYS;\r
41     } else {\r
42         dwCreation = OPEN_EXISTING;\r
43     }\r
44 }\r
45 #ifdef __cplusplus\r
46 extern "C" {\r
47 #endif\r
48 WINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);\r
49 WINBASEAPI BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);\r
50 #ifdef __cplusplus\r
51 }\r
52 #endif\r
53 CFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64()\r
54     : m_hFile(NULL)\r
55 {\r
56 }\r
57 CFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64()\r
58 {\r
59     Close();\r
60 }\r
61 FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_BSTR fileName, FX_DWORD dwMode)\r
62 {\r
63     if (m_hFile) {\r
64         return FALSE;\r
65     }\r
66     FX_DWORD dwAccess, dwShare, dwCreation;\r
67     FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);\r
68     m_hFile = ::CreateFileA(fileName.GetCStr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);\r
69     if (m_hFile == INVALID_HANDLE_VALUE) {\r
70         m_hFile = NULL;\r
71     }\r
72     return m_hFile != NULL;\r
73 }\r
74 FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_WSTR fileName, FX_DWORD dwMode)\r
75 {\r
76     if (m_hFile) {\r
77         return FALSE;\r
78     }\r
79     FX_DWORD dwAccess, dwShare, dwCreation;\r
80     FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);\r
81     m_hFile = ::CreateFileW((LPCWSTR)fileName.GetPtr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);\r
82     if (m_hFile == INVALID_HANDLE_VALUE) {\r
83         m_hFile = NULL;\r
84     }\r
85     return m_hFile != NULL;\r
86 }\r
87 void CFXCRT_FileAccess_Win64::Close()\r
88 {\r
89     if (!m_hFile) {\r
90         return;\r
91     }\r
92     ::CloseHandle(m_hFile);\r
93     m_hFile = NULL;\r
94 }\r
95 void CFXCRT_FileAccess_Win64::Release(IFX_Allocator* pAllocator)\r
96 {\r
97     if (pAllocator) {\r
98         FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Win64);\r
99     } else {\r
100         delete this;\r
101     }\r
102 }\r
103 FX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const\r
104 {\r
105     if (!m_hFile) {\r
106         return 0;\r
107     }\r
108     LARGE_INTEGER size = {0, 0};\r
109     if (!::GetFileSizeEx(m_hFile, &size)) {\r
110         return 0;\r
111     }\r
112     return (FX_FILESIZE)size.QuadPart;\r
113 }\r
114 FX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const\r
115 {\r
116     if (!m_hFile) {\r
117         return (FX_FILESIZE) - 1;\r
118     }\r
119     LARGE_INTEGER dist = {0, 0};\r
120     LARGE_INTEGER newPos = {0, 0};\r
121     if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) {\r
122         return (FX_FILESIZE) - 1;\r
123     }\r
124     return (FX_FILESIZE)newPos.QuadPart;\r
125 }\r
126 FX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos)\r
127 {\r
128     if (!m_hFile) {\r
129         return (FX_FILESIZE) - 1;\r
130     }\r
131     LARGE_INTEGER dist;\r
132     dist.QuadPart = pos;\r
133     LARGE_INTEGER newPos = {0, 0};\r
134     if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) {\r
135         return (FX_FILESIZE) - 1;\r
136     }\r
137     return (FX_FILESIZE)newPos.QuadPart;\r
138 }\r
139 size_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer)\r
140 {\r
141     if (!m_hFile) {\r
142         return 0;\r
143     }\r
144     size_t szRead = 0;\r
145     if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, NULL)) {\r
146         return 0;\r
147     }\r
148     return szRead;\r
149 }\r
150 size_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer)\r
151 {\r
152     if (!m_hFile) {\r
153         return 0;\r
154     }\r
155     size_t szWrite = 0;\r
156     if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, NULL)) {\r
157         return 0;\r
158     }\r
159     return szWrite;\r
160 }\r
161 size_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\r
162 {\r
163     if (!m_hFile) {\r
164         return 0;\r
165     }\r
166     if (pos >= GetSize()) {\r
167         return 0;\r
168     }\r
169     if (SetPosition(pos) == (FX_FILESIZE) - 1) {\r
170         return 0;\r
171     }\r
172     return Read(pBuffer, szBuffer);\r
173 }\r
174 size_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)\r
175 {\r
176     if (!m_hFile) {\r
177         return 0;\r
178     }\r
179     if (SetPosition(pos) == (FX_FILESIZE) - 1) {\r
180         return 0;\r
181     }\r
182     return Write(pBuffer, szBuffer);\r
183 }\r
184 FX_BOOL CFXCRT_FileAccess_Win64::Flush()\r
185 {\r
186     if (!m_hFile) {\r
187         return FALSE;\r
188     }\r
189     return ::FlushFileBuffers(m_hFile);\r
190 }\r
191 FX_BOOL CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile)\r
192 {\r
193     if (SetPosition(szFile) == (FX_FILESIZE) - 1) {\r
194         return FALSE;\r
195     }\r
196     return ::SetEndOfFile(m_hFile);\r
197 }\r
198 FX_BOOL FX_File_Delete(FX_BSTR fileName)\r
199 {\r
200     return ::DeleteFileA(fileName.GetCStr());\r
201 }\r
202 FX_BOOL FX_File_Delete(FX_WSTR fileName)\r
203 {\r
204     return ::DeleteFileW((LPCWSTR)fileName.GetPtr());\r
205 }\r
206 FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)\r
207 {\r
208     return ::CopyFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr(), FALSE);\r
209 }\r
210 FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)\r
211 {\r
212     return ::CopyFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr(), FALSE);\r
213 }\r
214 FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)\r
215 {\r
216     return ::MoveFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr());\r
217 }\r
218 FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)\r
219 {\r
220     return ::MoveFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr());\r
221 }\r
222 #endif\r