;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:8; Patch-File:T -*-
;;; Patch file for System version 123.178
;;; Reason:
;;;  Some Telnet Servers have bugs:  VMS Excelan doesn't trouble to respond
;;;  to DO ECHO with WILL ECHO, yet it still echoes.  4.2BSD Unix responds
;;;  to DONT ECHO with WONT ECHO, yet continues to echo.  Our Telnet needs
;;;  the ability to toggle local echo regardless of what the state of the
;;;  ECHO option is.  Thus: Network-E toggles local echo.  The old usage
;;;  of this command is available with Network-Control-E, which toggles
;;;  remote echo by sending a Telnet DO or DONT command.
;;; Written 7-Jan-88 15:09:51 by pld at site Gigamos Cambridge
;;; while running on Jack Flanders from band 2
;;; with Experimental System 123.177, Experimental Local-File 73.3, Experimental FILE-Server 22.1, Experimental Unix-Interface 11.0, Experimental Tape 18.0, Experimental KERMIT 34.3, Experimental ZMail 71.0, Experimental Lambda-Diag 15.0, microcode 1754, SDU Boot Tape 3.12, SDU ROM 8.



; From modified file DJ: L.NETWORK; SUPDUP.LISP#312 at 7-Jan-88 15:11:27
#8R SUPDUP#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SUPDUP")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; SUPDUP  "

(DEFMETHOD (BASIC-NVT :HANDLE-ESCAPE) (&AUX CH XPOS YPOS command)
  (UNWIND-PROTECT
    (PROGN
      (MULTIPLE-VALUE (XPOS YPOS) (TV:SHEET-READ-CURSORPOS SELF))
      (PUT-DOWN-STRING SELF "CMND-->")
      (SETQ CH (CHAR-UPCASE (SEND SELF :TYI)))
      (SELECTQ CH
	((#/CALL #/P)
	 (TV:DESELECT-AND-MAYBE-BURY-WINDOW SELF))
	(#/A
	 (unless (NULL CONNECTION)
	   (setq command '(SEND SELF :SEND-IF-HANDLES :SEND-IP))))
	((#/B #/BREAK)
	 (SEND SELF :SET-SUPER-IMAGE-MODE NIL)
	 (BREAK "BREAK")
	 (SEND SELF :SET-SUPER-IMAGE-MODE T))
	(#/C			      ;C = Change escape character.
	 (PUT-DOWN-STRING SELF "Change escape character to -->")
	 (SEND SELF :SET-SUPER-IMAGE-MODE NIL)
	 (SETQ ESCAPE-CHAR (CHAR-UPCASE (SEND SELF :TYI)))
	 (SEND SELF :SET-SUPER-IMAGE-MODE T))
	(#/D                         ;D = Disconnect, ask for new host to connect to.
	 (IF (NULL CONNECTION)
	     (THROW 'NVT-DONE "(Already disconnected.)")
	   (SEND SELF :DISCONNECT)
	   (THROW 'NVT-DONE "Disconnected")))
	(#/E
	 (unless (null connection)
	   (setq command '(send self :send-if-handles :toggle-local-echo))))
	(#/Control-Shift-E
	 (unless (null connection)
	   (setq command '(send self :send-if-handles :toggle-remote-echo))))
	(#/N
	 (SEND SELF :SET-SUPER-IMAGE-MODE NIL))
	(#/L			      ;L = Logout.
	 (IF (NULL CONNECTION)
	     (QUIT)
	   (setq command '(progn
			    (SEND SELF :LOGOUT)
			    (QUIT "Logout")))))
	(#/Q			      ;Q = Quit.
	 (QUIT))
	(#/M			      ;M = More.
	 (IF (NOT (NULL CONNECTION))
	     (SEND SELF :SEND-IF-HANDLES :USER-SET-MORE-P (NOT (SEND SELF :MORE-P)))))
	(#/I			      ;I = Imlac.
	 (IF (NOT (NULL CONNECTION))
	     (SEND SELF :SEND-IF-HANDLES :TOGGLE-IMLAC-SIMULATION)))
	(#/O
	 (SEND SELF :SEND-IF-HANDLES :TOGGLE-OVERPRINTING))
	(#/V
	 (send self :send-if-handles :toggle-verbose-mode))
	(#/Y
	 (let* ((node (zwei:history-latest-element zwei:*kill-history*))
		(string (if (arrayp node) node (zwei:string-interval node nil nil t))))
	   (dotimes (i (array-length string))
	     (send self :force-kbd-input (aref string i)))))

	((#/HELP #/?)		      ;<HELP> or ? = Help
	 (SI:WITH-HELP-STREAM (WINDOW :LABEL "Help for Network commands")
	   (SEND WINDOW :CLEAR-WINDOW)
	   (FORMAT WINDOW "After typing the Escape character, which is ~:C,
you can type these commands:~%" ESCAPE-CHAR)
	   (FORMAT WINDOW "
CALL -- Do a local CALL (return to top window).
BREAK-- Enter a breakpoint.
~:[~;A    -- Send an ATTN (in Telnet, a New Telnet /"Interrupt Process/").
~]~
C    -- Change the SUPDUP escape character.
D    -- Disconnect and connect to new host.
~:[~;E    -- Toggle local echo
~]~
~:[~;C-E  -- Toggle remote echo
~]~
~:[~;I    -- Toggle imlac simulation.
~]~
L    -- Log out of remote host, and break the connection.
~:[~;M    -- Toggle more processing.
~]~
~:[~;O    -- Toggle overprinting (for servers that expect non-overprinting terminals).
~]~
P    -- Return to top window, but don't break connection.
Q    -- Disconnect and return to top window.
~:[~;V    -- Toggle verbose mode
~]~
Y    -- Send the most recently killed string through the connection.

Help -- Type this cruft.
"
		   (GET-HANDLER-FOR SELF :SEND-IP)
		   (GET-HANDLER-FOR SELF :TOGGLE-LOCAL-ECHO)
		   (GET-HANDLER-FOR SELF :TOGGLE-REMOTE-ECHO)
		   (GET-HANDLER-FOR SELF :TOGGLE-IMLAC-SIMULATION)
		   (GET-HANDLER-FOR SELF :USER-SET-MORE-P)
		   (GET-HANDLER-FOR SELF :TOGGLE-OVERPRINTING)
		   (get-handler-for self :toggle-verbose-mode))
	   (FORMAT WINDOW "~4A -- Send ~:C through~%"
		   (FORMAT NIL "~:C" ESCAPE-CHAR)
		   ESCAPE-CHAR)))
	(#/RUBOUT)				;<RUBOUT> = Do nothing.
	(OTHERWISE
	  (COND ((= CH ESCAPE-CHAR)
		 (SEND SELF :NET-OUTPUT-TRANSLATED CH)
		 (LOCK-OUTPUT
		   (SEND STREAM :FORCE-OUTPUT)))
		(T (TV:BEEP))))))
    (TV:SHEET-FORCE-ACCESS (SELF T)
      (PUT-DOWN-STRING SELF "")      ;Clear the bottom line.
      (TV:SHEET-SET-CURSORPOS SELF XPOS YPOS))
    (when command
      (eval command))))

))

; From modified file DJ: L.NETWORK; SUPDUP.LISP#312 at 7-Jan-88 15:11:43
#8R SUPDUP#: 
(COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SUPDUP")))
  (COMPILER::PATCH-SOURCE-FILE "SYS: NETWORK; SUPDUP  "

(defmethod (basic-telnet :toggle-local-echo) ()
  (telnet-echo (not echo-flag)))

))
