/*
///////////////////////////////////////////////////////////////////////////////
//
// 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_MWI_Operations_and_Errors.asn
//  Description:   Functional protocol for ISDN
//
//  References:    ETSI EN 300 745-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-MWI-Operations-and-Errors {itu-t identified-organization etsi (0) 745 operations-and-errors (1)}

DEFINITIONS EXPLICIT TAGS ::=

 
BEGIN

 
  EXPORTS
      mWIActivate,
      mWIDeactivate,
      mWIIndicate,
      invalidReceivingUserNr,
      receivingUserNotSubscribed,
      controllingUserNotRegistered,
      maxNumOfControllingUsersReached,
      maxNumOfActiveInstancesReached;

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

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

 
      BasicService
    FROM Revised-Basic-Service-Elements
    {itu-t identified-organization etsi (0) 196 basic-service-elements (8)}

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

 
  mWIActivate OPERATION::=
    {  
        ARGUMENT SEQUENCE {
          receivingUserNr             PartyNumber,
          basicService                BasicService,
          controllingUserNr           [1] PartyNumber OPTIONAL,
          numberOfMessages            [2] MessageCounter OPTIONAL,
          controllingUserProvidedNr   [3] PartyNumber OPTIONAL,
          time                        [4] GeneralizedTime OPTIONAL,
          messageId                   [5] MessageID OPTIONAL,
          mode                        [6] InvocationMode OPTIONAL }
 
        ERRORS {
          notSubscribed |
          supplementaryServiceInteractionNotAllowed |
          resourceUnavailable |
          invalidReceivingUserNr |
          invalidServedUserNr |
          receivingUserNotSubscribed |
          controllingUserNotRegistered |
          indicationNotDelivered |
          maxNumOfControllingUsersReached |
          maxNumOfActiveInstancesReached }     
          
        CODE global:{mWIOID 1}       
    }

 
  -- End of MWIActivate operation definition

 
  mWIDeactivate OPERATION::=
    {  
        ARGUMENT SEQUENCE {
          receivingUserNr     PartyNumber,
          basicService        BasicService,
          controllingUserNr   PartyNumber OPTIONAL,
          mode                InvocationMode OPTIONAL }
 
        ERRORS {
          notSubscribed |
          supplementaryServiceInteractionNotAllowed |
          resourceUnavailable |
          invalidReceivingUserNr |
          invalidServedUserNr |
          receivingUserNotSubscribed |
          controllingUserNotRegistered |
          indicationNotDelivered }    
          
        CODE global:{mWIOID 2}         
    }

 
  -- End of MWIDeactivate operation definition

 
  mWIIndicate OPERATION::=
    {  
        ARGUMENT SEQUENCE {
          controllingUserNr           [1] PartyNumber OPTIONAL,
          basicService                [2] BasicService OPTIONAL,
          numberOfMessages            [3] MessageCounter OPTIONAL,
          controllingUserProvidedNr   [4] PartyNumber OPTIONAL,
          time                        [5] GeneralizedTime OPTIONAL,
          messageId                   [6] MessageID OPTIONAL }  
          
        CODE global:{mWIOID 3}            
    }

 
  -- End of MWIIndicate operation definition


 
  -- For information only:
  -- GeneralizedTime ::= [UNIVERSAL 24] IMPLICIT VisibleString
  -- NOTE: Only GeneralizedTime values of a maximum of 23 characters
  --       are supported. This implies a limit on the precision of
  --       fractions in time values of:
  --       * 3 decimal places if seconds are specified,
  --       * 5 decimal places if minutes but not seconds are
  --         specified, and
  --       * 7 decimal places if neither minutes nor seconds are
  --         specified.

 
  MessageCounter ::= INTEGER (0..65535)

 
  MessageID ::=
      SEQUENCE {
        messageRef   MessageRef,
        status       MessageStatus }

 
  MessageRef ::= INTEGER (0..65535)

 
  MessageStatus ::=
      ENUMERATED {
        addedMessage     (0),
        removedMessage   (1) }

  InvocationMode ::=
      ENUMERATED {
        deferred    (0),
        immediate   (1),
        combined    (2) }

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


 
  invalidReceivingUserNr           ERROR ::= {CODE global:{mWIOID 10}}   
  receivingUserNotSubscribed       ERROR ::= {CODE global:{mWIOID 11}}
  controllingUserNotRegistered     ERROR ::= {CODE global:{mWIOID 12}}
  indicationNotDelivered           ERROR ::= {CODE global:{mWIOID 13}}
  maxNumOfControllingUsersReached  ERROR ::= {CODE global:{mWIOID 14}}
  maxNumOfActiveInstancesReached   ERROR ::= {CODE global:{mWIOID 15}}

 
END -- MWI-Operations-and-Errors
