242 lines
5.9 KiB
C++
Executable File
242 lines
5.9 KiB
C++
Executable File
//
|
|
// COPYENGN.CPP
|
|
//
|
|
// Source file for ArchiveLib 1.0
|
|
//
|
|
// Copyright (c) Greenleaf Software, Inc. 1994
|
|
// All Rights Reserved
|
|
//
|
|
// CONTENTS
|
|
//
|
|
// ALCopyEngine::operator new()
|
|
// ALCopyEngine::ALCopyEngine()
|
|
// ALCopyEngine::~ALCopyEngine()
|
|
// ALCopyEngine::Compress()
|
|
// ALCopyEngine::Decompress()
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This file contains all the source code for the class ALCopyEngine.
|
|
// The copy engine just does a straight binary copy, so it is pretty
|
|
// simple. Note that it doesn't have to overload the routines to
|
|
// read and write the engine data in the archive directory. This is
|
|
// because it has nothing to write.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// May 22, 1994 1.0A : First release
|
|
//
|
|
//
|
|
|
|
#include "arclib.h"
|
|
#pragma hdrstop
|
|
|
|
#include "copyengn.h"
|
|
#include "_openf.h"
|
|
|
|
//
|
|
// void * ALCopyEngine::operator new( size_t size )
|
|
//
|
|
// ARGUMENTS:
|
|
//
|
|
// size : The amount of storage that needs to be allocated for
|
|
// this object.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// A pointer to the storage.
|
|
//
|
|
// 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.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// May 21, 1994 1.0A : First release
|
|
//
|
|
|
|
#if defined( AL_BUILDING_DLL )
|
|
void AL_DLL_FAR * AL_PROTO ALCopyEngine::operator new( size_t size )
|
|
{
|
|
return ::new char[ size ];
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// ALCopyEngine::ALCopyEngine()
|
|
//
|
|
// ARGUMENTS:
|
|
//
|
|
// None, constructor.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// Nothing, this is a constructor.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// The copy engine doesn't have to store any data, because it just
|
|
// performs a straight binary copy, without any frills. Because of
|
|
// this simplicity, it doesn't have any data members to initialize.
|
|
// The only thing it does initialize is the base class, with the
|
|
// appropriate enum value and string identifier.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// May 22, 1994 1.0A : First release
|
|
//
|
|
|
|
AL_PROTO ALCopyEngine::ALCopyEngine()
|
|
: ALCompressionEngine( AL_COMPRESSION_COPY, "Binary copy" )
|
|
{
|
|
}
|
|
|
|
//
|
|
// ALCopyEngine::~ALCopyEngine()
|
|
//
|
|
// ARGUMENTS:
|
|
//
|
|
// None, destructor.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// Nothing, destructor.
|
|
//
|
|
// 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.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// May 22, 1994 1.0A : First release
|
|
//
|
|
|
|
AL_PROTO ALCopyEngine::~ALCopyEngine()
|
|
{
|
|
AL_ASSERT( GoodTag(), "~ALCopyEngine: Attempt to delete invalid object" );
|
|
}
|
|
|
|
//
|
|
// int ALCopyEngine::Compress( ALStorage &input, ALStorage &output )
|
|
//
|
|
// ARGUMENTS:
|
|
//
|
|
// input : A reference to the input storage object.
|
|
//
|
|
// output : A reference to the output storage object.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// AL_SUCCESS, or < AL_SUCCESS if something bad happens.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This is ostensibly a compression 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.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// May 22, 1994 1.0A : First release
|
|
//
|
|
|
|
int AL_PROTO ALCopyEngine::Compress( ALStorage AL_DLL_FAR &input,
|
|
ALStorage AL_DLL_FAR &output )
|
|
{
|
|
//
|
|
// Open the input and output files, and initialize CRC 32 checking.
|
|
//
|
|
ALOpenFiles files( input, output );
|
|
input.InitCrc32();
|
|
//
|
|
// Now read all the data from the input file, and write it to the
|
|
// output file.
|
|
//
|
|
int c;
|
|
for ( ; ; ) {
|
|
c = input.ReadChar();
|
|
if ( c < 0 )
|
|
break;
|
|
output.WriteChar( c );
|
|
}
|
|
//
|
|
// Finally, check on the error status codes, then return.
|
|
//
|
|
if ( input.mStatus < AL_SUCCESS )
|
|
return mStatus = input.mStatus;
|
|
if ( output.mStatus < AL_SUCCESS )
|
|
return mStatus = output.mStatus;
|
|
return mStatus;
|
|
}
|
|
|
|
//
|
|
// int ALCopyEngine::Decompress( ALStorage &input,
|
|
// ALStorage &output,
|
|
// long length )
|
|
//
|
|
// ARGUMENTS:
|
|
//
|
|
// input : A reference to the storage object containing the
|
|
// compressed data.
|
|
//
|
|
// output : A reference to the storage object that is going to receive
|
|
// the uncompressed data.
|
|
//
|
|
// length : The number of byte in the uncompressed image.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// AL_SUCCESS if things went properly, error code < AL_SUCCESS if
|
|
// a problem occurred.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This is a decompression routine, but really it just performs a
|
|
// straight binary copy of input to output. This is the copy engine you
|
|
// use when you just want to copy/archive files, and aren't worried
|
|
// about saving disk space.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// May 22, 1994 1.0A : First release
|
|
//
|
|
|
|
int AL_PROTO ALCopyEngine::Decompress( ALStorage AL_DLL_FAR & input,
|
|
ALStorage AL_DLL_FAR & output,
|
|
long length )
|
|
{
|
|
ALOpenFiles files( input, output );
|
|
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;
|
|
}
|
|
|
|
|