/*
///////////////////////////////////////////////////////////////////////////////
//
// 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_Explicit_Call_Transfer_Operations_and_Errors.asn
//  Description:   Functional protocol for ISDN
//
//  References:    ETSI EN 300 369-1 
//                 Integrated Services Digital Network (ISDN);
//                 Generic functional protocol for the support
//                 of supplementary services;
//  Rev:          R3C
//  Prodnr:       CNL 113 435
//  Updated:      2012.04.19.
//  Contact:      http://ttcn.ericsson.se
*/

Revised-Explicit-Call-Transfer-Operations-and-Errors {itu-t identified-organization etsi (0) 369 operations-and-errors (1)}

DEFINITIONS ::=

 
BEGIN

 
  EXPORTS
      ectLinkIdRequest,
      ectExecute,
      requestSubaddress,
      subaddressTransfer,
      explicitEctExecute,
      linkIdNotAssignedByNetwork,
      ectLoopTest,
      ectInform;

 
  IMPORTS
      OPERATION,
      ERROR
    FROM Remote-Operations-Information-Objects
    {joint-iso-itu-t remote-operations (4) notation (0)} 

 
      notAvailable,
      notSubscribed,
      resourceUnavailable,
      supplementaryServiceInteractionNotAllowed,
      invalidCallState
    FROM Revised-General-Errors
    {itu-t identified-organization etsi (0) 196 general-errors (2)}

 
      PartySubaddress,
      PresentedNumberUnscreened
    FROM Revised-Addressing-Data-Elements
    {itu-t identified-organization etsi (0) 196 addressing-data-elements (6)};

 
  ectLinkIdRequest OPERATION::=
    {  
      RESULT
        LinkId

 
      ERRORS {
        resourceUnavailable }  
        
      CODE global:{eCTOID ectLinkIdRequest-operation (4)}      
    }

 
  ectExecute OPERATION::=
    {
      ERRORS {
        notAvailable |
        notSubscribed |
        invalidCallState |
        supplementaryServiceInteractionNotAllowed }  
        
      CODE local:6        
    }

 
  explicitEctExecute OPERATION::=
    {  
      ARGUMENT
        LinkId        
        
      ERRORS {
        notAvailable |
        notSubscribed |
        invalidCallState |
        supplementaryServiceInteractionNotAllowed |    
        linkIdNotAssignedByNetwork }
        
      CODE global:{eCTOID explicitEctExecute-operation (1)}          
    }

 
  requestSubaddress OPERATION::=
    {
      CODE global:{eCTOID requestSubAddress-operation (2)}
    }      

 
  subaddressTransfer OPERATION::=
     {
      ARGUMENT  PartySubaddress   
      
      CODE global:{eCTOID subaddressTransfer-operation (3)}     
     }


  ectInform OPERATION::=
    {
      ARGUMENT SEQUENCE {
          en ENUMERATED {
            alerting (0),
            active   (1) },
          redirectionNumber    PresentedNumberUnscreened OPTIONAL }   
          
      CODE global:{eCTOID ectInform-operation (5)}           
    }

 
  ectLoopTest OPERATION::=
    {
      ARGUMENT
          CallTransferIdentity

 
      RESULT
        LoopResult

 
      ERRORS {
        notAvailable }   
        
      CODE global:{eCTOID ectLoopTest-operation (6)}       
    }

 
  LoopResult ::=
      ENUMERATED {
        insufficientInformation (0),
        noLoopExists            (1),
        simultaneousTransfer    (2) }

 
  CallTransferIdentity ::= INTEGER (-128..127)

 
  LinkId ::= INTEGER (-32768..32767)


 
  eCTOID OBJECT IDENTIFIER ::= {itu-t identified-organization etsi (0) 369
                                operation-and-errors (1)}

 
  linkIdNotAssignedByNetwork ERROR ::= {CODE global:{eCTOID linkIdNotAssignedByNetwork-error (21)}}




 
END --Explicit-Call-Transfer-Operations-And-Errors
