#include <LocateRequest_Invocation_Adapter.h>
Collaboration diagram for TAO::LocateRequest_Invocation_Adapter:
Public Member Functions | |
LocateRequest_Invocation_Adapter (CORBA::Object_ptr target) | |
void | invoke (void) |
Start the invocation on the target. | |
CORBA::PolicyList * | get_inconsistent_policies (void) |
Accessor to the inconsistent policy list. | |
Private Member Functions | |
bool | get_timeout (ACE_Time_Value &val) |
void | object_forwarded (CORBA::Object_var &effective_target, TAO_Stub *stub, CORBA::Boolean permanent_forward) |
Private Attributes | |
CORBA::Object_ptr | target_ |
CORBA::PolicyList_var | list_ |
This class provides a look and feel similar to the TAO::Invocation_Adapter though the functionalities are different. For the record, IDL compiler doesn't know the existence of this class. This class is concerned with the creation and invocation of locate request invocations to the target object
Definition at line 58 of file LocateRequest_Invocation_Adapter.h.
|
Definition at line 21 of file LocateRequest_Invocation_Adapter.cpp. References CORBA::Object_ptr.
|
|
Accessor to the inconsistent policy list.
Definition at line 103 of file LocateRequest_Invocation_Adapter.cpp. Referenced by CORBA::Object::_validate_connection().
00104 { 00105 return this->list_._retn (); 00106 } |
|
Definition at line 109 of file LocateRequest_Invocation_Adapter.cpp. References TAO_ORB_Core::call_timeout_hook(), and CORBA::Object::orb_core(). Referenced by invoke().
00110 { 00111 bool has_timeout = false; 00112 this->target_->orb_core ()->call_timeout_hook (this->target_->_stubobj (), 00113 has_timeout, 00114 timeout); 00115 00116 return has_timeout; 00117 } |
|
Start the invocation on the target.
Definition at line 29 of file LocateRequest_Invocation_Adapter.cpp. References CORBA::Object::_duplicate(), CORBA::Object::_stubobj(), TAO_ORB_Core::configuration(), get_timeout(), TAO_Pseudo_Var_T< T >::in(), TAO::Profile_Transport_Resolver::init_inconsistent_policies(), TAO::Invocation_Status, TAO::LocateRequest_Invocation::invoke(), TAO::Invocation_Base::is_forwarded(), object_forwarded(), CORBA::Object_var, TAO_Stub::orb_core(), TAO::Invocation_Base::reply_status(), TAO_Transport_Mux_Strategy::request_id(), TAO_Operation_Details::request_id(), TAO::Profile_Transport_Resolver::resolve(), TAO::Invocation_Base::steal_forwarded_reference(), TAO::Profile_Transport_Resolver::steal_inconsistent_policies(), TAO::Profile_Transport_Resolver::stub(), TAO_GIOP_LOCATION_FORWARD_PERM, TAO::TAO_INVOKE_RESTART, TAO::TAO_INVOKE_START, TAO_Transport::tms(), and TAO::Profile_Transport_Resolver::transport(). Referenced by CORBA::Object::_validate_connection().
00030 { 00031 CORBA::Object_var effective_target = 00032 CORBA::Object::_duplicate (this->target_); 00033 00034 TAO_Stub * const stub = 00035 this->target_->_stubobj (); 00036 if (stub == 0) 00037 throw ::CORBA::INTERNAL ( 00038 CORBA::SystemException::_tao_minor_code ( 00039 0, 00040 EINVAL), 00041 CORBA::COMPLETED_NO); 00042 00043 // The invocation has got to be within the context of the 00044 // corresponding ORB's configuration. Otherwise things like 00045 // timeout hooks, etc may not work as expected. Especially if 00046 // there are multiple ORB instances in the process, each with its 00047 // own, local configuration. 00048 ACE_Service_Config_Guard scg (stub->orb_core ()->configuration ()); 00049 00050 ACE_Time_Value tmp_wait_time; 00051 ACE_Time_Value *max_wait_time = 0; 00052 00053 if (this->get_timeout (tmp_wait_time)) 00054 max_wait_time = &tmp_wait_time; 00055 00056 Invocation_Status s = TAO_INVOKE_START; 00057 00058 while (s == TAO_INVOKE_START || 00059 s == TAO_INVOKE_RESTART) 00060 { 00061 Profile_Transport_Resolver resolver (effective_target.in (), stub, true); 00062 00063 try 00064 { 00065 resolver.init_inconsistent_policies (); 00066 00067 resolver.resolve (max_wait_time); 00068 00069 // Dummy operation details that is used to instantiate the 00070 // LocateRequest class. 00071 TAO_Operation_Details op (0, 0); 00072 00073 op.request_id (resolver.transport ()->tms ()->request_id ()); 00074 TAO::LocateRequest_Invocation synch (this->target_, resolver, op); 00075 00076 s = synch.invoke (max_wait_time); 00077 if (s == TAO_INVOKE_RESTART && synch.is_forwarded ()) 00078 { 00079 effective_target = synch.steal_forwarded_reference (); 00080 00081 #if TAO_HAS_INTERCEPTORS == 1 00082 CORBA::Boolean const is_permanent_forward = 00083 (synch.reply_status() == TAO_GIOP_LOCATION_FORWARD_PERM); 00084 #else 00085 CORBA::Boolean const is_permanent_forward = false; 00086 #endif 00087 this->object_forwarded (effective_target, 00088 resolver.stub (), 00089 is_permanent_forward); 00090 } 00091 } 00092 catch (const ::CORBA::INV_POLICY&) 00093 { 00094 this->list_ = resolver.steal_inconsistent_policies (); 00095 throw; 00096 } 00097 } 00098 00099 return; 00100 } |
|
Helper method that takes care of setting the profiles within the stub object if the target gets forwarded Definition at line 120 of file LocateRequest_Invocation_Adapter.cpp. References TAO_Stub::add_forward_profiles(), TAO_Stub::base_profiles(), TAO_Stub::next_profile(), CORBA::Object_var, and TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE. Referenced by invoke().
00124 { 00125 // The object pointer has to be changed to a TAO_Stub pointer 00126 // in order to obtain the profiles. 00127 TAO_Stub *stubobj = effective_target->_stubobj (); 00128 00129 if (stubobj == 0) 00130 throw ::CORBA::INTERNAL ( 00131 CORBA::SystemException::_tao_minor_code ( 00132 TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE, 00133 errno), 00134 CORBA::COMPLETED_NO); 00135 00136 // Reset the profile in the stubs 00137 stub->add_forward_profiles (stubobj->base_profiles (), permanent_forward); 00138 00139 if (stub->next_profile () == 0) 00140 throw ::CORBA::TRANSIENT ( 00141 CORBA::SystemException::_tao_minor_code ( 00142 TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE, 00143 errno), 00144 CORBA::COMPLETED_NO); 00145 00146 return; 00147 } |
|
Definition at line 81 of file LocateRequest_Invocation_Adapter.h. |
|
Definition at line 80 of file LocateRequest_Invocation_Adapter.h. |