TAO_ECG_CDR_Message_Receiver::Mcast_Header Struct Reference

Helper for decoding, validating and storing mcast header. More...

#include <ECG_CDR_Message_Receiver.h>

List of all members.

Public Member Functions

int read (char *header, size_t bytes_received, CORBA::Boolean checkcrc=0)

Public Attributes

int byte_order
CORBA::ULong request_id
CORBA::ULong request_size
CORBA::ULong fragment_size
CORBA::ULong fragment_offset
CORBA::ULong fragment_id
CORBA::ULong fragment_count
CORBA::ULong crc


Detailed Description

Helper for decoding, validating and storing mcast header.

Definition at line 240 of file ECG_CDR_Message_Receiver.h.


Member Function Documentation

int TAO_ECG_CDR_Message_Receiver::Mcast_Header::read ( char *  header,
size_t  bytes_received,
CORBA::Boolean  checkcrc = 0 
)

Definition at line 530 of file ECG_CDR_Message_Receiver.cpp.

References ACE_ERROR_RETURN, ACE_NTOHL, byte_order, crc, TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE, LM_ERROR, ACE_InputCDR::read_boolean(), ACE_InputCDR::read_octet(), ACE_InputCDR::read_octet_array(), and ACE_InputCDR::read_ulong().

Referenced by TAO_ECG_CDR_Message_Receiver::handle_input().

00533 {
00534   // Decode.
00535   this->byte_order = header[0];
00536   if(this->byte_order != 0 && this->byte_order != 1)
00537     {
00538       ACE_ERROR_RETURN ((LM_ERROR, "Reading mcast packet header: byte "
00539                                    "order is neither 0 nor 1, it is %d.\n",
00540                          this->byte_order),
00541                         -1);
00542     }
00543 
00544   TAO_InputCDR header_cdr (header,
00545                            TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE,
00546                            byte_order);
00547   CORBA::Boolean unused;
00548   CORBA::Octet a, b, c;
00549   if (!header_cdr.read_boolean (unused)
00550       || !header_cdr.read_octet (a)
00551       || !header_cdr.read_octet (b)
00552       || !header_cdr.read_octet (c)
00553       || a != 'A' || b != 'B' || c != 'C')
00554     {
00555       ACE_ERROR_RETURN ((LM_ERROR, "Error reading magic bytes "
00556                                    "in mcast packet header.\n"),
00557                         -1);
00558     }
00559 
00560   if (!header_cdr.read_ulong (this->request_id)
00561       || !header_cdr.read_ulong (this->request_size)
00562       || !header_cdr.read_ulong (this->fragment_size)
00563       || !header_cdr.read_ulong (this->fragment_offset)
00564       || !header_cdr.read_ulong (this->fragment_id)
00565       || !header_cdr.read_ulong (this->fragment_count))
00566     {
00567       ACE_ERROR_RETURN ((LM_ERROR,
00568                         "Error decoding mcast packet header.\n"),
00569                         -1);
00570     }
00571 
00572   if (checkcrc)
00573     {
00574       CORBA::Octet padding[4];
00575       header_cdr.read_octet_array (padding, 4);
00576 
00577       unsigned char *crcparts = (unsigned char *)(&this->crc);
00578 
00579       for (int cnt=0; cnt != 4; ++cnt)
00580         {
00581           crcparts[cnt] = padding[cnt];
00582         }
00583 
00584       this->crc = ACE_NTOHL (this->crc);
00585     }
00586 
00587   // Validate.
00588   size_t const data_bytes_received =
00589     bytes_received - TAO_ECG_CDR_Message_Sender::ECG_HEADER_SIZE;
00590 
00591   if (this->request_size < this->fragment_size
00592       || this->fragment_offset >= this->request_size
00593       || this->fragment_id >= this->fragment_count
00594       || (this->fragment_count == 1
00595           && (this->fragment_size != this->request_size
00596               || this->request_size != data_bytes_received)))
00597     {
00598       ACE_ERROR_RETURN ((LM_ERROR,
00599                         "Invalid mcast fragment: "
00600                         "inconsistent header fields.\n"),
00601                         -1);
00602     }
00603 
00604   return 0;
00605 }


Member Data Documentation

int TAO_ECG_CDR_Message_Receiver::Mcast_Header::byte_order

Definition at line 242 of file ECG_CDR_Message_Receiver.h.

Referenced by TAO_ECG_CDR_Message_Receiver::handle_input(), TAO_ECG_CDR_Message_Receiver::process_fragment(), and read().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Mcast_Header::crc

Definition at line 249 of file ECG_CDR_Message_Receiver.h.

Referenced by TAO_ECG_CDR_Message_Receiver::handle_input(), and read().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Mcast_Header::fragment_count

Definition at line 248 of file ECG_CDR_Message_Receiver.h.

Referenced by TAO_ECG_CDR_Message_Receiver::handle_input(), and TAO_ECG_CDR_Message_Receiver::process_fragment().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Mcast_Header::fragment_id

Definition at line 247 of file ECG_CDR_Message_Receiver.h.

Referenced by TAO_ECG_CDR_Message_Receiver::process_fragment().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Mcast_Header::fragment_offset

Definition at line 246 of file ECG_CDR_Message_Receiver.h.

Referenced by TAO_ECG_CDR_Message_Receiver::process_fragment().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Mcast_Header::fragment_size

Definition at line 245 of file ECG_CDR_Message_Receiver.h.

Referenced by TAO_ECG_CDR_Message_Receiver::process_fragment().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Mcast_Header::request_id

Definition at line 243 of file ECG_CDR_Message_Receiver.h.

Referenced by TAO_ECG_CDR_Message_Receiver::handle_input(), and TAO_ECG_CDR_Message_Receiver::process_fragment().

CORBA::ULong TAO_ECG_CDR_Message_Receiver::Mcast_Header::request_size

Definition at line 244 of file ECG_CDR_Message_Receiver.h.

Referenced by TAO_ECG_CDR_Message_Receiver::handle_input(), and TAO_ECG_CDR_Message_Receiver::process_fragment().


The documentation for this struct was generated from the following files:
Generated on Tue Feb 2 17:44:38 2010 for TAO_RTEvent by  doxygen 1.4.7