예제 #1
0
파일: unrar.cpp 프로젝트: kode54/Cog
unrar_err_t unrar_extract_custom( unrar_t* p, unrar_write_func user_write, void* user_data )
{
	assert( !unrar_done( p ) );
	
	RETURN_ERR( NONLOCAL_ERROR( p ) );
	
	if ( solid_file( p ) )
	{
		unrar_pos_t pos = p->Arc.CurBlockPos;
		if ( p->solid_pos != pos )
		{
			// Next file to solid extract isn't current one
			
			if ( p->solid_pos > pos )
				RETURN_ERR( reopen( p ) );
			else
				p->Arc.NextBlockPos = p->solid_pos;
			
			RETURN_ERR( next_( p, true ) );
			
			// Keep extracting until solid position is at desired file
			while ( !p->done && p->solid_pos < pos )
			{
				RETURN_ERR( skip_solid( p ) );
				RETURN_ERR( next_( p, true ) );
			}
			
			// Be sure we're at right file
			if ( p->solid_pos != pos || p->Arc.CurBlockPos != pos )
				return unrar_err_corrupt;
		}
	}
	
	return extract_( p, user_write, user_data );
}
예제 #2
0
파일: unrar.cpp 프로젝트: kode54/Cog
unrar_err_t unrar_next( unrar_t* p )
{
	assert( !unrar_done( p ) );
	
	RETURN_ERR( NONLOCAL_ERROR( p ) );
	return next_( p, false );
}
예제 #3
0
unrar_err_t unrar_extract( unrar_t* p, void* out, unrar_pos_t size )
{
	assert( !unrar_done( p ) );
	
	unrar_extract_mem_t m;
	m.out = (char*) out;
	m.end = m.out + size;
	return unrar_extract_custom( p, &extract_write, &m );
}
예제 #4
0
unrar_err_t unrar_extract_mem( unrar_t* p, void const** out )
{
	assert( !unrar_done( p ) );
	
	*out = NULL;
	
	if ( !p->data_ )
	{
		unrar_err_t err = unrar_extract_custom( p, &extract_mem, p );
		if ( err )
			return err;
	}
	
	*out = (p->own_data_ ? p->own_data_ : p->data_);
	return unrar_ok;
}
예제 #5
0
파일: unrar.cpp 프로젝트: kode54/Cog
unrar_err_t unrar_try_extract( const unrar_t* p )
{
	assert( !unrar_done( p ) );
	
	return ((unrar_t*) p)->ExtractCurrentFile( true, true );
}
예제 #6
0
파일: unrar.cpp 프로젝트: kode54/Cog
const unrar_info_t* unrar_info( unrar_t const* p )
{
	assert( !unrar_done( p ) );
	
	return &p->info;
}