Implementation for GIOP v1.2. More...
#include <GIOP_Message_Generator_Parser_12.h>
Public Member Functions | |
virtual bool | write_request_header (const TAO_Operation_Details &opdetails, TAO_Target_Specification &spec, TAO_OutputCDR &msg) |
Write the request header in to msg. | |
virtual bool | write_locate_request_header (CORBA::ULong request_id, TAO_Target_Specification &spec, TAO_OutputCDR &msg) |
Write the LocateRequest header. | |
virtual bool | write_reply_header (TAO_OutputCDR &output, TAO_Pluggable_Reply_Params_Base &reply) |
Write the reply header in to output. | |
virtual bool | write_locate_reply_mesg (TAO_OutputCDR &output, CORBA::ULong request_id, TAO_GIOP_Locate_Status_Msg &status) |
Writes the locate _reply message in to the output. | |
virtual bool | write_fragment_header (TAO_OutputCDR &cdr, CORBA::ULong request_id) |
virtual int | parse_request_header (TAO_ServerRequest &) |
virtual int | parse_locate_header (TAO_GIOP_Locate_Request_Header &) |
virtual int | parse_reply (TAO_InputCDR &input, TAO_Pluggable_Reply_Params ¶ms) |
Parse the reply message. | |
virtual int | parse_locate_reply (TAO_InputCDR &input, TAO_Pluggable_Reply_Params ¶ms) |
Parse the locate reply message. | |
virtual CORBA::Octet | major_version (void) const |
Our versions. | |
virtual CORBA::Octet | minor_version (void) const |
virtual bool | is_ready_for_bidirectional (void) const |
virtual size_t | fragment_header_length (void) const |
The header length of a fragment. | |
Private Member Functions | |
bool | marshall_target_spec (TAO_Target_Specification &spec, TAO_OutputCDR &msg) |
Marshall the TargetSpecification. |
Implementation for GIOP v1.2.
Definition at line 36 of file GIOP_Message_Generator_Parser_12.h.
size_t TAO_GIOP_Message_Generator_Parser_12::fragment_header_length | ( | void | ) | const [virtual] |
The header length of a fragment.
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 508 of file GIOP_Message_Generator_Parser_12.cpp.
{ return TAO_GIOP_MESSAGE_FRAGMENT_HEADER; }
bool TAO_GIOP_Message_Generator_Parser_12::is_ready_for_bidirectional | ( | void | ) | const [virtual] |
Is the messaging object ready for processing BiDirectional request/response?
Reimplemented from TAO_GIOP_Message_Generator_Parser.
Definition at line 399 of file GIOP_Message_Generator_Parser_12.cpp.
{ // We do support bidirectional return true; }
CORBA::Octet TAO_GIOP_Message_Generator_Parser_12::major_version | ( | void | ) | const [virtual] |
Our versions.
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 386 of file GIOP_Message_Generator_Parser_12.cpp.
{ return static_cast<CORBA::Octet> (1); }
bool TAO_GIOP_Message_Generator_Parser_12::marshall_target_spec | ( | TAO_Target_Specification & | spec, | |
TAO_OutputCDR & | msg | |||
) | [private] |
Marshall the TargetSpecification.
This method may be required for other GIOP version coming out later than 1.2. We need to share this method
Definition at line 406 of file GIOP_Message_Generator_Parser_12.cpp.
{ switch (spec.specifier ()) { case TAO_Target_Specification::Key_Addr: { // As this is a union send in the discriminant first if (!(msg << GIOP::KeyAddr)) return false; // Get the object key const TAO::ObjectKey *key = spec.object_key (); if (key) { // Marshall in the object key if (!(msg << *key)) return false; } else { if (TAO_debug_level) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%N |%l) Unable to handle this request\n"))); } return false; } break; } case TAO_Target_Specification::Profile_Addr: { // As this is a union send in the discriminant first if (!(msg << GIOP::ProfileAddr)) return false; // Get the profile const IOP::TaggedProfile *pfile = spec.profile (); if (pfile) { // Marshall in the object key if (!(msg << *pfile)) return false; } else { if (TAO_debug_level) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%N |%l) Unable to handle this request\n"))); } return false; } break; } case TAO_Target_Specification::Reference_Addr: { // As this is a union send in the discriminant first if (!(msg << GIOP::ReferenceAddr)) return false; // Get the IOR IOP::IOR *ior = 0; CORBA::ULong const index = spec.iop_ior (ior); if (ior) { // This is a struct IORAddressingInfo. So, marshall each // member of the struct one after another in the order // defined. if (!(msg << index)) return false; if (!(msg << *ior)) return false;; } else { if (TAO_debug_level) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%N |%l) Unable to handle this request\n"))); } return false; } break; } default: if (TAO_debug_level) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%N |%l) Unable to handle this request\n"))); } return false; } return true; }
CORBA::Octet TAO_GIOP_Message_Generator_Parser_12::minor_version | ( | void | ) | const [virtual] |
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 393 of file GIOP_Message_Generator_Parser_12.cpp.
{ return static_cast<CORBA::Octet> (2); }
int TAO_GIOP_Message_Generator_Parser_12::parse_locate_header | ( | TAO_GIOP_Locate_Request_Header & | request | ) | [virtual] |
Parse the LocateRequest Header from the incoming stream. This will do a version specific parsing of the incoming Request header
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 311 of file GIOP_Message_Generator_Parser_12.cpp.
{ // Get the stream . TAO_InputCDR &msg = request.incoming_stream (); // Get the request id. CORBA::ULong req_id = 0; CORBA::Boolean hdr_status = msg.read_ulong (req_id); // Store it in the Locate request classes request.request_id (req_id); // Unmarshal the target address field. hdr_status = hdr_status && request.profile ().unmarshall_target_address(msg); // Reset the pointer to an 8-byte bouns]dary msg.align_read_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR); return hdr_status ? 0 : -1; }
int TAO_GIOP_Message_Generator_Parser_12::parse_locate_reply | ( | TAO_InputCDR & | input, | |
TAO_Pluggable_Reply_Params & | params | |||
) | [virtual] |
Parse the locate reply message.
Reimplemented from TAO_GIOP_Message_Generator_Parser.
Definition at line 364 of file GIOP_Message_Generator_Parser_12.cpp.
{ if (TAO_GIOP_Message_Generator_Parser::parse_locate_reply (cdr, params) == -1) return -1; // Note: We dont align the pointer to an 8 byte boundary for a // locate reply body. This is due to an urgent issue raised by Michi // in the OMG. I discussed this with Michi today (09/07/2001) and I // learn that this has been passed. Hence the change.. /*if (cdr.length () > 0) { // Align the read pointer on an 8-byte boundary cdr.align_read_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR); }*/ return 0; }
int TAO_GIOP_Message_Generator_Parser_12::parse_reply | ( | TAO_InputCDR & | input, | |
TAO_Pluggable_Reply_Params & | params | |||
) | [virtual] |
Parse the reply message.
Reimplemented from TAO_GIOP_Message_Generator_Parser.
Definition at line 335 of file GIOP_Message_Generator_Parser_12.cpp.
{ if (TAO_GIOP_Message_Generator_Parser::parse_reply (cdr, params) == -1) return -1; if (!(cdr >> params.svc_ctx_)) { if (TAO_debug_level) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("TAO (%P|%t) parse_reply, ") ACE_TEXT ("extracting context\n"))); } return -1; } if (cdr.length () > 0) { // Align the read pointer on an 8-byte boundary cdr.align_read_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR); } return 0; }
int TAO_GIOP_Message_Generator_Parser_12::parse_request_header | ( | TAO_ServerRequest & | request | ) | [virtual] |
Parse the Request Header from the incoming stream. This will do a version specific parsing of the incoming Request header
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 225 of file GIOP_Message_Generator_Parser_12.cpp.
{ // Get the input CDR in the request class TAO_InputCDR & input = *request.incoming (); CORBA::Boolean hdr_status = (CORBA::Boolean) input.good_bit (); CORBA::ULong req_id = 0; // Get the rest of the request header ... hdr_status = hdr_status && input.read_ulong (req_id); request.request_id (req_id); CORBA::Octet response_flags = CORBA::Octet(); hdr_status = hdr_status && input.read_octet (response_flags); request.response_expected ((response_flags > 0)); // The high bit of the octet has been set if the SyncScope policy // value is SYNC_WITH_SERVER. request.sync_with_server ((response_flags == 1)); // Reserved field input.skip_bytes (3); // Unmarshal the target address field. hdr_status = hdr_status && request.profile ().unmarshall_target_address(input); CORBA::ULong length = 0; hdr_status = hdr_status && input.read_ulong (length); if (hdr_status) { // Do not include NULL character at the end. // @@ This is not getting demarshaled using the codeset // translators! // Notice that there are no memory allocations involved // here! request.operation (input.rd_ptr (), length - 1, 0 /* TAO_ServerRequest does NOT own string */); hdr_status = input.skip_bytes (length); } // Tear out the service context ... we currently ignore it, but it // should probably be passed to each ORB service as appropriate // (e.g. transactions, security). // // NOTE: As security support kicks in, this is a good place to // verify a digital signature, if that is required in this security // environment. It may be required even when using IPSEC security // infrastructure. IOP::ServiceContextList &req_service_info = request.request_service_info (); if (!(input >> req_service_info)) { if (TAO_debug_level) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("TAO (%P|%t) parse_request_header, ") ACE_TEXT ("extracting context\n"))); } return -1; } if (req_service_info.length() > 0) { request.orb_core ()->service_context_registry (). process_service_contexts (req_service_info, *(request.transport ())); } if (input.length () > 0) { // Reset the read_ptr to an 8-byte boundary. input.align_read_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR); } return hdr_status ? 0 : -1; }
bool TAO_GIOP_Message_Generator_Parser_12::write_fragment_header | ( | TAO_OutputCDR & | cdr, | |
CORBA::ULong | request_id | |||
) | [virtual] |
Write the GIOP fragment message header to the output CDR stream cdr.
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 213 of file GIOP_Message_Generator_Parser_12.cpp.
{ return (cdr << request_id); // No need to align write pointer to an 8 byte boundary since it // should already be aligned (12 for GIOP messager + 4 for fragment // header = 16 -- a multiple of 8) }
bool TAO_GIOP_Message_Generator_Parser_12::write_locate_reply_mesg | ( | TAO_OutputCDR & | output, | |
CORBA::ULong | request_id, | |||
TAO_GIOP_Locate_Status_Msg & | status | |||
) | [virtual] |
Writes the locate _reply message in to the output.
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 149 of file GIOP_Message_Generator_Parser_12.cpp.
{ if (!(output.write_ulong (request_id))) return false; // Make the header for the locate request if (!(output.write_ulong (status_info.status))) return false; // Note: We dont align the pointer to an 8 byte boundary for a // locate reply body. This is due to an urgent issue raised by Michi // in the OMG. I discussed this with Michi today (09/07/2001) and I // learn that this has been passed. Hence the change.. /* if (status_info.status == TAO_GIOP_OBJECT_FORWARD || status_info.status == TAO_GIOP_OBJECT_FORWARD_PERM) { // We have to send some data, so align the pointer if (output.align_write_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR) == -1) { return false; } } */ switch (status_info.status) { case GIOP::OBJECT_FORWARD: // More likely than not we will not have this in TAO case GIOP::OBJECT_FORWARD_PERM: { CORBA::Object_ptr object_ptr = status_info.forward_location_var.in (); if (!(output << object_ptr)) { if (TAO_debug_level > 0) { ACE_ERROR (( LM_ERROR, ACE_TEXT ("TAO (%P|%t|%N|%l) write_locate_reply_mesg-") ACE_TEXT (" cannot marshal object reference\n") )); } } } break; case GIOP::LOC_SYSTEM_EXCEPTION: case GIOP::LOC_NEEDS_ADDRESSING_MODE: // Do we do these in TAO?? // What to do here???? I dont really know. I have to do a survey // of the specifications that uses this. break; default: break; } return true; }
bool TAO_GIOP_Message_Generator_Parser_12::write_locate_request_header | ( | CORBA::ULong | request_id, | |
TAO_Target_Specification & | spec, | |||
TAO_OutputCDR & | msg | |||
) | [virtual] |
Write the LocateRequest header.
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 97 of file GIOP_Message_Generator_Parser_12.cpp.
{ // Write the request id if (!(msg << request_id)) return false; // Write the target address if (!(this->marshall_target_spec (spec, msg))) return false; // I dont think we need to align the pointer to an 8 byte boundary // here. // We need to align the pointer // if (msg.align_write_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR) == -1) // return 0; // Return success return true; }
bool TAO_GIOP_Message_Generator_Parser_12::write_reply_header | ( | TAO_OutputCDR & | output, | |
TAO_Pluggable_Reply_Params_Base & | reply | |||
) | [virtual] |
Write the reply header in to output.
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 121 of file GIOP_Message_Generator_Parser_12.cpp.
{ // Write the request ID if (!(output.write_ulong (reply.request_id_))) return false; // Write the reply status if (!(output.write_ulong (reply.reply_status ()))) return false; if (!(output << reply.service_context_notowned ())) return false; if (reply.argument_flag_) { // If we have some data to be marshalled, then we align the // pointer to a 8 byte boundary. Else, we just leave it throu if (output.align_write_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR) == -1) { return false; } } return true; }
bool TAO_GIOP_Message_Generator_Parser_12::write_request_header | ( | const TAO_Operation_Details & | opdetails, | |
TAO_Target_Specification & | spec, | |||
TAO_OutputCDR & | msg | |||
) | [virtual] |
Write the request header in to msg.
Implements TAO_GIOP_Message_Generator_Parser.
Definition at line 27 of file GIOP_Message_Generator_Parser_12.cpp.
{ // First the request id if (!(msg << opdetails.request_id ())) return false; CORBA::Octet const response_flags = opdetails.response_flags (); // Here are the Octet values for different policies. See the meaning // of response_flags of RequestHeader_1_2 in the CORBA specification as // to why the values below are used. // '00000000' for SYNC_NONE // '00000000' for SYNC_WITH_TRANSPORT // '00000001' for SYNC_WITH_SERVER // '00000011' for SYNC_WITH_TARGET // '00000011' for regular two ways, but if they are invoked via a // DII with INV_NO_RESPONSE flag set then we need to send '00000001' // // We have not implemented the policy INV_NO_RESPONSE for DII. if (response_flags == TAO_TWOWAY_RESPONSE_FLAG) msg << ACE_OutputCDR::from_octet (3); // Second the response flags // Sync scope - ignored by server if request is not oneway. else if (response_flags == CORBA::Octet (Messaging::SYNC_NONE) || response_flags == CORBA::Octet (Messaging::SYNC_WITH_TRANSPORT) || response_flags == CORBA::Octet (TAO::SYNC_DELAYED_BUFFERING)) // No response required. msg << ACE_OutputCDR::from_octet (0); else if (response_flags == CORBA::Octet (Messaging::SYNC_WITH_SERVER)) // Return before dispatching to the servant msg << ACE_OutputCDR::from_octet (1); else if (response_flags == CORBA::Octet (Messaging::SYNC_WITH_TARGET)) // Return after dispatching servant. msg << ACE_OutputCDR::from_octet (3); else // Until more flags are defined by the OMG. return false; // The reserved field CORBA::Octet reserved[3] = {0, 0, 0}; msg.write_octet_array (reserved, 3); if (!this->marshall_target_spec (spec, msg)) return false; // Write the operation name msg.write_string (opdetails.opname_len (), opdetails.opname ()); // Write the service context list if (!(msg << opdetails.request_service_info ())) return false; // We align the pointer only if the operation has arguments. if (opdetails.argument_flag () && msg.align_write_ptr (TAO_GIOP_MESSAGE_ALIGN_PTR) == -1) { return false; } return true; }