#define _LARGEFILE64_SOURCE #include #include #include #include #include #include #include "File64.h" // hack... extern pthread_mutex_t g_diskcs; //////////// File64::File64() { } File64::File64(HANDLE _hFile, HANDLE _hFileUnbuffered) : hFile(_hFile), hFileUnbuffered(_hFileUnbuffered) { i64FilePosition = 0; } long File64::_readFile(void *data, long len) { DWORD dwActual=read(hFile, data, len); if (!dwActual) return -1; i64FilePosition += dwActual; return (long)dwActual; } void File64::_readFile2(void *data, long len) { long lActual = _readFile(data, len); if (lActual < 0) return; // throw MyWin32Error("Failure reading file: %%s.",GetLastError()); if (lActual != len) return; // throw MyError("Failure reading file: Unexpected end of file"); } bool File64::_readChunkHeader(FOURCC& pfcc, DWORD& pdwLen) { DWORD dw[2]; long actual; actual = _readFile(dw, 8); if (actual != 8) return false; pfcc = dw[0]; pdwLen = dw[1]; return true; } void File64::_seekFile(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; lseek64(hFile, i64NewPos, SEEK_SET); // if (0xFFFFFFFF == SetFilePointer(hFile, (LONG)i64NewPos, &lHi, FILE_BEGIN)) // if ((dwError = GetLastError()) != NO_ERROR) // throw MyWin32Error("File64: %%s", dwError); i64FilePosition = i64NewPos; } bool File64::_seekFile2(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; // _RPT1(0,"Seeking to %I64d\n", i64NewPos); lseek64(hFile, i64NewPos, SEEK_SET); /* if (0xFFFFFFFF == SetFilePointer(hFile, (LONG)i64NewPos, &lHi, FILE_BEGIN)) if ((dwError = GetLastError()) != NO_ERROR) return false; */ i64FilePosition = i64NewPos; return true; } void File64::_skipFile(__int64 bytes) { LONG lHi = (LONG)(bytes>>32); DWORD dwError; LONG lNewLow; i64FilePosition = lseek64(hFile, bytes, SEEK_CUR); /* if (0xFFFFFFFF == (lNewLow = SetFilePointer(hFile, (LONG)bytes, &lHi, FILE_CURRENT))) if ((dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("File64: %%s", dwError); */ // i64FilePosition = (unsigned long)lNewLow | (((__int64)(unsigned long)lHi)<<32); } bool File64::_skipFile2(__int64 bytes) { LONG lHi = (LONG)(bytes>>32); DWORD dwError; LONG lNewLow; i64FilePosition = lseek64(hFile, bytes, SEEK_CUR); /* if (0xFFFFFFFF == (lNewLow = SetFilePointer(hFile, (LONG)bytes, &lHi, FILE_CURRENT))) if ((dwError = GetLastError()) != NO_ERROR) return false; */ return true; } long File64::_readFileUnbuffered(void *data, long len) { DWORD dwActual; // EnterCriticalSection(&g_diskcs); pthread_mutex_lock(&g_diskcs); // if (!ReadFile(hFileUnbuffered, data, len, &dwActual, NULL)) { if ((dwActual=read(hFileUnbuffered, data, len))==0) { // LeaveCriticalSection(&g_diskcs); pthread_mutex_unlock(&g_diskcs); return -1; } pthread_mutex_unlock(&g_diskcs); // LeaveCriticalSection(&g_diskcs); return (long)dwActual; } void File64::_seekFileUnbuffered(__int64 i64NewPos) { LONG lHi = (LONG)(i64NewPos>>32); DWORD dwError; lseek64(hFileUnbuffered, i64NewPos, SEEK_SET); /* if (0xFFFFFFFF == SetFilePointer(hFileUnbuffered, (LONG)i64NewPos, &lHi, FILE_BEGIN)) if ((dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("File64: %%s", dwError); */ } __int64 File64::_posFile() { return i64FilePosition; } __int64 File64::_sizeFile() { DWORD dwLow, dwHigh; DWORD dwError; // dwLow = GetFileSize(hFile, &dwHigh); __int64 pos=lseek64(hFile, 0, SEEK_CUR); __int64 answer=lseek64(hFile, 0, SEEK_END); lseek(hFile, pos, SEEK_SET); return answer; /* if (dwLow == 0xFFFFFFFF && (dwError = GetLastError()) != NO_ERROR) throw MyWin32Error("Cannot determine file size: %%s", dwError); return ((__int64)dwHigh << 32) | (unsigned long)dwLow; */ }