aboutsummaryrefslogtreecommitdiff
path: root/libplatform/io/File_posix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libplatform/io/File_posix.cpp')
-rw-r--r--libplatform/io/File_posix.cpp109
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