Go to the documentation of this file.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 85483 2009-06-02 06:48:10Z 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 || s == TAO_INVOKE_RESTART)
00059 {
00060 Profile_Transport_Resolver resolver (effective_target.in (), stub, true);
00061
00062 try
00063 {
00064 resolver.init_inconsistent_policies ();
00065
00066 resolver.resolve (max_wait_time);
00067
00068 if (!resolver.transport ())
00069 {
00070
00071 throw CORBA::TRANSIENT (CORBA::OMGVMCID | 2, CORBA::COMPLETED_NO);
00072 }
00073
00074
00075
00076 TAO_Operation_Details op (0, 0);
00077
00078 op.request_id (resolver.transport ()->tms ()->request_id ());
00079 TAO::LocateRequest_Invocation synch (this->target_, resolver, op);
00080
00081 s = synch.invoke (max_wait_time);
00082 if (s == TAO_INVOKE_RESTART &&
00083 (synch.reply_status () == GIOP::LOCATION_FORWARD ||
00084 synch.reply_status () == GIOP::LOCATION_FORWARD_PERM))
00085 {
00086 CORBA::Boolean const is_permanent_forward =
00087 (synch.reply_status () == GIOP::LOCATION_FORWARD_PERM);
00088
00089 effective_target = synch.steal_forwarded_reference ();
00090
00091 this->object_forwarded (effective_target,
00092 resolver.stub (),
00093 is_permanent_forward);
00094 }
00095 }
00096 catch (const ::CORBA::INV_POLICY&)
00097 {
00098 this->list_ = resolver.steal_inconsistent_policies ();
00099 throw;
00100 }
00101 }
00102
00103 return;
00104 }
00105
00106 CORBA::PolicyList *
00107 LocateRequest_Invocation_Adapter::get_inconsistent_policies (void)
00108 {
00109 return this->list_._retn ();
00110 }
00111
00112 bool
00113 LocateRequest_Invocation_Adapter::get_timeout (ACE_Time_Value &timeout)
00114 {
00115 bool has_timeout = false;
00116 this->target_->orb_core ()->call_timeout_hook (this->target_->_stubobj (),
00117 has_timeout,
00118 timeout);
00119
00120 return has_timeout;
00121 }
00122
00123 void
00124 LocateRequest_Invocation_Adapter::object_forwarded (
00125 CORBA::Object_var &effective_target,
00126 TAO_Stub *stub,
00127 CORBA::Boolean permanent_forward)
00128 {
00129
00130
00131 TAO_Stub *stubobj = 0;
00132
00133 bool nil_forward_ref = false;
00134 if (CORBA::is_nil (effective_target.in ()))
00135 nil_forward_ref = true;
00136 else
00137 {
00138 stubobj =
00139 effective_target->_stubobj ();
00140
00141 if (stubobj && stubobj->base_profiles ().size () == 0)
00142 nil_forward_ref = true;
00143 }
00144
00145 if (nil_forward_ref)
00146 throw ::CORBA::TRANSIENT (
00147 CORBA::SystemException::_tao_minor_code (
00148 TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE,
00149 errno),
00150 CORBA::COMPLETED_NO);
00151
00152 if (stubobj == 0)
00153 throw ::CORBA::INTERNAL (
00154 CORBA::SystemException::_tao_minor_code (
00155 TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE,
00156 errno),
00157 CORBA::COMPLETED_NO);
00158
00159
00160 stub->add_forward_profiles (stubobj->base_profiles (), permanent_forward);
00161
00162 if (stub->next_profile () == 0)
00163 throw ::CORBA::TRANSIENT (
00164 CORBA::SystemException::_tao_minor_code (
00165 TAO_INVOCATION_LOCATION_FORWARD_MINOR_CODE,
00166 errno),
00167 CORBA::COMPLETED_NO);
00168
00169 return;
00170 }
00171
00172 }
00173
00174 TAO_END_VERSIONED_NAMESPACE_DECL