blob: 7d637878f9e8c52af97ee0a43bb02c2b93bad49b [file] [log] [blame] [edit]
#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:
HANDLE _handle;
};
///////////////////////////////////////////////////////////////////////////////
StandardFileProvider::StandardFileProvider()
: _handle( INVALID_HANDLE_VALUE )
{
}
bool
StandardFileProvider::open( std::string name, Mode mode )
{
DWORD access = 0;
DWORD share = 0;
DWORD crdisp = 0;
DWORD flags = FILE_ATTRIBUTE_NORMAL;
switch( mode ) {
case MODE_UNDEFINED:
case MODE_READ:
default:
access |= GENERIC_READ;
share |= FILE_SHARE_READ;
crdisp |= OPEN_EXISTING;
break;
case MODE_MODIFY:
access |= GENERIC_READ | GENERIC_WRITE;
share |= FILE_SHARE_READ;
crdisp |= OPEN_EXISTING;
break;
case MODE_CREATE:
access |= GENERIC_READ | GENERIC_WRITE;
share |= FILE_SHARE_READ;
crdisp |= CREATE_ALWAYS;
break;
}
#ifdef AMBIENT_CHAR_INSTEAD_OF_UTF8
_handle = CreateFileA( name.c_str(), access, share, NULL, crdisp, flags, NULL );
#else
wchar_t buffer[MAX_PATH + 1];
MultiByteToWideChar(CP_UTF8, 0, name.c_str(), -1, buffer, (int) MAX_PATH);
_handle = CreateFileW( buffer, access, share, NULL, crdisp, flags, NULL );
#endif
return _handle == INVALID_HANDLE_VALUE;
}
bool
StandardFileProvider::seek( Size pos )
{
LARGE_INTEGER n;
n.QuadPart = pos;
return SetFilePointerEx( _handle, n, NULL, FILE_BEGIN ) == 0;
}
bool
StandardFileProvider::read( void* buffer, Size size, Size& nin, Size maxChunkSize )
{
DWORD nread = 0;
if( ReadFile( _handle, buffer, (DWORD)size, &nread, NULL ) == 0 )
return true;
nin = nread;
return false;
}
bool
StandardFileProvider::write( const void* buffer, Size size, Size& nout, Size maxChunkSize )
{
DWORD nwrote = 0;
if( WriteFile( _handle, buffer, (DWORD)size, &nwrote, NULL ) == 0 )
return true;
nout = nwrote;
return false;
}
bool
StandardFileProvider::close()
{
return CloseHandle( _handle ) == 0;
}
///////////////////////////////////////////////////////////////////////////////
FileProvider&
FileProvider::standard()
{
return *new StandardFileProvider();
}
///////////////////////////////////////////////////////////////////////////////
}}} // namespace mp4v2::platform::io