campo-sirio/al/cpp_all/simpmon.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

553 lines
14 KiB
C++
Executable File

//
// 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
}