/*
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2018 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:          Revised_Facility_Information_Element_Components.asn
//  Description:   Functional protocol for ISDN
//
//  References:    ETSI EN 300 196-1 V1.3.2 (2001-06)
//                 Integrated Services Digital Network (ISDN);
//                 Generic functional protocol for the support
//                 of supplementary services;
//  Rev:          R3C
//  Prodnr:       CNL 113 435
//  Updated:      2012.06.27.
//  Contact:      http://ttcn.ericsson.se
*/

Revised-Facility-Information-Element-Components
	{itu-t identified-organization etsi(0) 196 revised-facility-information-element-component(11)}
DEFINITIONS
IMPLICIT TAGS ::=
BEGIN
-- exports everything
IMPORTS OPERATION, ERROR FROM Remote-Operations-Information-Objects {joint-iso-itu-t remote-operations(4) informationObjects(5) version1(0)};
ROS {InvokeId:InvokeIdSet, OPERATION:Invokable, OPERATION:Returnable} ::=	CHOICE
		{
			invoke		[1]	Invoke {{InvokeIdSet}, {Invokable}},
			returnResult	[2]	ReturnResult {{Returnable}},
			returnError	[3]	ReturnError {{Errors{{Returnable}}}},
			reject		[4]	Reject
		}
(CONSTRAINED BY { -- must conform to the above definition -- }
! RejectProblem : general-unrecognizedPDU)
Invoke {InvokeId:InvokeIdSet, OPERATION:Operations} ::=	SEQUENCE
		{
			invokeId	InvokeId	(InvokeIdSet)
								(CONSTRAINED BY {-- must be unambiguous --}
								! RejectProblem : invoke-duplicateInvocation),
			linkedId	CHOICE	
							{
							present	[0]	IMPLICIT	present <	InvokeId,
							absent	[1]	IMPLICIT NULL
							}
							(CONSTRAINED BY {-- must identify an outstanding operation --}
							! RejectProblem : invoke-unrecognizedLinkedId) 
							(CONSTRAINED BY {-- which has one or more linked operations--}
							! RejectProblem : invoke-linkedResponseUnexpected) 
								OPTIONAL,
			opcode	OPERATION.&operationCode
								({Operations}
								! RejectProblem : invoke-unrecognizedOperation), 
			argument	OPERATION.&ArgumentType
								({Operations} {@opcode}
								! RejectProblem : invoke-mistypedArgument) 
									OPTIONAL
		}
(CONSTRAINED BY { -- must conform to the above definition -- }
! RejectProblem : general-mistypedPDU) 
(
	WITH COMPONENTS
	{..., 
		linkedId	ABSENT
	}
|	WITH COMPONENTS
	{..., 
		linkedId	PRESENT, 
		opcode
		(CONSTRAINED BY {-- must be in the &Linked field of the associated operation --}
		! RejectProblem : invoke-unexpectedLinkedOperation) 
	}
)
ReturnResult {OPERATION:Operations}::=	SEQUENCE
		{
			invokeId	InvokeId
						(CONSTRAINED BY {-- must be that for an outstanding operation  --}
						! RejectProblem : returnResult-unrecognizedInvocation) 
						(CONSTRAINED BY {-- which returns a result --}
						! RejectProblem : returnResult-resultResponseUnexpected),
			result	SEQUENCE
		{
			opcode	OPERATION.&operationCode
						({Operations})(CONSTRAINED BY {-- identified by invokeId --}
						! RejectProblem : returnResult-unrecognizedInvocation),
			result 		OPERATION.&ResultType
						({Operations} {@.opcode}   -- added a little period from the Corrigendum
						! RejectProblem : returnResult-mistypedResult) 
		}
				OPTIONAL
		}
(CONSTRAINED BY { -- must conform to the above definition -- }
! RejectProblem : general-mistypedPDU) 
ReturnError {ERROR:Errors} ::=	SEQUENCE
		{
			invokeId	InvokeId
						(CONSTRAINED BY {-- must be that for an outstanding operation --}
						! RejectProblem : returnError-unrecognizedInvocation) 
						(CONSTRAINED BY {-- which returns an error --}
						! RejectProblem : returnError-errorResponseUnexpected),
			errcode	ERROR.&errorCode
							({Errors}
							! RejectProblem : returnError-unrecognizedError) 
							(CONSTRAINED BY 
								{--must be in the &Errors field of the associated opÕn --}
							! RejectProblem : returnError-unexpectedError),
			parameter 	ERROR.&ParameterType
							({Errors}{@errcode}
							! RejectProblem : returnError-mistypedParameter) OPTIONAL 
		}
(CONSTRAINED BY { -- must conform to the above definition -- }
! RejectProblem : general-mistypedPDU) 
Reject ::=	SEQUENCE
		{
			invokeId	InvokeId,
			problem	CHOICE
						{
						general		[0]	GeneralProblem,
						invoke		[1]	InvokeProblem,
						returnResult	[2]	ReturnResultProblem,
						returnError	[3]	ReturnErrorProblem
						}
		}
(CONSTRAINED BY { -- must conform to the above definition -- }
! RejectProblem : general-mistypedPDU) 
GeneralProblem ::=	INTEGER
		{
			unrecognizedComponent (0),
			mistypedComponent (1),
			badlyStructuredComponent (2)
		}
InvokeProblem ::=	INTEGER
		{
			duplicateInvocation (0),
			unrecognizedOperation (1),
			mistypedArgument (2),
			resourceLimitation (3),
			releaseInProgress (4),
			unrecognizedLinkedId (5),
			linkedResponseUnexpected (6),
			unexpectedLinkedOperation (7)
		}
ReturnResultProblem ::=	INTEGER
		{
			unrecognizedInvocation (0),
			resultResponseUnexpected (1),
			mistypedResult (2)
		}
ReturnErrorProblem ::=	INTEGER
		{
			unrecognizedInvocation (0),
			errorResponseUnexpected (1),
			unrecognizedError (2),
			unexpectedError (3),
			mistypedParameter (4)
		}
RejectProblem ::=		INTEGER
		{
			general-unrecognizedPDU (0),
			general-mistypedPDU (1),
			general-badlyStructuredPDU (2),
			invoke-duplicateInvocation (10),
			invoke-unrecognizedOperation (11),
			invoke-mistypedArgument (12),
			invoke-resourceLimitation (13),
			invoke-releaseInProgress (14),
			invoke-unrecognizedLinkedId (15),
			invoke-linkedResponseUnexpected (16),
			invoke-unexpectedLinkedOperation (17),
			returnResult-unrecognizedInvocation (20),
			returnResult-resultResponseUnexpected (21),
			returnResult-mistypedResult (22),
			returnError-unrecognizedInvocation (30),
			returnError-errorResponseUnexpected (31),
			returnError-unrecognizedError (32),
			returnError-unexpectedError (33),
			returnError-mistypedParameter (34)
		}
InvokeId ::=	CHOICE
		{
			present	INTEGER,
			absent	NULL
		}
noInvokeId InvokeId ::=	absent:NULL
NoInvokeId InvokeId ::=	{noInvokeId}
Errors {OPERATION:Operations} ERROR ::=	{Operations.&Errors}


Components {OPERATION:Invokable, OPERATION:Returnable} ::= CHOICE
{
gfpROS	ROS {GFPInvokeIDSet, {Invokable}, {Returnable}}
}

--GFPInvokeIDSet INTEGER  ::= {-32768..32767}
GFPInvokeIDSet InvokeId ::= { WITH COMPONENTS { ..., present (-32768..32767) } }

END -- of Revised-Facility-Information-Element-Components
