%%<copyright>
%% <year>2005-2008</year>
%% <holder>Ericsson AB, All Rights Reserved</holder>
%%</copyright>
%%<legalnotice>
%% 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 online 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 AB.
%%</legalnotice>
%%
%%----------------------------------------------------------------------
%% Purpose: Erlang record definitions for each named and unnamed
%%          SEQUENCE and SET in module MEDIA-GATEWAY-CONTROL
%%----------------------------------------------------------------------

-record('MegacoMessage',
	{
	  authHeader = asn1_NOVALUE,
	  mess
	 }).

-record('AuthenticationHeader',
	{
	  secParmIndex, 
	  seqNum, 
	  ad
	 }).

-record('Message',
	{
	  version, 
	  mId, 
	  messageBody
	 }). % with extension mark

-record('DomainName',
	{
	  name, 
	  portNumber = asn1_NOVALUE
	 }).

-record('IP4Address',
	{
	  address,
	  portNumber = asn1_NOVALUE
	 }).

-record('IP6Address',
	{
	  address, 
	  portNumber = asn1_NOVALUE
	 }).


%% Transaction ::= CHOICE
%% {
%% 	transactionRequest		TransactionRequest,
%% 	transactionPending		TransactionPending,
%% 	transactionReply		TransactionReply,
%% 	transactionResponseAck		TransactionResponseAck,
%% 	-- use of response acks is dependent on underlying transport
%% 	...,
%% 	segmentReply			SegmentReply
%% }

-record('TransactionRequest',
	{
	  transactionId, 
	  actions = []
	 }). % with extension mark

-record('TransactionPending',
	{
	  transactionId
	 }). % with extension mark

-record('TransactionReply',
	{
	  transactionId, 
	  immAckRequired = asn1_NOVALUE, 
	  transactionResult,

	  %% with extension mark -- v3 --

	  segmentNumber        = asn1_NOVALUE,
	  segmentationComplete = asn1_NOVALUE
	 }). 


%% -- v3 --
-record('SegmentReply', 
	{
	  transactionId, 
	  segmentNumber, 
	  segmentationComplete = asn1_NOVALUE
	 }). % with extension mark

%% SegmentNumber ::= INTEGER(0..65535)

-record('TransactionAck',
	{
	  firstAck, 
	  lastAck = asn1_NOVALUE
	 }).

-record('ErrorDescriptor',
	{
	  errorCode, 
	  errorText = asn1_NOVALUE
	 }).

-record('ActionRequest',
	{
	  contextId, 
	  contextRequest = asn1_NOVALUE, 
	  contextAttrAuditReq = asn1_NOVALUE, 
	  commandRequests = []
	 }).

-record('ActionReply',
	{
	  contextId, 
	  errorDescriptor = asn1_NOVALUE, 
	  contextReply = asn1_NOVALUE, 
	  commandReply = []
	 }).

-record('ContextRequest',
	{
	  priority = asn1_NOVALUE, 
	  emergency = asn1_NOVALUE, 
	  topologyReq = asn1_NOVALUE,

	  %% with extension mark -- prev3b --

	  iepscallind = asn1_NOVALUE,
	  contextProp = asn1_NOVALUE,

	  %% -- prev3c --

	  contextList = asn1_NOVALUE

	 }). 

-record('ContextAttrAuditRequest',
	{
	  topology = asn1_NOVALUE, 
	  emergency = asn1_NOVALUE, 
	  priority = asn1_NOVALUE,

	  %% with extension mark -- prev3b --

	  iepscallind = asn1_NOVALUE,
	  contextPropAud = asn1_NOVALUE,

	  %% -- prev3c --

	  selectpriority = asn1_NOVALUE,
	  selectemergency = asn1_NOVALUE,
	  selectiepscallind = asn1_NOVALUE,
	  selectLogic = asn1_NOVALUE
	 }). 


%% SelectLogic            ::= CHOICE
%% {
%%     andAUDITSelect  NULL,     -- all selection conditions satisfied
%%     orAUDITSelect   NULL,     -- at least one selection condition satisfied
%%     ...
%% }

-record('CommandRequest',
	{
	  command, 
	  optional = asn1_NOVALUE, 
	  wildcardReturn = asn1_NOVALUE
	 }). % with extension mark

-record('TopologyRequest',
	{
	  terminationFrom, 
	  terminationTo, 
	  topologyDirection,
	  
	  %% After extension mark
	  streamID = asn1_NOVALUE,  

	  %% -- prev3c --
	  %% This is actually not according to the standard,
	  %% but without it 'TopologyRequest' will be useless.
	  topologyDirectionExtension = asn1_NOVALUE
	  
	 }).

-record('AmmRequest',
	{
	  terminationID = [], 
	  descriptors = []
	 }). % with extension mark

-record('AmmsReply',
	{
	  terminationID = [], 
	  terminationAudit = asn1_NOVALUE
	 }). % with extension mark

-record('SubtractRequest',
	{
	  terminationID = [], 
	  auditDescriptor = asn1_NOVALUE
	 }). % with extension mark

-record('AuditRequest',
	{
	  terminationID, 
	  auditDescriptor,

	  %% -- prev3c (after extension mark) --  

	  terminationIDList = asn1_NOVALUE

	 }). 

%% AuditReply := CHOICE
%% {
%%    contextAuditResult   TerminationIDList,
%%    error                ErrorDescriptor,
%%    auditResult          AuditResult,
%%    ...
%%    auditResultTermList  TermListAuditResult
%% }

-record('AuditResult',
	{
	  terminationID, 
	  terminationAuditResult = []
	 }).

-record('TermListAuditResult', 
	{
	  terminationIDList,
	  terminationAuditResult = []
	 }). % with extension mark

-record('AuditDescriptor',
	{
	  auditToken         = asn1_NOVALUE,
	  %% with extensions
	  auditPropertyToken = asn1_NOVALUE  
	 }). 


%% --- v2 start ---

-record('IndAudMediaDescriptor',
	{
	  termStateDescr = asn1_NOVALUE,
	  streams        = asn1_NOVALUE
	}). % with extension mark

-record('IndAudStreamDescriptor',
	{
	  streamID,
	  streamParms
	}). % with extension mark

-record('IndAudStreamParms',
	{
	  localControlDescriptor = asn1_NOVALUE,
	  localDescriptor        = asn1_NOVALUE, %% NOTE: NOT IN TEXT
	  remoteDescriptor       = asn1_NOVALUE, %% NOTE: NOT IN TEXT
	  
	  %% with extension mark -- prev3b --

	  statisticsDescriptor   = asn1_NOVALUE
	}). 

-record('IndAudLocalControlDescriptor',
	{
	  streamMode    = asn1_NOVALUE,
	  reserveValue  = asn1_NOVALUE,
	  reserveGroup  = asn1_NOVALUE,
	  propertyParms = asn1_NOVALUE,

	  %% -- prev3c (after extension mark) --

	  streamModeSel = asn1_NOVALUE

	}). 

-record('IndAudPropertyParm',
	{
	  name,

	  %% -- prev3c (after extension mark) --

	  propertyParms = asn1_NOVALUE
	}). 

-record('IndAudLocalRemoteDescriptor',
	{
	  propGroupID = asn1_NOVALUE,
	  propGrps
	}). % with extension mark

%% IndAudPropertyGroup ::= SEQUENCE OF IndAudPropertyParm


%% BUGBUG
%% In text, it can only be one of them in each record.
%% So, in case it's eventBufferControl or serviceState
%% propertyParms will be an empty list.
-record('IndAudTerminationStateDescriptor',
	{
	  propertyParms = [],  %% Optional in text...
	  eventBufferControl = asn1_NOVALUE,
	  serviceState       = asn1_NOVALUE,

	  %% -- prev3c (after extension mark) --

	  serviceStateSel    = asn1_NOVALUE

	}). 

-record('IndAudEventsDescriptor',
	{
	  requestID = asn1_NOVALUE,  %% Only optional in ASN.1
	  pkgdName,
	  streamID  = asn1_NOVALUE
	}). % with extension mark

-record('IndAudEventBufferDescriptor',
	{
	  eventName,
	  %% This is an ugly hack to allow the eventParameterName
	  %% which only exist in text!! 
	  %% streamID = asn1_NOVALUE | integer() | 
	  %%            {eventParameterName, Name}  <- BUGBUG: ONLY IN TEXT
	  %% Note that the binary codecs will fail to encode
	  %% if the streamID is not aither asn1_NOVALUE or an integer()
	  %% So it is recommended to refrain from using this text feature...
	  streamID = asn1_NOVALUE

	  %% eventParameterName = asn1_NOVALUE %% BUGBUG: ONLY IN TEXT

	}). % with extension mark

-record('IndAudSeqSigList',
	{
	  id,
	  signalList  = asn1_NOVALUE  %% Only in ASN1
	}). % with extension mark

-record('IndAudSignal',
	{
	  signalName,
	  streamID = asn1_NOVALUE, % Optional in ASN1 & non-existent in text

	  %% -- prev3c (after extension mark) --

	  signalRequestID = asn1_NOVALUE

	}). % with extension mark

-record('IndAudDigitMapDescriptor',
	{
	  digitMapName = asn1_NOVALUE  %% OPTIONAL in ASN.1 but not in text
	}). 

-record('IndAudStatisticsDescriptor',
	{
	  statName
	}). 

-record('IndAudPackagesDescriptor',
	{
	  packageName,
	  packageVersion
	}). % with extension mark


%% --- v2 end   ---


-record('NotifyRequest',
	{
	  terminationID = [], 
	  observedEventsDescriptor, 
	  errorDescriptor = asn1_NOVALUE
	 }). % with extension mark

-record('NotifyReply',
	{
	  terminationID   = [], 
	  errorDescriptor = asn1_NOVALUE
	 }). % with extension mark

-record('ObservedEventsDescriptor',
	{
	  requestId, 
	  observedEventLst = []
	 }).

-record('ObservedEvent',
	{
	  eventName, 
	  streamID = asn1_NOVALUE, 
	  eventParList = [], 
	  timeNotation = asn1_NOVALUE
	 }). % with extension mark

%% This value field of this record is already encoded and will
%% be inserted as is.
%% This record could be used either when there is a bug in the
%% encoder or if an "external" package, unknown to the megaco app,
%% where the value part requires a special encode.
-record(megaco_event_parameter,
	{
	  name, 
	  value
	 }). 

-record('EventParameter',
	{
	  eventParameterName, 
	  value,
	  extraInfo = asn1_NOVALUE
	 }). % with extension mark

-record('ServiceChangeRequest',
	{
	  terminationID = [], 
	  serviceChangeParms
	 }). % with extension mark

-record('ServiceChangeReply',
	{
	  terminationID = [], 
	  serviceChangeResult = []
	 }). % with extension mark

-record('TerminationID',
	{
	  wildcard, 
	  id
	 }). % with extension mark

%% TerminationIDList ::= SEQUENCE OF TerminationID 

-record('MediaDescriptor',
	{
	  termStateDescr = asn1_NOVALUE, 
	  streams        = asn1_NOVALUE
	 }). % with extension mark

-record('StreamDescriptor',
	{
	  streamID, 
	  streamParms
	 }).

-record('StreamParms',
	{
	  localControlDescriptor = asn1_NOVALUE, 
	  localDescriptor = asn1_NOVALUE, 
	  remoteDescriptor = asn1_NOVALUE,
	  
	  %% with extension mark -- prev3b --

	  statisticsDescriptor   = asn1_NOVALUE
	 }). 

-record('LocalControlDescriptor',
	{
	  streamMode   = asn1_NOVALUE, 
	  reserveValue = asn1_NOVALUE, 
	  reserveGroup = asn1_NOVALUE, 
	  propertyParms = []
	 }). % with extension mark

%% StreamMode ::= ENUMERATED
%% {
%%   sendOnly(0),
%%   recvOnly(1),
%%   sendRecv(2),
%%   inactive(3),
%%   loopBack(4),
%%   ...
%% }

-record('PropertyParm',
	{
	  name, 
	  value, 
	  extraInfo = asn1_NOVALUE
	 }). % with extension mark

-record('LocalRemoteDescriptor',
	{
	  propGrps = []
	 }). % with extension mark

-record('TerminationStateDescriptor',
	{
	  propertyParms = [], 
	  eventBufferControl = asn1_NOVALUE, 
	  serviceState = asn1_NOVALUE
	 }). % with extension mark

%% EventBufferControl ::= ENUMERATED
%% {
%%   off(0),
%%   lockStep(1),
%%   ...
%% }

%% ServiceState ::= ENUMERATED
%% {
%%   test(0),
%%   outOfSvc(1),
%%   inSvc(2),
%%   ...
%% }

-record('MuxDescriptor',
	{
	  muxType, 
	  termList = [],
	  nonStandardData = asn1_NOVALUE
	 }). % with extension mark

-record('EventsDescriptor',
	{
	  requestID,
	  %% BUGBUG: IG 6.82 was withdrawn
	  %% requestID = asn1_NOVALUE, 
	  eventList = []
	 }). % with extension mark

-record('RequestedEvent',
	{
	  pkgdName, 
	  streamID = asn1_NOVALUE, 
	  eventAction = asn1_NOVALUE, 
	  evParList = []
	 }). % with extension mark

%% -- prev3c --
-record('RegulatedEmbeddedDescriptor', 
	{
	  secondEvent       = asn1_NOVALUE, 
	  signalsDescriptor = asn1_NOVALUE
	 }). % with extension mark

%% NotifyBehaviour ::= CHOICE
%% {
%%    notifyImmediate  NULL,
%%    notifyRegulated  RegulatedEmbeddedDescriptor,
%%    neverNotify      NULL,
%%    ...
%% }

-record('RequestedActions',
	{
	  keepActive = asn1_NOVALUE, 
	  eventDM = asn1_NOVALUE, 
	  secondEvent = asn1_NOVALUE, 
	  signalsDescriptor = asn1_NOVALUE,

	  %% -- prev3c (after extension mark) --

	  notifyBehaviour       = asn1_NOVALUE, 
	  resetEventsDescriptor = asn1_NOVALUE

	 }). 

-record('SecondEventsDescriptor',
	{
	  requestID, 
	  %% BUGBUG: IG 6.82 was withdrawn
	  %% requestID = asn1_NOVALUE, 
	  eventList = []
	 }). % with extension mark

-record('SecondRequestedEvent',
	{
	  pkgdName, 
	  streamID = asn1_NOVALUE, 
	  eventAction = asn1_NOVALUE, 
	  evParList = []
	 }). % with extension mark

-record('SecondRequestedActions',
	{
	  keepActive = asn1_NOVALUE, 
	  eventDM = asn1_NOVALUE, 
	  signalsDescriptor = asn1_NOVALUE,

	  %% -- prev3c (after extension mark) --

	  notifyBehaviour       = asn1_NOVALUE, 
	  resetEventsDescriptor = asn1_NOVALUE

	 }). 


%% EventBufferDescriptor ::= SEQUENCE OF EventSpec 

-record('EventSpec',
	{
	  eventName, 
	  streamID = asn1_NOVALUE, 
	  eventParList = []
	 }). % with extension mark


%% SignalsDescriptor ::= SEQUENCE OF SignalRequest 

%% SignalRequest ::= CHOICE 
%%  { 
%%    signal         Signal, 
%%    seqSigList     SeqSigList, 
%%    ... 
%%  } 


-record('SeqSigList',
	{
	  id, 
	  signalList = []
	 }).

-record('Signal',
	{
	  signalName, 
	  streamID = asn1_NOVALUE, 
	  sigType = asn1_NOVALUE, 
	  duration = asn1_NOVALUE, 
	  notifyCompletion = asn1_NOVALUE, 
	  keepActive = asn1_NOVALUE, 
	  sigParList = [],

	  %% with extension mark -- prev3b --

	  direction = asn1_NOVALUE,
	  requestID = asn1_NOVALUE,

	  %% -- prev3c --

	  intersigDelay = asn1_NOVALUE

	 }). 

%% SignalType ::= ENUMERATED 
%%  { 
%%    brief(0), 
%%    onOff(1), 
%%    timeOut(2), 
%%    ... 
%%  } 

%% SignalDirection ::= ENUMERATED
%%  {
%%    internal(0),
%%    external(1),
%%    both(3),
%%    ...
%%  }

%% SignalName ::= PkgdName 

%% NotifyCompletion ::= BIT STRING 
%%  { 
%%    onTimeOut(0), onInterruptByEvent(1), 
%%    onInterruptByNewSignalDescr(2), otherReason(3), onIteration(4)
%%  } 

-record('SigParameter',
	{
	  sigParameterName, 
	  value,
	  extraInfo = asn1_NOVALUE
	 }). % with extension mark

-record('ModemDescriptor',
	{
	  mtl, 
	  mpl,
	  nonStandardData = asn1_NOVALUE
	 }).

-record('DigitMapDescriptor',
	{
	  digitMapName = asn1_NOVALUE, 
	  digitMapValue = asn1_NOVALUE
	 }).

-record('DigitMapValue',
	{
	  startTimer = asn1_NOVALUE, 
	  shortTimer = asn1_NOVALUE, 
	  longTimer = asn1_NOVALUE, 
	  digitMapBody,
	  %% with extensions
	  durationTimer = asn1_NOVALUE
	 }). 

-record('ServiceChangeParm',
	{
	  serviceChangeMethod, 
	  serviceChangeAddress = asn1_NOVALUE, 
	  serviceChangeVersion = asn1_NOVALUE, 
	  serviceChangeProfile = asn1_NOVALUE, 
	  serviceChangeReason, 
	  serviceChangeDelay = asn1_NOVALUE, 
	  serviceChangeMgcId = asn1_NOVALUE, 
	  timeStamp = asn1_NOVALUE,
	  nonStandardData = asn1_NOVALUE,

	  %% with extension mark -- prev3b (serviceChangeIncompleteFlag) --

	  serviceChangeInfo = asn1_NOVALUE,
	  serviceChangeIncompleteFlag = asn1_NOVALUE
	 }). 

-record('ServiceChangeResParm',
	{
	  serviceChangeMgcId = asn1_NOVALUE, 
	  serviceChangeAddress = asn1_NOVALUE, 
	  serviceChangeVersion = asn1_NOVALUE, 
	  serviceChangeProfile = asn1_NOVALUE,
	  timeStamp = asn1_NOVALUE
	 }). % with extension mark


%% This is the actual ASN.1 type and it is as this it will
%% be represented if the encoding config [native] is chosen.
%% %% String of at least 1 character and at most 67 characters (ASN.1). 
%% %% 64 characters for name, 1 for "/", 2 for version to match ABNF
%% -record('ServiceChangeProfile',
%% 	{
%% 	  profileName
%% 	 }
%%        ).

-record('ServiceChangeProfile',
	{
	  profileName, 
	  version
	 }).


-record('PackagesItem',
	{
	  packageName, 
	  packageVersion
	 }). % with extension mark

-record('StatisticsParameter',
	{
	  statName, 
	  statValue = asn1_NOVALUE
	 }).

-record('TimeNotation',
	{
	  date, 
	  time
	 }).

