DIRECTORY Ascii, Atom, Basics, BasicTime, CharDisplays, Commander, CommanderOps, Convert, DisplayControllers, FileNames, IO, Menus, Protocols, Rope, TermProgs, ViewerOps, ViewerTools; TermEmCmds: CEDAR PROGRAM IMPORTS CharDisplays, Commander, CommanderOps, DisplayControllers, FileNames, IO, Menus, Protocols, Rope, TermProgs, ViewerOps, ViewerTools = {OPEN CharDisplays, DisplayControllers, TermProgs; Protocol: TYPE = Protocols.Protocol; Conversant: TYPE = Protocols.Conversant; Em: TYPE = REF EmRep; EmRep: TYPE = RECORD [ termName: ROPE, term: Term, dc: DisplayController, p: Protocol, c: Conversant, myLine: Menus.MenuLine ¬ 0, myEntries: MenuEntries ¬ NIL]; MenuEntries: TYPE = REF MenuEntriesArray; MenuEntriesArray: TYPE = ARRAY MenuEntry OF Menus.MenuEntry; MenuEntry: TYPE = {Login, Connect, GiveUp, Disconnect, Local, Remote}; emType: Protocols.ClientType ¬ NEW [Protocols.ClientTypePrivate ¬ [ NoteState: NoteState]]; installationDirectory: ROPE ¬ FileNames.CurrentWorkingDirectory[]; lastEm: Em ¬ NIL; MakeEm: PROC [cmd: Commander.Handle] RETURNS [result: REF ¬ NIL, msg: ROPE ¬ NIL] = { termName: ROPE ¬ "dm2500w"; displayClass: ROPE ¬ "UnselectedFlushedBufferedTioga"; protocolName: ROPE ¬ SELECT Basics.bitsPerWord FROM 16 => "PupTelnet", 32 => "Echo", ENDCASE => ERROR; serverName: ROPE ¬ NIL; login: BOOL ¬ TRUE; log: BOOL ¬ FALSE; em: Em; term: Term; cdc: CharDisplayClass; cd: CharDisplay ¬ NIL; dc: DisplayController ¬ NIL; p: Protocol; i: INT ¬ 1; argv: CommanderOps.ArgumentVector ¬ CommanderOps.Parse[cmd]; WHILE i < argv.argc DO SELECT TRUE FROM argv[i].Equal["-term"] => {termName ¬ argv[i+1]; i ¬ i+2}; argv[i].Equal["-display"] => {displayClass ¬ argv[i+1]; i ¬ i+2}; argv[i].Equal["-protocol"] => {protocolName ¬ argv[i+1]; i ¬ i+2}; argv[i].Equal["-host"] => {serverName ¬ argv[i+1]; i ¬ i+2}; argv[i].Equal["-login"] => {login ¬ TRUE; i ¬ i + 1}; argv[i].Equal["-connect"] => {login ¬ FALSE; i ¬ i + 1}; argv[i].Equal["-logRaw"] => {log ¬ TRUE; i ¬ i + 1}; argv[i].Equal["-dontLogRaw"] => {log ¬ FALSE; i ¬ i + 1}; argv[i].Length[]=0 => RETURN [$Failure, IO.PutFR1["Arg %g empty", IO.int[i]]]; argv[i].Fetch[0]='- => RETURN [$Failure, IO.PutFR1["Unrecognized switch: %g", IO.refAny[argv[i]]]]; ENDCASE => {serverName ¬ argv[i]; i ¬ i+1}; ENDLOOP; IF termName.Equal["?"] THEN { first: BOOL ¬ TRUE; NoteTerm: PROC [name: ROPE, term: Term] = { IF first THEN first ¬ FALSE ELSE cmd.out.PutRope[", "]; cmd.out.PutRope[name]; }; cmd.out.PutRope["Available Terminal Types: "]; TermProgs.EnumerateTerms[NoteTerm]; cmd.out.PutRope[".\n"]; RETURN; }; IF displayClass.Equal["?"] THEN { first: BOOL ¬ TRUE; NoteClass: PROC [cdc: CharDisplayClass] = { IF first THEN first ¬ FALSE ELSE cmd.out.PutRope[", "]; cmd.out.PutRope[cdc.name]; }; cmd.out.PutRope["Available Display Classes: "]; CharDisplays.EnumerateClasses[NoteClass]; cmd.out.PutRope[".\n"]; RETURN; }; IF protocolName.Equal["?"] THEN { first: BOOL ¬ TRUE; NoteProtocol: PROC [p: Protocol] = { IF first THEN first ¬ FALSE ELSE cmd.out.PutRope[", "]; cmd.out.PutRope[p.name]; }; cmd.out.PutRope["Available Protocols: "]; Protocols.EnumerateProtocols[NoteProtocol]; cmd.out.PutRope[".\n"]; RETURN; }; term ¬ TermProgs.GetTerm[termName, cmd]; IF term = NIL THEN RETURN [$Failed, IO.PutFR1["Couldn't find terminal %g", IO.rope[termName]]]; cdc ¬ CharDisplays.GetClass[displayClass]; IF cdc = NIL THEN RETURN [$Failed, IO.PutFR1["Couldn't find display class %g", IO.rope[displayClass]]]; p ¬ Protocols.GetProtocol[protocolName]; IF p = NIL THEN RETURN [$Failed, IO.PutFR1["Couldn't find protocol %g", IO.rope[protocolName]]]; cd ¬ CharDisplays.Create[class: cdc, client: unchangeableClient, tipTableName: term.tipTableName, det: term.det]; dc ¬ DisplayControllers.Create[cd, term.cp]; em ¬ NEW [EmRep ¬ [termName, term, dc, p]]; em.c ¬ em.p.Instantiate[ NEW [Protocols.ClientPrivate ¬ [ fromClient: em.dc.fromDisplay, toClient: em.dc.toDisplay, type: emType, clientData: em ]], IF log THEN "Term.RawLog" ELSE NIL ]; IF dc.cd.viewer # NIL THEN { m: Menus.Menu ¬ em.dc.cd.viewer.menu; oldLines: Menus.MenuLine ¬ em.myLine ¬ Menus.GetNumberOfLines[m]; Menus.ChangeNumberOfLines[m, oldLines+1]; em.myEntries ¬ NEW [MenuEntriesArray ¬ [ Login: Menus.CreateEntry["Login", Login, em], Connect: Menus.CreateEntry["Connect", Connect, em], GiveUp: Menus.CreateEntry["GiveUp", GiveUp, em], Disconnect: Menus.CreateEntry["Disconnect", Disconnect, em], Local: Menus.CreateEntry["Local", Local, em], Remote: Menus.CreateEntry["Remote", Remote, em] ]]; }; NoteState[em.c]; IF serverName.Length[] > 0 THEN em.p.StartConnect[em.c, serverName, login]; lastEm ¬ em; }; NoteState: PROC [c: Conversant] = { em: Em = NARROW[c.client.clientData]; SetDriver[em.dc, c.driver]; IF em.dc.cd.viewer # NIL AND NOT em.dc.cd.class.Destroyed[em.dc.cd] THEN { m: Menus.Menu ¬ em.dc.cd.viewer.menu; Menus.SetLine[m, em.myLine, NIL]; SELECT c.state.connectivity FROM disconnected => { Menus.AppendMenuEntry[m, em.myEntries[Login], em.myLine]; Menus.AppendMenuEntry[m, em.myEntries[Connect], em.myLine]; }; connecting => { Menus.AppendMenuEntry[m, em.myEntries[GiveUp], em.myLine]; }; connected => { Menus.AppendMenuEntry[m, em.myEntries[Disconnect], em.myLine]; }; disconnecting => { Menus.AppendMenuEntry[m, em.myEntries[GiveUp], em.myLine]; }; ENDCASE => ERROR; SELECT c.state.onLine FROM FALSE => Menus.AppendMenuEntry[m, em.myEntries[Remote], em.myLine]; TRUE => Menus.AppendMenuEntry[m, em.myEntries[Local], em.myLine]; ENDCASE => ERROR; ViewerOps.PaintViewer[em.dc.cd.viewer, menu]; SetName[em, IF c.state.connectivity=connected THEN c.serverName ELSE NIL]; }; }; SetName: PROC [em: Em, serverName: ROPE] = { em.dc.cd.viewer.name ¬ IO.PutFR["%g; %g; %g", IO.rope[em.termName], IO.rope[em.dc.cd.class.name], IO.rope[em.p.name]]; IF serverName # NIL THEN em.dc.cd.viewer.name ¬ serverName.Cat["; ", em.dc.cd.viewer.name]; ViewerOps.PaintViewer[em.dc.cd.viewer, caption]; }; Login: PROC [parent: REF ANY, clientData: REF ANY ¬ NIL, mouseButton: Menus.MouseButton ¬ red, shift, control: BOOL ¬ FALSE] --Menus.MenusProc-- = { em: Em = NARROW[clientData]; serverName: ROPE ¬ ViewerTools.GetSelectionContents[]; em.p.StartConnect[em.c, serverName, TRUE]; }; Connect: PROC [parent: REF ANY, clientData: REF ANY ¬ NIL, mouseButton: Menus.MouseButton ¬ red, shift, control: BOOL ¬ FALSE] --Menus.MenusProc-- = { em: Em = NARROW[clientData]; serverName: ROPE ¬ ViewerTools.GetSelectionContents[]; em.p.StartConnect[em.c, serverName, FALSE]; }; GiveUp: PROC [parent: REF ANY, clientData: REF ANY ¬ NIL, mouseButton: Menus.MouseButton ¬ red, shift, control: BOOL ¬ FALSE] --Menus.MenusProc-- = { em: Em = NARROW[clientData]; em.p.GiveUp[em.c]; }; Disconnect: PROC [parent: REF ANY, clientData: REF ANY ¬ NIL, mouseButton: Menus.MouseButton ¬ red, shift, control: BOOL ¬ FALSE] --Menus.MenusProc-- = { em: Em = NARROW[clientData]; em.p.StartDisconnect[em.c]; }; Local: PROC [parent: REF ANY, clientData: REF ANY ¬ NIL, mouseButton: Menus.MouseButton ¬ red, shift, control: BOOL ¬ FALSE] --Menus.MenusProc-- = { em: Em = NARROW[clientData]; em.p.SetOnLine[em.c, FALSE]; }; Remote: PROC [parent: REF ANY, clientData: REF ANY ¬ NIL, mouseButton: Menus.MouseButton ¬ red, shift, control: BOOL ¬ FALSE] --Menus.MenusProc-- = { em: Em = NARROW[clientData]; em.p.SetOnLine[em.c, TRUE]; }; Commander.Register[key: "TerminalEmulator", proc: MakeEm, doc: "(-term (|?) | -display (|?) | -protocol (|?) | [-host] | - login | -connect | -logRaw | -dontLogRaw)* --- Make a terminal emulator"]; }. θ TermEmCmds.Mesa Copyright Σ 1992 by Xerox Corporation. All rights reserved. Mike Spreitzer January 22, 1987 10:30:36 pm PST Last tweaked by Mike Spreitzer on April 4, 1990 12:37:05 pm PDT Willie-s, June 12, 1992 1:53 pm PDT Κ•NewlineDelimiter –(cedarcode) style™codešœ™Kšœ Οeœ1™˜>K˜—šœ˜Kšœ:˜:K˜—Kšžœžœ˜—šžœž˜Kšžœ>˜CKšžœ=˜AKšžœžœ˜—Kšœ-˜-Kš œ žœ žœžœžœ˜JK˜—K˜—K˜š œžœžœ˜,Kš œžœžœžœžœ˜vKšžœžœžœC˜[Kšœ0˜0K˜—K˜š œžœ žœžœžœžœžœ8žœžœΟcœ˜”Kšœ žœ ˜Kšœ žœ&˜6Kšœ$žœ˜*K˜—K˜š œžœ žœžœžœžœžœ8žœžœ‘œ˜–Kšœ žœ ˜Kšœ žœ&˜6Kšœ$žœ˜+K˜—K˜š œžœ žœžœžœžœžœ8žœžœ‘œ˜•Kšœ žœ ˜Kšœ˜K˜—K˜š  œžœ žœžœžœžœžœ8žœžœ‘œ˜™Kšœ žœ ˜Kšœ˜K˜—K˜š œžœ žœžœžœžœžœ8žœžœ‘œ˜”Kšœ žœ ˜Kšœžœ˜K˜—K˜š œžœ žœžœžœžœžœ8žœžœ‘œ˜•Kšœ žœ ˜Kšœžœ˜K˜—K˜Kšœθ˜θK˜K˜——…—’&Œ