campo-sirio/al/cpp_all/arccpj.cpp
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

174 lines
5.3 KiB
C++
Executable File

//
// ARCPJ.CPP
//
// Source file for ArchiveLib 2.0
//
// Copyright (c) Greenleaf Software, Inc. 1994-1996
// All Rights Reserved
//
// CONTENTS
//
// ALArchive::CopyJobs()
//
// DESCRIPTION
//
// An internal support routine for ArchiveLib.
//
// REVISION HISTORY
//
// February 14, 1996 2.0A : New release
#include "arclib.h"
#if !defined( AL_IBM )
#pragma hdrstop
#endif
#include "_openf.h"
//
// NAME
//
// ALArchive::CopyJobs()
//
// PLATFORMS/ENVIRONMENTS
//
// Console Windows PM
// C++
//
// SHORT DESCRIPTION
//
// Copies an entire batch of objects from one archive to another.
//
// C++ SYNOPSIS
//
// #include "arclib.h"
//
// int ALArchive::CopyJobs( ALArchive &source_archive,
// ALEntryList &source_list );
//
// C SYNOPSIS
//
// None.
//
// VB SYNOPSIS
//
// None.
//
// DELPHI SYNOPSIS
//
// None.
//
// ARGUMENTS
//
// source_archive : This is a reference to an existing archive that holds
// a bunch of compressed objects. This function is going
// to take selected items from that archive and copy them
// into this.
//
// list : This is an ALEntryList that refers to a batch of storage
// objects found in the source_archive. They are already
// compressed, so we don't even need the engines that are
// probably in the list. What I do need is the compressed
// length and offsets of the objects.
//
// DESCRIPTION
//
// When Append() or Create() is called to copy a batch of storage
// objects from one archive to another, they call this routine to do the
// easy part, which is copying the data into the output. All
// we have to do here is iterate through the input list, copying
// all the marked jobs, and updating the various stats for each job
// in the entry list, such as the offset.
//
// 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 PreCompress() and PostCcompress() 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::CopyJobs( ALArchive AL_DLL_FAR &source_archive, /* Tag protected function */
ALEntryList AL_DLL_FAR &source_list )
{
//
// Open the storage object attached to the input archive. The storage object
// attached to this is already open.
//
ALOpenInputFile input( *(source_archive.mpArchiveStorageObject) );
//
// This loop iterates through all of the entries in the list, picking off
// only the marked entries.
//
ALEntry *job = source_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++;
source_archive.mpArchiveStorageObject->Seek( job->mlCompressedObjectPosition );
source_archive.PreCopyInput( *job );
job->mlCompressedObjectPosition = mpArchiveStorageObject->Tell();
PreCompress( *job );
//
// Attach the monitor to the storage object that is going to be inserted
// in the archive.
//
source_list.mrMonitor.mlObjectStart = source_archive.mpArchiveStorageObject->Tell();
source_list.mrMonitor.mlObjectSize = job->mlCompressedSize;
source_archive.mpArchiveStorageObject->mpMonitor = &source_list.mrMonitor;
source_list.mrMonitor.ArchiveOperation( AL_COPY_OPEN, this, job );
//
// Copy compressed data here
//
for ( long l = 0 ; l < job->mlCompressedSize; l++ ) {
int c = source_archive.mpArchiveStorageObject->ReadChar();
mpArchiveStorageObject->WriteChar( c );
}
//
// This should shoot the monitor to the end of the line
//
source_archive.mpArchiveStorageObject->YieldTime();
source_archive.mpArchiveStorageObject->mpMonitor = 0;
//
// This doesn't make any sense. How could the compression engine
// have a bad status?
//
// if ( job->mpCompressionEngine->mStatus < 0 )
// return mStatus = job->mpCompressionEngine->mStatus;
source_archive.PostCopyInput( *job );
PostCompress( *job );
//
// Update the monitor now that the copy is complete.
//
source_list.mrMonitor.ArchiveOperation( AL_COPY_CLOSE, this, job );
source_list.mrMonitor.mlJobSoFar += job->mlCompressedSize;
source_archive.mpArchiveStorageObject->mpMonitor = 0;
if ( source_archive.mpArchiveStorageObject->mStatus < 0 )
return mStatus = source_archive.mpArchiveStorageObject->mStatus;
if ( mpArchiveStorageObject->mStatus < 0 )
return mStatus = mpArchiveStorageObject->mStatus;
}
job = job->GetNextEntry();
if ( mStatus < 0 )
break;
}
return mStatus;
}