void TAO_CosNotify_Service::finalize_service ( CosNotifyChannelAdmin::EventChannelFactory_ptr factory) { // Get out early if we can if (CORBA::is_nil (factory)) return; // Make sure the factory doesn't go away while we're in here CosNotifyChannelAdmin::EventChannelFactory_var ecf = CosNotifyChannelAdmin::EventChannelFactory::_duplicate (factory); // Find all the consumer admin objects and shutdown the worker tasks CosNotifyChannelAdmin::ChannelIDSeq_var channels = ecf->get_all_channels (); CORBA::ULong length = channels->length (); for(CORBA::ULong i = 0; i < length; i++) { try { CosNotifyChannelAdmin::EventChannel_var ec = ecf->get_event_channel (channels[i]); if (!CORBA::is_nil (ec.in ())) { TAO_Notify_EventChannel* nec = dynamic_cast<TAO_Notify_EventChannel*> (ec->_servant ()); if (nec != 0) nec->destroy (); } } catch (const CORBA::Exception&) { // We're shutting things down, so ignore exceptions } } TAO_Notify_EventChannelFactory* necf = dynamic_cast<TAO_Notify_EventChannelFactory*> (ecf->_servant ()); if (necf != 0) necf->stop_validator(); }
CosNotifyChannelAdmin::EventChannel_var get_event_channel(CORBA::ORB_ptr orb) { CosNotifyChannelAdmin::EventChannel_var ec; CosNotifyChannelAdmin::ChannelID id; CosNotification::QoSProperties init_qos(0); CosNotification::AdminProperties init_admin(0); std::cout << "Get CosNotifyChannelAdmin::EventChannelFactory" << std::endl; std::cout << "IorEventChannelFactory=" << ior << std::endl; CORBA::Object_var obj = orb->string_to_object(ior); if (CORBA::is_nil(obj.in ())) { std::cerr << "Bad ec_fact.ior " << std::endl; exit(1); } CosNotifyChannelAdmin::EventChannelFactory_var factory = CosNotifyChannelAdmin::EventChannelFactory::_narrow(obj.in ()); if (CORBA::is_nil(factory.in())) { std::cerr << "Could not _narrow object to type CosNotifyChannelAdmin::EventChannelFactory" << std::endl; exit(1); } //Get the first ec CosNotifyChannelAdmin::ChannelIDSeq_var channelIdSeq; try { channelIdSeq = factory->get_all_channels(); } catch (CORBA::SystemException& se ) { std::cerr << "System exception occurred during get_all_channels: " << se << std::endl; exit(1); } if( channelIdSeq->length() == 0 ) { try { ec = factory->create_channel( init_qos, init_admin, id); } catch (CORBA::SystemException& se ) { std::cerr << "System exception occurred during find_channel: " << se << std::endl; exit(1); } } else { try { ec = factory->get_event_channel(channelIdSeq.in()[0]); } catch (CosNotifyChannelAdmin::ChannelNotFound&) { std::cerr << "ChannelNotFound: " << channelIdSeq.in()[0] << std::endl; exit(1); } catch (CORBA::SystemException& se ) { std::cerr << "System exception occurred during get_event_channel: " << se << std::endl; exit(1); } } return ec._retn(); }