;; ;;;;;;; session ;; (defclass session (subserver) ( (interpreter :accessor interpreter :initform nil :initarg :interpreter) (socket-object :accessor socket-object :initform nil :initarg :socket-object) (buffer :accessor buffer :initform (make-array 0 :fill-pointer 0 :element-type 'character :adjustable T)) ) ) (defmethod initialize-instance :after ((asession session) &rest foo) ;; should probably negotiate telnet options here ;; char at a time mode please! (let ((mysocket (socket-object asession)) (tempchar nil)) (write-char (code-char 255) mysocket) (write-char (code-char 253) mysocket) (write-char (code-char 3) mysocket) (if (= (char-code (setq tempchar (read-char mysocket))) 255) (if (and (= (char-code (read-char mysocket)) 251) (= (char-code (read-char mysocket)) 3)) (progn (write-char (code-char 255) mysocket) (write-char (code-char 253) mysocket) (write-char (code-char 3) mysocket) ) ) (unread-char tempchar mysocket) ;;else ) ) ) (defmethod event ((asession session)) ;; this is the meta session, that collects input into a buffer (if (listen (socket-object asession)) (let ((achar (read-char (socket-object asession)))) (if achar (progn (vector-push-extend (character achar) (buffer asession) 1) (prin1 (format nil "~D" (char-code achar))) ) ) ) ) (list asession) )