DIRECTORY Ascii, Atom, Basics, BasicTime, CharDisplays, Commander, CommandTool, Convert, DisplayControllers, IO, Menus, Protocols, Rope, TermProgs, ViewerOps, ViewerTools; TermEmCmds: CEDAR PROGRAM IMPORTS CharDisplays, Commander, CommandTool, DisplayControllers, 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 _ CommandTool.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: 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].Equal["-logRaw"] => {log _ TRUE; i _ i + 1}; argv[i].Equal["-dontLogRaw"] => {log _ 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; }; 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.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, 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 Mike Spreitzer January 22, 1987 10:30:36 pm PST Last tweaked by Mike Spreitzer on April 4, 1990 12:37:05 pm PDT Κ– "cedar" style˜codešœ™K™/K™?—K˜KšΟk œdœ<˜«K˜šΠbx œœ˜Kšœ;œ;˜K˜Kšœœ-˜5K˜Kšœ œ˜$Kšœ œ˜(K˜Kšœœœ˜šœœœ˜Kšœ œ˜K˜ K˜K˜ Kšœ˜Kšœ˜Kšœœ˜—K˜Kšœ œœ˜)Kšœœœ œ˜˜>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˜——…—v&