Fix bug: when current message and subsequent messages simultaneously
authorChris Hanson <org/chris-hanson/cph>
Sat, 24 Jun 2000 01:39:16 +0000 (01:39 +0000)
committerChris Hanson <org/chris-hanson/cph>
Sat, 24 Jun 2000 01:39:16 +0000 (01:39 +0000)
deleted, was signalling an error, because the EXPUNGE responses were
being processed one at a time, and the local model of the folder was
out of sync with the server's model.  New strategy defers dealing with
all of these changes until all of the responses have been processed,
at which time both models are again synchronized.

v7/src/imail/imail-core.scm
v7/src/imail/imail-imap.scm
v7/src/imail/imail-top.scm

index f087baf3b3fdaec86017ec54e9c5722ecc9fd26e..30f28ff709b569db1b1549eef85e4584bbd829b0 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;; $Id: imail-core.scm,v 1.109 2000/06/23 17:58:28 cph Exp $
+;;; $Id: imail-core.scm,v 1.110 2000/06/24 01:37:54 cph Exp $
 ;;;
 ;;; Copyright (c) 1999-2000 Massachusetts Institute of Technology
 ;;;
   (apply folder-event folder type parameters))
 
 (define (folder-event folder type . parameters)
-  (if (and imap-trace-port (imap-folder? folder))
+  (if *deferred-folder-events*
+      (set-cdr! *deferred-folder-events*
+               (cons (cons* folder type parameters)
+                     (cdr *deferred-folder-events*)))
       (begin
-       (write-line (cons* 'FOLDER-EVENT folder type parameters)
-                   imap-trace-port)
-       (flush-output imap-trace-port)))
-  (event-distributor/invoke! (folder-modification-event folder)
-                            folder
-                            type
-                            parameters))
+       (if (and imap-trace-port (imap-folder? folder))
+           (begin
+             (write-line (cons* 'FOLDER-EVENT folder type parameters)
+                         imap-trace-port)
+             (flush-output imap-trace-port)))
+       (event-distributor/invoke! (folder-modification-event folder)
+                                  folder
+                                  type
+                                  parameters))))
+
+(define (with-folder-events-deferred thunk)
+  (let ((events (list 'EVENTS)))
+    (let ((v
+          (fluid-let ((*deferred-folder-events* events))
+            (thunk))))
+      (for-each (lambda (event) (apply folder-event event))
+               (reverse! (cdr events)))
+      v)))
+
+(define *deferred-folder-events* #f)
 
 (define (get-memoized-folder url)
   (let ((folder (hash-table/get memoized-folders url #f)))
index b56133f3d0f4c0524583540ae22073093bf21d27..04536bdb514237df53df9e11d39e998da128866e 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;; $Id: imail-imap.scm,v 1.125 2000/06/23 19:05:37 cph Exp $
+;;; $Id: imail-imap.scm,v 1.126 2000/06/24 01:37:56 cph Exp $
 ;;;
 ;;; Copyright (c) 1999-2000 Massachusetts Institute of Technology
 ;;;
        thunk))))
 
 (define (process-responses connection command responses)
-  (if (pair? responses)
-      (if (process-response connection command (car responses))
-         (cons (car responses)
-               (process-responses connection command (cdr responses)))
-         (process-responses connection command (cdr responses)))
-      '()))
+  (with-folder-events-deferred
+    (lambda ()
+      (if (pair? responses)
+         (if (process-response connection command (car responses))
+             (cons (car responses)
+                   (process-responses connection command (cdr responses)))
+             (process-responses connection command (cdr responses)))
+         '()))))
 \f
 (define (process-response connection command response)
   (cond ((imap:response:status-response? response)
index c3de8c82a31dd3c65b29ac136e89363b334d6799..a3a1cdeae48ff9be37da95cab624d0681c131cb6 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;; $Id: imail-top.scm,v 1.187 2000/06/24 01:35:41 cph Exp $
+;;; $Id: imail-top.scm,v 1.188 2000/06/24 01:39:16 cph Exp $
 ;;;
 ;;; Copyright (c) 1999-2000 Massachusetts Institute of Technology
 ;;;
@@ -1762,6 +1762,7 @@ Negative argument means search in reverse."
 ;;;; Folder-event handling
 
 (define (notice-folder-event folder type parameters)
+  type parameters
   (maybe-add-command-suffix! notice-folder-modifications folder))
 
 (define (notice-folder-modifications folder)