553 lines
14 KiB
C++
553 lines
14 KiB
C++
|
//
|
||
|
// SIMPMON.CPP
|
||
|
//
|
||
|
// Source file for ArchiveLib 2.0
|
||
|
//
|
||
|
// Copyright (c) Greenleaf Software, Inc. 1994-1996
|
||
|
// All Rights Reserved
|
||
|
//
|
||
|
// CONTENTS
|
||
|
//
|
||
|
// ALSimpleMonitor::operator new()
|
||
|
// ALSimpleMonitor::ALSimpleMonitor()
|
||
|
// ALSimpleMonitor::ALSimpleMonitor()
|
||
|
// newALSimpleMonitor()
|
||
|
// ALSimpleMonitor::~ALSimpleMonitor()
|
||
|
// ALSimpleMonitor::ArchiveOperation()
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// This file contains all the source code to support the simple
|
||
|
// monitor class, ALSimpleMonitor. This class is hidden from the
|
||
|
// users of the simple interface. Their view of the monitor is
|
||
|
// via a callback function (C and C++), or a set of three windows
|
||
|
// that receive text messages (VB and Delphi).
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New Release
|
||
|
//
|
||
|
|
||
|
#include "arclib.h"
|
||
|
#if !defined( AL_IBM )
|
||
|
#pragma hdrstop
|
||
|
#endif
|
||
|
#include "alsimple.h"
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALSimpleMonitor::operator new()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// Memory allocator used when ArchiveLib resides in a 16 bit DLL.
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "alsimple.h"
|
||
|
//
|
||
|
// void * ALSimpleMonitor::operator new( size_t size )
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// None, ALSimpleMonitor is not exported to C/VB/Delphi.
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// None, ALSimpleMonitor is not exported to C/VB/Delphi.
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// None, ALSimpleMonitor is not exported to C/VB/Delphi.
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// size : The number of bytes that the compiler has decided will be
|
||
|
// necessary to construct a new ALSimpleMonitor object.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// When using a DLL, it is easy to get into a dangerous situation when
|
||
|
// creating objects whose ctor and dtor are both in the DLL. The problem
|
||
|
// arises because when you create an object using new, the memory for
|
||
|
// the object will be allocated from the EXE. However, when you destroy
|
||
|
// the object using delete, the memory is freed inside the DLL. Since
|
||
|
// the DLL doesn't really own that memory, bad things can happen.
|
||
|
//
|
||
|
// But, you say, won't the space just go back to the Windows heap regardless
|
||
|
// of who tries to free it? Maybe, but maybe not. If the DLL is using
|
||
|
// a subsegment allocation scheme, it might do some sort of local free
|
||
|
// before returning the space to the windows heap. That is the point where
|
||
|
// you could conceivably cook your heap.
|
||
|
//
|
||
|
// By providing our own version of operator new inside this class, we
|
||
|
// ensure that all memory allocation for the class will be done from
|
||
|
// inside the DLL, not the EXE calling the DLL.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// A pointer to some memory that should have been pulled out of the
|
||
|
// heap for the DLL.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// May 24, 1994 1.0A : First release
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New Release
|
||
|
//
|
||
|
|
||
|
#if defined( AL_BUILDING_DLL )
|
||
|
|
||
|
void AL_DLL_FAR * AL_PROTO
|
||
|
ALSimpleMonitor::operator new( size_t size ) /* Tag private function */
|
||
|
{
|
||
|
return ::new char[ size ];
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALSimpleMonitor::ALSimpleMonitor()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// One of two constructors for ALSimpleMonitor().
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "alsimple.h"
|
||
|
//
|
||
|
// ALSimpleMonitor::ALSimpleMonitor( CALLBACK_FN fn )
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// None, the simple monitor is only used internally by our library.
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// None, the simple monitor is only used internally.
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// None, the simple monitor is only used internally.
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// fn : The callback function provided by the user. This is
|
||
|
// passed to functions like ALExtract as a parameter,
|
||
|
// and passed here by the library routine.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// C and C++ programmers use the ALSimpleMonitor object via a callback
|
||
|
// function. As the simple interface function progresses, the callback
|
||
|
// function is called, which lets the programmer update the user
|
||
|
// interface.
|
||
|
//
|
||
|
// Note that under Windows, VB and Delphi use window handles instead
|
||
|
// of a callback function. Since this constructor is designed to
|
||
|
// use a callback function, I zero out the window handles, just in case.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// Nothing, this is a constructor.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New Release
|
||
|
//
|
||
|
|
||
|
AL_PROTO ALSimpleMonitor::ALSimpleMonitor( CALLBACK_FN fn ) /* Tag private function */
|
||
|
: ALMonitor( AL_MONITOR_JOB )
|
||
|
{
|
||
|
mpCallbackFunction = fn;
|
||
|
#if defined( AL_VB ) || defined( AL_VB32 )
|
||
|
mhTextWindow = 0;
|
||
|
mhFileProgressWindow = 0;
|
||
|
mhJobProgressWindow = 0;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALSimpleMonitor::ALSimpleMonitor()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// VB Delphi
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// One of two constructors for ALSimpleMonitor().
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "alsimple.h"
|
||
|
//
|
||
|
// ALSimpleMonitor::ALSimpleMonitor( HWND text_window,
|
||
|
// HWND file_progress_window,
|
||
|
// HWND job_progress_window )
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// hALMonitor newALSimpleMonitor( HWND text_window,
|
||
|
// HWND file_progress_window,
|
||
|
// HWND job_progress_window )
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// Declare Function newALSimpleMonitor Lib "AL20LW"
|
||
|
// ( ByVal text_window%,
|
||
|
// ByVal file_progress_window%,
|
||
|
// ByVal job_progress_window%) As Long
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// function newALSimpleMonitor( text_window : Hwnd;
|
||
|
// file_progress_window : Hwnd;
|
||
|
// job_progress_window : Hwnd ) : hALMonitor;
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// text_window : The handle for the window that will receive
|
||
|
// file names as they are processed.
|
||
|
//
|
||
|
// file_progress_window : The handle for the window that will receive
|
||
|
// updates on the percentage of each file that
|
||
|
// has been processed.
|
||
|
//
|
||
|
// job_progress_window : The handle for the window that will receive
|
||
|
// updates on the percentage of the entire job that
|
||
|
// has been processed.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// VB and Delphi programmers use the ALSimpleMonitor object via a set
|
||
|
// of three window handles. As the simple interface function progresses
|
||
|
// through a function, these windows are sent file name an progress amounts
|
||
|
// via SetWindowText() calls.
|
||
|
//
|
||
|
// The internal code used to implement the simple interface functions
|
||
|
// under VB or Delphi create monitors using this version of the ctor.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// Nothing for C++, o/w a handle for a new monitor.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New Release
|
||
|
//
|
||
|
|
||
|
#if defined( AL_VB ) || defined( AL_VB32 )
|
||
|
|
||
|
AL_PROTO ALSimpleMonitor::ALSimpleMonitor( HWND text_window, /* Tag private function */
|
||
|
HWND file_progress_window,
|
||
|
HWND job_progress_window )
|
||
|
: ALMonitor( AL_MONITOR_JOB )
|
||
|
{
|
||
|
mpCallbackFunction = 0;
|
||
|
mhTextWindow = text_window;
|
||
|
mhFileProgressWindow = file_progress_window;
|
||
|
mhJobProgressWindow = job_progress_window;
|
||
|
}
|
||
|
|
||
|
#if !defined( AL_NO_C )
|
||
|
|
||
|
extern "C" AL_LINKAGE hALMonitor AL_FUNCTION
|
||
|
newALSimpleMonitor( /* Tag protected function */
|
||
|
HWND text_window,
|
||
|
HWND file_progress_window,
|
||
|
HWND job_progress_window )
|
||
|
{
|
||
|
ALSimpleMonitor *monitor;
|
||
|
monitor = new ALSimpleMonitor( text_window, file_progress_window, job_progress_window );
|
||
|
return (hALMonitor) monitor;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALSimpleMonitor::~ALSimpleMonitor()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// The destructor for ALSimpleMonitor.
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "alsimple.h"
|
||
|
//
|
||
|
// ALSimpleMonitor::~ALSimpleMonitor()
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// C programmers should call deleteALMonitor()
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// VB programmers should call deleteALMonitor()
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// Delphi programmers should call deleteALMonitor()
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// None.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// The destructor for ALSimpleMonitor doesn't have to do anything.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// Nothing, destructor doesn't do anything.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 14, 1996 2.0A : New Release
|
||
|
//
|
||
|
|
||
|
AL_PROTO ALSimpleMonitor::~ALSimpleMonitor() /* Tag private function */
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALSimpleMonitor::ArchiveOperation()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// Update user interface elements after an archiving operation.
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "alsimple.h"
|
||
|
//
|
||
|
// void ALSimpleMonitor::ArchiveOperation( ALArchiveOperation operation,
|
||
|
// ALArchive *archive,
|
||
|
// ALEntry *job );
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// None, this is a protected member function for internal use.
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// None, this is a protected member function for internal use.
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// None, this is a protected member function for internal use.
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// operation : One of the values from the enumerated type ALArchiveOperation.
|
||
|
// It is simply a list of possible operations that the archive
|
||
|
// operation might take, such as opening a file, closing a
|
||
|
// file, etc.
|
||
|
//
|
||
|
// archive : A pointer to the archive object currently being worked on.
|
||
|
//
|
||
|
// job : A pointer to an ALEntry object that defines the ALStorage
|
||
|
// object presently being worked on.
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// During the course of an Archiving operation, the functions in
|
||
|
// ALArchive will get the urge to spit out a message. They do
|
||
|
// so by calling this member function. All of the messages should
|
||
|
// be self-explanatory.
|
||
|
//
|
||
|
// The only message the simple monitor is interested in are messages
|
||
|
// generated when a file is opened. We ignore everything else.
|
||
|
//
|
||
|
// Note that there are two different ways this monitor can work. If a
|
||
|
// callback function is defined, we call it with the file name, and set
|
||
|
// the two numeric values to -1, which is an invalid value. If a window
|
||
|
// handle is defined, on the other hand, we just use SetWindowText() to
|
||
|
// stuff the file name into the window.
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// Nothing.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 16, 1996 2.0A : First release
|
||
|
//
|
||
|
|
||
|
void AL_PROTO
|
||
|
ALSimpleMonitor::ArchiveOperation( ALArchiveOperation operation, /* Tag private function */
|
||
|
ALArchive AL_DLL_FAR *,
|
||
|
ALEntry AL_DLL_FAR *job )
|
||
|
{
|
||
|
switch ( operation ) {
|
||
|
case AL_EXTRACTION_OPEN :
|
||
|
case AL_COPY_OPEN :
|
||
|
case AL_INSERTION_OPEN :
|
||
|
if ( mpCallbackFunction )
|
||
|
mpCallbackFunction( job->mpStorageObject->mName.GetSafeName(), -1, -1 );
|
||
|
#if defined( AL_VB ) || defined( AL_VB32 )
|
||
|
if ( mhTextWindow )
|
||
|
SetWindowText( mhTextWindow, job->mpStorageObject->mName.GetSafeName() );
|
||
|
#endif
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// NAME
|
||
|
//
|
||
|
// ALSimpleMonitor::Progress()
|
||
|
//
|
||
|
// PLATFORMS/ENVIRONMENTS
|
||
|
//
|
||
|
// Console Windows PM
|
||
|
// C++
|
||
|
//
|
||
|
// SHORT DESCRIPTION
|
||
|
//
|
||
|
// The progress routine for the simple monitor.
|
||
|
//
|
||
|
// C++ SYNOPSIS
|
||
|
//
|
||
|
// #include "alsimple.h"
|
||
|
//
|
||
|
// void ALSimpleMonitor::Progress( long object_tell,
|
||
|
// ALStorage &object );
|
||
|
//
|
||
|
// C SYNOPSIS
|
||
|
//
|
||
|
// None, this is a protected member function for internal use.
|
||
|
//
|
||
|
// VB SYNOPSIS
|
||
|
//
|
||
|
// None, this is a protected member function for internal use.
|
||
|
//
|
||
|
// DELPHI SYNOPSIS
|
||
|
//
|
||
|
// None, this is a protected member function for internal use.
|
||
|
//
|
||
|
// ARGUMENTS
|
||
|
//
|
||
|
// object_tell : The current offset within the object being processed.
|
||
|
// Since this function is always called from inside
|
||
|
// ALStorage::Yield(), the location will always be known.
|
||
|
//
|
||
|
// object : The object being compressed, extracted, copied, or
|
||
|
// whatever.
|
||
|
//
|
||
|
//
|
||
|
// DESCRIPTION
|
||
|
//
|
||
|
// While an archiving operation is in progress, this monitor function
|
||
|
// will get called sometimes. It gets called by the Yield() function
|
||
|
// inside the ALStorage object. The Yield function figures out what
|
||
|
// the current offset is inside the storage object, and passes that
|
||
|
// as a parameter.
|
||
|
//
|
||
|
// This routine does a little bit of work to calculate the job
|
||
|
// and file progress ratios. Then it sends them to the calling process
|
||
|
// in one of two ways. If a callback function has been defined, it
|
||
|
// passes them as integer arguments to the function (with the file name
|
||
|
// pointer set to 0.) If the two window handles have been defined, it
|
||
|
// formats the numbers into ASCII and sends them via SetWindowText().
|
||
|
//
|
||
|
// RETURNS
|
||
|
//
|
||
|
// Nothing.
|
||
|
//
|
||
|
// EXAMPLE
|
||
|
//
|
||
|
// SEE ALSO
|
||
|
//
|
||
|
// REVISION HISTORY
|
||
|
//
|
||
|
// February 15, 1996 2.0A : First release
|
||
|
//
|
||
|
|
||
|
void AL_PROTO ALSimpleMonitor::Progress( long object_tell, /* Tag private function */
|
||
|
ALStorage AL_DLL_FAR & object )
|
||
|
{
|
||
|
//
|
||
|
// mlByteCount is no good, because we are in job mode
|
||
|
//
|
||
|
int file_ratio;
|
||
|
ALMonitor::Progress( object_tell, object );
|
||
|
long byte_count = object_tell - mlObjectStart;
|
||
|
if ( mlObjectSize == 0 )
|
||
|
file_ratio = -1;
|
||
|
else {
|
||
|
if ( mlObjectSize < 1000000L )
|
||
|
file_ratio = (int)(100 * byte_count / mlObjectSize );
|
||
|
else
|
||
|
file_ratio = (int)( byte_count / ( mlObjectSize / 100L ) );
|
||
|
}
|
||
|
if ( mpCallbackFunction )
|
||
|
mpCallbackFunction( 0, file_ratio, miRatio );
|
||
|
#if defined( AL_VB ) || defined( AL_VB32 )
|
||
|
char buf[ 24 ];
|
||
|
if ( file_ratio != -1 && mhFileProgressWindow ) {
|
||
|
wsprintf( buf, "%d", file_ratio );
|
||
|
SetWindowText( mhFileProgressWindow, buf );
|
||
|
}
|
||
|
if ( miRatio != -1 && mhJobProgressWindow ) {
|
||
|
wsprintf( buf, "%d", miRatio );
|
||
|
SetWindowText( mhJobProgressWindow, buf );
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|