You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.4 KiB
110 lines
2.4 KiB
4 years ago
|
#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
|