| 114 | } |
| 115 | |
| 116 | static bool BaseFile_Open(TFileStream * pStream, const TCHAR * szFileName, DWORD dwStreamFlags) |
| 117 | { |
| 118 | #ifdef PLATFORM_WINDOWS |
| 119 | { |
| 120 | ULARGE_INTEGER FileSize; |
| 121 | DWORD dwWriteAccess = (dwStreamFlags & STREAM_FLAG_READ_ONLY) ? 0 : FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_ATTRIBUTES; |
| 122 | DWORD dwWriteShare = (dwStreamFlags & STREAM_FLAG_WRITE_SHARE) ? FILE_SHARE_WRITE : 0; |
| 123 | |
| 124 | // Open the file |
| 125 | pStream->Base.File.hFile = CreateFile(szFileName, |
| 126 | FILE_READ_DATA | FILE_READ_ATTRIBUTES | dwWriteAccess, |
| 127 | FILE_SHARE_READ | dwWriteShare, |
| 128 | NULL, |
| 129 | OPEN_EXISTING, |
| 130 | 0, |
| 131 | NULL); |
| 132 | if(pStream->Base.File.hFile == INVALID_HANDLE_VALUE) |
| 133 | return false; |
| 134 | |
| 135 | // Query the file size |
| 136 | FileSize.LowPart = GetFileSize(pStream->Base.File.hFile, &FileSize.HighPart); |
| 137 | pStream->Base.File.FileSize = FileSize.QuadPart; |
| 138 | |
| 139 | // Query last write time |
| 140 | GetFileTime(pStream->Base.File.hFile, NULL, NULL, (LPFILETIME)&pStream->Base.File.FileTime); |
| 141 | } |
| 142 | #endif |
| 143 | |
| 144 | #if defined(PLATFORM_MAC) || defined(PLATFORM_LINUX) || defined(PLATFORM_HAIKU) || defined(PLATFORM_AMIGA) || defined(PLATFORM_SWITCH) |
| 145 | { |
| 146 | struct stat64 fileinfo; |
| 147 | int oflag = (dwStreamFlags & STREAM_FLAG_READ_ONLY) ? O_RDONLY : O_RDWR; |
| 148 | intptr_t handle; |
| 149 | |
| 150 | // Open the file |
| 151 | handle = open(szFileName, oflag | O_LARGEFILE); |
| 152 | if(handle == -1) |
| 153 | { |
| 154 | nLastError = errno; |
| 155 | pStream->Base.File.hFile = INVALID_HANDLE_VALUE; // BUGFIX (devilutionX) |
| 156 | return false; |
| 157 | } |
| 158 | |
| 159 | // Get the file size |
| 160 | if(fstat64(handle, &fileinfo) == -1) |
| 161 | { |
| 162 | nLastError = errno; |
| 163 | close(handle); |
| 164 | pStream->Base.File.hFile = INVALID_HANDLE_VALUE; // BUGFIX (devilutionX) |
| 165 | return false; |
| 166 | } |
| 167 | |
| 168 | // time_t is number of seconds since 1.1.1970, UTC. |
| 169 | // 1 second = 10000000 (decimal) in FILETIME |
| 170 | // Set the start to 1.1.1970 00:00:00 |
| 171 | pStream->Base.File.FileTime = 0x019DB1DED53E8000ULL + (10000000 * fileinfo.st_mtime); |
| 172 | pStream->Base.File.FileSize = (ULONGLONG)fileinfo.st_size; |
| 173 | pStream->Base.File.hFile = (HANDLE)handle; |
no test coverage detected