00001
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
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
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
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
00074 ACE_CHECK;
00075
00076 this->event_channel_->reconnected (this ACE_ENV_ARG_PARAMETER);
00077 ACE_CHECK;
00078 }
00079
00080
00081
00082
00083 if (this->is_connected_i ())
00084 return;
00085 }
00086
00087 #if (TAO_HAS_CORBA_MESSAGING == 1)
00088 if ( consumer_validate_connection_ == 1 )
00089 {
00090
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
00100 }
00101 #endif
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
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
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
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
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
00166
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