summaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/Kernel/OVR_FileFILE.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'LibOVR/Src/Kernel/OVR_FileFILE.cpp')
-rw-r--r--LibOVR/Src/Kernel/OVR_FileFILE.cpp609
1 files changed, 0 insertions, 609 deletions
diff --git a/LibOVR/Src/Kernel/OVR_FileFILE.cpp b/LibOVR/Src/Kernel/OVR_FileFILE.cpp
deleted file mode 100644
index 9b2123f..0000000
--- a/LibOVR/Src/Kernel/OVR_FileFILE.cpp
+++ /dev/null
@@ -1,609 +0,0 @@
-/**************************************************************************
-
-Filename : OVR_FileFILE.cpp
-Content : File wrapper class implementation (Win32)
-
-Created : April 5, 1999
-Authors : Michael Antonov
-
-Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved.
-
-Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License");
-you may not use the Oculus VR Rift SDK except in compliance with the License,
-which is provided at the time of installation or download, or which
-otherwise accompanies this software in either electronic or hard copy form.
-
-You may obtain a copy of the License at
-
-http://www.oculusvr.com/licenses/LICENSE-3.2
-
-Unless required by applicable law or agreed to in writing, the Oculus VR SDK
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-**************************************************************************/
-
-#define GFILE_CXX
-
-#include "OVR_Types.h"
-#include "OVR_Log.h"
-
-// Standard C library (Captain Obvious guarantees!)
-#include <stdio.h>
-#ifndef OVR_OS_WINCE
-#include <sys/stat.h>
-#endif
-
-#include "OVR_SysFile.h"
-
-#ifndef OVR_OS_WINCE
-#include <errno.h>
-#endif
-
-namespace OVR {
-
-// ***** File interface
-
-// ***** FILEFile - C streams file
-
-static int SFerror ()
-{
- if (errno == ENOENT)
- return FileConstants::Error_FileNotFound;
- else if (errno == EACCES || errno == EPERM)
- return FileConstants::Error_Access;
- else if (errno == ENOSPC)
- return FileConstants::Error_DiskFull;
- else
- return FileConstants::Error_IOError;
-};
-
-#if defined(OVR_OS_WIN32)
-#define WIN32_LEAN_AND_MEAN
-#include "windows.h"
-// A simple helper class to disable/enable system error mode, if necessary
-// Disabling happens conditionally only if a drive name is involved
-class SysErrorModeDisabler
-{
- BOOL Disabled;
- UINT OldMode;
-public:
- SysErrorModeDisabler(const char* pfileName)
- {
- if (pfileName && (pfileName[0]!=0) && pfileName[1]==':')
- {
- Disabled = TRUE;
- OldMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);
- }
- else
- {
- Disabled = 0;
- OldMode = 0;
- }
- }
-
- ~SysErrorModeDisabler()
- {
- if (Disabled)
- ::SetErrorMode(OldMode);
- }
-};
-#else
-class SysErrorModeDisabler
-{
-public:
- SysErrorModeDisabler(const char* pfileName) { OVR_UNUSED(pfileName); }
-};
-#endif // OVR_OS_WIN32
-
-
-// This macro enables verification of I/O results after seeks against a pre-loaded
-// full file buffer copy. This is generally not necessary, but can been used to debug
-// memory corruptions; we've seen this fail due to EAX2/DirectSound corrupting memory
-// under FMOD with XP64 (32-bit) and Realtek HA Audio driver.
-//#define GFILE_VERIFY_SEEK_ERRORS
-
-
-// This is the simplest possible file implementation, it wraps around the descriptor
-// This file is delegated to by SysFile.
-
-class FILEFile : public File
-{
-protected:
-
- // Allocated filename
- String FileName;
-
- // File handle & open mode
- bool Opened;
- FILE* fs;
- int OpenFlags;
- // Error code for last request
- int ErrorCode;
-
- int LastOp;
-
-#ifdef OVR_FILE_VERIFY_SEEK_ERRORS
- uint8_t* pFileTestBuffer;
- unsigned FileTestLength;
- unsigned TestPos; // File pointer position during tests.
-#endif
-
-public:
-
- FILEFile() :
- FileName(),
- Opened(false),
- fs(NULL),
- OpenFlags(0),
- ErrorCode(0),
- LastOp(0)
- #ifdef OVR_FILE_VERIFY_SEEK_ERRORS
- ,pFileTestBuffer(NULL)
- ,FileTestLength(0)
- ,TestPos(0)
- #endif
- {
- }
-
- // Initialize file by opening it
- FILEFile(const String& fileName, int flags, int Mode);
-
- // The 'pfileName' should be encoded as UTF-8 to support international file names.
- FILEFile(const char* pfileName, int flags, int Mode);
-
- ~FILEFile()
- {
- if (Opened)
- Close();
- }
-
- virtual const char* GetFilePath();
-
- // ** File Information
- virtual bool IsValid();
- virtual bool IsWritable();
-
- // Return position / file size
- virtual int Tell();
- virtual int64_t LTell();
- virtual int GetLength();
- virtual int64_t LGetLength();
-
-// virtual bool Stat(FileStats *pfs);
- virtual int GetErrorCode();
-
- // ** Stream implementation & I/O
- virtual int Write(const uint8_t *pbuffer, int numBytes);
- virtual int Read(uint8_t *pbuffer, int numBytes);
- virtual int SkipBytes(int numBytes);
- virtual int BytesAvailable();
- virtual bool Flush();
- virtual int Seek(int offset, int origin);
- virtual int64_t LSeek(int64_t offset, int origin);
-
- virtual int CopyFromStream(File *pStream, int byteSize);
- virtual bool Close();
-private:
- void init();
-};
-
-
-// Initialize file by opening it
-FILEFile::FILEFile(const String& fileName, int flags, int mode)
- : FileName(fileName), OpenFlags(flags)
-{
- OVR_UNUSED(mode);
- init();
-}
-
-// The 'pfileName' should be encoded as UTF-8 to support international file names.
-FILEFile::FILEFile(const char* pfileName, int flags, int mode)
- : FileName(pfileName), OpenFlags(flags)
-{
- OVR_UNUSED(mode);
- init();
-}
-
-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";
-
-#if defined(OVR_OS_MS)
- 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 = (uint8_t*)OVR_ALLOC(FileTestLength);
- if (pFileTestBuffer)
- {
- OVR_ASSERT(FileTestLength == (unsigned)Read(pFileTestBuffer, FileTestLength));
- Seek(0, Seek_Set);
- }
-#endif
-
- ErrorCode = 0;
- }
- LastOp = 0;
-}
-
-
-const char* FILEFile::GetFilePath()
-{
- return FileName.ToCStr();
-}
-
-
-// ** File Information
-bool FILEFile::IsValid()
-{
- return Opened;
-}
-bool FILEFile::IsWritable()
-{
- return IsValid() && (OpenFlags&Open_Write);
-}
-/*
-bool FILEFile::IsRecoverable()
-{
- return IsValid() && ((OpenFlags&OVR_FO_SAFETRUNC) == OVR_FO_SAFETRUNC);
-}
-*/
-
-// 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;
-}
-
-int FILEFile::GetLength()
-{
- int pos = Tell();
- if (pos >= 0)
- {
- Seek (0, Seek_End);
- int size = Tell();
- Seek (pos, Seek_Set);
- return size;
- }
- return -1;
-}
-int64_t FILEFile::LGetLength()
-{
- int64_t pos = LTell();
- if (pos >= 0)
- {
- LSeek (0, Seek_End);
- int64_t size = LTell();
- LSeek (pos, Seek_Set);
- return size;
- }
- return -1;
-}
-
-int FILEFile::GetErrorCode()
-{
- return ErrorCode;
-}
-
-// ** Stream implementation & I/O
-int FILEFile::Write(const uint8_t *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;
-}
-
-int FILEFile::Read(uint8_t *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!
- uint8_t* 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;
-}
-
-// Seeks ahead to skip bytes
-int FILEFile::SkipBytes(int numBytes)
-{
- int64_t pos = LTell();
- int64_t newPos = LSeek(numBytes, Seek_Cur);
-
- // Return -1 for major error
- if ((pos==-1) || (newPos==-1))
- {
- return -1;
- }
- //ErrorCode = ((NewPos-Pos)<numBytes) ? errno : 0;
-
- return int (newPos-(int)pos);
-}
-
-// Return # of bytes till EOF
-int FILEFile::BytesAvailable()
-{
- int64_t pos = LTell();
- int64_t endPos = LGetLength();
-
- // Return -1 for major error
- if ((pos==-1) || (endPos==-1))
- {
- ErrorCode = SFerror();
- return 0;
- }
- else
- ErrorCode = 0;
-
- return int (endPos-(int)pos);
-}
-
-// Flush file contents
-bool FILEFile::Flush()
-{
- return !fflush(fs);
-}
-
-int FILEFile::Seek(int offset, int origin)
-{
- int newOrigin = 0;
- switch(origin)
- {
- case Seek_Set: newOrigin = SEEK_SET; break;
- case Seek_Cur: newOrigin = SEEK_CUR; break;
- case Seek_End: newOrigin = SEEK_END; break;
- }
-
- if (newOrigin == SEEK_SET && offset == Tell())
- return Tell();
-
- if (fseek (fs, offset, newOrigin))
- {
-#ifdef OVR_FILE_VERIFY_SEEK_ERRORS
- OVR_ASSERT(0);
-#endif
- return -1;
- }
-
-#ifdef OVR_FILE_VERIFY_SEEK_ERRORS
- // Track file position after seeks for read verification later.
- switch(origin)
- {
- case Seek_Set: TestPos = offset; break;
- case Seek_Cur: TestPos += offset; break;
- case Seek_End: TestPos = FileTestLength + offset; break;
- }
- OVR_ASSERT((int)TestPos == Tell());
-#endif
-
- return (int)Tell();
-}
-
-int64_t FILEFile::LSeek(int64_t offset, int origin)
-{
- return Seek((int)offset,origin);
-}
-
-int FILEFile::CopyFromStream(File *pstream, int byteSize)
-{
- uint8_t* buff = new uint8_t[0x4000];
- int count = 0;
- int szRequest, szRead, szWritten;
-
- while (byteSize)
- {
- szRequest = (byteSize > int(sizeof(buff))) ? int(sizeof(buff)) : byteSize;
-
- szRead = pstream->Read(buff, szRequest);
- szWritten = 0;
- if (szRead > 0)
- szWritten = Write(buff, szRead);
-
- count += szWritten;
- byteSize -= szWritten;
- if (szWritten < szRequest)
- break;
- }
-
- delete[] buff;
-
- return count;
-}
-
-
-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;
-}
-
-/*
-bool FILEFile::CloseCancel()
-{
- bool closeRet = (bool)::CloseHandle(fd);
-
- if (!closeRet)
- {
- //ErrorCode = errno;
- return 0;
- }
- else
- {
- Opened = 0;
- fd = INVALID_HANDLE_VALUE;
- ErrorCode = 0;
- }
-
- // Handle safe truncate (delete tmp file, leave original unchanged)
- if ((OpenFlags&OVR_FO_SAFETRUNC) == OVR_FO_SAFETRUNC)
- if (!FileUtilWin32::DeleteFile(TempName))
- {
- //ErrorCode = errno;
- return 0;
- }
- return 1;
-}
-*/
-
-Ptr<File> FileFILEOpen(const String& path, int flags, int mode)
-{
- Ptr<File> result = *new FILEFile(path, flags, mode);
- return result;
-}
-
-// Helper function: obtain file information time.
-bool SysFile::GetFileStat(FileStat* pfileStat, const String& path)
-{
-#if defined(OVR_OS_MS)
- // 64-bit implementation on Windows.
- struct __stat64 fileStat;
- // Stat returns 0 for success.
- wchar_t *pwpath = (wchar_t*)OVR_ALLOC((UTF8Util::GetLength(path.ToCStr())+1)*sizeof(wchar_t));
- UTF8Util::DecodeString(pwpath, path.ToCStr());
-
- int ret = _wstat64(pwpath, &fileStat);
- OVR_FREE(pwpath);
- if (ret) return false;
-#else
- struct stat fileStat;
- // Stat returns 0 for success.
- if (stat(path, &fileStat) != 0)
- return false;
-#endif
- pfileStat->AccessTime = fileStat.st_atime;
- pfileStat->ModifyTime = fileStat.st_mtime;
- pfileStat->FileSize = fileStat.st_size;
- return true;
-}
-
-} // Namespace OVR