emacs: Create an API for fetching parts as undecoded binary
authorAustin Clements <amdragon@mit.edu>
Sat, 24 Jan 2015 21:16:57 +0000 (16:16 -0500)
committerDavid Bremner <david@tethera.net>
Sun, 25 Jan 2015 17:39:13 +0000 (18:39 +0100)
The new function, `notmuch-get-bodypart-binary', replaces
`notmuch-get-bodypart-internal'.  Whereas the old function was really
meant for internal use in `notmuch-get-bodypart-content', it was used
in a few other places.  Since the difference between
`notmuch-get-bodypart-content' and `notmuch-get-bodypart-internal' was
unclear, these other uses were always confusing and potentially
inconsistent.  The new call clearly requests the part as undecoded
binary.

This is step 1 of 2 in separating `notmuch-get-bodypart-content' into
two APIs for retrieving either undecoded binary or decoded text.

emacs/notmuch-lib.el
emacs/notmuch-show.el

index fd25f7c9e6279b528c81b1908948ff7554a12015..d4b668496e51cb48355473c6427facc6170d0cee 100644 (file)
@@ -529,25 +529,25 @@ the given type."
    (lambda (part) (notmuch-match-content-type (plist-get part :content-type) type))
    parts))
 
-;; Helper for parts which are generally not included in the default
-;; SEXP output.
-(defun notmuch-get-bodypart-internal (query part-number process-crypto)
-  (let ((args '("show" "--format=raw"))
-       (part-arg (format "--part=%s" part-number)))
-    (setq args (append args (list part-arg)))
-    (if process-crypto
-       (setq args (append args '("--decrypt"))))
-    (setq args (append args (list query)))
+(defun notmuch-get-bodypart-binary (msg part process-crypto)
+  "Return the unprocessed content of PART in MSG.
+
+This returns the \"raw\" content of the given part after content
+transfer decoding, but with no further processing (see the
+discussion of --format=raw in man notmuch-show).  In particular,
+this does no charset conversion."
+  (let ((args `("show" "--format=raw"
+               ,(format "--part=%d" (plist-get part :id))
+               ,@(when process-crypto '("--decrypt"))
+               ,(notmuch-id-to-query (plist-get msg :id)))))
     (with-temp-buffer
       (let ((coding-system-for-read 'no-conversion))
-       (progn
-         (apply 'call-process (append (list notmuch-command nil (list t nil) nil) args))
-         (buffer-string))))))
+       (apply #'call-process notmuch-command nil '(t nil) nil args)
+       (buffer-string)))))
 
 (defun notmuch-get-bodypart-content (msg part process-crypto)
   (or (plist-get part :content)
-      (notmuch-get-bodypart-internal (notmuch-id-to-query (plist-get msg :id))
-                                    (plist-get part :id) process-crypto)))
+      (notmuch-get-bodypart-binary msg part process-crypto)))
 
 ;; Workaround: The call to `mm-display-part' below triggers a bug in
 ;; Emacs 24 if it attempts to use the shr renderer to display an HTML
index df2389e40923b608905d99426879c9822173da3a..b3e339e35071b63a9b486bb765f706e65b4b6ac3 100644 (file)
@@ -579,16 +579,14 @@ message at DEPTH in the current thread."
        (let* ((msg (nth 1 matching-part))
               (part (nth 2 matching-part))
               (content (nth 3 matching-part))
-              (message-id (plist-get msg :id))
-              (part-number (plist-get part :id))
               (content-type (plist-get part :content-type)))
          ;; If we don't already have the content, get it and cache
          ;; it, as some messages reference the same cid: part many
          ;; times (hundreds!), which results in many calls to
          ;; `notmuch part'.
          (unless content
-           (setq content (notmuch-get-bodypart-internal (notmuch-id-to-query message-id)
-                                                             part-number notmuch-show-process-crypto))
+           (setq content (notmuch-get-bodypart-binary
+                          msg part notmuch-show-process-crypto))
            (with-current-buffer w3m-current-buffer
              (notmuch-show-w3m-cid-store-internal url msg part content)))
          (insert content)
@@ -2162,15 +2160,14 @@ omit --in-reply-to=<Message-Id>."
 
 ;; Interactive part functions and their helpers
 
-(defun notmuch-show-generate-part-buffer (message-id nth)
+(defun notmuch-show-generate-part-buffer (msg part)
   "Return a temporary buffer containing the specified part's content."
   (let ((buf (generate-new-buffer " *notmuch-part*"))
        (process-crypto notmuch-show-process-crypto))
     (with-current-buffer buf
-      (setq notmuch-show-process-crypto process-crypto)
-      ;; Always acquires the part via `notmuch part', even if it is
-      ;; available in the SEXP output.
-      (insert (notmuch-get-bodypart-internal message-id nth notmuch-show-process-crypto)))
+      ;; This is always used in the content of mm handles, which
+      ;; expect undecoded, binary part content.
+      (insert (notmuch-get-bodypart-binary msg part process-crypto)))
     buf))
 
 (defun notmuch-show-current-part-handle ()
@@ -2178,10 +2175,9 @@ omit --in-reply-to=<Message-Id>."
 
 This creates a temporary buffer for the part's content; the
 caller is responsible for killing this buffer as appropriate."
-  (let* ((part (notmuch-show-get-part-properties))
-        (message-id (notmuch-show-get-message-id))
-        (nth (plist-get part :id))
-        (buf (notmuch-show-generate-part-buffer message-id nth))
+  (let* ((msg (notmuch-show-get-message-properties))
+        (part (notmuch-show-get-part-properties))
+        (buf (notmuch-show-generate-part-buffer msg part))
         (computed-type (plist-get part :computed-type))
         (filename (plist-get part :filename))
         (disposition (if filename `(attachment (filename . ,filename)))))