diff --git a/stepmania/src/RageFileDriver.cpp b/stepmania/src/RageFileDriver.cpp index f7b0e9f4f5..7fad43e736 100644 --- a/stepmania/src/RageFileDriver.cpp +++ b/stepmania/src/RageFileDriver.cpp @@ -90,6 +90,27 @@ RageFileDriver *MakeFileDriver( CString Type, CString Root ) return NULL; } + +int RageFileObj::Seek( int iOffset ) +{ + return SeekInternal( iOffset ); +} + +int RageFileObj::Read( void *pBuffer, size_t iBytes ) +{ + return ReadInternal( pBuffer, iBytes ); +} + +int RageFileObj::Write( const void *pBuffer, size_t iBytes ) +{ + return WriteInternal( pBuffer, iBytes ); +} + +int RageFileObj::Flush() +{ + return FlushInternal(); +} + /* * Copyright (c) 2003-2004 Glenn Maynard * All rights reserved. diff --git a/stepmania/src/RageFileDriver.h b/stepmania/src/RageFileDriver.h index abddefc03d..a3f12004f0 100644 --- a/stepmania/src/RageFileDriver.h +++ b/stepmania/src/RageFileDriver.h @@ -33,24 +33,43 @@ protected: class RageFileObj { -protected: - void SetError( const CString &sErr ) { m_sError = sErr; } - CString m_sError; - public: virtual ~RageFileObj() { } - CString GetError() const { return m_sError; } + virtual CString GetError() const { return m_sError; } - virtual int Seek( int offset ) = 0; + /* Seek to the given absolute offset. Return to the position actually + * seeked to; if the position given was beyond the end of the file, the + * return value will be the size of the file. */ + int Seek( int iOffset ); + + /* Read at most iSize bytes into pBuf. Return the number of bytes read, + * 0 on end of stream, or -1 on error. Note that reading less than iSize + * does not necessarily mean that the end of the stream has been reached; + * keep reading until 0 is returned. */ + int Read( void *pBuffer, size_t iBytes ); + + /* Write iSize bytes of data from pBuf. Return 0 on success, -1 on error. */ + int Write( const void *pBuffer, size_t iBytes ); + + /* Due to buffering, writing may not happen by the end of a Write() call, so not + * all errors may be returned by it. Data will be flushed when the stream (or its + * underlying object) is destroyed, but errors can no longer be returned. Call + * Flush() to flush pending data, in order to check for errors. */ + int Flush(); + virtual int GetFileSize() = 0; virtual CString GetDisplayPath() const { return ""; } + virtual RageFileObj *Copy() const { FAIL_M( "Copying unimplemented" ); } - /* Raw I/O: */ - virtual int Read(void *buffer, size_t bytes) = 0; - virtual int Write(const void *buffer, size_t bytes) = 0; - virtual int Flush() { return 0; } - virtual RageFileObj *Copy() const = 0; +protected: + virtual int SeekInternal( int iOffset ) { FAIL_M( "Seeking unimplemented" ); } + virtual int ReadInternal( void *pBuffer, size_t iBytes ) = 0; + virtual int WriteInternal( const void *pBuffer, size_t iBytes ) = 0; + virtual int FlushInternal() { return 0; } + + virtual void SetError( const CString &sError ) { m_sError = sError; } + CString m_sError; }; /* This is used to register the driver, so RageFileManager can see it. */ diff --git a/stepmania/src/RageFileDriverDirect.cpp b/stepmania/src/RageFileDriverDirect.cpp index 7fded1270f..6d9a37ba7e 100644 --- a/stepmania/src/RageFileDriverDirect.cpp +++ b/stepmania/src/RageFileDriverDirect.cpp @@ -43,10 +43,10 @@ private: public: RageFileObjDirect( const CString &path, int fd_, int mode_ ); virtual ~RageFileObjDirect(); - virtual int Read(void *buffer, size_t bytes); - virtual int Write(const void *buffer, size_t bytes); - virtual int Flush(); - virtual int Seek( int offset ); + virtual int ReadInternal( void *pBuffer, size_t iBytes ); + virtual int WriteInternal( const void *pBuffer, size_t iBytes ); + virtual int FlushInternal(); + virtual int SeekInternal( int offset ); virtual RageFileObj *Copy() const; virtual CString GetDisplayPath() const { return path; } virtual int GetFileSize(); @@ -290,7 +290,7 @@ RageFileObjDirect::~RageFileObjDirect() } } -int RageFileObjDirect::Read( void *buf, size_t bytes ) +int RageFileObjDirect::ReadInternal( void *buf, size_t bytes ) { int ret = read( fd, buf, bytes ); if( ret == -1 ) @@ -316,7 +316,7 @@ static int retried_write( int fd, const void *buf, size_t count ) } -int RageFileObjDirect::Flush() +int RageFileObjDirect::FlushInternal() { if( !write_buf.size() ) return 0; @@ -333,7 +333,7 @@ int RageFileObjDirect::Flush() return ret; } -int RageFileObjDirect::Write( const void *buf, size_t bytes ) +int RageFileObjDirect::WriteInternal( const void *buf, size_t bytes ) { if( write_buf.size()+bytes > BUFSIZE ) { @@ -360,7 +360,7 @@ int RageFileObjDirect::Write( const void *buf, size_t bytes ) return bytes; } -int RageFileObjDirect::Seek( int offset ) +int RageFileObjDirect::SeekInternal( int offset ) { return lseek( fd, offset, SEEK_SET ); } diff --git a/stepmania/src/RageFileDriverMemory.cpp b/stepmania/src/RageFileDriverMemory.cpp index 4c5ac6ca3b..1ffba908cc 100644 --- a/stepmania/src/RageFileDriverMemory.cpp +++ b/stepmania/src/RageFileDriverMemory.cpp @@ -44,7 +44,7 @@ public: delete m_pFile; } - int Read( void *buffer, size_t bytes ) + int ReadInternal( void *buffer, size_t bytes ) { m_pFile->m_Mutex.Lock(); @@ -57,7 +57,7 @@ public: return bytes; } - int Write( const void *buffer, size_t bytes ) + int WriteInternal( const void *buffer, size_t bytes ) { m_pFile->m_Mutex.Lock(); m_pFile->m_sBuf.append( (const char *) buffer, bytes ); @@ -67,7 +67,7 @@ public: return bytes; } - int Seek( int offset ) + int SeekInternal( int offset ) { m_iFilePos = clamp( offset, 0, GetFileSize() ); return m_iFilePos; diff --git a/stepmania/src/RageFileDriverZip.cpp b/stepmania/src/RageFileDriverZip.cpp index d24a666cf6..670f81f1c7 100644 --- a/stepmania/src/RageFileDriverZip.cpp +++ b/stepmania/src/RageFileDriverZip.cpp @@ -81,9 +81,9 @@ public: RageFileObjZipDeflated( const RageFile &f, const FileInfo &info ); RageFileObjZipDeflated( const RageFileObjZipDeflated &cpy ); ~RageFileObjZipDeflated(); - int Read(void *buffer, size_t bytes); - int Write(const void *buffer, size_t bytes) { SetError( "Not implemented" ); return -1; } - int Seek( int offset ); + int ReadInternal( void *pBuffer, size_t iBytes ); + int WriteInternal( const void *pBuffer, size_t iBytes ) { SetError( "Not implemented" ); return -1; } + int SeekInternal( int iOffset ); int GetFileSize() { return info.uncompr_size; } RageFileObj *Copy() const { @@ -102,10 +102,10 @@ private: public: RageFileObjZipStored( const RageFile &f, const FileInfo &info ); - int Read(void *buffer, size_t bytes); - int Write(const void *buffer, size_t bytes) { SetError( "Not implemented" ); return -1; } + int ReadInternal( void *pBuffer, size_t iBytes ); + int WriteInternal( const void *pBuffer, size_t iBytes ) { SetError( "Not implemented" ); return -1; } - int Seek( int offset ); + int SeekInternal( int iOffset ); int GetFileSize() { return info.uncompr_size; } RageFileObj *Copy() const @@ -499,7 +499,7 @@ RageFileObjZipDeflated::~RageFileObjZipDeflated() LOG->Trace( "Huh? inflateEnd() err = %i", err ); } -int RageFileObjZipDeflated::Read( void *buf, size_t bytes ) +int RageFileObjZipDeflated::ReadInternal( void *buf, size_t bytes ) { bool done=false; int ret = 0; @@ -560,7 +560,7 @@ int RageFileObjZipDeflated::Read( void *buf, size_t bytes ) return ret; } -int RageFileObjZipDeflated::Seek( int iPos ) +int RageFileObjZipDeflated::SeekInternal( int iPos ) { /* Optimization: if offset is the end of the file, it's a lseek(0,SEEK_END). Don't * decode anything. */ @@ -612,7 +612,7 @@ RageFileObjZipStored::RageFileObjZipStored( const RageFile &f, const FileInfo &i FilePos = 0; } -int RageFileObjZipStored::Read( void *buf, size_t bytes ) +int RageFileObjZipStored::ReadInternal( void *buf, size_t bytes ) { const int bytes_left = info.compr_size-this->FilePos; const int got = zip.Read( buf, min( (int) bytes, bytes_left ) ); @@ -628,7 +628,7 @@ int RageFileObjZipStored::Read( void *buf, size_t bytes ) } -int RageFileObjZipStored::Seek( int offset ) +int RageFileObjZipStored::SeekInternal( int offset ) { ASSERT( offset >= 0 ); offset = min( (unsigned) offset, info.compr_size );