#include "diablo.h" #include "../3rdParty/Storm/Source/storm.h" DEVILUTION_BEGIN_NAMESPACE BOOL WCloseFile(HANDLE file) { return SFileCloseFile(file); } LONG WGetFileSize(HANDLE hsFile, DWORD *lpFileSizeHigh) { DWORD retry = 0; LONG ret; while ((ret = SFileGetFileSize(hsFile, lpFileSizeHigh)) == 0) WGetFileArchive(hsFile, &retry, NULL); return ret; } void WGetFileArchive(HANDLE hsFile, DWORD *retries, const char *FileName) { HANDLE archive; if (*retries >= 5) FileErrDlg(FileName); if (hsFile && SFileGetFileArchive(hsFile, &archive) && archive != diabdat_mpq) { Sleep(20); (*retries)++; } else if (!InsertCDDlg()) FileErrDlg(FileName); } BOOL WOpenFile(const char *FileName, HANDLE *phsFile, BOOL mayNotExist) { DWORD retry = 0; while (1) { if (SFileOpenFile(FileName, phsFile)) return TRUE; if (mayNotExist && SErrGetLastError() == ERROR_FILE_NOT_FOUND) break; WGetFileArchive(NULL, &retry, FileName); } return FALSE; } void WReadFile(HANDLE hsFile, LPVOID buf, DWORD to_read) { DWORD retry = 0; DWORD readed; int initial_pos = WSetFilePointer(hsFile, 0, NULL, FILE_CURRENT); while (!SFileReadFile(hsFile, buf, to_read, &readed, NULL)) { WGetFileArchive(hsFile, &retry, NULL); WSetFilePointer(hsFile, initial_pos, NULL, FILE_BEGIN); } } int WSetFilePointer(HANDLE file1, int offset, HANDLE file2, int whence) { DWORD retry = 0; int result; while (1) { result = SFileSetFilePointer(file1, offset, file2, whence); if (result != -1) break; WGetFileArchive(file1, &retry, NULL); } return result; } DEVILUTION_END_NAMESPACE