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

DEFINITIONS EXPLICIT TAGS ::=

BEGIN

EXPORTS 
  mCIDRequest;

IMPORTS 
    OPERATION
  FROM Remote-Operations-Information-Objects
  {joint-iso-itu-t remote-operations (4) notation (0)}
        
    notAvailable,
    notSubscribed,
    invalidCallState,
    notIncomingCall,
    supplementaryServiceInteractionNotAllowed
  FROM Revised-General-Errors
  {itu-t identified-organization etsi (0) 196 general-errors (2)};

mCIDRequest OPERATION ::= 
  {
    ERRORS
    {
      notSubscribed    |
      notAvailable     |
      invalidCallState |
      notIncomingCall  |
      supplementaryServiceInteractionNotAllowed
    }     
  }

END
