campo-sirio/al/examples/ex23pm.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

295 lines
9.4 KiB
C++
Executable File

#define INCL_WIN
#define INCL_WINDIALOGS
#define INCL_WINPOINTERS
#include <os2.h>
#include <stdio.h>
#include <string.h>
#include "ex23pm.h"
#include "arclib.h"
#include "pkengn.h"
#include "glengn.h"
#include "arclib.h"
#include "pmmon.h"
#include "wildcard.h"
#include "filestor.h"
#if !defined( BIG_BUFFER )
#define BIG_BUFFER 28672
#endif
HAB hab;
ALStorage *compressed = 0;
//
// The time class is a very modest convenience.
//
class TIME {
public :
long milliseconds;
TIME(){ milliseconds = WinGetCurrentTime( hab ); }
TIME( long t ){ milliseconds = t; }
TIME operator-(TIME &);
};
TIME TIME::operator-( TIME &rhs )
{
return TIME( milliseconds - rhs.milliseconds );
}
//
// This function takes two file sizes and returns the compression ratio
// in the standard format we expect.
//
inline int ratio( long plain, long compressed )
{
if ( plain == 0 )
return 0;
compressed *= 100;
return (int)( 100 - ( compressed / plain ) );
}
//
// This function allocates a character buffer, then prints the
// time into it. It is up to the caller to free the returned
// string.
//
char *format_time( const TIME &t )
{
long m = t.milliseconds;
int hours;
int minutes;
int seconds;
int hsecs;
char *s = new char[ 25 ];
if ( s ) {
hours = (int) ( m / ( 1000L * 60L * 60L ));
m -= hours * ( 1000L * 60L * 60L );
minutes = (int) ( m / ( 1000L * 60L ) );
m -= minutes * (1000L * 60L );
seconds = (int)( m / ( 1000L ) );
m -= seconds * 1000L;
hsecs = (int)( m / 10L );
sprintf( s, "%02d:%02d:%02d.%02d", hours, minutes, seconds, hsecs );
}
return s;
}
//
// This is the first of two possible compression functions. It is very
// much like the main loop in EX23CON.CPP. It just sets up a wild card
// expander object, then starts chunking out file names. Each time it
// gets a new file name, it compresses it, and optionally expands it.
// When the whole thing is over, the resulting stats are stuffed into
// the dialog, somewhere.
//
void Compress( HWND hDlg )
{
char input_name[ 128 ];
char buf[ 128 ];
long total_input = 0;
long total_compressed = 0;
int compress_only = (int) WinSendDlgItemMsg( hDlg,
AL_COMPRESS_ONLY,
BM_QUERYCHECK,
0,
0 );
ALOs2Message monitor( AL_MONITOR_OBJECTS,
WinWindowFromID( hDlg, AL_FILE ),
AL_SEND_BYTE_COUNT,
WinWindowFromID( hDlg, AL_BYTE_COUNT ) );
monitor.mlObjectStart = 0;
WinEnableWindow( WinWindowFromID( hDlg, AL_COMPRESS), 0 );
WinQueryDlgItemText( hDlg, AL_INPUT_FILES, 128, input_name );
ALWildCardExpander expander( input_name );
#if defined( ZIP )
ALPkCompressor compressor;
ALPkDecompressor decompressor;
#else
ALGlCompressor compressor;
ALGlDecompressor decompressor;
#endif
//
// This code clears out all the boxes on the dialog that might be left
// over from the last run of this program.
//
WinSendDlgItemMsg( hDlg, AL_RESULTS, LM_DELETEALL, 0, 0 );
WinSetDlgItemText( hDlg, AL_TOTAL_INPUT, "" );
WinSetDlgItemText( hDlg, AL_TOTAL_COMPRESSED, "" );
WinSetDlgItemText( hDlg, AL_RATIO, "" );
WinSetDlgItemText( hDlg, AL_TOTAL_TIME, "" );
char AL_DLL_FAR *name;
TIME global_start;
//
// This is the loop where all of the work happens. All we do here is
// get a new file name and use it as the input file. We then compress
// to a second file, and then optionally expand to a third file.
//
while ( ( name = expander.GetNextFile() ) != 0 ) {
TIME local_start;
ALFile input( name, BIG_BUFFER );
compressed = new ALFile( "", BIG_BUFFER );
ALFile output( "", BIG_BUFFER );
ALName filename( name );
filename.StripPath();
WinSetDlgItemText( hDlg, AL_FILE, (PSZ) filename );
input.mpMonitor = &monitor;
compressor.Compress( input, *compressed );
if ( compressed->mStatus < AL_SUCCESS )
break;
if ( !compress_only ) {
input.mpMonitor = 0;
output.mpMonitor = &monitor;
decompressor.Decompress( *compressed, output );
output.Delete();
if ( compressed->mStatus < AL_SUCCESS )
break;
}
total_input += input.GetSize();
total_compressed += compressed->GetSize();
TIME local_stop;
char *s;
sprintf( buf,
"%14.14s %9ld %9ld %6d%% %s",
(PSZ) filename,
input.GetSize(),
compressed->GetSize(),
ratio( input.GetSize(), compressed->GetSize() ),
(PSZ)( s = format_time( local_stop - local_start ) )
);
if ( s )
delete[] s;
//
// I stuff the file stats in the list box, then make sure that the currently
// selected position in the list box is on the screen.
//
int pos = (int ) WinSendDlgItemMsg( hDlg,
AL_RESULTS,
LM_INSERTITEM,
MPFROMSHORT( LIT_END ),
MPFROMP( (PSZ) buf ) );
WinSendDlgItemMsg( hDlg,
AL_RESULTS,
LM_SELECTITEM,
MPFROMSHORT( (short) pos ),
0 );
// WinSendDlgItemMsg( hDlg,
// AL_DATA,
// LB_SETCURSEL,
// MPFROMSHORT( LIT_NONE ),
// 0 );
compressed->Delete();
delete compressed;
compressed = 0;
}
if ( compressed ) {
delete compressed;
compressed = 0;
}
TIME global_stop;
sprintf( buf, "%ld", total_input );
WinSetDlgItemText( hDlg, AL_TOTAL_INPUT, buf );
sprintf( buf, "%ld", total_compressed );
WinSetDlgItemText( hDlg, AL_TOTAL_COMPRESSED, buf );
sprintf( buf, "%d%%", ratio( total_input, total_compressed ) );
WinSetDlgItemText( hDlg, AL_RATIO, buf );
char * s = format_time( global_stop - global_start );
if ( s ) {
sprintf( buf,
"%s",
s = format_time( global_stop - global_start ) );
WinSetDlgItemText( hDlg, AL_TOTAL_TIME, buf );
delete[] s;
} else
WinSetDlgItemText( hDlg, AL_TOTAL_TIME, "" );
WinEnableWindow( WinWindowFromID( hDlg, AL_COMPRESS), 1 );
}
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;
}
MRESULT EXPENTRY MainDialogProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
{
switch ( msg ) {
case WM_INITDLG :
break;
case WM_COMMAND :
switch ( LOUSHORT( mp1 ) ) {
case AL_ABOUT :
WinDlgBox( HWND_DESKTOP,
hwnd,
AboutBoxDialogProc,
NULLHANDLE,
AL_ABOUT_DIALOG,
0 );
break;
case AL_COMPRESS :
Compress( hwnd );
break;
case AL_ABORT :
if ( compressed != 0 )
compressed->mStatus.SetError(
AL_USER_ABORT,
"User pressed abort key" );
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()
{
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;
}