/****************************************************************************/
/* Summary  :                                                               */
/* Filename : MessageQueue.h                                                */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : $Revisions:$                                            */
/* Created  : 04/05/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/

#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; };

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
