diff options
Diffstat (limited to 'TAO/orbsvcs/examples/CosEC/RtEC_Based/lib/CosEvent_Utilities.cpp')
-rw-r--r-- | TAO/orbsvcs/examples/CosEC/RtEC_Based/lib/CosEvent_Utilities.cpp | 393 |
1 files changed, 393 insertions, 0 deletions
diff --git a/TAO/orbsvcs/examples/CosEC/RtEC_Based/lib/CosEvent_Utilities.cpp b/TAO/orbsvcs/examples/CosEC/RtEC_Based/lib/CosEvent_Utilities.cpp new file mode 100644 index 00000000000..98f8fb7d23c --- /dev/null +++ b/TAO/orbsvcs/examples/CosEC/RtEC_Based/lib/CosEvent_Utilities.cpp @@ -0,0 +1,393 @@ +// -*- C++ -*- +// $Id$ + +#include "CosEvent_Utilities.h" +#include "orbsvcs/Event/EC_Event_Channel.h" +#include "orbsvcs/Event_Service_Constants.h" +#include "EventChannel_i.h" +#include "ace/Auto_Ptr.h" +#include "ace/OS_NS_string.h" + +CosEC_ServantBase::CosEC_ServantBase (void) + :poa_ (PortableServer::POA::_nil ()), + rtec_servant_ (0), + cosec_servant_ (0), + rtec_ (RtecEventChannelAdmin::EventChannel::_nil ()), + cosec_ (CosEventChannelAdmin::EventChannel::_nil ()), + eventTypeIds_ (0), + eventSourceIds_ (0), + source_type_pairs_ (0) +{ + // No-Op. +} + +CosEC_ServantBase::~CosEC_ServantBase (void) +{ + // No-Op. +#if 0 + ACE_DEBUG ((LM_DEBUG, "in cosec servant base %d \n", this)); +#endif +} + +void +CosEC_ServantBase::init (PortableServer::POA_ptr thispoa, + PortableServer::POA_ptr poa, + char *, + char *, + char *) +{ + ACE_ASSERT (!CORBA::is_nil (thispoa)); + ACE_ASSERT (!CORBA::is_nil (poa)); + + // Save the POA refs. + this->thispoa_ = PortableServer::POA::_duplicate (thispoa); + this->poa_ = PortableServer::POA::_duplicate (poa); + + auto_ptr<POA_RtecEventChannelAdmin::EventChannel> + auto_rtec_servant_ (this->create_rtec ()); + + auto_ptr<TAO_CosEC_EventChannel_i> + auto_cosec_servant_ (this->create_cosec ()); + + // if all the servants were allocated then set the class pointers. + this->rtec_servant_ = auto_rtec_servant_.release (); + this->cosec_servant_ = auto_cosec_servant_.release (); +} + +int +CosEC_ServantBase::activate (void) +{ + ACE_ASSERT (!CORBA::is_nil (this->poa_.in ())); + ACE_ASSERT (!CORBA::is_nil (this->thispoa_.in ())); + + // Activate the Rtec + this->activate_rtec (); + + // Activate the CosEC + int retval = this->activate_cosec (); + if (retval != 0) + return -1; + + // Activate ourselves.. + // Note that the POA is <thispoa_> + + PortableServer::ObjectId_var oid = + this->thispoa_->activate_object (this); + + this->_remove_ref (); + + CORBA::Object_var obj = + this->thispoa_->id_to_reference (oid.in ()); + + return 0; // success. +} + +int +CosEC_ServantBase::activate (const char* servant_id) +{ + ACE_ASSERT (!CORBA::is_nil (this->poa_.in ())); + ACE_ASSERT (!CORBA::is_nil (this->thispoa_.in ())); + + // Activate the Rtec + this->activate_rtec (); + + // Activate the CosEC + int retval = this->activate_cosec (); + if (retval != 0) + return -1; + + PortableServer::ObjectId_var oid = + PortableServer::string_to_ObjectId (servant_id); + + // Activate ourselves. + // Note that the POA is <thispoa_> + this->thispoa_->activate_object_with_id (oid.in (), + this); + + this->_remove_ref (); + + CORBA::Object_var obj = + this->thispoa_->id_to_reference (oid.in ()); + + return 0; // success. +} + +void +CosEC_ServantBase::activate_rtec (void) +{ + // Activate the Rtec + PortableServer::ObjectId_var oid = + this->poa_->activate_object (this->rtec_servant_); + + this->rtec_servant_->_remove_ref (); + + CORBA::Object_var obj = + this->poa_->id_to_reference (oid.in ()); + + this->rtec_ = + RtecEventChannelAdmin::EventChannel::_narrow (obj.in ()); +} + +int +CosEC_ServantBase::activate_cosec (void) +{ + // Initialize the CosEC servant. + RtecBase::handle_t supp_handle = 0; + + this->init_SupplierQOS (supp_handle, + this->supplier_qos_, + this->source_type_pairs_); + + RtecBase::handle_t cons_handle = 0; + + this->init_ConsumerQOS (cons_handle, + this->consumer_qos_, + this->eventTypeIds_, + this->eventSourceIds_); + + const RtecEventChannelAdmin::ConsumerQOS &consumerqos = + this->consumer_qos_.get_ConsumerQOS (); + + const RtecEventChannelAdmin::SupplierQOS &supplierqos = + this->supplier_qos_.get_SupplierQOS (); + + if (this->cosec_servant_->init (consumerqos, + supplierqos, + this->rtec_.in ()) != 0) + return -1; + + // Activate the CosEC + PortableServer::ObjectId_var oid = + this->poa_->activate_object (this->cosec_servant_); + + this->cosec_servant_->_remove_ref (); + + CORBA::Object_var obj = + this->poa_->id_to_reference (oid.in ()); + + this->cosec_ = + CosEventChannelAdmin::EventChannel::_narrow (obj.in ()); + return 0; // success +} + +void +CosEC_ServantBase::deactivate (void) +{ + // Deactivate all those we control... + this->deactivate_rtec (); + + this->deactivate_cosec (); + + // Finally we go away.. + PortableServer::ObjectId_var oid = + this->thispoa_->servant_to_id (this); + + // deactivate from the poa. + this->thispoa_->deactivate_object (oid.in ()); +} + +void +CosEC_ServantBase::deactivate_rtec (void) +{ + // Deactivate the rtec. + PortableServer::ObjectId_var oid = + this->poa_->servant_to_id (this->rtec_servant_); + + // deactivate from the poa. + this->poa_->deactivate_object (oid.in ()); +} + +void +CosEC_ServantBase::deactivate_cosec (void) +{ + // Deactivate the cosec. + PortableServer::ObjectId_var oid = + this->poa_->servant_to_id (this->cosec_servant_); + + // deactivate from the poa. + this->poa_->deactivate_object (oid.in ()); +} + +CosEventChannelAdmin::ConsumerAdmin_ptr +CosEC_ServantBase::for_consumers (void) +{ + return this->cosec_->for_consumers (); +} + +CosEventChannelAdmin::SupplierAdmin_ptr +CosEC_ServantBase::for_suppliers (void) +{ + return this->cosec_->for_suppliers (); +} + +void +CosEC_ServantBase::destroy (void) +{ + // Deactivate all the contained servants and ourselves. + // The poa will "destroy" the ref counted servants. + + this->deactivate (); +} + +POA_RtecEventChannelAdmin::EventChannel_ptr +CosEC_ServantBase::create_rtec (void) +{ + // Create the RtEC servant. + TAO_EC_Event_Channel_Attributes attr (this->poa_.in (), + this->poa_.in ()); + TAO_EC_Event_Channel* _rtec_servant; + ACE_NEW_THROW_EX (_rtec_servant, + TAO_EC_Event_Channel (attr), + CORBA::NO_MEMORY ()); + + return _rtec_servant; +} + +TAO_CosEC_EventChannel_i* +CosEC_ServantBase::create_cosec (void) +{ + // Create the CosEC servant. + TAO_CosEC_EventChannel_i* _cosec_servant; + ACE_NEW_THROW_EX (_cosec_servant, + TAO_CosEC_EventChannel_i (), + CORBA::NO_MEMORY ()); + + return _cosec_servant; +} + +void +CosEC_ServantBase::init_SupplierQOS (RtecBase::handle_t supp_handle, + ACE_SupplierQOS_Factory &supplier_qos, + char *source_type_pairs) +{ + // @@ Pradeep: It is very important that you make the type of + // events generated by the CosEC an option. + // I know this is not very well documented, but the type should + // be >= ACE_ES_EVENT_UNDEFINED = 16 + // Something else: please make the EventSourceID for the + // supplier also an option... + + const char *c = " "; // space + char *tok = 0; + + // if nothing was specified on the command line use defaults.. + if (source_type_pairs == 0) + supplier_qos.insert (1, + ACE_ES_EVENT_ANY, + supp_handle, + 1); + else // parse the event types.. + { + tok = ACE_OS::strtok (source_type_pairs, c); + if (tok == 0) // error + { + ACE_DEBUG ((LM_DEBUG, "error parsing source,event pairs for SupplierQOS, defaulting to source id = 1, eventid = ACE_ES_EVENT_ANY")); + + supplier_qos.insert (1, + ACE_ES_EVENT_ANY, + supp_handle, + 1); + } + else + // we just use 1 source-type pair in the event channel. + // so scan for the 1st pair only. + { + int source_val = 0, type_val = 0; + source_val = ACE_OS::atoi (tok); + + tok = ACE_OS::strtok (0, c); + + if (tok != 0) + type_val = ACE_OS::atoi (tok); + + ACE_DEBUG ((LM_DEBUG, "supplier_qos::insert (%d, %d)\n", + source_val, type_val)); + + // Setup the QOS params.. + supplier_qos.insert (source_val, + type_val, + supp_handle, + 1); + } + } +} + +void +CosEC_ServantBase::init_ConsumerQOS (RtecBase::handle_t cons_handle, + ACE_ConsumerQOS_Factory &consumer_qos, + char *eventTypeIds, + char *eventSourceIds + ) +{ + // @@ Pradeep: ditto here, make the set of sources (and/or type) + // a parameter, and make sure the user can specify multiple of + // them (just call insert_source() or insert_type() in the + // parse_args routine). + + const char *c = " "; // space + char *tok = 0; + + consumer_qos.start_disjunction_group (); + + // insert the event ids first.. + + // if nothing was specified on the command line use defaults.. + if (eventTypeIds == 0) + { + //consumer_qos.insert_type (ACE_ES_EVENT_ANY, // default + // cons_handle); + // @@ if i uncomment this line then the Rtec displays the message + // "Consumer tried to register for allevents! This is not implemented." + // whenever a consumer tries to register with it. + } + else // parse the event types.. + { + tok = ACE_OS::strtok (eventTypeIds, c); + if (tok == 0) // error + { + ACE_DEBUG ((LM_DEBUG, "error parsing eventIds for ConsumerQOS, defaulting to 1")); + consumer_qos.insert_type (ACE_ES_EVENT_ANY, + cons_handle); + } + else + do + { + int type_val = ACE_OS::atoi (tok); + ACE_DEBUG ((LM_DEBUG, "consumer_qos::insert_type (%d)\n", + type_val)); + consumer_qos.insert_type (type_val, + cons_handle); + tok = ACE_OS::strtok (0, c); + } + while (tok != 0); + } + + // repeat for source ids.. + + // if nothing was specified on the command line use defaults.. + if (eventSourceIds == 0) + consumer_qos.insert_source (1, // default = 1 + cons_handle); + else // parse the event types.. + { + tok = ACE_OS::strtok (eventSourceIds, c); + if (tok == 0) // error + { + ACE_DEBUG ((LM_DEBUG, "error parsing sourceIds for ConsumerQOS, defaulting to 1")); + consumer_qos.insert_source (1, // default = 1 + cons_handle); + } + else + do + { + int source_val = ACE_OS::atoi (tok); + ACE_DEBUG ((LM_DEBUG, "consumer_qos::insert_source (%d)\n", + source_val)); + consumer_qos.insert_type (source_val, + cons_handle); + tok = ACE_OS::strtok (0, c); + } + while (tok != 0); + } +} + |