// Exception classes and Exception codes (DRS_Erc)

#ifndef AT_EXCEPTION_H
#define AT_EXCEPTION_H

#include "base/at_defs.h"
#include "xdart/x_at_index.h"
#include "base/at_error.h"
#include "base/at_reporterr.h"

#define DRS_FileCorrupt_Err(T, n, v)  \
    AT_Corrupt_Error(__FILE__, __LINE__, (AT_String) T, (AT_String) n, v)

typedef byte T_ExceptionString[128];

class IndexErrorReporter;
class ErrorReporter;
class AT_ExceptionList
{
public:
  AT_ExceptionList() : iExceptionCount(0), iExceptionCur(0) {};

  void ExceptionsUnwind( AT_Error &exception);
  uint16 ExceptionCount();
  int16 ExceptionLen(); // Returns -1 on error, i.e. no excepti0ns
  void ExceptionPop( byte *sDest, uint16 iDestLen);
  void ExceptionPush( byte *sSrc);

private:
  uint16 ExceptionCountGet() { return(iExceptionCount++);};
  uint16 iExceptionCount;
  uint16 iExceptionCur;
  T_ExceptionString sExceptions[10];  //Static buf, 10 exceptions

friend IndexErrorReporter;
friend ErrorReporter;
};

class ErrorReporter : public AT_General_Error::Reporter
{
public:
  ErrorReporter::ErrorReporter( AT_ExceptionList *pExcList) : pExceptionList(pExcList) {};

  virtual void report
    (const AT_Error *const err);

  virtual void report
    (const AT_Logic_Error *const err);

  virtual void report
    (const AT_Bounds_Error *const err);

  virtual void report
    (const AT_Corrupt_Error *const err);

  virtual void report
    (const AT_System_Error *const err);

  virtual void report
    (const AT_File_Open_Error *const err);

  virtual void report
    (const AT_File_Type_Error *const err);

  virtual void report
    (const AT_File_Read_Error *const err);

  virtual void report
    (const AT_File_Write_Error *const err);

  virtual void report
    (const AT_Constructor_Error *const err);

  virtual void report
    (const AT_Function_Error *const err);

  virtual void report
    (const AT_Unexpected_Error *const err);

private:
  AT_ExceptionList *pExceptionList;
};

class IndexErrorReporter : public AT_Index_List::Error::Reporter
{
public:
  IndexErrorReporter::IndexErrorReporter( AT_ExceptionList *pExcList) : pExceptionList(pExcList) {};

  virtual void report
    (const AT_Index_List::noIndex *const err);

  virtual void report
    (const AT_Index_List::openError *const err);

  virtual void report
    (const AT_System_Error *const err);

  virtual void report
    (const AT_Error *const err);

private:
  AT_ExceptionList *pExceptionList;
};

#endif




