diff options
Diffstat (limited to 'led/complex1/MessageQueueT.h')
-rw-r--r-- | led/complex1/MessageQueueT.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/led/complex1/MessageQueueT.h b/led/complex1/MessageQueueT.h new file mode 100644 index 0000000..ae86dd1 --- /dev/null +++ b/led/complex1/MessageQueueT.h @@ -0,0 +1,122 @@ +// +// MessageQueue Template +// +// $Id$ +// + +#ifndef __MessageQueueT_OE3_h +#define __MessageQueueT_OE3_h + +#include <iostream> +#include <string> + +#include "LocalMessageQueuePOSIX10031c.h" +namespace OSWrapper { + + template< + typename QueueType + > + class MessageQueueTemplate { + public: + + typedef void (*Converter_t)( const QueueType *src, QueueType *dest ); + + private: + + typedef OSWrapper::LocalMessageQueuePOSIX10031c<QueueType> Queue_t; + + std::string mName; + Converter_t mHTON; + Converter_t mNTOH; + Queue_t *mQueue; + + public: + + MessageQueueTemplate( + std::string name, + unsigned int depth, + Converter_t hton_f = NULL, + Converter_t ntoh_f = NULL + ) + { + mName = name; + this->mHTON = hton_f; + this->mNTOH = ntoh_f; + + // create the message queue + mQueue = new Queue_t( name, depth ); + } + + MessageQueueTemplate() + { + // destroy the message queue object + delete mQueue; + + // destroy anything else + } + + bool IsAvailable(void) + { + return mQueue->IsAvailable(); + } + + bool Read( + QueueType *buffer + ) + { + QueueType *b; + + // MessageClass *Receive( void ) + // Get the message + try { + + b = mQueue->Receive(); + // read the message queue + if ( !b ) { + std::cerr << mName << " Queue not Read" << std::endl; + return false; + } + } catch (...) { + std::cerr << mName << " Queue not Read: Exception" << std::endl; + return false; + } + + // convert from network neutral + if ( mNTOH ) + (*mNTOH)( b, buffer ); + else + memcpy( buffer, b, sizeof(QueueType) ); + + mQueue->Deallocate( b ); + + return true; + } + + bool Write( + QueueType *buffer + ) + { + bool status; + QueueType *b = mQueue->Allocate(); + + // convert to network neutral + if ( mHTON ) { + (*mHTON)( buffer, b ); + } else { + memcpy( b, buffer, sizeof(QueueType) ); + } + + // write the message + status = mQueue->Send( b ); + if ( !status ) { + std::cerr << mName << " Queue not Written " << std::endl; + return false; + } + return true; + } + }; + +}; + + +#endif |