MCPcopy Create free account
hub / github.com/diasurgical/devilution / BaseFile_Open

Function BaseFile_Open

3rdParty/StormLib/src/FileStream.cpp:116–180  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

114}
115
116static 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;

Callers 1

FileStream_ReplaceFunction · 0.85

Calls 3

GetFileSizeFunction · 0.85
openFunction · 0.50
closeFunction · 0.50

Tested by

no test coverage detected