/*
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2019 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_Diversion_Operations.asn
//  Description:   Functional protocol for ISDN
//
//  References:    ETSI EN 300 207-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-Diversion-Operations {itu-t identified-organization etsi (0) 207 operations-and-errors (1)}

DEFINITIONS EXPLICIT TAGS ::=

BEGIN

  EXPORTS
      activationDiversion,
      deactivationDiversion,
      activationStatusNotificationDiv,
      deactivationStatusNotificationDiv,
      interrogationDiversion,
      interrogateServedUserNumbers,
      diversionInformation,
      callDeflection,
      callRerouting,
      divertingLegInformation1,
      divertingLegInformation2,
      divertingLegInformation3,
      invalidDivertedToNr,
      specialServiceNr,
      diversionToServedUserNr,
      incomingCallAccepted,
      numberOfDiversionsExceeded,
      requestAlreadyAccepted,
      notActivated;
      
  IMPORTS
      OPERATION,
      ERROR
    FROM Remote-Operations-Information-Objects
    {joint-iso-itu-t remote-operations (4) notation (0)}

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

 
      BasicService
    FROM Revised-Basic-Service-Elements
    {itu-t identified-organization etsi (0) 196 basic-service-elements (8)}   
    
      notSubscribed,
      notAvailable,
      supplementaryServiceInteractionNotAllowed,
      basicServiceNotProvided,
      invalidServedUserNr,
      resourceUnavailable
    FROM Revised-General-Errors
    {itu-t identified-organization etsi (0) 196 general-errors (2)}
    
      Service,
      Preferred
    FROM Revised-UUS-Operations
    {itu-t identified-organization etsi (0) 286 operations-and-errors (1)}

 
      Q931InformationElement
    FROM Revised-Embedded-Q931-Types
    {itu-t identified-organization etsi (0) 196 embedded-q931-types (7)};   
    
  activationDiversion OPERATION::=
    {    
     ARGUMENT SEQUENCE {
          procedure          Procedure,
          basicService       BasicService,
          forwardedToAddress Address,
          servedUserNr       ServedUserNr }

      ERRORS {
        notSubscribed |
        notAvailable |
        invalidServedUserNr |
        supplementaryServiceInteractionNotAllowed |
        basicServiceNotProvided |
        resourceUnavailable |
        invalidDivertedToNr |
        specialServiceNr |
        diversionToServedUserNr }
        
      CODE local:7  
    }
    
 
  -- End of ActivationDiversion operation definition

 
  deactivationDiversion OPERATION::=
    {
      ARGUMENT SEQUENCE {
          procedure          Procedure,
          basicService       BasicService,
          servedUserNr       ServedUserNr }

      ERRORS {
        notSubscribed |
        notAvailable |
        invalidServedUserNr |
        notActivated }     
        
      CODE local:8    
     }

 
  -- End of DeactivationDiversion operation definition

 
  activationStatusNotificationDiv OPERATION::=
    {    
      ARGUMENT SEQUENCE {
          procedure          Procedure,
          basicService       BasicService,
          forwardedToAddress Address,
          servedUserNr       ServedUserNr }
          
      CODE local:9    
    }
 
  -- End of ActivationStatusNotificationDiv operation definition

 
  deactivationStatusNotificationDiv OPERATION::=
    {
      ARGUMENT SEQUENCE {
          procedure          Procedure,
          basicService       BasicService,
          servedUserNr       ServedUserNr }   
          
      CODE local:10                 
    }

 
  -- End of DeactivationStatusNotificationDiv operation definition

 
  interrogationDiversion OPERATION::=
   {
      ARGUMENT SEQUENCE {
          procedure          Procedure,
          basicService       BasicService DEFAULT allServices,
          servedUserNr       ServedUserNr }   
   
      RESULT
        IntResultList
 
      ERRORS {
        notSubscribed |
        notAvailable |
        invalidServedUserNr }      
        
      CODE local:11          
   }

 
  -- End of InterrogationDiversion operation definition

 
  interrogateServedUserNumbers OPERATION::=
    {   
      RESULT
        ServedUserNumberList

 
      ERRORS {
        notSubscribed |
        notAvailable }    
        
      CODE local:17            
    }

 
  -- End of InterrogateServedUserNumbers operation definition

 
  diversionInformation OPERATION::=
    {  
      ARGUMENT SEQUENCE {
          diversionReason      DiversionReason,
          basicService         BasicService,
          servedUserSubaddress PartySubaddress OPTIONAL,
          callingAddress       [0] PresentedAddressScreened OPTIONAL,
          originalCalledNr     [1] PresentedNumberUnscreened OPTIONAL,
          lastDivertingNr      [2] PresentedNumberUnscreened OPTIONAL,
          lastDivertingReason  [3] DiversionReason OPTIONAL,
          userInfo             Q931InformationElement OPTIONAL }
          -- The User-user information element, as specified in the DSS1 L3
          -- protocol FS shall be embedded in the userInfo parameter
          
      CODE local:12          
 
   }
  -- End of DiversionInformation operation definition

 
  callDeflection OPERATION::=
    {      
      ARGUMENT SEQUENCE {
          deflectionAddress                 Address,
          presentationAllowedDivertedToUser PresentationAllowedIndicator
           OPTIONAL }
           
            
      ERRORS {
        notSubscribed |
        notAvailable |
        invalidDivertedToNr |
        specialServiceNr |
        diversionToServedUserNr |
        incomingCallAccepted |
        numberOfDiversionsExceeded |
        supplementaryServiceInteractionNotAllowed |
        requestAlreadyAccepted }      
        
      CODE local:13    
    }

 
  -- End of CallDeflection operation definition

 
  callRerouting OPERATION::=
    {    
      ARGUMENT SEQUENCE {
          reroutingReason        DiversionReason,
          calledAddress          Address,
          reroutingCounter       DiversionCounter,
          q931InfoElement        Q931InformationElement,
          lastReroutingNr        [1] PresentedNumberUnscreened,
          subscriptionOption     [2] SubscriptionOption DEFAULT noNotification,
          callingPartySubaddress [3] PartySubaddress OPTIONAL }
          -- The User-user information element (optional), High layer
          -- compatibility information element (optional), Bearer capability
          -- information element and Low layer compatibility information
          -- element (optional) as specified in the DSS1 L3 protocol FS shall be
          -- embedded in the q931InfoElement
 
      ERRORS {
        notSubscribed |
        notAvailable |
        supplementaryServiceInteractionNotAllowed |
        resourceUnavailable |
        invalidDivertedToNr |
        specialServiceNr |
        diversionToServedUserNr |
        numberOfDiversionsExceeded }  
        
      CODE local:14        
    }

 
  -- End of CallRerouting operation definition

 
  divertingLegInformation1 OPERATION::=
    {  
      ARGUMENT SEQUENCE {
          diversionReason    DiversionReason,
          subscriptionOption SubscriptionOption,
          divertedToNumber   PresentedNumberUnscreened OPTIONAL }   
          
      CODE local:18           
    }

 
  -- End of DivertingLegInformation1 operation definition

 
  divertingLegInformation2 OPERATION::=
    {
        ARGUMENT SEQUENCE {
          diversionCounter   DiversionCounter,
          diversionReason    DiversionReason,
          divertingNr        [1] PresentedNumberUnscreened OPTIONAL,
          originalCalledNr   [2] PresentedNumberUnscreened OPTIONAL }   
          
        CODE local:15         
    }

 
  -- End of DivertingLegInformation2 operation definition

  divertingLegInformation3 OPERATION::=
    {
        ARGUMENT PresentationAllowedIndicator
        
        CODE local:19
    }
    
  uUSRequest OPERATION::=
    {
      ARGUMENT SEQUENCE {
          service   [1] IMPLICIT Service,
          preferred [2] IMPLICIT Preferred }
          
      CODE local:66    
    }  
 
  -- End of DivertingLegInformation3 operation definition

 
  -- The ETS specifies SIZE (0..29)
  -- Buffer implementation only supports SIZE (0..10)
  -- IntResultList ::= SET SIZE (0..29) OF IntResult
  IntResultList ::= SET SIZE (0..10) OF IntResult

 
  IntResult ::=
      SEQUENCE {
        servedUserNr       ServedUserNr,
        basicService       BasicService,
        procedure          Procedure,
        forwardedToAddress Address }

 
  ServedUserNr ::=
      CHOICE {
        individualNumbers PartyNumber,
        allNumbers        NULL }

 
  DiversionCounter ::= INTEGER (1..5)

 
  SubscriptionOption ::=
      ENUMERATED {
        noNotification                  (0),
        notificationWithoutDivertedToNr (1),
        notificationWithDivertedToNr    (2) }

 
  Procedure ::=
      ENUMERATED {
        cfu  (0),
        cfb  (1),
        cfnr (2) }

 
  -- The ETS specifies SIZE (0..99)
  -- Buffer implementation only supports SIZE (0..31)
  -- ServedUserNumberList ::= SET SIZE (0..99) OF PartyNumber
  ServedUserNumberList ::= SET SIZE (0..31) OF PartyNumber

 
  DiversionReason ::=
      ENUMERATED {
        unknown     (0),
        cfu         (1),
        cfb         (2),
        cfnr        (3),
        cdAlerting  (4),
        cdImmediate (5) }

 
  invalidDivertedToNr         ERROR  ::= {CODE local:12}
  specialServiceNr            ERROR  ::= {CODE local:14}
  diversionToServedUserNr     ERROR  ::= {CODE local:15}
  incomingCallAccepted        ERROR  ::= {CODE local:23}
  numberOfDiversionsExceeded  ERROR  ::= {CODE local:24}
  requestAlreadyAccepted      ERROR  ::= {CODE local:48}
  notActivated                ERROR  ::= {CODE local:46}


 
END -- of diversion operation definitions
   