alex 714dd74636 Archive Library versione 2.00
git-svn-id: svn://10.65.10.50/trunk@5350 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-10-09 16:09:54 +00:00

392 lines
8.8 KiB
C++
Executable File

//
// 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" );
}