// ------------------------------- //
// -------- Start of File -------- //
// ------------------------------- //
// ----------------------------------------------------------- //
// C++ Header File Name: ehandler.hpp
// Compiler Used: MSVC40, DJGPP 2.7.2.1, GCC 2.7.2.1, HP CPP 10.24
// Produced By: Doug Gaer    
// File Creation Date: 02/14/1996  
// Date Last Modified: 11/04/1998
// Copyright (c) 1997 Douglas M. Gaer
// ----------------------------------------------------------- // 
// ---------- Include File Description and Details  ---------- // 
// ----------------------------------------------------------- // 
/*
The VBD C++ classes are copyright (c) 1997, by Douglas M. Gaer.
All those who put this code or its derivatives in a commercial
product MUST mention this copyright in their documentation for
users of the products in which this code or its derivative
classes are used. Otherwise, you have the freedom to redistribute
verbatim copies of this source code, adapt it to your specific
needs, or improve the code and release your improvements to the
public provided that the modified files carry prominent notices
stating that you changed the files and the date of any change.

THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
THE ENTIRE RISK OF THE QUALITY AND PERFORMANCE OF THIS SOFTWARE
IS WITH YOU. SHOULD ANY ELEMENT OF THIS SOFTWARE PROVE DEFECTIVE,
YOU WILL ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR
CORRECTION.

The Ehandler class is used to catch program exceptions that
occur at run-time. This implementation can be used with or
without C++ built-in exception handling. If C++ exception
handling is not enabled with the CPP_EXCEPTIONS macro, then
the EHandler class can be used to display program errors,
exit the program, or trap a program error with a user defined
Action Function.

Changes: 
================================================================
12/16/1997 - Combined the Console, Curses, and wxWindows version,
using the CONSOLE, CURSES, and wxWINDOWS macros to conditionally
compile.
Added by: Doug Gaer

12/16/1997 - Added the wxincs.hpp file for wxWindows include files.
Added by: Doug Gaer

02/04/1998 - Added CParseError, CNoObjectsExist and CBadClassID
exceptions.
Added by: Doug Gaer

02/06/1998 - Added CSyncError exception.
Added by: Doug Gaer

03/13/1998 - Added CAccessViolation exception.
Added by: Doug Gaer

03/13/1998 - Added CAccessViolation exception.
Added by: Doug Gaer

09/01/1998 - Added CChecksumError exception.
Added by: Doug Gaer
================================================================
*/
// ----------------------------------------------------------- //   
#ifndef __EHANDLER_HPP
#define __EHANDLER_HPP

// Macro used turn on C++'s exception handling in applications
// #ifndef CPP_EXCEPTIONS
// #define CPP_EXCEPTIONS
// #endif

// Macros used to select display types for error messaging
// ===========================================================
// #ifndef __wxWINDOWS__ 
// #define __wxWINDOWS__ // wxWindows display
// #endif

// #ifndef __CONSOLE__ 
// #define __CONSOLE__   // Console (stdout) display
// #endif

// #ifndef __CURSES__
// #define __CURSES__    // Curses port for terminal sessions
// #endif
// ===========================================================

const int FatalErrorLevel = 1; // Return value to Operating System
const int DisplayOn = 1;       // Display the exception
const int DisplayOff = 0;      // Do not display the exception
const int MessageCount = 36;   // Number of exception messages

typedef void (*AF)(); // Function pointer for action function

class EHandler
{
public:
  enum { // Exception Handler error codes
    None,              // No exception 
    FileNotReady,      // File not ready (failed or closed file)
    FileNotWriteable,  // Could not write to file 
    ReadOnlyFile,      // Trying to write to read-only file
    FileNotOpenError,  // Trying to use a closed file
    FileCreationError, // Error creating file
    FileOpenError,     // Error opening file
    FileCloseError,    // Error closing file
    FileSeekError,     // Error seeking in file
    FileReadError,     // Error reading file
    FileWriteError,    // Error writing to file
    EOFError,          // Unexpected end of file
    WrongFileType,     // Wrong file type
    FileCorrupt,       // File corrupted
    FileExists,        // File already exists
    NoFileExists,      // No such file exists
    PathError,         // Invalid path
    DanglingPtr,       // Dangling reference counted pointer
    NullPtr,           // Accessing a null pointer 
    CacheFull,         // Cache full
    StkFull,           // Stack full
    StkEmpty,          // Stack empty
    AssertError,       // Assertion failed
    NoDatabaseOpen,    // No database open
    ObjectExists,      // Object already exists
    BadObjectAddress,  // Bad object address
    BadReference,      // Bad Reference
    DivideByZero,      // Divide By Zero Error
    OverFlow,          // Math overflow
    UnderFlow,         // Math under-flow
    ParseError,        // Parse error
    NoObjectsExist,    // No objects exist
    BadClassID,        // Wrong object type
    SyncError,         // Synchronization Error
    AccessViolation,   // Access Violation
    ChecksumError      // Checksum Error
  };

  enum { // Exception Handler error levels
    FATAL = 0x0010,    // Fatal error, terminate program immediately
    DISPLAY = 0x0020   // Dummy handler that does nothing
  };
    
public:
  EHandler() { ExceptionCode = None; }
  virtual ~EHandler();

public:
  virtual void DisplayException();
  virtual void DisplayException(int ECode);

  // Display exception, exit the program, do nothing, or handle exception
  virtual void SignalException 
  (int ECode, int Level = FATAL, int DisplayError = DisplayOn);

  // Display a program message
  virtual void Message
  (const char *mesg1=" ", const char *mesg2=" ", const char *mesg3=" ");
  
  // Exception handler used to handle user defined routines to trap
  // a program error 
  void TrapException(AF ActionFunction);
  
  void SetException(int ECode) { ExceptionCode = ECode; }
  int Exception() { return ExceptionCode; }
  void ClearException() { ExceptionCode = None; }

protected:
  virtual void Terminate();
  int ExceptionCode;  
};

extern EHandler ExceptionHandler;
extern EHandler *Error; // Global exception handler pointer

#ifdef CPP_EXCEPTIONS
// Class declarations for exceptions representing program errors. 
// This implementation is provided for use C++'s built-in exception
// handling routines.
class CNone : public EHandler { };              // No exception
class CFileNotReady : public EHandler { };      // File not ready
class CFileNotWriteable : public EHandler { };  // Could not write to file
class CReadOnlyFile : public EHandler { };      // Writing to read-only file
class CFileNotOpenError : public EHandler { };  // Using a closed file
class CFileCreationError : public EHandler { }; // Error creating file
class CFileOpenError : public EHandler { };     // Error opening file
class CFileCloseError : public EHandler { };    // Error closing file
class CFileSeekError : public EHandler { };     // Error seeking in file
class CFileReadError : public EHandler { };     // Error reading file
class CFileWriteError : public EHandler { };    // Error writing to file
class CEOFError : public EHandler { };          // Unexpected end of file
class CWrongFileType : public EHandler { };     // Wrong file type
class CFileCorrupt : public EHandler { };       // File corrupted
class CFileExists : public EHandler { };        // File already exists
class CNoFileExists : public EHandler { };      // No such file exists
class CPathError : public EHandler { };         // Invalid path
class CDanglingPtr : public EHandler { };       // Dangling ref counted ptr
class CNullPtr : public EHandler { };           // Accessing a Null pointer 
class CCacheFull : public EHandler { };         // Cache full
class CStkFull : public EHandler { };           // Stack full
class CStkEmpty : public EHandler { };          // Stack empty
class CAssertError : public EHandler { };       // Assertion failed
class CNoDatabaseOpen : public EHandler { };    // No database
class CObjectExists : public EHandler { };      // ObjectExists
class CBadObjectAddress : public EHandler { };  // Bad object address
class CBadReference : public EHandler { };      // Bad Reference
class CDivideByZero : public EHandler { };      // Divide By Zero Error
class COverFlow : public EHandler { };          // Math overflow
class CUnderFlow : public EHandler { };         // Math under-flow
class CParseError : public EHandler { };        // Parse error
class CNoObjectsExist : public EHandler { };    // No objects exist
class CBadClassID : public EHandler { };        // Wrong object type
class CSyncError : public EHandler { };         // Synchronization Error
class CAccessViolation : public EHandler { };   // Access Violation
class CChecksumError : public EHandler { };     // Checksum Error
#endif // CPP_EXCEPTIONS

#endif  // __EHANDLER_HPP 
// ----------------------------------------------------------- //
// ------------------------------- //
// --------- End of File --------- //
// ------------------------------- //
