Base class for remote invocations. More...
#include <Remote_Invocation.h>
Public Member Functions | |
Remote_Invocation (CORBA::Object_ptr otarget, Profile_Transport_Resolver &resolver, TAO_Operation_Details &detail, bool response_expected) | |
Protected Member Functions | |
void | init_target_spec (TAO_Target_Specification &spec, TAO_OutputCDR &output) |
Initialize the spec. | |
void | write_header (TAO_OutputCDR &out_stream) |
Write the GIOP header into the stream. | |
void | marshal_data (TAO_OutputCDR &cdr) |
Marshal the arguments into the stream. | |
Invocation_Status | send_message (TAO_OutputCDR &cdr, TAO_Message_Semantics message_semantics, ACE_Time_Value *max_wait_time) |
Write the message onto the socket. | |
Protected Attributes | |
Profile_Transport_Resolver & | resolver_ |
Our resolver. |
Base class for remote invocations.
This class encapulates some of the common functionalities used by synchronous, asynchronous, DII and DSI invocations.
Definition at line 46 of file Remote_Invocation.h.
TAO::Remote_Invocation::Remote_Invocation | ( | CORBA::Object_ptr | otarget, | |
Profile_Transport_Resolver & | resolver, | |||
TAO_Operation_Details & | detail, | |||
bool | response_expected | |||
) |
otarget | The original target on which this invocation was started. This is there to be passed up to its parent class. | |
resolver | The profile and transport holder. | |
detail | Pperation details of the invocation on the target | |
response_expected | Flag to indicate whether the operation encapsulated by op returns a response or not. |
Definition at line 23 of file Remote_Invocation.cpp.
: Invocation_Base (otarget, resolver.object (), resolver.stub (), detail, response_expected, true /* request_is_remote */ ) , resolver_ (resolver) { }
void TAO::Remote_Invocation::init_target_spec | ( | TAO_Target_Specification & | spec, | |
TAO_OutputCDR & | output | |||
) | [protected] |
Initialize the spec.
Definition at line 39 of file Remote_Invocation.cpp.
{ // Generate all service contexts this->resolver_.stub ()->orb_core ()->service_context_registry (). generate_service_context ( this->resolver_.stub (), *this->resolver_.transport (), this->details_, target_spec, output); TAO_Profile *pfile = this->resolver_.profile (); // Set the target specification mode switch (pfile->addressing_mode ()) { case TAO_Target_Specification::Key_Addr: target_spec.target_specifier (pfile->object_key ()); break; case TAO_Target_Specification::Profile_Addr: { IOP::TaggedProfile *tp = pfile->create_tagged_profile (); if (tp) { target_spec.target_specifier (*tp); } } break; case TAO_Target_Specification::Reference_Addr: // We need to call the method seperately. If there is no // IOP::IOR info, the call would create the info and return the // index that we need. CORBA::ULong index = 0; IOP::IOR *ior_info = 0; if (this->resolver_.stub ()->create_ior_info (ior_info, index) == -1) { if (TAO_debug_level > 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("TAO (%P|%t) - ") ACE_TEXT ("Remote_Invocation::init_target_spec, ") ACE_TEXT ("Error in finding index for ") ACE_TEXT ("IOP::IOR\n"))); } return; } target_spec.target_specifier (*ior_info, index); break; } }
void TAO::Remote_Invocation::marshal_data | ( | TAO_OutputCDR & | cdr | ) | [protected] |
Marshal the arguments into the stream.
Definition at line 116 of file Remote_Invocation.cpp.
{ // Marshal application data if (this->details_.marshal_args (out_stream) == false) { throw ::CORBA::MARSHAL (); } }
Invocation_Status TAO::Remote_Invocation::send_message | ( | TAO_OutputCDR & | cdr, | |
TAO_Message_Semantics | message_semantics, | |||
ACE_Time_Value * | max_wait_time | |||
) | [protected] |
Write the message onto the socket.
Definition at line 126 of file Remote_Invocation.cpp.
{ TAO_Protocols_Hooks *tph = this->resolver_.stub ()->orb_core ()->get_protocols_hooks (); TAO_Network_Priority_Protocols_Hooks *nph = this->resolver_.stub ()->orb_core ()-> get_network_priority_protocols_hooks (); TAO_Connection_Handler *connection_handler = this->resolver_.transport ()->connection_handler (); if (nph != 0) { // nph = 0, means DiffServ library is not used // nph = 0, means DiffServ library is used, and // request DSCP and reply DSCP are set. // Note that the application could still be using // RTCORBA, but still setting DIffServ codepoints // using the DiffServ library takes precedence. // CORBA::Long const dscp = nph->get_dscp_codepoint (this->resolver_.stub (), this->resolver_.object ()); connection_handler->set_dscp_codepoint (dscp); } else if (tph != 0) { // If we execute this code, DiffServ library is not used, // but RTCORBA could be used. // Which means that using the enable_network_priority flag, // the application might want to set DiffServ codepoints. // Check if that is the case. // CORBA::Boolean const set_client_network_priority = tph->set_client_network_priority ( this->resolver_.transport ()->tag (), this->resolver_.stub ()); connection_handler->set_dscp_codepoint (set_client_network_priority); } // Note that if noth nph and tph are 0, then we do not make any // virtual calls any more, because we have removed the default // implementations. if (! this->resolver_.transport ()->is_connected()) { throw ::CORBA::TRANSIENT (CORBA::OMGVMCID | 2, CORBA::COMPLETED_NO); } int const retval = this->resolver_.transport ()->send_request ( this->resolver_.stub (), this->resolver_.stub ()->orb_core (), cdr, message_semantics, max_wait_time); if (retval == -1) { if (errno == ETIME) { // We sent a message already and we haven't gotten a // reply. Just throw TIMEOUT with *COMPLETED_MAYBE*. throw ::CORBA::TIMEOUT ( CORBA::SystemException::_tao_minor_code ( TAO_TIMEOUT_SEND_MINOR_CODE, errno), CORBA::COMPLETED_MAYBE); } if (TAO_debug_level > 2) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - ") ACE_TEXT ("Remote_Invocation::send_message, ") ACE_TEXT ("failure while sending message\n"))); } // Close the transport and all the associated stuff along with // it. this->resolver_.transport ()->close_connection (); this->resolver_.stub ()->reset_profiles (); return TAO_INVOKE_RESTART; } this->resolver_.stub ()->set_valid_profile (); return TAO_INVOKE_SUCCESS; }
void TAO::Remote_Invocation::write_header | ( | TAO_OutputCDR & | out_stream | ) | [protected] |
Write the GIOP header into the stream.
Definition at line 97 of file Remote_Invocation.cpp.
{ this->resolver_.transport ()->clear_translators (0, &out_stream); TAO_Target_Specification spec; this->init_target_spec (spec, out_stream); // Send the request for the header if (this->resolver_.transport ()->generate_request_header (this->details_, spec, out_stream) == -1) { throw ::CORBA::MARSHAL (); } this->resolver_.transport ()->assign_translators (0, &out_stream); }
Profile_Transport_Resolver& TAO::Remote_Invocation::resolver_ [protected] |
Our resolver.
Definition at line 84 of file Remote_Invocation.h.