#ifndef _COS_NOTIFYCOMM_IDL_
#define _COS_NOTIFYCOMM_IDL_

#pragma prefix "omg.org"


#include<CosNotification.idl>

module CosNotifyComm {
  exception InvalidEventType { CosNotification::EventType type; };

  interface NotifyPublish {
    void offer_change (in CosNotification::EventTypeSeq added,
		       in CosNotification::EventTypeSeq removed)
      raises (InvalidEventType);
  }; // NotifyPublish

  interface NotifySubscribe {
    void subscription_change(in CosNotification::EventTypeSeq added,
			     in CosNotification::EventTypeSeq removed)
      raises (InvalidEventType);
  }; // NotifySubscribe

  interface PushConsumer : NotifyPublish, CosEventComm::PushConsumer { }; // PushConsumer
  
  interface PullConsumer : NotifyPublish, CosEventComm::PullConsumer { }; // PullConsumer
  
  interface PullSupplier : NotifySubscribe, CosEventComm::PullSupplier { }; // PullSupplier
  
  interface PushSupplier : NotifySubscribe, CosEventComm::PushSupplier { };

  interface StructuredPushConsumer : NotifyPublish {
    void push_structured_event(in CosNotification::StructuredEvent notification)
      raises(CosEventComm::Disconnected);

    void disconnect_structured_push_consumer();
  }; // StructuredPushConsumer

  interface StructuredPullConsumer : NotifyPublish {
    void disconnect_structured_pull_consumer();
  }; // StructuredPullConsumer

  interface StructuredPullSupplier : NotifySubscribe {
    CosNotification::StructuredEvent pull_structured_event()
      raises(CosEventComm::Disconnected);

    CosNotification::StructuredEvent try_pull_structured_event(out boolean has_event)
      raises(CosEventComm::Disconnected);

    void disconnect_structured_pull_supplier();
  }; // StructuredPullSupplier

  interface StructuredPushSupplier : NotifySubscribe {
    void disconnect_structured_push_supplier();
  }; // StructuredPushSupplier

  interface SequencePushConsumer : NotifyPublish {
    void push_structured_events(in CosNotification::EventBatch notifications)
      raises(CosEventComm::Disconnected);

    void disconnect_sequence_push_consumer();
  }; // SequencePushConsumer

  interface SequencePullConsumer : NotifyPublish {
    void disconnect_sequence_pull_consumer();
  }; // SequencePullConsumer

  interface SequencePullSupplier : NotifySubscribe {
    CosNotification::EventBatch pull_structured_events(in long max_number)
      raises(CosEventComm::Disconnected);
    CosNotification::EventBatch try_pull_structured_events(in long max_number, out boolean has_event)
      raises(CosEventComm::Disconnected);

    void disconnect_sequence_pull_supplier();
  }; // SequencePullSupplier

  interface SequencePushSupplier : NotifySubscribe {
    void disconnect_sequence_push_supplier();
  }; // SequencePushSupplier
}; // CosNotifyComm

#endif /* ifndef _COS_NOTIFYCOMM_IDL_ */