#include <ace/CDR.h>
class ACE_InputCDR {
public:
ACE_InputCDR ( const char *buf, size_t bufsiz, int byte_order = ACE_CDR_BYTE_ORDER );
ACE_InputCDR (size_t bufsiz, int byte_order = ACE_CDR_BYTE_ORDER);
ACE_InputCDR ( const ACE_Message_Block *data, int byte_order = ACE_CDR_BYTE_ORDER );
ACE_InputCDR ( ACE_Data_Block *data, int byte_order = ACE_CDR_BYTE_ORDER );
ACE_InputCDR (const ACE_InputCDR& rhs);
ACE_InputCDR& operator= (const ACE_InputCDR& rhs);
ACE_InputCDR ( const ACE_InputCDR& rhs, size_t size, ACE_CDR::Long offset );
ACE_InputCDR (const ACE_InputCDR& rhs, size_t size);
ACE_InputCDR ( const ACE_OutputCDR& rhs, ACE_Allocator* buffer_allocator = 0, ACE_Allocator* data_block_allocator = 0 );
~ACE_InputCDR (void);
struct ACE_Export to_boolean {
public:
to_boolean (ACE_CDR::Boolean &b);
ACE_CDR::Boolean &ref_;
};
ACE_CDR::Boolean read_boolean (ACE_CDR::Boolean& x);
ACE_CDR::Boolean read_char (ACE_CDR::Char &x);
ACE_CDR::Boolean read_wchar (ACE_CDR::WChar& x);
ACE_CDR::Boolean read_octet (ACE_CDR::Octet& x);
ACE_CDR::Boolean read_short (ACE_CDR::Short &x);
ACE_CDR::Boolean read_ushort (ACE_CDR::UShort &x);
ACE_CDR::Boolean read_long (ACE_CDR::Long &x);
ACE_CDR::Boolean read_ulong (ACE_CDR::ULong &x);
ACE_CDR::Boolean read_longlong (ACE_CDR::LongLong& x);
ACE_CDR::Boolean read_ulonglong (ACE_CDR::ULongLong& x);
ACE_CDR::Boolean read_float (ACE_CDR::Float &x);
ACE_CDR::Boolean read_double (ACE_CDR::Double &x);
ACE_CDR::Boolean read_longdouble (ACE_CDR::LongDouble &x);
ACE_CDR::Boolean read_string (ACE_CDR::Char *&x);
ACE_CDR::Boolean read_string (ACE_CString &x);
ACE_CDR::Boolean read_wstring (ACE_CDR::WChar*& x);
ACE_CDR::Boolean read_boolean_array (
ACE_CDR::Boolean* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_char_array (
ACE_CDR::Char *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_wchar_array (
ACE_CDR::WChar* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_octet_array (
ACE_CDR::Octet* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_short_array (
ACE_CDR::Short *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_ushort_array (
ACE_CDR::UShort *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_long_array (
ACE_CDR::Long *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_ulong_array (
ACE_CDR::ULong *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_longlong_array (
ACE_CDR::LongLong* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_ulonglong_array (
ACE_CDR::ULongLong* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_float_array (
ACE_CDR::Float *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_double_array (
ACE_CDR::Double *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_longdouble_array (
ACE_CDR::LongDouble* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean skip_boolean (void);
ACE_CDR::Boolean skip_char (void);
ACE_CDR::Boolean skip_wchar (void);
ACE_CDR::Boolean skip_octet (void);
ACE_CDR::Boolean skip_short (void);
ACE_CDR::Boolean skip_ushort (void);
ACE_CDR::Boolean skip_long (void);
ACE_CDR::Boolean skip_ulong (void);
ACE_CDR::Boolean skip_longlong (void);
ACE_CDR::Boolean skip_ulonglong (void);
ACE_CDR::Boolean skip_float (void);
ACE_CDR::Boolean skip_double (void);
ACE_CDR::Boolean skip_longdouble (void);
ACE_CDR::Boolean skip_wstring (void);
ACE_CDR::Boolean skip_string (void);
ACE_CDR::Boolean skip_bytes (size_t n);
int good_bit (void) const;
const ACE_Message_Block* start (void) const;
char* rd_ptr (void);
size_t length (void) const;
int align_read_ptr (size_t alignment);
int do_byte_swap (void) const;
protected:
ACE_Message_Block start_;
int do_byte_swap_;
int good_bit_;
private:
ACE_CDR::Boolean read_1 (ACE_CDR::Octet *x);
ACE_CDR::Boolean read_2 (ACE_CDR::UShort *x);
ACE_CDR::Boolean read_4 (ACE_CDR::ULong *x);
ACE_CDR::Boolean read_8 (ACE_CDR::ULongLong *x);
ACE_CDR::Boolean read_16 (ACE_CDR::LongDouble *x);
ACE_CDR::Boolean read_array (
void* x,
size_t size,
size_t align,
ACE_CDR::ULong length
);
void rd_ptr (size_t offset);
char* end (void);
int adjust (size_t size, char *&buf);
int adjust (size_t size, size_t align, char *&buf);
};
This implementation assumes that the native numeric representation is two's complement for integers, IEEE single/double for floats. Also that characters are in ISO Latin/1.
Note that CDR itself makes no such assumptions, but this implementation makes such assumptions for reasons of efficiency. Careful enhancements could preserve that efficiency where the assumptions are true, yet still allow the code to work when they aren't true.
The implementation expects that buffers are aligned according to the strongest CDR alignment restriction.
NOTE: this does everything "CDR 1.1" does ... that is, it supports the five extended OMG-IDL data types in UNO Appendix A, which provide richer arithmetic types (64 bit integers, "quad precision" FP) and UNICODE-based characters and strings. Those types are not standard parts of OMG-IDL at this time.
THREADING NOTE: CDR data structures must be protected against concurrent access by their owning thread.
ACE_CDR::Boolean read_boolean (ACE_CDR::Boolean& x);
ACE_CDR::Boolean read_char (ACE_CDR::Char &x);
ACE_CDR::Boolean read_wchar (ACE_CDR::WChar& x);
ACE_CDR::Boolean read_octet (ACE_CDR::Octet& x);
ACE_CDR::Boolean read_short (ACE_CDR::Short &x);
ACE_CDR::Boolean read_ushort (ACE_CDR::UShort &x);
ACE_CDR::Boolean read_long (ACE_CDR::Long &x);
ACE_CDR::Boolean read_ulong (ACE_CDR::ULong &x);
ACE_CDR::Boolean read_longlong (ACE_CDR::LongLong& x);
ACE_CDR::Boolean read_ulonglong (ACE_CDR::ULongLong& x);
ACE_CDR::Boolean read_float (ACE_CDR::Float &x);
ACE_CDR::Boolean read_double (ACE_CDR::Double &x);
ACE_CDR::Boolean read_longdouble (ACE_CDR::LongDouble &x);
ACE_CDR::Boolean read_string (ACE_CDR::Char *&x);
ACE_CDR::Boolean read_string (ACE_CString &x);
ACE_CDR::Boolean read_wstring (ACE_CDR::WChar*& x);
x
must be large enough to contain length
elements.
They return -1 on failure and 0 on success.
ACE_CDR::Boolean read_boolean_array (
ACE_CDR::Boolean* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_char_array (
ACE_CDR::Char *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_wchar_array (
ACE_CDR::WChar* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_octet_array (
ACE_CDR::Octet* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_short_array (
ACE_CDR::Short *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_ushort_array (
ACE_CDR::UShort *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_long_array (
ACE_CDR::Long *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_ulong_array (
ACE_CDR::ULong *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_longlong_array (
ACE_CDR::LongLong* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_ulonglong_array (
ACE_CDR::ULongLong* x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_float_array (
ACE_CDR::Float *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_double_array (
ACE_CDR::Double *x,
ACE_CDR::ULong length
);
ACE_CDR::Boolean read_longdouble_array (
ACE_CDR::LongDouble* x,
ACE_CDR::ULong length
);
gokhale@cs.wustl.edu
and Carlos O'Ryan coryan@cs.wustl.edu
for TAO. ACE version by Jeff Parsons parsons@cs.wustl.edu
and Istvan Buki istvan.buki@euronet.be
.