Author: ehuelsmann Date: Tue Apr 24 16:16:50 2007 New Revision: 193
Modified: trunk/package.lisp trunk/protocol.lisp Log: Rearrange code. Make dcc-connection an abstract base class.
Modified: trunk/package.lisp ============================================================================== --- trunk/package.lisp (original) +++ trunk/package.lisp Tue Apr 24 16:16:50 2007 @@ -138,5 +138,12 @@ :users- :wallops :userhost - :ison))) + :ison + ;; DCC specific dictionary + :dcc-connection + :irc-connection + :close-on-main + :remote-user + :dcc-close + )))
Modified: trunk/protocol.lisp ============================================================================== --- trunk/protocol.lisp (original) +++ trunk/protocol.lisp Tue Apr 24 16:16:50 2007 @@ -144,6 +144,10 @@ :initform t :documentation "Messages coming back from the server are sent to this stream.") + (dcc-connections + :accessor dcc-connections + :initform '() + :documentation "The DCC connections associated with this IRC connection.") (channels :initarg :channels :accessor channels @@ -417,18 +421,43 @@ ;;
(defclass dcc-connection () - ((user - :initarg :user - :accessor user + ((irc-connection + :initarg :irc-connection + :accessor irc-connection + :initform nil + :documentation "The associated IRC connection used to send +CTCP control commands. When this connection is closed/lost, +the DCC connection should be terminated too for security reasons.") + (close-on-main + :initarg :close-on-main + :accessor close-on-main + :initform t + :documentation "Makes sure that the DCC connection is closed +as soon as either the IRC connection is actively closed or when +a lost connection is detected.") + (remote-user + :initarg :remote-user + :accessor remote-user :documentation "The user at the other end of this connection. The user at this end can be reached via your normal connection object.") + (socket + :initarg :socket + :accessor socket + :initform nil + :documentation "Socket used to do the remote client.") (network-stream :initarg :network-stream :accessor network-stream) - (output-stream - :initarg :output-stream - :accessor output-stream - :initform t))) + (client-stream + :initarg :client-stream + :accessor client-stream + :documentation "Input from the remote is sent to this stream.")) + (:documentation "Abstract superclass of all types of DCC connections. + +This class isn't meant to be instanciated. The different DCC subprotocols +differ widely in the way they transmit their data, meaning there are +relatively few methods which can be defined for this class. They do +share a number of properties though."))
(defmethod print-object ((object dcc-connection) stream) "Print the object for the Lisp reader." @@ -439,43 +468,31 @@ (hostname (user object))) "")))
-(defun make-dcc-connection (&key (user nil) - (remote-address nil) - (remote-port nil) - (output-stream t)) - (make-instance 'dcc-connection - :user user - :network-stream (usocket:socket-connect remote-address - remote-port) - :output-stream output-stream))
+;; Common generic functions + +;; argh. I want to name this quit but that gives me issues with +;; generic functions. need to resolve. (defgeneric dcc-close (connection)) +;;already defined in relation to `connection': +;; (defgeneric connectedp (connection)) + +;; CHAT related generic functions (defgeneric send-dcc-message (connection message))
-(defmethod read-message ((connection dcc-connection)) - (when (connectedp connection) - (let ((message (read-line (network-stream connection)))) - (format (output-stream connection) "~A~%" message) - (force-output (output-stream connection)) - (when *debug-p* - (format *debug-stream* "~A" (describe message))) - ;; (dcc-message-event message) - message))) ; needed because of the "loop while" in read-message-loop +;; SEND related generic functions +;;<none yet, we don't do SEND yet...>
-(defmethod send-dcc-message ((connection dcc-connection) message) - (format (network-stream connection) "~A~%" message) - (force-output (network-stream connection)))
-;; argh. I want to name this quit but that gives me issues with -;; generic functions. need to resolve. (defmethod dcc-close ((connection dcc-connection)) #+(and sbcl (not sb-thread)) (sb-sys:invalidate-descriptor (sb-sys:fd-stream-fd (network-stream connection))) (close (network-stream connection)) - (setf (user connection) nil) - (setf *dcc-connections* (remove connection *dcc-connections*)) - ) + (setf (remote-user connection) nil + *dcc-connections* (remove connection *dcc-connections*) + (dcc-connections (irc-connection connection)) + (remove connection (dcc-connections (irc-connection connection)))))
(defmethod connectedp ((connection dcc-connection)) (let ((stream (network-stream connection)))