// // COPYD.CPP // // Source file for ArchiveLib 2.0 // // Copyright (c) Greenleaf Software, Inc. 1994-1996 // All Rights Reserved // // CONTENTS // // ALCopyDecompressor::operator new() // ALCopyDecompressor::ALCopyDecompressor() // newALCopyDecompressor() // ALCopyDecompressor::~ALCopyDecompressor() // ALCopyDecompressor::Decompress() // ALCopyDecompressor::Clone() // // // DESCRIPTION // // The source files needed to support the decompressor class // ALCopyDecompressor. // // REVISION HISTORY // // May 22, 1994 1.0A : First release // // February 14, 1996 2.0A : New release // #include "arclib.h" #if !defined( AL_IBM ) #pragma hdrstop #endif #include "copyengn.h" #include "_openf.h" // // NAME // // ALCopyDecompressor::operator new() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ // // SHORT DESCRIPTION // // The memory allocator used with DLL versions of ArchiveLib. // // C++ SYNOPSIS // // #include "arclib.h" // #include "copyengn.h" // // void * ALCopyDecompressor::operator new( size_t size ) // // C SYNOPSIS // // None, this is an internal C++ function. // // VB SYNOPSIS // // None, this is an internal C++ function. // // DELPHI SYNOPSIS // // None, this is an internal C++ function. // // ARGUMENTS // // size : The amount of storage that needs to be allocated for // this object. // // DESCRIPTION // // When using the DLL version of ArchiveLib, it is a good idea to // allocate the storage for objects from inside the DLL, since they // will be freed inside the DLL. If we don't have the new operator // for a class, its storage will be allocated from the EXE before // the constructor code is called. Then, when it is time to free // the storage, the delete operator will be called inside the DLL. // Not good, right? // // By providing our own version of operator new inside this class, we // ensure that all memory allocation for the class will be done from // inside the DLL, not the EXE calling the DLL. // // RETURNS // // A pointer to the storage. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release // #if defined( AL_BUILDING_DLL ) void AL_DLL_FAR * AL_PROTO ALCopyDecompressor::operator new( size_t size ) /* Tag internal function */ { return ::new char[ size ]; } #endif // // NAME // // ALCopyDecompressor::ALCopyDecompressor() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ C VB Delphi // // SHORT DESCRIPTION // // Default constructor for the copy decompression engine. // // C++ SYNOPSIS // // #include "arclib.h" // #include "copyengn.h" // // ALCopyDecompressor::ALCopyDecompressor(); // // C SYNOPSIS // // #include "arclib.h" // #include "copyengn.h" // // hALDecompressor newALCopyDecompressor(); // // VB SYNOPSIS // // Declare Function newALCopyDecompressor Lib "AL20LW" () As Long // // DELPHI SYNOPSIS // // function newALCopyDecompressor : hALDecompressor; // // ARGUMENTS // // None. // // DESCRIPTION // // This function creates a new copy decompression engine. The copy // engine is used to do simply binary copies of a compressed // object from an archive or other compressed object. Since no decompression // is actually taking place, the copy decompressor is supposed to be fast and // efficient. // // Note that under Visual Basic or C, it is up to the user to destroy // this engine by calling deleteDecompressor(). C++ users only need to // call the destructor explicitly when they have created the object // dynamically using the new operator. // // RETURNS // // The C++ function returns nothing. The C and VB functions return the // handle of the newly created decompressor. A value of 0 for this handle // means the object could not be properly created. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release AL_PROTO ALCopyDecompressor::ALCopyDecompressor() /* Tag public function */ : ALDecompressor( AL_COMPRESSION_COPY, "Binary copy" ) { } #if !defined( AL_NO_C ) extern "C" AL_LINKAGE hALDecompressor AL_FUNCTION newALCopyDecompressor() /* Tag public function */ { return (hALDecompressor) new ALCopyDecompressor(); } #endif // // NAME // // ALCopyDecompressor::~ALCopyDecompressor() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ // // SHORT DESCRIPTION // // Destructor for the copy decompression engine. // // C++ SYNOPSIS // // #include "arclib.h" // #include "copyengn.h" // // ALCopyDecompressor::~ALCopyDecompressor(); // // C SYNOPSIS // // None, see deleteDecompressor(). // // VB SYNOPSIS // // None, see deleteDecompressor(). // // DELPHI SYNOPSIS // // None, see deleteDecompressor(). // // ARGUMENTS // // None. // // DESCRIPTION // // The destructor has absolutely nothing to do. In the debug // versions of the library, the dtor checks to be sure that it // is operating on the right type of object. // // Note that more often than not, this virtual function will be // called using the base class. In fact, C/VB/Delphi users don't // even have a choice about it. // // RETURNS // // Nothing. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // May 22, 1994 1.0A : First release // // February 14, 1996 2.0A : New release AL_PROTO ALCopyDecompressor::~ALCopyDecompressor() /* Tag public function */ { AL_ASSERT( GoodTag(), "~ALCopyDecompressor: Attempt to delete invalid object" ); } // // NAME // // ALCopyDecompressor::Decompress() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ // // SHORT DESCRIPTION // // Perform a binary copy of input to output. // // C++ SYNOPSIS // // #include "arclib.h" // #include "copyengn.h" // // int ALCopyDecompressor::Decompress( ALStorage& input, // ALStorage& output ); // // C SYNOPSIS // // None, see the base class function ALDecompress(). // // VB SYNOPSIS // // None, see the base class function ALDecompress(). // // DELPHI SYNOPSIS // // None, see the base class function ALDecompress(). // // ARGUMENTS // // input : A reference to the input storage object. // // output : A reference to the output storage object. // // DESCRIPTION // // This is ostensibly a decompression engine, but really all it does // is copy input directly to the output. The most exciting thing it // does during the entire process is initialize CRC checking. // // This function will almost always be called indirectly, by means of // a virtual function call off the base class. That's why you won't // see any C, VB, or Delphi functions here. Those languages will only // be able to call the Decompress() routine by way of the base class. // // RETURNS // // AL_SUCCESS, or < AL_SUCCESS if something bad happens. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release int AL_PROTO ALCopyDecompressor::Decompress( ALStorage AL_DLL_FAR & input, /* Tag public function */ ALStorage AL_DLL_FAR & output, long length ) { ALOpenFiles files( input, output ); if ( input.mStatus < AL_SUCCESS ) return mStatus = input.mStatus; if ( output.mStatus < AL_SUCCESS ) return mStatus = output.mStatus; output.InitCrc32(); int c; // if ( length == -1 ) // return SetError( NEED_LENGTH, // "The copy engine requires a length parameter when " // "decompressing" ); for ( ; length != 0 ; length-- ) { c = input.ReadChar(); if ( c < 0 ) break; output.WriteChar( c ); } if ( input.mStatus < AL_SUCCESS ) return mStatus = input.mStatus; if ( output.mStatus < AL_SUCCESS ) return mStatus = output.mStatus; return mStatus; } // // NAME // // ALCopyDecompressor::Clone() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ // // SHORT DESCRIPTION // // Create a copy of an existing decompressor // // C++ SYNOPSIS // // #include "arclib.h" // #include "copyengn.h" // // ALCopyDecompressor::Clone( int engine_type ); // // C SYNOPSIS // // No C equivalent. // // VB SYNOPSIS // // No VB equivalent. // // DELPHI SYNOPSIS // // No Delphi equivalent. // // ARGUMENTS // // engine_type : This argument indicates what sort of engine the // caller wants to create. A value of either // AL_COMPRESSION_DEFAULT or AL_COMPRESSION_COPY will // cause this function to create a clone. Any other // value (for example, AL_DEFLATE), will return a 0, // indicating that this object doesn't know how to // perform that sort of decompression. // // DESCRIPTION // // Although this is a public function, it isn't really of any use // to end users. Clone() is a virtual function for the base class // ALDecompressor, and can be called to create a duplicate of an // existing de/compression engine. // // Why is this useful? It is useful because it allows us to use // what is the equivalent of a virtual constructor. We can pass a // pointer to a copy engine to the archiving code, and it can then in // turn stuff copies of that engine into an ALEntryList without // having any idea what sort of compression engine it is actually creating. // // RETURNS // // A copy of a newly created decompression engine. When this routine is // called, it will usually be called via a virtual function from a pointer // to a base class object, which means the resulting pointer will be // treated as an ALDecompressor * by the code. // // If this routine doesn't know how to create an engine of the correct type, // it returns a 0. When performing decompression from an archive, the // extraction code might have to call Clone() for several different engine // types until it finally finds an engine that can be cloned. The combination // of different engine types in the toolkit can all be called until a winner // is found. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release ALDecompressor AL_DLL_FAR * AL_PROTO ALCopyDecompressor::Clone( int engine_type ) const /* Tag public function */ { switch ( engine_type ) { case AL_COMPRESSION_DEFAULT : case AL_COMPRESSION_COPY : return new ALCopyDecompressor(); } return 0; }