-- Copyright (C) 1987 by Xerox Corporation.  All rights reserved.
-- Stub file  was translated on February 26, 1987 4:07:16 pm PST by Lupine of February 22, 1986 5:15:54 pm PST
-- Source interface ThParty came from file ThParty.bcd, which was created on February 26, 1987 4:07:08 pm PST with version stamp 237#325#7257256556 from source of February 26, 1987 4:06:59 pm PST.

-- The RPC stub modules for ThParty are:
--   ThPartyRpcControl.mesa;
--   ThPartyRpcClientImpl.mesa;
--   ThPartyRpcBinderImpl.mesa;
--   ThPartyRpcServerImpl.mesa.

-- The parameters for this translation are:
--   Target language = Cedar
--   Default parameter passing = VALUE
--   Deallocate server heap arguments = TRUE
--   Inline RpcServerImpl dispatcher stubs = TRUE
--   Declare signals = TRUE
--   Warn about short POINTER ("MDS") allocations = TRUE
--   Maximum number of dynamic heap NEWs = 50, MDS NEWs = 50
--   Acceptable parameter protocols = VersionRange[1..1].


DIRECTORY
  BasicTime,
  GVBasics,
  IV,
  RefID,
  RPC,
  Thrush,
  ThSmartsRpcControl,
  ThParty,
  ThPartyRpcControl USING [InterfaceRecord, InterMdsCallsOnly, LupineProtocolVersion,
      ProcedureIndex, SignalIndex],
  RPCLupine --USING SOME OF [Alloc, Call, DataLength, DeAlloc, Dispatcher,
      -- GetPkt, GetStubPkt, ImportHandle, ImportInterface, maxDataLength,
      -- maxPrincipalLength, maxShortStringLength, pktOverhead, ReceiveExtraPkt,
      -- SendPrelimPkt, StartCall, StartSignal, StubPkt, UnimportInterface]--,
  RPCLupineExtras --USING SOME OF [ImportInterfaceWithHost, noHost,
      -- RPCHost]--,
  LupineRuntime --USING SOME OF [BindingError, CheckPktLength, CopyFromPkt,
      -- CopyFromMultiplePkts, CopyToPkt, CopyToMultiplePkts, defaultZones,
      -- DispatchingError, FinishThisPkt, ListHeader, MarshalingError,
      -- MarshalingExprError, MarshalAtom, MarshalRope, NilHeader, ProtocolError,
      -- RopeHeader, RpcPktDoubleWord, RuntimeError, SequenceHeader, SHORT,
      -- StartNextPkt, StringHeader, StubPktDoubleWord, TranslationError,
      -- UnmarshalingError, UnmarshalingExprError, UnmarshalAtom, UnmarshalRope,
      -- WordsForChars]--,
  Atom --USING SOME OF [GetPName, MakeAtom]--,
  PrincOpsUtils --USING SOME OF [Enter, Exit]--,
  Rope --USING SOME OF [InlineFlatten, Length, NewText, Text]--,
  VM --USING SOME OF [AddressForPageNumber, PageCount, PageNumber,
      -- PageNumberForAddress, PagesForWords]--;


ThPartyRpcClientImpl: MONITOR
  IMPORTS RpcPrivate: RPCLupine, RpcPrivateExtras: RPCLupineExtras,
      Lupine: LupineRuntime, Atom, PrincOpsUtils, Rope
  EXPORTS ThParty, ThPartyRpcControl
  SHARES  ThParty, ThPartyRpcControl, Rope
  = BEGIN OPEN ThParty, RpcControl: ThPartyRpcControl, RpcPublic: RPC;


-- Standard remote binding routines.

  bound: BOOLEAN ← FALSE;
  myInterface: RpcPrivate.ImportHandle;
  paramZones: RpcPublic.Zones ← RpcPublic.standardZones;

  ImportInterface: PUBLIC ENTRY SAFE PROCEDURE [
        interfaceName: RpcPublic.InterfaceName,
        parameterStorage: RpcPublic.Zones,
        hostHint: RpcPrivateExtras.RPCHost←RpcPrivateExtras.noHost
            ] =
    TRUSTED BEGIN ENABLE UNWIND => NULL;
    IsNull: PROCEDURE [string: Rope.ROPE] RETURNS [BOOLEAN] =
      INLINE {RETURN[string.Length[] = 0]};
        myInterface ← RpcPrivateExtras.ImportInterfaceWithHost [
      interface: [
        type: IF ~IsNull[interfaceName.type]
          THEN interfaceName.type ELSE "ThParty~237#325#7257256556",
        instance: interfaceName.instance,
        version: interfaceName.version ],
      localOnly: RpcControl.InterMdsCallsOnly,
      stubProtocol: RpcControl.LupineProtocolVersion,
      hostHint: hostHint ];
    paramZones ← [
      gc: IF parameterStorage.gc # NIL
        THEN parameterStorage.gc ELSE Lupine.defaultZones.gc,
      heap: IF parameterStorage.heap # NIL
        THEN parameterStorage.heap ELSE Lupine.defaultZones.heap,
      mds: IF parameterStorage.mds # NIL
        THEN parameterStorage.mds ELSE Lupine.defaultZones.mds ];
    bound ← TRUE;
    END;

  UnimportInterface: PUBLIC ENTRY SAFE PROCEDURE =
    TRUSTED BEGIN ENABLE UNWIND => NULL;
    IF ~bound THEN Lupine.BindingError;
    myInterface ← RpcPrivate.UnimportInterface[myInterface];
    paramZones ← RpcPublic.standardZones;
    bound ← FALSE;
    END;



-- Remote public procedure stubs.

  CreateConversation: PUBLIC SAFE PROCEDURE [shhh: SHHH, credentials:
      Credentials, state: Thrush.StateInConv, urgency: Thrush.CallUrgency,
      alertKind: Thrush.AlertKind, reason: Thrush.Reason, comment: ROPE,
      subject: Thrush.ROPE, checkConflict: BOOL]
    RETURNS [nb: NB, convEvent: Thrush.ConvEvent] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← CreateConversation,
        credentials (1): Credentials, state (9): Thrush.StateInConv, checkConflict
        (10): BOOL];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 11;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shhh];
      argPkt↑ ← [credentials: credentials, state: state, checkConflict:
          checkConflict];
      BEGIN  -- Marshal urgency: Thrush.CallUrgency to pkt.data[pktLength].
        pktLength ← Lupine.MarshalAtom[urgency, pkt, pktLength];
        END;  -- Marshal urgency.
      BEGIN  -- Marshal alertKind: Thrush.AlertKind to pkt.data[pktLength].
        pktLength ← Lupine.MarshalAtom[alertKind, pkt, pktLength];
        END;  -- Marshal alertKind.
      BEGIN  -- Marshal reason: Thrush.Reason to pkt.data[pktLength].
        pktLength ← Lupine.MarshalAtom[reason, pkt, pktLength];
        END;  -- Marshal reason.
      BEGIN  -- Marshal comment: ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[comment, pkt, pktLength, FALSE];
        END;  -- Marshal comment.
      BEGIN  -- Marshal subject: Thrush.ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[subject, pkt, pktLength, FALSE];
        END;  -- Marshal subject.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      BEGIN  -- Unmarshal convEvent: Thrush.ConvEvent from pkt.data[pktLength].
        [convEvent, pktLength] ← UnmarshalThrushDotConvEvent[pkt, pktLength];
        END;  -- Unmarshal convEvent.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb, convEvent];
      END;  -- UNWIND.
    END;  -- CreateConversation.

  Alert: PUBLIC SAFE PROCEDURE [shhh: SHHH, credentials: Credentials,
      calledPartyID: PartyID, comment: ROPE]
    RETURNS [nb: NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← Alert, credentials
        (1): Credentials, calledPartyID (9): PartyID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 11;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shhh];
      argPkt↑ ← [credentials: credentials, calledPartyID: calledPartyID];
      BEGIN  -- Marshal comment: ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[comment, pkt, pktLength, FALSE];
        END;  -- Marshal comment.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- Alert.

  Advance: PUBLIC SAFE PROCEDURE [shhh: SHHH, credentials: Credentials,
      state: Thrush.StateInConv, reportToAll: BOOL, reason: Thrush.Reason,
      comment: ROPE, bilateral: BOOL]
    RETURNS [nb: NB, convEvent: Thrush.ConvEvent] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← Advance, credentials
        (1): Credentials, state (9): Thrush.StateInConv, reportToAll (10):
        BOOL, bilateral (11): BOOL];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 12;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shhh];
      argPkt↑ ← [credentials: credentials, state: state, reportToAll:
          reportToAll, bilateral: bilateral];
      BEGIN  -- Marshal reason: Thrush.Reason to pkt.data[pktLength].
        pktLength ← Lupine.MarshalAtom[reason, pkt, pktLength];
        END;  -- Marshal reason.
      BEGIN  -- Marshal comment: ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[comment, pkt, pktLength, FALSE];
        END;  -- Marshal comment.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      BEGIN  -- Unmarshal convEvent: Thrush.ConvEvent from pkt.data[pktLength].
        [convEvent, pktLength] ← UnmarshalThrushDotConvEvent[pkt, pktLength];
        END;  -- Unmarshal convEvent.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb, convEvent];
      END;  -- UNWIND.
    END;  -- Advance.

  ReportAction: PUBLIC SAFE PROCEDURE [shhh: SHHH, report: Thrush.ActionReport,
      reportToAll: BOOL, selfOnCompletion: BOOL]
    RETURNS [nb: NB, numReportsIssued: NAT] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← ReportAction, reportToAll
        (1): BOOL, selfOnCompletion (2): BOOL];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        numReportsIssued (0): NAT];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shhh];
      argPkt↑ ← [reportToAll: reportToAll, selfOnCompletion: selfOnCompletion];
      BEGIN  -- Marshal report: Thrush.ActionReport to pkt.data[pktLength].
        pktLength ← Lupine.CopyToPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: @report, dataLength: SIZE[Thrush.ActionReport], alwaysOnePkt:
            FALSE];
        BEGIN OPEN record: report;
        BEGIN  -- Marshal record.actionClass: ActionClass to pkt.data[pktLength].
          pktLength ← Lupine.MarshalAtom[record.actionClass, pkt, pktLength];
          END;  -- Marshal record.actionClass.
        BEGIN  -- Marshal record.actionType: ActionType to pkt.data[pktLength].
          pktLength ← Lupine.MarshalAtom[record.actionType, pkt, pktLength];
          END;  -- Marshal record.actionType.
        BEGIN  -- Marshal record.actionInfo: ROPE to pkt.data[pktLength].
          pktLength ← Lupine.MarshalRope[record.actionInfo, pkt, pktLength,
              FALSE];
          END;  -- Marshal record.actionInfo.
        END;  -- OPEN record: report.
        END;  -- Marshal report.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 1;
      BEGIN  -- OnePkt.
        -- Move statics from pkt now.
        [numReportsIssued: numReportsIssued] ← resPkt↑;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
RETURN[nb, numReportsIssued];
      END;  -- OnePkt.
      END;  -- UNWIND.
    END;  -- ReportAction.

  GetConversationInfo: PUBLIC SAFE PROCEDURE [shh: SHHH, convID: ConversationID]
      RETURNS [nb: NB, cInfo: ConversationInfo] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← GetConversationInfo,
        convID (1): ConversationID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [convID: convID];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      BEGIN  -- Unmarshal cInfo: ConversationInfo from pkt.data[pktLength].
        pktLength ← Lupine.CopyFromPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: @cInfo, dataLength: SIZE[ConversationInfo], alwaysOnePkt:
            FALSE];
        -- Restore garbled REFs to NIL following copy.
        BEGIN OPEN record: cInfo;
        LOOPHOLE[record.subject, LONG POINTER] ← NIL;
        LOOPHOLE[record.urgency, LONG POINTER] ← NIL;
        LOOPHOLE[record.alertKind, LONG POINTER] ← NIL;
        END;  -- OPEN record: cInfo.
        BEGIN OPEN record: cInfo;
        BEGIN  -- Unmarshal record.subject: ROPE from pkt.data[pktLength].
          [record.subject, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
              FALSE];
          END;  -- Unmarshal record.subject.
        BEGIN  -- Unmarshal record.urgency: Thrush.CallUrgency from
            -- pkt.data[pktLength].
          [record.urgency, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
          END;  -- Unmarshal record.urgency.
        BEGIN  -- Unmarshal record.alertKind: Thrush.AlertKind from
            -- pkt.data[pktLength].
          [record.alertKind, pktLength] ← Lupine.UnmarshalAtom[pkt,
              pktLength];
          END;  -- Unmarshal record.alertKind.
        END;  -- OPEN record: cInfo.
        END;  -- Unmarshal cInfo.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb, cInfo];
      END;  -- UNWIND.
    END;  -- GetConversationInfo.

  GetPartyInfo: PUBLIC SAFE PROCEDURE [shh: SHHH, credentials: Credentials,
      nameReq: NameReq, allParties: BOOL]
    RETURNS [nb: NB, pInfo: PartyInfo] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← GetPartyInfo, credentials
        (1): Credentials, allParties (9): BOOL];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 10;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [credentials: credentials, allParties: allParties];
      BEGIN  -- Marshal nameReq: NameReq to pkt.data[pktLength].
        pktLength ← Lupine.MarshalAtom[nameReq, pkt, pktLength];
        END;  -- Marshal nameReq.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      BEGIN  -- Unmarshal pInfo: PartyInfo from pkt.data[pktLength].
        [pInfo, pktLength] ← UnmarshalPartyInfo[pkt, pktLength];
        END;  -- Unmarshal pInfo.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb, pInfo];
      END;  -- UNWIND.
    END;  -- GetPartyInfo.

  DescribeParty: PUBLIC SAFE PROCEDURE [partyID: Thrush.PartyID, nameReq:
      NameReq] RETURNS [nb: NB, description: Thrush.ROPE, type: Thrush.PartyType,
      partner: Thrush.PartyID, visitee: Thrush.PartyID, visitors: LIST
      OF Thrush.PartyID] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← DescribeParty, partyID
        (1): Thrush.PartyID];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        partner (0): Thrush.PartyID, visitee (2): Thrush.PartyID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface];
      argPkt↑ ← [partyID: partyID];
      BEGIN  -- Marshal nameReq: NameReq to pkt.data[pktLength].
        pktLength ← Lupine.MarshalAtom[nameReq, pkt, pktLength];
        END;  -- Marshal nameReq.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 4;
      BEGIN  -- OnePkt.
        -- Move statics from pkt now.
        [partner: partner, visitee: visitee] ← resPkt↑;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      BEGIN  -- Unmarshal description: Thrush.ROPE from pkt.data[pktLength].
        [description, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
            FALSE];
        END;  -- Unmarshal description.
      BEGIN  -- Unmarshal type: Thrush.PartyType from pkt.data[pktLength].
        [type, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal type.
      BEGIN  -- Unmarshal visitors: LIST OF Thrush.PartyID from pkt.data[pktLength].
        lastNode: LIST OF Thrush.PartyID ← (visitors ← NIL);
        listLength: Lupine.ListHeader;
        IF pktLength+2 > RpcPrivate.maxDataLength
          THEN pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength:
              pktLength];
        listLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
        pktLength ← pktLength + 2;
        WHILE listLength > 0 DO
          thisNode1: LIST OF Thrush.PartyID = paramZones.gc.CONS[--DefaultValue--,NIL];
          BEGIN
          IF pktLength+2 > RpcPrivate.maxDataLength
            THEN pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength:
                pktLength];
          thisNode1.first ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
          pktLength ← pktLength + 2;
          END;
          IF lastNode # NIL
            THEN lastNode ← (lastNode.rest ← thisNode1)
            ELSE lastNode ← (visitors ← thisNode1);
          listLength ← listLength - 1;
          ENDLOOP;  -- WHILE listLength > 0.
        END;  -- Unmarshal visitors.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
RETURN[nb, description, type, partner, visitee, visitors];
      END;  -- OnePkt.
      END;  -- UNWIND.
    END;  -- DescribeParty.

  RegisterServiceInterface: PUBLIC SAFE PROCEDURE [shhh: SHHH, credentials:
      Credentials, interfaceSpecPattern: Thrush.InterfaceSpec]
    RETURNS [nb: NB, interfaceSpec: Thrush.InterfaceSpec] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← RegisterServiceInterface,
        credentials (1): Credentials];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 9;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shhh];
      argPkt↑ ← [credentials: credentials];
      BEGIN  -- Marshal interfaceSpecPattern: Thrush.InterfaceSpec
          -- to pkt.data[pktLength].
        pktLength ← Lupine.CopyToPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: @interfaceSpecPattern, dataLength: SIZE[Thrush.InterfaceSpec],
            alwaysOnePkt: TRUE];
        BEGIN OPEN record: interfaceSpecPattern;
        BEGIN  -- Marshal record.interfaceName: RPC.InterfaceName to
            -- pkt.data[pktLength].
          BEGIN OPEN record: record.interfaceName;
          BEGIN  -- Marshal record.type: ShortROPE to pkt.data[pktLength].
            pktLength ← Lupine.MarshalRope[record.type, pkt, pktLength,
                TRUE];
            END;  -- Marshal record.type.
          BEGIN  -- Marshal record.instance: ShortROPE to pkt.data[pktLength].
            pktLength ← Lupine.MarshalRope[record.instance, pkt, pktLength,
                TRUE];
            END;  -- Marshal record.instance.
          END;  -- OPEN record: record.interfaceName.
          END;  -- Marshal record.interfaceName.
        END;  -- OPEN record: interfaceSpecPattern.
        END;  -- Marshal interfaceSpecPattern.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      BEGIN  -- Unmarshal interfaceSpec: Thrush.InterfaceSpec from
          -- pkt.data[pktLength].
        pktLength ← Lupine.CopyFromPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: @interfaceSpec, dataLength: SIZE[Thrush.InterfaceSpec],
            alwaysOnePkt: FALSE];
        -- Restore garbled REFs to NIL following copy.
        BEGIN OPEN record: interfaceSpec;
        BEGIN OPEN record: record.interfaceName;
        LOOPHOLE[record.type, LONG POINTER] ← NIL;
        LOOPHOLE[record.instance, LONG POINTER] ← NIL;
        END;  -- OPEN record: record.interfaceName.
        END;  -- OPEN record: interfaceSpec.
        BEGIN OPEN record: interfaceSpec;
        BEGIN  -- Unmarshal record.interfaceName: RPC.InterfaceName
            -- from pkt.data[pktLength].
          BEGIN OPEN record: record.interfaceName;
          BEGIN  -- Unmarshal record.type: ShortROPE from pkt.data[pktLength].
            [record.type, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
                TRUE];
            END;  -- Unmarshal record.type.
          BEGIN  -- Unmarshal record.instance: ShortROPE from pkt.data[pktLength].
            [record.instance, pktLength] ← Lupine.UnmarshalRope[pkt,
                pktLength, TRUE];
            END;  -- Unmarshal record.instance.
          END;  -- OPEN record: record.interfaceName.
          END;  -- Unmarshal record.interfaceName.
        END;  -- OPEN record: interfaceSpec.
        END;  -- Unmarshal interfaceSpec.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb, interfaceSpec];
      END;  -- UNWIND.
    END;  -- RegisterServiceInterface.

  LookupServiceInterface: PUBLIC SAFE PROCEDURE [shhh: SHHH, credentials:
      Credentials, serviceParty: PartyID, type: RPC.ShortROPE]
    RETURNS [nb: NB, interfaceSpec: Thrush.InterfaceSpec] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← LookupServiceInterface,
        credentials (1): Credentials, serviceParty (9): PartyID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 11;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shhh];
      argPkt↑ ← [credentials: credentials, serviceParty: serviceParty];
      BEGIN  -- Marshal type: RPC.ShortROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[type, pkt, pktLength, TRUE];
        END;  -- Marshal type.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      BEGIN  -- Unmarshal interfaceSpec: Thrush.InterfaceSpec from
          -- pkt.data[pktLength].
        pktLength ← Lupine.CopyFromPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: @interfaceSpec, dataLength: SIZE[Thrush.InterfaceSpec],
            alwaysOnePkt: FALSE];
        -- Restore garbled REFs to NIL following copy.
        BEGIN OPEN record: interfaceSpec;
        BEGIN OPEN record: record.interfaceName;
        LOOPHOLE[record.type, LONG POINTER] ← NIL;
        LOOPHOLE[record.instance, LONG POINTER] ← NIL;
        END;  -- OPEN record: record.interfaceName.
        END;  -- OPEN record: interfaceSpec.
        BEGIN OPEN record: interfaceSpec;
        BEGIN  -- Unmarshal record.interfaceName: RPC.InterfaceName
            -- from pkt.data[pktLength].
          BEGIN OPEN record: record.interfaceName;
          BEGIN  -- Unmarshal record.type: ShortROPE from pkt.data[pktLength].
            [record.type, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
                TRUE];
            END;  -- Unmarshal record.type.
          BEGIN  -- Unmarshal record.instance: ShortROPE from pkt.data[pktLength].
            [record.instance, pktLength] ← Lupine.UnmarshalRope[pkt,
                pktLength, TRUE];
            END;  -- Unmarshal record.instance.
          END;  -- OPEN record: record.interfaceName.
          END;  -- Unmarshal record.interfaceName.
        END;  -- OPEN record: interfaceSpec.
        END;  -- Unmarshal interfaceSpec.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb, interfaceSpec];
      END;  -- UNWIND.
    END;  -- LookupServiceInterface.

  RegisterKey: PUBLIC SAFE PROCEDURE [shh: SHHH, credentials: Credentials,
      key: Thrush.EncryptionKey, reportNewKeys: BOOL]
    RETURNS [nb: NB, keyIndex: [0..15]] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← RegisterKey, credentials
        (1): Credentials, key (9): Thrush.EncryptionKey, reportNewKeys
        (13): BOOL];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        keyIndex (0): [0..15]];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 14;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [credentials: credentials, key: key, reportNewKeys:
          reportNewKeys];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 1;
      BEGIN  -- OnePkt.
        -- Move statics from pkt now.
        [keyIndex: keyIndex] ← resPkt↑;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
RETURN[nb, keyIndex];
      END;  -- OnePkt.
      END;  -- UNWIND.
    END;  -- RegisterKey.

  GetKeyTable: PUBLIC SAFE PROCEDURE [shh: SHHH, credentials: Credentials]
      RETURNS [nb: NB, keyTable: Thrush.KeyTable] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← GetKeyTable, credentials
        (1): Credentials];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 9;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [credentials: credentials];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      BEGIN  -- Unmarshal keyTable: Thrush.KeyTable from pkt.data[pktLength].
        [keyTable, pktLength] ← UnmarshalThrushDotKeyTable[pkt, pktLength];
        END;  -- Unmarshal keyTable.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb, keyTable];
      END;  -- UNWIND.
    END;  -- GetKeyTable.

  UnregisterKey: PUBLIC SAFE PROCEDURE [shh: SHHH, credentials: Credentials,
      key: Thrush.EncryptionKey]
    RETURNS [nb: NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← UnregisterKey, credentials
        (1): Credentials, key (9): Thrush.EncryptionKey];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 13;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [credentials: credentials, key: key];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- UnregisterKey.

  GetParty: PUBLIC SAFE PROCEDURE [shh: SHHH, partyID: PartyID, rName:
      ROPE, type: Thrush.PartyType]
    RETURNS [nb: NB, newPartyID: PartyID] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← GetParty, partyID
        (1): PartyID];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        newPartyID (0): PartyID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [partyID: partyID];
      BEGIN  -- Marshal rName: ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[rName, pkt, pktLength, FALSE];
        END;  -- Marshal rName.
      BEGIN  -- Marshal type: Thrush.PartyType to pkt.data[pktLength].
        pktLength ← Lupine.MarshalAtom[type, pkt, pktLength];
        END;  -- Marshal type.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 2;
      BEGIN  -- OnePkt.
        -- Move statics from pkt now.
        [newPartyID: newPartyID] ← resPkt↑;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
RETURN[nb, newPartyID];
      END;  -- OnePkt.
      END;  -- UNWIND.
    END;  -- GetParty.

  GetPartyFromNumber: PUBLIC SAFE PROCEDURE [shh: SHHH, partyID: PartyID,
      phoneNumber: Thrush.ROPE, description: ROPE]
    RETURNS [nb: NB, newPartyID: PartyID] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← GetPartyFromNumber,
        partyID (1): PartyID];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        newPartyID (0): PartyID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [partyID: partyID];
      BEGIN  -- Marshal phoneNumber: Thrush.ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[phoneNumber, pkt, pktLength,
            FALSE];
        END;  -- Marshal phoneNumber.
      BEGIN  -- Marshal description: ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[description, pkt, pktLength,
            FALSE];
        END;  -- Marshal description.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 2;
      BEGIN  -- OnePkt.
        -- Move statics from pkt now.
        [newPartyID: newPartyID] ← resPkt↑;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
RETURN[nb, newPartyID];
      END;  -- OnePkt.
      END;  -- UNWIND.
    END;  -- GetPartyFromNumber.

  GetPartyFromFeepNum: PUBLIC SAFE PROCEDURE [shh: SHHH, partyID: PartyID,
      feepNum: Thrush.ROPE]
    RETURNS [nb: NB, newPartyID: PartyID] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← GetPartyFromFeepNum,
        partyID (1): PartyID];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        newPartyID (0): PartyID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [partyID: partyID];
      BEGIN  -- Marshal feepNum: Thrush.ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[feepNum, pkt, pktLength, FALSE];
        END;  -- Marshal feepNum.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 2;
      BEGIN  -- OnePkt.
        -- Move statics from pkt now.
        [newPartyID: newPartyID] ← resPkt↑;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
RETURN[nb, newPartyID];
      END;  -- OnePkt.
      END;  -- UNWIND.
    END;  -- GetPartyFromFeepNum.

  GetCurrentParty: PUBLIC SAFE PROCEDURE [shh: SHHH, smartsID: SmartsID]
      RETURNS [nb: NB, partyID: Thrush.PartyID] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← GetCurrentParty,
        smartsID (1): SmartsID];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        partyID (0): Thrush.PartyID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [smartsID: smartsID];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 2;
      BEGIN  -- OnePkt.
        -- Move statics from pkt now.
        [partyID: partyID] ← resPkt↑;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
RETURN[nb, partyID];
      END;  -- OnePkt.
      END;  -- UNWIND.
    END;  -- GetCurrentParty.

  ReleaseParty: PUBLIC SAFE PROCEDURE [shh: SHHH, partyID: PartyID,
      targetPartyID: PartyID]
    RETURNS [nb: NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← ReleaseParty, partyID
        (1): PartyID, targetPartyID (3): PartyID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 5;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [partyID: partyID, targetPartyID: targetPartyID];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- ReleaseParty.

  GetNumbersForRName: PUBLIC SAFE PROCEDURE [shh: SHHH, rName: ROPE]
      RETURNS [fullRName: ROPE, number: ROPE, homeNumber: ROPE] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← GetNumbersForRName];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 1;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt.transferIndex ← GetNumbersForRName;
      BEGIN  -- Marshal rName: ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[rName, pkt, pktLength, FALSE];
        END;  -- Marshal rName.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal fullRName: ROPE from pkt.data[pktLength].
        [fullRName, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
            FALSE];
        END;  -- Unmarshal fullRName.
      BEGIN  -- Unmarshal number: ROPE from pkt.data[pktLength].
        [number, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
            FALSE];
        END;  -- Unmarshal number.
      BEGIN  -- Unmarshal homeNumber: ROPE from pkt.data[pktLength].
        [homeNumber, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
            FALSE];
        END;  -- Unmarshal homeNumber.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[fullRName, number, homeNumber];
      END;  -- UNWIND.
    END;  -- GetNumbersForRName.

  Register: PUBLIC SAFE PROCEDURE [shh: SHHH, rName: ROPE, type: Thrush.PartyType,
      clonePartyID: PartyID, interface: SmartsInterfaceName, properties:
      SmartsProperties]
    RETURNS [nb: NB, credentials: Credentials] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← Register, clonePartyID
        (1): PartyID];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        credentials (0): Credentials];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [clonePartyID: clonePartyID];
      BEGIN  -- Marshal rName: ROPE to pkt.data[pktLength].
        pktLength ← Lupine.MarshalRope[rName, pkt, pktLength, FALSE];
        END;  -- Marshal rName.
      BEGIN  -- Marshal type: Thrush.PartyType to pkt.data[pktLength].
        pktLength ← Lupine.MarshalAtom[type, pkt, pktLength];
        END;  -- Marshal type.
      BEGIN  -- Marshal interface: SmartsInterfaceName to pkt.data[pktLength].
        pktLength ← Lupine.CopyToPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: @interface, dataLength: SIZE[SmartsInterfaceName],
            alwaysOnePkt: FALSE];
        BEGIN OPEN record: interface;
        BEGIN  -- Marshal record.type: RPC.ShortROPE to pkt.data[pktLength].
          pktLength ← Lupine.MarshalRope[record.type, pkt, pktLength,
              TRUE];
          END;  -- Marshal record.type.
        BEGIN  -- Marshal record.instance: RPC.ShortROPE to pkt.data[pktLength].
          pktLength ← Lupine.MarshalRope[record.instance, pkt, pktLength,
              TRUE];
          END;  -- Marshal record.instance.
        END;  -- OPEN record: interface.
        END;  -- Marshal interface.
      BEGIN  -- Marshal properties: SmartsProperties to pkt.data[pktLength].
        pktLength ← Lupine.CopyToPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: @properties, dataLength: SIZE[SmartsProperties], alwaysOnePkt:
            FALSE];
        BEGIN OPEN record: properties;
        BEGIN  -- Marshal record.role: SmartsRole to pkt.data[pktLength].
          pktLength ← Lupine.MarshalAtom[record.role, pkt, pktLength];
          END;  -- Marshal record.role.
        END;  -- OPEN record: properties.
        END;  -- Marshal properties.
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 8;
      BEGIN  -- OnePkt.
        -- Move statics from pkt now.
        [credentials: credentials] ← resPkt↑;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
RETURN[nb, credentials];
      END;  -- OnePkt.
      END;  -- UNWIND.
    END;  -- Register.

  CheckIn: PUBLIC SAFE PROCEDURE [shh: SHHH, credentials: Credentials]
      RETURNS [nb: NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← CheckIn, credentials
        (1): Credentials];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 9;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [credentials: credentials];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- CheckIn.

  Deregister: PUBLIC SAFE PROCEDURE [shh: SHHH, smartsID: SmartsID]
      RETURNS [nb: NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← Deregister, smartsID
        (1): SmartsID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [smartsID: smartsID];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- Deregister.

  Enable: PUBLIC SAFE PROCEDURE [shh: SHHH, smartsID: SmartsID] RETURNS
      [nb: Thrush.NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← Enable, smartsID
        (1): SmartsID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [smartsID: smartsID];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: Thrush.NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- Enable.

  Disable: PUBLIC SAFE PROCEDURE [shh: SHHH, smartsID: SmartsID] RETURNS
      [nb: Thrush.NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← Disable, smartsID
        (1): SmartsID];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 3;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [smartsID: smartsID];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: Thrush.NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- Disable.

  Visit: PUBLIC SAFE PROCEDURE [shh: SHHH, visitedParty: PartyID, visitingParty:
      PartyID, visitingPassword: GVBasics.Password]
    RETURNS [nb: Thrush.NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← Visit, visitedParty
        (1): PartyID, visitingParty (3): PartyID, visitingPassword (5):
        GVBasics.Password];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 9;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [visitedParty: visitedParty, visitingParty: visitingParty,
          visitingPassword: visitingPassword];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: Thrush.NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- Visit.

  Unvisit: PUBLIC SAFE PROCEDURE [shh: SHHH, visitedParty: PartyID,
      visitingParty: PartyID, visitingPassword: GVBasics.Password]
    RETURNS [nb: Thrush.NB] =
    TRUSTED BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex ← Unvisit, visitedParty
        (1): PartyID, visitingParty (3): PartyID, visitingPassword (5):
        GVBasics.Password];
    pkt: RpcPrivate.RPCPkt = RpcPrivate.GetPkt[space: RpcPrivate.Alloc[RpcPrivate.pktOverhead+254]];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 9;
    lastPkt: BOOLEAN;
    BEGIN ENABLE UNWIND => RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RpcPrivate.StartCall[callPkt: pkt, interface: myInterface, localConversation:
          shh];
      argPkt↑ ← [visitedParty: visitedParty, visitingParty: visitingParty,
          visitingPassword: visitingPassword];
      [returnLength: , lastPkt: lastPkt] ←
        RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
            maxReturnLength: 254, signalHandler: ClientDispatcher];
      pktLength ← 0;
      BEGIN  -- Unmarshal nb: Thrush.NB from pkt.data[pktLength].
        [nb, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
        END;  -- Unmarshal nb.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      RpcPrivate.DeAlloc[LOOPHOLE[pkt], RpcPrivate.pktOverhead+254];
      RETURN[nb];
      END;  -- UNWIND.
    END;  -- Unvisit.


-- Remote public signals and errors.


-- Public signal and error dispatcher.

  ClientDispatcher: --PROCEDURE [pkt: RPCPkt, callLength: DataLength,
      -- lastPkt: BOOLEAN, localConversation: Conversation] RETURNS [returnLength:
      -- DataLength]-- RpcPrivate.Dispatcher =
    BEGIN

    SELECT LOOPHOLE[pkt.data[0], RpcControl.SignalIndex] FROM
      ENDCASE => RETURN[Lupine.DispatchingError[]];

    END;  -- ClientDispatcher


-- Public signal and error dispatcher stubs.


-- Marshall/Unmarshal procedures.
UnmarshalPartyInfo: PROC[pkt: RpcPrivate.RPCPkt, pktLength0: RpcPrivate.DataLength]
  RETURNS[value: ThParty.PartyInfo, pktLength: RpcPrivate.DataLength]
      = BEGIN
  pktLength ← pktLength0; {
  BEGIN  -- Unmarshal value↑: ThParty.PartyInfoSeq from pkt.data[pktLength].
    recordIsNIL: Lupine.NilHeader;
    IF pktLength+3 > RpcPrivate.maxDataLength
      THEN pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
    recordIsNIL ← pkt.data[pktLength];  pktLength ← pktLength+1;
    IF recordIsNIL
      THEN value ← NIL
      ELSE BEGIN
        seqLength: Lupine.SequenceHeader;
        seqLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
        pktLength ← pktLength + 2;
        value ← (paramZones.gc.NEW[ThParty.PartyInfoSeq[Lupine.SHORT[seqLength]]]);
        pktLength ← Lupine.CopyFromPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: LOOPHOLE[value], dataLength: SIZE[ThParty.PartyInfoSeq[LENGTH[DESCRIPTOR[value↑]]]],
            alwaysOnePkt: FALSE];
        -- Restore garbled REFs to NIL following copy.
        BEGIN OPEN record: value↑;
        BEGIN OPEN record: record.conversationInfo;
        LOOPHOLE[record.subject, LONG POINTER] ← NIL;
        LOOPHOLE[record.urgency, LONG POINTER] ← NIL;
        LOOPHOLE[record.alertKind, LONG POINTER] ← NIL;
        END;  -- OPEN record: record.conversationInfo.
        FOR element2: NAT IN [FIRST[NAT]..FIRST[NAT]+LENGTH[DESCRIPTOR[record.parties]])
            DO
          BEGIN OPEN record: record.parties[element2];
          LOOPHOLE[record.name, LONG POINTER] ← NIL;
          LOOPHOLE[record.intendedName, LONG POINTER] ← NIL;
          LOOPHOLE[record.type, LONG POINTER] ← NIL;
          END;  -- OPEN record: record.parties[element2].
          ENDLOOP;  -- FOR element2.
        END;  -- OPEN record: value↑.
        BEGIN OPEN record: value↑;
        BEGIN  -- Unmarshal record.conversationInfo: ThParty.ConversationInfo
            -- from pkt.data[pktLength].
          BEGIN OPEN record: record.conversationInfo;
          BEGIN  -- Unmarshal record.subject: ThParty.ROPE from pkt.data[pktLength].
            [record.subject, pktLength] ← Lupine.UnmarshalRope[pkt,
                pktLength, FALSE];
            END;  -- Unmarshal record.subject.
          BEGIN  -- Unmarshal record.urgency: Thrush.CallUrgency from
              -- pkt.data[pktLength].
            [record.urgency, pktLength] ← Lupine.UnmarshalAtom[pkt,
                pktLength];
            END;  -- Unmarshal record.urgency.
          BEGIN  -- Unmarshal record.alertKind: Thrush.AlertKind from
              -- pkt.data[pktLength].
            [record.alertKind, pktLength] ← Lupine.UnmarshalAtom[pkt,
                pktLength];
            END;  -- Unmarshal record.alertKind.
          END;  -- OPEN record: record.conversationInfo.
          END;  -- Unmarshal record.conversationInfo.
        BEGIN  -- Unmarshal record.parties: SEQUENCE len: NAT OF ThParty.PartyInfoSpec
            -- from pkt.data[pktLength].
          -- The sequence's length was carried by its record.
          FOR element3: NAT IN [FIRST[NAT]..FIRST[NAT]+LENGTH[DESCRIPTOR[record.parties]])
              DO
            BEGIN  -- Unmarshal record.parties[element3]: ThParty.PartyInfoSpec
                -- from pkt.data[pktLength].
              pktLength ← Lupine.CopyFromPkt[pkt: pkt, pktLength: pktLength,
                  dataAdr: @record.parties[element3], dataLength: SIZE[ThParty.PartyInfoSpec],
                  alwaysOnePkt: FALSE];
              -- Restore garbled REFs to NIL following copy.
              BEGIN OPEN record: record.parties[element3];
              LOOPHOLE[record.name, LONG POINTER] ← NIL;
              LOOPHOLE[record.intendedName, LONG POINTER] ← NIL;
              LOOPHOLE[record.type, LONG POINTER] ← NIL;
              END;  -- OPEN record: record.parties[element3].
              BEGIN OPEN record: record.parties[element3];
              BEGIN  -- Unmarshal record.name: Thrush.ROPE from pkt.data[pktLength].
                [record.name, pktLength] ← Lupine.UnmarshalRope[pkt,
                    pktLength, FALSE];
                END;  -- Unmarshal record.name.
              BEGIN  -- Unmarshal record.intendedName: Thrush.ROPE
                  -- from pkt.data[pktLength].
                [record.intendedName, pktLength] ← Lupine.UnmarshalRope[pkt,
                    pktLength, FALSE];
                END;  -- Unmarshal record.intendedName.
              BEGIN  -- Unmarshal record.type: Thrush.PartyType from
                  -- pkt.data[pktLength].
                [record.type, pktLength] ← Lupine.UnmarshalAtom[pkt,
                    pktLength];
                END;  -- Unmarshal record.type.
              END;  -- OPEN record: record.parties[element3].
              END;  -- Unmarshal record.parties[element3].
            ENDLOOP;  -- FOR element3.
          END;  -- Unmarshal record.parties.
        END;  -- OPEN record: value↑.
        END;  -- IF recordIsNIL.
    END;  -- Unmarshal value↑.
  };END;

UnmarshalThrushDotKeyTable: PROC[pkt: RpcPrivate.RPCPkt, pktLength0:
    RpcPrivate.DataLength]
  RETURNS[value: Thrush.KeyTable, pktLength: RpcPrivate.DataLength]
      = BEGIN
  pktLength ← pktLength0; {
  BEGIN  -- Unmarshal value↑: IV.KeyTableBody from pkt.data[pktLength].
    recordIsNIL: Lupine.NilHeader;
    IF pktLength+3 > RpcPrivate.maxDataLength
      THEN pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
    recordIsNIL ← pkt.data[pktLength];  pktLength ← pktLength+1;
    IF recordIsNIL
      THEN value ← NIL
      ELSE BEGIN
        seqLength: Lupine.SequenceHeader;
        seqLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
        pktLength ← pktLength + 2;
        value ← (paramZones.gc.NEW[IV.KeyTableBody[Lupine.SHORT[seqLength]]]);
        pktLength ← Lupine.CopyFromPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: LOOPHOLE[value], dataLength: SIZE[IV.KeyTableBody[LENGTH[DESCRIPTOR[value↑]]]],
            alwaysOnePkt: FALSE];
        END;  -- IF recordIsNIL.
    END;  -- Unmarshal value↑.
  };END;

UnmarshalThrushDotConvEvent: PROC[pkt: RpcPrivate.RPCPkt, pktLength0:
    RpcPrivate.DataLength]
  RETURNS[value: Thrush.ConvEvent, pktLength: RpcPrivate.DataLength]
      = BEGIN
  pktLength ← pktLength0; {
  isNIL: Lupine.NilHeader;
  IF pktLength+1 > RpcPrivate.maxDataLength
    THEN pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
  isNIL ← pkt.data[pktLength];  pktLength ← pktLength+1;
  IF isNIL
    THEN value ← NIL
    ELSE BEGIN
      value ← (paramZones.gc.NEW[Thrush.ConvEventBody]);
      BEGIN  -- Unmarshal value↑: Thrush.ConvEventBody from pkt.data[pktLength].
        pktLength ← Lupine.CopyFromPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: LOOPHOLE[value], dataLength: SIZE[Thrush.ConvEventBody],
            alwaysOnePkt: FALSE];
        -- Restore garbled REFs to NIL following copy.
        BEGIN OPEN record: value↑;
        LOOPHOLE[record.reason, LONG POINTER] ← NIL;
        LOOPHOLE[record.comment, LONG POINTER] ← NIL;
        END;  -- OPEN record: value↑.
        BEGIN OPEN record: value↑;
        BEGIN  -- Unmarshal record.reason: Thrush.Reason from pkt.data[pktLength].
          [record.reason, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
          END;  -- Unmarshal record.reason.
        BEGIN  -- Unmarshal record.comment: Thrush.ROPE from pkt.data[pktLength].
          [record.comment, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
              FALSE];
          END;  -- Unmarshal record.comment.
        END;  -- OPEN record: value↑.
        END;  -- Unmarshal value↑.
      END;  -- IF isNIL.
  };END;



-- No module initialization.

END.  -- ThPartyRpcClientImpl.