;;; -*- Mode: Common-Lisp; Package: User; Base: 10.; Patch-File: T -*-
;;; Patch file for KERMIT version 3.4
;;; Reason: Modified serial host support for SNA.   SJF 8-21-87
;;; Written 08/21/87 17:07:41 by FORD,
;;; while running on Blumenthal from band LOD1
;;; With IO 3.10, PATHNAME 3.8, FILE 3.5, SYSTEM 3.22, METER 3.1, SERIAL 3.0, CHAOSNET 3.8, ETHERNET 3.0, GC 3.7, IMAGEN 3.0, MAIL-DAEMON 3.1, NETWORK-SUPPORT 3.6, PROFILE 3.0, SUGGESTIONS 3.3, UCL 3.0, ZWEI 3.4, STREAMER-TAPE 3.2, DEBUG-TOOLS 3.0, FONT-EDITOR 3.0, GLOSSARY 3.0, INPUT-EDITOR 3.0, MAIL-READER 3.0, NAMESPACE-EDITOR 3.2, NVRAM 3.0, TELNET 3.0, TV 3.4, NAMESPACE 3.7, COMPILER 3.2, PRINTER 3.1, SYSLOG 3.0, VT100 3.1, Experimental KERMIT 3.1, Experimental SNA 1.0,  microcode 355, Band Name: Release 3.0 - 6/9.



#!C
; From file SERIAL-HOST.LISP#> PUBLIC.KERMIT; Blumenthal:
#10R NET#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "NET"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "sys: PUBLIC.KERMIT; SERIAL-HOST.#"


			
(DEFUN SERIAL-CONNECTION-FUNCTION (host logical-contact-name connection &KEY
				   stream-type
				   window-size
				   (timeout (* 10 60))
				   timeout-after-open
				   &allow-other-keys &AUX stream)
  (DECLARE (IGNORE connection window-size timeout timeout-after-open))
  (WHEN (TRANSLATE-LOGICAL-CONTACT-NAME logical-contact-name :SERIAL-STREAM)
    (LET ((vt100-frame (SEND *TERMINAL-IO* :SUPERIOR)))
      (SETQ stream 
	    (MAKE-SERIAL-STREAM :FLAVOR (IF (GET-HOST-ATTRIBUTE host :ASCII-CHARACTERS)
					    'SI:SERIAL-ASCII-STREAM
					    'SI:SERIAL-STREAM)
				:XON-XOFF-PROTOCOL (GET-HOST-ATTRIBUTE host :XON-XOFF-PROTOCOL)
				:EOT-ENABLE (GET-HOST-ATTRIBUTE host :EOT-ENABLE)
				:INPUT-BUFFER-SIZE (GET-HOST-ATTRIBUTE host :INPUT-BUFFER-SIZE)
				:OUTPUT-BUFFER-SIZE (GET-HOST-ATTRIBUTE host :OUTPUT-BUFFER-SIZE)
				:FORCE-OUTPUT (GET-HOST-ATTRIBUTE HOST host :FORCE-OUTPUT)
				:NUMBER-OF-DATA-BITS (GET-HOST-ATTRIBUTE host :NUMBER-OF-DATA-BITS)
				:NUMBER-OF-STOP-BITS (GET-HOST-ATTRIBUTE host :NUMBER-OF-STOP-BITS)
				:PARITY (GET-HOST-ATTRIBUTE host :PARITY)
				:BAUD (GET-HOST-ATTRIBUTE host :BAUD)))
      (SETQ *SERIAL-HOST* host) 
      (SET-IN-INSTANCE vt100-frame 'TELNET:ECHO-FLAG T)
      (SEND vt100-frame :PUTPROP (GET-HOST-ATTRIBUTE host :PROTOCOL-CONVERTER) :PROTOCOL-CONVERTER)
      (IF (GET-HOST-ATTRIBUTE host :SCREEN-BUFFER?)
	  (LET*
	    ((screen-buffer (SEND
			      vt100-frame
			      :PUTPROP 
			      (MAKE-ARRAY (SYMEVAL-IN-INSTANCE vt100-frame 'TELNET:BOTTOM-OF-SCROLL)
					  :LEADER-LENGTH 3
					  :LEADER-LIST (LIST 0 
							     (IF (SYMEVAL-IN-INSTANCE vt100-frame 'TELNET:COLUMN-MODE-80-P)
								 79
								 131)
							     (1- (SYMEVAL-IN-INSTANCE vt100-frame 'TELNET:BOTTOM-OF-SCROLL)))
					  :FILL-POINTER 0
					  :INITIAL-ELEMENT NIL)
			      :SCREEN-BUFFER))
	     (size (ARRAY-TOTAL-SIZE screen-buffer)))
	    (DOTIMES (line size)
	      ;; Create a line array
	      (SETF (AREF screen-buffer line) (MAKE-ARRAY 132.
							  :TYPE :ART-STRING
							  :FILL-POINTER 0
							  :INITIAL-ELEMENT #\SPACE)))
	    (SETF (FILL-POINTER screen-buffer) size))
	  (SEND vt100-frame :remprop :screen-buffer))
      (WHEN (GET-HOST-ATTRIBUTE host :AUTODIAL?)
	(UNLESS (TELNET:AUTODIAL :MENU NIL) 
	  (RETURN-FROM SERIAL-CONNECTION-FUNCTION stream)))
      (WHEN (GET-HOST-ATTRIBUTE host :RUN-SCRIPT?)
	(LET* ((vt100-screen *TERMINAL-IO*)
	       (process (SYMEVAL-IN-INSTANCE vt100-frame 'TELNET:TYPEOUT-PROCESS)))
	  (UNWIND-PROTECT
	      (PROGN
		(SEND *SCRIPT-WINDOW* :CLEAR-SCREEN)
		(SEND process :ARREST-REASON :SCRIPT)
		(SEND *SCRIPT-WINDOW* :SET-SUPERIOR vt100-frame)
		(SEND vt100-frame :SET-SELECTION-SUBSTITUTE *SCRIPT-WINDOW*)
		(TELNET:RUN-SCRIPT-FROM-FILE
		  (GET-HOST-ATTRIBUTE host :SCRIPT)
		  :STREAM SYS:*SERIAL-PORT-OWNER*
		  :DEBUG-STREAM *SCRIPT-WINDOW*
		  :ASCII-TRANSLATE (EQ (FIND-STREAM-TYPE stream-type :SERIAL-STREAM) 'SYS:SERIAL-STREAM))
		(PRINT "****** PRESS A KEY TO CONTINUE ******" *SCRIPT-WINDOW*)
		(READ-CHAR *SCRIPT-WINDOW*))
	    (SEND *SCRIPT-WINDOW* :SET-SUPERIOR W:MAIN-SCREEN)
	    (SEND vt100-frame :SET-SELECTION-SUBSTITUTE vt100-screen)
	    (SEND process :REVOKE-ARREST-REASON :SCRIPT)))))
    stream))

))

#!C
; From file SERIAL-HOST.LISP#> PUBLIC.KERMIT; Blumenthal:
#10R NET#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "NET"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "sys: PUBLIC.KERMIT; SERIAL-HOST.#"


(DEFVAR *DEFAULT-SERIAL-HOST-AUTODIAL-PREFIX*       "ATDT")

))

#!C
; From file SERIAL-HOST.LISP#> PUBLIC.KERMIT; Blumenthal:
#10R NET#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "NET"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "sys: PUBLIC.KERMIT; SERIAL-HOST.#"


(DEFVAR *DEFAULT-SERIAL-HOST-AUTODIAL-NUMBER*       "9,18005551212")

))

#!C
; From file SERIAL-HOST.LISP#> PUBLIC.KERMIT; Blumenthal:
#10R NET#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "NET"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "sys: PUBLIC.KERMIT; SERIAL-HOST.#"


(DEFVAR *DEFAULT-SERIAL-HOST-PROTOCOL-CONVERTER*    :NONE)

))

#!C
; From file SERIAL-HOST.LISP#> PUBLIC.KERMIT; Blumenthal:
#10R NET#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "NET"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "sys: PUBLIC.KERMIT; SERIAL-HOST.#"


(DEFVAR *DEFAULT-SERIAL-HOST-SCREEN-BUFFER?*        NIL)

))

#!C
; From file SERIAL-HOST.LISP#> PUBLIC.KERMIT; Blumenthal:
#10R NET#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "NET"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "sys: PUBLIC.KERMIT; SERIAL-HOST.#"



(DEFUN DEFINE-SERIAL-HOST-FROM-CVV ()
  "Produces a CVV to select serial host attributes, then creates a serial
host object using DEFINE-HOST.  Returns the new host object."
  (LET ((name *DEFAULT-SERIAL-HOST-NAME*)
	(namespace *DEFAULT-SERIAL-HOST-NAMESPACE*)
	(namespace-action *DEFAULT-SERIAL-HOST-NAMESPACE-ACTION*)
	(baud *DEFAULT-SERIAL-HOST-BAUD*)
	(force-output *DEFAULT-SERIAL-HOST-FORCE-OUTPUT*)
	(number-of-data-bits *DEFAULT-SERIAL-HOST-NUMBER-OF-DATA-BITS*)
	(number-of-stop-bits *DEFAULT-SERIAL-HOST-NUMBER-OF-STOP-BITS*)
	(parity *DEFAULT-SERIAL-HOST-PARITY*)
	(xon-xoff-protocol *DEFAULT-SERIAL-HOST-XON-XOFF-PROTOCOL*)
	(ascii-characters *DEFAULT-SERIAL-HOST-ASCII-CHARACTERS*)
	(input-buffer-size *DEFAULT-SERIAL-HOST-INPUT-BUFFER-SIZE*)
	(output-buffer-size *DEFAULT-SERIAL-HOST-OUTPUT-BUFFER-SIZE*)
	(autodial-prefix *DEFAULT-SERIAL-HOST-AUTODIAL-PREFIX*)
	(autodial-number *DEFAULT-SERIAL-HOST-AUTODIAL-NUMBER*)
	(autodial? *DEFAULT-SERIAL-HOST-AUTODIAL?*)
	(script *DEFAULT-SERIAL-HOST-SCRIPT*)
	(run-script? *DEFAULT-SERIAL-HOST-RUN-SCRIPT?*)
	(protocol-converter *DEFAULT-SERIAL-HOST-PROTOCOL-CONVERTER*)
	(screen-buffer? *DEFAULT-SERIAL-HOST-SCREEN-BUFFER?*))
    
    (DECLARE (SPECIAL name namespace namespace-action baud force-output
                      number-of-data-bits number-of-stop-bits parity
                      xon-xoff-protocol ascii-characters input-buffer-size
                      output-buffer-size autodial-prefix autodial-number
                      autodial? script run-script? protocol-converter
		      screen-buffer?))

    (CATCH 'ABORT-CVV
      (W:CHOOSE-VARIABLE-VALUES
	'((name
	    "Host Name"
	    :DOCUMENTATION "The name of the host being defined as having this particular configuration of a serial port."
	    :STRING)
	  (namespace
	    "Namespace"
	    :DOCUMENTATION "The namespace in which to define this host."
	    :MENU (NAME:LIST-KNOWN-NAMESPACES))
	  (namespace-action
	    "Namespace Action"
	    :DOCUMENTATION "Choose LOCAL to update only the local cache of the specified namespace.
Choose GLOBAL to update the local cache and the Name Server of the specified namespace."
	    :MENU-ALIST (("LOCAL" T) ("GLOBAL" NIL)))
	  (baud
	    "Baud rate"
	    :DOCUMENTATION "Line speed.  (Most asynchronous modems use 1200 or 300)"
	    :CHOOSE (300 1200 2400 4800 9600 19200))
	  (force-output
	    "Force output"
	    :DOCUMENTATION "YES: send characters immediately.  NO: send characters when buffer is full."
	    :BOOLEAN)
	  (number-of-data-bits
	    "Data Bits"
	    :DOCUMENTATION "Number of data bits."
	    :CHOOSE (5 6 7 8))
	  (number-of-stop-bits
	    "Stop Bits"
	    :DOCUMENTATION "Number of stop bits."
	    :CHOOSE (1 2))
	  (parity
	    "Parity"
	    :DOCUMENTATION "Type of parity to use."
	    :CHOOSE (:NONE :EVEN :ODD))
	  (xon-xoff-protocol
	    "XON-XOFF"
	    :DOCUMENTATION "YES: use XON-XOFF characters.  NO: don't implement XON-XOFF characters."
	    :BOOLEAN)
	  (ascii-characters
	    "Translate ASCII"
	    :DOCUMENTATION "YES: Automatically translate between ASCII and Explorer characters.  NO: don't translate."
	    :BOOLEAN)
	  (input-buffer-size
	    "Input Buffer size"
	    :DOCUMENTATION "Size (in words) to allocate for the input buffers."
	    :NUMBER)
	  (output-buffer-size
	    "Output Buffer size"
	    :DOCUMENTATION "Size (in words) to allocate for the output buffers."
	    :NUMBER)
	  (autodial-prefix
	    "Autodial Prefix"
	    :DOCUMENTATION "Character sequence that activates autodial capabilities of autodial modem."
	    :STRING)
	  (autodial-number
	    "Phone Number"
	    :DOCUMENTATION "Telephone number to dial."
	    :STRING)
	  (autodial?
	    "Autodial?"
	    :DOCUMENTATION "YES: Automatically autodial upon connection.  NO: don't autodial."
	    :BOOLEAN)
	  (script
	    "Script"
	    :DOCUMENTATION "The pathname of a file containing a script defined per TELNET:RUN-SCRIPT."
	    :TYPEP STRING)
	  (run-script?
	    "Run Script?"
	    :DOCUMENTATION "YES: Automatically run the script upon connection.  NO: don't run the script."
	    :BOOLEAN)
	  (protocol-converter
	    "Protocol Converter"
	    :DOCUMENTATION "Type of Protocol Converter connected to serial port."
	    :CHOOSE (:NONE :IBM-3708 :COMMTEX-CX-80))
	  (screen-buffer?
	    "Screen Buffer?"
	    :DOCUMENTATION "Select YES to maintain a local character buffer for VT100 screen (required with SNA)."
	    :BOOLEAN))
	:NEAR-MODE '(:POINT 500 400)
	:LABEL "Define Serial Host"
	:MARGIN-CHOICES '(("Abort" (THROW 'ABORT-CVV NIL))
			  "Do It")))
      
      (DEFINE-SERIAL-HOST :NAME name
	                  :NAMESPACE namespace
			  :NAMESPACE-ACTION namespace-action
	                  :BAUD baud
			  :FORCE-OUTPUT force-output
			  :NUMBER-OF-DATA-BITS number-of-data-bits
			  :NUMBER-OF-STOP-BITS number-of-stop-bits
			  :PARITY parity
			  :XON-XOFF-PROTOCOL xon-xoff-protocol
			  :ASCII-CHARACTERS ascii-characters
			  :INPUT-BUFFER-SIZE input-buffer-size
			  :OUTPUT-BUFFER-SIZE output-buffer-size
			  :AUTODIAL-PREFIX autodial-prefix
			  :AUTODIAL-NUMBER autodial-number
			  :AUTODIAL? autodial?
			  :SCRIPT script
			  :RUN-SCRIPT? run-script?
			  :PROTOCOL-CONVERTER protocol-converter
			  :SCREEN-BUFFER? screen-buffer?)))

))

#!C
; From file SERIAL-HOST.LISP#> PUBLIC.KERMIT; Blumenthal:
#10R NET#:
(COMPILER-LET ((*PACKAGE* (FIND-PACKAGE "NET"))
                          (SI:*LISP-MODE* :COMMON-LISP)
                          (*READTABLE* COMMON-LISP-READTABLE)
                          (SI:*READER-SYMBOL-SUBSTITUTIONS* SYS::*COMMON-LISP-SYMBOL-SUBSTITUTIONS*))
  (COMPILER#:PATCH-SOURCE-FILE "sys: PUBLIC.KERMIT; SERIAL-HOST.#"



(DEFUN DEFINE-SERIAL-HOST (&KEY (name *DEFAULT-SERIAL-HOST-NAME*)
			        (namespace *DEFAULT-SERIAL-HOST-NAMESPACE*)
				(namespace-action *DEFAULT-SERIAL-HOST-NAMESPACE-ACTION*)
				(baud *DEFAULT-SERIAL-HOST-BAUD*)
				(force-output *DEFAULT-SERIAL-HOST-FORCE-OUTPUT*)
				(number-of-data-bits *DEFAULT-SERIAL-HOST-NUMBER-OF-DATA-BITS*)
				(number-of-stop-bits *DEFAULT-SERIAL-HOST-NUMBER-OF-STOP-BITS*)
				(parity *DEFAULT-SERIAL-HOST-PARITY*)
				(xon-xoff-protocol *DEFAULT-SERIAL-HOST-XON-XOFF-PROTOCOL*)
				(ascii-characters *DEFAULT-SERIAL-HOST-ASCII-CHARACTERS*)
				(input-buffer-size *DEFAULT-SERIAL-HOST-INPUT-BUFFER-SIZE*)
				(output-buffer-size *DEFAULT-SERIAL-HOST-OUTPUT-BUFFER-SIZE*)
				(autodial-prefix *DEFAULT-SERIAL-HOST-AUTODIAL-PREFIX*)
				(autodial-number *DEFAULT-SERIAL-HOST-AUTODIAL-NUMBER*)
				(autodial? *DEFAULT-SERIAL-HOST-AUTODIAL?*)
				(script *DEFAULT-SERIAL-HOST-SCRIPT*)
				(run-script? *DEFAULT-SERIAL-HOST-RUN-SCRIPT?*)
				(protocol-converter *DEFAULT-SERIAL-HOST-PROTOCOL-CONVERTER*)
				(screen-buffer? *DEFAULT-SERIAL-HOST-SCREEN-BUFFER?*))
  "Define a named serial host in a specified namespace.  Returns the new host object.
:NAME  The name of the host being defined as requiring this particular configuration of a serial port.
:NAMESPACE  The name of the namespace in which to define this host.
:NAMESPACE-ACTION  T when the host is to be stored only in the local cache of the specified namespace;
                   NIL when the host is to be stored in the local cache and the Name Server of the namespace.
:BAUD  A serial line speed of 300, 1200, 2400, 4800, 9600, or 19200.
:FORCE-OUTPUT  T to transmit characters immediately;  NIL to transmit characters only when the buffer is full.
:NUMBER-OF-DATA-BITS  5, 6, 7, or 8 data bits per character.
:NUMBER-OF-STOP-BITS  1 or 2 stop bits per character.
:PARITY  :ODD, :EVEN, or :NONE.
:XON-XOFF-PROTOCOL  T to use XON-XOFF flow control.
:ASCII-CHARACTERS  T to automatically translate between ASCII and Explorer characters.
:INPUT-BUFFER-SIZE  Size (in words) to allocate for the input buffer.
:OUTPUT-BUFFER-SIZE  Size (in words) to allocate for the output buffer.
:AUTODIAL-PREFIX  Character sequence that activates autodial capabilities of autodial modem.
:AUTODIAL-NUMBER  Telephone number to dial.  Use a comma to insert a 1 second delay.
:Autodial?  T to automatically autodial upon connection.
:SCRIPT  The pathname of a file containing a script defined per TELNET:RUN-SCRIPT.
:RUN-SCRIPT?  T to automatically run the script upon connection.
:PROTOCOL-CONVERTER  Type of Protocol Converter connected to serial port (for use by SNA-COMM package).
                     Enter :NONE, :COMMTEX-CX-80, or :IBM-3708.
:SCREEN-BUFFER  T maintains a local character buffer for VT100 screen (required with SNA-COMM)."

  (NAME:ADD-OBJECT name
		   :host
		   :attributes (list :SYSTEM-TYPE :SERIAL-PORT
				     :SERVICES '((:LOGIN :SERIAL-STREAM :TELNET))
				     :BAUD baud
				     :FORCE-OUTPUT force-output
				     :NUMBER-OF-DATA-BITS number-of-data-bits
				     :NUMBER-OF-STOP-BITS number-of-stop-bits
				     :PARITY parity
				     :XON-XOFF-PROTOCOL xon-xoff-protocol
				     :ASCII-CHARACTERS ascii-characters
				     :INPUT-BUFFER-SIZE input-buffer-size
				     :OUTPUT-BUFFER-SIZE output-buffer-size
				     :AUTODIAL-PREFIX autodial-prefix
				     :AUTODIAL-NUMBER autodial-number
				     :AUTODIAL? autodial?
				     :SCRIPT script
				     :RUN-SCRIPT? run-script?
				     :PROTOCOL-CONVERTER protocol-converter
				     :SCREEN-BUFFER? screen-buffer?)
		   :NAMESPACE namespace
		   :LOCAL namespace-action)
  (PARSE-HOST name))


))
