151 lines
4.4 KiB
C++
Executable File
151 lines
4.4 KiB
C++
Executable File
//
|
|
// ARCCJ.CPP
|
|
//
|
|
// Source file for ArchiveLib 2.0
|
|
//
|
|
// Copyright (c) Greenleaf Software, Inc. 1994-1996
|
|
// All Rights Reserved
|
|
//
|
|
// CONTENTS
|
|
//
|
|
// ALArchive::CompressJobs()
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This is an internal archiving routine.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release
|
|
|
|
#include "arclib.h"
|
|
#if !defined( AL_IBM )
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALArchive::CompressJobs()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Compress an entire batch of input files into the Archive storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALArchive::CompressJobs( ALEntryList &list )
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// None.
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// None.
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// None.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// list : This is an ALEntryList that refers to a batch of storage
|
|
// objects and compression engines. The objects are inserted,
|
|
// one by one, into the mpStorage object of this, using the
|
|
// compression engine supplied for each.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// When Append() or Create() is called to shove a bunch of storage
|
|
// objects into an archive, they call this routine to do the
|
|
// easy part, which is compressing the data into the output. All
|
|
// we have to do here is iterate through the input list, compressing
|
|
// all the marked jobs, and updating the various stats for each job
|
|
// in the entry list, such as compressed size, offset, crc, and so on.
|
|
//
|
|
// This isn't a virtual function, so it has to be universal enough to
|
|
// work on both PK and GL archives. It handles the differences between
|
|
// the two mostly by using the PreCreate() and PostCreate() virtual
|
|
// functions before and after each job gets stuffed.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// An ArchiveLib status code, hopefully AL_SUCCESS. Note that if any
|
|
// of the objects has a failure, we can pick that up later, when we
|
|
// scan all the input jobs..
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release
|
|
//
|
|
|
|
int AL_PROTO
|
|
ALArchive::CompressJobs( ALEntryList AL_DLL_FAR &list ) /* Tag protected function */
|
|
{
|
|
list.mrMonitor.mlObjectStart = 0L; // This will be true for all input jobs
|
|
//
|
|
// This loop iterates through all of the entries in the list, picking off
|
|
// only the marked entries.
|
|
//
|
|
ALEntry *job = list.GetFirstEntry();
|
|
while ( job ) {
|
|
if ( job->miMark ) {
|
|
//
|
|
// We need to keep track of the position in the archive where the compressed
|
|
// data is going to go.
|
|
//
|
|
miCount++;
|
|
job->mlCompressedObjectPosition = mpArchiveStorageObject->Tell();
|
|
//
|
|
// Attach the monitor to the storage object that is going to be inserted
|
|
// in the archive.
|
|
//
|
|
list.mrMonitor.ArchiveOperation( AL_INSERTION_OPEN, this, job );
|
|
list.mrMonitor.mlObjectSize = -1L; // This means we ask for it in ALMonitor, after the object is opened
|
|
job->mpStorageObject->mpMonitor = &list.mrMonitor;
|
|
//
|
|
// Compress the object into the archive. Then store the resulting CRC
|
|
// the compressed size in the ALEntry object.
|
|
//
|
|
if ( job->mpCompressor == 0 )
|
|
return mStatus.SetError( AL_CANT_CREATE_ENGINE,
|
|
"No compression engine for storage object" );
|
|
if ( job->mpStorageObject == 0 )
|
|
return mStatus.SetError( AL_CANT_CREATE_STORAGE_OBJECT,
|
|
"No storage object for compression engine" );
|
|
PreCompress( *job );
|
|
job->mpCompressor->Compress( *job->mpStorageObject,
|
|
*mpArchiveStorageObject );
|
|
job->mlCrc32 = job->mpStorageObject->GetCrc32();
|
|
job->mpStorageObject->mpMonitor = 0;
|
|
if ( job->mpCompressor->mStatus < 0 )
|
|
return mStatus = job->mpCompressor->mStatus;
|
|
job->mlCompressedSize = mpArchiveStorageObject->Tell() -
|
|
job->mlCompressedObjectPosition;
|
|
PostCompress( *job );
|
|
//
|
|
// Update the monitor
|
|
//
|
|
list.mrMonitor.mlJobSoFar += job->mpStorageObject->GetSize();
|
|
list.mrMonitor.ArchiveOperation( AL_INSERTION_CLOSE, this, job );
|
|
}
|
|
job = job->GetNextEntry();
|
|
if ( mStatus < 0 )
|
|
break;
|
|
}
|
|
return mStatus;
|
|
}
|
|
|