Synch up with main trunk.
[elisp/wanderlust.git] / elmo / elmo-archive.el
index e610f4d..8437532 100644 (file)
@@ -33,7 +33,9 @@
 
 ;;; Code:
 ;;
+(eval-when-compile (require 'cl))
 
+(require 'elmo)
 (require 'elmo-msgdb)
 (require 'emu)
 (require 'std11)
@@ -578,11 +580,11 @@ TYPE specifies the archiver's symbol."
   (elmo-archive-message-fetch-internal folder number))
 
 (luna-define-method elmo-folder-append-buffer ((folder elmo-archive-folder)
-                                              &optional flag number)
-  (elmo-archive-folder-append-buffer folder flag number))
+                                              &optional flags number)
+  (elmo-archive-folder-append-buffer folder flags number))
 
 ;; verrrrrry slow!!
-(defun elmo-archive-folder-append-buffer (folder flag number)
+(defun elmo-archive-folder-append-buffer (folder flags number)
   (let* ((type (elmo-archive-folder-archive-type-internal folder))
         (prefix (elmo-archive-folder-archive-prefix-internal folder))
         (arc (elmo-archive-get-archive-name folder))
@@ -616,8 +618,13 @@ TYPE specifies the archiver's symbol."
                   (copy-to-buffer dst-buffer (point-min) (point-max)))
                 (as-binary-output-file
                  (write-region (point-min) (point-max) newfile nil 'no-msg))
-                (elmo-archive-call-method method (list arc newfile))
-                t)
+                (when (elmo-archive-call-method method (list arc newfile))
+                  (elmo-folder-preserve-flags
+                   folder
+                   (with-current-buffer src-buffer
+                     (elmo-msgdb-get-message-id-from-buffer))
+                   flags)
+                  t))
             nil))))))
 
 (luna-define-method elmo-folder-append-messages :around
@@ -629,9 +636,10 @@ TYPE specifies the archiver's symbol."
           (elmo-folder-message-file-p src-folder)
           (elmo-folder-message-file-number-p src-folder))
       ;; same-number(localdir, localnews) -> archive
-      (elmo-archive-append-files folder
-                                (elmo-folder-message-file-directory src-folder)
-                                numbers)
+      (unless (elmo-archive-append-files folder
+                                        (elmo-folder-message-file-directory src-folder)
+                                        numbers)
+       (setq numbers nil))
       (elmo-progress-notify 'elmo-folder-move-messages (length numbers))
       numbers)
      ((elmo-folder-message-make-temp-file-p src-folder)
@@ -666,7 +674,8 @@ TYPE specifies the archiver's symbol."
        (if (elmo-archive-append-files folder
                                       base-dir
                                       files)
-           (elmo-delete-directory temp-dir)))
+           (elmo-delete-directory temp-dir)
+         (setq numbers nil)))
       (elmo-progress-notify 'elmo-folder-move-messages (length numbers))
       numbers)
      (t (luna-call-next-method)))))
@@ -759,8 +768,9 @@ TYPE specifies the archiver's symbol."
           (elmo-archive-exec-msgs-subr2
            n-prog (append n-prog-arg (list arc)) files (length arc)))))))))
 
-(luna-define-method elmo-folder-delete-messages ((folder elmo-archive-folder)
-                                                numbers)
+(luna-define-method elmo-folder-delete-messages-internal ((folder
+                                                          elmo-archive-folder)
+                                                         numbers)
   (let* ((type (elmo-archive-folder-archive-type-internal folder))
         (prefix (elmo-archive-folder-archive-prefix-internal folder))
         (arc (elmo-archive-get-archive-name folder))
@@ -893,25 +903,29 @@ TYPE specifies the archiver's symbol."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; MessageDB functions (from elmo-localdir.el)
 
-(defsubst elmo-archive-msgdb-create-entity-subr (number)
+(defsubst elmo-archive-msgdb-create-entity-subr (msgdb number)
   (let (header-end)
-    (elmo-set-buffer-multibyte default-enable-multibyte-characters)
+    (set-buffer-multibyte default-enable-multibyte-characters)
     (goto-char (point-min))
     (if (re-search-forward "\\(^--.*$\\)\\|\\(\n\n\\)" nil t)
        (setq header-end (point))
       (setq header-end (point-max)))
     (narrow-to-region (point-min) header-end)
-    (elmo-msgdb-create-overview-from-buffer number)))
+    (elmo-msgdb-create-message-entity-from-buffer
+     (elmo-msgdb-message-entity-handler msgdb) number)))
 
 ;; verrrry slow!!
-(defsubst elmo-archive-msgdb-create-entity (method archive number type &optional prefix)
+(defsubst elmo-archive-msgdb-create-entity (msgdb
+                                           method
+                                           archive number type
+                                           &optional prefix)
   (let* ((msg (elmo-concat-path prefix (int-to-string number)))
         (arg-list (list archive msg)))
     (when (elmo-archive-article-exists-p archive msg type)
       ;; insert article.
       (as-binary-process
        (elmo-archive-call-method method arg-list t))
-      (elmo-archive-msgdb-create-entity-subr number))))
+      (elmo-archive-msgdb-create-entity-subr msgdb number))))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-archive-folder)
                                              numbers flag-table)
@@ -940,10 +954,11 @@ TYPE specifies the archiver's symbol."
        (erase-buffer)
        (setq entity
              (elmo-archive-msgdb-create-entity
+              new-msgdb
               method file (car numlist) type
               (elmo-archive-folder-archive-prefix-internal folder)))
        (when entity
-         (setq message-id (elmo-msgdb-overview-entity-get-id entity)
+         (setq message-id (elmo-message-entity-field entity 'message-id)
                flags (elmo-flag-table-get flag-table message-id))
          (elmo-global-flags-set flags folder (car numlist) message-id)
          (elmo-msgdb-append-entity new-msgdb entity flags))
@@ -1027,8 +1042,8 @@ TYPE specifies the archiver's symbol."
          ()                            ; nop
        (save-excursion
          (narrow-to-region sp ep)
-         (setq entity (elmo-archive-msgdb-create-entity-subr number)
-               message-id (elmo-msgdb-overview-entity-get-id entity)
+         (setq entity (elmo-archive-msgdb-create-entity-subr new-msgdb number)
+               message-id (elmo-message-entity-field entity 'message-id)
                flags (elmo-flag-table-get flag-table message-id))
          (elmo-global-flags-set flags folder number message-id)
          (elmo-msgdb-append-entity new-msgdb entity flags)
@@ -1052,7 +1067,7 @@ TYPE specifies the archiver's symbol."
        (when (file-exists-p arc)
         (as-binary-process
          (elmo-archive-call-method method args t))
-        (elmo-set-buffer-multibyte default-enable-multibyte-characters)
+        (set-buffer-multibyte default-enable-multibyte-characters)
         (decode-mime-charset-region (point-min)(point-max) elmo-mime-charset)
         (elmo-buffer-field-condition-match condition number number-list))))))