//=========================================================================
// Summary  : 
// Filename : SignalTable.h
// Author   : Marsh
// Project  : 
// Revision : 1
// Created  : 2001/01/8
// Modified : 2000/08/21
//=========================================================================
// Description :
//
// Note this object is not finished.  It does not properly disable signals
// during operations that should be atomic.  Some signals may be dropped.
// It's also incapable of handling multiple signals in the queue.
//=========================================================================

#ifndef _SIGNALTABLE_H
#define _SIGNALTABLE_H

#include "ourTypes.h"

#include <signal.h>

template<class T>
class SignalTable {
public:

     SignalTable()
	  {
	       for( int i = 0; i <= _SIGMAX; i++ ) 
		    callbackTable[ i ] = NULL;
	       _lastSignal = -1;
	  };

     ~SignalTable()
	  { ; };

     // Define a callback type
//     typedef void (*SignalCallback)( void );

     int addCallback( int signo, T newCallback )
	  {
	       callbackTable[signo] = newCallback; 
	       signal( signo, SignalTable<T>::signalTableSignalHandler );
	       return 0;
	  };
     T callback( int signo )
	  { return callbackTable[signo]; };
     Boolean isCallback( int signo )
	  { return (callbackTable[signo]) ? True : False; };

     void resetSignal( void )
	  { _lastSignal = -1; };
     int lastSignal( void )
	  { return _lastSignal; };

     static int _lastSignal;

protected:

private:
     

     // Kindof an inefficient way to do it, but effective (and quick)
     T callbackTable[_SIGMAX+1];

     static void signalTableSignalHandler( int signo )
	  {
	       _lastSignal = signo;
	       ;
	  };
};


#endif
