// // COMPRESS.CPP // // Source file for ArchiveLib 2.0 // // Copyright (c) Greenleaf Software, Inc. 1994-1996 // All Rights Reserved // // CONTENTS // // ALCompressor::operator new() // ALCompressor::ALCompressor() // ALCompressor::~ALCompressor() // deleteALCompressor() // ALCompress() // // DESCRIPTION // // This file contains the base class functions for the class ALCompress(). // // REVISION HISTORY // // February 14, 1996 2.0A : New release #include "arclib.h" #if !defined( AL_IBM ) #pragma hdrstop #endif // // NAME // // ALCompressor::operator new() // // PLATFORMS/ENVIRONMENTS // // Windows // C++ // // SHORT DESCRIPTION // // Memory allocation operator needed with DLL. // // C++ SYNOPSIS // // #include "arclib.h" // // void * ALCompressor::operator new( size_t size ) // // C SYNOPSIS // // None. // // VB SYNOPSIS // // None. // // DELPHI SYNOPSIS // // None. // // ARGUMENTS // // size : The number of bytes needed to create a new ALCompressor object. // // DESCRIPTION // // When using a DLL, it is easy to create a dangerous situation when // creating objects whose ctor and dtor are both in the DLL. The problem // arises because when you create an object using new, the memory for // the object will be allocated from the EXE. However, when you destroy // the object using delete, the memory is freed inside the DLL. Since // the DLL doesn't really own that memory, bad things can happen. // // But, you say, won't the space just go back to the Windows heap regardless // of who tries to free it? Maybe, but maybe not. If the DLL is using // a subsegment allocation scheme, it might do some sort of local free // before returning the space to the windows heap. That is the point where // you could conceivably cook your heap. // // 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 newly allocated storage area, or 0 if no storage // was available. // // EXAMPLE // // None. // // SEE ALSO // // REVISION HISTORY // // May 23, 1994 1.0A : First release // // February 14, 1996 2.0A : New release #if defined( AL_BUILDING_DLL ) void AL_DLL_FAR * AL_PROTO ALCompressor::operator new( size_t size ) /* Tag internal function */ { return ::new char[ size ]; } #endif // // NAME // // ALCompressor::ALCompressor() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ // // SHORT DESCRIPTION // // Construct a compressor object. // // C++ SYNOPSIS // // #include "arclib.h" // // ALCompressor::ALCompressor( ALCompressionType compression_type_int, // const char *compression_type_string ); // // C SYNOPSIS // // None. // // VB SYNOPSIS // // None. // // DELPHI SYNOPSIS // // None. // // ARGUMENTS // // compression_type_int : An integer used to indicate the compression // type. This needs to be selected from the // enumerated type defined in ALDEFS.H. This // value is usually what gets stored in an // archive to indicate what compression type was // used. // // compression_type_string : A pointer to a C-style string describing the // type of compression. This isn't used in // any algorithms, it's on hand as a U/I aid. // // DESCRIPTION // // This is the base class constructor for Compressor objects. Since this // class has a pure virtual function, you aren't going to be able to // call this guy directly. Instead, it is called from the constructor // for guys such as ALGlCompressor and ALPkCompressor. // // All we do here is init a couple of common members, and invoke the // constructor for the absolute base class, ALEngine. // // RETURNS // // Nothing. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release AL_PROTO ALCompressor::ALCompressor( ALCompressionType compression_type_int, /* Tag public function */ const char AL_DLL_FAR *compression_type_string ) : ALEngine( compression_type_int, compression_type_string ) { } // // NAME // // ALCompressor::~ALCompressor() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ C VB Delphi // // SHORT DESCRIPTION // // The ALCompressor destructor. // // C++ SYNOPSIS // // #include "arclib.h" // // ALCompressor::~ALCompressor(); // // C SYNOPSIS // // void deleteALCompressor( hALCompressor this_object ); // // VB SYNOPSIS // // Declare Sub deleteALCompressor Lib "AL20LW" (ByVal this_object&) // // DELPHI SYNOPSIS // // procedure deleteALCompressor( this_object : hALCompressor ); // // ARGUMENTS // // None. // // DESCRIPTION // // This destructor will be called as the derived class is destroyed, such // as ALPkCompressor or ALGlCompressor. It doesn't have to do anything, so // conceivably this function could just be eliminated, and we could use // the compiler-generated one. But, I guess we just don't like to leave // anything up to chance. // // RETURNS // // Nothing. // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release AL_PROTO ALCompressor::~ALCompressor() /* Tag public function */ { } #if !defined( AL_NO_C ) extern "C" AL_LINKAGE void AL_FUNCTION deleteALCompressor( hALCompressor this_object ) /* Tag public function */ { AL_ASSERT_OBJECT( this_object, ALCompressor, "deleteALCompressor()" ); delete (ALCompressor *) this_object; } #endif // // NAME // // ALCompressor::Compress() // // PLATFORMS/ENVIRONMENTS // // Console Windows PM // C++ C VB Delphi // // SHORT DESCRIPTION // // Compress from an input object to an output object. // // C++ SYNOPSIS // // #include "arclib.h" // // int ALCompressor::Compress( ALStorage &input_object, // ALStorage &output_object ); // // C SYNOPSIS // // #include "arclib.h" // // int ALCompress( hALCompressor this_object, // hALStorage input, // hALStorage output ); // // VB SYNOPSIS // // Declare Function ALCompress Lib "AL20LW" // (ByVal this_object&, ByVal input&, ByVal output& ) As Integer // // DELPHI SYNOPSIS // // function ALCompress( this_object : hALCompressor; // input : hALStorage; // output : hALStorage ) : Integer; // // ARGUMENTS // // this_object : A reference or pointer to the ALCompressor object that // is going to perform the compression. Note that the C++ // version of this call doesn't have an explicit argument // here, since it has access to 'this' implicitly. // // input : A pointer or reference to the input storage object // that is going to be compressed. // // output : A pointer or reference to the output object that is // going to receive the compressed data. // // DESCRIPTION // // An ALCompressor object only knows how to do one thing, and that is // expressed by way of this function. Compress() takes an input file, // and reads until it hits an EOF. Output bytes are written to the // output object in some compressed format. The exact format is determined // by the derived class. ALCompressor is an abstract base class that // can't be instantiated by itself. // // Since the class can't be instantiated by itself, it's kind of bogus // to even suggest that ALCompressor::Compress() is a separate function, // as I have done here. In reality, the only thing that really exists // here is a C function that can be used to call the virtual function // set up by a derived class. // // RETURNS // // A success or failure code. Hopefully AL_SUCCESS, but values less // than 0 are possible (as errors.) // // EXAMPLE // // SEE ALSO // // REVISION HISTORY // // February 14, 1996 2.0A : New release #if !defined( AL_NO_C ) extern "C" AL_LINKAGE int AL_FUNCTION ALCompress( hALCompressor this_object, /* Tag public function */ hALStorage input, hALStorage output ) { AL_ASSERT_OBJECT( this_object, ALCompressor, "ALCompress" ); AL_ASSERT_OBJECT( input, ALStorage, "ALCompress" ); AL_ASSERT_OBJECT( output, ALStorage, "ALCompress" ); return ( (ALCompressor *) this_object )->Compress( *(ALStorage *) input, *(ALStorage *) output ); } #endif