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 ); }
unrar_err_t unrar_next( unrar_t* p ) { assert( !unrar_done( p ) ); RETURN_ERR( NONLOCAL_ERROR( p ) ); return next_( p, false ); }
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 ); }
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; }
unrar_err_t unrar_try_extract( const unrar_t* p ) { assert( !unrar_done( p ) ); return ((unrar_t*) p)->ExtractCurrentFile( true, true ); }
const unrar_info_t* unrar_info( unrar_t const* p ) { assert( !unrar_done( p ) ); return &p->info; }