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.

186 lines
3.6 KiB

#include "libplatform/impl.h"
namespace mp4v2 { namespace platform { namespace io {
///////////////////////////////////////////////////////////////////////////////
namespace {
const File::Size __maxChunkSize = 1024*1024;
}
///////////////////////////////////////////////////////////////////////////////
File::File( std::string name_, Mode mode_, FileProvider* provider_ )
: _name ( name_ )
, _isOpen ( false )
, _mode ( mode_ )
, _size ( 0 )
, _position ( 0 )
, _provider ( provider_ ? *provider_ : standard() )
, name ( _name )
, isOpen ( _isOpen )
, mode ( _mode )
, size ( _size )
, position ( _position )
{
}
///////////////////////////////////////////////////////////////////////////////
File::~File()
{
close();
delete &_provider;
}
///////////////////////////////////////////////////////////////////////////////
void
File::setMode( Mode mode_ )
{
_mode = mode_;
}
void
File::setName( const std::string& name_ )
{
_name = name_;
}
///////////////////////////////////////////////////////////////////////////////
bool
File::open( std::string name_, Mode mode_ )
{
if( _isOpen )
return true;
if( !name_.empty() )
setName( name_ );
if( mode_ != MODE_UNDEFINED )
setMode( mode_ );
if( _provider.open( _name, _mode ))
return true;
FileSystem::getFileSize( _name, _size );
_isOpen = true;
return false;
}
bool
File::seek( Size pos )
{
if( !_isOpen )
return true;
if( _provider.seek( pos ))
return true;
_position = pos;
return false;
}
bool
File::read( void* buffer, Size size, Size& nin, Size maxChunkSize )
{
nin = 0;
if( !_isOpen )
return true;
if( _provider.read( buffer, size, nin, maxChunkSize ))
return true;
_position += nin;
if( _position > _size )
_size = _position;
return false;
}
bool
File::write( const void* buffer, Size size, Size& nout, Size maxChunkSize )
{
nout = 0;
if( !_isOpen )
return true;
if( _provider.write( buffer, size, nout, maxChunkSize ))
return true;
_position += nout;
if( _position > _size )
_size = _position;
return false;
}
bool
File::close()
{
if( !_isOpen )
return false;
if( _provider.close() )
return true;
_isOpen = false;
return false;
}
///////////////////////////////////////////////////////////////////////////////
CustomFileProvider::CustomFileProvider( const MP4FileProvider& provider )
: _handle( NULL )
{
memcpy( &_call, &provider, sizeof(MP4FileProvider) );
}
bool
CustomFileProvider::open( std::string name, Mode mode )
{
MP4FileMode fm;
switch( mode ) {
case MODE_READ: fm = FILEMODE_READ; break;
case MODE_MODIFY: fm = FILEMODE_MODIFY; break;
case MODE_CREATE: fm = FILEMODE_CREATE; break;
case MODE_UNDEFINED:
default:
fm = FILEMODE_UNDEFINED;
break;
}
_handle = _call.open( name.c_str(), fm );
return _handle == NULL;
}
bool
CustomFileProvider::seek( Size pos )
{
return _call.seek( _handle, pos );
}
bool
CustomFileProvider::read( void* buffer, Size size, Size& nin, Size maxChunkSize )
{
return _call.read( _handle, buffer, size, &nin, maxChunkSize );
}
bool
CustomFileProvider::write( const void* buffer, Size size, Size& nout, Size maxChunkSize )
{
return _call.write( _handle, buffer, size, &nout, maxChunkSize );
}
bool
CustomFileProvider::close()
{
return _call.close( _handle );
}
///////////////////////////////////////////////////////////////////////////////
}}} // namespace mp4v2::platform::io