489 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			489 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //
 | |
| // STATUS.CPP
 | |
| //
 | |
| //  Source file for ArchiveLib 2.0
 | |
| //
 | |
| //  Copyright (c) 1994-1996 Greenleaf Software, Inc.
 | |
| //  All Rights Reserved
 | |
| //
 | |
| // CONTENTS
 | |
| //
 | |
| //  ALStatus::operator new()
 | |
| //  ALStatus::ALStatus()
 | |
| //  ALStatus::~ALStatus()
 | |
| //  ALStatus::SetError()
 | |
| //  ALStatus::GetStatusDetail()
 | |
| //  ALStatus::operator = ()
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This file contains LibMain() and the WEP() for ArchiveLib DLLs.
 | |
| //  We don't really do anything exciting in the WEP, it is just
 | |
| //  here for decoration.  LibMain() has to set up memory allocation
 | |
| //  for Borland.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 26, 1994  1.0A  : First release
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| #include "arclib.h"
 | |
| #if !defined( AL_IBM )
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdarg.h>
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALStatus::operator new()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  Memory allocator used when ArchiveLib resides in a 16 bit DLL.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  void * ALStatus::operator new( size_t size )
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus 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 ALStatus 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
 | |
| ALStatus::operator new( size_t size )  /* Tag protected function */
 | |
| {
 | |
|     return ::new char[ size ];
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALStatus::ALStatus()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  ALStatus default constructor.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //   ALStatus::ALStatus()
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This is the only constructor for objects of class ALStatus.  It
 | |
| //  initializes the detail length member to 129, which is a const and
 | |
| //  won't change.  The initial status is AL_SUCCESS, and there is no
 | |
| //  detail string to start with.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| //  None, this constructor is only used internally.
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   May 24, 1994  1.0A  : First release
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| AL_PROTO
 | |
| ALStatus::ALStatus()  /* Tag public function */
 | |
|     : miStatusDetailLength( 129 )
 | |
| {
 | |
|     miStatus = AL_SUCCESS;
 | |
|     mszStatusDetail = 0;
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALStatus::~ALStatus()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  The ALStatus destructor.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  ALStatus::~ALStatus()
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  The destructor has to free up any space allocated for the detailed
 | |
| //  error status string.  That's all.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| //  None, this destructor is only used internally.
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : First release
 | |
| //
 | |
| 
 | |
| AL_PROTO
 | |
| ALStatus::~ALStatus()  /* Tag public function */
 | |
| {
 | |
|     if ( mszStatusDetail )
 | |
|         delete[] mszStatusDetail;
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALStatus::SetError()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  Set the ALStatus object to an error state.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  int ALStatus::SetError( int error, const char AL_DLL_FAR *fmt, ... );
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  error   :  The new error code to set the miStatus member to.  A value
 | |
| //             less than 0 (AL_SUCCESS) will always be interpreted as
 | |
| //             an error.
 | |
| //
 | |
| //  fmt     :  A sprintf style formatting string.  This is for the
 | |
| //             message that is going to go into the status detail message.
 | |
| //
 | |
| //  ...     :  Any additional arguments needed by the formatting string.
 | |
| //
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This function is used to set the status of an object to an error state.
 | |
| //  Normally this is done by sending an error code, along with a detailed
 | |
| //  message explaining what went wrong and why.  Note that to clear
 | |
| //  and error state, you can pass AL_SUCCESS for the error code and
 | |
| //  0 for the format.  The object will look like it is healthy and happy
 | |
| //  after that.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  The error code that just got passed in.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| int AL_PROTO
 | |
| ALStatus::SetError( int error, const char AL_DLL_FAR *fmt, ... )  /* Tag public function */
 | |
| {
 | |
|     char detail[ 256 ];
 | |
|     va_list argptr;
 | |
| 
 | |
|     miStatus = error;
 | |
|     if ( fmt == 0 ) {
 | |
|         if ( mszStatusDetail )
 | |
|             delete[] mszStatusDetail;
 | |
|             mszStatusDetail = 0;
 | |
|     } else {
 | |
|         va_start( argptr, fmt );
 | |
|         vsprintf( detail, fmt, argptr );
 | |
|         va_end( argptr );
 | |
|         if ( mszStatusDetail == 0 )
 | |
|             mszStatusDetail = new char[ miStatusDetailLength ];
 | |
|         if ( mszStatusDetail ) {
 | |
|             strncpy( mszStatusDetail, detail, miStatusDetailLength - 1 );
 | |
|             mszStatusDetail[ miStatusDetailLength - 1 ] = '\0';
 | |
|         }
 | |
|     }
 | |
|     return error;
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALStatus::GetStatusDetail()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  Get a string pointer to the detailed status error message.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  const char * ALStatus::GetStatusDetail() const;
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  Whenever we set the error code for an object in ArchiveLib, we
 | |
| //  call ALStatus::SetError().  At the same time that we set the
 | |
| //  error code of the object to a non-zero value, we supply a formatted
 | |
| //  string providing some detail about when and where the error
 | |
| //  took place, maybe even including some other information provided by the
 | |
| //  O/S.  That information is stored in the detail string, which is a
 | |
| //  private data member.  This function provides the ability to get at
 | |
| //  that detail string.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Guaranteed to return a valid character string.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| const char AL_DLL_FAR * AL_PROTO
 | |
| ALStatus::GetStatusDetail() const  /* Tag public function */
 | |
| {
 | |
|     if ( mszStatusDetail )
 | |
|         return mszStatusDetail;
 | |
|     else if ( miStatus == AL_SUCCESS )
 | |
|         return "No errors";
 | |
|     else
 | |
|         return "Unable to allocate memory for error detail message";
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALStatus::operator=()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  The ALStatus assignment operator.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  ALStatus & ALStatus::operator=( ALStatus &rhs );
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None, ALStatus is not exported to C/VB/Delphi.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  rhs  : Another ALStatus object that I want to copy into this object.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  Somewhere in ArchiveLib I want to be able to copy one status
 | |
| //  into another.  This function does just that.  It has to allocate
 | |
| //  new space to make a copy of the detail string, and be sure to
 | |
| //  free up any old space, and all that.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  A reference to this.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release.
 | |
| //
 | |
| 
 | |
| ALStatus AL_DLL_FAR & AL_PROTO
 | |
| ALStatus::operator=( ALStatus AL_DLL_FAR &rhs )  /* Tag public function */
 | |
|  {
 | |
|     if ( rhs.mszStatusDetail == 0 ) {
 | |
|         if ( mszStatusDetail ) {
 | |
|             delete[] mszStatusDetail;
 | |
|             mszStatusDetail = 0;
 | |
|         }
 | |
|     } else {
 | |
|         if ( mszStatusDetail == 0 )
 | |
|             mszStatusDetail = new char[ miStatusDetailLength ];
 | |
|         if ( mszStatusDetail )
 | |
|             strcpy( mszStatusDetail, rhs.mszStatusDetail );
 | |
|     }
 | |
|     miStatus = rhs.miStatus;
 | |
|     return *this;
 | |
| }
 | |
| 
 |