-- file: UnsafeSTPOps.mesa Edited by: -- Smokey, 17-Jul-81 7:57:15 -- JGS, 17-Aug-81 11:24:06 -- Karlton, 10-Nov-81 16:51:38 -- Daniels, 21-Sep-82 13:00:07 -- Davirro, 16-Nov-82 17:48:07 DIRECTORY PupStream USING [CloseReason], Stream USING [ Byte, DeleteProcedure, GetProcedure, Handle, Object, PutProcedure, SetSSTProcedure, SendAttentionProcedure, SubSequenceType, WaitAttentionProcedure, Word], UnsafeSTP USING [ Access, CompletionProcType, ConfirmProcType, DesiredProperties, ErrorCode, FileInfo, Type, ValidProperties], Time USING [Packed]; UnsafeSTPOps: DEFINITIONS = BEGIN -- Constants maxStringLength: CARDINAL = 100; myPassword: CARDINAL = 111111B; -- Types Handle: TYPE = LONG POINTER TO Object; Object: TYPE = RECORD[ byteStream: Stream.Handle ← NIL, userState: ARRAY UserProperties OF LONG STRING ← ALL[NIL], gotMark: BOOLEAN ← FALSE, mark: Stream.SubSequenceType ← NULL, remoteString: LONG STRING ← NIL, host: LONG STRING ← NIL, serverType: ServerType ← unknown, plist: PList ← NIL, desiredProps: UnsafeSTP.DesiredProperties ← ALL[TRUE], info: UnsafeSTP.FileInfo ← NIL, remoteStream: RemoteStream ← NIL]; RemoteStream: TYPE = POINTER TO RemoteObject; -- must be short RemoteObject: TYPE = RECORD[ stream: Stream.Object, state: RemoteStreamState, access: UnsafeSTP.Access, stp: Handle, password: CARDINAL ← myPassword]; FilenameType: TYPE = {alto, tenex}; Operation: TYPE = {delete, directory, retrieve, store}; ServerType: TYPE = {ifs, tenex, unknown}; PListArray: TYPE = ARRAY UnsafeSTP.ValidProperties OF LONG STRING; PList: TYPE = LONG POINTER TO PListArray; RemoteStreamState: TYPE = {initial, confirm, data, complete, end}; ValidProperties: TYPE = UnsafeSTP.ValidProperties; FileProperties: TYPE = UnsafeSTP.ValidProperties[directory..author]; UserProperties: TYPE = UnsafeSTP.ValidProperties[userName..directory]; -- Procedures for doing FTP protocol operations DoFiles: PROCEDURE [ stp: Handle, file: LONG STRING, confirm: UnsafeSTP.ConfirmProcType, complete: UnsafeSTP.CompletionProcType, op: Operation]; GetCommand: PROCEDURE [stp: Handle, ps: LONG POINTER TO LONG STRING] RETURNS[mark: Stream.SubSequenceType, code: CHARACTER]; GetFile: PROCEDURE [stp: Handle, stream: Stream.Handle, file: LONG STRING] RETURNS [BOOLEAN]; GetHereIsAndPList: PROCEDURE [stp: Handle, gobbleEOC: BOOLEAN ← TRUE]; GetPList: PROCEDURE [stp: Handle, gobbleEOC: BOOLEAN ← TRUE, propertiesOk: BOOL ← FALSE]; PutCommand: PROCEDURE [stp: Handle, mark: Stream.SubSequenceType, code: CHARACTER, string: LONG STRING, sendEOC: BOOLEAN ← TRUE]; PutFile: PROCEDURE [stp: Handle, stream: Stream.Handle, file: LONG STRING, sendEOC: BOOLEAN ← TRUE]; PutPList: PROCEDURE [stp: Handle, mark: Stream.SubSequenceType, sendEOC: BOOLEAN ← TRUE]; -- Utility routines CollectString: PROCEDURE [stp: Handle, ps: LONG POINTER TO LONG STRING]; CollectCode: PROCEDURE [stp: Handle] RETURNS[code: CHARACTER]; CheckConnection: PROCEDURE [stp: Handle]; ErrorIfNextNotEOC: PROCEDURE [stp: Handle]; ErrorIfNextNotYes: PROCEDURE [stp: Handle]; FindFileType: PROCEDURE [stream: Stream.Handle] RETURNS[fileType: UnsafeSTP.Type]; GetServerType: PROCEDURE [server: LONG STRING] RETURNS [serverType: ServerType]; LookAtMark: PROCEDURE [stp: Handle] RETURNS [Stream.SubSequenceType]; MakeRemoteName: PROCEDURE [plist: PList, type: FilenameType] RETURNS[name: LONG STRING]; MyGetChar: PROCEDURE [stp: Handle] RETURNS [char: CHARACTER]; MyGetMark: PROCEDURE [stp: Handle] RETURNS [Stream.SubSequenceType]; MyPutString: PROCEDURE [byteStream: Stream.Handle, string: LONG STRING]; PropertyString: PROCEDURE [prop: ValidProperties] RETURNS [string: LONG STRING]; -- Global string SelectError: PROCEDURE [ stp: Handle, s: LONG STRING, mark: Stream.SubSequenceType]; SetByteSize: PROCEDURE [stp: Handle, fileType: UnsafeSTP.Type]; SetCreateTime: PROCEDURE [stp: Handle, creation: Time.Packed]; SetFileType: PROCEDURE [stp: Handle, fileType: UnsafeSTP.Type]; SmashClosed: PROCEDURE [stp: Handle]; TransferTheFile: PROCEDURE [stp: Handle, from, to: Stream.Handle]; -- PList Utilities DestroyPList: PROCEDURE [plist: PList] RETURNS [PList]; MakePList: PROCEDURE RETURNS[plist: PList]; NameToPList: PROCEDURE [plist: PList, name: LONG STRING, type: FilenameType]; PListToName: PROCEDURE [plist: PList, type: FilenameType] RETURNS[name: LONG STRING]; PutPListItem: PROCEDURE [byteStream: Stream.Handle, property: ValidProperties, value: LONG STRING]; ResetPList: PROCEDURE [plist: PList]; SetPListItem: PROCEDURE [plist: PList, property, value: LONG STRING]; UserStateToPList: PROCEDURE [stp: Handle]; -- Remote Stream routines DeleteRemoteStream: Stream.DeleteProcedure; GetBlock: Stream.GetProcedure; GetByte: PROCEDURE [sH: Stream.Handle] RETURNS[byte: Stream.Byte]; GetError: Stream.GetProcedure; GetWord: PROCEDURE [sH: Stream.Handle] RETURNS[word: Stream.Word]; PutBlock: Stream.PutProcedure; PutByte: PROCEDURE [sH: Stream.Handle, byte: Stream.Byte]; PutError: Stream.PutProcedure; PutWord: PROCEDURE [sH: Stream.Handle, word: Stream.Word]; SetSSTNop: Stream.SetSSTProcedure; SendAttentionNop: Stream.SendAttentionProcedure; WaitAttentionNop: Stream.WaitAttentionProcedure; -- Internal ERRORs and SIGNALs BadProperty: ERROR; MarkEncountered: ERROR; ErrorCodeToSTPErrorCode: PROCEDURE [errorCode: UnsafeSTP.ErrorCode, code: CHARACTER] RETURNS[UnsafeSTP.ErrorCode]; GenerateErrorString: PROCEDURE [ stp: Handle, errorCode: UnsafeSTP.ErrorCode, string: LONG STRING, code: CHARACTER ← 0C]; GenerateStreamClosingError: PROCEDURE [stp: Handle, why: PupStream.CloseReason]; GenerateProtocolError: PROCEDURE [ stp: Handle, type: ProtocolError, mark: Stream.SubSequenceType, code: CHARACTER ← 0C]; ProtocolError: TYPE = {badVersion, badMark, badPList, eocExpected, noCode}; -- Registered STP Mark Byte Commands markRetrieve: Stream.SubSequenceType = 1B; markStore: Stream.SubSequenceType = 2B; markYes: Stream.SubSequenceType = 3B; markNo: Stream.SubSequenceType = 4B; markHereIsFile: Stream.SubSequenceType = 5B; markEOC: Stream.SubSequenceType = 6B; markComment: Stream.SubSequenceType = 7B; markIAmVersion: Stream.SubSequenceType = 10B; markNewStore: Stream.SubSequenceType = 11B; markDirectory: Stream.SubSequenceType = 12B; markHereIsPList: Stream.SubSequenceType = 13B; markYouAreUser: Stream.SubSequenceType = 14B; markNewDirectory: Stream.SubSequenceType = 14B; -- (notice: same as markYouAreUser) markAbort: Stream.SubSequenceType = 15B; markDelete: Stream.SubSequenceType = 16B; markRename: Stream.SubSequenceType = 17B; -- Registered Mail Mark Byte Commands markStoreMail: Stream.SubSequenceType = 20B; markRetrieveMail: Stream.SubSequenceType = 21B; markFlushMailBox: Stream.SubSequenceType = 22B; markMailBoxException: Stream.SubSequenceType = 23B; END. -- end of STPOps