DIRECTORY Ascii, Atom, Basics, BasicTime, CharDisplays, Commander, CommandTool, Convert, DisplayControllers, IO, Menus, MessageWindow, Protocols, Rope, TermProgs, ViewerOps, ViewerTools; TermEmCmds: CEDAR PROGRAM IMPORTS CharDisplays, Commander, CommandTool, DisplayControllers, IO, Menus, MessageWindow, Protocols, Rope, TermProgs, ViewerOps, ViewerTools = {OPEN CharDisplays, DisplayControllers, TermProgs; Protocol: TYPE = Protocols.Protocol; Conversation: TYPE = Protocols.Conversation; Em: TYPE = REF EmRep; EmRep: TYPE = RECORD [ termName: ROPE, term: Term, dc: DisplayController, p: Protocol, c: Conversation]; installationDirectory: ROPE _ CommandTool.CurrentWorkingDirectory[]; lastEm: Em _ NIL; MakeEm: PROC [cmd: Commander.Handle] RETURNS [result: REF _ NIL, msg: ROPE _ NIL] = { termName: ROPE _ "dm2500w"; displayClass: ROPE _ "BufferedTioga"; protocolName: ROPE _ "PupTelnet"; serverName: ROPE _ NIL; login: BOOL _ TRUE; em: Em; term: Term; cdc: CharDisplayClass; cd: CharDisplay _ NIL; dc: DisplayController _ NIL; p: Protocol; i: INT _ 1; argv: CommandTool.ArgumentVector _ CommandTool.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].Length[]=0 => RETURN [$Failure, IO.PutFR["Arg %g empty", IO.int[i]]]; argv[i].Fetch[0]='- => RETURN [$Failure, IO.PutFR["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; }; term _ TermProgs.GetTerm[termName, cmd]; IF term = NIL THEN RETURN [$Failed, IO.PutFR["Couldn't find terminal %g", IO.rope[termName]]]; cdc _ CharDisplays.GetClass[displayClass]; IF cdc = NIL THEN RETURN [$Failed, IO.PutFR["Couldn't find display class %g", IO.rope[displayClass]]]; p _ Protocols.GetProtocol[protocolName]; IF p = NIL THEN RETURN [$Failed, IO.PutFR["Couldn't find protocol %g", IO.rope[protocolName]]]; cd _ CharDisplays.Create[class: cdc, det: term.det]; dc _ DisplayControllers.Create[cd, term.cp]; em _ NEW [EmRep _ [termName, term, dc, p]]; IF dc.cd.viewer # NIL THEN { m: Menus.Menu _ em.dc.cd.viewer.menu; oldLines: Menus.MenuLine _ m.GetNumberOfLines[]; m.ChangeNumberOfLines[oldLines+1]; m.AppendMenuEntry[Menus.CreateEntry["Login", Login, em], oldLines]; m.AppendMenuEntry[Menus.CreateEntry["Connect", Connect, em], oldLines]; m.AppendMenuEntry[Menus.CreateEntry["Disconnect", Disconnect, em], oldLines]; SetName[em, NIL]; }; lastEm _ em; IF serverName.Length[] > 0 THEN ConnectWork[em, serverName, login]; }; 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, all]; }; 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[]; ConnectWork[em, 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[]; ConnectWork[em, serverName, FALSE]; }; ConnectWork: PROC [em: Em, serverName: ROPE, login: BOOL] = { IF em.c # NIL THEN { MessageWindow.Append["Already connected!", TRUE]; } ELSE { em.c _ em.p.Connect[serverName: serverName, fromClient: em.dc.fromDisplay, toClient: em.dc.toDisplay, noteDisconnect: NoteDisconnect, clientData: em, login: login]; SetName[em, IF em.c # NIL THEN serverName ELSE NIL]; }; }; Disconnect: PROC [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: Menus.MouseButton _ red, shift, control: BOOL _ FALSE] --Menus.MenusProc-- = { em: Em _ NARROW[clientData]; IF em.c # NIL THEN { em.p.Disconnect[em.c]; } ELSE { MessageWindow.Append["Already disconnected!", TRUE]; }; }; NoteDisconnect: PROC [clientData: REF ANY] = { em: Em _ NARROW[clientData]; SetName[em, NIL]; em.c _ NIL; }; Commander.Register[key: "TerminalEmulator", proc: MakeEm, doc: "Make a terminal emulator"]; }. RTermEmCmds.Mesa Last Edited by: Spreitzer, November 8, 1985 2:37:57 pm PST Κj– "cedar" style˜Icodešœ™K™:K˜KšΟk œdœK˜ΊK˜šΠbx œœ˜Kšœ;œJ˜ŽK˜Kšœœ-˜5K˜Kšœ œ˜$Kšœœ˜,K˜Kšœœœ˜šœœœ˜Kšœ œ˜K˜ K˜K˜ K˜—K˜Kšœœ)˜DK˜Kšœ œ˜K˜šΟnœœœ œœœœ˜UKšœ œ ˜Kšœœ˜%Kšœœ˜!Kšœ œœ˜Kšœœœ˜Kšœ˜K˜ K˜Kšœœ˜Kšœœ˜Kšœ ˜ Kšœœ˜ Kšœ:˜:šœ˜šœœ˜Kšœ:˜:KšœA˜AKšœB˜BKšœ<˜