emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/xelb b75641b 2/2: Split connection filter


From: Chris Feng
Subject: [elpa] externals/xelb b75641b 2/2: Split connection filter
Date: Thu, 11 Aug 2016 12:19:43 +0000 (UTC)

branch: externals/xelb
commit b75641bf62f9a92208c23f855cba66c676b4c04f
Author: Chris Feng <address@hidden>
Commit: Chris Feng <address@hidden>

    Split connection filter
    
    * xcb.el (xcb:-connection-filter, xcb:-connection-setup-filter): Split
    out connection setup code from the former into the latter.
    (xcb:-connect): Set process filter to `xcb:-connection-setup-filter'.
---
 xcb.el |   79 +++++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 43 insertions(+), 36 deletions(-)

diff --git a/xcb.el b/xcb.el
index b4e3474..5a75714 100644
--- a/xcb.el
+++ b/xcb.el
@@ -200,7 +200,7 @@
     (set-process-plist process
                        (plist-put (process-plist process) 'connection obj))
     (set-process-coding-system process 'binary 'binary)
-    (set-process-filter process 'xcb:-connection-filter)
+    (set-process-filter process #'xcb:-connection-setup-filter)
     (process-send-string                ;send setup packet
      process
      (apply #'unibyte-string
@@ -223,6 +223,47 @@
 
 (defconst xcb:-SEQUENCE-SEGMENT-MASK (lognot #xFFFF))
 
+(defun xcb:-connection-setup-filter (process message)
+  "Process filter used during connection setup."
+  (let* ((connection (plist-get (process-plist process) 'connection))
+         (cache (vconcat (slot-value connection 'message-cache) message)))
+    (setf (slot-value connection 'message-cache) cache)
+    (unless (or (slot-value connection 'lock)
+                ;; Shorter than the setup header.
+                (> 8 (length cache)))
+      (setf (slot-value connection 'lock) t)
+      (let ((data-len (+ 8 (* 4 (if xcb:lsb
+                                    (xcb:-unpack-u2-lsb cache 6)
+                                  (xcb:-unpack-u2 cache 6)))))
+            obj)
+        (when (>= (length cache) data-len)
+          (xcb:-log "Setup response: %s" cache)
+          (pcase (aref cache 0)
+            (0
+             ;; Connection failed.
+             (setq obj (make-instance 'xcb:SetupFailed))
+             (xcb:unmarshal obj cache)
+             (setq cache (substring cache data-len))
+             (error "[XELB] Connection failed: %s" (slot-value obj 'reason)))
+            (1
+             ;; Connection established.
+             (setf (slot-value connection 'message-cache) [])
+             (set-process-filter process #'xcb:-connection-filter)
+             (setq obj (make-instance 'xcb:Setup))
+             (xcb:unmarshal obj cache)
+             (setq cache (substring cache data-len))
+             (setf (slot-value connection 'setup-data) obj)
+             (setf (slot-value connection 'connected) t))
+            (2
+             ;; Authentication required.
+             (setq obj (make-instance 'xcb:SetupAuthenticate))
+             (xcb:unmarshal obj cache)
+             (setq cache (substring cache data-len))
+             (error "[XELB] Authentication not supported: %s"
+                    (slot-value obj 'reason)))
+            (x (error "Unrecognized setup status: %d" x)))))
+      (setf (slot-value connection 'lock) nil))))
+
 (cl-defmethod xcb:-convert-sequence ((obj xcb:connection) sequence16)
   "Convert 16-bit sequence number SEQUENCE16 (read from a packet).
 
@@ -249,43 +290,9 @@ Concurrency is disabled as it breaks the orders of errors, 
replies and events."
          (cache (vconcat (slot-value connection 'message-cache) message))
          (cache-length (length cache)))
     (setf (slot-value connection 'message-cache) cache)
-    (catch 'return
-      ;; Queue message when locked
-      (when (slot-value connection 'lock)
-        (throw 'return 'lock))
+    (unless (slot-value connection 'lock)
       ;; Start parsing message
       (setf (slot-value connection 'lock) t)
-      ;; Connection setup
-      (unless (slot-value connection 'connected)
-        (when (<= 8 (length cache)) ;at least setup header is available
-          (let ((data-len (+ 8 (* 4 (funcall (if xcb:lsb #'xcb:-unpack-u2-lsb
-                                               #'xcb:-unpack-u2)
-                                             cache 6))))
-                obj)
-            (when (>= (length cache) data-len)
-              (xcb:-log "Setup response: %s" cache)
-              (pcase (aref cache 0)
-                (0                      ;failed
-                 (setq obj (make-instance 'xcb:SetupFailed))
-                 (xcb:unmarshal obj cache)
-                 (setq cache (substring cache data-len))
-                 (error "[XELB] Connection failed: %s"
-                        (slot-value obj 'reason)))
-                (1                      ;success
-                 (setq obj (make-instance 'xcb:Setup))
-                 (xcb:unmarshal obj cache)
-                 (setq cache (substring cache data-len))
-                 (setf (slot-value connection 'setup-data) obj)
-                 (setf (slot-value connection 'connected) t))
-                (2                      ;authentication
-                 (setq obj (make-instance 'xcb:SetupAuthenticate))
-                 (xcb:unmarshal obj cache)
-                 (setq cache (substring cache data-len))
-                 (error "[XELB] Authentication not supported: %s"
-                        (slot-value obj 'reason)))
-                (x (error "Unrecognized setup status: %d" x))))))
-        (setf (slot-value connection 'lock) nil)
-        (throw 'return 'setup))
       ;; Process error/reply/event
       (catch 'break
         (while (<= 32 (length cache))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]