int FILEFile::Read(UByte *pbuffer, int numBytes) { if (LastOp && LastOp != Open_Read) fflush(fs); LastOp = Open_Read; int read = (int) fread(pbuffer, 1, numBytes, fs); if (read < numBytes) ErrorCode = SFerror(); #ifdef OVR_FILE_VERIFY_SEEK_ERRORS if (read > 0) { // Read-in data must match our pre-loaded buffer data! UByte* pcompareBuffer = pFileTestBuffer + TestPos; for (int i=0; i< read; i++) { OVR_ASSERT(pcompareBuffer[i] == pbuffer[i]); } //OVR_ASSERT(!memcmp(pFileTestBuffer + TestPos, pbuffer, read)); TestPos += read; OVR_ASSERT(ftell(fs) == (int)TestPos); } #endif return read; }
SInt64 FILEFile::LTell() { SInt64 pos = ftell(fs); if (pos < 0) ErrorCode = SFerror(); return pos; }
// Return position / file size int FILEFile::Tell() { int pos = (int)ftell (fs); if (pos < 0) ErrorCode = SFerror(); return pos; }
int64_t FILEFile::LTell() { int64_t pos = ftell(fs); if (pos < 0) ErrorCode = SFerror(); return pos; }
bool FILEFile::Close() { #ifdef OVR_FILE_VERIFY_SEEK_ERRORS if (pFileTestBuffer) { OVR_FREE(pFileTestBuffer); pFileTestBuffer = 0; FileTestLength = 0; } #endif bool closeRet = !fclose(fs); if (!closeRet) { ErrorCode = SFerror(); return 0; } else { Opened = 0; fs = 0; ErrorCode = 0; } // Handle safe truncate /* if ((OpenFlags & OVR_FO_SAFETRUNC) == OVR_FO_SAFETRUNC) { // Delete original file (if it existed) DWORD oldAttributes = FileUtilWin32::GetFileAttributes(FileName); if (oldAttributes!=0xFFFFFFFF) if (!FileUtilWin32::DeleteFile(FileName)) { // Try to remove the readonly attribute FileUtilWin32::SetFileAttributes(FileName, oldAttributes & (~FILE_ATTRIBUTE_READONLY) ); // And delete the file again if (!FileUtilWin32::DeleteFile(FileName)) return 0; } // Rename temp file to real filename if (!FileUtilWin32::MoveFile(TempName, FileName)) { //ErrorCode = errno; return 0; } } */ return 1; }
// Return # of bytes till EOF int FILEFile::BytesAvailable() { SInt64 pos = LTell(); SInt64 endPos = LGetLength(); // Return -1 for major error if ((pos==-1) || (endPos==-1)) { ErrorCode = SFerror(); return 0; } else ErrorCode = 0; return int (endPos-(int)pos); }
// ** Stream implementation & I/O int FILEFile::Write(const UByte *pbuffer, int numBytes) { if (LastOp && LastOp != Open_Write) fflush(fs); LastOp = Open_Write; int written = (int) fwrite(pbuffer, 1, numBytes, fs); if (written < numBytes) ErrorCode = SFerror(); #ifdef OVR_FILE_VERIFY_SEEK_ERRORS if (written > 0) TestPos += written; #endif return written; }
void FILEFile::init() { // Open mode for file's open const char *omode = "rb"; if (OpenFlags & Open_Truncate) { if (OpenFlags & Open_Read) omode = "w+b"; else omode = "wb"; } else if (OpenFlags & Open_Create) { if (OpenFlags & Open_Read) omode = "a+b"; else omode = "ab"; } else if (OpenFlags & Open_Write) omode = "r+b"; #ifdef OVR_OS_WIN32 SysErrorModeDisabler disabler(FileName.ToCStr()); #endif #if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400) wchar_t womode[16]; wchar_t *pwFileName = (wchar_t*)OVR_ALLOC((UTF8Util::GetLength(FileName.ToCStr())+1) * sizeof(wchar_t)); UTF8Util::DecodeString(pwFileName, FileName.ToCStr()); OVR_ASSERT(strlen(omode) < sizeof(womode)/sizeof(womode[0])); UTF8Util::DecodeString(womode, omode); _wfopen_s(&fs, pwFileName, womode); OVR_FREE(pwFileName); #else fs = fopen(FileName.ToCStr(), omode); #endif if (fs) rewind (fs); Opened = (fs != NULL); // Set error code if (!Opened) ErrorCode = SFerror(); else { // If we are testing file seek correctness, pre-load the entire file so // that we can do comparison tests later. #ifdef OVR_FILE_VERIFY_SEEK_ERRORS TestPos = 0; fseek(fs, 0, SEEK_END); FileTestLength = ftell(fs); fseek(fs, 0, SEEK_SET); pFileTestBuffer = (UByte*)OVR_ALLOC(FileTestLength); if (pFileTestBuffer) { OVR_ASSERT(FileTestLength == (unsigned)Read(pFileTestBuffer, FileTestLength)); Seek(0, Seek_Set); } #endif ErrorCode = 0; } LastOp = 0; }