Revert last commit (I'm sorry it was my mistake).
authorteranisi <teranisi>
Thu, 12 Dec 2002 02:00:22 +0000 (02:00 +0000)
committerteranisi <teranisi>
Thu, 12 Dec 2002 02:00:22 +0000 (02:00 +0000)
26 files changed:
elmo/elmo-archive.el
elmo/elmo-cache.el
elmo/elmo-dop.el
elmo/elmo-filter.el
elmo/elmo-imap4.el
elmo/elmo-localdir.el
elmo/elmo-maildir.el
elmo/elmo-map.el
elmo/elmo-mark.el
elmo/elmo-msgdb.el
elmo/elmo-multi.el
elmo/elmo-net.el
elmo/elmo-nmz.el
elmo/elmo-nntp.el
elmo/elmo-pipe.el
elmo/elmo-pop3.el
elmo/elmo-sendlog.el
elmo/elmo-shimbun.el
elmo/elmo-util.el
elmo/elmo.el
wl/wl-expire.el
wl/wl-folder.el
wl/wl-highlight.el
wl/wl-summary.el
wl/wl-thread.el
wl/wl-vars.el

index 06fb518..5d86809 100644 (file)
@@ -607,7 +607,8 @@ TYPE specifies the archiver's symbol."
             nil))))))
 
 (luna-define-method elmo-folder-append-messages :around
-  ((folder elmo-archive-folder) src-folder numbers &optional same-number)
+  ((folder elmo-archive-folder) src-folder numbers unread-marks
+   &optional same-number)
   (let ((prefix (elmo-archive-folder-archive-prefix-internal folder)))
     (cond
      ((and same-number
@@ -900,7 +901,9 @@ TYPE specifies the archiver's symbol."
       (elmo-archive-msgdb-create-entity-subr number))))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-archive-folder)
-                                             numbers seen-list)
+                                             numbers new-mark
+                                             already-mark seen-mark
+                                             important-mark seen-list)
   (when numbers
     (save-excursion ;; 981005
       (if (and elmo-archive-use-izip-agent
@@ -908,11 +911,17 @@ TYPE specifies the archiver's symbol."
                (elmo-archive-folder-archive-type-internal folder)
                'cat-headers))
          (elmo-archive-msgdb-create-as-numlist-subr2
-          folder numbers seen-list)
+          folder numbers new-mark already-mark seen-mark important-mark
+          seen-list)
        (elmo-archive-msgdb-create-as-numlist-subr1
-        folder numbers seen-list)))))
+        folder numbers new-mark already-mark seen-mark important-mark
+        seen-list)))))
 
-(defun elmo-archive-msgdb-create-as-numlist-subr1 (folder numlist seen-list)
+(defun elmo-archive-msgdb-create-as-numlist-subr1 (folder
+                                                  numlist new-mark
+                                                  already-mark seen-mark
+                                                  important-mark
+                                                  seen-list)
   (let* ((type (elmo-archive-folder-archive-type-internal folder))
         (file (elmo-archive-get-archive-name folder))
         (method (elmo-archive-get-method type 'cat))
@@ -945,10 +954,10 @@ TYPE specifies the archiver's symbol."
                             (elmo-file-cache-get message-id))
                            (if seen
                                nil
-                             elmo-msgdb-unread-cached-mark)
+                             already-mark)
                          (if seen
-                             elmo-msgdb-read-uncached-mark
-                           elmo-msgdb-new-mark))))
+                             seen-mark
+                           new-mark))))
              (setq mark-alist
                    (elmo-msgdb-mark-append
                     mark-alist
@@ -966,7 +975,9 @@ TYPE specifies the archiver's symbol."
 
 ;;; info-zip agent
 (defun elmo-archive-msgdb-create-as-numlist-subr2 (folder
-                                                  numlist
+                                                  numlist new-mark
+                                                  already-mark seen-mark
+                                                  important-mark
                                                   seen-list)
   (let* ((delim1 elmo-mmdf-delimiter)          ;; MMDF
         (delim2 elmo-unixmail-delimiter)       ;; UNIX Mail
@@ -1000,7 +1011,10 @@ TYPE specifies the archiver's symbol."
        (goto-char (point-min))
        (cond
         ((looking-at delim1)   ;; MMDF
-         (setq result (elmo-archive-parse-mmdf msgs seen-list))
+         (setq result (elmo-archive-parse-mmdf msgs
+                                               new-mark
+                                               already-mark seen-mark
+                                               seen-list))
          (setq overview (append overview (nth 0 result)))
          (setq number-alist (append number-alist (nth 1 result)))
          (setq mark-alist (append mark-alist (nth 2 result))))
@@ -1019,7 +1033,10 @@ TYPE specifies the archiver's symbol."
           percent))))
     (list overview number-alist mark-alist)))
 
-(defun elmo-archive-parse-mmdf (msgs seen-list)
+(defun elmo-archive-parse-mmdf (msgs new-mark
+                                    already-mark
+                                    seen-mark
+                                    seen-list)
   (let ((delim elmo-mmdf-delimiter)
        number sp ep rest entity overview number-alist mark-alist ret-val
        message-id seen gmark)
@@ -1052,17 +1069,16 @@ TYPE specifies the archiver's symbol."
                             (elmo-file-cache-get message-id))
                            (if seen
                                nil
-                             elmo-msgdb-unread-cached-mark)
+                             already-mark)
                          (if seen
-                             elmo-msgdb-read-uncached-mark
-                           elmo-msgdb-new-mark))))
+                             seen-mark
+                           new-mark))))
              (setq mark-alist
                    (elmo-msgdb-mark-append
                     mark-alist
                     (elmo-msgdb-overview-entity-get-number entity)
                     gmark)))
-         (setq ret-val (append ret-val (list overview number-alist
-                                             mark-alist)))
+         (setq ret-val (append ret-val (list overview number-alist mark-alist)))
          (widen)))
       (forward-line 1)
       (setq rest (cdr rest)))
index 5efac75..67d80b7 100644 (file)
    (elmo-cache-folder-directory-internal folder)))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-cache-folder)
-                                             numbers seen-list)
+                                             numbers new-mark
+                                             already-mark seen-mark
+                                             important-mark
+                                             seen-list)
   (let ((i 0)
        (len (length numbers))
        overview number-alist mark-alist entity message-id
                                     num
                                     message-id))
        (if (setq mark (or (elmo-msgdb-global-mark-get message-id)
-                          (if (member message-id seen-list) nil
-                            elmo-msgdb-new-mark)))
+                          (if (member message-id seen-list) nil new-mark)))
            (setq mark-alist
                  (elmo-msgdb-mark-append
                   mark-alist
 (luna-define-method elmo-message-file-p ((folder elmo-cache-folder) number)
   t)
 
+;;; To override elmo-map-folder methods.
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-cache-folder) unread-marks &optional mark-alist)
+  t)
+
+(luna-define-method elmo-folder-unmark-important ((folder elmo-cache-folder)
+                                                 numbers)
+  t)
+
+(luna-define-method elmo-folder-mark-as-important ((folder elmo-cache-folder)
+                                                  numbers)
+  t)
+
+(luna-define-method elmo-folder-unmark-read ((folder elmo-cache-folder)
+                                            numbers)
+  t)
+
+(luna-define-method elmo-folder-mark-as-read ((folder elmo-cache-folder)
+                                             numbers)
+  t)
+
 (require 'product)
 (product-provide (provide 'elmo-cache) (require 'elmo-version))
 
index b826d07..2ea9ebd 100644 (file)
@@ -66,9 +66,7 @@ Automatically loaded/saved.")
   '(elmo-folder-mark-as-read
     elmo-folder-unmark-read
     elmo-folder-mark-as-important
-    elmo-folder-unmark-important
-    elmo-folder-mark-as-answered
-    elmo-folder-unmark-answered))
+    elmo-folder-unmark-important))
 
 (defvar elmo-dop-queue-method-name-alist
   '((elmo-folder-append-buffer-dop-delayed . "Append")
@@ -77,8 +75,6 @@ Automatically loaded/saved.")
     (elmo-folder-create-dop-delayed . "Create")
     (elmo-folder-mark-as-read . "Read")
     (elmo-folder-unmark-read . "Unread")
-    (elmo-folder-mark-as-answered . "Answered")
-    (elmo-folder-unmark-answered . "Unanswered")    
     (elmo-folder-mark-as-important . "Important")
     (elmo-folder-unmark-important . "Unimportant")))
 
@@ -278,12 +274,6 @@ FOLDER is the folder structure."
 (defsubst elmo-folder-unmark-important-dop (folder numbers)
   (elmo-dop-queue-append folder 'elmo-folder-unmark-important (list numbers)))
 
-(defsubst elmo-folder-mark-as-answered-dop (folder numbers)
-  (elmo-dop-queue-append folder 'elmo-folder-mark-as-answered (list numbers)))
-
-(defsubst elmo-folder-unmark-answered-dop (folder numbers)
-  (elmo-dop-queue-append folder 'elmo-folder-unmark-answered (list numbers)))
-
 ;;; Execute as subsutitute for plugged operation.
 (defun elmo-folder-status-dop (folder)
   (let* ((number-alist (elmo-msgdb-number-load
index 7852793..11b4cbd 100644 (file)
@@ -33,7 +33,7 @@
 ;;; ELMO filter folder
 (eval-and-compile
   (luna-define-class elmo-filter-folder (elmo-folder)
-                    (condition target require-msgdb))
+                    (condition target))
   (luna-define-internal-accessors 'elmo-filter-folder))
 
 (luna-define-method elmo-folder-initialize ((folder elmo-filter-folder)
         folder
         (elmo-make-folder (elmo-match-string 1 (cdr pair))))
       (error "Folder syntax error `%s'" (elmo-folder-name-internal folder)))
-    (elmo-filter-folder-set-require-msgdb-internal
-     folder
-     (elmo-folder-search-requires-msgdb-p
-      (elmo-filter-folder-target-internal folder)
-      (elmo-filter-folder-condition-internal folder)))
     folder))
 
-;(luna-define-method elmo-folder-open-internal ((folder elmo-filter-folder))
-;  (elmo-folder-open-internal (elmo-filter-folder-target-internal folder)))
-
-(luna-define-method elmo-folder-msgdb :around ((folder elmo-filter-folder))
-  ;; Load target's msgdb if required.
-  (if (elmo-filter-folder-require-msgdb-internal folder)
-      (elmo-folder-msgdb (elmo-filter-folder-target-internal folder)))
-  ;; Load msgdb of itself.
-  (luna-call-next-method))
+(luna-define-method elmo-folder-open-internal ((folder elmo-filter-folder))
+  (elmo-folder-open-internal (elmo-filter-folder-target-internal folder)))
 
 (luna-define-method elmo-folder-check ((folder elmo-filter-folder))
-  (elmo-folder-synchronize (elmo-filter-folder-target-internal folder)))
+  (elmo-folder-check (elmo-filter-folder-target-internal folder)))
 
 (luna-define-method elmo-folder-close-internal ((folder elmo-filter-folder))
   (elmo-folder-close-internal (elmo-filter-folder-target-internal folder)))
 
-(luna-define-method elmo-folder-close :around ((folder elmo-filter-folder))
-  ;; Save target msgdb if it is used.
-  (if (elmo-filter-folder-require-msgdb-internal folder)
-      (elmo-folder-close (elmo-filter-folder-target-internal folder)))
-  (luna-call-next-method))
-
-(luna-define-method elmo-folder-commit :around ((folder elmo-filter-folder))
-  ;; Save target msgdb if it is used.
-  (if (elmo-filter-folder-require-msgdb-internal folder)
-      (elmo-folder-commit (elmo-filter-folder-target-internal folder)))
-  (luna-call-next-method))
-
 (luna-define-method elmo-folder-expand-msgdb-path ((folder
                                                    elmo-filter-folder))
   (expand-file-name
    type))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-filter-folder)
-                                             numlist seen-list)
-  (let* ((target-folder (elmo-filter-folder-target-internal folder))
-        (len (length numlist))
-        (msgdb (elmo-folder-msgdb target-folder))
-        overview number-alist mark-alist message-id entity)
-    (when (> len elmo-display-progress-threshold)
-      (elmo-progress-set 'elmo-folder-msgdb-create
-                        len "Creating msgdb..."))
-    (unwind-protect
-       (dolist (number numlist)
-         (setq entity (elmo-msgdb-overview-get-entity number msgdb))
-         (when entity
-           (setq overview (elmo-msgdb-append-element overview entity)
-                 message-id (elmo-msgdb-overview-entity-get-id entity)
-                 number-alist (elmo-msgdb-number-add number-alist
-                                                     number
-                                                     message-id)
-                 mark-alist (elmo-msgdb-mark-append
-                             mark-alist
-                             number
-                             (elmo-msgdb-get-mark msgdb number))))
-         (elmo-progress-notify 'elmo-folder-msgdb-create))
-      (elmo-progress-clear 'elmo-folder-msgdb-create))
-    (list overview number-alist mark-alist)))
+                                             numlist new-mark already-mark
+                                             seen-mark important-mark
+                                             seen-list)
+  (let ((target-folder (elmo-filter-folder-target-internal folder)))
+    (if (elmo-folder-plugged-p target-folder)
+       (elmo-folder-msgdb-create target-folder
+                                 numlist
+                                 new-mark
+                                 already-mark
+                                 seen-mark important-mark seen-list)
+      ;; Copy from msgdb of target folder if it is unplugged.
+      (let ((len (length numlist))
+           (msgdb (elmo-folder-msgdb target-folder))
+           overview number-alist mark-alist
+           message-id seen gmark)
+       (when (> len elmo-display-progress-threshold)
+         (elmo-progress-set 'elmo-folder-msgdb-create
+                            len "Creating msgdb..."))
+       (unwind-protect
+           (dolist (number numlist)
+             (let ((entity (elmo-msgdb-overview-get-entity number msgdb)))
+               (when entity
+                 (setq entity (elmo-msgdb-copy-overview-entity entity)
+                       overview (elmo-msgdb-append-element overview entity)
+                       message-id (elmo-msgdb-overview-entity-get-id entity)
+                       number-alist (elmo-msgdb-number-add number-alist
+                                                           number
+                                                           message-id)
+                       seen (member message-id seen-list))
+                 (if (setq gmark (or (elmo-msgdb-global-mark-get message-id)
+                                     (if (elmo-file-cache-exists-p message-id)
+                                         (if seen
+                                             nil
+                                           already-mark)
+                                       (if seen
+                                           nil ;;seen-mark
+                                         new-mark))))
+                     (setq mark-alist
+                           (elmo-msgdb-mark-append
+                            mark-alist
+                            number
+                            gmark)))))
+             (elmo-progress-notify 'elmo-folder-msgdb-create))
+         (elmo-progress-clear 'elmo-folder-msgdb-create))
+       (list overview number-alist mark-alist)))))
 
 (luna-define-method elmo-folder-append-buffer ((folder elmo-filter-folder)
                                               unread &optional number)
       ;; not available
       t)))
 
-(defsubst elmo-filter-folder-list-unreads (folder)
-  (elmo-list-filter
-   (elmo-folder-list-messages folder nil 'in-msgdb)
-   (elmo-folder-list-unreads
-    (elmo-filter-folder-target-internal folder))))
-
-(luna-define-method elmo-folder-list-unreads ((folder elmo-filter-folder))
-  (elmo-filter-folder-list-unreads folder))
-
-(defsubst elmo-filter-folder-list-importants (folder)
-  (elmo-uniq-list
-   (nconc
+(defsubst elmo-filter-folder-list-unreads-internal (folder unread-marks
+                                                          mark-alist)
+  (let ((unreads (elmo-folder-list-unreads-internal
+                 (elmo-filter-folder-target-internal folder)
+                 unread-marks
+                 (or mark-alist
+                     (elmo-msgdb-get-mark-alist
+                      (elmo-folder-msgdb folder))))))
+    (unless (listp unreads)
+      (setq unreads
+           (delq nil
+                 (mapcar
+                  (function
+                   (lambda (x)
+                     (if (member (cadr x) unread-marks)
+                         (car x))))
+                  (elmo-msgdb-get-mark-alist (elmo-folder-msgdb folder))))))
     (elmo-list-filter
-     (elmo-folder-list-messages folder nil 'in-msgdb)
-     (elmo-folder-list-importants
-      (elmo-filter-folder-target-internal folder)))
-    (elmo-folder-list-messages-with-global-mark
-     folder elmo-msgdb-important-mark))))
+     (mapcar 'car (elmo-msgdb-get-number-alist
+                  (elmo-folder-msgdb folder)))
+     unreads)))
+
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-filter-folder)
+   unread-marks &optional mark-alist)
+  (elmo-filter-folder-list-unreads-internal folder unread-marks mark-alist))
+
+(defsubst elmo-filter-folder-list-importants-internal (folder important-mark)
+  (let ((importants (elmo-folder-list-importants-internal
+                    (elmo-filter-folder-target-internal folder)
+                    important-mark)))
+    (if (listp importants)
+       (elmo-list-filter
+        (mapcar 'car (elmo-msgdb-get-number-alist
+                      (elmo-folder-msgdb folder)))
+        importants)
+      t)))
 
-(luna-define-method elmo-folder-list-importants ((folder elmo-filter-folder))
-  (elmo-filter-folder-list-importants folder))
+(luna-define-method elmo-folder-list-importants-internal
+  ((folder elmo-filter-folder)
+   important-mark)
+  (elmo-filter-folder-list-importants-internal folder important-mark))
 
 (luna-define-method elmo-folder-list-subfolders ((folder elmo-filter-folder)
                                                 &optional one-level)
   (elmo-message-file-name (elmo-filter-folder-target-internal folder)
                          number))
 
-(luna-define-method elmo-folder-mark-as-read :around ((folder
-                                                      elmo-filter-folder)
-                                                     numbers)
+(luna-define-method elmo-folder-mark-as-read ((folder elmo-filter-folder)
+                                             numbers)
   (elmo-folder-mark-as-read (elmo-filter-folder-target-internal folder)
-                           numbers)
-  (luna-call-next-method))
+                           numbers))
 
-(luna-define-method elmo-folder-unmark-read :around ((folder
-                                                     elmo-filter-folder)
-                                                    numbers)
+(luna-define-method elmo-folder-unmark-read ((folder elmo-filter-folder)
+                                             numbers)
   (elmo-folder-unmark-read (elmo-filter-folder-target-internal folder)
-                          numbers)
-  (luna-call-next-method))
+                          numbers))
 
-(luna-define-method elmo-folder-mark-as-important :around ((folder
-                                                           elmo-filter-folder)
-                                                          numbers)
+(luna-define-method elmo-folder-mark-as-important ((folder elmo-filter-folder)
+                                                  numbers)
   (elmo-folder-mark-as-important (elmo-filter-folder-target-internal folder)
-                                numbers)
-    (luna-call-next-method))
+                                numbers))
 
-
-(luna-define-method elmo-folder-unmark-important :around ((folder
-                                                          elmo-filter-folder)
-                                                         numbers)
+(luna-define-method elmo-folder-unmark-important ((folder elmo-filter-folder)
+                                                 numbers)
   (elmo-folder-unmark-important (elmo-filter-folder-target-internal folder)
-                               numbers)
-  (luna-call-next-method))
-
-(luna-define-method elmo-folder-mark-as-answered :around ((folder
-                                                          elmo-filter-folder)
-                                                         numbers)
-  (elmo-folder-mark-as-answered (elmo-filter-folder-target-internal folder)
-                               numbers)
-  (luna-call-next-method))
-
-
-(luna-define-method elmo-folder-unmark-answered :around ((folder
-                                                         elmo-filter-folder)
-                                                        numbers)
-  (elmo-folder-unmark-answered (elmo-filter-folder-target-internal folder)
-                              numbers)
-  (luna-call-next-method))
+                               numbers))
+
 
 (require 'product)
 (product-provide (provide 'elmo-filter) (require 'elmo-version))
index 17e24ec..f0d1f7a 100644 (file)
@@ -770,16 +770,18 @@ If CHOP-LENGTH is not specified, message set is not chopped."
 
 ;;
 ;; app-data:
-;; cons of seen-list and result of use-flag-p.
+;; cons of list
+;; 0: new-mark 1: already-mark 2: seen-mark 3: important-mark
+;; 4: seen-list
+;; and result of use-flag-p.
 (defsubst elmo-imap4-fetch-callback-1-subr (entity flags app-data)
   "A msgdb entity callback function."
   (let* ((use-flag (cdr app-data))
         (app-data (car app-data))
-        (seen (member (car entity) app-data))
+        (seen (member (car entity) (nth 4 app-data)))
         mark)
     (if (member "\\Flagged" flags)
-       (elmo-msgdb-global-mark-set (car entity)
-                                   elmo-msgdb-important-mark))
+       (elmo-msgdb-global-mark-set (car entity) (nth 3 app-data)))
     (if (setq mark (elmo-msgdb-global-mark-get (car entity)))
        (unless (member "\\Seen" flags)
          (setq elmo-imap4-seen-messages
@@ -792,13 +794,13 @@ If CHOP-LENGTH is not specified, message set is not chopped."
                                 (and use-flag
                                      (member "\\Seen" flags)))
                             nil
-                          elmo-msgdb-unread-cached-mark)
+                          (nth 1 app-data))
                       (if (or seen
                               (and use-flag
                                    (member "\\Seen" flags)))
                           (if elmo-imap4-use-cache
-                              elmo-msgdb-read-uncached-mark)
-                        elmo-msgdb-new-mark)))))
+                              (nth 2 app-data))
+                        (nth 0 app-data))))))
     (setq elmo-imap4-current-msgdb
          (elmo-msgdb-append
           elmo-imap4-current-msgdb
@@ -1859,10 +1861,6 @@ Return nil if no complete line has arrived."
   ((folder elmo-imap4-folder))
   (elmo-imap4-list folder "flagged"))
 
-(luna-define-method elmo-folder-list-answereds-plugged
-  ((folder elmo-imap4-folder))
-  (elmo-imap4-list folder "answered"))
-
 (luna-define-method elmo-folder-use-flag-p ((folder elmo-imap4-folder))
   (not (string-match elmo-imap4-disuse-server-flag-mailbox-regexp
                     (elmo-imap4-folder-mailbox-internal folder))))
@@ -2077,7 +2075,7 @@ If optional argument REMOVE is non-nil, remove FLAG."
 (defun elmo-imap4-search-internal-primitive (folder session filter from-msgs)
   (let ((search-key (elmo-filter-key filter))
        (imap-search-keys '("bcc" "body" "cc" "from" "subject" "to"
-                           "larger" "smaller" "status"))
+                           "larger" "smaller"))
        (total 0)
        (length (length from-msgs))
        charset set-list end results)
@@ -2095,12 +2093,6 @@ If optional argument REMOVE is non-nil, remove FLAG."
                           numbers)))
        (mapcar '(lambda (x) (delete x numbers)) rest)
        numbers))
-     ((string= "status" search-key)
-      (cond
-       ((string= "unread" (elmo-filter-value filter))
-       (elmo-folder-list-unreads folder))
-       ((string= "unread" (elmo-filter-value filter))
-       (elmo-folder-list-importants folder))))
      ((or (string= "since" search-key)
          (string= "before" search-key))
       (setq search-key (concat "sent" search-key)
@@ -2228,7 +2220,7 @@ If optional argument REMOVE is non-nil, remove FLAG."
     (luna-call-next-method)))
 
 (luna-define-method elmo-folder-msgdb-create-plugged
-  ((folder elmo-imap4-folder) numbers seen-list)
+  ((folder elmo-imap4-folder) numbers &rest args)
   (when numbers
     (let ((session (elmo-imap4-get-session folder))
          (headers
@@ -2253,7 +2245,7 @@ If optional argument REMOVE is non-nil, remove FLAG."
        (setq elmo-imap4-current-msgdb nil
              elmo-imap4-seen-messages nil
              elmo-imap4-fetch-callback 'elmo-imap4-fetch-callback-1
-             elmo-imap4-fetch-callback-data (cons seen-list
+             elmo-imap4-fetch-callback-data (cons args
                                                   (elmo-folder-use-flag-p
                                                    folder)))
        (while set-list
@@ -2293,14 +2285,6 @@ If optional argument REMOVE is non-nil, remove FLAG."
   ((folder elmo-imap4-folder) numbers)
   (elmo-imap4-set-flag folder numbers "\\Seen"))
 
-(luna-define-method elmo-folder-unmark-answered-plugged
-  ((folder elmo-imap4-folder) numbers)
-  (elmo-imap4-set-flag folder numbers "\\Answered" 'remove))
-
-(luna-define-method elmo-folder-mark-as-answered-plugged
-  ((folder elmo-imap4-folder) numbers)
-  (elmo-imap4-set-flag folder numbers "\\Answered"))
-
 (luna-define-method elmo-message-use-cache-p ((folder elmo-imap4-folder)
                                              number)
   elmo-imap4-use-cache)
@@ -2509,7 +2493,8 @@ If optional argument REMOVE is non-nil, remove FLAG."
                     (elmo-net-folder-user-internal (, folder2)))))))
 
 (luna-define-method elmo-folder-append-messages :around
-  ((folder elmo-imap4-folder) src-folder numbers &optional same-number)
+  ((folder elmo-imap4-folder) src-folder numbers unread-marks
+   &optional same-number)
   (if (and (eq (elmo-folder-type-internal src-folder) 'imap4)
           (elmo-imap4-identical-system-p folder src-folder)
           (elmo-folder-plugged-p folder))
@@ -2600,10 +2585,7 @@ If optional argument REMOVE is non-nil, remove FLAG."
       (goto-char (point-min))
       (std11-field-body (symbol-name field)))))
 
-(luna-define-method elmo-folder-search-requires-msgdb-p ((folder
-                                                         elmo-imap4-folder)
-                                                        condition)
-  nil)
+
 
 (require 'product)
 (product-provide (provide 'elmo-imap4) (require 'elmo-version))
index 4907de0..2fa24e5 100644 (file)
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-localdir-folder)
                                              numbers
+                                             new-mark
+                                             already-mark
+                                             seen-mark
+                                             important-mark
                                              seen-list)
   (when numbers
     (let ((dir (elmo-localdir-folder-directory-internal folder))
                              (if (elmo-file-cache-exists-p message-id) ; XXX
                                  (if seen
                                      nil
-                                   elmo-msgdb-unread-cached-mark)
+                                   already-mark)
                                (if seen
                                    nil ;;seen-mark
-                                 elmo-msgdb-new-mark))))
+                                 new-mark))))
              (setq mark-alist
                    (elmo-msgdb-mark-append
                     mark-alist
 
 (luna-define-method elmo-folder-append-messages :around
   ((folder elmo-localdir-folder)
-   src-folder numbers &optional same-number)
+   src-folder numbers unread-marks &optional same-number)
   (if (elmo-folder-message-file-p src-folder)
       (let ((dir (elmo-localdir-folder-directory-internal folder))
            (succeeds numbers)
index 37ed43a..6fe8c22 100644 (file)
@@ -132,7 +132,8 @@ LOCATION."
   (elmo-maildir-folder-flagged-locations-internal folder))
 
 (luna-define-method elmo-folder-msgdb-create 
-  ((folder elmo-maildir-folder) numbers seen-list)
+  ((folder elmo-maildir-folder)
+   numbers new-mark already-mark seen-mark important-mark seen-list)
   (let* ((unread-list (elmo-maildir-folder-unread-locations-internal folder))
         (flagged-list (elmo-maildir-folder-flagged-locations-internal folder))
         (len (length numbers))
@@ -158,9 +159,9 @@ LOCATION."
                                      entity)))
        (cond 
         ((member location unread-list)
-         (setq mark elmo-msgdb-new-mark)) ; unread!
+         (setq mark new-mark)) ; unread!
         ((member location flagged-list)
-         (setq mark elmo-msgdb-important-mark)))
+         (setq mark important-mark)))
        (if (setq mark (or (elmo-msgdb-global-mark-get
                            (elmo-msgdb-overview-entity-get-id
                             entity))
@@ -396,7 +397,7 @@ file name for maildir directories."
 
 (luna-define-method elmo-folder-append-messages :around
   ((folder elmo-maildir-folder)
-   src-folder numbers &optional same-number)
+   src-folder numbers unread-marks &optional same-number)
   (if (elmo-folder-message-file-p src-folder)
       (let ((dir (elmo-maildir-folder-directory-internal folder))
            (succeeds numbers)
index 69ab1c9..cb13519 100644 (file)
    (elmo-map-message-location folder number)
    strategy section unread))
 
-(luna-define-method elmo-folder-list-unreads ((folder elmo-map-folder))
-  (let ((locations (elmo-map-folder-list-unreads folder)))
-    (if (listp locations)
-       (elmo-map-folder-locations-to-numbers
-        folder
-        (elmo-map-folder-list-unreads folder)))))
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-map-folder) unread-marks &optional mark-alist)
+  (elmo-map-folder-locations-to-numbers
+   folder
+   (elmo-map-folder-list-unreads folder)))
 
-(luna-define-method elmo-folder-list-importants ((folder elmo-map-folder))
+(luna-define-method elmo-folder-list-importants-internal
+  ((folder elmo-map-folder) important-mark)
   (let ((locations (elmo-map-folder-list-importants folder)))
     (if (listp locations)
-       (elmo-uniq-list
-        (nconc (elmo-map-folder-locations-to-numbers folder locations)
-               (elmo-folder-list-messages-with-global-mark
-                folder elmo-msgdb-important-mark)))
-      (luna-call-next-method))))
+       (elmo-map-folder-locations-to-numbers folder locations)
+      t)))
 
 (luna-define-method elmo-folder-delete-messages ((folder elmo-map-folder)
                                                 numbers)
             folder))
           (elmo-map-folder-location-alist-internal folder))))
   t) ; success
+  
 
 (require 'product)
 (product-provide (provide 'elmo-map) (require 'elmo-version))
index cc2cc44..02cdde2 100644 (file)
    (elmo-map-message-location folder number)))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-mark-folder)
-                                             numbers seen-list)
-  (elmo-mark-folder-msgdb-create folder numbers))
-
-(defun elmo-mark-folder-msgdb-create (folder numbers)
+                                             numbers new-mark
+                                             already-mark seen-mark
+                                             important-mark
+                                             seen-list)
+  (elmo-mark-folder-msgdb-create folder numbers new-mark already-mark
+                                seen-mark important-mark))
+
+(defun elmo-mark-folder-msgdb-create (folder numbers new-mark already-mark
+                                            seen-mark important-mark)
   (let ((i 0)
        (len (length numbers))
        overview number-alist mark-alist entity message-id
   t)
 
 ;;; To override elmo-map-folder methods.
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-mark-folder) unread-marks &optional mark-alist)
+  t)
+
 (luna-define-method elmo-folder-unmark-important ((folder elmo-mark-folder)
                                                  numbers)
   t)
index bf29c73..7364c5c 100644 (file)
 (require 'std11)
 (require 'mime)
 
-(defcustom elmo-msgdb-new-mark "N"
-  "Mark for new message."
-  :type '(string :tag "Mark")
-  :group 'elmo)
-
-(defcustom elmo-msgdb-unread-uncached-mark "U"
-  "Mark for unread and uncached message."
-  :type '(string :tag "Mark")
-  :group 'elmo)
-
-(defcustom elmo-msgdb-unread-cached-mark "!"
-  "Mark for unread but already cached message."
-  :type '(string :tag "Mark")
-  :group 'elmo)
-
-(defcustom elmo-msgdb-read-uncached-mark "u"
-  "Mark for read but uncached message."
-  :type '(string :tag "Mark")
-  :group 'elmo)
-
-;; Not implemented yet.
-(defcustom elmo-msgdb-answered-cached-mark "&"
-  "Mark for answered and cached message."
-  :type '(string :tag "Mark")
-  :group 'elmo)
-
-(defcustom elmo-msgdb-answered-uncached-mark "A"
-  "Mark for answered but cached message."
-  :type '(string :tag "Mark")
-  :group 'elmo)
-
-(defcustom elmo-msgdb-important-mark"$"
-  "Mark for important message."
-  :type '(string :tag "Mark")
-  :group 'elmo)
-
 ;;; MSGDB interface.
 (defun elmo-load-msgdb (path)
   "Load the MSGDB from PATH."
 (defsubst elmo-msgdb-set-mark (msgdb number mark)
   "Set MARK of the message with NUMBER in the MSGDB.
 if MARK is nil, mark is removed."
-  (let ((elem (elmo-get-hash-val (format "#%d" number)
-                                (elmo-msgdb-get-mark-hashtb msgdb))))
-    (if elem
-       (if mark
-           ;; Set mark of the elem
-           (setcar (cdr elem) mark)
-         ;; Delete elem from mark-alist
-         (elmo-msgdb-set-mark-alist
-          msgdb
-          (delq elem (elmo-msgdb-get-mark-alist msgdb)))
-         (elmo-clear-hash-val (format "#%d" number)
-                              (elmo-msgdb-get-mark-hashtb msgdb)))
-      (when mark
-       ;; Append new element.
-       (elmo-msgdb-set-mark-alist
-        msgdb
-        (nconc
-         (elmo-msgdb-get-mark-alist msgdb)
-         (list (setq elem (list number mark)))))
-       (elmo-set-hash-val (format "#%d" number) elem
-                          (elmo-msgdb-get-mark-hashtb msgdb))))))
-
-(defun elmo-msgdb-set-cached (msgdb number cached)
-  "Set message cache status."
-  (let* ((cur-mark (elmo-msgdb-get-mark msgdb number))
-        (cur-status (cond
-                     ((string= cur-mark elmo-msgdb-important-mark)
-                      'important)
-                     ((member cur-mark (elmo-msgdb-answered-marks))
-                      'answered)
-                     ((not (member cur-mark (elmo-msgdb-unread-marks)))
-                      'read)))
-        (cur-cached (not (member cur-mark (elmo-msgdb-uncached-marks)))))
-    (unless (eq (not cached) (not cur-cached))
-      (case cur-status
-       (read
-        (elmo-msgdb-set-mark msgdb number
-                             (unless cached
-                               elmo-msgdb-read-uncached-mark)))
-       (important nil)
-       (answered
-        (elmo-msgdb-set-mark msgdb number
-                             (if cached
-                                 elmo-msgdb-answered-cached-mark
-                               elmo-msgdb-answered-uncached-mark)))
-       (t
-        (elmo-msgdb-set-mark msgdb number
-                             (if cached
-                                 elmo-msgdb-unread-cached-mark
-                               elmo-msgdb-unread-uncached-mark)))))))
-
-(defun elmo-msgdb-set-status (msgdb folder number status)
-  "Set message status.
-MSGDB is the ELMO msgdb.
-FOLDER is a ELMO folder structure.
-NUMBER is a message number to be set status.
-STATUS is a symbol which is one of the following:
-`read'      ... Messages which are already read.
-`important' ... Messages which are marked as important.
-`answered'  ... Messages which are marked as answered."
-  (let* ((cur-mark (elmo-msgdb-get-mark msgdb number))
-        (use-cache (elmo-message-use-cache-p folder number))
-        (cur-status (cond
-                     ((string= cur-mark elmo-msgdb-important-mark)
-                      'important)
-                     ((member cur-mark (elmo-msgdb-answered-marks))
-                      'answered)
-                     ((not (member cur-mark (elmo-msgdb-unread-marks)))
-                      'read)))
-        (cur-cached (not (member cur-mark (elmo-msgdb-uncached-marks))))
-        mark-modified)
-    (case status
-      (read
-       (case cur-status
-        ((read important answered))
-        (t (elmo-msgdb-set-mark msgdb number
-                                (if (and use-cache cur-cached)
-                                    (elmo-msgdb-set-mark
-                                     msgdb number
-                                     elmo-msgdb-read-uncached-mark)))
-           (setq mark-modified t))))
-      (important
-       (unless (eq cur-status 'important)
-        (elmo-msgdb-set-mark msgdb number elmo-msgdb-important-mark)
-        (setq mark-modified t)))
-      (answered
-       (unless (or (eq cur-status 'answered) (eq cur-status 'important))
-        (elmo-msgdb-set-mark msgdb number
-                             (if cur-cached
-                                 (if use-cache
-                                     elmo-msgdb-answered-cached-mark
-                                   elmo-msgdb-answered-uncached-mark)
-                               elmo-msgdb-answered-uncached-mark)))
-       (setq mark-modified t)))
-    (if mark-modified (elmo-folder-set-mark-modified-internal folder t))))
-
-(defun elmo-msgdb-unset-status (msgdb folder number status)
-  "Unset message status.
-MSGDB is the ELMO msgdb.
-FOLDER is a ELMO folder structure.
-NUMBER is a message number to be set status.
-STATUS is a symbol which is one of the following:
-`read'      ... Messages which are already read.
-`important' ... Messages which are marked as important.
-`answered'  ... Messages which are marked as answered."
-  (let* ((cur-mark (elmo-msgdb-get-mark msgdb number))
-        (use-cache (elmo-message-use-cache-p folder number))
-        (cur-status (cond
-                     ((string= cur-mark elmo-msgdb-important-mark)
-                      'important)
-                     ((member cur-mark (elmo-msgdb-answered-marks))
-                      'answered)
-                     ((not (member cur-mark (elmo-msgdb-unread-marks)))
-                      'read)))
-        (cur-cached (not (member cur-mark (elmo-msgdb-uncached-marks)))))
-    (case status
-      (read
-       (if (eq cur-status 'read)
-          (elmo-msgdb-set-mark msgdb number
-                               (if (and cur-cached use-cache)
-                                   elmo-msgdb-unread-cached-mark
-                                 elmo-msgdb-unread-uncached-mark))))
-      (important
-       (if (eq cur-status 'important)
-          (elmo-msgdb-set-mark msgdb number nil)))
-      (answered
-       (if (eq cur-status 'answered)
-          (elmo-msgdb-set-mark msgdb number
-                               (if (and cur-cached (not use-cache))
-                                   elmo-msgdb-read-uncached-mark)))))))
-
-(defvar elmo-msgdb-unread-marks-internal nil)
-(defsubst elmo-msgdb-unread-marks ()
-  "Return an unread mark list"
-  (or elmo-msgdb-unread-marks-internal
-      (setq elmo-msgdb-unread-marks-internal
-           (list elmo-msgdb-new-mark
-                 elmo-msgdb-unread-uncached-mark
-                 elmo-msgdb-unread-cached-mark))))
-
-(defvar elmo-msgdb-answered-marks-internal nil)
-(defsubst elmo-msgdb-answered-marks ()
-  "Return an answered mark list"
-  (or elmo-msgdb-answered-marks-internal
-      (setq elmo-msgdb-answered-marks-internal
-           (list elmo-msgdb-answered-cached-mark
-                 elmo-msgdb-answered-uncached-mark))))
-
-(defvar elmo-msgdb-uncached-marks-internal nil)
-(defsubst elmo-msgdb-uncached-marks ()
-  (or elmo-msgdb-uncached-marks-internal
-      (setq elmo-msgdb-uncached-marks-internal
-           (list elmo-msgdb-answered-uncached-mark
-                 elmo-msgdb-unread-uncached-mark
-                 elmo-msgdb-read-uncached-mark))))
-
-(defsubst elmo-msgdb-count-marks (msgdb)
+  (elmo-msgdb-set-mark-alist
+   msgdb
+   (elmo-msgdb-mark-alist-set (elmo-msgdb-get-mark-alist msgdb)
+                             number
+                             mark msgdb))
+  (unless mark
+    (elmo-clear-hash-val (format "#%d" number)
+                        (elmo-msgdb-get-mark-hashtb msgdb))))
+
+(defsubst elmo-msgdb-count-marks (msgdb new-mark unread-marks)
   (let ((new 0)
-       (unreads 0)
-       (answered 0))
+       (unreads 0))
     (dolist (elem (elmo-msgdb-get-mark-alist msgdb))
       (cond
-       ((string= (cadr elem) elmo-msgdb-new-mark)
+       ((string= (cadr elem) new-mark)
        (incf new))
-       ((member (cadr elem) (elmo-msgdb-unread-marks))
-       (incf unreads))
-       ((member (cadr elem) (elmo-msgdb-answered-marks))
-       (incf answered))))
-    (list new unreads answered)))
+       ((member (cadr elem) unread-marks)
+       (incf unreads))))
+    (cons new unreads)))
 
 (defsubst elmo-msgdb-get-number (msgdb message-id)
   "Get number of the message which corrensponds to MESSAGE-ID from MSGDB."
@@ -439,13 +253,30 @@ content of MSGDB is changed."
 ;;;
 ;; persistent mark handling
 ;; (for each folder)
+(defun elmo-msgdb-mark-alist-set (alist id mark msgdb)
+  (let ((ret-val alist)
+       entity)
+    (setq entity (assq id alist))
+    (if entity
+       (if (eq mark nil)
+           ;; delete this entity
+           (setq ret-val (delq entity alist))
+         ;; set mark
+         (setcar (cdr entity) mark))
+      (when mark
+       (setq ret-val (elmo-msgdb-append-element ret-val
+                                                (setq entity
+                                                      (list id mark))))
+       (elmo-set-hash-val (format "#%d" id) entity
+                          (elmo-msgdb-get-mark-hashtb msgdb))))
+    ret-val))
 
 (defun elmo-msgdb-mark-append (alist id mark)
   "Append mark."
   (setq alist (elmo-msgdb-append-element alist
                                         (list id mark))))
 
-(defun elmo-msgdb-seen-list (msgdb)
+(defun elmo-msgdb-seen-list (msgdb seen-marks)
   "Get SEEN-MSGID-LIST from MSGDB."
   (let ((ov (elmo-msgdb-get-overview msgdb))
        mark seen-list)
@@ -453,8 +284,7 @@ content of MSGDB is changed."
       (if (setq mark (elmo-msgdb-get-mark
                      msgdb
                      (elmo-msgdb-overview-entity-get-number (car ov))))
-         (if (and mark (member mark (list elmo-msgdb-important-mark
-                                          elmo-msgdb-read-uncached-mark)))
+         (if (and mark (member mark seen-marks))
              (setq seen-list (cons
                               (elmo-msgdb-overview-entity-get-id (car ov))
                               seen-list)))
@@ -919,12 +749,12 @@ header separator."
                     elmo-msgdb-directory)
                    alist))
 
-(defun elmo-msgdb-add-msgs-to-seen-list (msgs msgdb seen-list)
+(defun elmo-msgdb-add-msgs-to-seen-list (msgs msgdb unread-marks seen-list)
   ;; Add to seen list.
   (let (mark)
     (while msgs
       (if (setq mark (elmo-msgdb-get-mark msgdb (car msgs)))
-         (unless (member mark (elmo-msgdb-unread-marks)) ;; not unread mark
+         (unless (member mark unread-marks) ;; not unread mark
            (setq seen-list
                  (cons
                   (elmo-msgdb-get-field msgdb (car msgs) 'message-id)
index 3090237..a4d0da5 100644 (file)
 
 (luna-define-method elmo-folder-check ((folder elmo-multi-folder))
   (dolist (fld (elmo-multi-folder-children-internal folder))
-    (elmo-folder-synchronize fld)))
+    (elmo-folder-check fld)))
 
 (luna-define-method elmo-folder-close-internal ((folder elmo-multi-folder))
   (dolist (fld (elmo-multi-folder-children-internal folder))
     (elmo-folder-close-internal fld)))
 
-(luna-define-method elmo-folder-close :around ((folder elmo-multi-folder))
-  (dolist (fld (elmo-multi-folder-children-internal folder))
-    (elmo-folder-close fld)))
-
 (luna-define-method elmo-folder-expand-msgdb-path ((folder
                                                    elmo-multi-folder))
   (expand-file-name (elmo-replace-string-as-filename
     numbers-list))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-multi-folder)
-                                             numbers seen-list)
+                                             numbers new-mark already-mark
+                                             seen-mark important-mark
+                                             seen-list)
   (let* ((folders (elmo-multi-folder-children-internal folder))
         overview number-alist mark-alist entity
         numbers-list
                 (elmo-multi-msgdb
                  (elmo-folder-msgdb-create (nth cur-number folders)
                                            (nth cur-number numbers-list)
+                                           new-mark already-mark
+                                           seen-mark important-mark
                                            seen-list)
                  (* (elmo-multi-folder-divide-number-internal folder)
                     (1+ cur-number))))))
       (setq result (nconc result (list one-alist))))
     result))
 
-(luna-define-method elmo-folder-list-unreads ((folder elmo-multi-folder))
-  (let ((cur-number 0)
-       unreads)
-    (dolist (child (elmo-multi-folder-children-internal folder))
-      (setq cur-number (+ cur-number 1))
-      (setq unreads
-           (nconc
-            unreads
-            (mapcar (lambda (x)
-                      (+ x (* cur-number
-                              (elmo-multi-folder-divide-number-internal
-                               folder))))
-                    (elmo-folder-list-unreads child)))))
-    unreads))
-
-(luna-define-method elmo-folder-list-answereds ((folder elmo-multi-folder))
-  (let ((cur-number 0)
-       answereds)
-    (dolist (child (elmo-multi-folder-children-internal folder))
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-multi-folder) unread-marks &optional mark-alist)
+  (elmo-multi-folder-list-unreads-internal folder unread-marks))
+
+(defun elmo-multi-folder-list-unreads-internal (folder unread-marks)
+  (let ((folders (elmo-multi-folder-children-internal folder))
+       (mark-alists (elmo-multi-split-mark-alist
+                     folder
+                     (elmo-msgdb-get-mark-alist
+                      (elmo-folder-msgdb folder))))
+       (cur-number 0)
+       unreads
+       all-unreads)
+    (while folders
       (setq cur-number (+ cur-number 1))
-      (setq answereds
-           (nconc
-            answereds
-            (mapcar (lambda (x)
-                      (+ x (* cur-number
-                              (elmo-multi-folder-divide-number-internal
-                               folder))))
-                    (elmo-folder-list-answereds child)))))
-    answereds))
-
-(luna-define-method elmo-folder-list-importants ((folder elmo-multi-folder))
-  (let ((cur-number 0)
-       importants)
-    (dolist (child (elmo-multi-folder-children-internal folder))
+      (unless (listp (setq unreads
+                          (elmo-folder-list-unreads-internal
+                           (car folders) unread-marks (car mark-alists))))
+       (setq unreads (delq  nil
+                            (mapcar
+                             (lambda (x)
+                               (if (member (cadr x) unread-marks)
+                                   (car x)))
+                             (car mark-alists)))))
+      (setq all-unreads
+           (nconc all-unreads
+                  (mapcar 
+                   (lambda (x)
+                     (+ x
+                        (* cur-number
+                           (elmo-multi-folder-divide-number-internal
+                            folder))))            
+                   unreads)))
+      (setq mark-alists (cdr mark-alists)
+           folders (cdr folders)))
+    all-unreads))
+
+(luna-define-method elmo-folder-list-importants-internal
+  ((folder elmo-multi-folder) important-mark)
+  (let ((folders (elmo-multi-folder-children-internal folder))
+       (mark-alists (elmo-multi-split-mark-alist
+                     folder
+                     (elmo-msgdb-get-mark-alist
+                      (elmo-folder-msgdb folder))))
+       (cur-number 0)
+       importants
+       all-importants)
+    (while folders
       (setq cur-number (+ cur-number 1))
-      (setq importants
-           (nconc
-            importants
-            (mapcar (lambda (x)
-                      (+ x (* cur-number
-                              (elmo-multi-folder-divide-number-internal
-                               folder))))
-                    (elmo-folder-list-importants child)))))
-    (elmo-uniq-list
-     (nconc importants
-           (elmo-folder-list-messages-with-global-mark
-            folder elmo-msgdb-important-mark)))))
+      (when (listp (setq importants
+                        (elmo-folder-list-importants-internal
+                         (car folders) important-mark)))
+       (setq all-importants
+             (nconc all-importants
+                    (mapcar 
+                     (lambda (x)
+                       (+ x
+                          (* cur-number
+                             (elmo-multi-folder-divide-number-internal
+                              folder))))                  
+                     importants))))
+      (setq mark-alists (cdr mark-alists)
+           folders (cdr folders)))
+    all-importants))
 
 (luna-define-method elmo-folder-list-messages-internal
   ((folder elmo-multi-folder) &optional nohide)
       (setq msg-list (cdr msg-list)))
     ret-val))
 
-(luna-define-method elmo-folder-mark-as-important :around ((folder
-                                                           elmo-multi-folder)
-                                                          numbers)
+(luna-define-method elmo-folder-mark-as-important ((folder elmo-multi-folder)
+                                                  numbers)
   (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
     (elmo-folder-mark-as-important (car folder-numbers)
                                   (cdr folder-numbers)))
-  (luna-call-next-method))
+  t)
 
-(luna-define-method elmo-folder-unmark-important :around ((folder
-                                                          elmo-multi-folder)
-                                                         numbers)
+(luna-define-method elmo-folder-unmark-important ((folder elmo-multi-folder)
+                                                 numbers)
   (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
     (elmo-folder-unmark-important (car folder-numbers)
                                  (cdr folder-numbers)))
-  (luna-call-next-method))
+  t)
 
-(luna-define-method elmo-folder-mark-as-read :around ((folder
-                                                      elmo-multi-folder)
-                                                     numbers)
+(luna-define-method elmo-folder-mark-as-read ((folder elmo-multi-folder)
+                                             numbers)
   (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
     (elmo-folder-mark-as-read (car folder-numbers)
                              (cdr folder-numbers)))
-  (luna-call-next-method))
+  t)
 
-(luna-define-method elmo-folder-unmark-read :around ((folder
-                                                     elmo-multi-folder)
-                                                    numbers)
+(luna-define-method elmo-folder-unmark-read ((folder elmo-multi-folder)
+                                            numbers)
   (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
     (elmo-folder-unmark-read (car folder-numbers)
                             (cdr folder-numbers)))
-  (luna-call-next-method))
-
-(luna-define-method elmo-folder-mark-as-answered :around ((folder
-                                                          elmo-multi-folder)
-                                                         numbers)
-  (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
-    (elmo-folder-mark-as-answered (car folder-numbers)
-                                 (cdr folder-numbers)))
-  (luna-call-next-method))
-
-(luna-define-method elmo-folder-unmark-answered :around ((folder
-                                                         elmo-multi-folder)
-                                                        numbers)
-  (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
-    (elmo-folder-unmark-answered (car folder-numbers)
-                                (cdr folder-numbers)))
-  (luna-call-next-method))
+  t)
 
 (require 'product)
 (product-provide (provide 'elmo-multi) (require 'elmo-version))
index 1b824fe..009dcae 100644 (file)
@@ -393,30 +393,19 @@ Returned value is searched from `elmo-network-stream-type-alist'."
                 (elmo-dop-spool-folder-list-messages folder))))
     t))
 
-(luna-define-method elmo-folder-list-unreads :around ((folder
-                                                      elmo-net-folder))
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-net-folder) unread-marks &optional mark-alist)
   (if (and (elmo-folder-plugged-p folder)
           (elmo-folder-use-flag-p folder))
       (elmo-folder-send folder 'elmo-folder-list-unreads-plugged)
-    (luna-call-next-method)))
-
-(luna-define-method elmo-folder-list-importants :around ((folder
-                                                         elmo-net-folder))
-  (if (and (elmo-folder-plugged-p folder)
-          (elmo-folder-use-flag-p folder))
-      (elmo-uniq-list
-       (nconc
-       (elmo-folder-send folder 'elmo-folder-list-importants-plugged)
-       (elmo-folder-list-messages-with-global-mark
-        folder elmo-msgdb-important-mark)))
-    (luna-call-next-method)))
+    t))
 
-(luna-define-method elmo-folder-list-answereds :around ((folder
-                                                        elmo-net-folder))
+(luna-define-method elmo-folder-list-importants-internal
+  ((folder elmo-net-folder) important-mark)
   (if (and (elmo-folder-plugged-p folder)
           (elmo-folder-use-flag-p folder))
-      (elmo-folder-send folder 'elmo-folder-list-answereds-plugged)
-    (luna-call-next-method)))
+      (elmo-folder-send folder 'elmo-folder-list-importants-plugged)
+    t))
 
 (luna-define-method elmo-folder-list-unreads-plugged
   ((folder elmo-net-folder))
@@ -426,10 +415,6 @@ Returned value is searched from `elmo-network-stream-type-alist'."
   ((folder elmo-net-folder))
   t)
 
-(luna-define-method elmo-folder-list-answereds-plugged
-  ((folder elmo-net-folder))
-  t)
-
 (luna-define-method elmo-folder-delete-messages ((folder elmo-net-folder)
                                                 numbers)
   (if (elmo-folder-plugged-p folder)
@@ -442,21 +427,34 @@ Returned value is searched from `elmo-network-stream-type-alist'."
   (elmo-folder-delete-messages-dop folder numbers))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-net-folder)
-                                             numbers seen-list)
+                                             numbers new-mark
+                                             already-mark seen-mark
+                                             important-mark seen-list)
   (if (elmo-folder-plugged-p folder)
       (elmo-folder-send folder 'elmo-folder-msgdb-create-plugged
-                       numbers seen-list)
+                       numbers
+                       new-mark
+                       already-mark seen-mark
+                       important-mark seen-list)
     (elmo-folder-send folder 'elmo-folder-msgdb-create-unplugged
-                     numbers seen-list)))
+                     numbers
+                     new-mark already-mark seen-mark
+                     important-mark seen-list)))
 
 (luna-define-method elmo-folder-msgdb-create-unplugged ((folder
                                                         elmo-net-folder)
                                                        numbers
+                                                       new-mark already-mark
+                                                       seen-mark
+                                                       important-mark
                                                        seen-list)
   ;; XXXX should be appended to already existing msgdb.
   (elmo-dop-msgdb
    (elmo-folder-msgdb-create (elmo-dop-spool-folder folder)
                             (mapcar 'abs numbers)
+                            new-mark already-mark
+                            seen-mark
+                            important-mark
                             seen-list)))
 
 (luna-define-method elmo-folder-unmark-important ((folder elmo-net-folder)
@@ -496,26 +494,6 @@ Returned value is searched from `elmo-network-stream-type-alist'."
         folder 'elmo-folder-mark-as-read-unplugged numbers))
     t))
 
-(luna-define-method elmo-folder-unmark-answered ((folder elmo-net-folder)
-                                                numbers)
-  (if (elmo-folder-use-flag-p folder)
-      (if (elmo-folder-plugged-p folder)
-         (elmo-folder-send folder 'elmo-folder-unmark-answered-plugged
-                           numbers)
-       (elmo-folder-send folder
-                         'elmo-folder-unmark-answered-unplugged numbers))
-    (luna-call-next-method)))
-
-(luna-define-method elmo-folder-mark-as-answered ((folder elmo-net-folder)
-                                                 numbers)
-  (if (elmo-folder-use-flag-p folder)
-      (if (elmo-folder-plugged-p folder)
-         (elmo-folder-send folder 'elmo-folder-mark-as-answered-plugged
-                           numbers)
-       (elmo-folder-send folder 'elmo-folder-mark-as-answered-unplugged
-                         numbers))
-    (luna-call-next-method)))
-
 (luna-define-method elmo-folder-mark-as-read-unplugged ((folder
                                                         elmo-net-folder)
                                                        numbers)
@@ -535,15 +513,6 @@ Returned value is searched from `elmo-network-stream-type-alist'."
                                                            numbers)
   (elmo-folder-unmark-important-dop folder numbers))
 
-(luna-define-method elmo-folder-mark-as-answered-unplugged ((folder
-                                                            elmo-net-folder)
-                                                           numbers)
-  (elmo-folder-mark-as-answered-dop folder numbers))
-
-(luna-define-method elmo-folder-unmark-answered-unplugged
-  ((folder elmo-net-folder) numbers)
-  (elmo-folder-unmark-answered-dop folder numbers))
-
 (luna-define-method elmo-message-encache :around ((folder elmo-net-folder)
                                                  number &optional read)
   (if (elmo-folder-plugged-p folder)
index 4459d24..bc46e71 100644 (file)
@@ -117,7 +117,10 @@ If the value is a list, all elements are used as index paths for namazu."
     entity))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-nmz-folder)
-                                             numlist seen-list)
+                                             numlist new-mark
+                                             already-mark seen-mark
+                                             important-mark
+                                             seen-list)
   (let* (overview number-alist mark-alist entity
                  i percent num pair)
     (setq num (length numlist))
@@ -145,7 +148,7 @@ If the value is a list, all elements are used as index paths for namazu."
               (or (elmo-msgdb-global-mark-get
                    (elmo-msgdb-overview-entity-get-id
                     entity))
-                  elmo-msgdb-new-mark))))
+                  new-mark))))
       (when (> num elmo-display-progress-threshold)
        (setq i (1+ i))
        (setq percent (/ (* i 100) num))
@@ -251,6 +254,25 @@ If the value is a list, all elements are used as index paths for namazu."
 (luna-define-method elmo-folder-exists-p ((folder elmo-nmz-folder))
   t)
 
+;;; To override elmo-map-folder methods.
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-nmz-folder) unread-marks &optional mark-alist)
+  t)
+
+(luna-define-method elmo-folder-unmark-important ((folder elmo-nmz-folder)
+                                                 numbers)
+  t)
+
+(luna-define-method elmo-folder-mark-as-important ((folder elmo-nmz-folder)
+                                                  numbers)
+  t)
+
+(luna-define-method elmo-folder-unmark-read ((folder elmo-nmz-folder) numbers)
+  t)
+
+(luna-define-method elmo-folder-mark-as-read ((folder elmo-nmz-folder) numbers)
+  t)
+
 (require 'product)
 (product-provide (provide 'elmo-nmz) (require 'elmo-version))
 
index fd1e85c..74030a8 100644 (file)
@@ -703,6 +703,10 @@ Don't cache if nil.")
     ("xref" . 8)))
 
 (defun elmo-nntp-create-msgdb-from-overview-string (str
+                                                   new-mark
+                                                   already-mark
+                                                   seen-mark
+                                                   important-mark
                                                    seen-list
                                                    &optional numlist)
   (let (ov-list gmark message-id seen
@@ -764,11 +768,11 @@ Don't cache if nil.")
                                 (elmo-file-cache-get message-id))
                                (if seen
                                    nil
-                                 elmo-msgdb-unread-cached-mark)
+                                 already-mark)
                              (if seen
                                  (if elmo-nntp-use-cache
-                                     elmo-msgdb-read-uncached-mark)
-                               elmo-msgdb-new-mark))))
+                                     seen-mark)
+                               new-mark))))
            (setq mark-alist
                  (elmo-msgdb-mark-append mark-alist
                                          num gmark))))
@@ -776,10 +780,16 @@ Don't cache if nil.")
     (list overview number-alist mark-alist)))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-nntp-folder)
-                                             numbers seen-list)
-  (elmo-nntp-folder-msgdb-create folder numbers seen-list))
-
-(defun elmo-nntp-folder-msgdb-create (folder numbers seen-list)
+                                             numbers new-mark already-mark
+                                             seen-mark important-mark
+                                             seen-list)
+  (elmo-nntp-folder-msgdb-create folder numbers new-mark already-mark
+                                seen-mark important-mark
+                                seen-list))
+
+(defun elmo-nntp-folder-msgdb-create (folder numbers new-mark already-mark
+                                            seen-mark important-mark
+                                            seen-list)
   (let ((filter numbers)
        (session (elmo-nntp-get-session folder))
        beg-num end-num cur length
@@ -808,6 +818,10 @@ Don't cache if nil.")
                     ret-val
                     (elmo-nntp-create-msgdb-from-overview-string
                      ov-str
+                     new-mark
+                     already-mark
+                     seen-mark
+                     important-mark
                      seen-list
                      filter
                      )))))
@@ -829,7 +843,8 @@ Don't cache if nil.")
         'elmo-nntp-msgdb-create "Getting overview..." 100)))
     (if (not use-xover)
        (setq ret-val (elmo-nntp-msgdb-create-by-header
-                      session numbers seen-list))
+                      session numbers
+                      new-mark already-mark seen-mark seen-list))
       (with-current-buffer (elmo-network-session-buffer session)
        (if ov-str
            (setq ret-val
@@ -837,6 +852,10 @@ Don't cache if nil.")
                   ret-val
                   (elmo-nntp-create-msgdb-from-overview-string
                    ov-str
+                   new-mark
+                   already-mark
+                   seen-mark
+                   important-mark
                    seen-list
                    filter))))))
     (elmo-folder-set-killed-list-internal
@@ -897,11 +916,13 @@ Don't cache if nil.")
                   (nconc number-alist
                          (list (cons max-number nil))))))))))
 
-(defun elmo-nntp-msgdb-create-by-header (session numbers seen-list)
+(defun elmo-nntp-msgdb-create-by-header (session numbers
+                                                new-mark already-mark
+                                                seen-mark seen-list)
   (with-temp-buffer
     (elmo-nntp-retrieve-headers session (current-buffer) numbers)
     (elmo-nntp-msgdb-create-message
-     (length numbers) seen-list)))
+     (length numbers) new-mark already-mark seen-mark seen-list)))
 
 (defun elmo-nntp-parse-xhdr-response (string)
   (let (response)
@@ -1380,7 +1401,8 @@ Returns a list of cons cells like (NUMBER . VALUE)"
 
 ;; end of from Gnus
 
-(defun elmo-nntp-msgdb-create-message (len seen-list)
+(defun elmo-nntp-msgdb-create-message (len new-mark
+                                          already-mark seen-mark seen-list)
   (save-excursion
     (let (beg overview number-alist mark-alist
              entity i num gmark seen message-id)
@@ -1419,11 +1441,11 @@ Returns a list of cons cells like (NUMBER . VALUE)"
                                   (elmo-file-cache-get message-id))
                                  (if seen
                                      nil
-                                   elmo-msgdb-unread-cached-mark)
+                                   already-mark)
                                (if seen
                                    (if elmo-nntp-use-cache
-                                       elmo-msgdb-read-uncached-mark)
-                                 elmo-msgdb-new-mark))))
+                                       seen-mark)
+                                 new-mark))))
                    (setq mark-alist
                          (elmo-msgdb-mark-append
                           mark-alist
@@ -1556,12 +1578,19 @@ Returns a list of cons cells like (NUMBER . VALUE)"
                                          elmo-crosspost-message-alist)))
     (elmo-nntp-folder-set-reads-internal folder reads)))
 
-(luna-define-method elmo-folder-list-unreads :around ((folder
-                                                      elmo-nntp-folder))
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-nntp-folder) unread-marks mark-alist)
   ;;    2.3. elmo-folder-list-unreads return unread message list according to
   ;;         `reads' slot.
-  (elmo-living-messages (luna-call-next-method)
-                       (elmo-nntp-folder-reads-internal folder)))
+  (let ((mark-alist (or mark-alist (elmo-msgdb-get-mark-alist
+                                   (elmo-folder-msgdb folder)))))
+    (elmo-living-messages (delq nil
+                               (mapcar
+                                (lambda (x)
+                                  (if (member (nth 1 x) unread-marks)
+                                      (car x)))
+                                mark-alist))
+                         (elmo-nntp-folder-reads-internal folder))))
 
 (require 'product)
 (product-provide (provide 'elmo-nntp) (require 'elmo-version))
index 678ec41..e2dfc04 100644 (file)
       (elmo-folder-contains-type (elmo-pipe-folder-dst-internal folder) type)))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-pipe-folder)
-                                             numlist seen-list)
+                                             numlist new-mark already-mark
+                                             seen-mark important-mark
+                                             seen-list)
   (elmo-folder-msgdb-create (elmo-pipe-folder-dst-internal folder)
-                           numlist seen-list))
+                           numlist new-mark already-mark
+                           seen-mark important-mark seen-list))
 
 (luna-define-method elmo-folder-append-messages ((folder elmo-pipe-folder)
                                                 src-folder numbers
+                                                unread-marks
                                                 &optional same-number)
   (elmo-folder-append-messages (elmo-pipe-folder-dst-internal folder)
                               src-folder numbers
+                              unread-marks
                               same-number))
 
 (luna-define-method elmo-folder-append-buffer ((folder elmo-pipe-folder)
   (elmo-folder-list-messages-internal (elmo-pipe-folder-dst-internal
                                       folder) nohide))
 
-(luna-define-method elmo-folder-list-unreads ((folder elmo-pipe-folder))
-  (elmo-folder-list-unreads (elmo-pipe-folder-dst-internal folder)))
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-pipe-folder) unread-marks &optional mark-alist)
+  (elmo-folder-list-unreads-internal (elmo-pipe-folder-dst-internal folder)
+                                    unread-marks mark-alist))
 
-(luna-define-method elmo-folder-list-importants ((folder elmo-pipe-folder))
-  (elmo-folder-list-importants (elmo-pipe-folder-dst-internal folder)))
-
-(luna-define-method elmo-folder-list-answereds ((folder elmo-pipe-folder))
-  (elmo-folder-list-answereds (elmo-pipe-folder-dst-internal folder)))
+(luna-define-method elmo-folder-list-importants-internal
+  ((folder elmo-pipe-folder) important-mark)
+  (elmo-folder-list-importants-internal (elmo-pipe-folder-dst-internal folder)
+                                       important-mark))
 
 (luna-define-method elmo-folder-status ((folder elmo-pipe-folder))
   (elmo-folder-open-internal (elmo-pipe-folder-src-internal folder))
index 0192041..d594e93 100644 (file)
@@ -677,7 +677,9 @@ If IF-EXISTS is `any-exists', get BIFF session or normal session if exists."
       (copy-to-buffer tobuffer (point-min) (point-max)))))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-pop3-folder)
-                                             numlist seen-list)
+                                             numlist new-mark
+                                             already-mark seen-mark
+                                             important-mark seen-list)
   (let ((process (elmo-network-session-process-internal
                  (elmo-pop3-get-session folder))))
     (with-current-buffer (process-buffer process)
@@ -686,7 +688,8 @@ If IF-EXISTS is `any-exists', get BIFF session or normal session if exists."
        (elmo-pop3-msgdb-create-by-header
        process
        numlist
-       seen-list
+       new-mark already-mark
+       seen-mark seen-list
        (if (elmo-pop3-folder-use-uidl-internal folder)
            (elmo-pop3-folder-location-alist-internal folder)))))))
 
@@ -724,6 +727,8 @@ If IF-EXISTS is `any-exists', get BIFF session or normal session if exists."
                     elmo-pop3-size-hash))
 
 (defun elmo-pop3-msgdb-create-by-header (process numlist
+                                                new-mark already-mark
+                                                seen-mark
                                                 seen-list
                                                 loc-alist)
   (let ((tmp-buffer (get-buffer-create " *ELMO Overview TMP*")))
@@ -744,13 +749,14 @@ If IF-EXISTS is `any-exists', get BIFF session or normal session if exists."
           process
           (length numlist)
           numlist
-          seen-list loc-alist)
+          new-mark already-mark seen-mark seen-list loc-alist)
        (kill-buffer tmp-buffer)))))
 
 (defun elmo-pop3-msgdb-create-message (buffer
                                       process
                                       num
-                                      numlist
+                                      numlist new-mark already-mark
+                                      seen-mark
                                       seen-list
                                       loc-alist)
   (save-excursion
@@ -801,11 +807,11 @@ If IF-EXISTS is `any-exists', get BIFF session or normal session if exists."
                                       (elmo-file-cache-get message-id))
                                      (if seen
                                          nil
-                                       elmo-msgdb-unread-cached-mark)
+                                       already-mark)
                                    (if seen
                                        (if elmo-pop3-use-cache
-                                           elmo-msgdb-read-uncached-mark)
-                                     elmo-msgdb-new-mark))))
+                                           seen-mark)
+                                     new-mark))))
                  (setq mark-alist
                        (elmo-msgdb-mark-append
                         mark-alist
index de753f8..3cf0bc5 100644 (file)
    (elmo-map-message-location folder number)))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-sendlog-folder)
-                                             numbers seen-list)
+                                             numbers new-mark
+                                             already-mark seen-mark
+                                             important-mark
+                                             seen-list)
   (let ((i 0)
        (len (length numbers))
        overview number-alist mark-alist entity message-id
                                     num
                                     message-id))
        (if (setq mark (or (elmo-msgdb-global-mark-get message-id)
-                          (if (member message-id seen-list) nil
-                            elmo-msgdb-new-mark)))
+                          (if (member message-id seen-list) nil new-mark)))
            (setq mark-alist
                  (elmo-msgdb-mark-append
                   mark-alist
 (luna-define-method elmo-message-file-p ((folder elmo-sendlog-folder) number)
   t)
 
+;;; To override elmo-map-folder methods.
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-sendlog-folder) unread-marks &optional mark-alist)
+  t)
+
+(luna-define-method elmo-folder-unmark-important ((folder elmo-sendlog-folder)
+                                                 numbers)
+  t)
+
+(luna-define-method elmo-folder-mark-as-important ((folder elmo-sendlog-folder)
+                                                  numbers)
+  t)
+
+(luna-define-method elmo-folder-unmark-read ((folder elmo-sendlog-folder)
+                                            numbers)
+  t)
+
+(luna-define-method elmo-folder-mark-as-read ((folder elmo-sendlog-folder)
+                                             numbers)
+  t)
+
 (require 'product)
 (product-provide (provide 'elmo-sendlog) (require 'elmo-version))
 
index 25bf6d0..1e2bf02 100644 (file)
@@ -341,7 +341,10 @@ update overview when message is fetched."
          (list (cons "xref" (shimbun-header-xref header)))))))))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-shimbun-folder)
-                                             numlist seen-list)
+                                             numlist new-mark
+                                             already-mark seen-mark
+                                             important-mark
+                                             seen-list)
   (let* (overview number-alist mark-alist entity
                  i percent number length pair msgid gmark seen)
     (setq length (length numlist))
@@ -364,11 +367,11 @@ update overview when message is fetched."
        (if (setq gmark (or (elmo-msgdb-global-mark-get msgid)
                            (if (elmo-file-cache-status
                                 (elmo-file-cache-get msgid))
-                               (if seen nil elmo-msgdb-unread-cached-mark)
+                               (if seen nil already-mark)
                              (if seen
                                  (if elmo-shimbun-use-cache
-                                     elmo-msgdb-read-uncached-mark)
-                               elmo-msgdb-new-mark))))
+                                     seen-mark)
+                               new-mark))))
            (setq mark-alist
                  (elmo-msgdb-mark-append mark-alist
                                          number gmark))))
@@ -506,6 +509,27 @@ update overview when message is fetched."
                          folder))))
     t))
 
+;;; To override elmo-map-folder methods.
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-shimbun-folder) unread-marks &optional mark-alist)
+  t)
+
+(luna-define-method elmo-folder-unmark-important ((folder elmo-shimbun-folder)
+                                                 numbers)
+  t)
+
+(luna-define-method elmo-folder-mark-as-important ((folder elmo-shimbun-folder)
+                                                  numbers)
+  t)
+
+(luna-define-method elmo-folder-unmark-read ((folder elmo-shimbun-folder)
+                                            numbers)
+  t)
+
+(luna-define-method elmo-folder-mark-as-read ((folder elmo-shimbun-folder)
+                                             numbers)
+  t)
+
 (require 'product)
 (product-provide (provide 'elmo-shimbun) (require 'elmo-version))
 
index 384d976..1205733 100644 (file)
@@ -232,7 +232,7 @@ Return value is a cons cell of (STRUCTURE . REST)"
       (goto-char (match-end 0))))
 ;; search-key   ::= [A-Za-z-]+
 ;;                 ;; "since" / "before" / "last" / "first" /
-;;                 ;; "body" / "status" / field-name
+;;                 ;; "body" / field-name
    ((looking-at "\\(!\\)? *\\([A-Za-z-]+\\) *: *")
     (goto-char (match-end 0))
     (let ((search-key (vector
index ef66b76..a59b76e 100644 (file)
@@ -148,13 +148,11 @@ If optional argument NON-PERSISTENT is non-nil, folder is treated as
     (save-match-data
       (elmo-folder-send folder 'elmo-folder-initialize name))))
 
-(luna-define-generic elmo-folder-msgdb (folder)
-  "Return the msgdb of FOLDER (on-demand loading).")
-
-(luna-define-method elmo-folder-msgdb ((folder elmo-folder))
-  (or (elmo-folder-msgdb-internal folder)
-      (elmo-folder-set-msgdb-internal folder
-                                     (elmo-msgdb-load folder))))
+(defmacro elmo-folder-msgdb (folder)
+  "Return the msgdb of FOLDER (on-demand loading)."
+  (` (or (elmo-folder-msgdb-internal (, folder))
+        (elmo-folder-set-msgdb-internal (, folder)
+                                        (elmo-msgdb-load (, folder))))))
 
 (luna-define-generic elmo-folder-open (folder &optional load-msgdb)
   "Open and setup (load saved status) FOLDER.
@@ -206,72 +204,56 @@ Return value is cons cell or list:
 (luna-define-generic elmo-folder-reserve-status-p (folder)
   "If non-nil, the folder should not close folder after `elmo-folder-status'.")
 
-(defun elmo-folder-list-messages (folder &optional visible-only in-msgdb)
+(defun elmo-folder-list-messages (folder &optional visible-only)
   "Return a list of message numbers contained in FOLDER.
-If optional VISIBLE-ONLY is non-nil, killed messages are not listed.
-If second optional IN-MSGDB is non-nil, only messages in the msgdb are listed."
-  (let ((list (if in-msgdb
-                 t
-               (elmo-folder-list-messages-internal folder visible-only))))
-    (elmo-living-messages
-     (if (listp list)
-        list
-       ;; Use current list.
-       (mapcar
-       'car
-       (elmo-msgdb-get-number-alist (elmo-folder-msgdb folder))))
-     (elmo-folder-killed-list-internal folder))))
-
-(luna-define-generic elmo-folder-list-unreads (folder)
-  "Return a list of unread message numbers contained in FOLDER.")
-(luna-define-generic elmo-folder-list-importants (folder)
-  "Return a list of important message numbers contained in FOLDER.")
-(luna-define-generic elmo-folder-list-answereds (folder)
-  "Return a list of answered message numbers contained in FOLDER.")
-
-(luna-define-method elmo-folder-list-unreads ((folder elmo-folder))
-  (delq nil
-       (mapcar
-        (lambda (x)
-          (if (member (cadr x) (elmo-msgdb-unread-marks))
-              (car x)))
-        (elmo-msgdb-get-mark-alist (elmo-folder-msgdb folder)))))
-
-;; TODO: Should reconsider the structure of global mark.
-(defun elmo-folder-list-messages-with-global-mark (folder mark)
-  (let (entity msgs)
+If optional VISIBLE-ONLY is non-nil, killed messages are not listed."
+  (let ((list (elmo-folder-list-messages-internal folder visible-only))
+       (killed (elmo-folder-killed-list-internal folder))
+       numbers)
+    (setq numbers
+         (if (listp list)
+             list
+           ;; Not available, use current list.
+           (mapcar
+            'car
+            (elmo-msgdb-get-number-alist (elmo-folder-msgdb folder)))))
+    (elmo-living-messages numbers killed)))
+
+(defun elmo-folder-list-unreads (folder unread-marks)
+  "Return a list of unread message numbers contained in FOLDER.
+UNREAD-MARKS is the unread marks."
+  (let ((list (elmo-folder-list-unreads-internal folder
+                                                unread-marks)))
+    (if (listp list)
+       list
+      ;; Not available, use current mark.
+      (delq nil
+           (mapcar
+            (function
+             (lambda (x)
+               (if (member (cadr x) unread-marks)
+                   (car x))))
+            (elmo-msgdb-get-mark-alist (elmo-folder-msgdb folder)))))))
+
+(defun elmo-folder-list-importants (folder important-mark)
+  "Returns a list of important message numbers contained in FOLDER.
+IMPORTANT-MARK is the important mark."
+  (let ((importants (elmo-folder-list-importants-internal folder important-mark))
+       (number-alist (elmo-msgdb-get-number-alist
+                      (elmo-folder-msgdb folder)))
+       num-pair result)
     (dolist (mark-pair (or elmo-msgdb-global-mark-alist
                           (setq elmo-msgdb-global-mark-alist
                                 (elmo-object-load
                                  (expand-file-name
                                   elmo-msgdb-global-mark-filename
                                   elmo-msgdb-directory)))))
-      (if (and (string= mark (cdr mark-pair))
-              (setq entity
-                    (elmo-msgdb-overview-get-entity (car mark-pair)
-                                                    (elmo-folder-msgdb
-                                                     folder))))
-         (setq msgs (cons (elmo-msgdb-overview-entity-get-number entity)
-                          msgs))))
-    msgs))
-
-(luna-define-method elmo-folder-list-importants ((folder elmo-folder))
-  (elmo-uniq-list
-   (nconc
-    (elmo-folder-list-messages-with-global-mark folder
-                                               elmo-msgdb-important-mark)
-    (elmo-folder-list-messages-mark-match folder
-                                         (regexp-quote
-                                          elmo-msgdb-important-mark)))))
-
-(luna-define-method elmo-folder-list-answereds ((folder elmo-folder))
-  (delq nil
-       (mapcar
-        (function
-         (lambda (x)
-           (if (member (cadr x) (elmo-msgdb-answered-marks))
-               (car x))))
-        (elmo-msgdb-get-mark-alist (elmo-folder-msgdb folder)))))
+      (if (and (string= important-mark (cdr mark-pair))
+              (setq num-pair (rassoc (car mark-pair) number-alist)))
+         (setq result (cons (car num-pair) result))))
+    (if (listp importants)
+       (elmo-uniq-list (nconc result importants))
+      result)))
 
 (luna-define-generic elmo-folder-list-messages-internal (folder &optional
                                                                visible-only)
@@ -279,10 +261,24 @@ If second optional IN-MSGDB is non-nil, only messages in the msgdb are listed."
   ;; Return t if the message list is not available.
   )
 
+(luna-define-generic elmo-folder-list-unreads-internal (folder
+                                                       unread-marks
+                                                       &optional mark-alist)
+  ;; Return a list of unread message numbers contained in FOLDER.
+  ;; If optional MARK-ALIST is set, it is used as mark-alist.
+  ;; Return t if this feature is not available.
+  )
+
+(luna-define-generic elmo-folder-list-importants-internal (folder
+                                                          important-mark)
+  ;; Return a list of important message numbers contained in FOLDER.
+  ;; Return t if this feature is not available.
+  )
+
 (luna-define-generic elmo-folder-list-subfolders (folder &optional one-level)
   "Returns a list of subfolders contained in FOLDER.
 If optional argument ONE-LEVEL is non-nil, only children of FOLDER is returned.
-\(a folder which have children is returned as a list\)
+(a folder which have children is returned as a list)
 Otherwise, all descendent folders are returned.")
 
 (luna-define-generic elmo-folder-have-subfolder-p (folder)
@@ -332,10 +328,13 @@ CONDITION is a condition structure for testing.
 NUMBERS is a list of message numbers,
 use to be test for \"last\" and \"first\" predicates.")
 
-(luna-define-generic elmo-folder-msgdb-create (folder numbers seen-list)
+(luna-define-generic elmo-folder-msgdb-create
+  (folder numbers new-mark already-mark seen-mark important-mark seen-list)
   "Create a message database (implemented in each backends).
 FOLDER is the ELMO folder structure.
 NUMBERS is a list of message numbers to create msgdb.
+NEW-MARK, ALREADY-MARK, SEEN-MARK, and IMPORTANT-MARK are mark string for
+new message, unread but cached message, read message and important message.
 SEEN-LIST is a list of message-id string which should be treated as read.")
 
 (luna-define-generic elmo-folder-unmark-important (folder numbers)
@@ -358,34 +357,6 @@ NUMBERS is a list of message numbers to be processed.")
 FOLDER is the ELMO folder structure.
 NUMBERS is a list of message numbers to be processed.")
 
-(luna-define-generic elmo-folder-unmark-answered (folder numbers)
-  "Un-mark messages as answered.
-FOLDER is the ELMO folder structure.
-NUMBERS is a list of message numbers to be processed.")
-
-(luna-define-generic elmo-folder-mark-as-answered (folder numbers)
-  "Mark messages as answered.
-FOLDER is the ELMO folder structure.
-NUMBERS is a list of message numbers to be processed.")
-
-(luna-define-generic elmo-folder-set-status (folder numbers status)
-  "Set message status.
-FOLDER is the ELMO folder structure.
-NUMBERS is a list of message numbers to be set status.
-STATUS is a symbol which is one of the following:
-`read'      ... Messages which are already read.
-`important' ... Messages which are marked as important.
-`answered'  ... Messages which are marked as answered.")
-
-(luna-define-generic elmo-folder-unset-status (folder numbers status)
-  "Unset message status.
-FOLDER is the ELMO folder structure.
-NUMBERS is a list of message numbers to be unset status.
-STATUS is a symbol which is one of the following:
-`read'      ... Messages which are already read.
-`important' ... Messages which are marked as important.
-`answered'  ... Messages which are marked as answered.")
-
 (luna-define-generic elmo-folder-append-buffer (folder unread &optional number)
   "Append current buffer as a new message.
 FOLDER is the destination folder(ELMO folder structure).
@@ -396,6 +367,7 @@ If optional argument NUMBER is specified, the new message number is set
 (luna-define-generic elmo-folder-append-messages (folder
                                                  src-folder
                                                  numbers
+                                                 unread-marks
                                                  &optional
                                                  same-number)
   "Append messages from folder.
@@ -404,6 +376,7 @@ Caller should make sure FOLDER is `writable'.
 (Can be checked with `elmo-folder-writable-p').
 SRC-FOLDER is the source ELMO folder structure.
 NUMBERS is the message numbers to be appended in the SRC-FOLDER.
+UNREAD-MARKS is a list of unread mark string.
 If second optional argument SAME-NUMBER is specified,
 message number is preserved (if possible).")
 
@@ -548,6 +521,14 @@ Return newly created temporary directory name which contains temporary files.")
   ((folder elmo-folder) &optional visible-only)
   t)
 
+(luna-define-method elmo-folder-list-unreads-internal
+  ((folder elmo-folder) unread-marks &optional mark-alist)
+  t)
+
+(luna-define-method elmo-folder-list-importants-internal
+  ((folder elmo-folder) important-mark)
+  t)
+
 (defun elmo-folder-encache (folder numbers &optional unread)
   "Encache messages in the FOLDER with NUMBERS.
 If UNREAD is non-nil, messages are not marked as read."
@@ -635,22 +616,6 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
 (luna-define-generic elmo-folder-newsgroups (folder)
   "Return list of newsgroup name of FOLDER.")
 
-(luna-define-generic elmo-folder-search-requires-msgdb-p (folder condition)
-  "Return non-nil if searching in FOLDER by CONDITION requires msgdb fetch.")
-
-(defun elmo-folder-search-requires-msgdb-p-internal (folder condition)
-  (if (listp condition)
-      (or (elmo-folder-search-requires-msgdb-p-internal
-          folder (nth 1 condition))
-         (elmo-folder-search-requires-msgdb-p-internal
-          folder (nth 2 condition)))
-    (and (not (string= (elmo-filter-key condition) "last"))
-        (not (string= (elmo-filter-key condition) "first")))))
-
-(luna-define-method elmo-folder-search-requires-msgdb-p ((folder elmo-folder)
-                                                        condition)
-  (elmo-folder-search-requires-msgdb-p-internal folder condition))
-
 (luna-define-method elmo-folder-newsgroups ((folder elmo-folder))
   nil)
 
@@ -660,7 +625,8 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
 
 (defun elmo-generic-folder-open (folder load-msgdb)
   (let ((inhibit-quit t))
-    (if load-msgdb (elmo-folder-msgdb folder))
+    (if load-msgdb
+       (elmo-folder-set-msgdb-internal folder (elmo-msgdb-load folder)))
     (elmo-folder-set-killed-list-internal
      folder
      (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder))))
@@ -748,34 +714,20 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
 (defsubst elmo-folder-search-fast (folder condition numbers)
   (when (and numbers
             (vectorp condition)
-            (member (elmo-filter-key condition) '("first" "last" "mark")))
-    (if (string= (elmo-filter-key condition) "mark")
-       (let ((msgdb (elmo-folder-msgdb folder)))
-         ;; msgdb should be synchronized at this point.
-         (cond
-          ((string= (elmo-filter-value condition) "unread")
-           (elmo-folder-list-unreads folder))
-          ((string= (elmo-filter-value condition) "important")
-           (elmo-folder-list-importants folder))
-          ((string= (elmo-filter-value condition) "answered")
-           (elmo-folder-list-answereds folder))
-          ((string= (elmo-filter-value condition) "any")
-           (nconc (elmo-folder-list-unreads folder)
-                  (elmo-folder-list-importants folder)
-                  (elmo-folder-list-answereds folder)))))
-      (let ((len (length numbers))
-           (lastp (string= (elmo-filter-key condition) "last"))
-           (value (string-to-number (elmo-filter-value condition))))
-       (when (eq (elmo-filter-type condition) 'unmatch)
-         (setq lastp (not lastp)
-               value  (- len value)))
-       (if lastp
-           (nthcdr (max (- len value) 0) numbers)
-         (when (> value 0)
-           (let ((last (nthcdr (1- value) numbers)))
-             (when last
-               (setcdr last nil))
-             numbers)))))))
+            (member (elmo-filter-key condition) '("first" "last")))
+    (let ((len (length numbers))
+         (lastp (string= (elmo-filter-key condition) "last"))
+         (value (string-to-number (elmo-filter-value condition))))
+      (when (eq (elmo-filter-type condition) 'unmatch)
+       (setq lastp (not lastp)
+             value  (- len value)))
+      (if lastp
+         (nthcdr (max (- len value) 0) numbers)
+       (when (> value 0)
+         (let ((last (nthcdr (1- value) numbers)))
+           (when last
+             (setcdr last nil))
+           numbers))))))
 
 (luna-define-method elmo-folder-search ((folder elmo-folder)
                                        condition
@@ -1002,13 +954,14 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
 (luna-define-method elmo-folder-append-messages ((folder elmo-folder)
                                                 src-folder
                                                 numbers
+                                                unread-marks
                                                 &optional
                                                 same-number)
   (elmo-generic-folder-append-messages folder src-folder numbers
-                                      same-number))
+                                      unread-marks same-number))
 
 (defun elmo-generic-folder-append-messages (folder src-folder numbers
-                                                  same-number)
+                                                  unread-marks same-number)
   (let (unseen seen-list succeed-numbers failure cache)
     (with-temp-buffer
       (set-buffer-multibyte nil)
@@ -1042,7 +995,7 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
                     folder
                     (setq unseen (member (elmo-message-mark
                                           src-folder (car numbers))
-                                         (elmo-msgdb-unread-marks)))
+                                         unread-marks))
                     (if same-number (car numbers))))))
          (error (setq failure t)))
        ;; FETCH & APPEND finished
@@ -1068,6 +1021,7 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
                                             no-delete-info
                                             no-delete
                                             same-number
+                                            unread-marks
                                             save-unread)
   (save-excursion
     (let* ((messages msgs)
@@ -1085,6 +1039,7 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
          (unless (setq succeeds (elmo-folder-append-messages dst-folder
                                                              src-folder
                                                              messages
+                                                             unread-marks
                                                              same-number))
            (error "move: append message to %s failed"
                   (elmo-folder-name-internal dst-folder)))
@@ -1097,7 +1052,7 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
            (setq seen-list
                  (elmo-msgdb-add-msgs-to-seen-list
                   msgs (elmo-folder-msgdb src-folder)
-                  seen-list))
+                  unread-marks seen-list))
            (elmo-msgdb-seen-save dir seen-list))))
       (if (and (not no-delete) succeeds)
          (progn
@@ -1155,7 +1110,7 @@ FIELD is a symbol of the field."
   (elmo-msgdb-get-field (elmo-folder-msgdb folder) number field))
 
 (defun elmo-message-set-mark (folder number mark)
-  ;; Set mark for the message in the FOLDER with NUMBER as MARK.
+  "Set mark for the message in the FOLDER with NUMBER as MARK."
   (elmo-msgdb-set-mark
    (elmo-folder-msgdb folder)
    number mark))
@@ -1166,55 +1121,18 @@ FIELD is a symbol of the field."
 (luna-define-method elmo-message-folder ((folder elmo-folder) number)
   folder) ; default is folder
 
-(luna-define-method elmo-folder-unmark-important ((folder elmo-folder)
-                                                 numbers)
-  (when (elmo-folder-msgdb-internal folder)
-    (dolist (number numbers)
-      (elmo-msgdb-unset-status (elmo-folder-msgdb folder)
-                              folder
-                              number
-                              'important))))
+(luna-define-method elmo-folder-unmark-important ((folder elmo-folder) numbers)
+  t)
 
 (luna-define-method elmo-folder-mark-as-important ((folder elmo-folder)
                                                   numbers)
-  (when (elmo-folder-msgdb-internal folder)
-    (dolist (number numbers)
-      (elmo-msgdb-set-status (elmo-folder-msgdb folder)
-                            folder
-                            number
-                            'important))))
+  t)
 
 (luna-define-method elmo-folder-unmark-read ((folder elmo-folder) numbers)
-  (when (elmo-folder-msgdb-internal folder)
-    (dolist (number numbers)
-      (elmo-msgdb-unset-status (elmo-folder-msgdb folder)
-                              folder
-                              number
-                              'read))))
+  t)
 
 (luna-define-method elmo-folder-mark-as-read ((folder elmo-folder) numbers)
-  (when (elmo-folder-msgdb-internal folder)
-    (dolist (number numbers)
-      (elmo-msgdb-set-status (elmo-folder-msgdb folder)
-                            folder
-                            number
-                            'read))))
-
-(luna-define-method elmo-folder-unmark-answered ((folder elmo-folder) numbers)
-  (when (elmo-folder-msgdb-internal folder)
-    (dolist (number numbers)
-      (elmo-msgdb-unset-status (elmo-folder-msgdb folder)
-                              folder
-                              number
-                              'answered))))
-
-(luna-define-method elmo-folder-mark-as-answered ((folder elmo-folder) numbers)
-  (when (elmo-folder-msgdb-internal folder)
-    (dolist (number numbers)
-      (elmo-msgdb-set-status (elmo-folder-msgdb folder)
-                            folder
-                            number
-                            'answered))))
+  t)
 
 (luna-define-method elmo-folder-process-crosspost ((folder elmo-folder)
                                                   &optional
@@ -1222,6 +1140,19 @@ FIELD is a symbol of the field."
   ;; Do nothing.
   )
 
+(defsubst elmo-folder-replace-marks (folder alist)
+  "Replace marks of the FOLDER according to ALIST."
+  (let (pair)
+    (dolist (elem (elmo-msgdb-get-mark-alist (elmo-folder-msgdb folder)))
+      (when (setq pair (assoc (cadr elem) alist))
+       (if (elmo-message-use-cache-p folder (car elem))
+           (elmo-msgdb-set-mark (elmo-folder-msgdb folder)
+                                (car elem)
+                                (cdr pair))
+         (elmo-msgdb-set-mark (elmo-folder-msgdb folder)
+                              (car elem)
+                              nil))))))
+
 (defun elmo-generic-folder-append-msgdb (folder append-msgdb)
   (if append-msgdb
       (let* ((number-alist (elmo-msgdb-get-number-alist append-msgdb))
@@ -1233,10 +1164,6 @@ FIELD is a symbol of the field."
             pair overview
             to-be-deleted
             mark-alist)
-       (elmo-folder-set-msgdb-internal folder
-                                       (elmo-msgdb-append
-                                        (elmo-folder-msgdb folder)
-                                        append-msgdb))
        (while cur
          (setq all-alist (delq (car cur) all-alist))
          ;; same message id exists.
@@ -1262,6 +1189,10 @@ FIELD is a symbol of the field."
              (t
               ;; Do nothing.
               (setq to-be-deleted nil)))
+       (elmo-folder-set-msgdb-internal folder
+                                       (elmo-msgdb-append
+                                        (elmo-folder-msgdb folder)
+                                        append-msgdb))
        (length to-be-deleted))
     0))
 
@@ -1354,17 +1285,29 @@ FIELD is a symbol of the field."
   (elmo-folder-set-msgdb-internal folder (elmo-msgdb-clear)))
 
 (defun elmo-folder-synchronize (folder
+                               new-mark             ;"N"
+                               unread-uncached-mark ;"U"
+                               unread-cached-mark   ;"!"
+                               read-uncached-mark   ;"u"
+                               important-mark       ;"$"
                                &optional ignore-msgdb
                                no-check)
   "Synchronize the folder data to the newest status.
 FOLDER is the ELMO folder structure.
+NEW-MARK, UNREAD-CACHED-MARK, READ-UNCACHED-MARK, and IMPORTANT-MARK
+are mark strings for new messages, unread but cached messages,
+read but not cached messages, and important messages.
 If optional IGNORE-MSGDB is non-nil, current msgdb is thrown away except
 read mark status. If IGNORE-MSGDB is 'visible-only, only visible messages
 \(the messages which are not in the killed-list\) are thrown away and
 synchronized.
 If NO-CHECK is non-nil, rechecking folder is skipped.
 
-Return a list of a cross-posted message number.
+Return a list of
+\(NEW-MSGDB DELETE-LIST CROSSED\)
+NEW-MSGDB is the newly appended msgdb.
+DELETE-LIST is a list of deleted message number.
+CROSSED is cross-posted message number.
 If update process is interrupted, return nil."
   (let ((killed-list (elmo-folder-killed-list-internal folder))
        (before-append t)
@@ -1380,9 +1323,11 @@ If update process is interrupted, return nil."
                      (elmo-folder-msgdb folder)))
     (if ignore-msgdb
        (progn
-         (setq seen-list (nconc (elmo-msgdb-seen-list
-                                 (elmo-folder-msgdb folder))
-                                seen-list))
+         (setq seen-list (nconc
+                          (elmo-msgdb-seen-list
+                           (elmo-folder-msgdb folder)
+                           (list important-mark read-uncached-mark))
+                          seen-list))
          (elmo-folder-clear folder (eq ignore-msgdb 'visible-only))))
     (unless no-check (elmo-folder-check folder))
     (condition-case nil
@@ -1413,16 +1358,19 @@ If update process is interrupted, return nil."
              (progn
                (elmo-folder-update-number folder)
                (elmo-folder-process-crosspost folder)
-               0 ; no updates.
+               (list nil nil nil) ; no updates.
                )
            (if delete-list (elmo-msgdb-delete-msgs
                             (elmo-folder-msgdb folder) delete-list))
            (when new-list
              (setq new-msgdb (elmo-folder-msgdb-create
-                              folder new-list seen-list))
+                              folder
+                              new-list
+                              new-mark unread-cached-mark
+                              read-uncached-mark important-mark
+                              seen-list))
              (elmo-msgdb-change-mark (elmo-folder-msgdb folder)
-                                     elmo-msgdb-new-mark
-                                     elmo-msgdb-unread-uncached-mark)
+                                     new-mark unread-uncached-mark)
              ;; Clear seen-list.
              (if (elmo-folder-persistent-p folder)
                  (setq seen-list (elmo-msgdb-seen-save
@@ -1435,7 +1383,7 @@ If update process is interrupted, return nil."
              (elmo-folder-set-message-modified-internal folder t)
              (elmo-folder-set-mark-modified-internal folder t))
            ;; return value.
-           (or crossed 0)))
+           (list new-msgdb delete-list crossed)))
       (quit
        ;; Resume to the original status.
        (if before-append
@@ -1449,6 +1397,7 @@ If update process is interrupted, return nil."
    (elmo-msgdb-get-number-alist
     (elmo-folder-msgdb folder))))
 
+;;;
 (defun elmo-msgdb-load (folder &optional silent)
   (unless silent
     (message "Loading msgdb for %s..." (elmo-folder-name-internal folder)))
index d3f2b94..165e07e 100644 (file)
                                         t
                                         copy
                                         preserve-number
+                                        nil
                                         wl-expire-add-seen-list)
              (progn
                (wl-expire-append-log
@@ -204,6 +205,7 @@ If REFILE-LIST includes reserve mark message, so copy."
                                               t
                                               copy-reserve-message
                                               preserve-number
+                                              nil
                                               wl-expire-add-seen-list))
            (error "Expire: move msgs to %s failed"
                   (elmo-folder-name-internal dst-folder)))
@@ -811,7 +813,7 @@ ex. +ml/wl/1999_11/, +ml/wl/1999_12/."
   (interactive "P")
   (let* ((folder (or folder wl-summary-buffer-elmo-folder))
         (msgdb (or (wl-summary-buffer-msgdb)
-                   (elmo-folder-msgdb folder)))
+                   (elmo-msgdb-load folder)))
         (msgs (if (not nolist)
                   (elmo-folder-list-messages folder)
                 (mapcar 'car (elmo-msgdb-get-number-alist msgdb))))
index 4099f3b..ea911f4 100644 (file)
@@ -816,20 +816,19 @@ Optional argument ARG is repeart count."
 
 (defun wl-folder-check-one-entity (entity &optional biff)
   (let* ((folder (wl-folder-get-elmo-folder entity biff))
-        (nums ;(condition-case err
+        (nums (condition-case err
                   (progn
                     (if biff (elmo-folder-set-biff-internal folder t))
                     (if (wl-string-match-member entity wl-strict-diff-folders)
                         (elmo-strict-folder-diff folder)
                       (elmo-folder-diff folder)))
-               ; (error
+                (error
                  ;; maybe not exist folder.
-               ;  (if (and (not (memq 'elmo-open-error
-               ;                     (get (car err) 'error-conditions)))
-               ;          (not (elmo-folder-exists-p folder)))
-               ;      (wl-folder-create-subr folder)
-               ;    (signal (car err) (cdr err))))))
-                  )
+                 (if (and (not (memq 'elmo-open-error
+                                     (get (car err) 'error-conditions)))
+                          (not (elmo-folder-exists-p folder)))
+                     (wl-folder-create-subr folder)
+                   (signal (car err) (cdr err))))))
         (new    (elmo-diff-new nums))
         (unread (elmo-diff-unread nums))
         (all    (elmo-diff-all nums))
index 9cbfd21..4391cf5 100644 (file)
 (defun wl-highlight-summary-line-string (line mark temp-mark indent)
   (let (fsymbol)
     (cond ((and (string= temp-mark "+")
-               (member mark (list elmo-msgdb-unread-cached-mark
-                                  elmo-msgdb-unread-uncached-mark
-                                  elmo-msgdb-new-mark)))
+               (member mark (list wl-summary-unread-cached-mark
+                                  wl-summary-unread-uncached-mark
+                                  wl-summary-new-mark)))
           (setq fsymbol 'wl-highlight-summary-high-unread-face))
          ((and (string= temp-mark "-")
-               (member mark (list elmo-msgdb-unread-cached-mark
-                                  elmo-msgdb-unread-uncached-mark
-                                  elmo-msgdb-new-mark)))
+               (member mark (list wl-summary-unread-cached-mark
+                                  wl-summary-unread-uncached-mark
+                                  wl-summary-new-mark)))
           (setq fsymbol 'wl-highlight-summary-low-unread-face))
          ((string= temp-mark "o")
           (setq fsymbol 'wl-highlight-summary-refiled-face))
           (setq fsymbol 'wl-highlight-summary-deleted-face))
          ((string= temp-mark "*")
           (setq fsymbol 'wl-highlight-summary-temp-face))
-         ((string= mark elmo-msgdb-new-mark)
+         ((string= mark wl-summary-new-mark)
           (setq fsymbol 'wl-highlight-summary-new-face))
-         ((member mark (list elmo-msgdb-unread-cached-mark
-                             elmo-msgdb-unread-uncached-mark))
+         ((member mark (list wl-summary-unread-cached-mark
+                             wl-summary-unread-uncached-mark))
           (setq fsymbol 'wl-highlight-summary-unread-face))
-         ((or (string= mark elmo-msgdb-important-mark))
+         ((or (string= mark wl-summary-important-mark))
           (setq fsymbol 'wl-highlight-summary-important-face))
          ((string= temp-mark "-")
           (setq fsymbol 'wl-highlight-summary-low-read-face))
       (if (not fsymbol)
          (cond
           ((and (string= temp-mark "+")
-                (member status-mark (list elmo-msgdb-unread-cached-mark
-                                          elmo-msgdb-unread-uncached-mark
-                                          elmo-msgdb-new-mark)))
+                (member status-mark (list wl-summary-unread-cached-mark
+                                          wl-summary-unread-uncached-mark
+                                          wl-summary-new-mark)))
            (setq fsymbol 'wl-highlight-summary-high-unread-face))
           ((and (string= temp-mark "-")
-                (member status-mark (list elmo-msgdb-unread-cached-mark
-                                          elmo-msgdb-unread-uncached-mark
-                                          elmo-msgdb-new-mark)))
+                (member status-mark (list wl-summary-unread-cached-mark
+                                          wl-summary-unread-uncached-mark
+                                          wl-summary-new-mark)))
            (setq fsymbol 'wl-highlight-summary-low-unread-face))
-          ((string= status-mark elmo-msgdb-new-mark)
+          ((string= status-mark wl-summary-new-mark)
            (setq fsymbol 'wl-highlight-summary-new-face))
-          ((member status-mark (list elmo-msgdb-unread-cached-mark
-                                     elmo-msgdb-unread-uncached-mark))
+          ((member status-mark (list wl-summary-unread-cached-mark
+                                     wl-summary-unread-uncached-mark))
            (setq fsymbol 'wl-highlight-summary-unread-face))
-          ((string= status-mark elmo-msgdb-important-mark)
+          ((string= status-mark wl-summary-important-mark)
            (setq fsymbol 'wl-highlight-summary-important-face))
           ;; score mark
           ((string= temp-mark "-")
index 3c6bd28..cd546eb 100644 (file)
@@ -83,7 +83,6 @@
 (defvar wl-summary-buffer-current-msg nil)
 (defvar wl-summary-buffer-unread-count 0)
 (defvar wl-summary-buffer-new-count    0)
-(defvar wl-summary-buffer-answered-count 0)
 (defvar wl-summary-buffer-mime-charset  nil)
 (defvar wl-summary-buffer-weekday-name-lang  nil)
 (defvar wl-summary-buffer-thread-indent-set-alist  nil)
 (make-variable-buffer-local 'wl-summary-buffer-last-displayed-msg)
 (make-variable-buffer-local 'wl-summary-buffer-unread-count)
 (make-variable-buffer-local 'wl-summary-buffer-new-count)
-(make-variable-buffer-local 'wl-summary-buffer-answered-count)
 (make-variable-buffer-local 'wl-summary-buffer-mime-charset)
 (make-variable-buffer-local 'wl-summary-buffer-weekday-name-lang)
 (make-variable-buffer-local 'wl-summary-buffer-thread-indent-set)
 (defvar wl-temp-mark)
 (defvar wl-persistent-mark)
 
+;; internal functions (dummy)
+(unless (fboundp 'wl-summary-append-message-func-internal)
+  (defun wl-summary-append-message-func-internal (entity msgdb update
+                                                        &optional force-insert)))
+
 (defmacro wl-summary-sticky-buffer-name (name)
   (` (concat wl-summary-buffer-name ":" (, name))))
 
@@ -570,12 +573,15 @@ See also variable `wl-use-petname'."
       (wl-summary-redisplay)))
 
 (defun wl-summary-count-unread ()
-  (let ((lst (elmo-msgdb-count-marks (wl-summary-buffer-msgdb))))
+  (let ((pair
+        (elmo-msgdb-count-marks (wl-summary-buffer-msgdb)
+                                wl-summary-new-mark
+                                (list wl-summary-unread-uncached-mark
+                                      wl-summary-unread-cached-mark))))
     (if (eq major-mode 'wl-summary-mode)
-       (setq wl-summary-buffer-new-count (car lst)
-             wl-summary-buffer-unread-count (nth 1 lst)
-             wl-summary-buffer-answered-count (nth 2 lst)))
-    lst))
+       (setq wl-summary-buffer-new-count (car pair)
+             wl-summary-buffer-unread-count (cdr pair)))
+    pair))
 
 (defun wl-summary-message-string (&optional use-cache)
   "Return full body string of current message.
@@ -945,6 +951,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
         (inhibit-read-only t)
         (buffer-read-only nil)
         expunged)
+    (fset 'wl-summary-append-message-func-internal
+         (wl-summary-get-append-message-func))
     (erase-buffer)
     (message "Re-scanning...")
     (setq i 0)
@@ -971,7 +979,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
     (elmo-kill-buffer wl-summary-search-buf-name)
     (while curp
       (setq entity (car curp))
-      (wl-summary-insert-message entity msgdb nil)
+      (wl-summary-append-message-func-internal entity msgdb nil)
       (setq curp (cdr curp))
       (when (> num elmo-display-progress-threshold)
        (setq i (+ i 1))
@@ -985,7 +993,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
                 (caar wl-summary-delayed-update)
                 (elmo-msgdb-overview-entity-get-number
                  (cdar wl-summary-delayed-update)))
-       (wl-summary-insert-message
+       (wl-summary-append-message-func-internal
         (cdar wl-summary-delayed-update) msgdb nil t)
        (setq wl-summary-delayed-update (cdr wl-summary-delayed-update))))
     (message "Constructing summary structure...done")
@@ -994,7 +1002,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'."
        (progn
          (message "Inserting thread...")
          (wl-thread-insert-top)
-         (message "Inserting thread...done")))
+         (message "Inserting thread...done"))
+      (wl-summary-make-number-list))
     (when wl-use-scoring
       (setq wl-summary-scored nil)
       (wl-summary-score-headers nil msgdb
@@ -1428,15 +1437,15 @@ If ARG is non-nil, checking is omitted."
                    (setq new-mark
                          (cond
                           ((string= mark
-                                    elmo-msgdb-unread-uncached-mark)
-                           elmo-msgdb-unread-cached-mark)
-                          ((string= mark elmo-msgdb-new-mark)
+                                    wl-summary-unread-uncached-mark)
+                           wl-summary-unread-cached-mark)
+                          ((string= mark wl-summary-new-mark)
                            (setq wl-summary-buffer-new-count
                                  (- wl-summary-buffer-new-count 1))
                            (setq wl-summary-buffer-unread-count
                                  (+ wl-summary-buffer-unread-count 1))
-                           elmo-msgdb-unread-cached-mark)
-                          ((string= mark elmo-msgdb-read-uncached-mark)
+                           wl-summary-unread-cached-mark)
+                          ((string= mark wl-summary-read-uncached-mark)
                            nil)
                           (t mark)))
                    (elmo-msgdb-set-mark msgdb number new-mark)
@@ -1450,9 +1459,9 @@ If ARG is non-nil, checking is omitted."
                  new-mark)))))))
 
 ;;(defvar wl-summary-message-uncached-marks
-;;  (list elmo-msgdb-new-mark
-;;     elmo-msgdb-unread-uncached-mark
-;;     elmo-msgdb-read-uncached-mark))
+;;  (list wl-summary-new-mark
+;;     wl-summary-unread-uncached-mark
+;;     wl-summary-read-uncached-mark))
 
 (defun wl-summary-prefetch-region (beg end &optional prefetch-marks)
   (interactive "r")
@@ -1499,8 +1508,8 @@ If ARG is non-nil, checking is omitted."
                           (wl-summary-prefetch))
                       (wl-summary-prefetch-msg (car targets))))
          (if (if prefetch-marks
-                 (string= mark elmo-msgdb-unread-cached-mark)
-               (or (string= mark elmo-msgdb-unread-cached-mark)
+                 (string= mark wl-summary-unread-cached-mark)
+               (or (string= mark wl-summary-unread-cached-mark)
                    (string= mark " ")))
              (message "Prefetching... %d/%d message(s)"
                       (setq count (+ 1 count)) length))
@@ -1673,36 +1682,39 @@ If ARG is non-nil, checking is omitted."
        (message "Setting all msgs as read...")
        (elmo-folder-mark-as-read folder
                                  (elmo-folder-list-unreads
-                                  folder))
+                                  folder
+                                  (list wl-summary-unread-cached-mark
+                                        wl-summary-unread-uncached-mark
+                                        wl-summary-new-mark)))
        (save-excursion
          (goto-char (point-min))
          (while (not (eobp))
            (setq msg (wl-summary-message-number))
            (setq mark (wl-summary-persistent-mark))
            (when (and (not (string= mark " "))
-                      (not (string= mark elmo-msgdb-important-mark))
-                      (not (string= mark elmo-msgdb-read-uncached-mark)))
+                      (not (string= mark wl-summary-important-mark))
+                      (not (string= mark wl-summary-read-uncached-mark)))
              (delete-backward-char 1)
              (if (or (not (elmo-message-use-cache-p folder msg))
-                     (string= mark elmo-msgdb-unread-cached-mark))
+                     (string= mark wl-summary-unread-cached-mark))
                  (progn
                    (insert " ")
                    (elmo-msgdb-set-mark msgdb msg nil))
                ;; New mark and unread-uncached mark
-               (insert elmo-msgdb-read-uncached-mark)
+               (insert wl-summary-read-uncached-mark)
                (elmo-msgdb-set-mark
-                msgdb msg elmo-msgdb-read-uncached-mark))
+                msgdb msg wl-summary-read-uncached-mark))
              (if wl-summary-highlight
                  (wl-highlight-summary-current-line nil nil t)))
            (forward-line 1)))
-;      (elmo-folder-replace-marks
-;       folder
-;       (list (cons elmo-msgdb-unread-cached-mark
-;                   nil)
-;             (cons elmo-msgdb-unread-uncached-mark
-;                   elmo-msgdb-read-uncached-mark)
-;             (cons elmo-msgdb-new-mark
-;                   elmo-msgdb-read-uncached-mark)))
+       (elmo-folder-replace-marks
+        folder
+        (list (cons wl-summary-unread-cached-mark
+                    nil)
+              (cons wl-summary-unread-uncached-mark
+                    wl-summary-read-uncached-mark)
+              (cons wl-summary-new-mark
+                    wl-summary-read-uncached-mark)))
        (wl-summary-set-mark-modified)
        (wl-folder-update-unread (wl-summary-buffer-folder-name) 0)
        (setq wl-summary-buffer-unread-count 0)
@@ -1724,15 +1736,15 @@ If ARG is non-nil, checking is omitted."
           mark number unread new-mark)
       (setq mark (wl-summary-persistent-mark))
       (cond
-       ((or (string= mark elmo-msgdb-new-mark)
-           (string= mark elmo-msgdb-unread-uncached-mark)
-           (string= mark elmo-msgdb-important-mark))
+       ((or (string= mark wl-summary-new-mark)
+           (string= mark wl-summary-unread-uncached-mark)
+           (string= mark wl-summary-important-mark))
        ;; noop
        )
-       ((string= mark elmo-msgdb-unread-cached-mark)
-       (setq new-mark elmo-msgdb-unread-uncached-mark))
+       ((string= mark wl-summary-unread-cached-mark)
+       (setq new-mark wl-summary-unread-uncached-mark))
        (t
-       (setq new-mark elmo-msgdb-read-uncached-mark)))
+       (setq new-mark wl-summary-read-uncached-mark)))
       (when new-mark
        (setq number (wl-summary-message-number))
        (delete-backward-char 1)
@@ -1769,16 +1781,16 @@ If ARG is non-nil, checking is omitted."
        (setq set-mark nil)
        (if (elmo-file-cache-exists-p msgid)
            (if (or
-                (string= mark elmo-msgdb-unread-uncached-mark) ; U -> !
-                (string= mark elmo-msgdb-new-mark)             ; N -> !
+                (string= mark wl-summary-unread-uncached-mark) ; U -> !
+                (string= mark wl-summary-new-mark)             ; N -> !
                 )
-               (setq set-mark elmo-msgdb-unread-cached-mark)
-             (if (string= mark elmo-msgdb-read-uncached-mark)  ; u -> ' '
+               (setq set-mark wl-summary-unread-cached-mark)
+             (if (string= mark wl-summary-read-uncached-mark)  ; u -> ' '
                  (setq set-mark " ")))
          (if (string= mark " ")
-             (setq set-mark elmo-msgdb-read-uncached-mark)     ;' ' -> u
-           (if (string= mark elmo-msgdb-unread-cached-mark)
-               (setq set-mark elmo-msgdb-unread-uncached-mark) ; !  -> U
+             (setq set-mark wl-summary-read-uncached-mark)     ;' ' -> u
+           (if (string= mark wl-summary-unread-cached-mark)
+               (setq set-mark wl-summary-unread-uncached-mark) ; !  -> U
              )))
        (when set-mark
          (delete-backward-char 1)
@@ -1852,25 +1864,6 @@ If ARG is non-nil, checking is omitted."
              (wl-highlight-summary-current-line)))
        (forward-line 1)))))
 
-(defun wl-summary-update-status-marks ()
-  "Synchronize status marks on current buffer to the msgdb."
-  (interactive)
-  (save-excursion
-    (goto-char (point-min))
-    (let ((inhibit-read-only t)
-         (buffer-read-only nil)
-         mark)
-      (while (not (eobp))
-       (unless (string= (wl-summary-persistent-mark)
-                        (setq mark (or (elmo-message-mark
-                                        wl-summary-buffer-elmo-folder
-                                        (wl-summary-message-number))
-                                       " ")))
-         (delete-backward-char 1)
-         (insert mark)
-         (if wl-summary-highlight (wl-highlight-summary-current-line)))
-       (forward-line 1)))))
-
 (defun wl-summary-get-delete-folder (folder)
   (if (string= folder wl-trash-folder)
       'null
@@ -1890,10 +1883,10 @@ If ARG is non-nil, checking is omitted."
                   (error "Trash Folder is not created"))))
               wl-trash-folder)))))
 
-(defun wl-summary-insert-message (&rest args)
+(defun wl-summary-get-append-message-func ()
   (if (eq wl-summary-buffer-view 'thread)
-      (apply 'wl-summary-insert-thread-entity args)
-    (apply 'wl-summary-insert-sequential args)))
+      'wl-summary-insert-thread-entity
+    'wl-summary-insert-sequential))
 
 (defun wl-summary-sort ()
   (interactive)
@@ -1909,9 +1902,8 @@ If ARG is non-nil, checking is omitted."
   "Update marks in summary."
   (interactive)
   (let ((last-progress 0)
-       (folder wl-summary-buffer-elmo-folder)
        (i 0)
-       importants unreads
+       unread-marks importants unreads
        importants-in-db unreads-in-db diff diffs
        mes progress)
     ;; synchronize marks.
@@ -1919,22 +1911,27 @@ If ARG is non-nil, checking is omitted."
                    wl-summary-buffer-elmo-folder)
                   'internal))
       (message "Updating marks...")
-      (setq importants-in-db (elmo-folder-list-messages-mark-match
+      (setq unread-marks (list wl-summary-unread-cached-mark
+                              wl-summary-unread-uncached-mark
+                              wl-summary-new-mark)
+           importants-in-db (elmo-folder-list-messages-mark-match
                              wl-summary-buffer-elmo-folder
-                             (regexp-quote elmo-msgdb-important-mark))
+                             (regexp-quote wl-summary-important-mark))
            unreads-in-db (elmo-folder-list-messages-mark-match
                           wl-summary-buffer-elmo-folder
-                          (wl-regexp-opt (elmo-msgdb-unread-marks)))
+                          (wl-regexp-opt unread-marks))
            importants (elmo-folder-list-importants
-                       wl-summary-buffer-elmo-folder)
+                       wl-summary-buffer-elmo-folder
+                       wl-summary-important-mark)
            unreads (elmo-folder-list-unreads
-                    wl-summary-buffer-elmo-folder))
+                    wl-summary-buffer-elmo-folder
+                    unread-marks))
       (setq diff (elmo-list-diff importants importants-in-db))
       (setq diffs (cadr diff)) ; important-deletes
       (setq mes (format "Updated (-%d" (length diffs)))
       (while diffs
        (wl-summary-mark-as-important (car diffs)
-                                     elmo-msgdb-important-mark
+                                     wl-summary-important-mark
                                      'no-server)
        (setq diffs (cdr diffs)))
       (setq diffs (car diff)) ; important-appends
@@ -1965,22 +1962,34 @@ If ARG is non-nil, checking is omitted."
         (buffer-read-only nil)
         gc-message
         overview number-alist
-        curp num i diff
+        curp num i new-msgdb
         append-list delete-list crossed
         update-thread update-top-list
-        expunged mes entity)
+        expunged mes sync-result entity)
     (unwind-protect
        (progn
          (unless wl-summary-buffer-elmo-folder
            (error "(Internal error) Folder is not set:%s" (buffer-name
                                                            (current-buffer))))
+         (fset 'wl-summary-append-message-func-internal
+               (wl-summary-get-append-message-func))
          ;; Flush pending append operations (disconnected operation).
          ;;(setq seen-list
          ;;(wl-summary-flush-pending-append-operations seen-list))
          (goto-char (point-max))
          (wl-folder-confirm-existence folder (elmo-folder-plugged-p folder))
-         (setq crossed (elmo-folder-synchronize folder sync-all no-check))
-         (if crossed
+         (setq sync-result (elmo-folder-synchronize
+                            folder
+                            wl-summary-new-mark
+                            wl-summary-unread-uncached-mark
+                            wl-summary-unread-cached-mark
+                            wl-summary-read-uncached-mark
+                            wl-summary-important-mark
+                            sync-all no-check))
+         (setq new-msgdb (nth 0 sync-result))
+         (setq delete-list (nth 1 sync-result))
+         (setq crossed (nth 2 sync-result))
+         (if sync-result
              (progn
                ;; Setup sync-all
                (if sync-all (wl-summary-sync-all-init))
@@ -1991,24 +2000,19 @@ If ARG is non-nil, checking is omitted."
 ;            (wl-summary-delete-canceled-msgs-from-list
 ;             delete-list
 ;             (wl-summary-buffer-msgdb))))
-               (setq diff (elmo-list-diff (elmo-folder-list-messages
-                                           folder
-                                           'visible-only
-                                           'in-msgdb)
-                                          wl-summary-buffer-number-list))
-               (setq append-list (car diff))
-               (setq delete-list (cadr diff))
-               
                (when delete-list
-                 (wl-summary-delete-messages-on-buffer
-                  delete-list "Deleting...")
+                 (wl-summary-delete-messages-on-buffer delete-list "Deleting...")
                  (message "Deleting...done"))
-               (wl-summary-update-status-marks)
+               (when new-msgdb
+                 (wl-summary-replace-status-marks
+                  wl-summary-new-mark
+                  wl-summary-unread-uncached-mark))
+               (setq append-list (elmo-msgdb-get-overview new-msgdb))
                (setq curp append-list)
                (setq num (length curp))
                (when append-list
                  (setq i 0)
-                 
+
                  ;; set these value for append-message-func
                  (setq overview (elmo-msgdb-get-overview
                                  (elmo-folder-msgdb folder)))
@@ -2018,10 +2022,9 @@ If ARG is non-nil, checking is omitted."
                  (setq wl-summary-delayed-update nil)
                  (elmo-kill-buffer wl-summary-search-buf-name)
                  (while curp
-                   (setq entity (elmo-msgdb-overview-get-entity
-                                 (car curp) (elmo-folder-msgdb folder)))
+                   (setq entity (car curp))
                    (when (setq update-thread
-                               (wl-summary-insert-message
+                               (wl-summary-append-message-func-internal
                                 entity (elmo-folder-msgdb folder)
                                 (not sync-all)))
                      (wl-append update-top-list update-thread))
@@ -2034,10 +2037,7 @@ If ARG is non-nil, checking is omitted."
                      (setq i (+ i 1))
                      (if (or (zerop (% i 5)) (= i num))
                          (elmo-display-progress
-                          'wl-summary-sync-update
-                          (if (eq wl-summary-buffer-view 'thread)
-                              "Making thread..."
-                            "Inserting message...")
+                          'wl-summary-sync-update "Updating thread..."
                           (/ (* i 100) num)))))
                  (when wl-summary-delayed-update
                    (while wl-summary-delayed-update
@@ -2046,7 +2046,7 @@ If ARG is non-nil, checking is omitted."
                               (elmo-msgdb-overview-entity-get-number
                                (cdar wl-summary-delayed-update)))
                      (when (setq update-thread
-                                 (wl-summary-insert-message
+                                 (wl-summary-append-message-func-internal
                                   (cdar wl-summary-delayed-update)
                                   (elmo-folder-msgdb folder)
                                   (not sync-all) t))
@@ -2057,16 +2057,16 @@ If ARG is non-nil, checking is omitted."
                             update-top-list)
                    (wl-thread-update-indent-string-thread
                     (elmo-uniq-list update-top-list)))
-                 (message (if (eq wl-summary-buffer-view 'thread)
-                              "Making thread...done"
-                            "Inserting message...done")))
+                 (message "Updating thread...done"))
+               (unless (eq wl-summary-buffer-view 'thread)
+                 (wl-summary-make-number-list))
                (wl-summary-set-message-modified)
                (wl-summary-set-mark-modified)
                (when (and sync-all (eq wl-summary-buffer-view 'thread))
                  (elmo-kill-buffer wl-summary-search-buf-name)
-                 (message "Inserting message...")
+                 (message "Inserting thread...")
                  (wl-thread-insert-top)
-                 (message "Inserting message...done"))
+                 (message "Inserting thread...done"))
                (if elmo-use-database
                    (elmo-database-close))
                (run-hooks 'wl-summary-sync-updated-hook)
@@ -2080,7 +2080,7 @@ If ARG is non-nil, checking is omitted."
                                (length delete-list) num))))
            (setq mes "Quit updating.")))
       ;; synchronize marks.
-      (if (and crossed wl-summary-auto-sync-marks)
+      (if (and wl-summary-auto-sync-marks sync-result)
          (wl-summary-sync-marks))
       ;; scoring
       (when wl-use-scoring
@@ -2105,8 +2105,8 @@ If ARG is non-nil, checking is omitted."
       (wl-folder-set-folder-updated
        (elmo-folder-name-internal folder)
        (list 0
-            (let ((lst (wl-summary-count-unread)))
-              (+ (car lst) (nth 1 lst)))
+            (let ((pair (wl-summary-count-unread)))
+              (+ (car pair) (cdr pair)))
             (elmo-folder-messages folder)))
       (wl-summary-update-modeline)
       ;;
@@ -2383,15 +2383,10 @@ If ARG, without confirm."
        (get-buffer-create wl-summary-buffer-name))))
 
 (defun wl-summary-make-number-list ()
-  (save-excursion
-    (goto-char (point-min))
-    (while (not (eobp))
-      (setq wl-summary-buffer-number-list
-           (cons (wl-summary-message-number)
-                 wl-summary-buffer-number-list))
-      (forward-line 1))
-    (setq wl-summary-buffer-number-list
-         (nreverse wl-summary-buffer-number-list))))
+  (setq wl-summary-buffer-number-list
+       (mapcar
+        (lambda (x) (elmo-msgdb-overview-entity-get-number x))
+        (elmo-msgdb-get-overview (wl-summary-buffer-msgdb)))))
 
 (defun wl-summary-auto-select-msg-p (unread-msg)
   (and unread-msg
@@ -2399,7 +2394,7 @@ If ARG, without confirm."
             (elmo-msgdb-get-mark
              (wl-summary-buffer-msgdb)
              unread-msg)
-            elmo-msgdb-important-mark))))
+            wl-summary-important-mark))))
 
 (defsubst wl-summary-open-folder (folder)
   ;; Select folder
@@ -2645,11 +2640,7 @@ If ARG, without confirm."
                             (elmo-msgdb-get-mark
                              msgdb
                              (elmo-msgdb-overview-entity-get-number
-                              entity))))
-    (setq wl-summary-buffer-number-list
-         (wl-append wl-summary-buffer-number-list
-                    (list (elmo-msgdb-overview-entity-get-number entity))))
-    nil))
+                              entity))))))
 
 (defun wl-summary-default-subject-filter (subject)
   (let ((case-fold-search t))
@@ -2861,7 +2852,7 @@ If ARG, without confirm."
          (folder wl-summary-buffer-elmo-folder)
          (msgdb (wl-summary-buffer-msgdb))
 ;;;      (number-alist (elmo-msgdb-get-number-alist msgdb))
-         new-mark visible mark cur-mark entity)
+         new-mark visible mark cur-mark)
       (if number
          (progn
            (setq visible (wl-summary-jump-to-msg number))
@@ -2882,20 +2873,22 @@ If ARG, without confirm."
                ;; visible.
                (setq cur-mark (wl-summary-persistent-mark))
                (or (string= cur-mark " ")
-                   (string= cur-mark elmo-msgdb-read-uncached-mark))))
+                   (string= cur-mark wl-summary-read-uncached-mark))))
          (progn
            (setq number (or number (wl-summary-message-number)))
            (setq mark (or mark cur-mark))
            (save-match-data
              (setq new-mark (if (string= mark
-                                         elmo-msgdb-read-uncached-mark)
-                                elmo-msgdb-unread-uncached-mark
+                                         wl-summary-read-uncached-mark)
+                                wl-summary-unread-uncached-mark
                               (if (elmo-message-use-cache-p folder number)
-                                  elmo-msgdb-unread-cached-mark
-                                elmo-msgdb-unread-uncached-mark))))
+                                  wl-summary-unread-mark
+                                wl-summary-unread-uncached-mark))))
            ;; server side mark
            (unless no-server-update
-             (elmo-folder-unmark-read folder (list number)))
+             (save-match-data
+               (unless (elmo-folder-unmark-read folder (list number))
+                 (error "Setting mark failed"))))
            (when visible
              (delete-backward-char 1)
              (insert new-mark))
@@ -3031,9 +3024,9 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
       (let ((del-fld (wl-summary-get-delete-folder
                      (wl-summary-buffer-folder-name)))
            (start (point))
-           (unread-marks (list elmo-msgdb-unread-cached-mark
-                               elmo-msgdb-unread-uncached-mark
-                               elmo-msgdb-new-mark))
+           (unread-marks (list wl-summary-unread-cached-mark
+                               wl-summary-unread-uncached-mark
+                               wl-summary-new-mark))
            (refiles (append moves dels))
            (refile-failures 0)
            (copy-failures 0)
@@ -3072,6 +3065,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
                            (not (null (cdr dst-msgs)))
                            nil ; no-delete
                            nil ; same-number
+                           unread-marks
                            t))
            (error nil))
          (if result                    ; succeeded.
@@ -3104,6 +3098,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER."
                            (not (null (cdr dst-msgs)))
                            t ; t is no-delete (copy)
                            nil ; same number
+                           unread-marks
                            t))
            (error nil))
          (if result                    ; succeeded.
@@ -4007,13 +4002,13 @@ If ARG, exit virtual folder."
                      t)
            mark (elmo-msgdb-get-mark msgdb number))
       (cond
-       ((string= mark elmo-msgdb-new-mark) ; N
+       ((string= mark wl-summary-new-mark) ; N
        (setq stat 'new))
-       ((string= mark elmo-msgdb-unread-uncached-mark) ; U
+       ((string= mark wl-summary-unread-uncached-mark) ; U
        (setq stat 'unread))
-       ((string= mark elmo-msgdb-unread-cached-mark)  ; !
+       ((string= mark wl-summary-unread-cached-mark)  ; !
        (setq stat 'unread))
-       ((string= mark elmo-msgdb-read-uncached-mark)  ; u
+       ((string= mark wl-summary-read-uncached-mark)  ; u
        (setq stat 'read))
        (t
        ;; no need to mark server.
@@ -4024,34 +4019,35 @@ If ARG, exit virtual folder."
                     (not (elmo-file-cache-exists-p
                           (elmo-message-field wl-summary-buffer-elmo-folder
                                               number 'message-id))))
-               elmo-msgdb-read-uncached-mark
+               wl-summary-read-uncached-mark
              nil))
       ;; folder mark.
       (unless no-folder-mark
-       (elmo-folder-mark-as-read folder (list number)))
-      (cond ((eq stat 'unread)
-            (setq wl-summary-buffer-unread-count
-                  (1- wl-summary-buffer-unread-count)))
-           ((eq stat 'new)
-            (setq wl-summary-buffer-new-count
-                  (1- wl-summary-buffer-new-count))))
-      (wl-summary-update-modeline)
-      (wl-folder-update-unread
-       (wl-summary-buffer-folder-name)
-       (+ wl-summary-buffer-unread-count
-         wl-summary-buffer-new-count))
-      (when stat
-       ;; set mark on buffer
-       (when visible
-         (unless (string= (wl-summary-persistent-mark) new-mark)
-           (delete-backward-char 1)
-           (insert (or new-mark " "))))
-       ;; set msgdb mark.
-       (unless (string= mark new-mark)
-         (elmo-msgdb-set-mark msgdb number new-mark))
-       (wl-summary-set-mark-modified))
-      (if (and visible wl-summary-highlight)
-         (wl-highlight-summary-current-line nil nil t))
+       (setq marked (elmo-folder-mark-as-read folder (list number))))
+      (when (or no-folder-mark marked)
+       (cond ((eq stat 'unread)
+              (setq wl-summary-buffer-unread-count
+                    (1- wl-summary-buffer-unread-count)))
+             ((eq stat 'new)
+              (setq wl-summary-buffer-new-count
+                    (1- wl-summary-buffer-new-count))))
+       (wl-summary-update-modeline)
+       (wl-folder-update-unread
+        (wl-summary-buffer-folder-name)
+        (+ wl-summary-buffer-unread-count
+           wl-summary-buffer-new-count))
+       (when stat
+         ;; set mark on buffer
+         (when visible
+           (unless (string= (wl-summary-persistent-mark) new-mark)
+             (delete-backward-char 1)
+             (insert (or new-mark " "))))
+         ;; set msgdb mark.
+         (unless (string= mark new-mark)
+           (elmo-msgdb-set-mark msgdb number new-mark))
+         (wl-summary-set-mark-modified))
+       (if (and visible wl-summary-highlight)
+           (wl-highlight-summary-current-line nil nil t)))
       (set-buffer-modified-p nil)
       (if stat
          (run-hooks 'wl-summary-unread-message-hook))
@@ -4097,7 +4093,7 @@ If ARG, exit virtual folder."
                              wl-summary-buffer-elmo-folder
                              number
                              'message-id))
-           (if (string= mark elmo-msgdb-important-mark)
+           (if (string= mark wl-summary-important-mark)
                (progn
                  ;; server side mark
                  (save-match-data
@@ -4120,16 +4116,16 @@ If ARG, exit virtual folder."
                  (elmo-folder-mark-as-important folder (list number))))
              (when visible
                (delete-backward-char 1)
-               (insert elmo-msgdb-important-mark))
+               (insert wl-summary-important-mark))
              (elmo-msgdb-set-mark msgdb number
-                                  elmo-msgdb-important-mark)
+                                  wl-summary-important-mark)
              (if (eq (elmo-file-cache-exists-p message-id) 'entire)
                  (elmo-folder-mark-as-read folder (list number))
                ;; Force cache message.
                (elmo-message-encache folder number 'read))
              (unless no-server-update
                (elmo-msgdb-global-mark-set message-id
-                                           elmo-msgdb-important-mark)))
+                                           wl-summary-important-mark)))
            (wl-summary-set-mark-modified)))
       (if (and visible wl-summary-highlight)
          (wl-highlight-summary-current-line nil nil t))))
@@ -4301,25 +4297,25 @@ If ARG, exit virtual folder."
 
 (defvar wl-summary-move-spec-plugged-alist
   (` ((new . ((t . nil)
-             (p . (, elmo-msgdb-new-mark))
+             (p . (, wl-summary-new-mark))
              (p . (, (wl-regexp-opt
-                      (list elmo-msgdb-unread-uncached-mark
-                            elmo-msgdb-unread-cached-mark))))
-             (p . (, (regexp-quote elmo-msgdb-important-mark)))))
+                      (list wl-summary-unread-uncached-mark
+                            wl-summary-unread-cached-mark))))
+             (p . (, (regexp-quote wl-summary-important-mark)))))
       (unread . ((t . nil)
                 (p . (, (wl-regexp-opt
-                         (list elmo-msgdb-new-mark
-                               elmo-msgdb-unread-uncached-mark
-                               elmo-msgdb-unread-cached-mark))))
-                (p . (, (regexp-quote elmo-msgdb-important-mark))))))))
+                         (list wl-summary-new-mark
+                               wl-summary-unread-uncached-mark
+                               wl-summary-unread-cached-mark))))
+                (p . (, (regexp-quote wl-summary-important-mark))))))))
 
 (defvar wl-summary-move-spec-unplugged-alist
   (` ((new . ((t . nil)
-             (p . (, elmo-msgdb-unread-cached-mark))
-             (p . (, (regexp-quote elmo-msgdb-important-mark)))))
+             (p . (, wl-summary-unread-cached-mark))
+             (p . (, (regexp-quote wl-summary-important-mark)))))
       (unread . ((t . nil)
-                (p . (, elmo-msgdb-unread-cached-mark))
-                (p . (, (regexp-quote elmo-msgdb-important-mark))))))))
+                (p . (, wl-summary-unread-cached-mark))
+                (p . (, (regexp-quote wl-summary-important-mark))))))))
 
 (defsubst wl-summary-next-message (num direction hereto)
   (if wl-summary-buffer-next-message-function
@@ -5028,8 +5024,8 @@ Use function list is `wl-summary-write-current-folder-functions'."
        ()
       (setq skip-pmark-regexp
            (wl-regexp-opt (list " "
-                                elmo-msgdb-unread-cached-mark
-                                elmo-msgdb-important-mark))))
+                                wl-summary-unread-cached-mark
+                                wl-summary-important-mark))))
     (while (and skip
                (not (if downward (eobp) (bobp))))
       (if downward
index c9ca3d6..5e5bca3 100644 (file)
        msgs-stack children)
     (while msgs
       (setq wl-summary-buffer-number-list (cons (car entity)
-                                               wl-summary-buffer-number-list))
+                                       wl-summary-buffer-number-list))
       (setq msgs (cdr msgs))
       (setq children (wl-thread-entity-get-children entity))
       (if children
@@ -362,10 +362,10 @@ ENTITY is returned."
   (interactive)
   (dolist (number (elmo-folder-list-messages-mark-match
                   wl-summary-buffer-elmo-folder
-                  (wl-regexp-opt (list elmo-msgdb-unread-uncached-mark
-                                       elmo-msgdb-unread-cached-mark
-                                       elmo-msgdb-new-mark
-                                       elmo-msgdb-important-mark))))
+                  (wl-regexp-opt (list wl-summary-unread-uncached-mark
+                                       wl-summary-unread-cached-mark
+                                       wl-summary-new-mark
+                                       wl-summary-important-mark))))
     (wl-thread-entity-force-open (wl-thread-get-entity number))))
 
 (defsubst wl-thread-maybe-get-children-num (msg)
@@ -737,9 +737,9 @@ Message is inserted to the summary buffer."
     (setq cur-mark (elmo-msgdb-get-mark msgdb msg))
     (elmo-msgdb-set-mark msgdb
                         msg
-                        (if (string= cur-mark elmo-msgdb-important-mark)
+                        (if (string= cur-mark wl-summary-important-mark)
                             nil
-                          elmo-msgdb-important-mark))
+                          wl-summary-important-mark))
     (wl-summary-set-mark-modified)))
 
 (defun wl-thread-mark-as-read (&optional arg)
@@ -831,7 +831,7 @@ Message is inserted to the summary buffer."
        (setq cur (1+ cur))
        (if (or (zerop (% cur 2)) (= cur len))
            (elmo-display-progress
-            'wl-thread-insert-top "Inserting message..."
+            'wl-thread-insert-top "Inserting thread..."
             (/ (* cur 100) len)))))))
 
 (defsubst wl-thread-insert-entity-sub (indent entity parent-entity all)
index a9baff0..d1f1b3c 100644 (file)
@@ -905,11 +905,34 @@ Default is for 'followup-to-me'."
   :type 'boolean
   :group 'wl-folder)
 
+(defcustom wl-summary-unread-mark "!"
+  "Mark for unread message."
+  :type '(string :tag "Mark")
+  :group 'wl-summary-marks)
+(defcustom wl-summary-important-mark "$"
+  "Mark for important message."
+  :type '(string :tag "Mark")
+  :group 'wl-summary-marks)
+(defcustom wl-summary-new-mark "N"
+  "Mark for new message."
+  :type '(string :tag "Mark")
+  :group 'wl-summary-marks)
+(defcustom wl-summary-unread-uncached-mark "U"
+  "Mark for unread and uncached message."
+  :type '(string :tag "Mark")
+  :group 'wl-summary-marks)
+(defcustom wl-summary-unread-cached-mark "!"
+  "Mark for unread but already cached message."
+  :type '(string :tag "Mark")
+  :group 'wl-summary-marks)
+(defcustom wl-summary-read-uncached-mark "u"
+  "Mark for read but uncached message."
+  :type '(string :tag "Mark")
+  :group 'wl-summary-marks)
 (defcustom wl-summary-score-over-mark "+"
   "Score mark used for messages with high scores."
   :type '(string :tag "Mark")
   :group 'wl-summary-marks)
-
 (defcustom wl-summary-score-below-mark "-"
   "Score mark used for messages with low scores."
   :type '(string :tag "Mark")
@@ -965,7 +988,7 @@ This variable is local to the summary buffers."
   :group 'wl-score)
 
 (defcustom wl-summary-score-marks
-  (list elmo-msgdb-new-mark)
+  (list wl-summary-new-mark)
   "Persistent marks to scoring."
   :type '(repeat (string :tag "Mark"))
   :group 'wl-score)
@@ -1682,9 +1705,9 @@ This wrapper is generated by the mail system when rejecting a letter."
   :group 'wl-pref)
 
 (defcustom wl-summary-auto-refile-skip-marks
-  (list elmo-msgdb-new-mark
-       elmo-msgdb-unread-uncached-mark
-       elmo-msgdb-unread-cached-mark)
+  (list wl-summary-new-mark
+       wl-summary-unread-uncached-mark
+       wl-summary-unread-cached-mark)
   "Persistent marks to skip auto-refiling."
   :type '(repeat (string :tag "Mark"))
   :group 'wl-summary)
@@ -1704,8 +1727,8 @@ the message is skipped at cursor move."
   :group 'wl-summary)
 
 (defcustom wl-summary-incorporate-marks
-  (list elmo-msgdb-new-mark
-       elmo-msgdb-unread-uncached-mark)
+  (list wl-summary-new-mark
+       wl-summary-unread-uncached-mark)
   "Persistent marks to prefetch at `wl-summary-incorporate'."
   :type '(repeat (string :tag "Mark"))
   :group 'wl-summary)
@@ -2290,10 +2313,11 @@ ex.
   :group 'wl-expire)
 
 (defcustom wl-summary-expire-reserve-marks
-  (list elmo-msgdb-important-mark
-       elmo-msgdb-new-mark
-       elmo-msgdb-unread-uncached-mark
-       elmo-msgdb-unread-cached-mark)
+  (list wl-summary-important-mark
+       wl-summary-new-mark
+       wl-summary-unread-mark
+       wl-summary-unread-uncached-mark
+       wl-summary-unread-cached-mark)
   "Permanent marks of reserved message when expire.
 Don't reserve temporary mark message.