|
From: Magnus H. <leg...@us...> - 2007-08-12 22:00:43
|
Update of /cvsroot/emacs-jabber/emacs-jabber
In directory sc8-pr-cvs17:/tmp/cvs-serv9529
Modified Files:
jabber-core.el
Log Message:
Revision: ma...@fr...--2005/emacs-jabber--cvs-head--0--patch-381
Creator: Magnus Henoch <ma...@fr...>
Beautify disconnection and sentinel handling
Index: jabber-core.el
===================================================================
RCS file: /cvsroot/emacs-jabber/emacs-jabber/jabber-core.el,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- jabber-core.el 8 Aug 2007 10:58:28 -0000 1.52
+++ jabber-core.el 12 Aug 2007 22:00:38 -0000 1.53
@@ -181,8 +181,22 @@
;; `nil' is the error state. Remove the connection from the list.
(setq jabber-connections
(delq fsm jabber-connections))
+ ;; Close the network connection.
+ (let ((connection (plist-get state-data :connection)))
+ (when (processp connection)
+ (delete-process connection)))
;; Remove lost connections from the roster buffer.
(jabber-display-roster)
+ (let ((expected (plist-get state-data :disconnection-expected))
+ (reason (plist-get state-data :disconnection-reason)))
+ (unless expected
+ (run-hooks 'jabber-lost-connection-hook)
+ (message "%s@%s/%s: connection lost: `%s'"
+ (plist-get state-data :username)
+ (plist-get state-data :server)
+ (plist-get state-data :resource)
+ reason)))
+
(list state-data nil))
;; There is no `define-state' for `nil', since any message received
@@ -212,7 +226,18 @@
(:connection-failed
(message "Jabber connection failed")
- (list nil state-data))))
+ (list nil state-data))
+
+ (:do-disconnect
+ ;; We don't have the connection object, so defer the disconnection.
+ :defer)))
+
+(defsubst jabber-fsm-handle-sentinel (state-data event)
+ "Handle sentinel event for jabber fsm."
+ ;; We do the same thing for every state, so avoid code duplication.
+ (let ((string (car (cddr event))))
+ (list nil (plist-put state-data
+ :disconnection-reason string))))
(define-enter-state jabber-connection :connected
(fsm state-data)
@@ -240,8 +265,7 @@
(list :connected state-data)))
(:sentinel
- (message "Jabber connection unexpectedly closed")
- (list nil state-data))
+ (jabber-fsm-handle-sentinel state-data event))
(:stream-start
(let ((session-id (cadr event))
@@ -283,7 +307,12 @@
;; that.
(list :register-account state-data))
(t
- (list :sasl-auth (plist-put state-data :stream-features stanza))))))))
+ (list :sasl-auth (plist-put state-data :stream-features stanza))))))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
(define-enter-state jabber-connection :starttls
(fsm state-data)
@@ -300,8 +329,7 @@
(list :starttls state-data)))
(:sentinel
- (message "Jabber connection unexpectedly closed")
- (list nil state-data))
+ (jabber-fsm-handle-sentinel state-data event))
(:stanza
(if (jabber-starttls-process-input fsm (cadr event))
@@ -327,8 +355,7 @@
(list :register-account state-data)))
(:sentinel
- (message "Jabber connection unexpectedly closed")
- (list nil state-data))
+ (jabber-fsm-handle-sentinel state-data event))
(:stanza
(jabber-process-input fsm (cadr event))
@@ -350,8 +377,7 @@
(list :legacy-auth state-data)))
(:sentinel
- (message "Jabber connection unexpectedly closed")
- (list nil state-data))
+ (jabber-fsm-handle-sentinel state-data event))
(:stanza
(jabber-process-input fsm (cadr event))
@@ -385,8 +411,7 @@
(list :sasl-auth state-data)))
(:sentinel
- (message "Jabber connection unexpectedly closed")
- (list nil state-data))
+ (jabber-fsm-handle-sentinel state-data event))
(:stanza
(let ((new-sasl-data
@@ -420,8 +445,7 @@
(list :bind state-data)))
(:sentinel
- (message "Jabber connection unexpectedly closed")
- (list nil state-data))
+ (jabber-fsm-handle-sentinel state-data event))
(:stream-start
;; we wait for stream features...
@@ -508,25 +532,20 @@
(list :session-established state-data)))
(:sentinel
- (let ((process (cadr event))
- (string (car (cddr event))))
- (run-hooks 'jabber-lost-connection-hook)
- (message "%s@%s/%s: connection lost: `%s'"
- (plist-get state-data :username)
- (plist-get state-data :server)
- (plist-get state-data :resource)
- string)
- (list nil state-data)))
+ (jabber-fsm-handle-sentinel state-data event))
(:stanza
(jabber-process-input fsm (cadr event))
- (list :session-established state-data))))
+ (list :session-established state-data))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
(defun jabber-disconnect ()
"Disconnect from all Jabber servers."
(interactive)
- ;; XXX: this function is slightly out of sync with the rest of the
- ;; FSM remake.
(unless *jabber-disconnecting* ; avoid reentry
(let ((*jabber-disconnecting* t))
(dolist (c jabber-connections)
@@ -535,24 +554,17 @@
(jabber-disconnected)
(when (interactive-p)
- (message "Disconnected from Jabber server")))))
+ (message "Disconnected from Jabber server(s)")))))
(defun jabber-disconnect-one (jc &optional dont-redisplay)
"Disconnect from one Jabber server.
If DONT-REDISPLAY is non-nil, don't update roster buffer."
(interactive (list (jabber-read-account)))
;;(run-hooks 'jabber-pre-disconnect-hook)
- (let ((process (plist-get
- (fsm-get-state-data jc)
- :connection)))
- (when (and process
- (memq (process-status process) '(open run)))
- (jabber-send-string jc "</stream:stream>")
- ;; let the server close the stream
- (accept-process-output process 3)
- ;; and do it ourselves as well, just to be sure
- (delete-process process)))
- (setq jabber-connections (remq jc jabber-connections))
+ (fsm-send-sync jc :do-disconnect)
+ (when (interactive-p)
+ (message "Disconnected from %s"
+ (jabber-connection-jid jc)))
(unless dont-redisplay
(jabber-display-roster)))
|