//=========================================================================
// Summary  : Message queue base class
// Filename : MessageQueue.h
// Author   : Marsh
// Project  : 
// Revision : 1
// Created  : 2000/08/19
// Modified : 2000/08/19
//=========================================================================
// Description :
//=========================================================================

#ifndef _MESSAGEQUEUE_H
#define _MESSAGEQUEUE_H

#include <mqueue.h>

#include "ourTypes.h"

/*
CLASS 
MessageQueue

DESCRIPTION
MessageQueue is a base class which implements an OO abstraction of
a message queue (analagous to SharedData for shared memory)

AUTHOR
Marsh
*/

#define DefaultQueueSize 10

class MessageQueue {

public:

     ///////////////////////////////////////////////////////
     // Available access modes
     enum Access {
	  NoAccess = 0, Read, Write, ReadWrite
     };

     ///////////////////////////////////////////////////////
     // Constructor
     MessageQueue( const char *name,
		   int msgSize,
		   int maxQueueSize = 0,
		   Access access = NoAccess,
		   Boolean blocking = False );

     ///////////////////////////////////////////////////////
     // Destructor
     virtual ~MessageQueue();

     ///////////////////////////////////////////////////////
     // Queue name
     const char *name()
	  { return _name; };

     ///////////////////////////////////////////////////////
     // Set access mode
     int setAccess( Access access );

     ///////////////////////////////////////////////////////
     // Get the defined message size
     int msgSize()
	  { return _msgSize; };

     ///////////////////////////////////////////////////////
     // Get the maximum queue size
     int maxQueueSize()
	  { return _maxQueueSize; };

     ///////////////////////////////////////////////////////
     // Read a message from queue 
     virtual int read( void *data );

     ///////////////////////////////////////////////////////
     // Write a message to the queue
     virtual int write( void *data );

     ///////////////////////////////////////////////////////
     // Get the number of pending messages in the queue
     int msgsPending( void );

     ///////////////////////////////////////////////////////
     // flush out the queue
     int flush( void );

     ///////////////////////////////////////////////////////
     // Unlimk from current queue
     int unlink( void );

     ///////////////////////////////////////////////////////
     // Set debugging
     void debugMode( Boolean debugMode )
	  { debug = debugMode; };

     ///////////////////////////////////////////////////////
     // Enable message queue notification
     void setNotification( int signo );

protected:



private:

     int openQueue( const char *name, 
		    int maxMsgSize, 
		    int maxQueueSize,
		    Access access,
		    Boolean blocking = False );


     int closeQueue();

     const char *_name;
     Access _access;
     int _msgSize, _maxQueueSize;
     Boolean _blocking;

     mqd_t _queue;

     Boolean debug;
};




#endif
