* elmo.el (elmo-folder-list-unreads): Don't use msgdb API.
[elisp/wanderlust.git] / elmo / elmo.el
index d357233..a4e4793 100644 (file)
@@ -140,7 +140,7 @@ If optional argument NON-PERSISTENT is non-nil, the folder msgdb is not saved."
     (setq class (format "elmo-%s" (symbol-name type)))
     (require (intern class))
     (setq folder (luna-make-entity (intern (concat class "-folder"))
-                                  :type   type
+                                  :type type
                                   :prefix prefix
                                   :name original
                                   :persistent (not non-persistent)))
@@ -159,7 +159,7 @@ If optional argument NON-PERSISTENT is non-nil, the folder msgdb is not saved."
 (luna-define-generic elmo-folder-open (folder &optional load-msgdb)
   "Open and setup (load saved status) FOLDER.
 If optional LOAD-MSGDB is non-nil, msgdb is loaded.
-(otherwise, msgdb is loaded on-demand)")
+\(otherwise, msgdb is loaded on-demand)")
 
 (luna-define-generic elmo-folder-open-internal (folder)
   "Open FOLDER (without loading saved folder status).")
@@ -268,13 +268,13 @@ If optional IN-MSGDB is non-nil, retrieve flag information from msgdb.")
   (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) flag))
 
 (luna-define-method elmo-folder-list-unreads ((folder elmo-folder))
-  (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) 'unread))
+  (elmo-folder-list-flagged folder 'unread))
 
 (luna-define-method elmo-folder-list-importants ((folder elmo-folder))
-  (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) 'important))
+  (elmo-folder-list-flagged folder 'important))
 
 (luna-define-method elmo-folder-list-answereds ((folder elmo-folder))
-  (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) 'answered))
+  (elmo-folder-list-flagged folder 'answered))
 
 (luna-define-generic elmo-folder-list-messages-internal (folder &optional
                                                                visible-only)
@@ -618,9 +618,7 @@ FIELD is a symbol of the field name.")
 (luna-define-generic elmo-message-folder (folder number)
   "Get primitive folder of the message.")
 
-(luna-define-generic elmo-folder-process-crosspost (folder
-                                                   &optional
-                                                   number-alist)
+(luna-define-generic elmo-folder-process-crosspost (folder)
   "Process crosspost for FOLDER.
 If NUMBER-ALIST is set, it is used as number-alist.
 Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
@@ -1016,6 +1014,7 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
        (setq failure nil
              mark (elmo-message-mark src-folder (car numbers))
              flag (cond
+                   ((null mark) nil)
                    ((member mark (elmo-msgdb-answered-marks))
                     'answered)
                    ;;
@@ -1094,22 +1093,16 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).")
          (elmo-folder-close dst-folder)))
       (if (and (not no-delete) succeeds)
          (progn
-           (if (not no-delete-info)
-               (message "Cleaning up src folder..."))
            (if (and (elmo-folder-delete-messages src-folder succeeds)
-                    (elmo-msgdb-delete-msgs
-                     (elmo-folder-msgdb src-folder) succeeds))
+                    (elmo-folder-detach-messages src-folder succeeds))
                (setq result t)
              (message "move: delete messages from %s failed."
                       (elmo-folder-name-internal src-folder))
              (setq result nil))
-           (if (and result
-                    (not no-delete-info))
-               (message "Cleaning up src folder...done"))
            result)
        (if no-delete
            (progn
-             (message "Copying messages...done")
+             ;; (message "Copying messages...done")
              t)
          (if (eq len 0)
              (message "No message was moved.")
@@ -1142,12 +1135,12 @@ If CACHED is t, message is set as cached."
                               (elmo-message-use-cache-p folder number))
     (elmo-folder-set-mark-modified-internal folder t)))
 
-;;; APIs for message-entity 
-(luna-define-generic elmo-folder-list-message-entities (folder)
-  "Return the all list of message-entity structure of FOLDER.")
+(defun elmo-message-copy-entity (entity)
+  ;; 
+  (elmo-msgdb-copy-overview-entity entity))
 
-(luna-define-method elmo-folder-list-message-entities ((folder elmo-folder))
-  (elmo-msgdb-get-overview (elmo-folder-msgdb folder)))
+(defun elmo-message-entity-set-number (entity number)  
+  (elmo-msgdb-overview-entity-set-number entity number))
 
 (luna-define-generic elmo-message-entity (folder key)
   "Return the message-entity structure which matches to the KEY.
@@ -1169,6 +1162,12 @@ ENTITY is the message-entity to get the parent.")
 (def-edebug-spec elmo-folder-do-each-message-entity
   ((symbolp form &rest form) &rest form))
 
+(defsubst elmo-folder-list-message-entities (folder)
+  ;; List all message entities in the FOLDER.
+  (mapcar
+   (lambda (number) (elmo-message-entity folder number))
+   (elmo-folder-list-messages folder t t)))
+
 (defmacro elmo-folder-do-each-message-entity (spec &rest form)
   "Iterator for message entity in the folder.
 \(elmo-folder-do-each-message-entity \(entity folder\)
@@ -1236,10 +1235,12 @@ FLAG is a symbol which is one of the following:
 'sugar' flag:
   `read'      (set unread flag)")
 
-(defun elmo-message-mark (folder number)
+(luna-define-generic elmo-message-mark (folder number)
   "Get mark of the message.
 FOLDER is the ELMO folder structure.
-NUMBER is a number of the message."
+NUMBER is a number of the message.")
+
+(luna-define-method elmo-message-mark ((folder elmo-folder) number)
   (elmo-msgdb-get-mark (elmo-folder-msgdb folder) number))
 
 (defun elmo-message-field (folder number field)
@@ -1311,12 +1312,15 @@ FIELD is a symbol of the field."
                           number
                           'answered))))
 
-(luna-define-method elmo-folder-process-crosspost ((folder elmo-folder)
-                                                  &optional
-                                                  number-alist)
+(luna-define-method elmo-folder-process-crosspost ((folder elmo-folder))
   ;; Do nothing.
   )
 
+;;(luna-define-generic elmo-folder-append-message-entity (folder entity
+;;                                                            &optional
+;;                                                            flag-table)
+;;  "Append ENTITY to the folder.")
+
 (defun elmo-generic-folder-append-msgdb (folder append-msgdb)
   (if append-msgdb
       (let* ((number-alist (elmo-msgdb-get-number-alist append-msgdb))
@@ -1448,33 +1452,33 @@ FIELD is a symbol of the field."
     (elmo-folder-set-killed-list-internal folder nil))
   (elmo-folder-set-msgdb-internal folder (elmo-msgdb-clear)))
 
-(defun elmo-folder-synchronize (folder
-                               &optional ignore-msgdb
-                               no-check)
+(luna-define-generic elmo-folder-synchronize (folder
+                                             &optional ignore-msgdb
+                                             no-check)
   "Synchronize the folder data to the newest status.
 FOLDER is the ELMO folder structure.
+
 If optional IGNORE-MSGDB is non-nil, current msgdb is thrown away except
 flag 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.
-If update process is interrupted, return nil."
+If update process is interrupted, return nil.")
+                                             
+(luna-define-method elmo-folder-synchronize ((folder elmo-folder)
+                                            &optional ignore-msgdb no-check)
   (let ((killed-list (elmo-folder-killed-list-internal folder))
        (before-append t)
-       number-alist mark-alist
+       number-alist
        old-msgdb diff diff-2 delete-list new-list new-msgdb mark
-       flag-table crossed after-append)
+       flag-table crossed after-append numbers)
     (setq old-msgdb (elmo-folder-msgdb folder))
     (setq flag-table (elmo-flag-table-load (elmo-folder-msgdb-path folder)))
-    (setq number-alist (elmo-msgdb-get-number-alist
-                       (elmo-folder-msgdb folder)))
-    (setq mark-alist (elmo-msgdb-get-mark-alist
-                     (elmo-folder-msgdb folder)))
     (when ignore-msgdb
       (elmo-msgdb-flag-table (elmo-folder-msgdb folder) flag-table)
       (elmo-folder-clear folder (eq ignore-msgdb 'visible-only)))
+    (setq numbers (sort (elmo-folder-list-messages folder nil t) '<))
     (unless no-check (elmo-folder-check folder))
     (condition-case nil
        (progn
@@ -1484,11 +1488,7 @@ If update process is interrupted, return nil."
          (setq diff (elmo-list-diff (elmo-folder-list-messages
                                      folder
                                      (eq 'visible-only ignore-msgdb))
-                                    (unless ignore-msgdb
-                                      (sort (mapcar
-                                             'car
-                                             number-alist)
-                                            '<))))
+                                    numbers))
          (message "Checking folder diff...done")
          (setq new-list (elmo-folder-confirm-appends (car diff)))
          ;; Set killed list.
@@ -1506,14 +1506,14 @@ If update process is interrupted, return nil."
                (elmo-folder-process-crosspost folder)
                0 ; no updates.
                )
-           (if delete-list (elmo-msgdb-delete-msgs
-                            (elmo-folder-msgdb folder) delete-list))
+           (when delete-list
+             (elmo-folder-detach-messages folder delete-list))
            (when new-list
-             (setq new-msgdb (elmo-folder-msgdb-create
-                              folder new-list flag-table))
              (elmo-msgdb-change-mark (elmo-folder-msgdb folder)
                                      elmo-msgdb-new-mark
                                      elmo-msgdb-unread-uncached-mark)
+             (setq new-msgdb (elmo-folder-msgdb-create
+                              folder new-list flag-table))
              ;; Clear flag-table
              (if (elmo-folder-persistent-p folder)
                  (elmo-flag-table-save (elmo-folder-msgdb-path folder)
@@ -1533,11 +1533,12 @@ If update process is interrupted, return nil."
        (elmo-folder-set-killed-list-internal folder killed-list)
        nil))))
 
-(defun elmo-folder-messages (folder)
-  "Return number of messages in the FOLDER."
-  (length
-   (elmo-msgdb-get-number-alist
-    (elmo-folder-msgdb folder))))
+(luna-define-generic elmo-folder-detach-messages (folder numbers)
+  "Remove messages with NUMBERS from MSGDB.")
+
+(luna-define-method elmo-folder-detach-messages ((folder elmo-folder)
+                                                numbers)
+  (elmo-msgdb-delete-msgs (elmo-folder-msgdb folder) numbers))
 
 (luna-define-generic elmo-folder-length (folder)
   "Return number of messages in the FOLDER.")