%%----------------------------------------------------------------------
%% ``The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved via the world wide web at http://www.erlang.org/.
%% 
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%% 
%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
%% AB. All Rights Reserved.''
%% 
%%     $Id$
%%
%%----------------------------------------------------------------------
%% File    : CosNotification_Definitions.hrl
%% Purpose : 
%% Created : 28 Sep 1999
%%----------------------------------------------------------------------

-ifndef(COSNOTIFICATION_DEFINITIONS_HRL).
-define(COSNOTIFICATION_DEFINITIONS_HRL, true).

%% ---------------- General comment ------------------------------------
%% ******* README ********
%% The prefix 'not' is short for notification, and is used to separate locally
%% defined macros from the global ones, i.e., do NOT confuse this with a negation!!
%%
%% In this file you find globally used data structures, constants etc.
%%

%%--------------- INCLUDES ---------------------------------------------

%%-------- Constants -------------------------------------------------
-define(not_SupportedGrammars, ["EXTENDED_TCL"]).

%% !!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
%%
%% If OMG redefines the values for the constants the definitions
%% below must be redefined!!
%%
%% !!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-define(not_BestEffort,            0).
-define(not_Persistent,            1).
-define(not_EventReliability,      "EventReliability").
-define(not_ConnectionReliability, "ConnectionReliability").
-define(not_Priority,              "Priority").
-define(not_LowestPriority,        -32767).
-define(not_HighestPriority,        32767).
-define(not_DefaultPriority,        0).
-define(not_StartTime,              "StartTime").
-define(not_StopTime,               "StopTime").
-define(not_Timeout,                "Timeout").
-define(not_OrderPolicy,            "OrderPolicy").
-define(not_AnyOrder,               0).
-define(not_FifoOrder,              1).
-define(not_PriorityOrder,          2).
-define(not_DeadlineOrder,          3).
-define(not_DiscardPolicy,          "DiscardPolicy").
-define(not_LifoOrder,              4).
-define(not_RejectNewEvents,        5).
-define(not_MaximumBatchSize,       "MaximumBatchSize").
-define(not_PacingInterval,         "PacingInterval").
-define(not_StartTimeSupported,     "StartTimeSupported").
-define(not_StopTimeSupported,      "StopTimeSupported").
-define(not_MaxEventsPerConsumer,   "MaxEventsPerConsumer").
-define(not_MaxQueueLength,         "MaxQueueLength").
-define(not_MaxConsumers,           "MaxConsumers").
-define(not_MaxSuppliers,           "MaxSuppliers").

%%--------------- QOS DEFINITIONS ----------------------------
%% Limits for QoS. These are our own limits.
-define(not_MaxBatchSize,      10000).
-define(not_MinBatchSize,      1).
-define(not_MinTimeout,        0).
-define(not_MaxTimeout,        100000000000).
-define(not_MinPacing,         0).
-define(not_MaxPacing,         100000000000).
-define(not_MinConsumerEvents, 1).
-define(not_MaxConsumerEvents, 10000).

-define(not_QOS_LIMITS, 
[#'CosNotification_NamedPropertyRange'
 {name=?not_EventReliability, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:short(), ?not_BestEffort), 
    high_val=any:create(orber_tc:short(), ?not_Persistent)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_ConnectionReliability, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:short(), ?not_BestEffort), 
    high_val=any:create(orber_tc:short(), ?not_Persistent)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_Priority, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:short(), ?not_LowestPriority), 
    high_val=any:create(orber_tc:short(), ?not_HighestPriority)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_StartTimeSupported, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:boolean(), false), 
    high_val=any:create(orber_tc:boolean(), true)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_StopTimeSupported, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:boolean(), false), 
    high_val=any:create(orber_tc:boolean(), true)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_Timeout, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:unsigned_long_long(), ?not_MinTimeout), 
    high_val=any:create(orber_tc:unsigned_long_long(), ?not_MaxTimeout)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_OrderPolicy, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:short(), ?not_AnyOrder), 
    high_val=any:create(orber_tc:short(), ?not_PriorityOrder)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_DiscardPolicy, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:short(), ?not_AnyOrder), 
    high_val=any:create(orber_tc:short(), ?not_PriorityOrder)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_MaximumBatchSize, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:long(), ?not_MinBatchSize), 
    high_val=any:create(orber_tc:long(), ?not_MaxBatchSize)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_PacingInterval, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:unsigned_long_long(), ?not_MinPacing), 
    high_val=any:create(orber_tc:unsigned_long_long(), ?not_MaxPacing)
   }},
 #'CosNotification_NamedPropertyRange'
 {name=?not_MaxEventsPerConsumer, 
  range=
  #'CosNotification_PropertyRange'{
    low_val=any:create(orber_tc:long(), ?not_MinConsumerEvents), 
    high_val=any:create(orber_tc:long(), ?not_MaxConsumerEvents)
   }}
].



%% Local record used internally, and the reason for this is we get faster
%% access to QoS settings.
-record(qos, {'EventReliability',
	      'ConnectionReliability',
	      'Priority',
	      'StartTimeSupported',
	      'StopTimeSupported',
	      'Timeout',
	      'OrderPolicy',
	      'DiscardPolicy',
	      'MaximumBatchSize',
	      'PacingInterval',
	      'MaxEventsPerConsumer'}).

%% Global (OMG) representation of QoS.
-define(not_DEFAULT_QOS, 
[#'CosNotification_Property'{name=?not_MaximumBatchSize, 
			     value=any:create(orber_tc:long(), 1)},
 #'CosNotification_Property'{name=?not_PacingInterval, 
			     value=any:create(orber_tc:unsigned_long_long(), 0)},
 #'CosNotification_Property'{name=?not_Timeout, 
			     value=any:create(orber_tc:unsigned_long_long(), 0)},
 #'CosNotification_Property'{name=?not_MaxEventsPerConsumer, 
			     value=any:create(orber_tc:long(), 100)},
 #'CosNotification_Property'{name=?not_OrderPolicy, 
			     value=any:create(orber_tc:short(), 
					      ?not_PriorityOrder)},
 #'CosNotification_Property'{name=?not_EventReliability, 
			     value=any:create(orber_tc:short(), 
					      ?not_BestEffort)},
 #'CosNotification_Property'{name=?not_ConnectionReliability, 
			     value=any:create(orber_tc:short(), 
					      ?not_BestEffort)},
 #'CosNotification_Property'{name=?not_DiscardPolicy, 
			     value=any:create(orber_tc:short(), 
					      ?not_RejectNewEvents)},
 #'CosNotification_Property'{name=?not_StartTimeSupported, 
			     value=any:create(orber_tc:boolean(), false)},
 #'CosNotification_Property'{name=?not_StopTimeSupported, 
			     value=any:create(orber_tc:boolean(), false)},
 #'CosNotification_Property'{name=?not_Priority, 
			     value=any:create(orber_tc:short(), ?not_DefaultPriority)}]).

%%--------------- QOS CREATORS -------------------------------
-define(not_CreateInitQoS(), #qos{}).

%%--------------- QOS DESTRUCTORS ----------------------------
-define(not_DestroyQoS(Q), ok).

%%--------------- QOS SELECTORS ------------------------------
-define(not_GetEventReliability(Q),        Q#qos.'EventReliability').
-define(not_GetConnectionReliability(Q),   Q#qos.'ConnectionReliability').
-define(not_GetPriority(Q),                Q#qos.'Priority').
-define(not_GetStartTimeSupported(Q),      Q#qos.'StartTimeSupported').
-define(not_GetStopTimeSupported(Q),       Q#qos.'StopTimeSupported').
-define(not_GetTimeout(Q),                 Q#qos.'Timeout').
-define(not_GetOrderPolicy(Q),             Q#qos.'OrderPolicy').
-define(not_GetDiscardPolicy(Q),           Q#qos.'DiscardPolicy').
-define(not_GetMaximumBatchSize(Q),        Q#qos.'MaximumBatchSize').
-define(not_GetPacingInterval(Q),          Q#qos.'PacingInterval').
-define(not_GetMaxEventsPerConsumer(Q),    Q#qos.'MaxEventsPerConsumer').

%%--------------- QOS MODIFIERS ------------------------------
-define(not_SetEventReliability(Q,D),      Q#qos{'EventReliability'=D}).
-define(not_SetConnectionReliability(Q,D), Q#qos{'ConnectionReliability'=D}).
-define(not_SetPriority(Q,D),              Q#qos{'Priority'=D}).
-define(not_SetStartTimeSupported(Q,D),    Q#qos{'StartTimeSupported'=D}).
-define(not_SetStopTimeSupported(Q,D),     Q#qos{'StopTimeSupported'=D}).
-define(not_SetTimeout(Q,D),               Q#qos{'Timeout'=D}).
-define(not_SetOrderPolicy(Q,D),           Q#qos{'OrderPolicy'=D}).
-define(not_SetDiscardPolicy(Q,D),         Q#qos{'DiscardPolicy'=D}).
-define(not_SetMaximumBatchSize(Q,D),      Q#qos{'MaximumBatchSize'=D}).
-define(not_SetPacingInterval(Q,D),        Q#qos{'PacingInterval'=D}).
-define(not_SetMaxEventsPerConsumer(Q,D),  Q#qos{'MaxEventsPerConsumer'=D}).

%%--------------- StructuredEvent CREATORS -------------------
-define(not_CreateSE(StrD,StrT,StrE,PSeqV,PSeqF,AnyR),
#'CosNotification_StructuredEvent'{header = 
   #'CosNotification_EventHeader'{fixed_header = 
		  #'CosNotification_FixedEventHeader'{event_type =
				      #'CosNotification_EventType'{domain_name=StrD,
						   type_name=StrT},
				      event_name = StrE},
		  variable_header = PSeqV},
   filterable_data = PSeqF,
   remainder_of_body = AnyR}).
%% Can be used in guards.
-define(not_isConvertedAny(E), 
	(((E#'CosNotification_StructuredEvent'.header)
	  #'CosNotification_EventHeader'.fixed_header)
	 #'CosNotification_FixedEventHeader'.event_type)
	#'CosNotification_EventType'.type_name == "%ANY").
%% Can NOT be used in guards!!!!!
-define(not_isConvertedStructured(E), 
	any:get_typecode(E) == 'CosNotification_StructuredEvent':tc()).

%%--------------- StructuredEvent DESTRUCTORS ----------------
-define(not_DestroySE(E), ok).

%%--------------- StructuredEvent SELECTORS ------------------
-define(not_GetSEHeader(E), E#'StructuredEvent'.header).
-define(not_GetSEFixedHeader(E), E#'StructuredEvent'.header).

%%--------------- StructuredEvent MODIFIERS ------------------

%%-------- QoS support -----------------------------------------------
-define(not_SUPPORTED_QOS, 
[{?not_EventReliability,      'EventReliability'},
 {?not_ConnectionReliability, 'ConnectionReliability'},
 {?not_Priority,              'Priority'},
 {?not_StartTimeSupported,    'StartTimeSupported'},
 {?not_StopTimeSupported,     'StopTimeSupported'},
 {?not_Timeout,               'Timeout'},
 {?not_OrderPolicy,           'OrderPolicy'},
 {?not_DiscardPolicy,         'DiscardPolicy'},
 {?not_MaximumBatchSize,      'MaximumBatchSize'},
 {?not_PacingInterval,        'PacingInterval'},
 {?not_MaxEventsPerConsumer,  'MaxEventsPerConsumer'}]).

%%-------- ADMINPROPERTIESADMIN --------------------------------------

%% According to the OMG TC Document telecom/98-11-01, p 63 (section 2.5.7), the
%% default-value for these 3 admin properties is zero, which means that no limit
%% applies to that property.
-define(not_DEFAULT_ADMINPROPERTIES,
[#'CosNotification_Property'{name=?not_MaxQueueLength, 
			     value=any:create(orber_tc:long(), 0)},
 #'CosNotification_Property'{name=?not_MaxConsumers, 
			     value=any:create(orber_tc:long(), 0)},
 #'CosNotification_Property'{name=?not_MaxSuppliers, 
			     value=any:create(orber_tc:long(), 0)}]).

-define(not_SUPPORTED_ADMINPROPERTIES,
[{?not_MaxQueueLength, 'MaxQueueLength'},
 {?not_MaxConsumers, 'MaxConsumers'},
 {?not_MaxSuppliers, 'MaxSuppliers'}]).


%%-------- MISC --------------------------------------------------------

-define(not_DEFAULT_SETTINGS, [{pullInterval, 20},
			       {filterOp, 'OR_OP'},
			       {gcTime, 60},
			       {gcLimit, 50},
			       {timeService, undefined},
			       {typecheck, true},
			       {tty, false},
			       {logfile, false},
			       {server_options, []}]).
-define(not_CreateDBKey, term_to_binary({now(), node()})).

-define(DEBUG_LEVEL, 3).

-ifdef(debug).

-define(debug_print(F,A), io:format("[~p(~p)] "++F,[?MODULE, ?LINE]++A)).
-define(DBG(F,A), io:format("[~p(~p)] "++F,[?MODULE, ?LINE]++A)).
-define(not_TypeCheck(O,I), ok).
%-define(not_TypeCheck(O,M), 'CosNotification_Common':type_check(O,M)).

-else.

-define(debug_print(F,A), ok).
-define(DBG(F,A), ok).
-define(not_TypeCheck(O,I), ok).

-endif.    



-endif.
%%--------------- END OF MODULE ------------------------------
