392 lines
8.8 KiB
C++
392 lines
8.8 KiB
C++
|
//
|
||
|
// ENGN.CPP
|
||
|
//
|
||
|
// Source file for ArchiveLib 2.0
|
||
|
//
|
||
|
// Copyright (c) Greenleaf Software, Inc. 1994-1996
|
||
|
// All Rights Reserved
|
||
|
//
|
||
|
// CONTENTS
|
||
|
//
|
||
|
// ALEngine::operator new()
|
||
|
// ALEngine::ALEngine()
|
||
|
// ALEngine::WriteEngineData()
|
||
|
// ALEngine::ReadEngineData()
|
||
|
// ALEngine::~ALEngine()
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// This file contains functions from the base class of ALEngine.
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New release
|
||
|
//
|
||
|
|
||
|
#include "arclib.h"
|
||
|
#if !defined( AL_IBM )
|
||
|
#pragma hdrstop
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALEngine::operator new()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// Memory allocator used when ArchiveLib resides in a 16 bit DLL.
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "arclib.h"
|
||
|
//
|
||
|
// void * ALEngine::operator new( size_t size )
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// size : The number of bytes that the compiler has decided will be
|
||
|
// necessary to construct a new ALEngine object.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// When using a DLL, it is easy to get into 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.
|
||
|
//
|
||
|
// Incidentally, I suspect that this function never gets called. If an
|
||
|
// object of a derived archive class is being created, it should use
|
||
|
// its own new operator, rendering this one useless.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// A pointer to some memory that should have been pulled out of the
|
||
|
// heap for the DLL.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New release
|
||
|
|
||
|
#if defined( AL_BUILDING_DLL )
|
||
|
void AL_DLL_FAR * AL_PROTO
|
||
|
ALEngine::operator new( size_t size ) /* Tag internal function */
|
||
|
{
|
||
|
return ::new char[ size ];
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALEngine::ALEngine()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// Constructor for the base class ALEngine
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "arclib.h"
|
||
|
//
|
||
|
// ALEngine::ALEngine( 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
|
||
|
//
|
||
|
// ALEngine is a base class that is a parent to both ALCompressor and
|
||
|
// ALDecompressor. It is really not much of a class, and only exists for
|
||
|
// as a placeholder for a couple of data members (initialized in the ctor),
|
||
|
// and a couple of virtual functions. Since this class has a couple of
|
||
|
// pure virtual functions, you can't invoke it directly. It gets called
|
||
|
// as part of the construction of the derived classes.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// Nothing.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New release
|
||
|
//
|
||
|
|
||
|
AL_PROTO
|
||
|
ALEngine::ALEngine( ALCompressionType compression_type_int, /* Tag public function */
|
||
|
const char AL_DLL_FAR *compression_type_string )
|
||
|
: miCompressionType( compression_type_int ),
|
||
|
mszCompressionType( compression_type_string )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALEngine::WriteEngineData()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// Writes out private engine data.
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "arclib.h"
|
||
|
//
|
||
|
// int ALEngine::WriteEngineData( ALStorage * archive );
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// archive : A pointer to the storage object that is usually the target of
|
||
|
// the compression. This doesn't have to be an archive,
|
||
|
// so maybe the parameter has a bad name. You could just
|
||
|
// as easily be writing this out to an ALCompressedObject,
|
||
|
// or even a raw binary compressed file.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// Compression engines can write private data out to the archive
|
||
|
// directory to provide customization information. For example, the
|
||
|
// Greenleaf compression engine writes its compression level
|
||
|
// using this function. By default, there is no data, which is what
|
||
|
// this function writes out, a 0 length string.
|
||
|
//
|
||
|
// Any engine that doesn't have any customized data that needs to be
|
||
|
// stored can just use the default version of this function right here.
|
||
|
//
|
||
|
// 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
|
||
|
ALEngine::WriteEngineData( ALStorage AL_DLL_FAR * archive ) /* Tag protected function */
|
||
|
{
|
||
|
return archive->WriteGlShort( 0 );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALEngine::ReadEngineData()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// Read the customized engine data from a storage object.
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "arclib.h"
|
||
|
//
|
||
|
// int ALEngine::ReadEngineData( ALStorage * archive )
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// archive : A pointer to the storage object that is usually the source of
|
||
|
// the decompression. This doesn't have to be an archive,
|
||
|
// so maybe the parameter has a bad name. You could just
|
||
|
// as easily be reading this in from an ALCompressedObject,
|
||
|
// or even a raw binary compressed file.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// Compression engines can write private data out to the archive
|
||
|
// directory to provide customization information. For example, the
|
||
|
// Greenleaf compression engine reads its compression level
|
||
|
// using this function. By default, no data is read in. This
|
||
|
// function expects to find a zero length string, and complains
|
||
|
// with a fatal error if it doesn't.
|
||
|
//
|
||
|
// Any engine that doesn't have any customized data that needs to be
|
||
|
// stored can just use the default version of this function right here.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// AL_SUCCESS, or < AL_SUCCESS if something bad happened.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New release
|
||
|
//
|
||
|
|
||
|
int AL_PROTO
|
||
|
ALEngine::ReadEngineData( ALStorage AL_DLL_FAR * archive ) /* Tag protected function */
|
||
|
{
|
||
|
short temp;
|
||
|
int status = archive->ReadGlShort( temp );
|
||
|
AL_ASSERT( temp == 0, "ReadEngineData: engine data not 0 length" );
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALEngine::~ALEngine()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// The destructor for ALEngine.
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "arclib.h"
|
||
|
//
|
||
|
// ALEngine::~ALEngine()
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// This virtual destructor has virtually nothing to do. At least in
|
||
|
// the debug version of the library it checks the type of this.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// Nothing.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New release
|
||
|
//
|
||
|
|
||
|
AL_PROTO
|
||
|
ALEngine::~ALEngine() /* Tag public function */
|
||
|
{
|
||
|
AL_ASSERT( GoodTag(), "~ALEngine: attempt to delete invalid object" );
|
||
|
}
|
||
|
|