Branch data Line data Source code
1 : : /* Copyright 2006 Savarese Software Research Corporation
2 : : *
3 : : * Licensed under the Apache License, Version 2.0 (the "License");
4 : : * you may not use this file except in compliance with the License.
5 : : * You may obtain a copy of the License at
6 : : *
7 : : * http://www.savarese.com/software/ApacheLicense-2.0
8 : : *
9 : : * Unless required by applicable law or agreed to in writing, software
10 : : * distributed under the License is distributed on an "AS IS" BASIS,
11 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : : * See the License for the specific language governing permissions and
13 : : * limitations under the License.
14 : : */
15 : :
16 : : /**
17 : : * @file
18 : : * This header defines the BaseMessage class.
19 : : */
20 : :
21 : : #ifndef __SSRC_SPREAD_BASE_MESSAGE_H
22 : : #define __SSRC_SPREAD_BASE_MESSAGE_H
23 : :
24 : : #include <string>
25 : :
26 : : #include <ssrc/libssrcspread-packages.h>
27 : :
28 : : // sp.h includes stddef.h, so we need to include it before sp.h in
29 : : // order to ensure it gets skipped while inside the Spread namespace.
30 : : #include <cstddef>
31 : :
32 : : __BEGIN_NS_SPREAD_INCLUDE
33 : : # include <sp.h>
34 : :
35 : : // Convert define to typedef.
36 : : # if defined(int16)
37 : : typedef int16 foo_int16;
38 : : # undef int16
39 : : typedef foo_int16 int16;
40 : : # endif
41 : : __END_NS_SPREAD_INCLUDE
42 : :
43 : : #include <ssrc/spread/Error.h>
44 : : #include <ssrc/spread/GroupList.h>
45 : :
46 : : __BEGIN_NS_SSRC_SPREAD
47 : :
48 : : #ifdef LIBSSRCSPREAD_ENABLE_MEMBERSHIP_INFO
49 : :
50 : : // Forward declaration
51 : : class MembershipInfo;
52 : :
53 : : #endif
54 : :
55 : : /**
56 : : * BaseMessage is an abstract class defining the operations shared in
57 : : * common by Message and ScatterMessage. We do not document its
58 : : * protected members because they are intended only for internal library use.
59 : : */
60 : : class BaseMessage {
61 : : public:
62 : : /** Defines the type for 16-bit message type identifiers. */
63 : : typedef Spread::int16 message_type;
64 : :
65 : : /** Defines the type for specifying service types. */
66 : : typedef Spread::service service_type;
67 : :
68 : : /**
69 : : * Service is not a proper enumeration, but rather a specification
70 : : * of constants corresponding to the %Spread service type flags. We
71 : : * do not document the meaning of these flags here. See the %Spread
72 : : * C API documentation to understand their meaning. We will note,
73 : : * however, that DropReceive is not a service type, but rather a
74 : : * flag instructing the %Spread receive functions to truncate
75 : : * messages and group lists if the buffers are too small. There
76 : : * should be no need to use this constant in the API as it is
77 : : * handled by Mailbox::set_drop_receive.
78 : : *
79 : : *
80 : : */
81 : : enum Service {
82 : : Unreliable = UNRELIABLE_MESS,
83 : : Reliable = RELIABLE_MESS,
84 : : FIFO = FIFO_MESS,
85 : : Causal = CAUSAL_MESS,
86 : : Agreed = AGREED_MESS,
87 : : Safe = SAFE_MESS,
88 : : SelfDiscard = SELF_DISCARD,
89 : : DropReceive = DROP_RECV,
90 : : #define SERVICE_TYPE_DISCARD(s) s ## SelfDiscard = s | SelfDiscard
91 : :
92 : : SERVICE_TYPE_DISCARD(Unreliable),
93 : : SERVICE_TYPE_DISCARD(Reliable),
94 : : SERVICE_TYPE_DISCARD(FIFO),
95 : : SERVICE_TYPE_DISCARD(Causal),
96 : : SERVICE_TYPE_DISCARD(Agreed),
97 : : SERVICE_TYPE_DISCARD(Safe)
98 : :
99 : : #undef SERVICE_TYPE_DISCARD
100 : : };
101 : :
102 : : private:
103 : :
104 : : #ifdef LIBSSRCSPREAD_ENABLE_MEMBERSHIP_INFO
105 : :
106 : : void get_vs_set_members(const Spread::vs_set_info *vs_set,
107 : : GroupList *members, unsigned int offset = 0) const;
108 : :
109 : : #endif
110 : :
111 : : protected:
112 : :
113 : : message_type _type;
114 : : service_type _service_type;
115 : : bool _endian_mismatch;
116 : : string _sender;
117 : :
118 : : /**
119 : : * Initializes the class with a message type equal to 0, service
120 : : * type equal to Safe, endian mismatch equal to false, and a
121 : : * zero-length string for the sender.
122 : : */
123 : 46 : BaseMessage() :
124 [ + - ]: 46 : _type(0), _service_type(Safe), _endian_mismatch(false), _sender("")
125 : 46 : { }
126 : :
127 : : #ifdef LIBSSRCSPREAD_ENABLE_MEMBERSHIP_INFO
128 : :
129 : : virtual int sp_get_membership_info(Spread::membership_info *info) const = 0;
130 : :
131 : : virtual int sp_get_vs_set_members(const Spread::vs_set_info *vs_set,
132 : : Spread::group_type member_names[],
133 : : unsigned int member_names_count) const = 0;
134 : :
135 : : virtual int sp_get_vs_sets_info(Spread::vs_set_info *vs_sets,
136 : : unsigned int num_vs_sets,
137 : : unsigned int *index) const = 0;
138 : :
139 : : #endif
140 : :
141 : : public:
142 : :
143 : : /** Virtual destructor. */
144 : 46 : virtual ~BaseMessage() { }
145 : :
146 : : /**
147 : : * Returns the number of bytes in the message.
148 : : *
149 : : * @return The number of bytes in the message.
150 : : */
151 : : virtual unsigned int size() const = 0;
152 : :
153 : : /** Clears the message for reuse, resetting its size to zero. */
154 : : virtual void clear() = 0;
155 : :
156 : : #ifdef LIBSSRCSPREAD_ENABLE_MEMBERSHIP_INFO
157 : :
158 : : void get_membership_info(MembershipInfo & info) const SSRC_DECL_THROW(Error);
159 : :
160 : : #endif
161 : :
162 : : /**
163 : : * Sets the service type of the message.
164 : : *
165 : : * @param service The service type of the message.
166 : : */
167 : 33 : void set_service(const service_type service) {
168 : 33 : _service_type = service;
169 : 33 : }
170 : :
171 : : /**
172 : : * Returns the service type requested (for sends) or sent under (for
173 : : * receives) of the message.
174 : : *
175 : : * @return The service type of the message.
176 : : */
177 : 46 : service_type service() const {
178 : 46 : return _service_type;
179 : : }
180 : :
181 : : /**
182 : : * Sets the message type identifier.
183 : : * @param type The new message type.
184 : : */
185 : 32 : void set_type(const message_type type) {
186 : 32 : _type = type;
187 : 32 : }
188 : :
189 : : /**
190 : : * Returns the type of the message.
191 : : * @return The type of the message.
192 : : */
193 : 28 : message_type type() const {
194 : 28 : return _type;
195 : : }
196 : :
197 : : /**
198 : : * Sets the message sender.
199 : : * @param sender The message sender.
200 : : */
201 : 23 : void set_sender(const string & sender) {
202 : 23 : _sender = sender;
203 : 23 : }
204 : :
205 : : /**
206 : : * Returns the message sender. This only has meaning for received messages.
207 : : * @return The message sender.
208 : : */
209 : 8 : const string & sender() const {
210 : 8 : return _sender;
211 : : }
212 : :
213 : : /**
214 : : * Sets the endian mismatch flag to the specified value.
215 : : * @param mismatch The mismatch value.
216 : : */
217 : 23 : void set_endian_mismatch(const bool mismatch = true) {
218 : 23 : _endian_mismatch = mismatch;
219 : 23 : }
220 : :
221 : : /**
222 : : * Returns true if there is an endian mismatch between sender and receiver,
223 : : * false otherwise. This only has meaning for received messages.
224 : : * @return true if there is an endian mismatch between sender and receiver,
225 : : * false otherwise.
226 : : */
227 : 13 : bool endian_mismatch() const {
228 : 13 : return _endian_mismatch;
229 : : }
230 : :
231 : : /** Sets the service type to BaseMessage::Agreed. */
232 : : void set_agreed() {
233 : : set_service(Agreed);
234 : : }
235 : :
236 : : /**
237 : : * Returns true if service type is BaseMessage::Agreed, false otherwise.
238 : : * @return true if service type is BaseMessage::Agreed, false otherwise.
239 : : */
240 : : bool is_agreed() const {
241 : : return Is_agreed_mess(service());
242 : : }
243 : :
244 : : /** Sets the service type to BaseMessage::Causal. */
245 : : void set_causal() {
246 : : set_service(Causal);
247 : : }
248 : :
249 : : /**
250 : : * Returns true if service type is BaseMessage::Causal, false otherwise.
251 : : * @return true if service type is BaseMessage::Causal, false otherwise.
252 : : */
253 : : bool is_causal() const {
254 : : return Is_causal_mess(service());
255 : : }
256 : :
257 : : /** Sets the service type to BaseMessage::FIFO. */
258 : : void set_fifo() {
259 : : set_service(FIFO);
260 : : }
261 : :
262 : : /**
263 : : * Returns true if service type is BaseMessage::FIFO, false otherwise.
264 : : * @return true if service type is BaseMessage::FIFO, false otherwise.
265 : : */
266 : : bool is_fifo() const {
267 : : return Is_fifo_mess(service());
268 : : }
269 : :
270 : : /** Sets the service type to BaseMessage::Reliable. */
271 : : void set_reliable() {
272 : : set_service(Reliable);
273 : : }
274 : :
275 : : /**
276 : : * Returns true if service type is BaseMessage::Reliable, false otherwise.
277 : : * @return true if service type is BaseMessage::Reliable, false otherwise.
278 : : */
279 : : bool is_reliable() const {
280 : : return Is_reliable_mess(service());
281 : : }
282 : :
283 : : /** Sets the service type to BaseMessage::Unreliable. */
284 : : void set_unreliable() {
285 : : set_service(Unreliable);
286 : : }
287 : :
288 : : /**
289 : : * Returns true if service type is BaseMessage::Unreliable, false otherwise.
290 : : * @return true if service type is BaseMessage::Unreliable, false otherwise.
291 : : */
292 : : bool is_unreliable() const {
293 : : return Is_unreliable_mess(service());
294 : : }
295 : :
296 : : /** Sets the service type to BaseMessage::Safe. */
297 : : void set_safe() {
298 : : set_service(Safe);
299 : : }
300 : :
301 : : /**
302 : : * Returns true if service type is BaseMessage::Safe, false otherwise.
303 : : * @return true if service type is BaseMessage::Safe, false otherwise.
304 : : */
305 : : bool is_safe() const {
306 : : return Is_safe_mess(service());
307 : : }
308 : :
309 : : /**
310 : : * Adds or removes the BaseMessage::SelfDiscard flag to or from the
311 : : * service type.
312 : : *
313 : : * @param discard true to set the BaseMessage::SelfDiscard flag, false
314 : : * to remove it.
315 : : */
316 : 2 : void set_self_discard(const bool discard = true) {
317 : 2 : _service_type |= SelfDiscard;
318 [ + + ]: 2 : if(!discard)
319 : 1 : _service_type ^= SelfDiscard;
320 : 2 : }
321 : :
322 : : /**
323 : : * Returns true if service type has the BaseMessage::SelfDiscard flag set,
324 : : * false otherwise.
325 : : * @return true if service type has the BaseMessage::SelfDiscard flag set,
326 : : * false otherwise.
327 : : */
328 : 3 : bool is_self_discard() const {
329 : 3 : return Is_self_discard(service());
330 : : }
331 : :
332 : : /**
333 : : * Returns true if this is a regular data (as opposed to membership)
334 : : * message, false otherwise.
335 : : * @return true if this is a regular message, false otherwise.
336 : : */
337 : : bool is_regular() const {
338 : : return Is_regular_mess(service());
339 : : }
340 : :
341 : : /**
342 : : * Returns true if this is a membership message, false otherwise.
343 : : * @return true if this is a membership message, false otherwise.
344 : : */
345 : 4 : bool is_membership() const {
346 [ + - + - ]: 4 : return Is_membership_mess(service());
347 : : }
348 : : };
349 : :
350 : : __END_NS_SSRC_SPREAD
351 : :
352 : : #endif
|