// // SIMPEXT.CPP // // Source file for ArchiveLib 2.0 // // Copyright (c) Greenleaf Software, Inc. 1994-1996 // All Rights Reserved // // CONTENTS // // ALExtract() // // REVISION HISTORY // // February 14, 1996 2.0A : New Release // #include "arclib.h" #if !defined( AL_IBM ) #pragma hdrstop #endif #include "alsimple.h" #include "pkarc.h" #include "pkengn.h" #include "filestor.h" #include "copyengn.h" // // NAME // // ALExtract() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ C VB Delphi // // SHORT DESCRIPTION // // The simplified interface function to extract files from a ZIP file. // // C/C++ SYNOPSIS // // #include "alsimple.h" // // int ALExtract( ALZipDir *z, // int strip_path, // CALLBACK_FN callback ) // // VB SYNOPSIS // // See arclib.bas for the equivalent VB function. // // DELPHI SYNOPSIS // // See arclib.pas for the equivalent Delphi function. // // ARGUMENTS // // z : The ALZipDir array. This is the array you will have // have read in using ALReadDir(). Every entry in the // array that has a mark set will be extracted. // // strip_path : If this flag is set, the files that are extracted // from the archive will have their paths stripped // before the extraction takes place. // // callback : C and C++ use a callback function for monitoring. // This function gets called periodically with // file names and progress ratios. // // DESCRIPTION // // The simplified ALExtract function extracts the files you specified // in the ALZipDir array. To do this, the function has to recover // the ALArchive pointer that is stashed in the last element of the // array. Then, it builds an ALEntryList that is used to call // ALArchive::Extract(). // // RETURNS // // AL_SUCCESS if things went well, o/w an ArchiveLib error code. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New Release // extern "C" AL_LINKAGE int AL_FUNCTION ALExtract( ALZipDir AL_DLL_FAR *z, int strip_path, CALLBACK_FN callback ) { int i; for ( i = 0 ; z[ i ].size != -1L ; i++ ) ; #if defined( AL_LARGE_DATA ) ALPkArchive *arc = (ALPkArchive *) z[ i ].compressed_size; #else ALPkArchive *arc = (ALPkArchive *) (int) z[ i ].compressed_size; #endif arc->mfStripPathOnExtract = strip_path; ALSimpleMonitor monitor( callback ); ALEntryList list( &monitor ); while ( z->name ) { ALDecompressor *d; if ( z->level == 0 ) d = new ALCopyDecompressor; else d = new ALPkDecompressor; ALEntry *entry; entry = new ALEntry( list, new ALFile( z->name ), 0, d ); _UpdateEntry( entry, z ); z++; } return arc->Extract( list ); }