/*
///////////////////////////////////////////////////////////////////////////////
//
// 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_Outgoing_Call_Barring_Operations_and_Errors.asn
//  Description:   Functional protocol for ISDN
//
//  References:    ETSI EN 301 001-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-Outgoing-Call-Barring-Operations-and-Errors {itu-t identified-organization etsi(0) 1001 operations-and-errors(1)}

DEFINITIONS EXPLICIT TAGS  ::=

 
BEGIN

 
EXPORTS
    activationOcb,
    activationStatusNotificationOcb,
    deactivationOcb,
    deactivationStatusNotificationOcb,
    interrogationOcb,
    disableOcb,
    ocbInvoked,
    invalidBarringProgram,
    noBarringProgram;
    
IMPORTS
      OPERATION,
      ERROR
    FROM Remote-Operations-Information-Objects
    {joint-iso-itu-t remote-operations (4) notation (0)} 

 
     PartyNumber
    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,
      basicServiceNotProvided,
      invalidServedUserNr,
      resourceUnavailable,
      notImplemented,
      supplementaryServiceInteractionNotAllowed
    FROM Revised-General-Errors
    {itu-t identified-organization etsi (0) 196 general-errors (2)}

 
      notActivated
    FROM Revised-Diversion-Operations
    {itu-t identified-organization etsi (0) 207 operations-and-errors(1)}

 
      Pin,
      invalidPin,
      userControlBlocked,
      changeOfPinRequired
    FROM Revised-Set-Operations-and-Errors
    {itu-t identified-organization etsi (0) 1002 operations-and-errors(1)};

 
  activationOcb OPERATION::=
    {  
      ARGUMENT
          ActivationOcbArgument
 
      ERRORS {
          notSubscribed |
          notAvailable |
          basicServiceNotProvided |
          invalidServedUserNr |
          invalidPin |
          invalidBarringProgram |
          noBarringProgram |
          userControlBlocked |
          supplementaryServiceInteractionNotAllowed |
          resourceUnavailable |
          changeOfPinRequired }   
          
       CODE global:{oCBOID  1}         
      }

 
  deactivationOcb OPERATION::=
     {
       ARGUMENT
         DeactivationOcbArgument

       ERRORS {
         notSubscribed |
         notAvailable |
         basicServiceNotProvided |
         invalidServedUserNr |
         notActivated |
         invalidPin |
         userControlBlocked |
         changeOfPinRequired }      
         
       CODE global:{oCBOID  2}             
     }

 
  interrogationOcb OPERATION::=
    {
       ARGUMENT
         InterrogationOcbArgument

 
       RESULT 
         IntOcbResultList

 
       ERRORS {
         notSubscribed |
         notAvailable |
         basicServiceNotProvided |
         invalidServedUserNr }    
         
       CODE global:{oCBOID  5}                
     }

 
  activationStatusNotificationOcb OPERATION::=
    {
       ARGUMENT
         ActStatusNotificationOcbArg   
         
       CODE global:{oCBOID  3}                 
    }

 
  deactivationStatusNotificationOcb OPERATION::=
    {
       ARGUMENT
         DeactStatusNotificationOcbArg  
         
       CODE global:{oCBOID  4}                  
    }

 
  disableOcb OPERATION::=
    {
       ARGUMENT
         Pin  
  
       ERRORS {
         notImplemented |
         invalidPin |
         userControlBlocked |
         changeOfPinRequired }  
         
       CODE global:{oCBOID  6}                  
    }

  ocbInvoked OPERATION::=
    {
       CODE global:{oCBOID  7}        
    } 
  
  ActivationOcbArgument ::=    
      SEQUENCE {
        basicService           BasicService,
        pin                    Pin,
        barringProgram         BarringProgram   OPTIONAL,
        servedUserNr           ServedUserNr     OPTIONAL}        
    

 
  DeactivationOcbArgument ::=    
      SEQUENCE {
        basicService           BasicService,
        pin                    Pin,
        barringProgram         BarringProgram    OPTIONAL,
        servedUserNr           ServedUserNr      OPTIONAL}        
    

 
  InterrogationOcbArgument ::=    
      SEQUENCE {
        basicService           BasicService,
        servedUserNr           ServedUserNr      OPTIONAL}        
    

 
  ActStatusNotificationOcbArg ::=
      SEQUENCE {
        basicService           BasicService,
        barringProgram         BarringProgram,
        servedUserNr           ServedUserNr}        
  

 
  DeactStatusNotificationOcbArg ::=
      SEQUENCE {
        basicService           BasicService,
        barringProgram         BarringProgram    OPTIONAL,
        servedUserNr           ServedUserNr}        


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

 
  IntOcbResultList ::=
      SET SIZE (0..30) OF IntOcbResult

 
  IntOcbResult ::=
      SEQUENCE {
        servedUserNr           ServedUserNr,
        basicService           BasicService,
        barringProgramList     BarringProgramList}

  BarringProgram ::=           INTEGER (0..255)
  BarringProgramList ::=
      SET SIZE (0..63) OF BarringProgram


  oCBOID OBJECT IDENTIFIER ::= {itu-t identified-organization etsi(0) 1001
                                operations-and-errors(1)}

  
  invalidBarringProgram ERROR ::={CODE global:{oCBOID 10}}
  noBarringProgram      ERROR ::={CODE global:{oCBOID 11}}
        -- notActivated       NotActivated       ::= localValue 46

END -- of Outgoing-Call-Barring-Operations-and-Errors

