29#include <boost/intrusive/list.hpp>
31namespace RobotRaconteur
34class ROBOTRACONTEUR_CORE_API ArrayBinaryReader;
35class ROBOTRACONTEUR_CORE_API ArrayBinaryWriter;
36class ROBOTRACONTEUR_CORE_API
NodeID;
38class ROBOTRACONTEUR_CORE_API Message;
39class ROBOTRACONTEUR_CORE_API MessageHeader;
40class ROBOTRACONTEUR_CORE_API MessageEntry;
41class ROBOTRACONTEUR_CORE_API MessageElement;
42class ROBOTRACONTEUR_CORE_API MessageElementNestedElementList;
44class ROBOTRACONTEUR_CORE_API Message :
public RRValue
47 RR_INTRUSIVE_PTR<MessageHeader> header;
48 std::vector<RR_INTRUSIVE_PTR<MessageEntry> > entries;
52 RR_INTRUSIVE_PTR<MessageEntry> FindEntry(MessageStringRef name);
54 RR_INTRUSIVE_PTR<MessageEntry> AddEntry(MessageEntryType t, MessageStringRef name);
57 uint32_t ComputeSize();
58 void Write(ArrayBinaryWriter& w);
59 void Read(ArrayBinaryReader& r);
62 uint32_t ComputeSize4();
63 void Write4(ArrayBinaryWriter& w);
64 void Read4(ArrayBinaryReader& r);
66 RR_OVIRTUAL std::string RRType() RR_OVERRIDE {
return "RobotRaconteur::Message"; }
69class ROBOTRACONTEUR_CORE_API MessageHeader :
public RRValue
72 RR_OVIRTUAL ~MessageHeader() RR_OVERRIDE {}
78 uint32_t SenderEndpoint;
80 uint32_t ReceiverEndpoint;
82 MessageStringPtr SenderNodeName;
84 MessageStringPtr ReceiverNodeName;
88 NodeID ReceiverNodeID;
90 MessageStringPtr MetaData;
96 uint16_t MessageResID;
100 std::vector<boost::tuple<uint32_t, MessageStringPtr> > StringTable;
104 std::vector<uint8_t> Extended;
107 uint16_t ComputeSize();
108 void UpdateHeader(uint32_t message_size, uint16_t entry_count);
109 void Write(ArrayBinaryWriter& w);
110 void Read(ArrayBinaryReader& r);
114 uint32_t ComputeSize4();
117 void UpdateHeader4(uint32_t message_entry_size, uint16_t entry_count);
118 void Write4(ArrayBinaryWriter& w);
119 void Read4(ArrayBinaryReader& r);
121 RR_OVIRTUAL std::string RRType() RR_OVERRIDE {
return "RobotRaconteur::MessageHeader"; }
126class ROBOTRACONTEUR_CORE_API MessageEntry :
public RRValue
129 RR_OVIRTUAL ~MessageEntry() RR_OVERRIDE {}
137 MessageStringPtr ServicePath;
139 uint32_t ServicePathCode;
141 MessageStringPtr MemberName;
143 uint32_t MemberNameCode;
149 MessageStringPtr MetaData;
151 std::vector<uint8_t> Extended;
153 std::vector<RR_INTRUSIVE_PTR<MessageElement> > elements;
157 MessageEntry(MessageEntryType t, MessageStringRef n);
159 RR_INTRUSIVE_PTR<MessageElement> FindElement(MessageStringRef name);
161 bool TryFindElement(MessageStringRef name, RR_INTRUSIVE_PTR<MessageElement>& elem);
163 RR_INTRUSIVE_PTR<MessageElement> AddElement(MessageStringRef name,
164 const RR_INTRUSIVE_PTR<MessageElementData>& data);
166 RR_INTRUSIVE_PTR<MessageElement> AddElement(
const RR_INTRUSIVE_PTR<MessageElement>& m);
169 uint32_t ComputeSize();
171 void Write(ArrayBinaryWriter& w);
172 void Read(ArrayBinaryReader& r);
175 uint32_t ComputeSize4();
177 void Write4(ArrayBinaryWriter& w);
178 void Read4(ArrayBinaryReader& r);
180 RR_OVIRTUAL std::string RRType() RR_OVERRIDE {
return "RobotRaconteur::MessageEntry"; }
183class ROBOTRACONTEUR_CORE_API MessageElement :
public RRValue
186 RR_OVIRTUAL ~MessageElement() RR_OVERRIDE {}
188 uint32_t ElementSize;
190 uint8_t ElementFlags;
192 MessageStringPtr ElementName;
194 uint32_t ElementNameCode;
196 int32_t ElementNumber;
200 MessageStringPtr ElementTypeName;
202 uint32_t ElementTypeNameCode;
204 MessageStringPtr MetaData;
206 std::vector<uint8_t> Extended;
211 RR_INTRUSIVE_PTR<MessageElementData> dat;
217 MessageElement(MessageStringRef name,
const RR_INTRUSIVE_PTR<MessageElementData>& datin);
219 RR_INTRUSIVE_PTR<MessageElementData> GetData();
220 void SetData(
const RR_INTRUSIVE_PTR<MessageElementData>& value);
223 uint32_t ComputeSize();
225 void Write(ArrayBinaryWriter& w);
226 void Read(ArrayBinaryReader& r);
229 uint32_t ComputeSize4();
231 void Write4(ArrayBinaryWriter& w);
232 void Read4(ArrayBinaryReader& r);
234 static RR_INTRUSIVE_PTR<MessageElement> FindElement(std::vector<RR_INTRUSIVE_PTR<MessageElement> >& m,
235 MessageStringRef name);
237 static bool TryFindElement(std::vector<RR_INTRUSIVE_PTR<MessageElement> >& m, MessageStringRef name,
238 RR_INTRUSIVE_PTR<MessageElement>& elem);
240 static bool ContainsElement(std::vector<RR_INTRUSIVE_PTR<MessageElement> >& m, MessageStringRef name);
242 template <
typename T>
243 RR_INTRUSIVE_PTR<T> CastData()
245 return rr_cast<T>(dat);
248 std::string CastDataToString();
250 RR_INTRUSIVE_PTR<MessageElementNestedElementList> CastDataToNestedList();
252 RR_INTRUSIVE_PTR<MessageElementNestedElementList> CastDataToNestedList(DataTypes expected_type);
254 template <
typename T>
255 static RR_INTRUSIVE_PTR<T> CastData(
const RR_INTRUSIVE_PTR<MessageElementData>& Data)
257 return rr_cast<T>(Data);
260 RR_OVIRTUAL std::string RRType() RR_OVERRIDE {
return "RobotRaconteur::MessageElement"; }
263class ROBOTRACONTEUR_CORE_API MessageElementNestedElementList :
public MessageElementData
267 MessageStringPtr TypeName;
268 std::vector<RR_INTRUSIVE_PTR<MessageElement> > Elements;
270 MessageElementNestedElementList(DataTypes type_, MessageStringRef type_name_,
271 const std::vector<RR_INTRUSIVE_PTR<MessageElement> >& elements_);
272#ifndef ROBOTRACONTEUR_NO_CXX11
273 MessageElementNestedElementList(DataTypes type_, MessageStringRef type_name_,
274 std::vector<RR_INTRUSIVE_PTR<MessageElement> >&& elements_);
276 RR_OVIRTUAL MessageStringPtr GetTypeString() RR_OVERRIDE;
277 RR_OVIRTUAL DataTypes GetTypeID() RR_OVERRIDE;
278 RR_OVIRTUAL std::
string RRType() RR_OVERRIDE;
281ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<Message> CreateMessage();
282ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageHeader> CreateMessageHeader();
283ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageEntry> CreateMessageEntry();
284ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageEntry> CreateMessageEntry(MessageEntryType t, MessageStringRef n);
285ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElement> CreateMessageElement();
286ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElement> CreateMessageElement(
287 MessageStringRef name, const RR_INTRUSIVE_PTR<MessageElementData>& datin);
288ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElement> CreateMessageElement(
289 int32_t number, const RR_INTRUSIVE_PTR<MessageElementData>& datin);
290ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElementNestedElementList> CreateMessageElementNestedElementList(
291 DataTypes type_, MessageStringRef type_name_, const std::vector<RR_INTRUSIVE_PTR<MessageElement> >& elements_);
292#ifndef ROBOTRACONTEUR_NO_CXX11
293ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElementNestedElementList> CreateMessageElementNestedElementList(
294 DataTypes type_, MessageStringRef type_name_, std::vector<RR_INTRUSIVE_PTR<MessageElement> >&& elements_);
296ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<Message> ShallowCopyMessage(
const RR_INTRUSIVE_PTR<Message>& m);
297ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageEntry> ShallowCopyMessageEntry(
298 const RR_INTRUSIVE_PTR<MessageEntry>& mm);
299ROBOTRACONTEUR_CORE_API RR_INTRUSIVE_PTR<MessageElement> ShallowCopyMessageElement(
300 const RR_INTRUSIVE_PTR<MessageElement>& mm);
304RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackScalar(
const T& value)
306 return RobotRaconteur::ScalarToRRArray<T>(value);
310RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackScalarElement(MessageStringRef elementname,
const T& value)
312 return CreateMessageElement(elementname, MessageElement_PackScalar(value));
316RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackArray(
const RR_INTRUSIVE_PTR<RRArray<T> >& value)
319 throw NullValueException(
"Arrays must not be null");
324RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackArrayElement(MessageStringRef elementname,
325 const RR_INTRUSIVE_PTR<RRArray<T> >& value)
327 return CreateMessageElement(elementname, MessageElement_PackArray(value));
330template <
typename T,
typename N>
331RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackMultiDimArray(
332 RR_WEAK_PTR<N> node,
const RR_INTRUSIVE_PTR<RRMultiDimArray<T> >& value)
335 throw NullValueException(
"Arrays must not be null");
336 RR_SHARED_PTR<N> node1 = node.lock();
338 throw InvalidOperationException(
"Node has been released");
339 return node1->template PackMultiDimArray<T>(RobotRaconteur::rr_cast<RobotRaconteur::RRMultiDimArray<T> >(value));
342template <
typename T,
typename N>
343RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackMultiDimArrayElement(
344 RR_WEAK_PTR<N> node, MessageStringRef elementname,
const RR_INTRUSIVE_PTR<RRMultiDimArray<T> >& value)
346 return CreateMessageElement(elementname, MessageElement_PackMultiDimArray(node, value));
350RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackString(
const T& str)
356RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackStringElement(MessageStringRef elementname,
const T& str)
358 return CreateMessageElement(elementname, MessageElement_PackString(str));
361template <
typename T,
typename N>
362RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackVarType(RR_WEAK_PTR<N> node,
const RR_INTRUSIVE_PTR<T>& s)
364 RR_SHARED_PTR<N> node1 = node.lock();
366 throw InvalidOperationException(
"Node has been released");
367 return node1->PackVarType(s);
370template <
typename T,
typename N>
371RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackVarTypeElement(RR_WEAK_PTR<N> node, MessageStringRef elementname,
372 const RR_INTRUSIVE_PTR<T>& s)
374 return CreateMessageElement(elementname, MessageElement_PackVarType(node, s));
377template <
typename T,
typename N>
378RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackStruct(RR_WEAK_PTR<N> node,
const RR_INTRUSIVE_PTR<T>& s)
380 RR_SHARED_PTR<N> node1 = node.lock();
382 throw InvalidOperationException(
"Node has been released");
383 return node1->PackStructure(RobotRaconteur::rr_cast<RobotRaconteur::RRStructure>(s));
386template <
typename T,
typename N>
387RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackStructElement(RR_WEAK_PTR<N> node, MessageStringRef elementname,
388 const RR_INTRUSIVE_PTR<T>& s)
390 return CreateMessageElement(elementname, MessageElement_PackStruct(node, s));
394RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackEnum(
const T& value)
396 return RobotRaconteur::ScalarToRRArray<int32_t>(
static_cast<int32_t
>(value));
400RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackEnumElement(MessageStringRef elementname,
const T& value)
402 return CreateMessageElement(elementname, MessageElement_PackEnum(value));
405template <
typename K,
typename T,
typename N>
406RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackMap(RR_WEAK_PTR<N> node,
407 const RR_INTRUSIVE_PTR<RRMap<K, T> >& m)
409 RR_SHARED_PTR<N> node1 = node.lock();
411 throw InvalidOperationException(
"Node has been released");
412 return node1->template PackMapType<K, T>(m);
415template <
typename K,
typename T,
typename N>
416RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackMapElement(RR_WEAK_PTR<N> node, MessageStringRef elementname,
417 const RR_INTRUSIVE_PTR<RRMap<K, T> >& m)
419 return CreateMessageElement(elementname, MessageElement_PackMap(node, m));
422template <
typename T,
typename N>
423RR_INTRUSIVE_PTR<MessageElementData> MessageElement_PackList(RR_WEAK_PTR<N> node,
const RR_INTRUSIVE_PTR<RRList<T> >& m)
425 RR_SHARED_PTR<N> node1 = node.lock();
427 throw InvalidOperationException(
"Node has been released");
428 return node1->template PackListType<T>(m);
431template <
typename T,
typename N>
432RR_INTRUSIVE_PTR<MessageElement> MessageElement_PackListElement(RR_WEAK_PTR<N> node, MessageStringRef elementname,
433 const RR_INTRUSIVE_PTR<RRList<T> >& m)
435 return CreateMessageElement(elementname, MessageElement_PackList(node, m));
440T MessageElement_UnpackScalar(
const RR_INTRUSIVE_PTR<MessageElement>& m)
442 return RRArrayToScalar<T>(m->CastData<RRArray<T> >());
446RR_INTRUSIVE_PTR<RRArray<T> > MessageElement_UnpackArray(
const RR_INTRUSIVE_PTR<MessageElement>& m)
448 RR_INTRUSIVE_PTR<RRArray<T> > a = (m->CastData<RRArray<T> >());
450 throw NullValueException(
"Arrays must not be null");
454template <
typename T,
typename N>
455RR_INTRUSIVE_PTR<RRMultiDimArray<T> > MessageElement_UnpackMultiDimArray(RR_WEAK_PTR<N> node,
456 const RR_INTRUSIVE_PTR<MessageElement>& m)
458 RR_SHARED_PTR<N> node1 = node.lock();
460 throw InvalidOperationException(
"Node has been released");
461 RR_INTRUSIVE_PTR<RRMultiDimArray<T> > a = RobotRaconteur::rr_cast<RRMultiDimArray<T> >(
462 node1->template UnpackMultiDimArray<T>(m->CastDataToNestedList(DataTypes_multidimarray_t)));
464 throw NullValueException(
"Arrays must not be null");
469RR_GCC_DISABLE_WARNING(
"-Wunused-function")
471static std::
string MessageElement_UnpackString(const RR_INTRUSIVE_PTR<MessageElement>& m)
475RR_GCC_ENABLE_WARNING()
477template <typename T, typename N>
478RR_INTRUSIVE_PTR<T> MessageElement_UnpackStructure(RR_WEAK_PTR<N> node, const RR_INTRUSIVE_PTR<MessageElement>& m)
480 RR_SHARED_PTR<N> node1 = node.lock();
482 throw InvalidOperationException(
"Node has been released");
483 return RobotRaconteur::rr_cast<T>(
484 node1->UnpackStructure(m->CastData<RobotRaconteur::MessageElementNestedElementList>()));
488T MessageElement_UnpackEnum(
const RR_INTRUSIVE_PTR<MessageElement>& m)
490 return static_cast<T
>(RRArrayToScalar<int32_t>(m->CastData<RRArray<int32_t> >()));
494RR_INTRUSIVE_PTR<RRValue> MessageElement_UnpackVarValue(RR_WEAK_PTR<N> node,
const RR_INTRUSIVE_PTR<MessageElement>& m)
496 RR_SHARED_PTR<N> node1 = node.lock();
498 throw InvalidOperationException(
"Node has been released");
499 return node1->UnpackVarType(m);
502template <
typename K,
typename T,
typename N>
503RR_INTRUSIVE_PTR<RRMap<K, T> > MessageElement_UnpackMap(RR_WEAK_PTR<N> node,
const RR_INTRUSIVE_PTR<MessageElement>& m)
505 RR_SHARED_PTR<N> node1 = node.lock();
507 throw InvalidOperationException(
"Node has been released");
508 return node1->template UnpackMapType<K, T>(m->CastData<RobotRaconteur::MessageElementNestedElementList>());
511template <
typename T,
typename N>
512RR_INTRUSIVE_PTR<RRList<T> > MessageElement_UnpackList(RR_WEAK_PTR<N> node,
const RR_INTRUSIVE_PTR<MessageElement>& m)
514 RR_SHARED_PTR<N> node1 = node.lock();
516 throw InvalidOperationException(
"Node has been released");
517 return node1->template UnpackListType<T>(m->CastDataToNestedList());
520ROBOTRACONTEUR_CORE_API
bool MessageElement_GetElementNumber(
const RR_INTRUSIVE_PTR<MessageElement>& m,
522ROBOTRACONTEUR_CORE_API
void MessageElement_SetElementNumber(
const RR_INTRUSIVE_PTR<MessageElement>& m, int32_t number);
523ROBOTRACONTEUR_CORE_API
bool MessageElement_GetElementName(
const RR_INTRUSIVE_PTR<MessageElement>& m,
524 MessageStringPtr& name);
526#ifndef ROBOTRACONTEUR_NO_CXX11_TEMPLATE_ALIASES
527using MessagePtr = RR_INTRUSIVE_PTR<Message>;
528using MessageHeaderPtr = RR_INTRUSIVE_PTR<MessageHeader>;
529using MessageEntryPtr = RR_INTRUSIVE_PTR<MessageEntry>;
530using MessageElementPtr = RR_INTRUSIVE_PTR<MessageElement>;
531using MessageElementNestedElementListPtr = RR_INTRUSIVE_PTR<MessageElementNestedElementList>;
boost::intrusive_ptr< RRArray< char > > stringToRRArray(boost::string_ref str)
Convert a string to an array of characters.
std::string RRArrayToString(const boost::intrusive_ptr< RRArray< char > > &arr)
Convert an array of characters into std::string.
MessageErrorType
Message error type codes enum.
Definition RobotRaconteurConstants.h:396
DataTypes
Type codes for types supported by Robot Raconteur.
Definition RobotRaconteurConstants.h:41
MessageEntryType
Message entry type codes.
Definition RobotRaconteurConstants.h:225
Base class for types that can be stored in MessageElement.
Definition DataTypes.h:374
NodeID UUID storage and generation.
Definition NodeID.h:58
Base class for all Robot Raconteur value types (except primitives).
Definition DataTypes.h:252