575 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			575 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //
 | |
| // SIMPLEWD.CPP
 | |
| //
 | |
| //  Source file for ArchiveLib 2.0
 | |
| //
 | |
| //  Copyright (c) Greenleaf Software, Inc. 1994-1996
 | |
| //  All Rights Reserved
 | |
| //
 | |
| // CONTENTS
 | |
| //
 | |
| //  _UpdateEntry()
 | |
| //  ALSetName()
 | |
| //  ALSetComment()
 | |
| //  ALWriteDir()
 | |
| //  ALWriteDirEntryVB()
 | |
| //  ALWriteDirEntryDelphi()
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  These functions are used collectively to support the simplified
 | |
| //  interface write directory functions.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New Release
 | |
| //
 | |
| 
 | |
| #include "arclib.h"
 | |
| #if !defined( AL_IBM )
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include "filestor.h"
 | |
| #include "copyengn.h"
 | |
| #include "pkarc.h"
 | |
| #include "pkengn.h"
 | |
| #include "alsimple.h"
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  _UpdateEntry()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  A helper function used by ALWriteDir().
 | |
| //
 | |
| // C/C++ SYNOPSIS
 | |
| //
 | |
| //  #include "alsimple.h"
 | |
| //
 | |
| //  void _UpdateEntry( ALEntry *entry,
 | |
| //                     ALZipDir *z )
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  Not used.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  Not used.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  entry         :  A pointer to an ALEntry object.  The contents
 | |
| //                   of the ALZipDir entry are going to be inserted
 | |
| //                   into this entry.
 | |
| //
 | |
| //  z             :  A pointer to an ALZipDir entry.  The contents of
 | |
| //                   this entry are going to be reformatted and
 | |
| //                   stuffed into the ALEntry object.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  The ALWriteDir function has to take an ALZipDir array and convert it
 | |
| //  to an ALEntryList object in order to write the directory out to a
 | |
| //  zip file.  This is a helper function that helps accomplish that.
 | |
| //
 | |
| //  The work is pretty mundane, it's broken out like this to help
 | |
| //  cut things down to size.  See ALWriteDir for details on what part
 | |
| //  of the job is handled in its routine, and what stuff gets handed
 | |
| //  off to do here.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New Release
 | |
| //
 | |
| 
 | |
| void AL_FUNCTION _UpdateEntry( ALEntry AL_DLL_FAR *entry, /* Tag private function */
 | |
|                                ALZipDir AL_DLL_FAR *z )
 | |
| {
 | |
|         entry->mszComment = new char[ strlen( z->comment ) + 1 ];
 | |
|         if ( entry->mszComment )
 | |
|             strcpy( entry->mszComment, z->comment );
 | |
|         entry->mlCompressedSize = z->compressed_size;
 | |
|         entry->mlCompressedObjectPosition = z->compressed_position;
 | |
|         entry->mlCrc32 = z->crc;
 | |
|         entry->miMark = z->mark;
 | |
|         entry->mpStorageObject->mlSize = z->size;
 | |
|         struct tm tblock;
 | |
|         tblock.tm_mon   = z->month - 1;
 | |
|         tblock.tm_mday  = z->date;
 | |
|         tblock.tm_year  = z->year - 1900;
 | |
|         tblock.tm_hour  = z->hour;
 | |
|         tblock.tm_min   = z->minute;
 | |
|         tblock.tm_sec   = z->second;
 | |
|         short int atts = 0;
 | |
|         if ( z->r )
 | |
|             atts |= ATTR_READ_ONLY;
 | |
|         if ( z->a )
 | |
|             atts |= ATTR_ARCHIVE;
 | |
|         if ( z->s )
 | |
|             atts |= ATTR_SYSTEM;
 | |
|         if ( z->h )
 | |
|             atts |= ATTR_HIDDEN;
 | |
|         if ( z->d )
 | |
|             atts |= ATTR_DIRECTORY;
 | |
|         entry->mpStorageObject->mAttributes.SetFromPackedAttributes( atts );
 | |
|         entry->mpStorageObject->mTimeDate.SetTimeDate( &tblock );
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALSetName()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  A function that updates the file name in an ALZipDir entry.
 | |
| //
 | |
| // C/C++ SYNOPSIS
 | |
| //
 | |
| //  #include "alsimple.h"
 | |
| //
 | |
| //  void ALSetName( ALZipDir *z, char *name )
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  Not used.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  Not used.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  z             :  A pointer to an ALZipDir entry.  The contents of
 | |
| //                   the filename member are going to be updated.
 | |
| //
 | |
| //  name          :  The new name for the entry.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  The name and comment members of the ALZipDir array are dynamically
 | |
| //  allocated.  To prevent those nasty DLL/EXE problems with memory
 | |
| //  allocation, we create this routine.  It takes care of the memory
 | |
| //  allocation/freeing business.  The old name is deleted from the
 | |
| //  ALZipDir entry, then new space is allocate for the new name, and a
 | |
| //  point to it is stuffed into the entry.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New Release
 | |
| //
 | |
| 
 | |
| extern "C" AL_LINKAGE
 | |
| void AL_FUNCTION ALSetName( ALZipDir AL_DLL_FAR *z,
 | |
|                             char AL_DLL_FAR *name )
 | |
| {
 | |
|     if ( z->name )
 | |
|         delete[] z->name;
 | |
|     z->name = new char[ strlen( name ) + 1 ];
 | |
|     if ( z->name )
 | |
|         strcpy( z->name, name );
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALSetComment()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  A function that updates the file comment in an ALZipDir entry.
 | |
| //
 | |
| // C/C++ SYNOPSIS
 | |
| //
 | |
| //  #include "alsimple.h"
 | |
| //
 | |
| //  void ALSetComment( ALZipDir *z, char *comment )
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  Not used.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  Not used.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  z             :  A pointer to an ALZipDir entry.  The contents of
 | |
| //                   the comment member are going to be updated.
 | |
| //
 | |
| //  name          :  The new comment for the entry.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  The name and comment members of the ALZipDir array are dynamically
 | |
| //  allocated.  To prevent those nasty DLL/EXE problems with memory
 | |
| //  allocation, we created this routine.  It takes care of the memory
 | |
| //  allocation/freeing business.  The old comment is deleted from the
 | |
| //  ALZipDir entry, then new space is allocate for the new comment, and a
 | |
| //  pointer to it is stuffed into the entry.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New Release
 | |
| //
 | |
| 
 | |
| extern "C" AL_LINKAGE
 | |
| void AL_FUNCTION ALSetComment( ALZipDir AL_DLL_FAR *z,
 | |
|                                char AL_DLL_FAR *comment )
 | |
| {
 | |
|     if ( z->comment )
 | |
|         delete[] z->comment;
 | |
|     z->comment = new char[ strlen( comment ) + 1 ];
 | |
|     if ( z->comment )
 | |
|         strcpy( z->comment, comment );
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALWriteDir()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  This function writes an ALZipDir array out to a ZIP file.
 | |
| //
 | |
| // C/C++ SYNOPSIS
 | |
| //
 | |
| //  #include "alsimple.h"
 | |
| //
 | |
| //  int ALWriteDir( ALZipDir AL_DLL_FAR *z )
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  See arclib.bas for the VB implementation.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  See arclib.pas for the Delphi implementation.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  z             :  A pointer to an ALZipDir array.  The contents of
 | |
| //                   this array are going to be written out to the
 | |
| //                   ZIP file, completely replacing its present directory.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This function writes a new directory out to a ZIP file.  This is
 | |
| //  a reasonable thing to do if read in the directory from the same
 | |
| //  ZIP file, and have udpated some file names, comments, permission
 | |
| //  bits, etc.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  A standard ArchiveLib return, AL_SUCCESS if things went well, and
 | |
| //  something < 0 if things went bad.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New Release
 | |
| //
 | |
| 
 | |
| extern "C"
 | |
| AL_LINKAGE int AL_FUNCTION ALWriteDir( ALZipDir AL_DLL_FAR *z )
 | |
| {
 | |
|     int i;
 | |
|     for ( i = 0 ; z[ i ].size != -1L ; i++ )
 | |
|         ;
 | |
| #if defined( AL_LARGE_DATA )
 | |
|     ALPkArchive *arc = (ALPkArchive *) z[ i ].compressed_size;
 | |
| #else
 | |
|     ALPkArchive *arc = (ALPkArchive *) (int) z[ i ].compressed_size;
 | |
| #endif
 | |
|     ALEntryList list;
 | |
| //
 | |
| // This loop is building the new elements of the ALEntryList, one
 | |
| // at a time. We take care of creating the compressor and ALFile
 | |
| // object here, and leave the rest of the stuff up to the _UpdateEntry()
 | |
| // function.
 | |
| //
 | |
|     while ( z->size != -1L ) {
 | |
|         ALCompressor *c;
 | |
|         if ( z->level == 0 )
 | |
|             c = new ALCopyCompressor;
 | |
|         else {
 | |
|             ALPkCompressor * p = new ALPkCompressor;
 | |
|             p->option = (ALPkCompressor::_option) ( z->level - 1 );
 | |
|             c = p;
 | |
|         }
 | |
|         ALEntry *entry;
 | |
|         entry = new ALEntry( list,
 | |
|                              new ALFile( z->name ),
 | |
|                              c,
 | |
|                              0 );
 | |
|         _UpdateEntry( entry, z );
 | |
|         z++;
 | |
|     }
 | |
|     arc->SetComment( z->comment );
 | |
|     return arc->WriteDirectory( list );
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALWriteDirEntryVB()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  VB
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  This is a helper function for the VB version of ALWriteDir.
 | |
| //
 | |
| // C/C++ SYNOPSIS
 | |
| //
 | |
| //  #include "alsimple.h"
 | |
| //
 | |
| //  void ALWriteDirEntryVB( ALZipDir *z,
 | |
| //                          char *name,
 | |
| //                          char *comment,
 | |
| //                          ALEntryList *list )
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  Declare Sub ALWriteDirEntryVB Lib "AL20LWD" ( z As ALZipDir,
 | |
| //                                                ByVal filename$,
 | |
| //                                                ByVal comment$,
 | |
| //                                                ByVal list& )
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  See arclib.pas for the Delphi implementation.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  z             :  A pointer to an ALZipDir array entry.  This
 | |
| //                   function is going to add a new entry to the
 | |
| //                   ALEntryList using the data in this entry.
 | |
| //
 | |
| //  filename      :  VB passes the filename as a parameter so the
 | |
| //                   C++ code doesn't have to interpret it as an
 | |
| //                   entry in the ALZipDir array.  This is strictly
 | |
| //                   a convenience for this internal function.
 | |
| //
 | |
| //  comment       :  The file comment is passed as a parameter for
 | |
| //                   the same reason.
 | |
| //
 | |
| //  list          :  A pointer to an ALEntryList object.  The VB version
 | |
| //                   of ALWriteDir() is going to build up a complete
 | |
| //                   copy of the ALZipDir in this list, then write
 | |
| //                   it out using ALArchive::WriteDirectory().
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  VB has its own version of ALWriteDir().  That routine creates an
 | |
| //  ALEntryList on its own, then writes it out to the Zip file using
 | |
| //  the WriteDirectory() function.  Building the list is done one
 | |
| //  entry at a time by calling this function.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New Release
 | |
| //
 | |
| 
 | |
| #if defined( AL_VB ) || defined( AL_VB32 )
 | |
| 
 | |
| extern "C"
 | |
| AL_LINKAGE void AL_FUNCTION ALWriteDirEntryVB( ALZipDir AL_DLL_FAR *z,
 | |
|                                                char AL_DLL_FAR *name,
 | |
|                                                char AL_DLL_FAR *comment,
 | |
|                                                ALEntryList AL_DLL_FAR *list )
 | |
| {
 | |
|     ALCompressor *c;
 | |
|     ALDecompressor *d;
 | |
|     if ( z->level == 0 ) {
 | |
|         c = new ALCopyCompressor;
 | |
|         d = new ALCopyDecompressor;
 | |
|     } else {
 | |
|         ALPkCompressor * p = new ALPkCompressor;
 | |
|         p->option = (ALPkCompressor::_option) ( z->level - 1 );
 | |
|         c = p;
 | |
|         d = new ALPkDecompressor;
 | |
|     }
 | |
|     ALEntry *entry;
 | |
|     char *p1;
 | |
|     if ( name )
 | |
|         p1 = name;
 | |
|     else
 | |
|         p1 = "";
 | |
|     entry = new ALEntry( *list,
 | |
|                          new ALFile( p1 ),
 | |
|                          c,
 | |
|                          d );
 | |
|     char AL_DLL_FAR *temp = z->comment;
 | |
|     if ( comment )
 | |
|         z->comment = comment;
 | |
|     else
 | |
|         z->comment = "";
 | |
|     _UpdateEntry( entry, z );
 | |
|     z->comment = temp;
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALWriteDirEntryDelphi()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  Delphi
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  This is a helper function for the Delphi version of ALWriteDir.
 | |
| //
 | |
| // C/C++ SYNOPSIS
 | |
| //
 | |
| //  #include "alsimple.h"
 | |
| //
 | |
| //  void ALWriteDirEntryDelphi( ALZipDir *z,
 | |
| //                              ALEntryList *list )
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  procedure ALWriteDirEntryDelphi( z : ALZipDirEntry;
 | |
| //                                   list : hALEntryList );
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  z             :  A pointer to an ALZipDir array entry.  This
 | |
| //                   function is going to add a new entry to the
 | |
| //                   ALEntryList using the data in this entry.
 | |
| //
 | |
| //  list          :  A pointer to an ALEntryList object.  The Delphi version
 | |
| //                   of ALWriteDir() is going to build up a complete
 | |
| //                   copy of the ALZipDir in this list, then write
 | |
| //                   it out using ALArchive::WriteDirectory().
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  Delphi has its own version of ALWriteDir().  That routine creates an
 | |
| //  ALEntryList on its own, then writes it out to the Zip file using
 | |
| //  the WriteDirectory() function.  Building the list is done one
 | |
| //  entry at a time by calling this function.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New Release
 | |
| //
 | |
| #include <stdio.h>
 | |
| 
 | |
| extern "C"
 | |
| AL_LINKAGE void AL_FUNCTION ALWriteDirEntryDelphi( char AL_DLL_FAR *z_dummy,
 | |
|                                                    ALEntryList AL_DLL_FAR *list )
 | |
| {
 | |
|     z_dummy += 4;  // The Delphi structure isn't exactly the same size!!!
 | |
|     ALZipDir *z = (ALZipDir *) z_dummy;
 | |
|     ALCompressor *c;
 | |
|     ALDecompressor *d;
 | |
|     if ( z->level == 0 ) {
 | |
|         c = new ALCopyCompressor;
 | |
|         d = new ALCopyDecompressor;
 | |
|     } else {
 | |
|         ALPkCompressor * p = new ALPkCompressor;
 | |
|         p->option = (ALPkCompressor::_option) ( z->level - 1 );
 | |
|         c = p;
 | |
|         d = new ALPkDecompressor;
 | |
|     }
 | |
|     ALEntry *entry;
 | |
|     char *p1;
 | |
|     if ( z->name )
 | |
|         p1 = z->name ;
 | |
|     else
 | |
|         p1 = "";
 | |
|     entry = new ALEntry( *list,
 | |
|                          new ALFile( p1 ),
 | |
|                          c,
 | |
|                          d );
 | |
|     char AL_DLL_FAR *temp = z->comment;
 | |
|     if ( !z->comment )
 | |
|         z->comment = "";
 | |
|     _UpdateEntry( entry, z );
 | |
|     z->comment = temp;
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 |