Fix typo.
[elisp/wanderlust.git] / elmo / elmo-dop.el
index 0c278c6..b944188 100644 (file)
@@ -1,6 +1,6 @@
 ;;; elmo-dop.el -- Modules for Disconnected Operations on ELMO.
 
-;; Copyright 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
+;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 
 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
 ;; Keywords: mail, net news
@@ -42,7 +42,7 @@
 Automatically loaded/saved.")
 
 (defun elmo-dop-queue-append (folder function argument)
-  (let ((operation (list (format "%s" folder) function argument)))
+  (let ((operation (list (elmo-string folder) function argument)))
     (elmo-dop-queue-load)
     (unless (member operation elmo-dop-queue) ;; don't append same operation
       (setq elmo-dop-queue
@@ -65,7 +65,7 @@ even an operation concerns the unplugged folder."
       (setq queue (cdr queue)))
     (when (> count 0)
       (if (elmo-y-or-n-p
-          (format "%d pending operation(s) exists. Perform now?" count)
+          (format "%d pending operation(s) exists.  Perform now? " count)
           (not elmo-dop-flush-confirm) t)
          (progn
            (message "")
@@ -107,7 +107,7 @@ even an operation concerns the unplugged folder."
                    (when (and (string= func "create-folder-maybe")
                               (elmo-y-or-n-p
                                (format
-                                "Create folder %s failed. Abort creating?"
+                                "Create folder %s failed.  Abort creating? "
                                 folder)
                                (not elmo-dop-flush-confirm) t))
                      (elmo-dop-save-pending-messages folder)
@@ -119,7 +119,7 @@ even an operation concerns the unplugged folder."
                       performed num)
              (sit-for 1) ; 
              (elmo-dop-queue-save)))
-       (if (elmo-y-or-n-p "Clear all pending operations?"
+       (if (elmo-y-or-n-p "Clear all pending operations? "
                           (not elmo-dop-flush-confirm) t)
            (let ((queue elmo-dop-queue))
              (while queue
@@ -241,6 +241,25 @@ even an operation concerns the unplugged folder."
       (setq numbers (cdr numbers)))
     (cons appended deleting-msgids)))
 
+(defun elmo-dop-list-deleted (folder number-alist)
+  "List message numbers to be deleted on FOLDER from NUMBER-ALIST."
+  (elmo-dop-queue-load)
+  (let ((queue elmo-dop-queue)
+       numbers matches nalist)
+    (while queue
+      (if (and (string= (nth 0 (car queue)) folder)
+              (string= (nth 1 (car queue)) "delete-msgids"))
+         (setq numbers
+               (nconc numbers
+                      (delq nil (mapcar
+                                 (lambda (x)
+                                   (mapcar 'car
+                                           (elmo-string-rassoc-all
+                                            x number-alist)))
+                                 (nth 2 (car queue)))))))
+      (setq queue (cdr queue)))
+    (elmo-uniq-list (elmo-flatten numbers))))
+
 (defun elmo-dop-delete-msgs (folder msgs msgdb)
   (save-match-data
     (let ((folder-numbers (elmo-make-folder-numbers-list folder msgs))
@@ -272,19 +291,23 @@ even an operation concerns the unplugged folder."
   (save-match-data
     (elmo-dop-queue-append folder "prefetch-msgs" msgs)))
 
-(defun elmo-dop-list-folder (folder)
+(defun elmo-dop-list-folder (folder &optional nohide)
   (if (or (memq (elmo-folder-get-type folder)
                '(imap4 nntp pop3 filter pipe))
          (and (elmo-multi-p folder) (not (elmo-folder-local-p folder))))
       (if elmo-enable-disconnected-operation
-         (let* ((number-alist (elmo-msgdb-number-load
-                               (elmo-msgdb-expand-path folder)))
+         (let* ((path (elmo-msgdb-expand-path folder))
+                (number-alist (elmo-msgdb-number-load path))
                 (number-list (mapcar 'car number-alist))
                 (append-list (elmo-dop-append-list-load folder))
                 (append-num (length append-list))
+                (killed (and elmo-use-killed-list
+                             (elmo-msgdb-killed-list-load path)))
                 alreadies
-                (i 0)
-                max-num)
+                max-num
+                (i 0))
+           (setq killed (nconc (elmo-dop-list-deleted folder number-alist)
+                               killed))
            (while append-list
              (if (rassoc (car append-list) number-alist)
                  (setq alreadies (append alreadies
@@ -299,7 +322,7 @@ even an operation concerns the unplugged folder."
                    (append number-list
                            (list (+ max-num i 1))))
              (setq i (+ 1 i)))
-           number-list)
+           (elmo-living-messages number-list killed))
        (error "Unplugged"))
     ;; not imap4 folder...list folder
     (elmo-call-func folder "list-folder")))
@@ -313,10 +336,10 @@ even an operation concerns the unplugged folder."
        matched)
     (if (eq (elmo-folder-get-type folder) 'imap4)
        (progn
-         (while append-list
-           (if (setq matched (car (rassoc (car append-list) number-alist)))
-               (setq msgs (delete matched msgs)))
-           (setq append-list (cdr append-list)))
+;;;      (while append-list
+;;;        (if (setq matched (car (rassoc (car append-list) number-alist)))
+;;;            (setq msgs (delete matched msgs)))
+;;;        (setq append-list (cdr append-list)))
          (if msgs
              (elmo-dop-queue-append folder func-name msgs)))
       ;; maildir... XXX hard coding.....
@@ -330,7 +353,7 @@ even an operation concerns the unplugged folder."
   (if (eq (elmo-folder-get-type folder) 'imap4)
       (if elmo-enable-disconnected-operation
          (let* ((number-alist (elmo-msgdb-number-load
-                                      (elmo-msgdb-expand-path folder)))
+                               (elmo-msgdb-expand-path folder)))
                 (number-list (mapcar 'car number-alist))
                 (append-list (elmo-dop-append-list-load folder))
                 (append-num (length append-list))
@@ -363,7 +386,7 @@ even an operation concerns the unplugged folder."
        (elmo-dop-unlock-message (car append-list)))
       (setq append-list (cdr append-list))
       (elmo-dop-append-list-save folder nil)))
-  (message (format "Saving queued message in %s...done."
+  (message (format "Saving queued message in %s...done"
                   elmo-lost+found-folder)))
 
 (defun elmo-dop-flush-pending-append-operations (folder &optional appends resume)
@@ -388,22 +411,28 @@ even an operation concerns the unplugged folder."
          (setq appendings (cdr appendings)))
        (elmo-dop-append-list-save folder resumed-list t)))
     (while appendings
-      (setq failure nil)
-      (setq file-string (elmo-get-file-string  ; message string
-                        (elmo-cache-get-path
-                         (car appendings))))
-      (when file-string
-       (condition-case ()
-           (elmo-append-msg folder file-string (car appendings))
-         (quit  (setq failure t))
-         (error (setq failure t)))
-       (setq i (+ 1 i))
-       (message (format "Appending queued messages...%d" i))
-       (if failure
-           (elmo-append-msg elmo-lost+found-folder
-                            file-string (car appendings))))
-      (elmo-dop-unlock-message (car appendings))
-      (setq appendings (cdr appendings)))
+      (let* ((seen-list (elmo-msgdb-seen-load
+                        (elmo-msgdb-expand-path folder))))
+       (setq failure nil)
+       (setq file-string (elmo-get-file-string  ; message string
+                          (elmo-cache-get-path
+                           (car appendings))))
+       (when file-string
+         (condition-case ()
+             (setq failure (not 
+                            (elmo-append-msg 
+                             folder file-string (car appendings) nil
+                             (not (member (car appendings) seen-list)))))
+           (quit  (setq failure t))
+           (error (setq failure t)))
+         (setq i (+ 1 i))
+         (message (format "Appending queued messages...%d" i))
+         (if failure
+             (elmo-append-msg elmo-lost+found-folder
+                              file-string (car appendings) nil
+                              (not (member (car appendings) seen-list)))))
+       (elmo-dop-unlock-message (car appendings))
+       (setq appendings (cdr appendings))))
     ;; All pending append operation is flushed.
     (elmo-dop-append-list-save folder nil)
     (elmo-commit folder)
@@ -414,13 +443,14 @@ even an operation concerns the unplugged folder."
        (setq elmo-dop-queue (delete (list folder "append-operations" nil)
                                     elmo-dop-queue))
        (elmo-dop-queue-save))))
-  (message "Appending queued messages...done."))
+  (message "Appending queued messages...done"))
 
 (defun elmo-dop-folder-exists-p (folder)
-  (if (and elmo-enable-disconnected-operation
-          (eq (elmo-folder-get-type folder) 'imap4))
-      (file-exists-p (elmo-msgdb-expand-path folder))
-    (elmo-call-func folder "folder-exists-p")))
+  (or (file-exists-p (elmo-msgdb-expand-path folder))
+      (if (and elmo-enable-disconnected-operation
+              (eq (elmo-folder-get-type folder) 'imap4))
+         (file-exists-p (elmo-msgdb-expand-path folder))
+       (elmo-call-func folder "folder-exists-p"))))
 
 (defun elmo-dop-create-folder (folder)
   (if (eq (elmo-folder-get-type folder) 'imap4)
@@ -537,11 +567,12 @@ even an operation concerns the unplugged folder."
                      (setq mark-alist
                            (elmo-msgdb-mark-append
                             mark-alist (car numlist) gmark)))))
-             (setq i (1+ i))
-             (setq percent (/ (* i 100) num))
-             (elmo-display-progress
-              'elmo-dop-msgdb-create-as-numlist "Creating msgdb..."
-              percent)
+             (when (> num elmo-display-progress-threshold)
+               (setq i (1+ i))
+               (setq percent (/ (* i 100) num))
+               (elmo-display-progress
+                'elmo-dop-msgdb-create-as-numlist "Creating msgdb..."
+                percent))
              (setq numlist (cdr numlist)))
            (list overview number-alist mark-alist))
        (error "Unplugged"))
@@ -549,6 +580,7 @@ even an operation concerns the unplugged folder."
     (elmo-call-func folder "msgdb-create" numlist new-mark already-mark
                    seen-mark important-mark seen-list)))
 
-(provide 'elmo-dop)
+(require 'product)
+(product-provide (provide 'elmo-dop) (require 'elmo-version))
 
 ;;; elmo-dop.el ends here