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_windows.h" 9 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 10 FX_BOOL FX_File_Exist(FX_BSTR fileName) 11 { 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(FX_WSTR fileName) 19 { 20 FX_DWORD dwAttri = ::GetFileAttributesW((LPCWSTR)fileName.GetPtr()); 21 if (dwAttri == -1) { 22 return FALSE; 23 } 24 return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0; 25 } 26 IFXCRT_FileAccess* FXCRT_FileAccess_Create() 27 { 28 return new CFXCRT_FileAccess_Win64; 29 } 30 void FXCRT_Windows_GetFileMode(FX_DWORD dwMode, FX_DWORD &dwAccess, FX_DWORD &dwShare, FX_DWORD &dwCreation) 31 { 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, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod); 46 #ifdef __cplusplus 47 } 48 #endif 49 CFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64() 50 : m_hFile(NULL) 51 { 52 } 53 CFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64() 54 { 55 Close(); 56 } 57 FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_BSTR fileName, FX_DWORD dwMode) 58 { 59 if (m_hFile) { 60 return FALSE; 61 } 62 FX_DWORD dwAccess, dwShare, dwCreation; 63 FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation); 64 m_hFile = ::CreateFileA(fileName.GetCStr(), dwAccess, dwShare, NULL, 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(FX_WSTR fileName, FX_DWORD dwMode) 71 { 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, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL); 78 if (m_hFile == INVALID_HANDLE_VALUE) { 79 m_hFile = NULL; 80 } 81 return m_hFile != NULL; 82 } 83 void CFXCRT_FileAccess_Win64::Close() 84 { 85 if (!m_hFile) { 86 return; 87 } 88 ::CloseHandle(m_hFile); 89 m_hFile = NULL; 90 } 91 void CFXCRT_FileAccess_Win64::Release() 92 { 93 delete this; 94 } 95 FX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const 96 { 97 if (!m_hFile) { 98 return 0; 99 } 100 LARGE_INTEGER size = {0, 0}; 101 if (!::GetFileSizeEx(m_hFile, &size)) { 102 return 0; 103 } 104 return (FX_FILESIZE)size.QuadPart; 105 } 106 FX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const 107 { 108 if (!m_hFile) { 109 return (FX_FILESIZE) - 1; 110 } 111 LARGE_INTEGER dist = {0, 0}; 112 LARGE_INTEGER newPos = {0, 0}; 113 if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) { 114 return (FX_FILESIZE) - 1; 115 } 116 return (FX_FILESIZE)newPos.QuadPart; 117 } 118 FX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos) 119 { 120 if (!m_hFile) { 121 return (FX_FILESIZE) - 1; 122 } 123 LARGE_INTEGER dist; 124 dist.QuadPart = pos; 125 LARGE_INTEGER newPos = {0, 0}; 126 if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) { 127 return (FX_FILESIZE) - 1; 128 } 129 return (FX_FILESIZE)newPos.QuadPart; 130 } 131 size_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer) 132 { 133 if (!m_hFile) { 134 return 0; 135 } 136 size_t szRead = 0; 137 if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, NULL)) { 138 return 0; 139 } 140 return szRead; 141 } 142 size_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer) 143 { 144 if (!m_hFile) { 145 return 0; 146 } 147 size_t szWrite = 0; 148 if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, NULL)) { 149 return 0; 150 } 151 return szWrite; 152 } 153 size_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) 154 { 155 if (!m_hFile) { 156 return 0; 157 } 158 if (pos >= GetSize()) { 159 return 0; 160 } 161 if (SetPosition(pos) == (FX_FILESIZE) - 1) { 162 return 0; 163 } 164 return Read(pBuffer, szBuffer); 165 } 166 size_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos) 167 { 168 if (!m_hFile) { 169 return 0; 170 } 171 if (SetPosition(pos) == (FX_FILESIZE) - 1) { 172 return 0; 173 } 174 return Write(pBuffer, szBuffer); 175 } 176 FX_BOOL CFXCRT_FileAccess_Win64::Flush() 177 { 178 if (!m_hFile) { 179 return FALSE; 180 } 181 return ::FlushFileBuffers(m_hFile); 182 } 183 FX_BOOL CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile) 184 { 185 if (SetPosition(szFile) == (FX_FILESIZE) - 1) { 186 return FALSE; 187 } 188 return ::SetEndOfFile(m_hFile); 189 } 190 FX_BOOL FX_File_Delete(FX_BSTR fileName) 191 { 192 return ::DeleteFileA(fileName.GetCStr()); 193 } 194 FX_BOOL FX_File_Delete(FX_WSTR fileName) 195 { 196 return ::DeleteFileW((LPCWSTR)fileName.GetPtr()); 197 } 198 FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst) 199 { 200 return ::CopyFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr(), FALSE); 201 } 202 FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst) 203 { 204 return ::CopyFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr(), FALSE); 205 } 206 FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst) 207 { 208 return ::MoveFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr()); 209 } 210 FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst) 211 { 212 return ::MoveFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr()); 213 } 214 #endif 215