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