
#ifndef AT_REPORTERR_H
#define AT_REPORTERR_H

#include "at_error.h"

// ================================== REPORTER ================

// subclass this to do reports
class SEARCH_DECL AT_Error::Reporter
{
public :
  //default
  virtual void report
    (const AT_Error *const err)
  = 0;

  virtual void report
    (const AT_System_Error *const err)
  = 0;  
};

class SEARCH_DECL AT_General_Error::Reporter : public AT_Error::Reporter
{
public :
  // default constructor 
  Reporter
    ()
    {AT_General_Error::setReporter(this);}

  ~Reporter
    ()
    {AT_General_Error::setReporter(NULL);}
    
  // error recovery -> retries
  virtual bool isAbend
    (uint,
     AT_String)
    { return true; };
  virtual void wait
    ()
    {};

  //default
  virtual void report
    (const AT_Error *const err)
  = 0;

  // PS added
  virtual void report
    (const AT_General_Error *const err)
  {
    report(static_cast<const AT_Error*>(err));
  };

  virtual void report
    (const AT_Logic_Error *const err)
  = 0;

  virtual void report
    (const AT_Bounds_Error *const err)
  = 0;

  virtual void report
    (const AT_Corrupt_Error *const err)
  = 0;

  virtual void report
    (const AT_File_Open_Error *const err)
  = 0;
  virtual void report
    (const AT_File_Type_Error *const err)
  = 0;
  virtual void report
    (const AT_File_Read_Error *const err)
  = 0;
  virtual void report
    (const AT_File_Write_Error *const err)
  = 0;

  virtual void report
    (const AT_Constructor_Error *const err)
  = 0;

  virtual void report
    (const AT_Unexpected_Error *const err)
  = 0;
};

#endif
