/**
 * This module is taken from the standard CORBA Notification Service
 * 1.1, as described in:
 *
 * https://www.omg.org/spec/NOT/1.1/
 *
 * The idl was extracted from the following PDF:
 * formal/04-10-13
 */

#ifndef _COS_NOTIFICATION_IDL_
#define _COS_NOTIFICATION_IDL_

#pragma prefix "omg.org"

module CosNotification {

   typedef string Istring;
   typedef Istring PropertyName;
   typedef any PropertyValue;

   struct Property {
      PropertyName name;
      PropertyValue value;
   };
   typedef sequence<Property> PropertySeq;

   // The following are the same, but serve different purposes.
   typedef PropertySeq OptionalHeaderFields;
   typedef PropertySeq FilterableEventBody;
   typedef PropertySeq QoSProperties;
   typedef PropertySeq AdminProperties;

   struct _EventType {
      string domain_name;
      string type_name;
   };
   typedef sequence<_EventType> EventTypeSeq;

   struct PropertyRange {
      PropertyValue low_val;
      PropertyValue high_val;
   };

   struct NamedPropertyRange {
      PropertyName name;
      PropertyRange range;
   };
   typedef sequence<NamedPropertyRange> NamedPropertyRangeSeq;

   enum QoSError_code {
      UNSUPPORTED_PROPERTY,
      UNAVAILABLE_PROPERTY,
      UNSUPPORTED_VALUE,
      UNAVAILABLE_VALUE,
      BAD_PROPERTY,
      BAD_TYPE,
      BAD_VALUE
   };

   struct PropertyError {
      QoSError_code code;
      PropertyName name;
      PropertyRange available_range;
   };
   typedef sequence<PropertyError> PropertyErrorSeq;

   exception UnsupportedQoS { PropertyErrorSeq qos_err; };
   exception UnsupportedAdmin { PropertyErrorSeq admin_err; };

   // Define the Structured Event structure
   struct FixedEventHeader {
      _EventType event_type;
      string event_name;
   };

   struct EventHeader {
      FixedEventHeader fixed_header;
      OptionalHeaderFields variable_header;
   };

   struct StructuredEvent {
      EventHeader header;
      FilterableEventBody filterable_data;
      any remainder_of_body;
   }; // StructuredEvent
   typedef sequence<StructuredEvent> EventBatch;

   // The following constant declarations define the standard
   // QoS property names and the associated values each property
   // can take on. The name/value pairs for each standard property
   // are grouped, beginning with a string constant defined for the
   // property name, followed by the values the property can take on.

   const string EventReliability = "EventReliability";
   const short BestEffort = 0;
   const short Persistent = 1;

   const string ConnectionReliability = "ConnectionReliability";
   // Can take on the same values as EventReliability

   const string Priority = "Priority";
   const short LowestPriority = -32767;
   const short HighestPriority = 32767;
   const short DefaultPriority = 0;

   const string StartTime = "StartTime";
   // StartTime takes a value of type TimeBase::UtcT.

   const string StopTime = "StopTime";
   // StopTime takes a value of type TimeBase::UtcT.

   const string Timeout = "Timeout";
   // Timeout takes on a value of type TimeBase::TimeT

   const string OrderPolicy = "OrderPolicy";
   const short AnyOrder = 0;
   const short FifoOrder = 1;
   const short PriorityOrder = 2;
   const short DeadlineOrder = 3;

   const string DiscardPolicy = "DiscardPolicy";
   // DiscardPolicy takes on the same values as OrderPolicy, plus
   const short LifoOrder = 4;

   const string MaximumBatchSize = "MaximumBatchSize";
   // MaximumBatchSize takes on a value of type long

   const string PacingInterval = "PacingInterval";
   // PacingInterval takes on a value of type TimeBase::TimeT

   const string StartTimeSupported = "StartTimeSupported";
   // StartTimeSupported takes on a boolean value

   const string StopTimeSupported = "StopTimeSupported";
   // StopTimeSupported takes on a boolean value

   const string MaxEventsPerConsumer = "MaxEventsPerConsumer";
   // MaxEventsPerConsumer takes on a value of type long

   interface QoSAdmin {

      QoSProperties get_qos();

      void set_qos ( in QoSProperties qos) raises ( UnsupportedQoS );

      void validate_qos (
            in QoSProperties required_qos,
            out NamedPropertyRangeSeq available_qos ) raises ( UnsupportedQoS );

   }; // QosAdmin

   // Admin properties are defined in similar manner as QoS
   // properties. The only difference is that these properties
   // are related to channel administration policies, as opposed
   // message quality of service

   const string MaxQueueLength = "MaxQueueLength";
   // MaxQueueLength takes on a value of type long

   const string MaxConsumers = "MaxConsumers";
   // MaxConsumers takes on a value of type long

   const string MaxSuppliers = "MaxSuppliers";
   // MaxSuppliers takes on a value of type long

   const string RejectNewEvents = "RejectNewEvents";
   // RejectNewEvents takes on a value of type Boolean

   interface AdminPropertiesAdmin {

      AdminProperties get_admin();

      void set_admin (in AdminProperties admin) raises ( UnsupportedAdmin);

   }; // AdminPropertiesAdmin

}; // CosNotification

#endif /* _COS_NOTIFICATION_IDL_ */
