/*
///////////////////////////////////////////////////////////////////////////////
//
// 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_Addressing_Data_Elements.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:      2006.01.10.
//  Contact:      http://ttcn.ericsson.se
*/

Revised-Addressing-Data-Elements {itu-t identified-organization etsi(0) 196 revised-addressing-data-elements(14)}

DEFINITIONS EXPLICIT TAGS ::=

BEGIN

EXPORTS	PresentedAddressScreened, PresentedAddressUnscreened, PresentedNumberScreened, PresentedNumberUnscreened, Address, PartyNumber, PartySubaddress, ScreeningIndicator, PresentationAllowedIndicator;

IMPORTS;

PresentedAddressScreened ::= CHOICE {
						presentationAllowedAddress [0] IMPLICIT AddressScreened,
						presentationRestricted [1] IMPLICIT NULL,
						numberNotAvailableDueToInterworking [2] IMPLICIT NULL,
						presentationRestrictedAddress [3] IMPLICIT AddressScreened }

PresentedAddressUnscreened ::= CHOICE {
						presentationAllowedAddress [0] IMPLICIT Address,
						presentationRestricted [1] IMPLICIT NULL,
						numberNotAvailableDueToInterworking [2] IMPLICIT NULL,
						presentationRestrictedAddress [3] IMPLICIT Address}

PresentedNumberScreened ::= CHOICE {
						presentationAllowedNumber [0] IMPLICIT NumberScreened,
						presentationRestricted [1] IMPLICIT NULL,
						numberNotAvailableDueToInterworking [2] IMPLICIT NULL,
						presentationRestrictedNumber [3] IMPLICIT NumberScreened}

PresentedNumberUnscreened ::= CHOICE {
						presentationAllowedNumber [0] PartyNumber,
						presentationRestricted [1] IMPLICIT NULL,
						numberNotAvailableDueToInterworking [2] IMPLICIT NULL,
						presentationRestrictedNumber [3] PartyNumber}

AddressScreened ::= SEQUENCE {
						partyNumber PartyNumber,  --anonymous Notation is no longer supported in X.680
						screeningIndicator ScreeningIndicator,
						partySubaddress PartySubaddress OPTIONAL}

NumberScreened ::= SEQUENCE {
						partyNumber PartyNumber,
						screeningIndicator ScreeningIndicator}

Address ::= SEQUENCE {
						partyNumber PartyNumber,
						partySubaddress PartySubaddress OPTIONAL}

PartyNumber                     ::= CHOICE {
                                        unknownPartyNumber [0] IMPLICIT NumberDigits,
                                        -- the numbering plan is the default numbering plan of the
                                        -- network. It is recommended that this value is used.
                                        publicPartyNumber [1] IMPLICIT PublicPartyNumber,
                                        -- the numbering plan is according to
                                        -- ITU-T Recommendation E.164.
										nsapEncodedNumber [2] IMPLICIT NsapEncodedNumber,
										-- ATM endsystem address encoded as an NSAP address.
                                        dataPartyNumber [3] IMPLICIT NumberDigits,
                                        -- not used, value reserved.
                                        telexPartyNumber [4] IMPLICIT NumberDigits,
                                        -- not used, value reserved.
                                        privatePartyNumber [5] IMPLICIT PrivatePartyNumber,
                                        nationalStandardPartyNumber [8] IMPLICIT NumberDigits}
                                        -- not used, value reserved.

PublicPartyNumber ::= SEQUENCE {
						publicTypeOfNumber PublicTypeOfNumber,
						publicNumberDigits NumberDigits}

NsapEncodedNumber 				::= OCTET STRING (SIZE(20))




PrivatePartyNumber ::= SEQUENCE {
						privateTypeOfNumber PrivateTypeOfNumber,
						privateNumberDigits NumberDigits}

NumberDigits ::= NumericString (SIZE(1..20))

PublicTypeOfNumber ::= ENUMERATED {
						unknown-PublicTypeOfNumber (0),
							-- if used number digits carry prefix indicating type of
							-- number according to national recommendations
						internationalNumber (1),
						nationalNumber (2),
						networkSpecificNumber (3),
							-- not used, value reserved
						subscriberNumber (4),
						abbreviated-PublicNumber (6)}
							-- valid only for called party number at the outgoing
							-- access, network substitutes appropriate number.

PrivateTypeOfNumber ::= ENUMERATED {
						unknownPrivateTypeOfNumber (0),
						level2RegionalNumber (1),
						level1RegionalNumber (2),
						pTNSpecificNumber (3),
						localNumber (4),
						abbreviated-PrivateNumber (6)}

PartySubaddress ::= CHOICE {
						userSpecifiedSubaddress UserSpecifiedSubaddress,
							-- not recommended
						nSAPSubaddress NSAPSubaddress}
							-- according to ITU-T Recommendation X.213

UserSpecifiedSubaddress ::= SEQUENCE {
						subaddressInformation SubaddressInformation,
						oddCountIndicator BOOLEAN OPTIONAL}
							-- used when the coding of subaddress is BCD

NSAPSubaddress ::= OCTET STRING (SIZE(1..20))
						-- specified according to ITU-T Recommendation X.213. Some
						-- networks may limit the subaddress value to some other
						-- length, e.g. 4 octets

SubaddressInformation ::= OCTET STRING (SIZE(1..20))
						-- coded according to user requirements. Some networks may
						-- limit the subaddress value to some other length,
						-- e.g. 4 octets

ScreeningIndicator ::= ENUMERATED {
					userProvidedNotScreened (0),
						-- number was provided by a remote user terminal equipment,
						-- and has been screened by a network that is not the
						-- local public or local private network.
					userProvidedVerifiedAndPassed (1),
						-- number was provided by a remote user terminal equipment
						-- (or by a remote private network), and has been screened
						-- by the local public or local private network.
					userProvidedVerifiedAndFailed (2),
						-- not used, value reserved
					networkProvided (3)}
						-- number was provided by local public or local
						-- private network

PresentationAllowedIndicator ::= BOOLEAN

END -- of Revised-Addressing-Data-Elements
