00001
00002
00003 #include "orbsvcs/Event/EC_Event_Channel_Base.h"
00004 #include "orbsvcs/Event/EC_Dispatching.h"
00005 #include "orbsvcs/Event/EC_ConsumerAdmin.h"
00006 #include "orbsvcs/Event/EC_SupplierAdmin.h"
00007 #include "orbsvcs/Event/EC_Timeout_Generator.h"
00008 #include "orbsvcs/Event/EC_ObserverStrategy.h"
00009 #include "orbsvcs/Event/EC_ConsumerControl.h"
00010 #include "orbsvcs/Event/EC_SupplierControl.h"
00011 #include "ace/Dynamic_Service.h"
00012
00013 #if ! defined (__ACE_INLINE__)
00014 #include "orbsvcs/Event/EC_Event_Channel_Base.i"
00015 #endif
00016
00017 ACE_RCSID(Event, EC_Event_Channel_Base, "EC_Event_Channel_Base.cpp,v 1.6 2006/03/14 06:14:25 jtc Exp")
00018
00019 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00020
00021 TAO_EC_Event_Channel_Base::
00022 TAO_EC_Event_Channel_Base (const TAO_EC_Event_Channel_Attributes& attr,
00023 TAO_EC_Factory* factory,
00024 int own_factory)
00025 : supplier_poa_ (PortableServer::POA::_duplicate (attr.supplier_poa)),
00026 consumer_poa_ (PortableServer::POA::_duplicate (attr.consumer_poa)),
00027 factory_ (factory),
00028 own_factory_ (own_factory),
00029 dispatching_ (0),
00030 filter_builder_ (0),
00031 supplier_filter_builder_ (0),
00032 consumer_admin_ (0),
00033 supplier_admin_ (0),
00034 timeout_generator_ (0),
00035 observer_strategy_ (0),
00036 scheduling_strategy_(0),
00037 consumer_reconnect_ (attr.consumer_reconnect),
00038 supplier_reconnect_ (attr.supplier_reconnect),
00039 disconnect_callbacks_ (attr.disconnect_callbacks),
00040 consumer_control_ (0),
00041 supplier_control_ (0),
00042 status_ (EC_S_IDLE)
00043 {
00044 this->scheduler_ =
00045 CORBA::Object::_duplicate (attr.scheduler);
00046 }
00047
00048 TAO_EC_Event_Channel_Base::~TAO_EC_Event_Channel_Base (void)
00049 {
00050
00051
00052
00053 this->factory_->destroy_supplier_control (this->supplier_control_);
00054 this->supplier_control_ = 0;
00055 this->factory_->destroy_consumer_control (this->consumer_control_);
00056 this->consumer_control_ = 0;
00057
00058 this->factory_->destroy_scheduling_strategy (this->scheduling_strategy_);
00059 this->scheduling_strategy_ = 0;
00060
00061 this->factory_->destroy_observer_strategy (this->observer_strategy_);
00062 this->observer_strategy_ = 0;
00063
00064 this->factory_->destroy_timeout_generator (this->timeout_generator_);
00065 this->timeout_generator_ = 0;
00066
00067 this->factory_->destroy_supplier_admin (this->supplier_admin_);
00068 this->supplier_admin_ = 0;
00069 this->factory_->destroy_consumer_admin (this->consumer_admin_);
00070 this->consumer_admin_ = 0;
00071
00072 this->factory_->destroy_supplier_filter_builder (this->supplier_filter_builder_);
00073 this->supplier_filter_builder_ = 0;
00074
00075 this->factory_->destroy_filter_builder (this->filter_builder_);
00076 this->filter_builder_ = 0;
00077
00078 this->factory_->destroy_dispatching (this->dispatching_);
00079 this->dispatching_ = 0;
00080
00081 this->factory (0, 0);
00082 }
00083
00084 void
00085 TAO_EC_Event_Channel_Base::create_strategies (void)
00086 {
00087 this->dispatching_ =
00088 this->factory_->create_dispatching (this);
00089 this->filter_builder_ =
00090 this->factory_->create_filter_builder (this);
00091 this->supplier_filter_builder_ =
00092 this->factory_->create_supplier_filter_builder (this);
00093 this->consumer_admin_ =
00094 this->factory_->create_consumer_admin (this);
00095 this->supplier_admin_ =
00096 this->factory_->create_supplier_admin (this);
00097 this->timeout_generator_ =
00098 this->factory_->create_timeout_generator (this);
00099 this->observer_strategy_ =
00100 this->factory_->create_observer_strategy (this);
00101
00102 this->scheduling_strategy_ =
00103 this->factory_->create_scheduling_strategy (this);
00104
00105 this->consumer_control_ =
00106 this->factory_->create_consumer_control (this);
00107 this->supplier_control_ =
00108 this->factory_->create_supplier_control (this);
00109 }
00110
00111 void
00112 TAO_EC_Event_Channel_Base::activate (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00113 {
00114 {
00115
00116
00117 ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
00118 if (this->status_ != EC_S_IDLE)
00119 return;
00120 this->status_ = EC_S_ACTIVATING;
00121 }
00122 this->dispatching_->activate ();
00123 this->timeout_generator_->activate ();
00124 this->consumer_control_->activate ();
00125 this->supplier_control_->activate ();
00126 {
00127
00128
00129 ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
00130 ACE_ASSERT (this->status_ == EC_S_ACTIVATING);
00131 this->status_ = EC_S_ACTIVE;
00132 }
00133 }
00134
00135 void
00136 TAO_EC_Event_Channel_Base::shutdown (ACE_ENV_SINGLE_ARG_DECL)
00137 {
00138 {
00139
00140
00141 ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
00142 if (this->status_ != EC_S_ACTIVE)
00143 return;
00144 this->status_ = EC_S_DESTROYING;
00145 }
00146 this->dispatching_->shutdown ();
00147 this->timeout_generator_->shutdown ();
00148 this->supplier_control_->shutdown ();
00149 this->consumer_control_->shutdown ();
00150
00151 this->deactivate_supplier_admin ();
00152 this->deactivate_consumer_admin ();
00153
00154 this->supplier_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00155 ACE_CHECK;
00156
00157 this->consumer_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00158 ACE_CHECK;
00159
00160 {
00161
00162
00163 ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
00164 ACE_ASSERT (this->status_ == EC_S_DESTROYING);
00165 this->status_ = EC_S_DESTROYED;
00166 }
00167 }
00168
00169 void
00170 TAO_EC_Event_Channel_Base::deactivate_supplier_admin (void)
00171 {
00172 ACE_DECLARE_NEW_CORBA_ENV;
00173 ACE_TRY
00174 {
00175 PortableServer::POA_var supplier_poa =
00176 this->supplier_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
00177 ACE_TRY_CHECK;
00178 PortableServer::ObjectId_var supplier_id =
00179 supplier_poa->servant_to_id (this->supplier_admin_ ACE_ENV_ARG_PARAMETER);
00180 ACE_TRY_CHECK;
00181 supplier_poa->deactivate_object (supplier_id.in () ACE_ENV_ARG_PARAMETER);
00182 ACE_TRY_CHECK;
00183 }
00184 ACE_CATCHANY
00185 {
00186
00187 }
00188 ACE_ENDTRY;
00189 }
00190
00191 void
00192 TAO_EC_Event_Channel_Base::deactivate_consumer_admin (void)
00193 {
00194 ACE_TRY_NEW_ENV
00195 {
00196 PortableServer::POA_var consumer_poa =
00197 this->consumer_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
00198 ACE_TRY_CHECK;
00199 PortableServer::ObjectId_var consumer_id =
00200 consumer_poa->servant_to_id (this->consumer_admin_ ACE_ENV_ARG_PARAMETER);
00201 ACE_TRY_CHECK;
00202 consumer_poa->deactivate_object (consumer_id.in () ACE_ENV_ARG_PARAMETER);
00203 ACE_TRY_CHECK;
00204 }
00205 ACE_CATCHANY
00206 {
00207
00208 }
00209 ACE_ENDTRY;
00210 }
00211
00212 void
00213 TAO_EC_Event_Channel_Base::connected (TAO_EC_ProxyPushConsumer* consumer
00214 ACE_ENV_ARG_DECL)
00215 {
00216 this->consumer_admin_->peer_connected (consumer ACE_ENV_ARG_PARAMETER);
00217 ACE_CHECK;
00218 this->supplier_admin_->connected (consumer ACE_ENV_ARG_PARAMETER);
00219 ACE_CHECK;
00220 this->observer_strategy_->connected (consumer ACE_ENV_ARG_PARAMETER);
00221 ACE_CHECK;
00222 }
00223
00224 void
00225 TAO_EC_Event_Channel_Base::reconnected (TAO_EC_ProxyPushConsumer* consumer
00226 ACE_ENV_ARG_DECL)
00227 {
00228 this->consumer_admin_->peer_reconnected (consumer ACE_ENV_ARG_PARAMETER);
00229 ACE_CHECK;
00230 this->supplier_admin_->reconnected (consumer ACE_ENV_ARG_PARAMETER);
00231 ACE_CHECK;
00232 this->observer_strategy_->connected (consumer ACE_ENV_ARG_PARAMETER);
00233 ACE_CHECK;
00234 }
00235
00236 void
00237 TAO_EC_Event_Channel_Base::disconnected (TAO_EC_ProxyPushConsumer* consumer
00238 ACE_ENV_ARG_DECL)
00239 {
00240 this->consumer_admin_->peer_disconnected (consumer ACE_ENV_ARG_PARAMETER);
00241 ACE_CHECK;
00242 this->supplier_admin_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
00243 ACE_CHECK;
00244 this->observer_strategy_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
00245 ACE_CHECK;
00246 }
00247
00248 void
00249 TAO_EC_Event_Channel_Base::connected (TAO_EC_ProxyPushSupplier* supplier
00250 ACE_ENV_ARG_DECL)
00251 {
00252 this->supplier_admin_->peer_connected (supplier ACE_ENV_ARG_PARAMETER);
00253 ACE_CHECK;
00254 this->consumer_admin_->connected (supplier ACE_ENV_ARG_PARAMETER);
00255 ACE_CHECK;
00256 this->observer_strategy_->connected (supplier ACE_ENV_ARG_PARAMETER);
00257 ACE_CHECK;
00258 }
00259
00260 void
00261 TAO_EC_Event_Channel_Base::reconnected (TAO_EC_ProxyPushSupplier* supplier
00262 ACE_ENV_ARG_DECL)
00263 {
00264 this->supplier_admin_->peer_reconnected (supplier ACE_ENV_ARG_PARAMETER);
00265 ACE_CHECK;
00266 this->consumer_admin_->reconnected (supplier ACE_ENV_ARG_PARAMETER);
00267 ACE_CHECK;
00268 this->observer_strategy_->connected (supplier ACE_ENV_ARG_PARAMETER);
00269 ACE_CHECK;
00270 }
00271
00272 void
00273 TAO_EC_Event_Channel_Base::disconnected (TAO_EC_ProxyPushSupplier* supplier
00274 ACE_ENV_ARG_DECL)
00275 {
00276 this->supplier_admin_->peer_disconnected (supplier ACE_ENV_ARG_PARAMETER);
00277 ACE_CHECK;
00278 this->consumer_admin_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
00279 ACE_CHECK;
00280 this->observer_strategy_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
00281 ACE_CHECK;
00282 }
00283
00284 RtecEventChannelAdmin::ConsumerAdmin_ptr
00285 TAO_EC_Event_Channel_Base::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
00286 ACE_THROW_SPEC ((CORBA::SystemException))
00287 {
00288 return this->consumer_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00289 }
00290
00291 RtecEventChannelAdmin::SupplierAdmin_ptr
00292 TAO_EC_Event_Channel_Base::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
00293 ACE_THROW_SPEC ((CORBA::SystemException))
00294 {
00295 return this->supplier_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00296 }
00297
00298 void
00299 TAO_EC_Event_Channel_Base::destroy (ACE_ENV_SINGLE_ARG_DECL)
00300 ACE_THROW_SPEC ((CORBA::SystemException))
00301 {
00302 this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00303 }
00304
00305 RtecEventChannelAdmin::Observer_Handle
00306 TAO_EC_Event_Channel_Base::append_observer (
00307 RtecEventChannelAdmin::Observer_ptr observer
00308 ACE_ENV_ARG_DECL)
00309 ACE_THROW_SPEC ((
00310 CORBA::SystemException,
00311 RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00312 RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
00313 {
00314 return this->observer_strategy_->append_observer (observer
00315 ACE_ENV_ARG_PARAMETER);
00316 }
00317
00318 void
00319 TAO_EC_Event_Channel_Base::remove_observer (
00320 RtecEventChannelAdmin::Observer_Handle handle
00321 ACE_ENV_ARG_DECL)
00322 ACE_THROW_SPEC ((
00323 CORBA::SystemException,
00324 RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00325 RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
00326 {
00327 this->observer_strategy_->remove_observer (handle
00328 ACE_ENV_ARG_PARAMETER);
00329 }
00330
00331 void
00332 TAO_EC_Event_Channel_Base::for_each_consumer (
00333 TAO_ESF_Worker<TAO_EC_ProxyPushSupplier> *worker
00334 ACE_ENV_ARG_DECL)
00335 ACE_THROW_SPEC ((CORBA::SystemException))
00336 {
00337 this->consumer_admin_->for_each (worker
00338 ACE_ENV_ARG_PARAMETER);
00339 ACE_CHECK;
00340 }
00341
00342 void
00343 TAO_EC_Event_Channel_Base::for_each_supplier (
00344 TAO_ESF_Worker<TAO_EC_ProxyPushConsumer> *worker
00345 ACE_ENV_ARG_DECL)
00346 ACE_THROW_SPEC ((CORBA::SystemException))
00347 {
00348 this->supplier_admin_->for_each (worker
00349 ACE_ENV_ARG_PARAMETER);
00350 ACE_CHECK;
00351 }
00352
00353 TAO_END_VERSIONED_NAMESPACE_DECL