campo-sirio/al/examples/ex04pm.cpp
alex 714dd74636 Archive Library versione 2.00
git-svn-id: svn://10.65.10.50/trunk@5350 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-10-09 16:09:54 +00:00

254 lines
8.2 KiB
C++
Executable File

//
// EX04PM.CPP
//
// C++/PM Example program for ArchiveLib 2.0
//
// Copyright (c) Greenleaf Software, Inc. 1994 - 1996
// All Rights Reserved
//
// MEMBERS/FUNCTIONS DEMONSTRATED
//
// ALStorage::~ALStorage()
// ALStorage::Compare()
// ALStorage::Delete()
// ALFile::ALFile()
// ALFile::~ALFile()
// ALMemory::ALMemory()
// ALArchiveBase::Extract()
// ALArchive::ALArchive()
// ALName::GetSafeName()
//
// DESCRIPTION
//
//
// EX04PM.CPP demonstrates ALMemory::ALMemory(). It lets you
// compress selected input files to a memory archive. It then turns around
// and decompresses the objects to a new memory files, then compares the
// contents of the two.
//
// This is a very simple PM program. It works by creating a modeless
// dialog box, then wrapping a framing window around it. By using a framing
// window as the main window we are able to handle accelerator keys, menus,
// and icons a bit easier. Because of this approach, main() and
// MainDialogProc() are not very exciting, and have been moved down to the
// bottom of the file. MainDialogProc() does handle menus and accelerator
// keys, so it comes first.
//
// REVISION HISTORY
//
// February 1, 1996 2.0A : Second release
//
#define INCL_WIN
#define INCL_WINDIALOGS
#define INCL_WINPOINTERS
#include <os2.h>
#include <stdio.h>
#include "ex04pm.h"
#include "arclib.h"
#include "pkarc.h"
#include "glarc.h"
#include "pmmon.h"
#include "wildcard.h"
#include "memstore.h"
#include "filestor.h"
ALStorage *pObject = 0;
MRESULT EXPENTRY AboutBoxDialogProc( HWND hwndDlg, ULONG msg, MPARAM mp1, MPARAM mp2 )
{
switch ( msg ) {
case WM_INITDLG :
TrimSystemMenu( hwndDlg );
CenterWindow( hwndDlg );
break;
default :
return WinDefDlgProc( hwndDlg, msg, mp1, mp2 );
}
return (MRESULT) FALSE;
}
void ReadDir( HWND hwnd, int id )
{
ALWildCardExpander e( "*.*" );
char *p = e.GetNextFile();
while ( p ) {
WinSendDlgItemMsg( hwnd, id, LM_INSERTITEM, MPFROMSHORT( LIT_SORTASCENDING ), MPFROMP( (PSZ) p ) );
p = e.GetNextFile();
}
}
void CompressFiles( HWND hDlg, int list_box )
{
//
// The first section of this routine is pretty similar to lots of other
// example programs, both under Windows and DOS. We create a new archive
// using an ALMemory object as the base, then create a list with elements
// picked out from a list box, then insert them into an archive.
//
ALOs2Message monitor( AL_MONITOR_OBJECTS,
WinWindowFromID( hDlg, AL_PROGRESS_TEXT ),
AL_SEND_RATIO,
WinWindowFromID( hDlg, AL_PROGRESS_NUMBER ) );
pObject = new ALMemory( "archive in RAM" );
if ( !pObject )
return;
#if defined( ZIP )
ALPkArchive archive( *pObject );
ALEntryList list( &monitor, PkTools() ); //Deliberately use default engine
#else
ALGlArchive archive( *pObject );
ALEntryList list( &monitor, GlTools() );
#endif
list.MakeEntriesFromListBox( hDlg, list_box );
archive.Create( list );
if ( pObject->mStatus < 0 ) {
delete pObject;
pObject = 0;
WinMessageBox( HWND_DESKTOP,
hDlg,
"Error creating archive",
"EX04PM",
0,
MB_ICONEXCLAMATION );
return;
}
//
// Here I modify the job list so that the archive data records will
// be extracted to memory objects instead of file objects. Then I
// execute the extract function, creating a scad of new ALMemory
// objects. At this point, the only way I have of getting to those
// memory objects is by way of the list, so I have to hang on to it.
// But I'm done with the archive, so I can delete it.
//
for ( ALEntry *job = list.GetFirstEntry();
job != 0;
job = job->GetNextEntry() ) {
ALName temp = job->mpStorageObject->mName;
delete job->mpStorageObject;
job->mpStorageObject = new ALMemory( temp );
}
archive.Extract( list );
if ( archive.mStatus < 0 ) {
delete pObject;
pObject = 0;
WinMessageBox( HWND_DESKTOP,
hDlg,
archive.mStatus.GetStatusDetail(),
"Error extracting from archive",
0,
MB_ICONEXCLAMATION );
return;
}
pObject->Delete();
delete pObject;
pObject = 0;
//
// Now I iterate through the list. For every entry in the list, I compare
// the memory object with the original ALFile object. note that I am
// using a monitor object to track the progress of the comparison. This
// is kind of a tricky bit. Anyway, I do the compare and print the
// results.
//
for ( job = list.GetFirstEntry();
job != 0;
job = job->GetNextEntry() )
{
pObject = new ALFile( job->mpStorageObject->mName );
char buf[ 128 ];
sprintf( buf,
"Comparing %s",
job->mpStorageObject->mName.GetSafeName() );
WinSetDlgItemText( hDlg, AL_PROGRESS_TEXT, buf );
pObject->mpMonitor = &monitor;
//
// Since I am monitoring objects, I need to set up these two data members in
// the monitor if I expect it to work properly.
//
pObject->mpMonitor->mlObjectSize = -1;
pObject->mpMonitor->mlObjectStart = 0;
int result = pObject->Compare( *job->mpStorageObject );
if ( result != AL_SUCCESS )
WinSetDlgItemText( hDlg, AL_PROGRESS_TEXT, "Failure!" );
if ( pObject->mStatus < 0 ) {
delete pObject;
pObject = 0;
return;
} else {
delete pObject;
pObject = 0;
WinSetDlgItemText( hDlg, AL_PROGRESS_TEXT, "Success!" );
}
}
}
MRESULT EXPENTRY MainDialogProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
{
switch ( msg ) {
case WM_INITDLG :
WinSetDlgItemText( hwnd, AL_PROGRESS_TEXT, "" );
ReadDir( hwnd, AL_FILES );
break;
case WM_COMMAND :
switch ( LOUSHORT( mp1 ) ) {
case AL_ABORT :
if ( pObject )
pObject->mStatus.SetError(
AL_USER_ABORT,
"User pressed abort key" );
break;
case AL_CYCLE :
CompressFiles( hwnd, AL_FILES );
break;
case AL_ABOUT :
WinDlgBox( HWND_DESKTOP,
hwnd,
AboutBoxDialogProc,
NULLHANDLE,
AL_ABOUT_DIALOG,
0 );
break;
case AL_EXIT :
WinPostMsg( hwnd, WM_QUIT, 0, 0 );
return FALSE;
}
break;
case WM_CLOSE :
WinPostMsg( hwnd, WM_QUIT, 0, 0 );
return FALSE;
default :
return WinDefDlgProc( hwnd, msg, mp1, mp2 );
}
return (MRESULT) FALSE;
}
int main()
{
HAB hab;
HMQ hmq;
HWND hwndDlg;
QMSG qmsg;
HPOINTER hIcon;
hab = WinInitialize( 0 );
hmq = WinCreateMsgQueue( hab, 0 );
hIcon = WinLoadPointer( HWND_DESKTOP, 0, AL_ICON );
hwndDlg = WinLoadDlg( HWND_DESKTOP, /* parent */
HWND_DESKTOP, /* owner */
MainDialogProc, /* dialog window proc */
0, /* module handle */
AL_MAIN_DIALOG, /* dialog template ID */
0 ); /* No application data */
WinSendMsg( hwndDlg, WM_SETICON, (MPARAM) hIcon, 0 );
CenterWindow( hwndDlg );
if ( hwndDlg )
while ( WinGetMsg( hab, &qmsg, NULLHANDLE, 0, 0 ) )
WinDispatchMsg( hab, &qmsg );
WinDestroyWindow( hwndDlg );
WinDestroyMsgQueue( hmq );
WinTerminate( hab );
return 0;
}