OpenRTM-aist  2.1.0
CORBA_CdrMemoryStream.h
Go to the documentation of this file.
1 // -*- C++ -*-
20 #ifndef RTC_CORBA_CDRMEMORYSTREAM_H
21 #define RTC_CORBA_CDRMEMORYSTREAM_H
22 
23 #include <rtm/RTC.h>
24 #include <rtm/idl/DataPort_OpenRTMSkel.h>
25 #include <rtm/ByteDataStreamBase.h>
26 
27 
28 
43 namespace RTC
44 {
66  {
67  public:
83 
105  template<class ExDataType>
106  bool serializeCDR(const ExDataType& data)
107  {
108 #ifdef ORB_IS_ORBEXPRESS
109  try
110  {
111  m_cdr.rewind();
112  m_cdr.is_little_endian(m_endian);
113  m_cdr << data;
114  return true;
115  }
116  catch (...)
117  {
118  return false;
119  }
120 #elif defined(ORB_IS_TAO)
121  try
122  {
123  m_cdr.reset();
124  m_cdr << data;
125  return true;
126  }
127  catch (...)
128  {
129  return false;
130  }
131 #else
132  try
133  {
134  m_cdr.rewindPtrs();
135  m_cdr.setByteSwapFlag(m_endian);
136  data >>= m_cdr;
137  return true;
138  }
139  catch (...)
140  {
141  return false;
142  }
143 #endif
144  }
145 
165  template<class ExDataType>
166  bool deserializeCDR(ExDataType& data)
167  {
168 #ifdef ORB_IS_ORBEXPRESS
169  try
170  {
171  m_cdr >> data;
172  return true;
173  }
174  catch (...)
175  {
176  return false;
177  }
178 #elif defined(ORB_IS_TAO)
179  try
180  {
181  TAO_InputCDR tao_cdr = TAO_InputCDR(m_cdr);
182  tao_cdr >> data;
183  return true;
184  }
185  catch (...)
186  {
187  return false;
188  }
189 #else
190  try
191  {
192  data <<= m_cdr;
193  return true;
194  }
195  catch (...)
196  {
197  return false;
198  }
199 #endif
200  }
201 
219  void setEndian(bool little_endian);
220 
238  const unsigned char* getBuffer();
256  unsigned long getCdrDataLength() const;
257 
275 #ifdef ORB_IS_ORBEXPRESS
276  CORBA::Stream& getCdr();
277 #elif defined(ORB_IS_TAO)
278  TAO_OutputCDR& getCdr();
279 #else
280  cdrMemoryStream& getCdr();
281 #endif
282 
302  void writeCdrData(const unsigned char* buffer, unsigned long length);
303 
323  void readCdrData(unsigned char* buffer, unsigned long length) const;
324 
339  {
340 #ifdef ORB_IS_ORBEXPRESS
341  m_cdr.copy(rhs.m_cdr);
342 #elif defined(ORB_IS_TAO)
343  for (const ACE_Message_Block *i = rhs.m_cdr.begin(); i != nullptr; i = i->cont())
344  {
345  m_cdr.write_octet_array_mb(i);
346  }
347 #else
348  m_cdr = rhs.m_cdr;
349 #endif
350  }
351 
352 
369  {
370 #ifdef ORB_IS_ORBEXPRESS
371  m_cdr.copy(rhs.m_cdr);
372  return *this;
373 #elif defined(ORB_IS_TAO)
374  for (const ACE_Message_Block *i = rhs.m_cdr.begin(); i != nullptr; i = i->cont())
375  {
376  m_cdr.write_octet_array_mb(i);
377  }
378  return *this;
379 #else
380  m_cdr = rhs.m_cdr;
381  return *this;
382 #endif
383  }
384 
385  protected:
386 #ifdef ORB_IS_ORBEXPRESS
387  CORBA::Stream m_cdr;
388 #elif defined(ORB_IS_TAO)
389  TAO_OutputCDR m_cdr;
390 #else
391  cdrMemoryStream m_cdr;
392 #endif
393  bool m_endian{true};
394  };
414  template <class DataType>
415  class CORBA_CdrSerializer : public ByteDataStream<DataType>
416  {
417  public:
432  CORBA_CdrSerializer() = default;
433 
449  ~CORBA_CdrSerializer() override = default;
450 
464  void init(const coil::Properties& /*prop*/) override
465  {
466  }
483  void writeData(const unsigned char* buffer, unsigned long length) override
484  {
485  m_cdr.writeCdrData(buffer, length);
486  }
487 
504  void readData(unsigned char* buffer, unsigned long length) const override
505  {
506  m_cdr.readCdrData(buffer, length);
507  }
508 
522  unsigned long getDataLength() const override
523  {
524  return m_cdr.getCdrDataLength();
525  }
526 
542  bool serialize(const DataType& data) override
543  {
544  return m_cdr.serializeCDR(data);
545  }
546 
560  bool deserialize(DataType& data) override
561  {
562  return m_cdr.deserializeCDR(data);
563  }
564 
579  {
580  m_cdr = rhs.m_cdr;
581  }
582 
599  {
600  m_cdr = rhs.m_cdr;
601  return *this;
602  }
603 
617  void isLittleEndian(bool little_endian) override
618  {
619  m_cdr.setEndian(little_endian);
620  }
621  protected:
623 
624 
625  };
626 
627 
628 
629 
630 
631 } // namespace RTC
632 
633 
634 
635 
636 
637 
649 template <class DataType>
651 {
652  ::RTC::addSerializer<DataType, ::RTC::CORBA_CdrSerializer<DataType>>("cdr");
653 }
654 
655 
656 
657 
658 
659 #endif // RTC_CORBA_CDRMEMORYSTREAM_H
Data Stream Buffer Base class.
void CdrMemoryStreamInit()
Definition: CORBA_CdrMemoryStream.h:650
RTComponent header.
Definition: ByteDataStreamBase.h:200
Definition: CORBA_CdrMemoryStream.h:66
cdrMemoryStream m_cdr
Definition: CORBA_CdrMemoryStream.h:391
void writeCdrData(const unsigned char *buffer, unsigned long length)
cdrMemoryStream & getCdr()
unsigned long getCdrDataLength() const
const unsigned char * getBuffer()
void readCdrData(unsigned char *buffer, unsigned long length) const
bool m_endian
Definition: CORBA_CdrMemoryStream.h:393
bool serializeCDR(const ExDataType &data)
Definition: CORBA_CdrMemoryStream.h:106
CORBA_CdrMemoryStream & operator=(const CORBA_CdrMemoryStream &rhs)
Definition: CORBA_CdrMemoryStream.h:368
void setEndian(bool little_endian)
CORBA_CdrMemoryStream()
Constructor.
bool deserializeCDR(ExDataType &data)
Definition: CORBA_CdrMemoryStream.h:166
CORBA_CdrMemoryStream(const CORBA_CdrMemoryStream &rhs)
Definition: CORBA_CdrMemoryStream.h:338
Definition: CORBA_CdrMemoryStream.h:416
~CORBA_CdrSerializer() override=default
Virtual destractor.
void isLittleEndian(bool little_endian) override
Definition: CORBA_CdrMemoryStream.h:617
CORBA_CdrMemoryStream m_cdr
Definition: CORBA_CdrMemoryStream.h:622
bool serialize(const DataType &data) override
Definition: CORBA_CdrMemoryStream.h:542
bool deserialize(DataType &data) override
Definition: CORBA_CdrMemoryStream.h:560
CORBA_CdrSerializer()=default
Constructor.
unsigned long getDataLength() const override
Definition: CORBA_CdrMemoryStream.h:522
CORBA_CdrSerializer< DataType > & operator=(const CORBA_CdrSerializer< DataType > &rhs)
Definition: CORBA_CdrMemoryStream.h:598
void init(const coil::Properties &) override
Definition: CORBA_CdrMemoryStream.h:464
CORBA_CdrSerializer(const CORBA_CdrSerializer< DataType > &rhs)
Definition: CORBA_CdrMemoryStream.h:578
void readData(unsigned char *buffer, unsigned long length) const override
Definition: CORBA_CdrMemoryStream.h:504
void writeData(const unsigned char *buffer, unsigned long length) override
Definition: CORBA_CdrMemoryStream.h:483
RT-Component.
coil::Properties Properties
Definition: RTC.h:72