// RemoteVMemInit1.bcpl - handles pulling in remote sysout
// Last change January 21, 1985 2:28 PM by Bill van Melle
// Last change May 20, 1984 7:13 PM by Bill van Melle
// Last change August 1, 1983 5:50 PM by Bill van Melle
// Last change January 21, 1983 11:10 AM by Bill van Melle
// Last change June 8, 1982 10:42 PM by Bill van Melle
// Last change April 11, 1982 5:40 PM by Bill van Melle
// Last change December 29, 1981 11:50 AM by Bill van Melle
// Last change November 30, 1981 9:59 PM by Bill van Melle
// Last change September 7, 1981 1:04 PM by Bill van Melle
get "LispBcpl.decl"
get "VMem.decl"
get "FtpProt.decl"
get "AltoDefs.d"
external [ // procedures defined here
Retrieve; Wss; FixPassword
// O.S. procedures
CallSwat; Puts; Ws
// misc procedures used
ReadStrng; AppendString; RetrieveVmem; ShowSysoutName
// pup procs
BSPReadBlock; UserClose; ReleasePBI
// statics used
LispFmap
CtxRunning
UserName; UserPassword; dsp; SysinName; SysinHostName
// statics from RemoteVMemInit.bcpl
sysoutFailed; ftpBadPup
]
manifest [
firstMouseY = 50
lastMouseY = 800
]
//----------------------------------------------------------------------------
structure String: [ length byte; char↑1,255 byte ]
//----------------------------------------------------------------------------
let Retrieve (remotePL, localPL) = valof
[ // this two-level action needed to approve the file,
// then retrieve it
SysinName>>String.length = 0
// fill in correct name now. remotePL is ephemeral, so copy
AppendString(SysinName, remotePL>>PL.SFIL)
ShowSysoutName (lv remotePL>>PL.CDAT)
resultis LispRetrieveFile
]
and LispRetrieveFile (remotePL, localPL) = valof
[
let bspStream = CtxRunning>>FtpCtx.bspStream
let buffer = CtxRunning>>FtpCtx.buffer
let bufferLength = CtxRunning>>FtpCtx.bufferLength
for i = 1 to FirstVmemBlock-1
// start at page 1--IFS has no leader page
do BSPReadBlock (bspStream, buffer, 0, WordsPerPage lshift 1)
// skip over the silly pages before the good stuff
RetrieveVmem (bspStream, buffer, bufferLength, FtpReadFn, FtpFinishFn)
resultis true
]
and FtpReadFn(stream, buffer, bufferLength) = valof
[
FlipCursor()
resultis BSPReadBlock (stream, buffer, 0, bufferLength lshift 1) rshift 1
]
and FtpFinishFn(stream, buffer) be
[
sysoutFailed = false
if ftpBadPup
then [ ReleasePBI(ftpBadPup); ftpBadPup = 0 ]
// or else BSPCloseSocket will hang
if BSPReadBlock (stream, buffer, 0, 512) gr 0
then // still stuff to read
[
UserClose(true) // abort connection
]
]
and FlipCursor () be
[ for i = 0 to 15 do cursorBitMap!i = not cursorBitMap!i ]
and Wss (stream, str) be
[ for i = 1 to str>>String.length
do Puts(stream, str>>String.char↑i)
]
and FixPassword (host) be
[
Ws ("*n{")
Ws (host)
Ws ("} Login user: ")
let haveDefaultName = UserName>>String.length gr 0
unless ReadStrng (UserName, (UserName!-1 lshift 1) - 1, haveDefaultName) loop
Ws (" (password) ")
if ReadStrng (UserPassword, (UserPassword!-1 lshift 1) - 1, false, true)
then return
] repeat