159 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
/*
 | 
						|
 * STATUS.H
 | 
						|
 *
 | 
						|
 *  Header file for ArchiveLib 1.0
 | 
						|
 *
 | 
						|
 *  Copyright (c) 1994 Greenleaf Software, Inc.
 | 
						|
 *  All Rights Reserved
 | 
						|
 *
 | 
						|
 * DESCRIPTION
 | 
						|
 *
 | 
						|
 *  This header file contains the class declaration for ALStatus. 
 | 
						|
 *  This is a utility class that is used as a data member in many
 | 
						|
 *  different types of objects.  It holds the current error status
 | 
						|
 *  of an object.
 | 
						|
 * 
 | 
						|
 * CLASS DEFINITIONS:
 | 
						|
 *
 | 
						|
 *  ALStatus
 | 
						|
 *
 | 
						|
 * MACROS
 | 
						|
 *
 | 
						|
 *   ostream& operator << ( ostream& stream, const ALStatus &status )
 | 
						|
 * 
 | 
						|
 * REVISION HISTORY
 | 
						|
 *
 | 
						|
 *  May 26, 1994  1.0A  : First release
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _STATUS_H
 | 
						|
#define _STATUS_H
 | 
						|
 | 
						|
#if defined( __cplusplus )
 | 
						|
 | 
						|
/*
 | 
						|
 * class ALStatus 
 | 
						|
 *
 | 
						|
 * DESCRIPTION
 | 
						|
 *
 | 
						|
 *  ALStatus is a utility class that is used as a data member of several
 | 
						|
 *  other classes.  It provides an integer member that keeps track
 | 
						|
 *  of the current status of the object, with AL_SUCCESS meaning
 | 
						|
 *  everything is okay, and a code < 0 meaning the object has
 | 
						|
 *  experienced an error.
 | 
						|
 *
 | 
						|
 *  The object also contains a character pointer to a detailed error
 | 
						|
 *  message.  Usually when an error occurs in ArchiveLib, the
 | 
						|
 *  routine that detects the error generates a detailed message that
 | 
						|
 *  can be stored to provide additional information.
 | 
						|
 *
 | 
						|
 *  Error states in ArchiveLib are "sticky".  Once an object is flagged
 | 
						|
 *  as being in error, it will stay that way until the programmer
 | 
						|
 *  resets it, which means it will fail most ordinary operations.
 | 
						|
 *  When you want to clear the error statue of an object, call
 | 
						|
 *  SetError() with AL_SUCCESS as the error code.
 | 
						|
 *
 | 
						|
 * DATA MEMBERS
 | 
						|
 *
 | 
						|
 *  miStatus             : The current status of the object, with AL_SUCCESS
 | 
						|
 *                         being a good value.  You can get at this easily
 | 
						|
 *                         by casting ALStatus to type int.
 | 
						|
 *
 | 
						|
 *  miStatusDetailLength : This member keeps track of the length of the
 | 
						|
 *                         status detail.  The status detail buffer
 | 
						|
 *                         is dynamically allocated when it is needed.
 | 
						|
 *                         Keeping this member is really kind of dumb, I
 | 
						|
 *                         need to just allocate as much space as necessary
 | 
						|
 *                         when the error detail is created.  Look for this
 | 
						|
 *                         data member to go away in an upcoming release.
 | 
						|
 *
 | 
						|
 *  mszStatusDetail      : The detailed error message.  It will be set to
 | 
						|
 *                         0 until a message is generated, when it
 | 
						|
 *                         is dynamically allocated.  Cleaned up if necessary
 | 
						|
 *                         in the destructor.
 | 
						|
 | 
						|
 *
 | 
						|
 * MEMBER FUNCTIONS
 | 
						|
 *
 | 
						|
 *  ALStatus()          : The default and only constructor.
 | 
						|
 *  ~ALStatus()         : The destructor, has to clean up detail string.
 | 
						|
 *  operator new()      : Memory allocation operator, allocates space
 | 
						|
 *                        for the class object when the library is in
 | 
						|
 *                        the DLL.
 | 
						|
 *  SetError()          : Sets the error code to a value, and writes
 | 
						|
 *                        new data into the detail string.
 | 
						|
 *  GetStatusCode()     : Returns the current integer status code,
 | 
						|
 *                        just like operator int().
 | 
						|
 *  GetStatusString()   : Returns the short string translation.
 | 
						|
 *  GetStatusDetail()   : Returns the detailed status message, created
 | 
						|
 *                        at the point the error took place.
 | 
						|
 *  operator int()      : The casting operator, used all over ArchiveLib
 | 
						|
 *                        when testing a status for a value < AL_SUCCESS.
 | 
						|
 *  operator=()         : Assignment operator, easy here.
 | 
						|
 *
 | 
						|
 * REVISION HISTORY
 | 
						|
 *
 | 
						|
 *  May 26, 1994  1.0A  : First release
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
class AL_CLASS_TYPE ALStatus {
 | 
						|
/*
 | 
						|
 * Constructors, destructors, assignment operators, and declarations
 | 
						|
 */
 | 
						|
    public :
 | 
						|
        AL_PROTO ALStatus();
 | 
						|
        AL_PROTO ~ALStatus();
 | 
						|
#if defined( AL_USING_DLL ) || defined( AL_BUILDING_DLL )
 | 
						|
        void AL_DLL_FAR * AL_PROTO operator new( size_t size );
 | 
						|
#endif
 | 
						|
/*
 | 
						|
 * I don't want to allow the copy constructor, although I probably could
 | 
						|
 * support it without too much trouble.
 | 
						|
 */
 | 
						|
    protected :
 | 
						|
        AL_PROTO ALStatus( ALStatus AL_DLL_FAR & );
 | 
						|
/*
 | 
						|
 * Member functions
 | 
						|
 */
 | 
						|
    public :
 | 
						|
        int AL_PROTO SetError( int error, const char AL_DLL_FAR *fmt, ... );
 | 
						|
        AL_PROTO GetStatusCode(){ return miStatus; }
 | 
						|
        const char AL_DLL_FAR * AL_PROTO GetStatusString();
 | 
						|
        const char AL_DLL_FAR * AL_PROTO GetStatusDetail() const;
 | 
						|
        AL_PROTO operator int(){ return miStatus; }
 | 
						|
        ALStatus AL_DLL_FAR & AL_PROTO operator = ( ALStatus AL_DLL_FAR & );
 | 
						|
/*
 | 
						|
 * Data members
 | 
						|
 */
 | 
						|
    protected :
 | 
						|
        int miStatus;
 | 
						|
        const int miStatusDetailLength;
 | 
						|
        char AL_DLL_FAR *mszStatusDetail;
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
inline ostream& operator << ( ostream& stream, const ALStatus AL_DLL_FAR &status )
 | 
						|
{
 | 
						|
#if defined( AL_USING_DLL ) && !defined( AL_LARGE_MODEL ) && !defined( AL_FLAT_MODEL )
 | 
						|
    const char _far *p = status.GetStatusDetail();
 | 
						|
    char *near_string = new char[ _fstrlen( p ) + 1 ];
 | 
						|
    if ( near_string ) {
 | 
						|
        _fstrcpy( near_string, p );
 | 
						|
        stream << near_string;
 | 
						|
        delete near_string;
 | 
						|
    } else
 | 
						|
         stream << "Memory allocation failure!";
 | 
						|
    return stream;
 | 
						|
#else
 | 
						|
    return stream << status.GetStatusDetail();
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
#endif /* #if defined( __cplusplus ) */
 | 
						|
 | 
						|
#endif /* #ifdef _STATUS_H           */
 | 
						|
 |