714dd74636
git-svn-id: svn://10.65.10.50/trunk@5350 c028cbd2-c16b-5b4b-a496-9718f37d4682
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;
|
|
}
|
|
|