/*	Eric Knibbe
*	CS 232 - Operating Systems, Spring '06
*	Project 1.5
*	prank.h
*/

#ifndef PRANK
#define PRANK
#include <signal.h>
#include <iostream>
using namespace std;

//global variables
const bool DEFAULT_INTERRUPTS = false;
const int DEFAULT_INTERVAL = 5;
bool dInterrupts;
int mInterval;

//Prank class declaration
class Prank {
	//variables
	protected:
		bool disableInterrupts;		// whether interrupts are disabled or not
		int messageInterval;		// how long to wait between printing messages

	//functions
	public:
		Prank(void);					// default constructor
		Prank(bool);					// variable constructor
		Prank(bool, int);				// variable constructor
		void alarm_handler(int);		// handler for SIGALRM
		void interrupt_handler(int);	// handler for SIGINT
};

/* default constructor definition */
inline Prank::Prank(void) {
	disableInterrupts = DEFAULT_INTERRUPTS;
	dInterrupts = disableInterrupts;
	messageInterval = DEFAULT_INTERVAL;
	mInterval = messageInterval;
}

/* constructor for passed-in variables */
inline Prank::Prank(bool disableI) {
	disableInterrupts = disableI;
	dInterrupts = disableInterrupts;
	messageInterval = DEFAULT_INTERVAL;
	mInterval = messageInterval;
}

/* another constructor for passed-in variables */
inline Prank::Prank(bool disableI, int messageI) {
	disableInterrupts = disableI;
	dInterrupts = disableInterrupts;
	messageInterval = messageI;
	mInterval = messageInterval;
}

/* handler method for SIGALRM */
inline void alarm_handler(int nothing) {
	cout << "Are we there yet?\n";
	signal(SIGALRM, alarm_handler);
	alarm(mInterval);
}

/* handler method for SIGINT */
inline void interrupt_handler(int nothing) {
  cout << "I have to go to the bathroom!\n";
  signal(SIGINT, interrupt_handler);
}

#endif

