diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannel_i.h')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannel_i.h | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannel_i.h b/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannel_i.h new file mode 100644 index 00000000000..74d7a6601d8 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/Notify/Notify_EventChannel_i.h @@ -0,0 +1,318 @@ +//============================================================================= +/** + * @file Notify_EventChannel_i.h + * + * $Id$ + * + * Implements the CosNotifyChannelAdmin::EventChannel interface. + * + * + * @author Pradeep Gore <pradeep@cs.wustl.edu> + */ +//============================================================================= + + +#ifndef TAO_NOTIFY_EVENTCHANNEL_I_H_ +#define TAO_NOTIFY_EVENTCHANNEL_I_H_ +#include "ace/pre.h" +#include "ace/Hash_Map_Manager.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "orbsvcs/CosNotifyChannelAdminS.h" +#include "Notify_ID_Pool_T.h" +#include "Notify_QoSAdmin_i.h" +#include "Notify_Collection.h" + +class TAO_Notify_EventChannelFactory_i; +class TAO_Notify_Resource_Manager; +class TAO_Notify_Event_Manager; +class TAO_Notify_CO_Factory; +class TAO_Notify_POA_Factory; +class TAO_Notify_EMO_Factory; +class TAO_Notify_EventListener; + +#if defined (_MSC_VER) +#if (_MSC_VER >= 1200) +#pragma warning (push) +#endif /* _MSC_VER >= 1200 */ +#pragma warning (disable:4250) +#endif /* _MSC_VER */ + + /** + * @class TAO_Notify_EventChannel_i + * + * @brief TAO_Notify_EventChannel_i + * + * This class handles all the object factory functionality.All the event + * routing is handled by its contained Event Manager class. + * = MISC. NOTES + * This class creates and owns 2 child POA's. one to contain CA's and the other for SA's. + * Now, a Channel object can be destoyed in 2 ways - as a side effect of its parent POA being + * destroyed or if this class's <destroy> method is invoked. If the object is being destroyed + * as a result of its Parent POA being destroyed, it is illegal to destroy a childPOA + * because, the root poa destruction will destroy all child poa's. + * So in the destructor we conditionally check if the child POAs should be destroyed explicitly + * or not. + */ +class TAO_Notify_Export TAO_Notify_EventChannel_i : public virtual POA_CosNotifyChannelAdmin::EventChannel, public PortableServer::RefCountServantBase +{ + public: + /// Constructor. + /// <channel_factory> is the parent. + TAO_Notify_EventChannel_i (TAO_Notify_EventChannelFactory_i* channel_factory); + + /// Destructor + virtual ~TAO_Notify_EventChannel_i (void); + + /** + * Initialize this object. + * checks if the <initial_qos> and <initial admin> are valid. + * creates default filter, consumer admin and supplier admin. + */ + void init (CosNotifyChannelAdmin::ChannelID channel_id, + const CosNotification::QoSProperties& initial_qos, + const CosNotification::AdminProperties& initial_admin, + PortableServer::POA_ptr default_POA, + PortableServer::POA_ptr my_POA + ACE_ENV_ARG_DECL); + + // = Accessors + /// Get the default POA. + PortableServer::POA_ptr get_default_POA (void); + + /// Get the CORBA object for this servant + CosNotifyChannelAdmin::EventChannel_ptr get_ref (ACE_ENV_SINGLE_ARG_DECL); + + /// Get the event manager. + TAO_Notify_Event_Manager* get_event_manager (void); + + // = Child destroyed notification. + /// This id is no longer in use.It can be reused by <consumer_admin_ids_>. + void consumer_admin_destroyed (CosNotifyChannelAdmin::AdminID CA_ID); + + /// This id is no longer in use.It can be reused by <supplier_admin_ids_>. + void supplier_admin_destroyed (CosNotifyChannelAdmin::AdminID SA_ID); + + /// Consumer Admin's are Group Listeners that are registered automatically with the EC when a ConsumerAdmin + /// is created. When a consumer is destroyed, it asks the EC to unregister itself. + void unregister_listener (TAO_Notify_EventListener* group_listener ACE_ENV_ARG_DECL); + + // = Interface methods + virtual CosNotifyChannelAdmin::EventChannelFactory_ptr MyFactory ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual CosNotifyChannelAdmin::ConsumerAdmin_ptr default_consumer_admin ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual CosNotifyChannelAdmin::SupplierAdmin_ptr default_supplier_admin ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual CosNotifyFilter::FilterFactory_ptr default_filter_factory ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual CosNotifyChannelAdmin::ConsumerAdmin_ptr new_for_consumers ( + CosNotifyChannelAdmin::InterFilterGroupOperator op, + CosNotifyChannelAdmin::AdminID_out id + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual CosNotifyChannelAdmin::SupplierAdmin_ptr new_for_suppliers ( + CosNotifyChannelAdmin::InterFilterGroupOperator op, + CosNotifyChannelAdmin::AdminID_out id + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual CosNotifyChannelAdmin::ConsumerAdmin_ptr get_consumeradmin ( + CosNotifyChannelAdmin::AdminID id + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException, + CosNotifyChannelAdmin::AdminNotFound + )); + +virtual CosNotifyChannelAdmin::SupplierAdmin_ptr get_supplieradmin ( + CosNotifyChannelAdmin::AdminID id + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException, + CosNotifyChannelAdmin::AdminNotFound + )); + +virtual CosNotifyChannelAdmin::AdminIDSeq * get_all_consumeradmins ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual CosNotifyChannelAdmin::AdminIDSeq * get_all_supplieradmins ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + +virtual CosNotification::QoSProperties * get_qos ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + + virtual void set_qos ( + const CosNotification::QoSProperties & qos + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException, + CosNotification::UnsupportedQoS + )); + + virtual void validate_qos ( + const CosNotification::QoSProperties & required_qos, + CosNotification::NamedPropertyRangeSeq_out available_qos + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException, + CosNotification::UnsupportedQoS + )); + + virtual CosNotification::AdminProperties * get_admin ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + + virtual void set_admin ( + const CosNotification::AdminProperties & admin + ACE_ENV_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException, + CosNotification::UnsupportedAdmin + )); + + virtual CosEventChannelAdmin::ConsumerAdmin_ptr for_consumers ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + + virtual CosEventChannelAdmin::SupplierAdmin_ptr for_suppliers ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + + virtual void destroy ( + ACE_ENV_SINGLE_ARG_DECL + ) + ACE_THROW_SPEC (( + CORBA::SystemException + )); + + const TAO_Notify_QoSAdmin_i& qos_admin (void) const; + +protected: + // = Data Members + /// The locking strategy. + ACE_Lock* lock_; + + /** + * Flag to tell our destructor if we should destroy the CA and SA POA's. + * default is false, the parent poa destruction will remove these. + * set to true if the <destroy> method is invoked. + */ + CORBA::Boolean destory_child_POAs_; + + /// The factory that created us. + TAO_Notify_EventChannelFactory_i* channel_factory_; + + /// The default POA in which we activate objects that don't have ids' pre-assigned. + PortableServer::POA_var default_POA_; + + /// The POA in which i live. + PortableServer::POA_var my_POA_; + + /// The POA in which we should activate ConsumerAdmins in. + /// We create and own this. + PortableServer::POA_var CA_POA_; + + /// The POA in which we should activate SupplierAdmins in. + /// We create and own this. + PortableServer::POA_var SA_POA_; + + /// The ID assigned to this channel. + CosNotifyChannelAdmin::ChannelID channel_id_; + + /// The factory for channel objects. + TAO_Notify_CO_Factory* channel_objects_factory_; + + /// The factory for POA based containers. + TAO_Notify_POA_Factory* poa_factory_; + + /// Event manager objects factory, + TAO_Notify_EMO_Factory* event_manager_objects_factory_; + + /// Id generator for consumer admins. + TAO_Notify_ID_Pool_Ex<CosNotifyChannelAdmin::AdminID, + CosNotifyChannelAdmin::AdminIDSeq> consumer_admin_ids_; + + /// Id generator for supplier admins. + TAO_Notify_ID_Pool_Ex<CosNotifyChannelAdmin::AdminID, + CosNotifyChannelAdmin::AdminIDSeq> supplier_admin_ids_; + + /// Default InterFilterGroupOperator operator used when creating + /// the default ConsumerAdmin and SupplierAdmin. + const CosNotifyChannelAdmin::InterFilterGroupOperator default_op_; + + /// Default id's to CosEventChannelAdmin::ConsumerAdmin, SupplierAdmin. + const CosNotifyChannelAdmin::AdminID default_id_; + + /// Handle QoS admin methods. + TAO_Notify_QoSAdmin_i qos_admin_; + + /// The event manager. + TAO_Notify_Event_Manager* event_manager_; + + /// The list of group event listeners that have registered with us. + TAO_Notify_EventListener_List* event_listener_list_; +}; + +#if defined (_MSC_VER) && (_MSC_VER >= 1200) +#pragma warning (pop) +#endif /* _MSC_VER */ + +#include "ace/post.h" +#endif /* TAO_NOTIFY_EVENTCHANNEL_I_H_ */ |