227 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * ARCHIVEB.H
 | |
|  *
 | |
|  *  Header file for ArchiveLib 1.0
 | |
|  *
 | |
|  *  Copyright (c) 1994 Greenleaf Software, Inc.
 | |
|  *  All Rights Reserved
 | |
|  *
 | |
|  * DESCRIPTION
 | |
|  *
 | |
|  *  This header file contains the class definition for class
 | |
|  *  ALArchiveBase.
 | |
|  * 
 | |
|  * CLASS DEFINITIONS:
 | |
|  *
 | |
|  *  ALArchiveBase 
 | |
|  *
 | |
|  * REVISION HISTORY
 | |
|  *
 | |
|  *  May 26, 1994  1.0A  : First release
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef _ARCHIVEB_H
 | |
| #define _ARCHIVEB_H
 | |
| 
 | |
| #if defined( __cplusplus )
 | |
| /*
 | |
|  * class ALArchiveBase
 | |
|  *
 | |
|  * DESCRIPTION
 | |
|  *
 | |
|  * This is the most important class definition in the library.
 | |
|  * ALArchiveBase defines the interface to archive objects, on disk,
 | |
|  * memory, or whatever.  This class is a pure base class, so you
 | |
|  * won't ever create an instance of an ALArchiveBase object.
 | |
|  *
 | |
|  * The derived class for a given archive type has several very important
 | |
|  * virtual functions it has to provide.  The most important two are
 | |
|  * CreateCompressionEngine() and CreateStorageObject().  These
 | |
|  * two functions are called when the directory is being read from 
 | |
|  * a given archive.  In the directory, the type of a storage object
 | |
|  * and the compression engine used to create it are defined as just
 | |
|  * plain integers.  Somewhere, somebody has to look at these integers
 | |
|  * and create real objects based on their contents, and then maybe
 | |
|  * perform some initialization as well.
 | |
|  *
 | |
|  * At first glance it might seem like there is no reason the base class
 | |
|  * shouldn't just do all this work itself.  However, there is a good reason
 | |
|  * not to do it this way.  If the base class is designed to be a completely
 | |
|  * general purpose class, it would need to know how to create a Greenleaf
 | |
|  * compression engine, a Microsoft compression engine, and so on.  It
 | |
|  * would also need to know how to create all different kinds of storage
 | |
|  * objects, probably including our demo storage objects.  This would mean
 | |
|  * that the base ALArchiveBase class would basically have to link in our
 | |
|  * entire library.  What is worse, if someone created a lean and mean
 | |
|  * derived class that only supported one storage type and one compression
 | |
|  * engine, they would still have to link in all that other code because
 | |
|  * it was referenced in the base class.
 | |
|  *
 | |
|  * So the compromise is the current hierarchy.  We have a base class that
 | |
|  * has no links to any engines or storage objects.  A user can derive
 | |
|  * a lean and mean class from the base class and not have to worry as much
 | |
|  * about code bloat.  On the other hand, we have a relatively full
 | |
|  * featured derived class one level down, called ALArchive.  It
 | |
|  * has the built in links to the "ordinary" object types.  This way, you
 | |
|  * have a ready-built class that will do lots of ordinary jobs without a
 | |
|  * lot of fuss.
 | |
|  *
 | |
|  * DATA MEMBERS
 | |
|  *
 | |
|  *  mpArchiveStorageObject   : Pointer to the Archive's storage object.
 | |
|  *                             This is the ALFile, or whatever, that
 | |
|  *                             actually contains (or will contain) the
 | |
|  *                             archive.
 | |
|  *
 | |
|  *  mszComment               : The comment associated with this archive.
 | |
|  *                             This comment is stored on disk along with
 | |
|  *                             the archive directory.
 | |
|  *
 | |
|  *  mlDirectoryOffset        : The offset in the storage object to the
 | |
|  *                             archive's directory.  All of the compressed
 | |
|  *                             objects in the archive are stored sequentially
 | |
|  *                             at the start of the file.  The directory
 | |
|  *                             and other information starts after all of
 | |
|  *                             the objects.  This data member tells us
 | |
|  *                             how to get there.  Not filled in until
 | |
|  *                             an archive has actually been created.
 | |
|  *
 | |
|  *  miVersion                : The archive version.  This version field
 | |
|  *                             refers to the format version of the archive,
 | |
|  *                             which won't necessarily be the save as 
 | |
|  *                             the format of ArchiveLib.
 | |
|  *
 | |
|  *  miDeleteStorageObject    : If this flag is set, the storage object
 | |
|  *                             associated with the archive object will
 | |
|  *                             have its object destroyed in the 
 | |
|  *                             archive destructor.  This saves you
 | |
|  *                             from having to do the job explicitly
 | |
|  *                             in your code.
 | |
|  *
 | |
|  *  mStatus                  : The only public data member, this is a
 | |
|  *                             standard ArchiveLib status object.
 | |
|  *
 | |
|  *
 | |
|  * MEMBER FUNCTIONS
 | |
|  *
 | |
|  *  ALArchiveBase()              : The only constructor.
 | |
|  *  ~ALArchiveBase()             : The virtual destructor.
 | |
|  *  operator new()               : Memory allocation operator used when
 | |
|  *                                 the library is in a DLL
 | |
|  *  AddJobs()                    : Protected function used to create
 | |
|  *  CopyJobs()                   : Protected function used to create
 | |
|  *  AddDirectoryEntries()        : Protected function used to create, append
 | |
|  *  CalculateJobSize()           : Protected function to help monitor 
 | |
|  *  CalculateCompressedJobSize() : Protected function to help monitor
 | |
|  *  ScanStatus()                 : Protected function to update status
 | |
|  *  CreateCompressionEngine()    : Virtual fn used when extracting
 | |
|  *  CreateStorageObject()        : Virtual fn used when extracting
 | |
|  *  WriteArchiveData()           : Protected fn to write part of directory
 | |
|  *  ReadArchiveData()            : Protected fn to read part of directory
 | |
|  *  Create(ALEntryList&)         : Create a new archive
 | |
|  *  Create(ALArchiveBase&,       : Create a new archive from another
 | |
|  *         ALEntryList&)
 | |
|  *  Append(ALEntryList&)         : Add objects to archive
 | |
|  *  Append(ALArchiveBase&,       : Add objects to archive from another one
 | |
|  *         ALEntryList&)
 | |
|  *  Extract()                    : Extract objects from an archive
 | |
|  *  Delete()                     : Delete objects from an archive
 | |
|  *  GetComment()                 : Get the comment stored in the archive
 | |
|  *  SetComment()                 : Set the comment that will be stored
 | |
|  *  ReadDirectory()              : Read the directory into an ALEntryList
 | |
|  *  WriteDirectory()             : Write the directory back out.
 | |
|  *  GetVersion()                 : Get the archive's version
 | |
|  *  GetStorageObject()           : Get pointer to the archive's storage object
 | |
|  *  FillListBox()                : Fill a list box with the archive's entries
 | |
|  *  
 | |
|  * REVISION HISTORY
 | |
|  *
 | |
|  *  May 26, 1994  1.0A  : First release
 | |
|  *
 | |
|  */
 | |
| 
 | |
| class AL_CLASS_TYPE ALArchiveBase {
 | |
| /*
 | |
|  * Constructors, destructors, declarations, and friends
 | |
|  */
 | |
|     protected :
 | |
|     public :
 | |
|         AL_PROTO ALArchiveBase( ALStorage AL_DLL_FAR *, short int delete_in_dtor );
 | |
|         virtual AL_PROTO ~ALArchiveBase();
 | |
| #if defined( AL_USING_DLL ) || defined( AL_BUILDING_DLL )
 | |
|         void AL_DLL_FAR * AL_PROTO operator new( size_t size );
 | |
| #endif
 | |
| 
 | |
| /* The copy constructor and assignment operator do not exist. */
 | |
|     protected :
 | |
|         AL_PROTO ALArchiveBase( const ALArchiveBase AL_DLL_FAR & );
 | |
|         ALArchiveBase AL_DLL_FAR & AL_PROTO operator=( ALArchiveBase AL_DLL_FAR &rhs );
 | |
| 
 | |
| /*
 | |
|  * Member functions
 | |
|  *
 | |
|  *
 | |
|  * Used internally, not for public access
 | |
|  */
 | |
|     private :
 | |
|         int AL_PROTO AddJobs( ALEntryList AL_DLL_FAR & list );
 | |
|         int AL_PROTO CopyJobs( ALArchiveBase AL_DLL_FAR & source_archive,
 | |
|                                  ALEntryList AL_DLL_FAR & list );
 | |
|         int AL_PROTO AddDirectoryEntries( ALEntryList AL_DLL_FAR &list );
 | |
|         long AL_PROTO CalculateJobSize( ALEntryList AL_DLL_FAR &list );
 | |
|         long AL_PROTO CalculateCompressedJobSize( ALEntryList AL_DLL_FAR &list );
 | |
|         void AL_PROTO ScanStatus( ALEntryList AL_DLL_FAR &list );
 | |
| /*
 | |
|  * This batch of functions are the ones that have to be created by a derived
 | |
|  * class.  The first four are simple U/I functions that are normally used
 | |
|  * to print stuff on the screen when starting or finishing a compression
 | |
|  * or extraction.  The final two provide the very important function of
 | |
|  * binding compression engines and object types to the archive.
 | |
|  */
 | |
|     protected :
 | |
|         virtual ALCompressionEngine AL_DLL_FAR * AL_PROTO CreateCompressionEngine( int engine_type ) = 0;
 | |
|         virtual ALStorage AL_DLL_FAR * AL_PROTO CreateStorageObject( const char AL_DLL_FAR *name, int object_type ) = 0;
 | |
|         virtual int AL_PROTO WriteArchiveData();
 | |
|         virtual int AL_PROTO ReadArchiveData();
 | |
| /*
 | |
|  * These functions provide the public API to an archive
 | |
|  */
 | |
|     public :
 | |
|         int AL_PROTO Create( ALEntryList AL_DLL_FAR &list );
 | |
|         int AL_PROTO Create( ALArchiveBase AL_DLL_FAR &source_archive,
 | |
|                                ALEntryList AL_DLL_FAR &source_list );
 | |
|         int AL_PROTO Append( ALEntryList AL_DLL_FAR &list );
 | |
|         int AL_PROTO Append( ALArchiveBase AL_DLL_FAR &source_archive,
 | |
|                                 ALEntryList AL_DLL_FAR &source_list );
 | |
|         int AL_PROTO Extract( ALEntryList AL_DLL_FAR &list );
 | |
|         int AL_PROTO Delete( ALEntryList AL_DLL_FAR &list,
 | |
|                                ALArchiveBase AL_DLL_FAR & destination_archive );
 | |
|         const char AL_DLL_FAR * AL_PROTO GetComment(){ return mszComment; }
 | |
|         int AL_PROTO SetComment( char AL_DLL_FAR *comment );
 | |
|         int AL_PROTO ReadDirectory( ALEntryList AL_DLL_FAR &list );
 | |
|         int AL_PROTO WriteDirectory( ALEntryList AL_DLL_FAR &list );
 | |
|         short AL_PROTO GetVersion(){ return miVersion; }
 | |
|         ALStorage AL_DLL_FAR *GetStorageObject(){ return mpArchiveStorageObject; }
 | |
| #if defined( AL_WINDOWS_GUI )
 | |
|         int AL_PROTO FillListBox( HWND hWnd, int list_box_id = -1 );
 | |
| #endif
 | |
| /*
 | |
|  * Data members
 | |
|  */
 | |
|     protected :
 | |
|         ALStorage AL_DLL_FAR *mpArchiveStorageObject;
 | |
|         char AL_DLL_FAR *mszComment;
 | |
|         long mlDirectoryOffset;
 | |
|         short miVersion;
 | |
|         const short int miDeleteStorageObject;
 | |
| 
 | |
|     public :
 | |
|         ALStatus mStatus;
 | |
|         AL_CLASS_TAG( _ALArchiveBaseTag );
 | |
| };
 | |
| 
 | |
| #endif /* #if defined( __cplusplus ) */
 | |
| 
 | |
| #endif /* #ifndef _ARCHIVEB_H         */
 |