blob: ae86dd1c6580f0cf25297f19f54808a4d925dad3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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
|