141 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
// ARC.CPP
 | 
						|
//
 | 
						|
//  Source file for ArchiveLib 2.0
 | 
						|
//
 | 
						|
//  Copyright (c) Greenleaf Software, Inc. 1994-1996
 | 
						|
//  All Rights Reserved
 | 
						|
//
 | 
						|
// CONTENTS
 | 
						|
//
 | 
						|
//  ALArchive::WriteDirectory()
 | 
						|
//  ALArchiveWriteDirectory()
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
 | 
						|
#include "arclib.h"
 | 
						|
#if !defined( AL_IBM )
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALArchive::WriteDirectory()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++  C  VB  Delphi
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Writes the directory out to the archive object.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//
 | 
						|
//  int ALArchive::WriteDirectory( ALEntryList &list );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//
 | 
						|
//  int ALArchiveWriteDirectory( hALArchive this_object,
 | 
						|
//                               hALEntryList list );
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  Declare Function ALArchiveWriteDirectory Lib "AL20LW"
 | 
						|
//    (ByVal this_object&, ByVal list&) As Integer
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  function ALArchiveWriteDirectory( this_object : hALArchive;
 | 
						|
//                                    list : hALEntryList ) : Integer;
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  this_object  :  A reference or pointer to the ALArchive object that
 | 
						|
//                  is going to have its directory updated.  The C++
 | 
						|
//                  member function version gets by without a copy of
 | 
						|
//                  this_object, since it has the implicit 'this' pointer
 | 
						|
//                  to rely on.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  An archive is pretty simple.  It has a bunch of compressed objects, and
 | 
						|
//  a directory.  You can read the entire directory in an archive into an
 | 
						|
//  ALEntryList using the ReadDirectory() command.  You can then jack with
 | 
						|
//  the entries in the list as much as you want, then write the directory
 | 
						|
//  back out with a WriteDirectory() command.
 | 
						|
//
 | 
						|
//  It probably wouldn't be a good idea to change some of the items in the
 | 
						|
//  directory.  For example, the checksum of the object, it's compression
 | 
						|
//  method, and its location in the archive are all inviolate.  On the
 | 
						|
//  other hand, changing the object name, its protection, comment or
 | 
						|
//  timestamp all make sense.
 | 
						|
//
 | 
						|
//  This function is used by internal functions in the library, but you
 | 
						|
//  are welcome to use it as well.  Just be sure that the ALEntryList you
 | 
						|
//  are using is one that makes sense for your Archive.  In particular,
 | 
						|
//  you probably should have read in the ALEntryList from the archive in
 | 
						|
//  advance.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  The status of the archive.  If things are going well, this should
 | 
						|
//  be AL_SUCCESS.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : First release.  This used to be an archive
 | 
						|
//                             specific function.  Now it is done using
 | 
						|
//                             this function with a mix of virtual helpers.
 | 
						|
 | 
						|
#include "_openf.h"
 | 
						|
 | 
						|
int AL_PROTO
 | 
						|
ALArchive::WriteDirectory( ALEntryList AL_DLL_FAR &list )  /* Tag public function */
 | 
						|
{
 | 
						|
    ALOpenInputFile archive( *mpArchiveStorageObject );
 | 
						|
 | 
						|
    miCount = 0;
 | 
						|
    mpArchiveStorageObject->Seek( mlDirectoryOffset );
 | 
						|
 | 
						|
    PreWriteDir();
 | 
						|
 | 
						|
    ALEntry *job = list.GetFirstEntry();
 | 
						|
    while ( job ) {
 | 
						|
        if ( job->miMark ) {
 | 
						|
            miCount++;
 | 
						|
            if ( mfStripPathOnInsert )
 | 
						|
                job->mpStorageObject->mName.StripPath();
 | 
						|
            WriteDirEntry( *job );
 | 
						|
        }
 | 
						|
        job = job->GetNextEntry();
 | 
						|
    }
 | 
						|
    PostWriteDir();
 | 
						|
    return mStatus;
 | 
						|
}
 | 
						|
 | 
						|
#if !defined( AL_NO_C )
 | 
						|
 | 
						|
extern "C" AL_LINKAGE int AL_FUNCTION
 | 
						|
ALArchiveWriteDirectory( hALArchive this_object,  /* Tag public function */
 | 
						|
                         hALEntryList list )
 | 
						|
{
 | 
						|
    AL_ASSERT_OBJECT( this_object, ALArchive, "ALArchiveWriteDirectory" );
 | 
						|
    AL_ASSERT_OBJECT( list, ALEntryList, "ALArchiveWriteDirectory" );
 | 
						|
    return ( (ALArchive *) this_object )->WriteDirectory( *( (ALEntryList *) list ) );
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |