174 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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;
 | 
						|
}
 | 
						|
 |