-- Copyright (C) 1986 by Xerox Corporation.  All rights reserved.
-- Stub file  was translated on April 18, 1986 12:26:10 pm PST by Lupine of May 23, 1985 8:38:08 am PDT
-- Source interface ComputeServerCallbacks came from file ComputeServerCallbacks.bcd, which was created on April 18, 1986 12:25:46 pm PST with version stamp 30#377#27632646066 from source of April 18, 1986 12:25:33 pm PST.

-- The RPC stub modules for ComputeServerCallbacks are:
--   ComputeServerCallbacksRpcControl.mesa;
--   ComputeServerCallbacksRpcClientImpl.mesa;
--   ComputeServerCallbacksRpcBinderImpl.mesa;
--   ComputeServerCallbacksRpcServerImpl.mesa.

-- The parameters for this translation are:
--   Target language = Cedar
--   Default parameter passing = VALUE
--   Deallocate server heap arguments = TRUE
--   Inline RpcServerImpl dispatcher stubs = FALSE
--   Declare signals = FALSE
--   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,
  FS,
  IO,
  Pup,
  Rope,
  RPC,
  UserCredentials,
  ComputeServerCallbacks,
  ComputeServerCallbacksRpcControl USING [InterMdsCallsOnly, LupineProtocolVersion,
      ProcedureIndex, SignalIndex],
  RPCLupine --USING SOME OF [Call, DataLength, Dispatcher, ExportHandle,
      -- ExportInterface, GetStubPkt, maxDataLength, maxPrincipalLength,
      -- maxShortStringLength, pktOverhead, ReceiveExtraPkt, SendPrelimPkt,
      -- StartCall, StartSignal, StubPkt, UnexportInterface]--,
  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]--;


ComputeServerCallbacksRpcServerImpl: MONITOR
  IMPORTS ComputeServerCallbacks, RpcPrivate: RPCLupine, Lupine: LupineRuntime,
      Atom, Rope
  EXPORTS ComputeServerCallbacksRpcControl
  SHARES  ComputeServerCallbacks, ComputeServerCallbacksRpcControl,
      Rope
  = BEGIN OPEN ComputeServerCallbacks, RpcControl: ComputeServerCallbacksRpcControl,
      RpcPublic: RPC;


-- Standard remote binding routines.

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

  ExportInterface: PUBLIC ENTRY SAFE PROCEDURE [
        interfaceName: RpcPublic.InterfaceName,
        user: RpcPublic.Principal,
        password: RpcPublic.EncryptionKey,
        parameterStorage: RpcPublic.Zones ] =
    TRUSTED BEGIN ENABLE UNWIND => NULL;
    IsNull: PROCEDURE [string: Rope.ROPE] RETURNS [BOOLEAN] =
      INLINE {RETURN[string.Length[] = 0]};
    IF bound THEN Lupine.BindingError;
    myInterface ← RpcPrivate.ExportInterface [
      interface: [
        type: IF ~IsNull[interfaceName.type]
          THEN interfaceName.type ELSE "ComputeServerCallbacks~30#377#27632646066",
        instance: interfaceName.instance,
        version: interfaceName.version ],
      user: user,  password: password,
      dispatcher: ServerDispatcher,
      localOnly: RpcControl.InterMdsCallsOnly,
      stubProtocol: RpcControl.LupineProtocolVersion ];
    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;

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


-- Public procedure dispatcher and public signal and error catcher.

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

    -- Catch public signals.

      ENABLE BEGIN

      Error --ERROR [error: FS.ErrorDesc]-- =>
        BEGIN
        ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
            transferIndex (0): RpcControl.SignalIndex ← Error];
        argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
        pktLength: RpcPrivate.DataLength ← 1;
        lastPkt: BOOLEAN;
        RpcPrivate.StartSignal[signalPkt: pkt];
        argPkt.transferIndex ← Error;
        BEGIN  -- Marshal error: FS.ErrorDesc to pkt.data[pktLength].
          pktLength ← Lupine.CopyToPkt[pkt: pkt, pktLength: pktLength,
              dataAdr: @error, dataLength: SIZE[FS.ErrorDesc], alwaysOnePkt:
              FALSE];
          BEGIN OPEN record: error;
          BEGIN  -- Marshal record.code: ATOM to pkt.data[pktLength].
            pktLength ← Lupine.MarshalAtom[record.code, pkt, pktLength];
            END;  -- Marshal record.code.
          BEGIN  -- Marshal record.explanation: ROPE to pkt.data[pktLength].
            pktLength ← Lupine.MarshalRope[record.explanation, pkt,
                pktLength, FALSE];
            END;  -- Marshal record.explanation.
          END;  -- OPEN record: error.
          END;  -- Marshal error.
        [returnLength: , lastPkt: lastPkt] ←
          RpcPrivate.Call[ pkt: pkt, callLength: pktLength,
              maxReturnLength: 0];
        Lupine.RuntimeError;  -- Impossible to RESUME an ERROR.
        END;  -- Error.

      END;  -- Catch public signals.


    -- Call public procedures (still in dispatcher).

    SELECT LOOPHOLE[pkt.data[0], RpcControl.ProcedureIndex] FROM
      rGeneric => RETURN[
        rGenericStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rSetDefaultWDir => RETURN[
        rSetDefaultWDirStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      rGetDefaultWDir => RETURN[
        rGetDefaultWDirStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      rExpandName => RETURN[
        rExpandNameStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      rFileInfo => RETURN[
        rFileInfoStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rStartEnumerateForInfo => RETURN[
        rStartEnumerateForInfoStub[pkt: pkt, callLength: callLength,
            lastPkt: lastPkt, localConversation: localConversation]];
      rNextEnumerateForInfo => RETURN[
        rNextEnumerateForInfoStub[pkt: pkt, callLength: callLength,
            lastPkt: lastPkt, localConversation: localConversation]];
      rStartEnumerateForNames => RETURN[
        rStartEnumerateForNamesStub[pkt: pkt, callLength: callLength,
            lastPkt: lastPkt, localConversation: localConversation]];
      rNextEnumerateForNames => RETURN[
        rNextEnumerateForNamesStub[pkt: pkt, callLength: callLength,
            lastPkt: lastPkt, localConversation: localConversation]];
      rDoneEnumerate => RETURN[
        rDoneEnumerateStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      rOpen => RETURN[
        rOpenStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rCreate => RETURN[
        rCreateStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rOpenOrCreate => RETURN[
        rOpenOrCreateStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      rGetClass => RETURN[
        rGetClassStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rSameFile => RETURN[
        rSameFileStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rGetName => RETURN[
        rGetNameStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rGetInfo => RETURN[
        rGetInfoStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rSetPageCount => RETURN[
        rSetPageCountStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      rSetByteCountAndCreatedTime => RETURN[
        rSetByteCountAndCreatedTimeStub[pkt: pkt, callLength: callLength,
            lastPkt: lastPkt, localConversation: localConversation]];
      rRead => RETURN[
        rReadStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rWrite => RETURN[
        rWriteStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rClose => RETURN[
        rCloseStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rCopy => RETURN[
        rCopyStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rDelete => RETURN[
        rDeleteStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rRename => RETURN[
        rRenameStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rSetKeep => RETURN[
        rSetKeepStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rBoolean => RETURN[
        rBooleanStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rNumber => RETURN[
        rNumberStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rToken => RETURN[
        rTokenStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rListOfTokens => RETURN[
        rListOfTokensStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      rLine => RETURN[
        rLineStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rGetProfileName => RETURN[
        rGetProfileNameStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      rGetState => RETURN[
        rGetStateStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      rGet => RETURN[
        rGetStub[pkt: pkt, callLength: callLength, lastPkt: lastPkt,
            localConversation: localConversation]];
      OpenDebugStream => RETURN[
        OpenDebugStreamStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      OpenSourceViewer => RETURN[
        OpenSourceViewerStub[pkt: pkt, callLength: callLength, lastPkt:
            lastPkt, localConversation: localConversation]];
      ENDCASE => RETURN[Lupine.DispatchingError[]];

    END;  -- ServerDispatcher


-- Public procedure dispatcher stubs.

  rGenericStub: --PROCEDURE [requestCode: ATOM, requestString: ROPE]
      -- RETURNS [resultCode: ATOM, resultString: ROPE]-- RpcPrivate.Dispatcher
      =
    BEGIN
    requestCode: ATOM;
    requestString: ROPE;
    resultCode: ATOM;
    resultString: ROPE;
    pktLength: RpcPrivate.DataLength ← 1;
    BEGIN  -- Unmarshal requestCode: ATOM from pkt.data[pktLength].
      [requestCode, pktLength] ← Lupine.UnmarshalAtom[pkt, pktLength];
      END;  -- Unmarshal requestCode.
    BEGIN  -- Unmarshal requestString: ROPE from pkt.data[pktLength].
      [requestString, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
          FALSE];
      END;  -- Unmarshal requestString.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    [resultCode, resultString] ←
      rGeneric[requestCode, requestString];
    pktLength ← 0;
    BEGIN  -- Marshal resultCode: ATOM to pkt.data[pktLength].
      pktLength ← Lupine.MarshalAtom[resultCode, pkt, pktLength];
      END;  -- Marshal resultCode.
    BEGIN  -- Marshal resultString: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[resultString, pkt, pktLength,
          FALSE];
      END;  -- Marshal resultString.
    RETURN[returnLength: pktLength];
    END;  -- rGenericStub.

  rSetDefaultWDirStub: --PROCEDURE [dir: RPC.ShortROPE]-- RpcPrivate.Dispatcher
      =
    BEGIN
    dir: RPC.ShortROPE;
    pktLength: RpcPrivate.DataLength ← 1;
    BEGIN  -- Unmarshal dir: RPC.ShortROPE from pkt.data[pktLength].
      [dir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal dir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    rSetDefaultWDir[dir];
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- rSetDefaultWDirStub.

  rGetDefaultWDirStub: --PROCEDURE RETURNS [anonP1id3742549: RPC.ShortROPE]--
      RpcPrivate.Dispatcher =
    BEGIN
    anonP1id3742549: RPC.ShortROPE;
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 1];
    [anonP1id3742549] ← rGetDefaultWDir[];
    pktLength ← 0;
    BEGIN  -- Marshal anonP1id3742549: RPC.ShortROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[anonP1id3742549, pkt, pktLength,
          TRUE];
      END;  -- Marshal anonP1id3742549.
    RETURN[returnLength: pktLength];
    END;  -- rGetDefaultWDirStub.

  rExpandNameStub: --PROCEDURE [name: ROPE, wDir: RPC.ShortROPE] RETURNS
      -- [fullFName: ROPE, cp: FS.ComponentPositions, dirOmitted: BOOLEAN]--
      RpcPrivate.Dispatcher =
    BEGIN
    name: ROPE;
    wDir: RPC.ShortROPE;
    fullFName: ROPE;
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        cp (0): FS.ComponentPositions, dirOmitted (12): BOOLEAN];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 1;
    BEGIN  -- Unmarshal name: ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    [fullFName, resPkt.cp, resPkt.dirOmitted] ←
      rExpandName[name, wDir];
    pktLength ← 13;
    BEGIN  -- Marshal fullFName: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[fullFName, pkt, pktLength, FALSE];
      END;  -- Marshal fullFName.
    RETURN[returnLength: pktLength];
    END;  -- rExpandNameStub.

  rFileInfoStub: --PROCEDURE [name: ROPE, wantedCreatedTime: BasicTime.GMT,
      -- remoteCheck: BOOLEAN, wDir: RPC.ShortROPE]
    -- RETURNS [fullFName: ROPE, attachedTo: ROPE, keep: CARDINAL,
        -- bytes: INT, created: BasicTime.GMT]-- RpcPrivate.Dispatcher
        =
    BEGIN
    name: ROPE;
    wantedCreatedTime: BasicTime.GMT;
    remoteCheck: BOOLEAN;
    wDir: RPC.ShortROPE;
    fullFName: ROPE;
    attachedTo: ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, wantedCreatedTime
        (1): BasicTime.GMT, remoteCheck (3): BOOLEAN];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        keep (0): CARDINAL, bytes (1): INT, created (3): BasicTime.GMT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 4;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [wantedCreatedTime: wantedCreatedTime, remoteCheck: remoteCheck]
          ← argPkt↑;
      END;
    BEGIN  -- Unmarshal name: ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [fullFName, attachedTo, resPkt.keep, resPkt.bytes, resPkt.created]
          ←
          rFileInfo[name, argPkt.wantedCreatedTime, argPkt.remoteCheck,
              wDir]
      ELSE [fullFName, attachedTo, resPkt.keep, resPkt.bytes, resPkt.created]
          ←
          rFileInfo[name, wantedCreatedTime, remoteCheck, wDir];
    END;  -- OnePkt.
    pktLength ← 5;
    BEGIN  -- Marshal fullFName: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[fullFName, pkt, pktLength, FALSE];
      END;  -- Marshal fullFName.
    BEGIN  -- Marshal attachedTo: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[attachedTo, pkt, pktLength, FALSE];
      END;  -- Marshal attachedTo.
    RETURN[returnLength: pktLength];
    END;  -- rFileInfoStub.

  rStartEnumerateForInfoStub: --PROCEDURE [listenerPupAddress: Pup.Address,
      -- pattern: ROPE, wDir: RPC.ShortROPE]
    -- RETURNS [fullFName: ROPE, attachedTo: ROPE, created: BasicTime.GMT,
        -- bytes: INT, keep: CARDINAL, continue: BOOLEAN]-- RpcPrivate.Dispatcher
        =
    BEGIN
    listenerPupAddress: Pup.Address;
    pattern: ROPE;
    wDir: RPC.ShortROPE;
    fullFName: ROPE;
    attachedTo: ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        created (0): BasicTime.GMT, bytes (2): INT, keep (4): CARDINAL,
        continue (5): BOOLEAN];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 4;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal pattern: ROPE from pkt.data[pktLength].
      [pattern, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal pattern.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [fullFName, attachedTo, resPkt.created, resPkt.bytes, resPkt.keep,
          resPkt.continue] ←
          rStartEnumerateForInfo[argPkt.listenerPupAddress, pattern,
              wDir]
      ELSE [fullFName, attachedTo, resPkt.created, resPkt.bytes, resPkt.keep,
          resPkt.continue] ←
          rStartEnumerateForInfo[listenerPupAddress, pattern, wDir];
    END;  -- OnePkt.
    pktLength ← 6;
    BEGIN  -- Marshal fullFName: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[fullFName, pkt, pktLength, FALSE];
      END;  -- Marshal fullFName.
    BEGIN  -- Marshal attachedTo: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[attachedTo, pkt, pktLength, FALSE];
      END;  -- Marshal attachedTo.
    RETURN[returnLength: pktLength];
    END;  -- rStartEnumerateForInfoStub.

  rNextEnumerateForInfoStub: --PROCEDURE [listenerPupAddress: Pup.Address]
      -- RETURNS [fullFName: ROPE, attachedTo: ROPE, created: BasicTime.GMT,
      -- bytes: INT, keep: CARDINAL, continue: BOOLEAN]-- RpcPrivate.Dispatcher
      =
    BEGIN
    fullFName: ROPE;
    attachedTo: ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        created (0): BasicTime.GMT, bytes (2): INT, keep (4): CARDINAL,
        continue (5): BOOLEAN];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 4];
    [fullFName, attachedTo, resPkt.created, resPkt.bytes, resPkt.keep,
        resPkt.continue] ←
      rNextEnumerateForInfo[argPkt.listenerPupAddress];
    pktLength ← 6;
    BEGIN  -- Marshal fullFName: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[fullFName, pkt, pktLength, FALSE];
      END;  -- Marshal fullFName.
    BEGIN  -- Marshal attachedTo: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[attachedTo, pkt, pktLength, FALSE];
      END;  -- Marshal attachedTo.
    RETURN[returnLength: pktLength];
    END;  -- rNextEnumerateForInfoStub.

  rStartEnumerateForNamesStub: --PROCEDURE [listenerPupAddress: Pup.Address,
      -- pattern: ROPE, wDir: RPC.ShortROPE]
    -- RETURNS [fullFName: ROPE, continue: BOOLEAN]-- RpcPrivate.Dispatcher
        =
    BEGIN
    listenerPupAddress: Pup.Address;
    pattern: ROPE;
    wDir: RPC.ShortROPE;
    fullFName: ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        continue (0): BOOLEAN];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 4;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal pattern: ROPE from pkt.data[pktLength].
      [pattern, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal pattern.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [fullFName, resPkt.continue] ←
          rStartEnumerateForNames[argPkt.listenerPupAddress, pattern,
              wDir]
      ELSE [fullFName, resPkt.continue] ←
          rStartEnumerateForNames[listenerPupAddress, pattern, wDir];
    END;  -- OnePkt.
    pktLength ← 1;
    BEGIN  -- Marshal fullFName: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[fullFName, pkt, pktLength, FALSE];
      END;  -- Marshal fullFName.
    RETURN[returnLength: pktLength];
    END;  -- rStartEnumerateForNamesStub.

  rNextEnumerateForNamesStub: --PROCEDURE [listenerPupAddress: Pup.Address]
      -- RETURNS [fullFName: ROPE, continue: BOOLEAN]-- RpcPrivate.Dispatcher
      =
    BEGIN
    fullFName: ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        continue (0): BOOLEAN];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 4];
    [fullFName, resPkt.continue] ←
      rNextEnumerateForNames[argPkt.listenerPupAddress];
    pktLength ← 1;
    BEGIN  -- Marshal fullFName: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[fullFName, pkt, pktLength, FALSE];
      END;  -- Marshal fullFName.
    RETURN[returnLength: pktLength];
    END;  -- rNextEnumerateForNamesStub.

  rDoneEnumerateStub: --PROCEDURE [listenerPupAddress: Pup.Address]--
      RpcPrivate.Dispatcher =
    BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 4];
    rDoneEnumerate[argPkt.listenerPupAddress];
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- rDoneEnumerateStub.

  rOpenStub: --PROCEDURE [listenerPupAddress: Pup.Address, name: ROPE,
      -- lock: FS.Lock, wantedCreatedTime: BasicTime.GMT, remoteCheck:
      -- BOOLEAN, wDir: RPC.ShortROPE, forceRemoteOpen: BOOL]
    -- RETURNS [globalNameToOpen: ROPE, openFile: OpenFile]-- RpcPrivate.Dispatcher
        =
    BEGIN
    listenerPupAddress: Pup.Address;
    name: ROPE;
    lock: FS.Lock;
    wantedCreatedTime: BasicTime.GMT;
    remoteCheck: BOOLEAN;
    wDir: RPC.ShortROPE;
    forceRemoteOpen: BOOL;
    globalNameToOpen: ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, lock (4): FS.Lock, wantedCreatedTime (5): BasicTime.GMT,
        remoteCheck (7): BOOLEAN, forceRemoteOpen (8): BOOL];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        openFile (0): OpenFile];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 9;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, lock: lock, wantedCreatedTime:
          wantedCreatedTime, remoteCheck: remoteCheck, forceRemoteOpen:
          forceRemoteOpen] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal name: ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [globalNameToOpen, resPkt.openFile] ←
          rOpen[argPkt.listenerPupAddress, name, argPkt.lock, argPkt.wantedCreatedTime,
              argPkt.remoteCheck, wDir, argPkt.forceRemoteOpen]
      ELSE [globalNameToOpen, resPkt.openFile] ←
          rOpen[listenerPupAddress, name, lock, wantedCreatedTime,
              remoteCheck, wDir, forceRemoteOpen];
    END;  -- OnePkt.
    pktLength ← 2;
    BEGIN  -- Marshal globalNameToOpen: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[globalNameToOpen, pkt, pktLength,
          FALSE];
      END;  -- Marshal globalNameToOpen.
    RETURN[returnLength: pktLength];
    END;  -- rOpenStub.

  rCreateStub: --PROCEDURE [listenerPupAddress: Pup.Address, name:
      -- ROPE, setPages: BOOLEAN, pages: INT, setKeep: BOOLEAN, keep: CARDINAL,
      -- wDir: RPC.ShortROPE]
    -- RETURNS [anonP1id3742907: OpenFile]-- RpcPrivate.Dispatcher
        =
    BEGIN
    listenerPupAddress: Pup.Address;
    name: ROPE;
    setPages: BOOLEAN;
    pages: INT;
    setKeep: BOOLEAN;
    keep: CARDINAL;
    wDir: RPC.ShortROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, setPages (4): BOOLEAN, pages (5): INT, setKeep
        (7): BOOLEAN, keep (8): CARDINAL];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        anonP1id3742907 (0): OpenFile];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 9;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, setPages: setPages,
          pages: pages, setKeep: setKeep, keep: keep] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal name: ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [resPkt.anonP1id3742907] ← rCreate[argPkt.listenerPupAddress,
          name, argPkt.setPages, argPkt.pages, argPkt.setKeep, argPkt.keep,
          wDir]
      ELSE [resPkt.anonP1id3742907] ← rCreate[listenerPupAddress, name,
          setPages, pages, setKeep, keep, wDir];
    END;  -- OnePkt.
    pktLength ← 2;
    RETURN[returnLength: pktLength];
    END;  -- rCreateStub.

  rOpenOrCreateStub: --PROCEDURE [listenerPupAddress: Pup.Address,
      -- name: ROPE, keep: CARDINAL, pages: INT, wDir: RPC.ShortROPE]
    -- RETURNS [anonP1id3742946: OpenFile]-- RpcPrivate.Dispatcher
        =
    BEGIN
    listenerPupAddress: Pup.Address;
    name: ROPE;
    keep: CARDINAL;
    pages: INT;
    wDir: RPC.ShortROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, keep (4): CARDINAL, pages (5): INT];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        anonP1id3742946 (0): OpenFile];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 7;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, keep: keep, pages: pages]
          ← argPkt↑;
      END;
    BEGIN  -- Unmarshal name: ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [resPkt.anonP1id3742946] ← rOpenOrCreate[argPkt.listenerPupAddress,
          name, argPkt.keep, argPkt.pages, wDir]
      ELSE [resPkt.anonP1id3742946] ← rOpenOrCreate[listenerPupAddress,
          name, keep, pages, wDir];
    END;  -- OnePkt.
    pktLength ← 2;
    RETURN[returnLength: pktLength];
    END;  -- rOpenOrCreateStub.

  rGetClassStub: --PROCEDURE [listenerPupAddress: Pup.Address, file:
      -- OpenFile] RETURNS [anonP1id3742970: ATOM]-- RpcPrivate.Dispatcher
      =
    BEGIN
    anonP1id3742970: ATOM;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file (4): OpenFile];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 6];
    [anonP1id3742970] ← rGetClass[argPkt.listenerPupAddress, argPkt.file];
    pktLength ← 0;
    BEGIN  -- Marshal anonP1id3742970: ATOM to pkt.data[pktLength].
      pktLength ← Lupine.MarshalAtom[anonP1id3742970, pkt, pktLength];
      END;  -- Marshal anonP1id3742970.
    RETURN[returnLength: pktLength];
    END;  -- rGetClassStub.

  rSameFileStub: --PROCEDURE [listenerPupAddress: Pup.Address, file1:
      -- OpenFile, file2: OpenFile]
    -- RETURNS [anonP1id3742999: BOOLEAN]-- RpcPrivate.Dispatcher =
    BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file1 (4): OpenFile, file2 (6): OpenFile];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        anonP1id3742999 (0): BOOLEAN];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 8];
    [resPkt.anonP1id3742999] ← rSameFile[argPkt.listenerPupAddress,
        argPkt.file1, argPkt.file2];
    pktLength ← 1;
    RETURN[returnLength: pktLength];
    END;  -- rSameFileStub.

  rGetNameStub: --PROCEDURE [listenerPupAddress: Pup.Address, file:
      -- OpenFile] RETURNS [fullFName: ROPE, attachedTo: ROPE]-- RpcPrivate.Dispatcher
      =
    BEGIN
    fullFName: ROPE;
    attachedTo: ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file (4): OpenFile];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 6];
    [fullFName, attachedTo] ←
      rGetName[argPkt.listenerPupAddress, argPkt.file];
    pktLength ← 0;
    BEGIN  -- Marshal fullFName: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[fullFName, pkt, pktLength, FALSE];
      END;  -- Marshal fullFName.
    BEGIN  -- Marshal attachedTo: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[attachedTo, pkt, pktLength, FALSE];
      END;  -- Marshal attachedTo.
    RETURN[returnLength: pktLength];
    END;  -- rGetNameStub.

  rGetInfoStub: --PROCEDURE [listenerPupAddress: Pup.Address, file:
      -- OpenFile] RETURNS [keep: CARDINAL, pages: INT, bytes: INT, created:
      -- BasicTime.GMT, lock: FS.Lock]-- RpcPrivate.Dispatcher =
    BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file (4): OpenFile];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        keep (0): CARDINAL, pages (1): INT, bytes (3): INT, created (5):
        BasicTime.GMT, lock (7): FS.Lock];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 6];
    [resPkt.keep, resPkt.pages, resPkt.bytes, resPkt.created, resPkt.lock]
        ←
      rGetInfo[argPkt.listenerPupAddress, argPkt.file];
    pktLength ← 8;
    RETURN[returnLength: pktLength];
    END;  -- rGetInfoStub.

  rSetPageCountStub: --PROCEDURE [listenerPupAddress: Pup.Address,
      -- file: OpenFile, pages: INT]-- RpcPrivate.Dispatcher =
    BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file (4): OpenFile, pages (6): INT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 8];
    rSetPageCount[argPkt.listenerPupAddress, argPkt.file, argPkt.pages];
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- rSetPageCountStub.

  rSetByteCountAndCreatedTimeStub: --PROCEDURE [listenerPupAddress:
      -- Pup.Address, file: OpenFile, bytes: INT, created: BasicTime.GMT]--
      RpcPrivate.Dispatcher =
    BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file (4): OpenFile, bytes (6): INT, created (8):
        BasicTime.GMT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 10];
    rSetByteCountAndCreatedTime[argPkt.listenerPupAddress, argPkt.file,
        argPkt.bytes, argPkt.created];
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- rSetByteCountAndCreatedTimeStub.

  rReadStub: --PROCEDURE [listenerPupAddress: Pup.Address, file: OpenFile,
      -- from: INT, nPages: INT, pageBuffer: RESULTPageBuffer]-- RpcPrivate.Dispatcher
      =
    BEGIN
    pageBuffer: RESULTPageBuffer;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file (4): OpenFile, from (6): INT, nPages (8):
        INT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 10;
    MaxHeapAllocs: CARDINAL = 1;
    heapAllocVector: ARRAY [1..MaxHeapAllocs] OF LONG POINTER←ALL[NIL];
    BEGIN ENABLE UNWIND => BEGIN  -- Free storage.
        FOR ptr: CARDINAL IN [1..LENGTH[heapAllocVector]] DO
          IF heapAllocVector[ptr] = NIL THEN EXIT;
          paramZones.heap.FREE[@heapAllocVector[ptr]];
          ENDLOOP;
        END;  -- Free storage.
      BEGIN  -- Unmarshal pageBuffer: RESULTPageBuffer from pkt.data[pktLength].
        DescriptorType: TYPE = RECORD [SEQUENCE COMPUTED CARDINAL OF
            WORD];
        descLength: Lupine.SequenceHeader;
        descLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
        pktLength ← pktLength + 2;
        pageBuffer ← DESCRIPTOR[
          (heapAllocVector[1] ← paramZones.heap.NEW[DescriptorType[Lupine.SHORT[descLength]]]),
          Lupine.SHORT[descLength]];
        NULL;  -- Call by result, use uninitialized descriptor.
        END;  -- Unmarshal pageBuffer.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      rRead[argPkt.listenerPupAddress, argPkt.file, argPkt.from, argPkt.nPages,
          pageBuffer];
      pktLength ← 0;
      BEGIN  -- Marshal pageBuffer: RESULTPageBuffer to pkt.data[pktLength].
        IF pktLength+2 > RpcPrivate.maxDataLength
          THEN pktLength ← Lupine.StartNextPkt[pkt: pkt, pktLength:
              pktLength];
        Lupine.RpcPktDoubleWord[pkt, pktLength]↑ ← (IF BASE[pageBuffer]=NIL
            THEN 0 ELSE LENGTH[pageBuffer]);
        pktLength ← pktLength + 2;
        IF BASE[pageBuffer] # NIL THEN
          pktLength ← Lupine.CopyToPkt[pkt: pkt, pktLength: pktLength,
              dataAdr: BASE[pageBuffer], dataLength: SIZE[WORD]*LENGTH[pageBuffer],
              alwaysOnePkt: FALSE];
        END;  -- Marshal pageBuffer.
      END;  -- ENABLE UNWIND => Free storage.
    FOR ptr: CARDINAL IN [1..LENGTH[heapAllocVector]] DO
      IF heapAllocVector[ptr] = NIL THEN EXIT;
      paramZones.heap.FREE[@heapAllocVector[ptr]];
      ENDLOOP;
    RETURN[returnLength: pktLength];
    END;  -- rReadStub.

  rWriteStub: --PROCEDURE [listenerPupAddress: Pup.Address, file: OpenFile,
      -- to: INT, nPages: INT, pageBuffer: VALUEPageBuffer]-- RpcPrivate.Dispatcher
      =
    BEGIN
    listenerPupAddress: Pup.Address;
    file: OpenFile;
    to: INT;
    nPages: INT;
    pageBuffer: VALUEPageBuffer;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file (4): OpenFile, to (6): INT, nPages (8):
        INT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 10;
    MaxHeapAllocs: CARDINAL = 1;
    heapAllocVector: ARRAY [1..MaxHeapAllocs] OF LONG POINTER←ALL[NIL];
    BEGIN ENABLE UNWIND => BEGIN  -- Free storage.
        FOR ptr: CARDINAL IN [1..LENGTH[heapAllocVector]] DO
          IF heapAllocVector[ptr] = NIL THEN EXIT;
          paramZones.heap.FREE[@heapAllocVector[ptr]];
          ENDLOOP;
        END;  -- Free storage.
      BEGIN  -- OnePkt.
      onePkt: BOOLEAN = lastPkt;
      IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
        [listenerPupAddress: listenerPupAddress, file: file, to: to,
            nPages: nPages] ← argPkt↑;
        END;
      BEGIN  -- Unmarshal pageBuffer: VALUEPageBuffer from pkt.data[pktLength].
        DescriptorType: TYPE = RECORD [SEQUENCE COMPUTED CARDINAL OF
            WORD];
        descLength: Lupine.SequenceHeader;
        IF pktLength+2 > RpcPrivate.maxDataLength
          THEN pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength:
              pktLength];
        descLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
        pktLength ← pktLength + 2;
        pageBuffer ← DESCRIPTOR[
          (heapAllocVector[1] ← paramZones.heap.NEW[DescriptorType[Lupine.SHORT[descLength]]]),
          Lupine.SHORT[descLength]];
        pktLength ← Lupine.CopyFromPkt[pkt: pkt, pktLength: pktLength,
            dataAdr: BASE[pageBuffer], dataLength: SIZE[WORD]*LENGTH[pageBuffer],
            alwaysOnePkt: FALSE];
        END;  -- Unmarshal pageBuffer.
      Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
      IF onePkt
        THEN rWrite[argPkt.listenerPupAddress, argPkt.file, argPkt.to,
            argPkt.nPages, pageBuffer]
        ELSE rWrite[listenerPupAddress, file, to, nPages, pageBuffer];
      END;  -- OnePkt.
      pktLength ← 0;
      END;  -- ENABLE UNWIND => Free storage.
    FOR ptr: CARDINAL IN [1..LENGTH[heapAllocVector]] DO
      IF heapAllocVector[ptr] = NIL THEN EXIT;
      paramZones.heap.FREE[@heapAllocVector[ptr]];
      ENDLOOP;
    RETURN[returnLength: pktLength];
    END;  -- rWriteStub.

  rCloseStub: --PROCEDURE [listenerPupAddress: Pup.Address, file: OpenFile]--
      RpcPrivate.Dispatcher =
    BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, file (4): OpenFile];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 6];
    rClose[argPkt.listenerPupAddress, argPkt.file];
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- rCloseStub.

  rCopyStub: --PROCEDURE [listenerPupAddress: Pup.Address, from: ROPE,
      -- to: ROPE, setKeep: BOOLEAN, keep: CARDINAL, wantedCreatedTime:
      -- BasicTime.GMT, remoteCheck: BOOLEAN, attach: BOOLEAN, wDir: RPC.ShortROPE]
    -- RETURNS [toFName: ROPE]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    from: ROPE;
    to: ROPE;
    setKeep: BOOLEAN;
    keep: CARDINAL;
    wantedCreatedTime: BasicTime.GMT;
    remoteCheck: BOOLEAN;
    attach: BOOLEAN;
    wDir: RPC.ShortROPE;
    toFName: ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, setKeep (4): BOOLEAN, keep (5): CARDINAL, wantedCreatedTime
        (6): BasicTime.GMT, remoteCheck (8): BOOLEAN, attach (9): BOOLEAN];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 10;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, setKeep: setKeep, keep:
          keep, wantedCreatedTime: wantedCreatedTime, remoteCheck: remoteCheck,
          attach: attach] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal from: ROPE from pkt.data[pktLength].
      [from, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal from.
    BEGIN  -- Unmarshal to: ROPE from pkt.data[pktLength].
      [to, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal to.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    IF onePkt
      THEN [toFName] ← rCopy[argPkt.listenerPupAddress, from, to, argPkt.setKeep,
          argPkt.keep, argPkt.wantedCreatedTime, argPkt.remoteCheck, argPkt.attach,
          wDir]
      ELSE [toFName] ← rCopy[listenerPupAddress, from, to, setKeep,
          keep, wantedCreatedTime, remoteCheck, attach, wDir];
    END;  -- OnePkt.
    pktLength ← 0;
    BEGIN  -- Marshal toFName: ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[toFName, pkt, pktLength, FALSE];
      END;  -- Marshal toFName.
    RETURN[returnLength: pktLength];
    END;  -- rCopyStub.

  rDeleteStub: --PROCEDURE [listenerPupAddress: Pup.Address, name:
      -- ROPE, wantedCreatedTime: BasicTime.GMT, wDir: RPC.ShortROPE]--
      RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    name: ROPE;
    wantedCreatedTime: BasicTime.GMT;
    wDir: RPC.ShortROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, wantedCreatedTime (4): BasicTime.GMT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 6;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, wantedCreatedTime: wantedCreatedTime]
          ← argPkt↑;
      END;
    BEGIN  -- Unmarshal name: ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    IF onePkt
      THEN rDelete[argPkt.listenerPupAddress, name, argPkt.wantedCreatedTime,
          wDir]
      ELSE rDelete[listenerPupAddress, name, wantedCreatedTime, wDir];
    END;  -- OnePkt.
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- rDeleteStub.

  rRenameStub: --PROCEDURE [listenerPupAddress: Pup.Address, from:
      -- ROPE, to: ROPE, setKeep: BOOLEAN, keep: CARDINAL, wantedCreatedTime:
      -- BasicTime.GMT, wDir: RPC.ShortROPE]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    from: ROPE;
    to: ROPE;
    setKeep: BOOLEAN;
    keep: CARDINAL;
    wantedCreatedTime: BasicTime.GMT;
    wDir: RPC.ShortROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, setKeep (4): BOOLEAN, keep (5): CARDINAL, wantedCreatedTime
        (6): BasicTime.GMT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 8;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, setKeep: setKeep, keep:
          keep, wantedCreatedTime: wantedCreatedTime] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal from: ROPE from pkt.data[pktLength].
      [from, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal from.
    BEGIN  -- Unmarshal to: ROPE from pkt.data[pktLength].
      [to, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal to.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    IF onePkt
      THEN rRename[argPkt.listenerPupAddress, from, to, argPkt.setKeep,
          argPkt.keep, argPkt.wantedCreatedTime, wDir]
      ELSE rRename[listenerPupAddress, from, to, setKeep, keep, wantedCreatedTime,
          wDir];
    END;  -- OnePkt.
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- rRenameStub.

  rSetKeepStub: --PROCEDURE [listenerPupAddress: Pup.Address, name:
      -- ROPE, keep: CARDINAL, wDir: RPC.ShortROPE]-- RpcPrivate.Dispatcher
      =
    BEGIN
    listenerPupAddress: Pup.Address;
    name: ROPE;
    keep: CARDINAL;
    wDir: RPC.ShortROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, keep (4): CARDINAL];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 5;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, keep: keep] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal name: ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    BEGIN  -- Unmarshal wDir: RPC.ShortROPE from pkt.data[pktLength].
      [wDir, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, TRUE];
      END;  -- Unmarshal wDir.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    IF onePkt
      THEN rSetKeep[argPkt.listenerPupAddress, name, argPkt.keep, wDir]
      ELSE rSetKeep[listenerPupAddress, name, keep, wDir];
    END;  -- OnePkt.
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- rSetKeepStub.

  rBooleanStub: --PROCEDURE [listenerPupAddress: Pup.Address, key:
      -- Rope.ROPE, default: BOOLEAN]
    -- RETURNS [value: BOOLEAN]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    key: Rope.ROPE;
    default: BOOLEAN;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, default (4): BOOLEAN];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        value (0): BOOLEAN];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 5;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, default: default] ←
          argPkt↑;
      END;
    BEGIN  -- Unmarshal key: Rope.ROPE from pkt.data[pktLength].
      [key, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal key.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [resPkt.value] ← rBoolean[argPkt.listenerPupAddress, key,
          argPkt.default]
      ELSE [resPkt.value] ← rBoolean[listenerPupAddress, key, default];
    END;  -- OnePkt.
    pktLength ← 1;
    RETURN[returnLength: pktLength];
    END;  -- rBooleanStub.

  rNumberStub: --PROCEDURE [listenerPupAddress: Pup.Address, key: Rope.ROPE,
      -- default: INT]
    -- RETURNS [value: INT]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    key: Rope.ROPE;
    default: INT;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, default (4): INT];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        value (0): INT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 6;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, default: default] ←
          argPkt↑;
      END;
    BEGIN  -- Unmarshal key: Rope.ROPE from pkt.data[pktLength].
      [key, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal key.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [resPkt.value] ← rNumber[argPkt.listenerPupAddress, key,
          argPkt.default]
      ELSE [resPkt.value] ← rNumber[listenerPupAddress, key, default];
    END;  -- OnePkt.
    pktLength ← 2;
    RETURN[returnLength: pktLength];
    END;  -- rNumberStub.

  rTokenStub: --PROCEDURE [listenerPupAddress: Pup.Address, key: Rope.ROPE,
      -- default: Rope.ROPE]
    -- RETURNS [value: Rope.ROPE]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    key: Rope.ROPE;
    default: Rope.ROPE;
    value: Rope.ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 4;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal key: Rope.ROPE from pkt.data[pktLength].
      [key, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal key.
    BEGIN  -- Unmarshal default: Rope.ROPE from pkt.data[pktLength].
      [default, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal default.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    IF onePkt
      THEN [value] ← rToken[argPkt.listenerPupAddress, key, default]
      ELSE [value] ← rToken[listenerPupAddress, key, default];
    END;  -- OnePkt.
    pktLength ← 0;
    BEGIN  -- Marshal value: Rope.ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[value, pkt, pktLength, FALSE];
      END;  -- Marshal value.
    RETURN[returnLength: pktLength];
    END;  -- rTokenStub.

  rListOfTokensStub: --PROCEDURE [listenerPupAddress: Pup.Address,
      -- key: Rope.ROPE, default: LIST OF Rope.ROPE]
    -- RETURNS [value: LIST OF Rope.ROPE]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    key: Rope.ROPE;
    default: LIST OF Rope.ROPE;
    value: LIST OF Rope.ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 4;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal key: Rope.ROPE from pkt.data[pktLength].
      [key, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal key.
    BEGIN  -- Unmarshal default: LIST OF Rope.ROPE from pkt.data[pktLength].
      lastNode: LIST OF Rope.ROPE ← (default ← 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 Rope.ROPE = paramZones.gc.CONS[--DefaultValue--,NIL];
        BEGIN  -- Unmarshal thisNode1.first: Rope.ROPE from pkt.data[pktLength].
          [thisNode1.first, pktLength] ← Lupine.UnmarshalRope[pkt,
              pktLength, FALSE];
          END;  -- Unmarshal thisNode1.first.
        IF lastNode # NIL
          THEN lastNode ← (lastNode.rest ← thisNode1)
          ELSE lastNode ← (default ← thisNode1);
        listLength ← listLength - 1;
        ENDLOOP;  -- WHILE listLength > 0.
      END;  -- Unmarshal default.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    IF onePkt
      THEN [value] ← rListOfTokens[argPkt.listenerPupAddress, key,
          default]
      ELSE [value] ← rListOfTokens[listenerPupAddress, key, default];
    END;  -- OnePkt.
    pktLength ← 0;
    BEGIN  -- Marshal value: LIST OF Rope.ROPE to pkt.data[pktLength].
      thisNode1: LIST OF Rope.ROPE;
      listLength: Lupine.ListHeader ← 0;
      FOR thisNode1 ← value, thisNode1.rest UNTIL thisNode1 = NIL DO
        listLength ← listLength + 1;  ENDLOOP;
      IF pktLength+2 > RpcPrivate.maxDataLength
        THEN pktLength ← Lupine.StartNextPkt[pkt: pkt, pktLength: pktLength];
      Lupine.RpcPktDoubleWord[pkt, pktLength]↑ ← listLength;
      pktLength ← pktLength + 2;
      FOR thisNode1 ← value, thisNode1.rest UNTIL thisNode1 = NIL DO
        BEGIN  -- Marshal thisNode1.first: Rope.ROPE to pkt.data[pktLength].
          pktLength ← Lupine.MarshalRope[thisNode1.first, pkt, pktLength,
              FALSE];
          END;  -- Marshal thisNode1.first.
        ENDLOOP;  -- FOR thisNode1.
      END;  -- Marshal value.
    RETURN[returnLength: pktLength];
    END;  -- rListOfTokensStub.

  rLineStub: --PROCEDURE [listenerPupAddress: Pup.Address, key: Rope.ROPE,
      -- default: Rope.ROPE]
    -- RETURNS [value: Rope.ROPE]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    key: Rope.ROPE;
    default: Rope.ROPE;
    value: Rope.ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 4;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal key: Rope.ROPE from pkt.data[pktLength].
      [key, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal key.
    BEGIN  -- Unmarshal default: Rope.ROPE from pkt.data[pktLength].
      [default, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal default.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    IF onePkt
      THEN [value] ← rLine[argPkt.listenerPupAddress, key, default]
      ELSE [value] ← rLine[listenerPupAddress, key, default];
    END;  -- OnePkt.
    pktLength ← 0;
    BEGIN  -- Marshal value: Rope.ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[value, pkt, pktLength, FALSE];
      END;  -- Marshal value.
    RETURN[returnLength: pktLength];
    END;  -- rLineStub.

  rGetProfileNameStub: --PROCEDURE [listenerPupAddress: Pup.Address]
      -- RETURNS [anonP1id3743547: Rope.ROPE]-- RpcPrivate.Dispatcher =
    BEGIN
    anonP1id3743547: Rope.ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 4];
    [anonP1id3743547] ← rGetProfileName[argPkt.listenerPupAddress];
    pktLength ← 0;
    BEGIN  -- Marshal anonP1id3743547: Rope.ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[anonP1id3743547, pkt, pktLength,
          FALSE];
      END;  -- Marshal anonP1id3743547.
    RETURN[returnLength: pktLength];
    END;  -- rGetProfileNameStub.

  rGetStateStub: --PROCEDURE [listenerPupAddress: Pup.Address] RETURNS
      -- [anonP1id3743566: UserCredentials.State]-- RpcPrivate.Dispatcher
      =
    BEGIN
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        anonP1id3743566 (0): UserCredentials.State];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 4];
    [resPkt.anonP1id3743566] ← rGetState[argPkt.listenerPupAddress];
    pktLength ← 1;
    RETURN[returnLength: pktLength];
    END;  -- rGetStateStub.

  rGetStub: --PROCEDURE [listenerPupAddress: Pup.Address] RETURNS [name:
      -- Rope.ROPE, password: Rope.ROPE]-- RpcPrivate.Dispatcher =
    BEGIN
    name: Rope.ROPE;
    password: Rope.ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength;
    Lupine.CheckPktLength[pkt: pkt, pktLength: 4];
    [name, password] ←
      rGet[argPkt.listenerPupAddress];
    pktLength ← 0;
    BEGIN  -- Marshal name: Rope.ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[name, pkt, pktLength, FALSE];
      END;  -- Marshal name.
    BEGIN  -- Marshal password: Rope.ROPE to pkt.data[pktLength].
      pktLength ← Lupine.MarshalRope[password, pkt, pktLength, FALSE];
      END;  -- Marshal password.
    RETURN[returnLength: pktLength];
    END;  -- rGetStub.

  OpenDebugStreamStub: --PROCEDURE [listenerPupAddress: Pup.Address,
      -- newListenerPupAddress: Pup.Address, name: Rope.ROPE, serverMachine:
      -- Rope.ROPE]
    -- RETURNS [byteStreamOK: BOOL]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    newListenerPupAddress: Pup.Address;
    name: Rope.ROPE;
    serverMachine: Rope.ROPE;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, newListenerPupAddress (4): Pup.Address];
    ResultOverlay: TYPE = MACHINE DEPENDENT RECORD [
        byteStreamOK (0): BOOL];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    resPkt: LONG POINTER TO ResultOverlay;
    pktLength: RpcPrivate.DataLength ← 7;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, newListenerPupAddress:
          newListenerPupAddress] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal name: Rope.ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    BEGIN  -- Unmarshal serverMachine: Rope.ROPE from pkt.data[pktLength].
      [serverMachine, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength,
          FALSE];
      END;  -- Unmarshal serverMachine.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    resPkt ← @pkt.data[0];
    IF onePkt
      THEN [resPkt.byteStreamOK] ← OpenDebugStream[argPkt.listenerPupAddress,
          argPkt.newListenerPupAddress, name, serverMachine]
      ELSE [resPkt.byteStreamOK] ← OpenDebugStream[listenerPupAddress,
          newListenerPupAddress, name, serverMachine];
    END;  -- OnePkt.
    pktLength ← 1;
    RETURN[returnLength: pktLength];
    END;  -- OpenDebugStreamStub.

  OpenSourceViewerStub: --PROCEDURE [listenerPupAddress: Pup.Address,
      -- name: Rope.ROPE, index: INT]-- RpcPrivate.Dispatcher =
    BEGIN
    listenerPupAddress: Pup.Address;
    name: Rope.ROPE;
    index: INT;
    ArgumentOverlay: TYPE = MACHINE DEPENDENT RECORD [
        transferIndex (0): RpcControl.ProcedureIndex, listenerPupAddress
        (1): Pup.Address, index (4): INT];
    argPkt: LONG POINTER TO ArgumentOverlay = @pkt.data[0];
    pktLength: RpcPrivate.DataLength ← 6;
    BEGIN  -- OnePkt.
    onePkt: BOOLEAN = lastPkt;
    IF ~onePkt THEN BEGIN  -- Must move statics from pkt now.
      [listenerPupAddress: listenerPupAddress, index: index] ← argPkt↑;
      END;
    BEGIN  -- Unmarshal name: Rope.ROPE from pkt.data[pktLength].
      [name, pktLength] ← Lupine.UnmarshalRope[pkt, pktLength, FALSE];
      END;  -- Unmarshal name.
    Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
    IF onePkt
      THEN OpenSourceViewer[argPkt.listenerPupAddress, name, argPkt.index]
      ELSE OpenSourceViewer[listenerPupAddress, name, index];
    END;  -- OnePkt.
    pktLength ← 0;
    RETURN[returnLength: pktLength];
    END;  -- OpenSourceViewerStub.


-- Marshall/Unmarshal procedures.


-- No module initialization.

END.  -- ComputeServerCallbacksRpcServerImpl.