EC_Default_ProxySupplier.cpp

Go to the documentation of this file.
00001 // EC_Default_ProxySupplier.cpp,v 1.7 2006/03/14 06:14:25 jtc Exp
00002 
00003 #include "orbsvcs/Event/EC_Default_ProxySupplier.h"
00004 #include "orbsvcs/Event/EC_Event_Channel_Base.h"
00005 #include "orbsvcs/Event/EC_Filter_Builder.h"
00006 
00007 #include "ace/Reverse_Lock_T.h"
00008 
00009 ACE_RCSID (Event,
00010            EC_ProxySupplier,
00011            "EC_Default_ProxySupplier.cpp,v 1.7 2006/03/14 06:14:25 jtc Exp")
00012 
00013 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00014 
00015 typedef ACE_Reverse_Lock<ACE_Lock> TAO_EC_Unlock;
00016 
00017 TAO_EC_Default_ProxyPushSupplier::TAO_EC_Default_ProxyPushSupplier (
00018       TAO_EC_Event_Channel_Base* ec,
00019       int validate_connection)
00020   : TAO_EC_ProxyPushSupplier (ec, validate_connection)
00021 {
00022 }
00023 
00024 TAO_EC_Default_ProxyPushSupplier::~TAO_EC_Default_ProxyPushSupplier (void)
00025 {
00026 }
00027 
00028 void
00029 TAO_EC_Default_ProxyPushSupplier::connect_push_consumer (
00030       RtecEventComm::PushConsumer_ptr push_consumer,
00031       const RtecEventChannelAdmin::ConsumerQOS& qos
00032       ACE_ENV_ARG_DECL)
00033     ACE_THROW_SPEC ((CORBA::SystemException,
00034                      RtecEventChannelAdmin::AlreadyConnected,
00035                      RtecEventChannelAdmin::TypeError))
00036 {
00037   // Nil PushConsumers are illegal
00038   if (CORBA::is_nil (push_consumer))
00039     ACE_THROW (CORBA::BAD_PARAM ());
00040 
00041   {
00042     ACE_GUARD_THROW_EX (
00043         ACE_Lock, ace_mon, *this->lock_,
00044         CORBA::INTERNAL ());
00045     // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
00046     ACE_CHECK;
00047 
00048     if (this->is_connected_i ())
00049       {
00050         if (this->event_channel_->consumer_reconnect () == 0)
00051           ACE_THROW (RtecEventChannelAdmin::AlreadyConnected ());
00052 
00053         // Re-connections are allowed....
00054         this->cleanup_i ();
00055 
00056         this->consumer_ =
00057           RtecEventComm::PushConsumer::_duplicate (push_consumer);
00058         this->qos_ = qos;
00059         this->child_ =
00060           this->event_channel_->filter_builder ()->build (this,
00061                                                           this->qos_
00062                                                           ACE_ENV_ARG_PARAMETER);
00063         ACE_CHECK;
00064 
00065         this->adopt_child (this->child_);
00066 
00067         TAO_EC_Unlock reverse_lock (*this->lock_);
00068 
00069         {
00070           ACE_GUARD_THROW_EX (
00071               TAO_EC_Unlock, ace_mon, reverse_lock,
00072               CORBA::INTERNAL ());
00073           // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
00074           ACE_CHECK;
00075 
00076           this->event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
00077           ACE_CHECK;
00078         }
00079 
00080         // A separate thread could have connected simultaneously,
00081         // this is probably an application error, handle it as
00082         // gracefully as possible
00083         if (this->is_connected_i ())
00084           return; // @@ Should we throw
00085       }
00086 
00087 #if (TAO_HAS_CORBA_MESSAGING == 1)
00088       if ( consumer_validate_connection_ == 1 )
00089       {
00090         // Validate connection during connect.
00091         CORBA::PolicyList_var unused;
00092         int status = push_consumer->_validate_connection (unused
00093                                                           ACE_ENV_ARG_PARAMETER);
00094         ACE_CHECK;
00095 #if TAO_EC_ENABLE_DEBUG_MESSAGES
00096         ACE_DEBUG ((LM_DEBUG, "Validated connection to PushConsumer on connect. Status[%d]\n", status));
00097 #else
00098         ACE_UNUSED_ARG(status);
00099 #endif /* TAO_EC_ENABLED_DEBUG_MESSAGES */
00100       }
00101 #endif /* TAO_HAS_CORBA_MESSAGING == 1 */
00102 
00103       this->consumer_ =
00104         RtecEventComm::PushConsumer::_duplicate (push_consumer);
00105       this->qos_ = qos;
00106 
00107 #if TAO_EC_ENABLE_DEBUG_MESSAGES
00108     ACE_DEBUG ((LM_DEBUG,
00109                 "Building filters for consumer <%x>.\n",
00110                 this));
00111 #endif /* TAO_EC_ENABLED_DEBUG_MESSAGES */
00112     this->child_ =
00113       this->event_channel_->filter_builder ()->build (this,
00114                                                       this->qos_
00115                                                       ACE_ENV_ARG_PARAMETER);
00116     ACE_CHECK;
00117 
00118     this->adopt_child (this->child_);
00119   }
00120 
00121   // Notify the event channel...
00122   this->event_channel_->connected (this ACE_ENV_ARG_PARAMETER);
00123 }
00124 
00125 void
00126 TAO_EC_Default_ProxyPushSupplier::disconnect_push_supplier (
00127       ACE_ENV_SINGLE_ARG_DECL)
00128     ACE_THROW_SPEC ((CORBA::SystemException))
00129 {
00130   RtecEventComm::PushConsumer_var consumer;
00131   int connected = 0;
00132 
00133   {
00134     ACE_GUARD_THROW_EX (
00135         ACE_Lock, ace_mon, *this->lock_,
00136         CORBA::INTERNAL ());
00137     // @@ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
00138     ACE_CHECK;
00139 
00140     connected = this->is_connected_i ();
00141     consumer = this->consumer_._retn ();
00142 
00143     if (connected)
00144       this->cleanup_i ();
00145   }
00146 
00147   // Notify the event channel....
00148   this->event_channel_->disconnected (this ACE_ENV_ARG_PARAMETER);
00149   ACE_CHECK;
00150 
00151   if (!connected)
00152     {
00153       return;
00154     }
00155 
00156   if (this->event_channel_->disconnect_callbacks ())
00157     {
00158       ACE_TRY
00159         {
00160           consumer->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
00161           ACE_TRY_CHECK;
00162         }
00163       ACE_CATCHANY
00164         {
00165           // Ignore exceptions, we must isolate other clients from
00166           // problems on this one.
00167           ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00168                                "ProxySupplier::disconnect_push_supplier");
00169         }
00170       ACE_ENDTRY;
00171     }
00172 }
00173 
00174 void
00175 TAO_EC_Default_ProxyPushSupplier::suspend_connection (ACE_ENV_SINGLE_ARG_DECL)
00176     ACE_THROW_SPEC ((CORBA::SystemException))
00177 {
00178   this->suspend_connection_locked (ACE_ENV_SINGLE_ARG_PARAMETER);
00179   ACE_CHECK;
00180 }
00181 
00182 void
00183 TAO_EC_Default_ProxyPushSupplier::resume_connection (ACE_ENV_SINGLE_ARG_DECL)
00184     ACE_THROW_SPEC ((CORBA::SystemException))
00185 {
00186   this->resume_connection_locked (ACE_ENV_SINGLE_ARG_PARAMETER);
00187   ACE_CHECK;
00188 }
00189 
00190 PortableServer::POA_ptr
00191 TAO_EC_Default_ProxyPushSupplier::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00192 {
00193   return PortableServer::POA::_duplicate (this->default_POA_.in ());
00194 }
00195 
00196 void
00197 TAO_EC_Default_ProxyPushSupplier::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00198 {
00199   this->_incr_refcnt ();
00200 }
00201 
00202 void
00203 TAO_EC_Default_ProxyPushSupplier::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00204 {
00205   this->_decr_refcnt ();
00206 }
00207 
00208 void
00209 TAO_EC_Default_ProxyPushSupplier::activate (
00210    RtecEventChannelAdmin::ProxyPushSupplier_ptr &proxy
00211    ACE_ENV_ARG_DECL)
00212   ACE_THROW_SPEC ((CORBA::SystemException))
00213 {
00214   proxy = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00215   ACE_CHECK;
00216 }
00217 
00218 PortableServer::ObjectId
00219 TAO_EC_Default_ProxyPushSupplier::object_id (ACE_ENV_SINGLE_ARG_DECL)
00220   ACE_THROW_SPEC ((CORBA::SystemException))
00221 {
00222   PortableServer::ObjectId_var result =
00223     this->default_POA_->servant_to_id (this ACE_ENV_ARG_PARAMETER);
00224 
00225   return result.in ();
00226 }
00227 
00228 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Thu Nov 9 13:11:06 2006 for TAO_RTEvent by doxygen 1.3.6