00001 #include "tao/LocateRequest_Invocation_Adapter.h"
00002 #include "tao/Profile_Transport_Resolver.h"
00003 #include "tao/operation_details.h"
00004 #include "tao/LocateRequest_Invocation.h"
00005 #include "tao/Transport.h"
00006 #include "tao/Transport_Mux_Strategy.h"
00007 #include "tao/GIOP_Utils.h"
00008 #include "tao/ORB_Core.h"
00009 #include "tao/Stub.h"
00010 #include "tao/SystemException.h"
00011 #include "ace/Service_Config.h"
00012
00013 ACE_RCSID (tao,
00014 LocateRequest_Invocation_Adapter,
00015 "$Id: LocateRequest_Invocation_Adapter.cpp 78109 2007-04-19 05:40:04Z johnnyw $")
00016
00017 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00018
00019 namespace TAO
00020 {
00021 LocateRequest_Invocation_Adapter::LocateRequest_Invocation_Adapter (
00022 CORBA::Object_ptr target)
00023 : target_ (target)
00024 , list_ (0)
00025 {
00026 }
00027
00028 void
00029 LocateRequest_Invocation_Adapter::invoke (void)
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
00044
00045
00046
00047
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
00070
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 }
00101
00102 CORBA::PolicyList *
00103 LocateRequest_Invocation_Adapter::get_inconsistent_policies (void)
00104 {
00105 return this->list_._retn ();
00106 }
00107
00108 bool
00109 LocateRequest_Invocation_Adapter::get_timeout (ACE_Time_Value &timeout)
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 }
00118
00119 void
00120 LocateRequest_Invocation_Adapter::object_forwarded (
00121 CORBA::Object_var &effective_target,
00122 TAO_Stub *stub,
00123 CORBA::Boolean permanent_forward)
00124 {
00125
00126
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
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 }
00148
00149 }
00150
00151 TAO_END_VERSIONED_NAMESPACE_DECL