#include <GIOP_Message_State.h>
Collaboration diagram for TAO_GIOP_Message_State:
Public Member Functions | |
TAO_GIOP_Message_State (void) | |
Ctor. | |
int | parse_message_header (ACE_Message_Block &incoming) |
CORBA::ULong | message_size (void) const |
Return the message size. | |
CORBA::ULong | payload_size (void) const |
Return the message size. | |
CORBA::Octet | byte_order (void) const |
Return the byte order information. | |
void | reset (void) |
Reset the state.. | |
Private Member Functions | |
int | parse_message_header_i (ACE_Message_Block &incoming) |
Parse the message header. | |
int | parse_magic_bytes (char *buf) |
int | get_version_info (char *buf) |
int | get_byte_order_info (char *buf) |
void | get_payload_size (char *buf) |
Gets the size of the payload and set the size in the . | |
CORBA::ULong | read_ulong (const char *buf) const |
Private Attributes | |
TAO_GIOP_Message_Version | giop_version_ |
CORBA::Octet | byte_order_ |
0 = big, 1 = little | |
CORBA::Octet | message_type_ |
MsgType above. | |
CORBA::ULong | message_size_ |
in byte_order! | |
CORBA::Octet | more_fragments_ |
CORBA::ULong | missing_data_ |
Missing data. | |
Friends | |
class | TAO_GIOP_Message_Base |
This helps to establish the state of the incoming messages.
Definition at line 43 of file GIOP_Message_State.h.
|
Ctor.
Definition at line 19 of file GIOP_Message_State.cpp. References TAO_DEF_GIOP_MAJOR, and TAO_DEF_GIOP_MINOR.
00020 : giop_version_ (TAO_DEF_GIOP_MAJOR, 00021 TAO_DEF_GIOP_MINOR), 00022 byte_order_ (0), 00023 message_type_ (0), 00024 message_size_ (0), 00025 more_fragments_ (0), 00026 missing_data_ (0) 00027 { 00028 } |
|
Return the byte order information.
Definition at line 23 of file GIOP_Message_State.inl.
00024 { 00025 return this->byte_order_; 00026 } |
|
Extracts the byte order information from the incoming stream. Performs a check for whether the byte order information right and sets the information in the Definition at line 169 of file GIOP_Message_State.cpp. References ACE_DEBUG, ACE_TEXT, giop_version_, LM_DEBUG, TAO_GIOP_Message_Version::major, TAO_GIOP_Message_Version::minor, and TAO_debug_level. Referenced by parse_message_header_i().
00170 { 00171 if (TAO_debug_level > 8) 00172 { 00173 ACE_DEBUG ((LM_DEBUG, 00174 ACE_TEXT ("TAO (%P|%t) - GIOP_Message_State::get_byte_order_info\n") )); 00175 } 00176 00177 // Let us be specific that this is for 1.0 00178 if (this->giop_version_.minor == 0 && 00179 this->giop_version_.major == 1) 00180 { 00181 this->byte_order_ = 00182 buf[TAO_GIOP_MESSAGE_FLAGS_OFFSET]; 00183 00184 if (this->byte_order_ != 0 && 00185 this->byte_order_ != 1) 00186 { 00187 if (TAO_debug_level > 2) 00188 { 00189 ACE_DEBUG ((LM_DEBUG, 00190 ACE_TEXT ("TAO (%P|%t) - GIOP_Message_State::get_byte_order_info, ") 00191 ACE_TEXT ("invalid byte order <%d> for version <1.0>\n"), 00192 this->byte_order_)); 00193 } 00194 return -1; 00195 } 00196 } 00197 else 00198 { 00199 // Read the byte ORDER 00200 this->byte_order_ = 00201 (CORBA::Octet) (buf[TAO_GIOP_MESSAGE_FLAGS_OFFSET]& 0x01); 00202 00203 // Read the fragment bit 00204 this->more_fragments_ = 00205 (CORBA::Octet) (buf[TAO_GIOP_MESSAGE_FLAGS_OFFSET]& 0x02); 00206 00207 if ((buf[TAO_GIOP_MESSAGE_FLAGS_OFFSET] & ~0x3) != 0) 00208 { 00209 if (TAO_debug_level > 2) 00210 { 00211 ACE_DEBUG ((LM_DEBUG, 00212 ACE_TEXT ("TAO (%P|%t) - invalid flags for <%d> ") 00213 ACE_TEXT ("for version <%d %d> \n"), 00214 buf[TAO_GIOP_MESSAGE_FLAGS_OFFSET], 00215 this->giop_version_.major, 00216 this->giop_version_.minor)); 00217 } 00218 return -1; 00219 } 00220 } 00221 00222 return 0; 00223 } |
|
Gets the size of the payload and set the size in the .
Definition at line 226 of file GIOP_Message_State.cpp. References read_ulong(). Referenced by parse_message_header_i().
00227 { 00228 // Move the read pointer 00229 rd_ptr += TAO_GIOP_MESSAGE_SIZE_OFFSET; 00230 00231 this->message_size_ = this->read_ulong (rd_ptr); 00232 } |
|
Extracts the version information from the incoming stream. Performs a check for whether the version information is right and sets the information in the Definition at line 132 of file GIOP_Message_State.cpp. References ACE_DEBUG, ACE_TEXT, TAO_GIOP_Message_Generator_Parser_Impl::check_revision(), giop_version_, LM_DEBUG, TAO_GIOP_Message_Version::major, TAO_GIOP_Message_Version::minor, and TAO_debug_level. Referenced by parse_message_header_i().
00133 { 00134 if (TAO_debug_level > 8) 00135 { 00136 ACE_DEBUG ((LM_DEBUG, 00137 "TAO (%P|%t) - GIOP_Message_State::get_version_info\n")); 00138 } 00139 00140 // We have a GIOP message on hand. Get its revision numbers 00141 CORBA::Octet incoming_major = 00142 buf[TAO_GIOP_VERSION_MAJOR_OFFSET]; 00143 CORBA::Octet incoming_minor = 00144 buf[TAO_GIOP_VERSION_MINOR_OFFSET]; 00145 00146 // Check the revision information 00147 if (TAO_GIOP_Message_Generator_Parser_Impl::check_revision ( 00148 incoming_major, 00149 incoming_minor) == 0) 00150 { 00151 if (TAO_debug_level > 0) 00152 { 00153 ACE_DEBUG ((LM_DEBUG, 00154 ACE_TEXT ("TAO (%P|%t) - bad version <%d.%d>\n"), 00155 incoming_major, incoming_minor)); 00156 } 00157 00158 return -1; 00159 } 00160 00161 // Set the version 00162 this->giop_version_.minor = incoming_minor; 00163 this->giop_version_.major = incoming_major; 00164 00165 return 0; 00166 } |
|
Return the message size.
Definition at line 8 of file GIOP_Message_State.inl. Referenced by TAO_GIOP_Message_Base::consolidate_node(), TAO_GIOP_Message_Base::extract_next_message(), and TAO_GIOP_Message_Base::parse_next_message().
00009 { 00010 CORBA::ULong len = 00011 this->message_size_ + TAO_GIOP_MESSAGE_HEADER_LEN; 00012 00013 return len; 00014 } |
|
Checks for the magic word 'GIOP' in the start of the incoing stream Definition at line 107 of file GIOP_Message_State.cpp. References ACE_DEBUG, ACE_TEXT, LM_DEBUG, and TAO_debug_level. Referenced by parse_message_header_i().
00108 { 00109 // The values are hard-coded to support non-ASCII platforms. 00110 if (!(buf [0] == 0x47 // 'G' 00111 && buf [1] == 0x49 // 'I' 00112 && buf [2] == 0x4f // 'O' 00113 && buf [3] == 0x50)) // 'P' 00114 { 00115 if (TAO_debug_level > 0) 00116 ACE_DEBUG ((LM_DEBUG, 00117 ACE_TEXT ("TAO (%P|%t) - ") 00118 ACE_TEXT ("TAO_GIOP_Message_State::parse_magic_bytes, ") 00119 ACE_TEXT ("bad header: ") 00120 ACE_TEXT ("magic word [%02x,%02x,%02x,%02x]\n"), 00121 buf[0], 00122 buf[1], 00123 buf[2], 00124 buf[3])); 00125 return -1; 00126 } 00127 00128 return 0; 00129 } |
|
Parse the message header.
Definition at line 32 of file GIOP_Message_State.cpp. References ACE_Message_Block::length(), and parse_message_header_i(). Referenced by TAO_GIOP_Message_Base::consolidate_node(), TAO_GIOP_Message_Base::extract_next_message(), TAO_GIOP_Message_Base::parse_incoming_messages(), and TAO_GIOP_Message_Base::parse_next_message().
00033 { 00034 if (incoming.length () >= TAO_GIOP_MESSAGE_HEADER_LEN) 00035 { 00036 // Parse the GIOP header 00037 return this->parse_message_header_i (incoming); 00038 } 00039 00040 // One indicates that we didn't have enough data in the message to 00041 // parse the header 00042 return 1; 00043 } |
|
Parse the message header.
Definition at line 46 of file GIOP_Message_State.cpp. References ACE_DEBUG, get_byte_order_info(), get_payload_size(), get_version_info(), LM_DEBUG, parse_magic_bytes(), ACE_Message_Block::rd_ptr(), TAO_debug_level, and TAO_GIOP_MESSAGERROR. Referenced by parse_message_header().
00047 { 00048 if (TAO_debug_level > 8) 00049 { 00050 ACE_DEBUG ((LM_DEBUG, 00051 "TAO (%P|%t) - GIOP_Message_State::parse_message_header_i\n" 00052 )); 00053 } 00054 00055 // Grab the rd_ptr_ from the message block.. 00056 char *buf = incoming.rd_ptr (); 00057 00058 // Parse the magic bytes first 00059 if (this->parse_magic_bytes (buf) == -1) 00060 { 00061 return -1; 00062 } 00063 00064 // Get the version information 00065 if (this->get_version_info (buf) == -1) 00066 return -1; 00067 00068 // Get the byte order information... 00069 if (this->get_byte_order_info (buf) == -1) 00070 return -1; 00071 00072 // Get the message type 00073 this->message_type_ = buf[TAO_GIOP_MESSAGE_TYPE_OFFSET]; 00074 00075 // Get the size of the message.. 00076 this->get_payload_size (buf); 00077 00078 if (this->message_size_ == 0) 00079 { 00080 if (this->message_type_ == TAO_GIOP_MESSAGERROR) 00081 { 00082 if (TAO_debug_level > 0) 00083 { 00084 ACE_DEBUG ((LM_DEBUG, 00085 "TAO (%P|%t) -" 00086 "GIOP_MESSAGE_ERROR received \n")); 00087 } 00088 return 0; 00089 } 00090 else 00091 { 00092 if (TAO_debug_level > 0) 00093 ACE_DEBUG ((LM_DEBUG, 00094 "TAO (%P|%t) - " 00095 "Message of size zero recd. \n")); 00096 return -1; 00097 } 00098 } 00099 00100 return 0; // success 00101 } |
|
Return the message size.
Definition at line 17 of file GIOP_Message_State.inl. Referenced by TAO_GIOP_Message_Base::consolidate_node(), and TAO_GIOP_Message_Base::parse_next_message().
00018 { 00019 return this->message_size_; 00020 } |
|
Read the unsigned long from the buffer. The should just point to the next 4 bytes data that represent the ULong Definition at line 235 of file GIOP_Message_State.cpp. References ACE_CDR_BYTE_ORDER, and ACE_CDR::swap_4(). Referenced by get_payload_size().
00236 { 00237 CORBA::ULong x = 0; 00238 00239 // We don't need to do this sort of copy. But some compilers (read it 00240 // as SunCC) have a problem in deferencing from the 00241 // reinterpret_cast pointer of the <rd_ptr>, as the <rd_ptr> can be 00242 // on stack. So let us go ahead with this copying... 00243 char buf[] = 00244 { 00245 *rd_ptr, 00246 *(rd_ptr + 1), 00247 *(rd_ptr + 2), 00248 *(rd_ptr + 3) 00249 }; 00250 00251 #if !defined (ACE_DISABLE_SWAP_ON_READ) 00252 if (!(this->byte_order_ != ACE_CDR_BYTE_ORDER)) 00253 { 00254 x = *reinterpret_cast<ACE_CDR::ULong*> (buf); 00255 } 00256 else 00257 { 00258 ACE_CDR::swap_4 (buf, reinterpret_cast<char*> (&x)); 00259 } 00260 #else 00261 x = *reinterpret_cast<ACE_CDR::ULong*> (buf); 00262 #endif /* ACE_DISABLE_SWAP_ON_READ */ 00263 00264 return x; 00265 } |
|
Reset the state..
Definition at line 29 of file GIOP_Message_State.inl. References missing_data_. Referenced by TAO_GIOP_Message_Base::parse_incoming_messages().
00030 { 00031 this->message_type_ = 0; 00032 this->message_size_ = 0; 00033 this->more_fragments_ = 0; 00034 this->missing_data_ = 0; 00035 } |
|
Definition at line 72 of file GIOP_Message_State.h. |
|
0 = big, 1 = little
Definition at line 103 of file GIOP_Message_State.h. Referenced by TAO_GIOP_Message_Base::init_queued_data(). |
|
Definition at line 100 of file GIOP_Message_State.h. Referenced by get_byte_order_info(), get_version_info(), and TAO_GIOP_Message_Base::init_queued_data(). |
|
in byte_order!
Definition at line 109 of file GIOP_Message_State.h. |
|
MsgType above.
Definition at line 106 of file GIOP_Message_State.h. Referenced by TAO_GIOP_Message_Base::message_type(). |
|
Missing data.
Definition at line 118 of file GIOP_Message_State.h. Referenced by reset(). |
|
(Requests and Replys) A value of zero indicates that this message does not have any fragments. A value of non-zero indicates that it does have fragments. Definition at line 115 of file GIOP_Message_State.h. Referenced by TAO_GIOP_Message_Base::init_queued_data(). |