LocateRequest_Invocation_Adapter.cpp

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 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     // 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   }
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     // 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   }
00148 
00149 } // End namespace TAO
00150 
00151 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Sun Jan 27 13:07:33 2008 for TAO by doxygen 1.3.6