diff options
Diffstat (limited to 'libplatform/io/File_posix.cpp')
-rw-r--r-- | libplatform/io/File_posix.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/libplatform/io/File_posix.cpp b/libplatform/io/File_posix.cpp new file mode 100644 index 0000000..b6fb214 --- /dev/null +++ b/libplatform/io/File_posix.cpp @@ -0,0 +1,109 @@ +#include "libplatform/impl.h" + +namespace mp4v2 { namespace platform { namespace io { + +/////////////////////////////////////////////////////////////////////////////// + +class StandardFileProvider : public FileProvider +{ +public: + StandardFileProvider(); + + bool open( std::string name, Mode mode ); + bool seek( Size pos ); + bool read( void* buffer, Size size, Size& nin, Size maxChunkSize ); + bool write( const void* buffer, Size size, Size& nout, Size maxChunkSize ); + bool close(); + +private: + bool _seekg; + bool _seekp; + std::fstream _fstream; +}; + +/////////////////////////////////////////////////////////////////////////////// + +StandardFileProvider::StandardFileProvider() + : _seekg ( false ) + , _seekp ( false ) +{ +} + +bool +StandardFileProvider::open( std::string name, Mode mode ) +{ + ios::openmode om = ios::binary; + switch( mode ) { + case MODE_UNDEFINED: + case MODE_READ: + default: + om |= ios::in; + _seekg = true; + _seekp = false; + break; + + case MODE_MODIFY: + om |= ios::in | ios::out; + _seekg = true; + _seekp = true; + break; + + case MODE_CREATE: + om |= ios::in | ios::out | ios::trunc; + _seekg = true; + _seekp = true; + break; + } + + _fstream.open( name.c_str(), om ); + return _fstream.fail(); +} + +bool +StandardFileProvider::seek( Size pos ) +{ + if( _seekg ) + _fstream.seekg( pos, ios::beg ); + if( _seekp ) + _fstream.seekp( pos, ios::beg ); + return _fstream.fail(); +} + +bool +StandardFileProvider::read( void* buffer, Size size, Size& nin, Size maxChunkSize ) +{ + _fstream.read( (char*)buffer, size ); + if( _fstream.fail() ) + return true; + nin = _fstream.gcount(); + return false; +} + +bool +StandardFileProvider::write( const void* buffer, Size size, Size& nout, Size maxChunkSize ) +{ + _fstream.write( (const char*)buffer, size ); + if( _fstream.fail() ) + return true; + nout = size; + return false; +} + +bool +StandardFileProvider::close() +{ + _fstream.close(); + return _fstream.fail(); +} + +/////////////////////////////////////////////////////////////////////////////// + +FileProvider& +FileProvider::standard() +{ + return *new StandardFileProvider(); +} + +/////////////////////////////////////////////////////////////////////////////// + +}}} // namespace mp4v2::platform::io |