-- Copyright (C) 1983 by Xerox Corporation. All rights reserved. -- SloshSend.mesa, HGM, 18-Feb-83 1:04:37 DIRECTORY Ascii USING [CR], Environment USING [Byte, bytesPerPage], Put USING [Text], String USING [AppendLongDecimal, AppendChar, AppendString], Stream USING [CompletionCode, Delete, GetBlock, Handle], System USING [GetGreenwichMeanTime], Time USING [AppendCurrent], Window USING [Handle], Slosh USING [SendStatus], EFTPDefs USING [ EFTPAbortSending, EFTPFinishSending, EFTPOpenForSending, EFTPSendBlock, EFTPSetSendTimeout, EFTPTimeOut, EFTPTroubleSending], PupDefs USING [AppendHostName, FastPath], PupTypes USING [PupAddress]; SloshSend: PROGRAM IMPORTS Put, Stream, String, System, Time, EFTPDefs, PupDefs EXPORTS Slosh = BEGIN verbose: BOOLEAN = TRUE; SendFile: PUBLIC PROCEDURE [ who: Window.Handle, fileName: LONG STRING, file: Stream.Handle, him: PupTypes.PupAddress] RETURNS [what: Slosh.SendStatus] = BEGIN OPEN EFTPDefs; page: CARDINAL; buffer: PACKED ARRAY [0..Environment.bytesPerPage) OF Environment.Byte; message: LONG STRING; trouble: STRING = [100]; seconds: LONG CARDINAL; slowly: BOOLEAN ¬ ~PupDefs.FastPath[him]; seconds ¬ System.GetGreenwichMeanTime[]; -- Yetch, at 2400 baud it takes 2 sec/page IF slowly THEN EFTPSetSendTimeout[6000, 10] ELSE EFTPSetSendTimeout[2000, 10]; BEGIN EFTPOpenForSending[ him, FALSE ! EFTPTimeOut, EFTPTroubleSending => GOTO NeverStarted]; FOR page ¬ 0, page + 1 DO bytes: CARDINAL; why: Stream.CompletionCode; [bytes, why] ¬ Stream.GetBlock[file, [@buffer, 0, Environment.bytesPerPage]]; EFTPSendBlock[ @buffer, bytes ! EFTPTimeOut => BEGIN message ¬ "Timeout while sending "L; GOTO Trouble; END; EFTPTroubleSending => BEGIN message ¬ "Troubles while sending "L; String.AppendString[trouble, s]; GOTO Trouble; END]; IF why # normal THEN EXIT; ENDLOOP; EFTPFinishSending[ ! EFTPTimeOut => BEGIN message ¬ "Timeout while finishing "L; GOTO Trouble; END; EFTPTroubleSending => BEGIN message ¬ "Troubles while finishing "L; String.AppendString[trouble, s]; GOTO Trouble; END]; seconds ¬ System.GetGreenwichMeanTime[] - seconds; message ¬ "Sent "L; what ¬ ok; EXITS Trouble => BEGIN EFTPAbortSending[message]; seconds ¬ System.GetGreenwichMeanTime[] - seconds; what ¬ troubles; END; NeverStarted => BEGIN message ¬ "Never started sending "L; EFTPAbortSending[message]; seconds ¬ System.GetGreenwichMeanTime[] - seconds; what ¬ neverStarted; END; END; Stream.Delete[file]; IF verbose THEN BEGIN OPEN String; text: STRING = [200]; Time.AppendCurrent[text]; AppendString[text, " "L]; AppendString[text, message]; IF trouble.length # 0 THEN BEGIN AppendString[text, "("L]; AppendString[text, trouble]; AppendString[text, ") "L]; END; AppendString[text, fileName]; AppendString[text, " to "L]; PupDefs.AppendHostName[text, him]; IF what # ok AND what # neverStarted THEN BEGIN AppendString[text, ", page="L]; AppendLongDecimal[text, page]; END; AppendString[text, ", sec="L]; AppendLongDecimal[text, seconds]; IF slowly THEN AppendString[text, " (slowly)"L]; LogString[who, text]; END; END; LogString: PROCEDURE [msg: Window.Handle, text: LONG STRING] = BEGIN String.AppendChar[text, '.]; String.AppendChar[text, Ascii.CR]; Put.Text[NIL, text]; IF msg # NIL THEN Put.Text[msg, text]; END; END.