-- Copyright (C) 1985 by Xerox Corporation. All rights reserved.
-- Stub file was translated on June 22, 1985 9:34:21 pm PDT by Lupine of May 23, 1985 8:38:08 am PDT
-- Source interface CedarNSPrintUtils came from file CedarNSPrintUtils.bcd, which was created on June 22, 1985 9:34:05 pm PDT with version stamp 44#63#2012746333 from source of June 22, 1985 1:52:12 am PDT.
-- The RPC stub modules for CedarNSPrintUtils are:
-- CedarNSPrintUtilsRpcControl.mesa;
-- CedarNSPrintUtilsRpcClientImpl.mesa;
-- CedarNSPrintUtilsRpcBinderImpl.mesa;
-- CedarNSPrintUtilsRpcServerImpl.mesa.
-- The parameters for this translation are:
-- Target language = Mesa
-- Default parameter passing = VALUE
-- Deallocate server heap arguments = TRUE
-- Inline RpcServerImpl dispatcher stubs = FALSE
-- 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
CedarNSPrint,
CedarNSPrintUtils,
CedarNSPrintUtilsRpcControl USING [
InterMdsCallsOnly, LupineProtocolVersion, ProcedureIndex, SignalIndex],
MesaRPC USING [EncryptionKey, InterfaceName, Principal, standardZones, Zones],
MesaRPCLupine --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]-- ;
CedarNSPrintUtilsRpcServerImpl: MONITOR
IMPORTS CedarNSPrintUtils, RpcPrivate: MesaRPCLupine, Lupine: LupineRuntime
EXPORTS CedarNSPrintUtilsRpcControl
SHARES CedarNSPrintUtils, CedarNSPrintUtilsRpcControl =
BEGIN
OPEN CedarNSPrintUtils, RpcControl: CedarNSPrintUtilsRpcControl,
RpcPublic: MesaRPC;
-- Standard remote binding routines.
bound: BOOLEAN ← FALSE;
myInterface: RpcPrivate.ExportHandle;
paramZones: RpcPublic.Zones ← RpcPublic.standardZones;
ExportInterface: PUBLIC ENTRY PROCEDURE [
interfaceName: RpcPublic.InterfaceName, user: RpcPublic.Principal,
password: RpcPublic.EncryptionKey, parameterStorage: RpcPublic.Zones] =
BEGIN
ENABLE UNWIND => NULL;
IsNull: PROCEDURE [string: LONG STRING] RETURNS [BOOLEAN] = INLINE {
RETURN[string = NIL OR string.length = 0]};
IF bound THEN Lupine.BindingError;
myInterface ← RpcPrivate.ExportInterface[
interface: [
type:
IF ~IsNull[interfaceName.type] THEN interfaceName.type
ELSE "CedarNSPrintUtils~44#63#2012746333",
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 PROCEDURE =
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
END; -- Catch public signals.
-- Call public procedures (still in dispatcher).
SELECT LOOPHOLE[pkt.data[0], RpcControl.ProcedureIndex] FROM
FreeString =>
RETURN[
FreeStringStub[
pkt: pkt, callLength: callLength, lastPkt: lastPkt,
localConversation: localConversation]];
FreeMedia =>
RETURN[
FreeMediaStub[
pkt: pkt, callLength: callLength, lastPkt: lastPkt,
localConversation: localConversation]];
FreePrinterProperties =>
RETURN[
FreePrinterPropertiesStub[
pkt: pkt, callLength: callLength, lastPkt: lastPkt,
localConversation: localConversation]];
FreePrinterStatus =>
RETURN[
FreePrinterStatusStub[
pkt: pkt, callLength: callLength, lastPkt: lastPkt,
localConversation: localConversation]];
FreeRequestStatus =>
RETURN[
FreeRequestStatusStub[
pkt: pkt, callLength: callLength, lastPkt: lastPkt,
localConversation: localConversation]];
ENDCASE => RETURN[Lupine.DispatchingError[]];
END; -- ServerDispatcher
-- Public procedure dispatcher stubs.
FreeStringStub: --PROCEDURE [string: LONG POINTER TO String]--
RpcPrivate.Dispatcher =
BEGIN
string: LONG POINTER TO String;
pktLength: RpcPrivate.DataLength ← 1;
MaxHeapAllocs: CARDINAL = 2;
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 string: LONG POINTER TO String from pkt.data[pktLength].
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 string ← NIL
ELSE
BEGIN
string ← (heapAllocVector[1] ← paramZones.heap.NEW[String]);
BEGIN -- Unmarshal string↑: String from pkt.data[pktLength].
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength, dataAdr: string,
dataLength: SIZE[String], alwaysOnePkt: FALSE];
BEGIN OPEN record: string↑;
BEGIN -- Unmarshal record.bytes: LONG POINTER TO PACKED
-- ARRAY CARDINAL OF [0..255] from pkt.data[pktLength].
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 record.bytes ← NIL
ELSE
BEGIN
record.bytes ←
(heapAllocVector[2] ← paramZones.heap.NEW[
PACKED ARRAY CARDINAL OF [0..255]]);
BEGIN -- Unmarshal record.bytes↑: PACKED ARRAY
-- CARDINAL OF [0..255] from pkt.data[pktLength].
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength, dataAdr: @record.bytes↑,
dataLength: SIZE[PACKED ARRAY CARDINAL OF [0..255]],
alwaysOnePkt: FALSE];
END; -- Unmarshal record.bytes↑.
END; -- IF isNIL.
END; -- Unmarshal record.bytes.
END; -- OPEN record: string↑.
END; -- Unmarshal string↑.
END; -- IF isNIL.
END; -- Unmarshal string.
Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
FreeString[string];
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; -- FreeStringStub.
FreeMediaStub: --PROCEDURE [media: LONG POINTER TO Media]--
RpcPrivate.Dispatcher =
BEGIN
media: LONG POINTER TO Media;
pktLength: RpcPrivate.DataLength ← 1;
MaxHeapAllocs: CARDINAL = 2;
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 media: LONG POINTER TO Media from pkt.data[pktLength].
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 media ← NIL
ELSE
BEGIN
media ← (heapAllocVector[1] ← paramZones.heap.NEW[Media]);
BEGIN -- Unmarshal media↑: Media from pkt.data[pktLength].
DescriptorType: TYPE = RECORD [
SEQUENCE COMPUTED CARDINAL OF CedarNSPrint.Medium];
descLength: Lupine.SequenceHeader;
IF pktLength + 2 > RpcPrivate.maxDataLength THEN
pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
descLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
pktLength ← pktLength + 2;
media↑ ← DESCRIPTOR[
(heapAllocVector[2] ← paramZones.heap.NEW[
DescriptorType [Lupine.SHORT[descLength]]]), Lupine.SHORT[
descLength]];
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength, dataAdr: BASE[media↑],
dataLength: SIZE[CedarNSPrint.Medium] * LENGTH[media↑],
alwaysOnePkt: FALSE];
END; -- Unmarshal media↑.
END; -- IF isNIL.
END; -- Unmarshal media.
Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
FreeMedia[media];
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; -- FreeMediaStub.
FreePrinterPropertiesStub: --PROCEDURE [printerProperties: LONG POINTER
-- TO PrinterProperties]-- RpcPrivate.Dispatcher =
BEGIN
printerProperties: LONG POINTER TO PrinterProperties;
pktLength: RpcPrivate.DataLength ← 1;
MaxHeapAllocs: CARDINAL = 53;
heapAllocs: CARDINAL ← 0;
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 printerProperties: LONG POINTER TO PrinterProperties
-- from pkt.data[pktLength].
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 printerProperties ← NIL
ELSE
BEGIN
printerProperties ←
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN heapAllocs
ELSE Lupine.UnmarshalingExprError[])] ← paramZones.heap.NEW[
PrinterProperties]);
BEGIN -- Unmarshal printerProperties↑: PrinterProperties
-- from pkt.data[pktLength].
DescriptorType: TYPE = RECORD [
SEQUENCE COMPUTED CARDINAL OF CedarNSPrint.PrinterProperty];
descLength: Lupine.SequenceHeader;
IF pktLength + 2 > RpcPrivate.maxDataLength THEN
pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
descLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
pktLength ← pktLength + 2;
printerProperties↑ ← DESCRIPTOR[
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN heapAllocs
ELSE Lupine.UnmarshalingExprError[])] ← paramZones.heap.NEW[
DescriptorType [Lupine.SHORT[descLength]]]), Lupine.SHORT[
descLength]];
FOR element2: CARDINAL IN
[FIRST[CARDINAL]..FIRST[CARDINAL] + LENGTH[printerProperties↑]) DO
BEGIN -- Unmarshal printerProperties↑[element2]: CedarNSPrint.PrinterProperty
-- from pkt.data[pktLength].
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength,
dataAdr: @printerProperties↑[element2],
dataLength: SIZE[CedarNSPrint.PrinterProperty], alwaysOnePkt: FALSE];
BEGIN OPEN record: printerProperties↑[element2];
WITH variant: record SELECT FROM
media =>
BEGIN -- Unmarshal variant: MACHINE DEPENDENT
-- RECORD [media: Media] from pkt.data[pktLength].
BEGIN OPEN record: variant;
BEGIN -- Unmarshal record.media: Media from
-- pkt.data[pktLength].
DescriptorType: TYPE = RECORD [
SEQUENCE COMPUTED CARDINAL OF Medium];
descLength: Lupine.SequenceHeader;
IF pktLength + 2 > RpcPrivate.maxDataLength THEN
pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
descLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
pktLength ← pktLength + 2;
record.media ← DESCRIPTOR[
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN
heapAllocs ELSE Lupine.UnmarshalingExprError[])] ←
paramZones.heap.NEW[DescriptorType [Lupine.SHORT[descLength]]]),
Lupine.SHORT[descLength]];
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength, dataAdr: BASE[record.media],
dataLength: SIZE[Medium] * LENGTH[record.media],
alwaysOnePkt: FALSE];
END; -- Unmarshal record.media.
END; -- OPEN record: variant.
END; -- Unmarshal variant.
ENDCASE => NULL; -- WITH variant: record.
END; -- OPEN record: printerProperties↑[element2].
END; -- Unmarshal printerProperties↑[element2].
ENDLOOP; -- FOR element2.
END; -- Unmarshal printerProperties↑.
END; -- IF isNIL.
END; -- Unmarshal printerProperties.
Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
FreePrinterProperties[printerProperties];
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; -- FreePrinterPropertiesStub.
FreePrinterStatusStub: --PROCEDURE [printerStatus: LONG POINTER TO
-- PrinterStatus]-- RpcPrivate.Dispatcher =
BEGIN
printerStatus: LONG POINTER TO PrinterStatus;
pktLength: RpcPrivate.DataLength ← 1;
MaxHeapAllocs: CARDINAL = 53;
heapAllocs: CARDINAL ← 0;
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 printerStatus: LONG POINTER TO PrinterStatus
-- from pkt.data[pktLength].
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 printerStatus ← NIL
ELSE
BEGIN
printerStatus ←
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN heapAllocs
ELSE Lupine.UnmarshalingExprError[])] ← paramZones.heap.NEW[
PrinterStatus]);
BEGIN -- Unmarshal printerStatus↑: PrinterStatus from
-- pkt.data[pktLength].
DescriptorType: TYPE = RECORD [
SEQUENCE COMPUTED CARDINAL OF CedarNSPrint.PrinterStatusComponent];
descLength: Lupine.SequenceHeader;
IF pktLength + 2 > RpcPrivate.maxDataLength THEN
pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
descLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
pktLength ← pktLength + 2;
printerStatus↑ ← DESCRIPTOR[
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN heapAllocs
ELSE Lupine.UnmarshalingExprError[])] ← paramZones.heap.NEW[
DescriptorType [Lupine.SHORT[descLength]]]), Lupine.SHORT[
descLength]];
FOR element2: CARDINAL IN
[FIRST[CARDINAL]..FIRST[CARDINAL] + LENGTH[printerStatus↑]) DO
BEGIN -- Unmarshal printerStatus↑[element2]: CedarNSPrint.PrinterStatusComponent
-- from pkt.data[pktLength].
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength, dataAdr: @printerStatus↑[element2],
dataLength: SIZE[CedarNSPrint.PrinterStatusComponent],
alwaysOnePkt: FALSE];
BEGIN OPEN record: printerStatus↑[element2];
WITH variant: record SELECT FROM
media =>
BEGIN -- Unmarshal variant: MACHINE DEPENDENT
-- RECORD [media: Media] from pkt.data[pktLength].
BEGIN OPEN record: variant;
BEGIN -- Unmarshal record.media: Media from
-- pkt.data[pktLength].
DescriptorType: TYPE = RECORD [
SEQUENCE COMPUTED CARDINAL OF Medium];
descLength: Lupine.SequenceHeader;
IF pktLength + 2 > RpcPrivate.maxDataLength THEN
pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
descLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
pktLength ← pktLength + 2;
record.media ← DESCRIPTOR[
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN
heapAllocs ELSE Lupine.UnmarshalingExprError[])] ←
paramZones.heap.NEW[DescriptorType [Lupine.SHORT[descLength]]]),
Lupine.SHORT[descLength]];
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength, dataAdr: BASE[record.media],
dataLength: SIZE[Medium] * LENGTH[record.media],
alwaysOnePkt: FALSE];
END; -- Unmarshal record.media.
END; -- OPEN record: variant.
END; -- Unmarshal variant.
ENDCASE => NULL; -- WITH variant: record.
END; -- OPEN record: printerStatus↑[element2].
END; -- Unmarshal printerStatus↑[element2].
ENDLOOP; -- FOR element2.
END; -- Unmarshal printerStatus↑.
END; -- IF isNIL.
END; -- Unmarshal printerStatus.
Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
FreePrinterStatus[printerStatus];
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; -- FreePrinterStatusStub.
FreeRequestStatusStub: --PROCEDURE [requestStatus: LONG POINTER TO
-- RequestStatus]-- RpcPrivate.Dispatcher =
BEGIN
requestStatus: LONG POINTER TO RequestStatus;
pktLength: RpcPrivate.DataLength ← 1;
MaxHeapAllocs: CARDINAL = 53;
heapAllocs: CARDINAL ← 0;
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 requestStatus: LONG POINTER TO RequestStatus
-- from pkt.data[pktLength].
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 requestStatus ← NIL
ELSE
BEGIN
requestStatus ←
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN heapAllocs
ELSE Lupine.UnmarshalingExprError[])] ← paramZones.heap.NEW[
RequestStatus]);
BEGIN -- Unmarshal requestStatus↑: RequestStatus from
-- pkt.data[pktLength].
DescriptorType: TYPE = RECORD [
SEQUENCE COMPUTED CARDINAL OF CedarNSPrint.RequestStatusComponent];
descLength: Lupine.SequenceHeader;
IF pktLength + 2 > RpcPrivate.maxDataLength THEN
pktLength ← Lupine.FinishThisPkt[pkt: pkt, pktLength: pktLength];
descLength ← Lupine.RpcPktDoubleWord[pkt, pktLength]↑;
pktLength ← pktLength + 2;
requestStatus↑ ← DESCRIPTOR[
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN heapAllocs
ELSE Lupine.UnmarshalingExprError[])] ← paramZones.heap.NEW[
DescriptorType [Lupine.SHORT[descLength]]]), Lupine.SHORT[
descLength]];
FOR element2: CARDINAL IN
[FIRST[CARDINAL]..FIRST[CARDINAL] + LENGTH[requestStatus↑]) DO
BEGIN -- Unmarshal requestStatus↑[element2]: CedarNSPrint.RequestStatusComponent
-- from pkt.data[pktLength].
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength, dataAdr: @requestStatus↑[element2],
dataLength: SIZE[CedarNSPrint.RequestStatusComponent],
alwaysOnePkt: FALSE];
BEGIN OPEN record: requestStatus↑[element2];
WITH variant: record SELECT FROM
statusMessage =>
BEGIN -- Unmarshal variant: MACHINE DEPENDENT
-- RECORD [statusMessage: String] from pkt.data[pktLength].
BEGIN OPEN record: variant;
BEGIN -- Unmarshal record.statusMessage: String
-- from pkt.data[pktLength].
BEGIN OPEN record: record.statusMessage;
BEGIN -- Unmarshal record.bytes: LONG POINTER
-- TO PACKED ARRAY CARDINAL OF [0..255] from
-- pkt.data[pktLength].
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 record.bytes ← NIL
ELSE
BEGIN
record.bytes ←
(heapAllocVector[
(IF (heapAllocs ← heapAllocs + 1) <= MaxHeapAllocs THEN
heapAllocs ELSE Lupine.UnmarshalingExprError[])] ←
paramZones.heap.NEW[PACKED ARRAY CARDINAL OF [0..255]]);
BEGIN -- Unmarshal record.bytes↑:
-- PACKED ARRAY CARDINAL OF [0..255]
-- from pkt.data[pktLength].
pktLength ← Lupine.CopyFromPkt[
pkt: pkt, pktLength: pktLength, dataAdr: @record.bytes↑,
dataLength: SIZE[PACKED ARRAY CARDINAL OF [0..255]],
alwaysOnePkt: FALSE];
END; -- Unmarshal record.bytes↑.
END; -- IF isNIL.
END; -- Unmarshal record.bytes.
END; -- OPEN record: record.statusMessage.
END; -- Unmarshal record.statusMessage.
END; -- OPEN record: variant.
END; -- Unmarshal variant.
ENDCASE => NULL; -- WITH variant: record.
END; -- OPEN record: requestStatus↑[element2].
END; -- Unmarshal requestStatus↑[element2].
ENDLOOP; -- FOR element2.
END; -- Unmarshal requestStatus↑.
END; -- IF isNIL.
END; -- Unmarshal requestStatus.
Lupine.CheckPktLength[pkt: pkt, pktLength: pktLength];
FreeRequestStatus[requestStatus];
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; -- FreeRequestStatusStub.
-- Marshall/Unmarshal procedures.
-- No module initialization.
END. -- CedarNSPrintUtilsRpcServerImpl.