714dd74636
git-svn-id: svn://10.65.10.50/trunk@5350 c028cbd2-c16b-5b4b-a496-9718f37d4682
348 lines
9.3 KiB
C++
Executable File
348 lines
9.3 KiB
C++
Executable File
//
|
|
// SIMPLERD.CPP
|
|
//
|
|
// Source file for ArchiveLib 2.0
|
|
//
|
|
// Copyright (c) Greenleaf Software, Inc. 1994-1996
|
|
// All Rights Reserved
|
|
//
|
|
// CONTENTS
|
|
//
|
|
// ALFreeDir()
|
|
// ALReadDir()
|
|
// ALReadDirEntryVB()
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// These functions are used collectively to support the simplified
|
|
// interface read 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 <string.h>
|
|
#include "pkarc.h"
|
|
#include "pkengn.h"
|
|
#include "alsimple.h"
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALFreeDir()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// The simplified interface function frees the memory allocated for
|
|
// an ALZipDir.
|
|
//
|
|
// C/C++ SYNOPSIS
|
|
//
|
|
// #include "alsimple.h"
|
|
//
|
|
// void ALFreeDir( ALZipDir *z )
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// See arclib.bas for the equivalent VB function.
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// See arclib.pas for the equivalent Delphi function.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// z : The ALZipDir array. This is the array you will have
|
|
// have read in using ALReadDir().
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// Any time you read in the directory from a PKZIP file using ALReadDir(),
|
|
// you must eventually delete it using this function. It takes care of
|
|
// freeing up the space used by the array itself, by the file names, the
|
|
// file comments, the archive comment, and the archive object itself.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// Nothing.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New Release
|
|
//
|
|
|
|
extern "C" AL_LINKAGE
|
|
void AL_FUNCTION ALFreeDir( ALZipDir AL_DLL_FAR *z )
|
|
{
|
|
int i;
|
|
for ( i = 0 ; ; i++ ) {
|
|
if ( z[ i ].comment )
|
|
delete[] z[ i ].comment;
|
|
delete[] z[ i ].name;
|
|
if ( z[ i ].size == -1L )
|
|
break;
|
|
}
|
|
#if defined( AL_LARGE_DATA )
|
|
ALPkArchive *p = (ALPkArchive *) z[ i ].compressed_size;
|
|
#else
|
|
ALPkArchive *p = (ALPkArchive *) (int) z[ i ].compressed_size;
|
|
#endif
|
|
delete p;
|
|
|
|
delete[] z;
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALReadDir()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// The simplified interface function reads in the directory of a ZIP file.
|
|
//
|
|
// C/C++ SYNOPSIS
|
|
//
|
|
// #include "alsimple.h"
|
|
//
|
|
// ALZipDir * ALReadDir( char *filename,
|
|
// int *count,
|
|
// int *error )
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// See arclib.bas for the equivalent VB function.
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// See arclib.pas for the equivalent Delphi function.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// filename : The name of the zip archive whose directory
|
|
// you want to read.
|
|
//
|
|
// count : A pointer to an integer that is going to
|
|
// receive the count of items in the directory.
|
|
//
|
|
// error : A pointer to an integer that is going to
|
|
// receive the status from the ALReadDir operation.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This function reads in the directory information from a ZIP
|
|
// file, then takes each entry and inserts it into an ALZipDir array.
|
|
// This means it has to take each record and reformat the data so
|
|
// that it fits in this fixed array.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// The pointer to an ALZipDir array. If a memory allocation failure
|
|
// occurs, you just get a 0 back. This function also returns the
|
|
// count and error information as described above.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New Release
|
|
//
|
|
|
|
extern "C" AL_LINKAGE
|
|
ALZipDir AL_DLL_FAR * AL_FUNCTION
|
|
ALReadDir( char AL_DLL_FAR *filename,
|
|
int AL_DLL_FAR *count,
|
|
int AL_DLL_FAR *error )
|
|
{
|
|
ALPkArchive *arc = new ALPkArchive( filename );
|
|
ALEntryList list( 0, PkTools() );
|
|
ALEntry *entry;
|
|
int dummy;
|
|
|
|
if ( !error )
|
|
error = &dummy;
|
|
*error = arc->ReadDirectory( list );
|
|
|
|
if ( *error != AL_SUCCESS )
|
|
return 0;
|
|
if ( !count )
|
|
count = &dummy;
|
|
*count = 0;
|
|
for ( entry = list.GetFirstEntry();
|
|
entry;
|
|
entry = entry->GetNextEntry() )
|
|
*count = *count + 1;
|
|
ALZipDir *ALZip = new ALZipDir[ *count + 1 ];
|
|
if ( !ALZip )
|
|
return 0;
|
|
int i = 0;
|
|
for ( entry = list.GetFirstEntry();
|
|
entry;
|
|
entry = entry->GetNextEntry() ) {
|
|
ALZip[ i ].name = new char[ strlen( entry->mpStorageObject->mName ) + 1 ];
|
|
if ( ALZip[ i ].name )
|
|
strcpy( ALZip[ i ].name, entry->mpStorageObject->mName );
|
|
const char *p = entry->GetComment();
|
|
if ( !p )
|
|
p = "";
|
|
ALZip[ i ].comment = new char[ strlen( p ) + 1 ];
|
|
if ( ALZip[ i ].comment )
|
|
strcpy( ALZip[ i ].comment, p );
|
|
ALZip[ i ].compressed_size = entry->GetCompressedSize();
|
|
ALZip[ i ].compressed_position = entry->GetCompressedObjectPosition();
|
|
ALZip[ i ].size = entry->mpStorageObject->GetSize();
|
|
ALZip[ i ].crc = entry->GetCrc32();
|
|
ALZip[ i ].mark = 1;
|
|
struct tm tblock;
|
|
entry->mpStorageObject->mTimeDate.GetTimeDate( &tblock );
|
|
ALZip[ i ].month = (short int) ( tblock.tm_mon + 1 );
|
|
ALZip[ i ].date = (short int) tblock.tm_mday;
|
|
ALZip[ i ].year = (short int)( tblock.tm_year + 1900 );
|
|
ALZip[ i ].hour = (short int) tblock.tm_hour;
|
|
ALZip[ i ].minute = (short int) tblock.tm_min;
|
|
ALZip[ i ].second = (short int) tblock.tm_sec;
|
|
ALZip[ i ].r = (unsigned char) entry->mpStorageObject->mAttributes.ReadOnly();
|
|
ALZip[ i ].a = (unsigned char) entry->mpStorageObject->mAttributes.Archive();
|
|
ALZip[ i ].s = (unsigned char) entry->mpStorageObject->mAttributes.System();
|
|
ALZip[ i ].h = (unsigned char) entry->mpStorageObject->mAttributes.Hidden();
|
|
ALZip[ i ].d = (unsigned char) entry->mpStorageObject->mAttributes.Directory();
|
|
if ( entry->mpCompressor->miCompressionType == AL_COMPRESSION_COPY )
|
|
ALZip[ i ]. level = 0;
|
|
else
|
|
ALZip[ i ].level = (unsigned char) (((ALPkCompressor *)(entry->mpCompressor))->option + 1);
|
|
i++;
|
|
}
|
|
ALZip[ i ].name = new char[ strlen( filename ) + 1 ];
|
|
if ( ALZip[ i ].name )
|
|
strcpy( ALZip[ i ].name, filename );
|
|
const char *p = arc->GetComment();
|
|
if ( p == 0 )
|
|
p = "";
|
|
ALZip[ i ].comment = new char[ strlen( p ) + 1 ];
|
|
if ( ALZip[ i ].comment )
|
|
strcpy( ALZip[ i ].comment, p );
|
|
ALZip[ i ].size = -1L;
|
|
//
|
|
// Here's the cute part!
|
|
//
|
|
#if defined( AL_LARGE_DATA )
|
|
ALZip[ i ].compressed_size = (long) arc;
|
|
#else
|
|
ALZip[ i ].compressed_size = (int) arc;
|
|
#endif
|
|
return ALZip;
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALReadDirEntryVB()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Windows
|
|
// VB
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// This is a helper routine called by the VB version of ALReadDir.
|
|
//
|
|
// C/C++ SYNOPSIS
|
|
//
|
|
// #include "alsimple.h"
|
|
//
|
|
// void ALReadDirEntryVB( ALZipDir *z,
|
|
// ALEntry *entry)
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Sub ALReadDirEntryVB Lib "AL20LWD" ( z As ALZipDir,
|
|
// ByVal entry& )
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// None.
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// z : A pointer to an entry in an ALZipDir array.
|
|
//
|
|
// entry : A pointer to an ALEntry object. This ALEntry
|
|
// object is going to have its information reformatted
|
|
// and stuffed into the ALZipDir array.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// When reading in the directory information, VB goes through entry
|
|
// by entry, using this function to take the ALEntry data and stuffing
|
|
// into the ALZipDir entry.
|
|
//
|
|
// 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 ALReadDirEntryVB( ALZipDir AL_DLL_FAR *z,
|
|
ALEntry AL_DLL_FAR *entry)
|
|
{
|
|
z->compressed_size = entry->GetCompressedSize();
|
|
z->compressed_position = entry->GetCompressedObjectPosition();
|
|
z->size = entry->mpStorageObject->GetSize();
|
|
z->crc = entry->GetCrc32();
|
|
z->mark = 1;
|
|
struct tm tblock;
|
|
entry->mpStorageObject->mTimeDate.GetTimeDate( &tblock );
|
|
z->month = (short int) ( tblock.tm_mon + 1 );
|
|
z->date = (short int) tblock.tm_mday;
|
|
z->year = (short int)( tblock.tm_year + 1900 );
|
|
z->hour = (short int) tblock.tm_hour;
|
|
z->minute = (short int) tblock.tm_min;
|
|
z->second = (short int) tblock.tm_sec;
|
|
z->r = (unsigned char) entry->mpStorageObject->mAttributes.ReadOnly();
|
|
z->a = (unsigned char) entry->mpStorageObject->mAttributes.Archive();
|
|
z->s = (unsigned char) entry->mpStorageObject->mAttributes.System();
|
|
z->h = (unsigned char) entry->mpStorageObject->mAttributes.Hidden();
|
|
z->d = (unsigned char) entry->mpStorageObject->mAttributes.Directory();
|
|
if ( entry->mpCompressor->miCompressionType == AL_COMPRESSION_COPY )
|
|
z->level = 0;
|
|
else
|
|
z->level = (unsigned char) (((ALPkCompressor *)(entry->mpCompressor))->option + 1);
|
|
}
|
|
|
|
#endif
|
|
|