-- file: Pilot> STPsE.mesa - Simple/Stream Transfer Protocol
-- Edited by:
-- Mark on: Feb 12, 1981 11:21 PM
-- Smokey on: Feb 6, 1981 4:58 PM
-- Karlton on: October 10, 1980 2:44 PM
DIRECTORY
Compatibility USING [SHandle],
Date USING [StringToPacked],
Inline USING [BITAND],
PupStream USING [PupByteStreamAbort],
Segments USING [Access, FileNameProblem, Read, Write],
STP,
STPOps,
Stream USING [
EndOfStream, GetByte, Handle, InputOptions, Object, SetInputOptions],
Streams USING [GetIndex, GetTimes, NewStream, SetIndex, SetTimes],
Storage USING [EmptyString, StringLength],
Time USING [Current, Packed];
STPsE: MONITOR
IMPORTS
Inline, PupStream, Segments, Storage, STP, STPOps, Stream,
Streams, Time, Date
EXPORTS STP, STPOps =
BEGIN OPEN STPOps;
Object: PUBLIC TYPE = STPOps.Object;
-- HACK to smash connection closed
SmashClosed: PUBLIC ENTRY PROCEDURE [stp: STPOps.Handle] =
BEGIN
IF stp = NIL OR stp.byteStream = NIL THEN RETURN;
-- First smash connection so it will not give us any grief, THEN close it
PupStream.PupByteStreamAbort[stp.byteStream, "Unwinding..."L];
STP.Close[stp ! STP.Error => IF code = noConnection THEN CONTINUE];
END;
-- For incompatable Alto/Pilot Stream Objects
FillInStreamObject: PUBLIC PROCEDURE[handle: Stream.Handle] =
BEGIN OPEN STPOps;
handle↑ ← Stream.Object[
options: NULL,
get: GetBlock, getByte: GetByte, getWord: GetWord,
put: PutBlock, putByte: PutByte, putWord: PutWord,
setSST: STP.SetSSTNop, sendAttention: STP.SendAttentionNop,
waitAttention: STP.WaitAttentionNop, delete: DeleteRemoteStream];
END;
-- FileStream stuff
CreateFileStream: PUBLIC PROCEDURE [
file: STRING,
access: STP.Access ← read,
stream: Compatibility.SHandle ← NIL,
fileType: STP.FileType ← unknown,
options: Stream.InputOptions ← STP.defaultOptions]
RETURNS [Stream.Handle] =
BEGIN OPEN Streams;
acc: Segments.Access = IF access = read THEN Segments.Read ELSE Segments.Write;
IF stream = NIL THEN
BEGIN
IF Storage.StringLength[file] = 0 THEN
GenerateErrorString[illegalFileName, NIL];
stream ← NewStream[file, acc ! Segments.FileNameProblem[] => CONTINUE];
END;
IF stream = NIL THEN GenerateErrorString[noSuchFile, NIL];
Stream.SetInputOptions[stream, options];
RETURN[stream];
END;
FindFileType: PUBLIC PROCEDURE [stream: Stream.Handle]
RETURNS [fileType: STP.FileType] =
BEGIN
currentIndex: LONG CARDINAL ← Streams.GetIndex[stream];
Streams.SetIndex[stream, 0];
fileType ← text;
DO ENABLE Stream.EndOfStream => GOTO streamEND;
IF (Inline.BITAND[Stream.GetByte[stream], 200B]) # 0 THEN
{fileType ← binary; EXIT};
REPEAT streamEND => NULL;
ENDLOOP;
Streams.SetIndex[stream, currentIndex];
END;
GetFileTimes: PUBLIC PROCEDURE [stream: Stream.Handle]
RETURNS [create, write, read: Time.Packed] =
BEGIN
[create, write, read] ← Streams.GetTimes[stream];
END;
SetFileDates: PUBLIC PROCEDURE [stp: STPOps.Handle, stream: Stream.Handle] =
BEGIN
cTime: Time.Packed;
cTime ← IF Storage.EmptyString[stp.plist[createDate]] THEN Time.Current[]
ELSE Date.StringToPacked[stp.plist[createDate]];
Streams.SetTimes[h: stream, create: cTime, read: [0], write: [0]];
END;
END. -- of STPsE