4.4BSD/usr/src/contrib/xns/examples/gap/GAP3.cr

-- $Header: GAP3.cr,v 2.0 85/11/21 07:22:56 jqj Exp $
-- $Log:	GAP3.cr,v $
-- Revision 2.0  85/11/21  07:22:56  jqj
-- 4.3BSD standard release
-- 
-- Revision 1.1  85/11/20  14:09:06  jqj
-- Initial revision
-- 

GAP: PROGRAM 3 VERSION 3 =
BEGIN

	DEPENDS UPON Authentication (14) VERSION 1;

-- types --

WaitTime: TYPE = CARDINAL;	-- in seconds --

SessionHandle: TYPE = ARRAY 2 OF UNSPECIFIED;

CharLength: TYPE = {five(0), six(1), seven(2), eight(3)};

Parity: TYPE = {none(0), odd(1), even(2), one(3), zero(4)};

StopBits: TYPE = {oneStopBit(0), twoStopBits(1)};

FlowControl: TYPE = RECORD [
	type: {flowControlNone(0), xOnXOff(1)},
	xOn: UNSPECIFIED,
	xOFF: UNSPECIFIED ];

BidReply: TYPE = {wack(0), nack(1), defaultBidReply(2)};

ExtendedBoolean: TYPE = {true(0), false(1), defaultExtendedBoolean(2)};

DeviceType: TYPE = {undefined(0), terminal(1), printer(2)};

-- the following is sometimes called a SessionParamObject --
SessionParameterObject: TYPE = CHOICE OF {
	xerox800(0) => RECORD [],
	xerox850(1), xerox860(2) => RECORD [pollProc: UNSPECIFIED],
	system6(3), cmcll(4), imb2770(5), ibm2770Host(6),
	ibm6670(7), ibm6670Host(8) => RECORD [
		sendBlocksize, receiveBlocksize: CARDINAL ],
	ibm3270(9), ibm3270Host(10) => RECORD [],
	oldTtyHost(11), oldTty(12) => RECORD [
		charLength: CharLength,
		parity: Parity,
		stopBits: StopBits,
		frameTimeout: CARDINAL ],	-- in millisec --
	otherSessionType(13) => RECORD [],
	unknown(14) => RECORD [],
	ibm2780(15), ibm2780Host(16), 
	ibm3780(17), ibm3780Host(18) => RECORD [
		sendBlocksize, receiveBlocksize: CARDINAL ],
	siemens9750(19), siemens9750Host(20) => RECORD [],
	ttyHost(21), tty(22) => RECORD [
		charLength: CharLength,
		parity: Parity,
		stopBits: StopBits,
		frameTimeout: CARDINAL,		-- in millisec --
		flowControl: FlowControl ] };

LineType: TYPE = {
	bitSynchronous(0), byteSynchronous(1), asynchronous(2),
	autoRecognition(3) };

LineSpeed: TYPE = {
	bps50(0), bps75(1), bps110(2), bps135(3), bps150(4),
	bps300(5), bps600(6), bps1200(7), bps2400(8), bps3600(9),
	bps4800(10), bps7200(11), bps9600(12),
	bps19200(13), bps28800(14), bps38400(15), bps48000(16),
	bps56000(17), bps57600(18)
	};

Duplexity: TYPE = {fullduplex(0), halfduplex(1)};

CommParamObject: TYPE = RECORD [
	accessDetail: CHOICE OF {
		directConn(0) => RECORD [
			duplex: Duplexity,
			lineType: LineType,
			lineSpeed: LineSpeed ],
		dialConn(1) => RECORD [
			duplex: Duplexity,
			lineType: LineType,
			lineSpeed: LineSpeed,
			dialMode: {manualDial(0), autoDial(1)},
			dialerNumber: CARDINAL,
			retryCount: CARDINAL ] }
	];

ReserveType: TYPE = { preemptNever(0), preemptAlways(1),
	preemptInactive(2) };

Resource: TYPE = ARRAY 2 OF UNSPECIFIED;

LineControl: TYPE = { primary(0), secondary(1) };

ControllerAddress: TYPE = CARDINAL;

TerminalAddress: TYPE = CARDINAL;

TransportObject: TYPE = CHOICE OF {
	rs232c(0) => RECORD [			-- spec doesn't say (0) --
		commParams: CommParamObject,
		preemptOthers, preemptMe: ReserveType,
		phoneNumber: STRING,
		line: CHOICE OF {		-- spec doesn't say (0) --
			alreadyReserved(0) => RECORD [resource: Resource],
			reserveNeeded(1) => RECORD [lineNumber: CARDINAL]
			}
		],
	bsc(1) => RECORD [
		localTerminalID: STRING,
		localSecurityID: STRING,
		lineControl: LineControl,
		authenticateProc: UNSPECIFIED,
		bidReply: BidReply,
		sendLineHoldingEOTs: ExtendedBoolean,
		expectLineHoldingEOTs: ExtendedBoolean ],
	teletype(2) => RECORD [],
	polledBSCController(3), sdlcController(5) => RECORD [
		hostControllerName: STRING,
		controllerAddress: ControllerAddress,
		portsOnController: CARDINAL ],
	polledBSCTerminal(4), sdlcTerminal(6) => RECORD [
		hostControllerName: STRING,
		terminalAddress: TerminalAddress ],
	service(7) => RECORD [
		id: LONG CARDINAL ],
	unused(8) => RECORD [],
	polledBSCPrinter(9), sdlcPrinter(10) => RECORD [
		hostControllerName: STRING,
		printerAddress: TerminalAddress]
	};

-- Constants --

infiniteTime: WaitTime = 177777B;	-- LAST[CARDINAL] --

NopPollProc: UNSPECIFIED = 0B;

unspecifiedTerminalAddr: TerminalAddress = 177777B;

-- Remote Errors --

unimplemented: ERROR = 0;
noCommunicationHardware: ERROR = 1;
illegalTransport: ERROR = 2;
mediumConnectFailed: ERROR = 3;
badAddressFormat: ERROR = 4;
noDialingHardware: ERROR = 5;
dialingHardwareProblem: ERROR = 6;
transmissionMediumUnavailable: ERROR = 7;
inconsistentParams: ERROR = 8;
tooManyGateStreams: ERROR = 9;
bugInGAPCode: ERROR = 10;
gapNotExported: ERROR = 11;
gapCommunicationError: ERROR = 12;
controllerAlreadyExists: ERROR = 13;
controllerDoesNotExist: ERROR = 14;
terminalAddressInUse: ERROR = 15;
terminalAddressInvalid: ERROR = 16;
-- the following are guesses as to the ERROR numbers --
serviceTooBusy: ERROR = 17;
userNotAuthenticated: ERROR = 18;
userNotAuthorized: ERROR = 19;
serviceNotFound: ERROR = 20;


-- Remote procedures --

Reset: PROCEDURE = 0;

Create: PROCEDURE [
		sessionParameterHandle: SessionParameterObject,
		transportList: SEQUENCE OF TransportObject,
		createTimeout: WaitTime,
		credentials: Authentication.Credentials,
		verifier: Authentication.Verifier ]
	RETURNS [ session: SessionHandle ]
	REPORTS [ badAddressFormat,
		controllerAlreadyExists, controllerDoesNotExist,
		dialingHardwareProblem,
		illegalTransport, inconsistentParams,
		mediumConnectFailed,
		noCommunicationHardware, noDialingHardware,
		terminalAddressInUse, terminalAddressInvalid,
		tooManyGateStreams, transmissionMediumUnavailable,
		serviceTooBusy, userNotAuthenticated, userNotAuthorized,
		serviceNotFound	]
	= 2;

Delete: PROCEDURE [ session: SessionHandle ] = 3;
	
END.