154 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
// EX20CON.CPP
 | 
						|
//
 | 
						|
//  C++/DOS Example program for ArchiveLib 2.0
 | 
						|
//
 | 
						|
//  Copyright (c) Greenleaf Software, Inc. 1994 - 1996
 | 
						|
//  All Rights Reserved
 | 
						|
//
 | 
						|
// MEMBERS/FUNCTIONS DEMONSTRATED
 | 
						|
//
 | 
						|
//  ALMonitor::ArchiveOperation()
 | 
						|
//  ALMonitor::Progress()
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This example program shows you a little demo of how to derive
 | 
						|
//  a new class of ALMonitor.  This monitor just prints out a byte
 | 
						|
//  count while the object progresses.  It doesn't support AL_MONITOR_JOB,
 | 
						|
//  just the mode that monitors individual objects.  But it wouldn't
 | 
						|
//  be too much more complicated if it did.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//  February 1, 1996  2.0A  : Second release
 | 
						|
//
 | 
						|
 | 
						|
#include <iostream.h>
 | 
						|
#include <conio.h>
 | 
						|
 | 
						|
#include "arclib.h"
 | 
						|
#include "pkarc.h"
 | 
						|
#include "glarc.h"
 | 
						|
 | 
						|
//
 | 
						|
// All you need to create a simple new class of ALMonitor is a new
 | 
						|
// ctor, and two member functions.  The behavior of Progress() and
 | 
						|
// ArchiveOperation() are fairly well documented, and you can see
 | 
						|
// complete working examples in our three monitor classes provided with
 | 
						|
// ArchiveLib.
 | 
						|
//
 | 
						|
class AL_CLASS_TYPE DemoMonitor: public ALMonitor {
 | 
						|
     public :
 | 
						|
          AL_INLINE_PROTO DemoMonitor() : ALMonitor( AL_MONITOR_OBJECTS ) {;}
 | 
						|
          virtual AL_INLINE_PROTO ~DemoMonitor(){;}
 | 
						|
//
 | 
						|
// I don't really need these functions, but if I don't declare them here,
 | 
						|
// gcc goes looking for them, even though it doesn't need them.
 | 
						|
//
 | 
						|
     protected :
 | 
						|
        AL_PROTO DemoMonitor( DemoMonitor AL_DLL_FAR & );
 | 
						|
        DemoMonitor AL_DLL_FAR & AL_PROTO operator=( const DemoMonitor AL_DLL_FAR & );
 | 
						|
     protected :
 | 
						|
          virtual void AL_PROTO Progress( long mlObjectSoFar,
 | 
						|
                                          ALStorage& object );
 | 
						|
          virtual void AL_PROTO
 | 
						|
          ArchiveOperation( ALArchiveOperation operation,
 | 
						|
                            ALArchive *,
 | 
						|
                            ALEntry * );
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// Unlike EX00CON.CPP and its brethren, this example insists that you
 | 
						|
// provide an archive name and a list of input files on the command
 | 
						|
// line.  It then performs a straightforward archive creation.
 | 
						|
//
 | 
						|
int main( int argc, char *argv[] )
 | 
						|
{
 | 
						|
    cout << "Archive Library 2.0\nEX20CON.CPP\n\n";
 | 
						|
    cout << "All you need to create a simple new class of ALMonitor is a new\n";
 | 
						|
    cout << "ctor, and two member functions.  The behavior of Progress() and\n";
 | 
						|
    cout << "ArchiveOperation() are fairly well documented, and you can see\n";
 | 
						|
    cout << "complete working examples in our three monitor classes provided with\n";
 | 
						|
    cout << "ArchiveLib.\n\n";
 | 
						|
    getch();
 | 
						|
 | 
						|
    if ( argc < 3 ) {
 | 
						|
        cerr << "Usage: EX20CON archive files [files...]\n";
 | 
						|
        return 1;
 | 
						|
    }
 | 
						|
    ALName archive_name = argv[ 1 ];
 | 
						|
//
 | 
						|
// Normally you wouldn't think this cast was necessary, but gcc can't
 | 
						|
// seem to figure it out.
 | 
						|
//
 | 
						|
    DemoMonitor monitor;
 | 
						|
#if defined( ZIP )
 | 
						|
    if ( strchr( archive_name, '.' ) == 0 )
 | 
						|
        archive_name = archive_name + ".zip";
 | 
						|
    ALPkArchive archive( (char *) archive_name );
 | 
						|
    ALEntryList list( &monitor, PkCompressTools() );
 | 
						|
#else
 | 
						|
    if ( strchr( archive_name, '.' ) == 0 )
 | 
						|
        archive_name = archive_name + ".gal";
 | 
						|
    ALGlArchive archive( (char *) archive_name );
 | 
						|
    ALEntryList list( &monitor );
 | 
						|
#endif
 | 
						|
    for ( int i = 2 ; argv[ i ] && strlen( argv[ i ] ) ; i++ )
 | 
						|
        list.AddWildCardFiles( argv[ i ] );
 | 
						|
//
 | 
						|
// We let the user input multiple wild-card specs, so it would be really
 | 
						|
// easy to get some duplicates in the list.  These function calls
 | 
						|
// make sure that can't happen.
 | 
						|
//
 | 
						|
    list.UnmarkDuplicates( list );
 | 
						|
    list.DeleteUnmarked();
 | 
						|
    cout << "\nList of files to be compressed: ";
 | 
						|
    for ( ALEntry *entry = list.GetFirstEntry();
 | 
						|
          entry;
 | 
						|
          entry = entry->GetNextEntry() )
 | 
						|
        cout << entry->mpStorageObject->mName << " ";
 | 
						|
    cout << "\nCompressing...\n";
 | 
						|
    archive.Create( list );
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// The progress routine prints out the current object name and size, then
 | 
						|
// does a CR with no LF.  This means it will keep overwriting the name
 | 
						|
// of the object and the size as long as the archive progresses.
 | 
						|
//
 | 
						|
void AL_PROTO DemoMonitor::Progress( long object_tell,
 | 
						|
                                     ALStorage& object )
 | 
						|
{
 | 
						|
     ALMonitor::Progress( object_tell, object );
 | 
						|
     cout << object.mName
 | 
						|
          << "  : "
 | 
						|
          << mlByteCount
 | 
						|
          << "/"
 | 
						|
          << object.GetSize()
 | 
						|
          << "\r"
 | 
						|
          << flush;
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// When we are done with an object, we print an LF, so that the last
 | 
						|
// thing printed on the line gets left there.  For this particular
 | 
						|
// class, that ought to be the object name followed by its file size.
 | 
						|
//
 | 
						|
void AL_PROTO DemoMonitor::ArchiveOperation( ALArchiveOperation operation,
 | 
						|
                                             ALArchive *,
 | 
						|
                                             ALEntry * )
 | 
						|
{
 | 
						|
    switch ( operation ) {
 | 
						|
        case AL_EXTRACTION_CLOSE :
 | 
						|
        case AL_COPY_CLOSE :
 | 
						|
        case AL_INSERTION_CLOSE :
 | 
						|
            cout << "\n";
 | 
						|
            break;
 | 
						|
        default :
 | 
						|
            break;
 | 
						|
    }
 | 
						|
    cout << flush;
 | 
						|
}
 |