]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-maildir-fcc.el
Modify our local copy of message-do-fcc
[notmuch] / emacs / notmuch-maildir-fcc.el
index 835258f87b962992d96fa7e7cc0d78bc1d7eb97c..cda51e7f3d07072b0c9ecdb7e0669bac34155745 100644 (file)
@@ -120,6 +120,58 @@ by notmuch-mua-mail"
                subdir
              (concat (notmuch-database-path) "/" subdir))))))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Functions for saving a message either using notmuch insert or file
+;; fcc. First functions common to the two cases.
+
+(defmacro with-temporary-notmuch-message-buffer (&rest body)
+  "Set-up a temporary copy of the current message-mode buffer."
+  `(let ((case-fold-search t)
+        (buf (current-buffer))
+        (mml-externalize-attachments message-fcc-externalize-attachments))
+     (with-current-buffer (get-buffer-create " *message temp*")
+       (erase-buffer)
+       (insert-buffer-substring buf)
+       ,@body)))
+
+(defun notmuch-maildir-setup-message-for-saving ()
+  "Setup message for saving. Should be called on a temporary copy.
+
+This is taken from the function message-do-fcc."
+  (message-encode-message-body)
+  (save-restriction
+    (message-narrow-to-headers)
+    (let ((mail-parse-charset message-default-charset))
+      (mail-encode-encoded-word-buffer)))
+  (goto-char (point-min))
+  (when (re-search-forward
+        (concat "^" (regexp-quote mail-header-separator) "$")
+        nil t)
+    (replace-match "" t t )))
+
+(defun notmuch-maildir-message-do-fcc ()
+  "Process Fcc headers in the current buffer.
+
+This is a rearranged version of message mode's message-do-fcc."
+  (let (list file)
+    (save-excursion
+      (save-restriction
+       (message-narrow-to-headers)
+       (setq file (message-fetch-field "fcc" t)))
+      (when file
+       (with-temporary-notmuch-message-buffer
+        (save-restriction
+          (message-narrow-to-headers)
+          (while (setq file (message-fetch-field "fcc" t))
+            (push file list)
+            (message-remove-header "fcc" nil t)))
+        (notmuch-maildir-setup-message-for-saving)
+        ;; Process FCC operations.
+        (while list
+          (setq file (pop list))
+          (notmuch-fcc-handler file))
+        (kill-buffer (current-buffer)))))))
+
 (defun notmuch-fcc-handler (fcc-header)
   "Store message with file fcc."
   (notmuch-maildir-fcc-file-fcc fcc-header))