/**
 * This module is taken from the standard CORBA Event Service
 * 1.2, as described in:
 *
 * https://www.omg.org/spec/EVNT/1.2/
 *
 * The idl was extracted from the following PDF:
 * formal/04-10-02 
 */

#ifndef _COS_EVENT_CHANNEL_ADMIN_IDL_
#define _COS_EVENT_CHANNEL_ADMIN_IDL_

#include "CosEventComm.idl"

#pragma prefix "omg.org"

module CosEventChannelAdmin {

   exception AlreadyConnected {};
   exception TypeError {};

   interface ProxyPushConsumer: CosEventComm::PushConsumer {
      void connect_push_supplier(in CosEventComm::PushSupplier push_supplier)
         raises(AlreadyConnected);
   };

   interface ProxyPullSupplier: CosEventComm::PullSupplier {
      void connect_pull_consumer(in CosEventComm::PullConsumer pull_consumer)
         raises(AlreadyConnected);
   };

   interface ProxyPullConsumer: CosEventComm::PullConsumer {
      void connect_pull_supplier(in CosEventComm::PullSupplier pull_supplier)
         raises(AlreadyConnected,TypeError);
   };

   interface ProxyPushSupplier: CosEventComm::PushSupplier {
      void connect_push_consumer(in CosEventComm::PushConsumer push_consumer)
         raises(AlreadyConnected, TypeError);
   };

   interface ConsumerAdmin {
      ProxyPushSupplier obtain_push_supplier();
      ProxyPullSupplier obtain_pull_supplier();
   };

   interface SupplierAdmin {
      ProxyPushConsumer obtain_push_consumer();
      ProxyPullConsumer obtain_pull_consumer();
   };

   interface EventChannel {
      ConsumerAdmin for_consumers();
      SupplierAdmin for_suppliers();
      void destroy();
   };
};
#endif /* ifndef _COS_EVENT_CHANNEL_ADMIN_IDL_ */
