-- Module Remote-Operations-Useful-Definitions (Rec. X.880:07/1994)
Remote-Operations-Useful-Definitions {joint-iso-itu-t remote-operations(4)
  useful-definitions(7) version1(0)} DEFINITIONS IMPLICIT TAGS ::=
BEGIN

-- exports everything
IMPORTS
  OPERATION, ERROR, OPERATION-PACKAGE, Code
    FROM Remote-Operations-Information-Objects {joint-iso-itu-t
      remote-operations(4) informationObjects(5) version1(0)}
  InvokeId, ROS{}
    FROM Remote-Operations-Generic-ROS-PDUs {joint-iso-itu-t
      remote-operations(4) generic-ROS-PDUs(6) version1(0)};

emptyBind OPERATION ::= {ERRORS       {refuse}
                         SYNCHRONOUS  TRUE
}

emptyUnbind OPERATION ::= {SYNCHRONOUS  TRUE
}

refuse ERROR ::= {CODE  local:-1
}

no-op OPERATION ::= {ALWAYS RESPONDS  FALSE
                     CODE             local:-1
}

Forward{OPERATION:OperationSet} OPERATION ::=
  {OperationSet | OperationSet.&Linked.&Linked |
   OperationSet.&Linked.&Linked.&Linked.&Linked}

Reverse{OPERATION:OperationSet} OPERATION ::= {Forward{{OperationSet.&Linked}}}

ConsumerPerforms{OPERATION-PACKAGE:package} OPERATION ::=
  {Forward{{package.&Consumer}} | Forward{{package.&Both}} |
   Reverse{{package.&Supplier}} | Reverse{{package.&Both}}}

SupplierPerforms{OPERATION-PACKAGE:package} OPERATION ::=
  {Forward{{package.&Supplier}} | Forward{{package.&Both}} |
   Reverse{{package.&Consumer}} | Reverse{{package.&Both}}}

AllOperations{OPERATION-PACKAGE:package} OPERATION ::=
  {ConsumerPerforms{package} | SupplierPerforms{package}}

-- continued on the next page
recode{OPERATION:operation, Code:code} OPERATION ::= {
  ARGUMENT         operation.&ArgumentType
  OPTIONAL         operation.&argumentTypeOptional
  RESULT           operation.&ResultType
  OPTIONAL         operation.&resultTypeOptional
  RETURN RESULT    operation.&returnResult
  ERRORS           {operation.&Errors}
  LINKED           {operation.&Linked}
  SYNCHRONOUS      operation.&synchronous
  ALWAYS RESPONDS  operation.&alwaysReturns
  INVOKE PRIORITY  {operation.&InvokePriority}
  RESULT-PRIORITY  {operation.&ResultPriority}
  CODE             code
}

switch{OPERATION-PACKAGE:package, OBJECT IDENTIFIER:id} OPERATION-PACKAGE ::= 
{
  OPERATIONS        {package.&Both}
  CONSUMER INVOKES  {package.&Consumer}
  SUPPLIER INVOKES  {package.&Supplier}
  ID                id
}

combine{OPERATION-PACKAGE:ConsumerConsumes, OPERATION-PACKAGE:ConsumerSupplies,
        OPERATION-PACKAGE:base} OPERATION-PACKAGE ::= {
  OPERATIONS        {ConsumerConsumes.&Both | ConsumerSupplies.&Both}
  CONSUMER INVOKES  {ConsumerConsumes.&Consumer | ConsumerSupplies.&Supplier}
  SUPPLIER INVOKES  {ConsumerConsumes.&Supplier | ConsumerSupplies.&Consumer}
  ID                base.&id
}

ROS-SingleAS{InvokeId:InvokeIdSet, OPERATION-PACKAGE:package} ::=
  ROS{{InvokeIdSet}, {AllOperations  {package}}, {AllOperations  {package}}}

ROS-ConsumerAS{InvokeId:InvokeIdSet, OPERATION-PACKAGE:package} ::=
  ROS
    {{InvokeIdSet}, {ConsumerPerforms  {package}},
    {SupplierPerforms  {package}}}

ROS-SupplierAS{InvokeId:InvokeIdSet, OPERATION-PACKAGE:package} ::=
  ROS
    {{InvokeIdSet}, {SupplierPerforms  {package}},
    {ConsumerPerforms  {package}}}

END -- end of useful definitions.
