Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  
igtlMessageHandlerMacro.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: OpenIGTLink Library
4 Module: git@github.com:openigtlink/OpenIGTLink.git
5 Language: C++
6
7 Copyright (c) Insight Software Consortium. All rights reserved.
8
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the above copyright notices for more information.
12
13=========================================================================*/
14
15#ifndef __igtlMessageHandlerMacro_h
16#define __igtlMessageHandlerMacro_h
17
18#include "igtlMessageHandler.h"
19
20// Description:
21// The igtlMessageHandlerClassMacro() macro is to help developers to
22// define message handler class. It generates a child class of igtl::MessageHandler.
23// The developer only needs to implement ProcessMessage() after calling this macro.
24// The following code shows how to define a handler that processes IMAGE message:
25//
26// igtlMessageHandlerClassMacro(igtl::ImageMessage, TestImageMessageHandler);
27// void TestImageMessageHandler::Process(igtl::ImageMessage * message)
28// {
29// // do something
30// }
31
32#if OpenIGTLink_PROTOCOL_VERSION >= 3
33#define igtlMessageHandlerClassMacro(messagetype, classname, datatype) \
34 class classname : public ::igtl::MessageHandler \
35 { \
36 public: \
37 typedef classname Self; \
38 typedef ::igtl::MessageHandler Superclass; \
39 typedef igtl::SmartPointer<Self> Pointer; \
40 typedef igtl::SmartPointer<const Self> ConstPointer; \
41 igtlTypeMacro(classname, ::igtl::MessageHandler); \
42 igtlNewMacro(classname); \
43 public: \
44 virtual const char* GetMessageType() \
45 { \
46 return this->m_Message->GetDeviceType(); \
47 } \
48 virtual int Process(messagetype*, datatype*); \
49 int ReceiveMessage(::igtl::Socket* socket, ::igtl::MessageBase* header, int pos) \
50 { \
51 if (pos == 0) /* New body */ \
52 { \
53 this->m_Message->SetMessageHeader(header); \
54 this->m_Message->InitBuffer(); \
55 } \
56 int s = socket->Receive((void*)((char*)this->m_Message->GetBufferBodyPointer()+pos), \
57 this->m_Message->GetBufferBodySize()-pos); \
58 if (s < 0) /* Time out */ \
59 { \
60 return pos; \
61 } \
62 if (s+pos >= this->m_Message->GetBufferBodySize()) \
63 { \
64 int r = this->m_Message->Unpack(this->m_CheckCRC); \
65 if (r) \
66 { \
67 Process(this->m_Message, this->m_Data); \
68 } \
69 else \
70 { \
71 return -1; \
72 } \
73 } \
74 return s + pos; /* return current position in the body */ \
75 } \
76 virtual void CheckCRC(int i) \
77 { \
78 if (i == 0) \
79 { \
80 this->m_CheckCRC = 0; \
81 } \
82 else \
83 { \
84 this->m_CheckCRC = 1; \
85 } \
86 } \
87 void SetData(datatype* p) \
88 { \
89 this->m_Data = p; \
90 } \
91 datatype* GetData() \
92 { \
93 return this->m_Data; \
94 } \
95 protected: \
96 classname() \
97 { \
98 this->m_Message = messagetype::New(); \
99 this->m_CheckCRC = 1; \
100 this->m_Data = NULL; \
101 } \
102 ~classname() {} \
103 protected: \
104 int m_CheckCRC; \
105 messagetype::Pointer m_Message; \
106 datatype* m_Data; \
107 };
108#else
109 #define igtlMessageHandlerClassMacro(messagetype, classname, datatype) \
110 class classname : public ::igtl::MessageHandler \
111 { \
112 public: \
113 typedef classname Self; \
114 typedef ::igtl::MessageHandler Superclass; \
115 typedef igtl::SmartPointer<Self> Pointer; \
116 typedef igtl::SmartPointer<const Self> ConstPointer; \
117 igtlTypeMacro(classname, ::igtl::MessageHandler); \
118 igtlNewMacro(classname); \
119 public: \
120 virtual std::string GetMessageType() const \
121 { \
122 return this->m_Message->GetMessageType(); \
123 } \
124 virtual const char* GetMessageType() \
125 { \
126 return this->m_Message->GetType(); \
127 } \
128 virtual const char* GetMessageType() \
129 { \
130 return this->m_Message->GetDeviceType(); \
131 } \
132 virtual int Process(messagetype*, datatype*); \
133 int ReceiveMessage(::igtl::Socket* socket, ::igtl::MessageBase* header, int pos) \
134 { \
135 if (pos == 0) /* New body */ \
136 { \
137 this->m_Message->SetMessageHeader(header); \
138 this->m_Message->AllocateBuffer(); \
139 } \
140 int s = socket->Receive((void*)((char*)this->m_Message->GetBufferBodyPointer()+pos), \
141 this->m_Message->GetBufferBodySize()-pos); \
142 if (s < 0) /* Time out */ \
143 { \
144 return pos; \
145 } \
146 if (s+pos >= this->m_Message->GetBufferBodySize()) \
147 { \
148 int r = this->m_Message->Unpack(this->m_CheckCRC); \
149 if (r) \
150 { \
151 Process(this->m_Message, this->m_Data); \
152 } \
153 else \
154 { \
155 return -1; \
156 } \
157 } \
158 return s + pos; /* return current position in the body */ \
159 } \
160 virtual void CheckCRC(int i) \
161 { \
162 if (i == 0) \
163 { \
164 this->m_CheckCRC = 0; \
165 } \
166 else \
167 { \
168 this->m_CheckCRC = 1; \
169 } \
170 } \
171 void SetData(datatype* p) \
172 { \
173 this->m_Data = p; \
174 } \
175 datatype* GetData() \
176 { \
177 return this->m_Data; \
178 } \
179 protected: \
180 classname() \
181 { \
182 this->m_Message = messagetype::New(); \
183 this->m_CheckCRC = 1; \
184 this->m_Data = NULL; \
185 } \
186 ~classname() {} \
187 protected: \
188 int m_CheckCRC; \
189 messagetype::Pointer m_Message; \
190 datatype* m_Data; \
191 };
192#endif
193
194#endif // __igtlMessageHandlerMacro_h

Generated for OpenIGTLink by Doxygen 1.9.8 written by Dimitri van Heesch, © 1997-2012