EventChannel.cpp

Go to the documentation of this file.
00001 // EventChannel.cpp,v 1.31 2006/03/14 06:14:34 jtc Exp
00002 
00003 #include "orbsvcs/Notify/EventChannel.h"
00004 
00005 #include "orbsvcs/Notify/Container_T.h"
00006 #include "orbsvcs/Notify/EventChannelFactory.h"
00007 #include "orbsvcs/Notify/ConsumerAdmin.h"
00008 #include "orbsvcs/Notify/SupplierAdmin.h"
00009 #include "orbsvcs/Notify/Properties.h"
00010 #include "orbsvcs/Notify/Factory.h"
00011 #include "orbsvcs/Notify/Builder.h"
00012 #include "orbsvcs/Notify/Find_Worker_T.h"
00013 #include "orbsvcs/Notify/Seq_Worker_T.h"
00014 #include "orbsvcs/Notify/Topology_Saver.h"
00015 #include "orbsvcs/Notify/Save_Persist_Worker_T.h"
00016 #include "orbsvcs/Notify/Reconnect_Worker_T.h"
00017 #include "orbsvcs/Notify/Proxy.h"
00018 #include "orbsvcs/Notify/Event_Manager.h"
00019 #include "orbsvcs/Notify/POA_Helper.h"
00020 
00021 #include "tao/debug.h"
00022 //#define DEBUG_LEVEL 9
00023 #ifndef DEBUG_LEVEL
00024 # define DEBUG_LEVEL TAO_debug_level
00025 #endif //DEBUG_LEVEL
00026 
00027 ACE_RCSID(Notify, TAO_Notify_EventChannel, "EventChannel.cpp,v 1.31 2006/03/14 06:14:34 jtc Exp")
00028 
00029 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00030 
00031 typedef TAO_Notify_Find_Worker_T<TAO_Notify_ConsumerAdmin
00032                              , CosNotifyChannelAdmin::ConsumerAdmin
00033                              , CosNotifyChannelAdmin::ConsumerAdmin_ptr
00034                              , CosNotifyChannelAdmin::AdminNotFound>
00035 TAO_Notify_ConsumerAdmin_Find_Worker;
00036 
00037 typedef TAO_Notify_Find_Worker_T<TAO_Notify_SupplierAdmin
00038                              , CosNotifyChannelAdmin::SupplierAdmin
00039                              , CosNotifyChannelAdmin::SupplierAdmin_ptr
00040                              , CosNotifyChannelAdmin::AdminNotFound>
00041 TAO_Notify_SupplierAdmin_Find_Worker;
00042 
00043 typedef TAO_Notify_Seq_Worker_T<TAO_Notify_ConsumerAdmin> TAO_Notify_ConsumerAdmin_Seq_Worker;
00044 typedef TAO_Notify_Seq_Worker_T<TAO_Notify_SupplierAdmin> TAO_Notify_SupplierAdmin_Seq_Worker;
00045 
00046 TAO_Notify_EventChannel::TAO_Notify_EventChannel (void)
00047   : ecf_ (0)
00048   , ca_container_ (0)
00049   , sa_container_ (0)
00050 {
00051 }
00052 
00053 TAO_Notify_EventChannel::~TAO_Notify_EventChannel ()
00054 {
00055 }
00056 
00057 void
00058 TAO_Notify_EventChannel::init (TAO_Notify_EventChannelFactory* ecf
00059                            , const CosNotification::QoSProperties & initial_qos
00060                            , const CosNotification::AdminProperties & initial_admin
00061                            ACE_ENV_ARG_DECL)
00062 {
00063   ACE_ASSERT (this->ca_container_.get() == 0);
00064 
00065   // this-> on the following line confuses VC6
00066   initialize (ecf ACE_ENV_ARG_PARAMETER);
00067 
00068   this->ecf_.reset (ecf);
00069 
00070   // Init ca_container_
00071   TAO_Notify_ConsumerAdmin_Container* ca_container = 0;
00072   ACE_NEW_THROW_EX (ca_container,
00073                     TAO_Notify_ConsumerAdmin_Container (),
00074                     CORBA::INTERNAL ());
00075   ACE_CHECK;
00076   this->ca_container_.reset (ca_container);
00077 
00078   this->ca_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00079   ACE_CHECK;
00080 
00081   // Init ca_container_
00082   TAO_Notify_SupplierAdmin_Container* sa_container = 0;
00083   ACE_NEW_THROW_EX (sa_container,
00084                     TAO_Notify_SupplierAdmin_Container (),
00085                     CORBA::INTERNAL ());
00086   ACE_CHECK;
00087   this->sa_container_.reset (sa_container);
00088 
00089   this->sa_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00090   ACE_CHECK;
00091 
00092   // Set the admin properties.
00093   TAO_Notify_AdminProperties* admin_properties = 0;
00094   ACE_NEW_THROW_EX (admin_properties,
00095                     TAO_Notify_AdminProperties (),
00096                     CORBA::NO_MEMORY ());
00097   ACE_CHECK;
00098   this->set_admin_properties (admin_properties);
00099 
00100   // create the event manager. @@ use factory
00101   TAO_Notify_Event_Manager* event_manager = 0;
00102   ACE_NEW_THROW_EX (event_manager,
00103                     TAO_Notify_Event_Manager (),
00104                     CORBA::INTERNAL ());
00105   ACE_CHECK;
00106   this->set_event_manager (event_manager);
00107 
00108   this->event_manager().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00109   ACE_CHECK;
00110 
00111   const CosNotification::QoSProperties &default_ec_qos =
00112     TAO_Notify_PROPERTIES::instance ()->default_event_channel_qos_properties ();
00113 
00114   this->set_qos (default_ec_qos ACE_ENV_ARG_PARAMETER);
00115   ACE_CHECK;
00116 
00117   this->set_qos (initial_qos ACE_ENV_ARG_PARAMETER);
00118   ACE_CHECK;
00119 
00120   this->set_admin (initial_admin ACE_ENV_ARG_PARAMETER);
00121   ACE_CHECK;
00122 
00123   // Note originally default admins were allocated here, bt this caused problems
00124   // attempting to save the topology changes before the Event Channel was completely
00125   // constructed and linked to the ECF.
00126   // Lazy evaluation also avoids creating unneded admins.
00127 }
00128 
00129 
00130 void
00131 TAO_Notify_EventChannel::init (TAO_Notify::Topology_Parent* parent ACE_ENV_ARG_DECL)
00132 {
00133   ACE_ASSERT (this->ecf_.get() == 0);
00134   // this-> on the following line confuses VC6
00135   initialize (parent ACE_ENV_ARG_PARAMETER);
00136 
00137   this->ecf_.reset (dynamic_cast <TAO_Notify_EventChannelFactory*>(parent));
00138   ACE_ASSERT (this->ecf_.get() !=0);
00139 
00140   // Init ca_container_
00141   TAO_Notify_ConsumerAdmin_Container* ca_container = 0;
00142   ACE_NEW_THROW_EX (ca_container,
00143                     TAO_Notify_ConsumerAdmin_Container (),
00144                     CORBA::INTERNAL ());
00145   ACE_CHECK;
00146   this->ca_container_.reset (ca_container);
00147 
00148   this->ca_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00149   ACE_CHECK;
00150 
00151   TAO_Notify_SupplierAdmin_Container* sa_container = 0;
00152   // Init ca_container_
00153   ACE_NEW_THROW_EX (sa_container,
00154                     TAO_Notify_SupplierAdmin_Container (),
00155                     CORBA::INTERNAL ());
00156   ACE_CHECK;
00157   this->sa_container_.reset (sa_container);
00158 
00159   this->sa_container().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00160   ACE_CHECK;
00161 
00162   // Set the admin properties.
00163   TAO_Notify_AdminProperties* admin_properties = 0;
00164   ACE_NEW_THROW_EX (admin_properties,
00165                     TAO_Notify_AdminProperties (),
00166                     CORBA::NO_MEMORY ());
00167   ACE_CHECK;
00168   this->set_admin_properties (admin_properties);
00169 
00170   // create the event manager. @@ use factory
00171   TAO_Notify_Event_Manager* event_manager = 0;
00172   ACE_NEW_THROW_EX (event_manager,
00173                     TAO_Notify_Event_Manager (),
00174                     CORBA::INTERNAL ());
00175   ACE_CHECK;
00176   this->set_event_manager (event_manager);
00177 
00178   this->event_manager().init (ACE_ENV_SINGLE_ARG_PARAMETER);
00179   ACE_CHECK;
00180 
00181   const CosNotification::QoSProperties &default_ec_qos =
00182     TAO_Notify_PROPERTIES::instance ()->default_event_channel_qos_properties ();
00183 
00184   this->set_qos (default_ec_qos ACE_ENV_ARG_PARAMETER);
00185   ACE_CHECK;
00186 
00187 }
00188 
00189 
00190 void
00191 TAO_Notify_EventChannel::_add_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00192 {
00193   this->_incr_refcnt ();
00194 }
00195 
00196 void
00197 TAO_Notify_EventChannel::_remove_ref (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00198 {
00199   this->_decr_refcnt ();
00200 }
00201 
00202 void
00203 TAO_Notify_EventChannel::release (void)
00204 {
00205   delete this;
00206   //@@ inform factory
00207 }
00208 
00209 int
00210 TAO_Notify_EventChannel::shutdown (ACE_ENV_SINGLE_ARG_DECL)
00211 {
00212   int sd_ret = TAO_Notify_Object::shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00213   ACE_CHECK_RETURN (1);
00214 
00215   if (sd_ret == 1)
00216     return 1;
00217 
00218   this->ca_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00219   ACE_CHECK_RETURN (1);
00220 
00221   this->sa_container().shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00222   ACE_CHECK_RETURN (1);
00223 
00224   this->event_manager().shutdown ();
00225 
00226   return 0;
00227 }
00228 
00229 void
00230 TAO_Notify_EventChannel::destroy (ACE_ENV_SINGLE_ARG_DECL)
00231   ACE_THROW_SPEC ((
00232                    CORBA::SystemException
00233                    ))
00234 {
00235   TAO_Notify_EventChannel::Ptr guard( this );
00236 
00237   int result = this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00238   ACE_CHECK;
00239   if ( result == 1)
00240     return;
00241 
00242   this->ecf_->remove (this ACE_ENV_ARG_PARAMETER);
00243   ACE_CHECK;
00244 
00245   this->sa_container_.reset( 0 );
00246   this->ca_container_.reset( 0 );
00247 }
00248 
00249 void
00250 TAO_Notify_EventChannel::remove (TAO_Notify_ConsumerAdmin* consumer_admin ACE_ENV_ARG_DECL)
00251 {
00252   this->ca_container().remove (consumer_admin ACE_ENV_ARG_PARAMETER);
00253 }
00254 
00255 void
00256 TAO_Notify_EventChannel::remove (TAO_Notify_SupplierAdmin* supplier_admin ACE_ENV_ARG_DECL)
00257 {
00258   this->sa_container().remove (supplier_admin ACE_ENV_ARG_PARAMETER);
00259 }
00260 
00261 void
00262 TAO_Notify_EventChannel::set_qos (const CosNotification::QoSProperties & qos ACE_ENV_ARG_DECL)
00263   ACE_THROW_SPEC ((
00264                    CORBA::SystemException
00265                    , CosNotification::UnsupportedQoS
00266                    ))
00267 {
00268   this->TAO_Notify_Object::set_qos (qos ACE_ENV_ARG_PARAMETER);
00269 }
00270 
00271 CosNotification::QoSProperties*
00272 TAO_Notify_EventChannel::get_qos (ACE_ENV_SINGLE_ARG_DECL)
00273   ACE_THROW_SPEC ((
00274                    CORBA::SystemException
00275                    ))
00276 {
00277   return this->TAO_Notify_Object::get_qos (ACE_ENV_SINGLE_ARG_PARAMETER);
00278 }
00279 
00280 CosNotifyChannelAdmin::EventChannelFactory_ptr
00281 TAO_Notify_EventChannel::MyFactory (ACE_ENV_SINGLE_ARG_DECL)
00282   ACE_THROW_SPEC ((
00283                    CORBA::SystemException
00284                    ))
00285 {
00286   return this->ecf_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00287 }
00288 
00289 CosNotifyChannelAdmin::ConsumerAdmin_ptr
00290 TAO_Notify_EventChannel::default_consumer_admin (ACE_ENV_SINGLE_ARG_DECL)
00291   ACE_THROW_SPEC ((
00292                    CORBA::SystemException
00293                    ))
00294 {
00295   if (CORBA::is_nil (default_consumer_admin_.in ()))
00296     {
00297       ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->default_admin_mutex_, CosNotifyChannelAdmin::ConsumerAdmin::_nil());
00298       if (CORBA::is_nil (default_consumer_admin_.in ()))
00299         {
00300           CosNotifyChannelAdmin::AdminID id;
00301           this->default_consumer_admin_ = this->new_for_consumers (CosNotifyChannelAdmin::OR_OP, id ACE_ENV_ARG_PARAMETER);
00302           ACE_CHECK_RETURN (CosNotifyChannelAdmin::ConsumerAdmin::_nil());
00303           // Wish there was a better way to do this!
00304           PortableServer::ServantBase * admin_servant =
00305             this->poa()->reference_to_servant (
00306               this->default_consumer_admin_.in ()
00307               ACE_ENV_ARG_PARAMETER);
00308           ACE_CHECK_RETURN (CosNotifyChannelAdmin::ConsumerAdmin::_nil());
00309           TAO_Notify_Admin * pAdmin = dynamic_cast <TAO_Notify_Admin *> (admin_servant);
00310           ACE_ASSERT (pAdmin != 0); // if this assert triggers, we have mixed implementations?
00311           if (pAdmin != 0)
00312             {
00313               pAdmin->set_default (true);
00314             }
00315         }
00316     }
00317   return CosNotifyChannelAdmin::ConsumerAdmin::_duplicate (this->default_consumer_admin_.in ());
00318 }
00319 
00320 CosNotifyChannelAdmin::SupplierAdmin_ptr
00321 TAO_Notify_EventChannel::default_supplier_admin (ACE_ENV_SINGLE_ARG_DECL)
00322   ACE_THROW_SPEC ((
00323                    CORBA::SystemException
00324                    ))
00325 {
00326   if (CORBA::is_nil (default_supplier_admin_.in ()))
00327     {
00328       ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, guard, this->default_admin_mutex_, CosNotifyChannelAdmin::SupplierAdmin::_nil());
00329       if (CORBA::is_nil (default_supplier_admin_.in ()))
00330         {
00331           CosNotifyChannelAdmin::AdminID id;
00332           this->default_supplier_admin_ = this->new_for_suppliers (CosNotifyChannelAdmin::OR_OP, id ACE_ENV_ARG_PARAMETER);
00333           ACE_CHECK_RETURN (CosNotifyChannelAdmin::SupplierAdmin::_nil());
00334           PortableServer::ServantBase * admin_servant =
00335             this->poa()->poa()->reference_to_servant (
00336               this->default_supplier_admin_.in ()
00337               ACE_ENV_ARG_PARAMETER);
00338           ACE_CHECK_RETURN (0);
00339           TAO_Notify_Admin * pAdmin = dynamic_cast <TAO_Notify_Admin *> (admin_servant);
00340           ACE_ASSERT (pAdmin != 0); // if this assert triggers, we have mixed implementations?
00341           if (pAdmin != 0)
00342             {
00343               pAdmin->set_default (true);
00344             }
00345         }
00346     }
00347   return CosNotifyChannelAdmin::SupplierAdmin::_duplicate (this->default_supplier_admin_.in ());
00348 }
00349 
00350 ::CosNotifyFilter::FilterFactory_ptr TAO_Notify_EventChannel::default_filter_factory (ACE_ENV_SINGLE_ARG_DECL)
00351   ACE_THROW_SPEC ((
00352                    CORBA::SystemException
00353                    ))
00354 {
00355   return this->ecf_->get_default_filter_factory (ACE_ENV_SINGLE_ARG_PARAMETER);
00356 }
00357 
00358 ::CosNotifyChannelAdmin::ConsumerAdmin_ptr
00359 TAO_Notify_EventChannel::new_for_consumers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
00360                                         CosNotifyChannelAdmin::AdminID_out id ACE_ENV_ARG_DECL
00361                                         )
00362   ACE_THROW_SPEC ((
00363                    CORBA::SystemException
00364                    ))
00365 
00366 {
00367   ::CosNotifyChannelAdmin::ConsumerAdmin_var ca =
00368     TAO_Notify_PROPERTIES::instance()->builder()->build_consumer_admin (this, op, id ACE_ENV_ARG_PARAMETER);
00369   ACE_CHECK_RETURN (ca._retn ());
00370   this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
00371   ACE_CHECK_RETURN (ca._retn ());
00372   return ca._retn ();
00373 }
00374 
00375 ::CosNotifyChannelAdmin::SupplierAdmin_ptr
00376 TAO_Notify_EventChannel::new_for_suppliers (CosNotifyChannelAdmin::InterFilterGroupOperator op,
00377                                         CosNotifyChannelAdmin::AdminID_out id
00378                                         ACE_ENV_ARG_DECL
00379                                         )
00380   ACE_THROW_SPEC ((
00381                    CORBA::SystemException
00382                    ))
00383 {
00384   ::CosNotifyChannelAdmin::SupplierAdmin_var sa =
00385     TAO_Notify_PROPERTIES::instance()->builder()->build_supplier_admin (this, op, id ACE_ENV_ARG_PARAMETER);
00386   ACE_CHECK_RETURN (sa._retn ());
00387   this->self_change (ACE_ENV_SINGLE_ARG_PARAMETER);
00388   ACE_CHECK_RETURN (sa._retn ());
00389   return sa._retn ();
00390 }
00391 
00392 CosNotifyChannelAdmin::ConsumerAdmin_ptr
00393 TAO_Notify_EventChannel::get_consumeradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
00394   ACE_THROW_SPEC ((
00395                    CORBA::SystemException
00396                    , CosNotifyChannelAdmin::AdminNotFound
00397                    ))
00398 {
00399   TAO_Notify_ConsumerAdmin_Find_Worker find_worker;
00400 
00401   return find_worker.resolve (id, this->ca_container() ACE_ENV_ARG_PARAMETER);
00402 }
00403 
00404 CosNotifyChannelAdmin::SupplierAdmin_ptr
00405 TAO_Notify_EventChannel::get_supplieradmin (CosNotifyChannelAdmin::AdminID id ACE_ENV_ARG_DECL)
00406   ACE_THROW_SPEC ((
00407                    CORBA::SystemException
00408                    , CosNotifyChannelAdmin::AdminNotFound
00409                    ))
00410 {
00411   TAO_Notify_SupplierAdmin_Find_Worker find_worker;
00412 
00413   return find_worker.resolve (id, this->sa_container() ACE_ENV_ARG_PARAMETER);
00414 }
00415 
00416 CosNotifyChannelAdmin::AdminIDSeq*
00417 TAO_Notify_EventChannel::get_all_consumeradmins (ACE_ENV_SINGLE_ARG_DECL)
00418   ACE_THROW_SPEC ((
00419                    CORBA::SystemException
00420                    ))
00421 {
00422   TAO_Notify_ConsumerAdmin_Seq_Worker seq_worker;
00423 
00424   return seq_worker.create (this->ca_container() ACE_ENV_ARG_PARAMETER);
00425 }
00426 
00427 CosNotifyChannelAdmin::AdminIDSeq*
00428 TAO_Notify_EventChannel::get_all_supplieradmins (ACE_ENV_SINGLE_ARG_DECL)
00429   ACE_THROW_SPEC ((
00430                    CORBA::SystemException
00431                    ))
00432 {
00433   TAO_Notify_SupplierAdmin_Seq_Worker seq_worker;
00434 
00435   return seq_worker.create (this->sa_container() ACE_ENV_ARG_PARAMETER);
00436 }
00437 
00438 void
00439 TAO_Notify_EventChannel::set_admin (const CosNotification::AdminProperties & admin ACE_ENV_ARG_DECL_NOT_USED)
00440   ACE_THROW_SPEC ((
00441                    CORBA::SystemException
00442                    , CosNotification::UnsupportedAdmin
00443                    ))
00444 {
00445   this->admin_properties().init (admin);
00446 }
00447 
00448 CosNotification::AdminProperties*
00449 TAO_Notify_EventChannel::get_admin (ACE_ENV_SINGLE_ARG_DECL)
00450   ACE_THROW_SPEC ((
00451                    CORBA::SystemException
00452                    ))
00453 {
00454   CosNotification::AdminProperties_var properties;
00455 
00456   ACE_NEW_THROW_EX (properties,
00457                     CosNotification::AdminProperties (),
00458                     CORBA::NO_MEMORY ());
00459 
00460   this->admin_properties().populate (properties);
00461 
00462   return properties._retn ();
00463 }
00464 
00465 CosEventChannelAdmin::ConsumerAdmin_ptr
00466 TAO_Notify_EventChannel::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
00467   ACE_THROW_SPEC ((
00468                    CORBA::SystemException
00469                    ))
00470 {
00471   return this->default_consumer_admin(ACE_ENV_SINGLE_ARG_PARAMETER);
00472 }
00473 
00474 CosEventChannelAdmin::SupplierAdmin_ptr
00475 TAO_Notify_EventChannel::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
00476   ACE_THROW_SPEC ((
00477                    CORBA::SystemException
00478                    ))
00479 {
00480   return this->default_supplier_admin (ACE_ENV_SINGLE_ARG_PARAMETER);
00481 }
00482 
00483 void
00484 TAO_Notify_EventChannel::validate_qos (const CosNotification::QoSProperties & /*required_qos*/,
00485                                    CosNotification::NamedPropertyRangeSeq_out /*available_qos*/
00486                                    ACE_ENV_ARG_DECL
00487                                    )
00488   ACE_THROW_SPEC ((
00489                    CORBA::SystemException
00490                    , CosNotification::UnsupportedQoS
00491                    ))
00492 {
00493   ACE_THROW (CORBA::NO_IMPLEMENT ());
00494 }
00495 
00496 void
00497 TAO_Notify_EventChannel::save_persistent (TAO_Notify::Topology_Saver& saver ACE_ENV_ARG_DECL)
00498 {
00499   bool changed = this->self_changed_;
00500   this->self_changed_ = false;
00501   this->children_changed_ = false;
00502 
00503   if (is_persistent ())
00504   {
00505     TAO_Notify::NVPList attrs;
00506     this->save_attrs(attrs);
00507 
00508     bool want_all_children = saver.begin_object(
00509       this->id(), "channel", attrs, changed ACE_ENV_ARG_PARAMETER);
00510     ACE_CHECK;
00511 
00512     TAO_Notify::Save_Persist_Worker<TAO_Notify_ConsumerAdmin> ca_wrk(saver, want_all_children);
00513 
00514     this->ca_container().collection()->for_each(&ca_wrk ACE_ENV_ARG_PARAMETER);
00515     ACE_CHECK;
00516 
00517     TAO_Notify::Save_Persist_Worker<TAO_Notify_SupplierAdmin> sa_wrk(saver, want_all_children);
00518     this->sa_container().collection()->for_each(&sa_wrk ACE_ENV_ARG_PARAMETER);
00519     ACE_CHECK;
00520 
00521     saver.end_object(this->id(), "channel" ACE_ENV_ARG_PARAMETER);
00522   }
00523 }
00524 
00525 namespace {
00526   template<class T>
00527     void add_attr(TAO_Notify::NVPList& attrs, const T& prop) {
00528       if (prop.is_valid())
00529       {
00530         attrs.push_back(TAO_Notify::NVP (prop));
00531       }
00532     }
00533 }
00534 
00535 void
00536 TAO_Notify_EventChannel::save_attrs(TAO_Notify::NVPList& attrs)
00537 {
00538   TAO_Notify_Object::save_attrs(attrs);
00539   add_attr(attrs, this->admin_properties().max_global_queue_length());
00540   add_attr(attrs, this->admin_properties().max_consumers());
00541   add_attr(attrs, this->admin_properties().max_suppliers());
00542   add_attr(attrs, this->admin_properties().reject_new_events());
00543 }
00544 
00545 void
00546 TAO_Notify_EventChannel::load_attrs(const TAO_Notify::NVPList& attrs)
00547 {
00548   TAO_Notify_Object::load_attrs(attrs);
00549   attrs.load(this->admin_properties().max_global_queue_length());
00550   attrs.load(this->admin_properties().max_consumers());
00551   attrs.load(this->admin_properties().max_suppliers());
00552   attrs.load(this->admin_properties().reject_new_events());
00553   this->admin_properties().init();
00554 }
00555 
00556 TAO_Notify::Topology_Object *
00557 TAO_Notify_EventChannel::load_child (const ACE_CString &type,
00558                                                   CORBA::Long id,
00559                                                   const TAO_Notify::NVPList& attrs
00560                                                   ACE_ENV_ARG_DECL)
00561 {
00562   TAO_Notify::Topology_Object* result = this;
00563   if (type == "consumer_admin")
00564   {
00565     if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
00566       ACE_TEXT ("(%P|%t) EventChannel reload consumer_admin %d\n")
00567       , static_cast<int> (id)
00568       ));
00569 
00570     // call special builder method to reload
00571     TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
00572     TAO_Notify_ConsumerAdmin * ca = bld->build_consumer_admin (
00573       this,
00574       id
00575       ACE_ENV_ARG_PARAMETER);
00576     ACE_CHECK_RETURN(0);
00577     ca->load_attrs (attrs);
00578     if (ca->is_default ())
00579       {
00580         CORBA::Object_var caob = this->poa()->servant_to_reference (ca ACE_ENV_ARG_PARAMETER);
00581         ACE_CHECK_RETURN(0);
00582         this->default_consumer_admin_ =
00583           CosNotifyChannelAdmin::ConsumerAdmin::_narrow (
00584           caob.in () ACE_ENV_ARG_PARAMETER);
00585         ACE_CHECK_RETURN(0);
00586       }
00587     result = ca;
00588   }
00589   else if (type == "supplier_admin")
00590   {
00591     if (DEBUG_LEVEL) ACE_DEBUG ((LM_DEBUG,
00592       ACE_TEXT ("(%P|%t) EventChannel reload supplier_admin %d\n")
00593       , static_cast<int> (id)
00594       ));
00595     TAO_Notify_Builder* bld = TAO_Notify_PROPERTIES::instance()->builder();
00596 
00597     TAO_Notify_SupplierAdmin * sa = bld->build_supplier_admin (
00598       this,
00599       id
00600       ACE_ENV_ARG_PARAMETER);
00601     ACE_CHECK_RETURN(0);
00602     sa->load_attrs (attrs);
00603     if (sa->is_default ())
00604       {
00605         CORBA::Object_var saob = this->poa()->servant_to_reference (sa ACE_ENV_ARG_PARAMETER);
00606         ACE_CHECK_RETURN(0);
00607         this->default_supplier_admin_ =
00608           CosNotifyChannelAdmin::SupplierAdmin::_narrow (
00609           saob.in () ACE_ENV_ARG_PARAMETER);
00610         ACE_CHECK_RETURN(0);
00611       }
00612     result = sa;
00613   }
00614   return result;
00615 }
00616 TAO_Notify_ProxyConsumer *
00617 TAO_Notify_EventChannel::find_proxy_consumer (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL)
00618 {
00619   TAO_Notify_ProxyConsumer * result = 0;
00620   size_t path_size = id_path.size ();
00621   if (position < path_size)
00622   {
00623     TAO_Notify_SupplierAdmin_Find_Worker find_worker;
00624     TAO_Notify_SupplierAdmin * admin = find_worker.find (id_path[position], this->sa_container() ACE_ENV_ARG_PARAMETER);
00625     ACE_CHECK_RETURN (0);
00626     ++position;
00627     if (admin != 0)
00628     {
00629       result = admin->find_proxy_consumer (id_path, position
00630         ACE_ENV_ARG_PARAMETER);
00631       ACE_CHECK_RETURN(0);
00632     }
00633   }
00634   return result;
00635 }
00636 
00637 TAO_Notify_ProxySupplier *
00638 TAO_Notify_EventChannel::find_proxy_supplier (TAO_Notify::IdVec & id_path, size_t position ACE_ENV_ARG_DECL)
00639 {
00640   TAO_Notify_ProxySupplier * result = 0;
00641   size_t path_size = id_path.size ();
00642   if (position < path_size)
00643   {
00644     TAO_Notify_ConsumerAdmin_Find_Worker find_worker;
00645     TAO_Notify_ConsumerAdmin * admin = find_worker.find (id_path[position], this->ca_container() ACE_ENV_ARG_PARAMETER);
00646     ACE_CHECK_RETURN (0);
00647     ++position;
00648     if (admin != 0)
00649     {
00650       result = admin->find_proxy_supplier (id_path, position
00651         ACE_ENV_ARG_PARAMETER);
00652       ACE_CHECK_RETURN(0);
00653     }
00654   }
00655   return result;
00656 }
00657 
00658 
00659 void
00660 TAO_Notify_EventChannel::reconnect (ACE_ENV_SINGLE_ARG_DECL)
00661 {
00662   TAO_Notify::Reconnect_Worker<TAO_Notify_ConsumerAdmin> ca_wrk;
00663   this->ca_container().collection()->for_each(&ca_wrk ACE_ENV_ARG_PARAMETER);
00664   ACE_CHECK;
00665 
00666   TAO_Notify::Reconnect_Worker<TAO_Notify_SupplierAdmin> sa_wrk;
00667   this->sa_container().collection()->for_each(&sa_wrk ACE_ENV_ARG_PARAMETER);
00668   ACE_CHECK;
00669 }
00670 
00671 TAO_Notify_EventChannel::TAO_Notify_ConsumerAdmin_Container&
00672 TAO_Notify_EventChannel::ca_container()
00673 {
00674   ACE_ASSERT( this->ca_container_.get() != 0 );
00675   return *ca_container_;
00676 }
00677 
00678 TAO_Notify_EventChannel::TAO_Notify_SupplierAdmin_Container&
00679 TAO_Notify_EventChannel::sa_container()
00680 {
00681   ACE_ASSERT( this->sa_container_.get() != 0 );
00682   return *sa_container_;
00683 }
00684 
00685 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Thu Nov 9 13:24:11 2006 for TAO_CosNotification by doxygen 1.3.6