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;
 | |
| }
 | |
| 
 |