emacs: Create an API for fetching parts as undecoded binary

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.
This commit is contained in:
Austin Clements 2015-01-24 16:16:57 -05:00 committed by David Bremner
parent c67a04de60
commit 021906d6ec
2 changed files with 23 additions and 27 deletions

View file

@ -529,25 +529,25 @@ the given type."
(lambda (part) (notmuch-match-content-type (plist-get part :content-type) type)) (lambda (part) (notmuch-match-content-type (plist-get part :content-type) type))
parts)) parts))
;; Helper for parts which are generally not included in the default (defun notmuch-get-bodypart-binary (msg part process-crypto)
;; SEXP output. "Return the unprocessed content of PART in MSG.
(defun notmuch-get-bodypart-internal (query part-number process-crypto)
(let ((args '("show" "--format=raw")) This returns the \"raw\" content of the given part after content
(part-arg (format "--part=%s" part-number))) transfer decoding, but with no further processing (see the
(setq args (append args (list part-arg))) discussion of --format=raw in man notmuch-show). In particular,
(if process-crypto this does no charset conversion."
(setq args (append args '("--decrypt")))) (let ((args `("show" "--format=raw"
(setq args (append args (list query))) ,(format "--part=%d" (plist-get part :id))
,@(when process-crypto '("--decrypt"))
,(notmuch-id-to-query (plist-get msg :id)))))
(with-temp-buffer (with-temp-buffer
(let ((coding-system-for-read 'no-conversion)) (let ((coding-system-for-read 'no-conversion))
(progn (apply #'call-process notmuch-command nil '(t nil) nil args)
(apply 'call-process (append (list notmuch-command nil (list t nil) nil) args)) (buffer-string)))))
(buffer-string))))))
(defun notmuch-get-bodypart-content (msg part process-crypto) (defun notmuch-get-bodypart-content (msg part process-crypto)
(or (plist-get part :content) (or (plist-get part :content)
(notmuch-get-bodypart-internal (notmuch-id-to-query (plist-get msg :id)) (notmuch-get-bodypart-binary msg part process-crypto)))
(plist-get part :id) process-crypto)))
;; Workaround: The call to `mm-display-part' below triggers a bug in ;; 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 ;; Emacs 24 if it attempts to use the shr renderer to display an HTML

View file

@ -579,16 +579,14 @@ message at DEPTH in the current thread."
(let* ((msg (nth 1 matching-part)) (let* ((msg (nth 1 matching-part))
(part (nth 2 matching-part)) (part (nth 2 matching-part))
(content (nth 3 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))) (content-type (plist-get part :content-type)))
;; If we don't already have the content, get it and cache ;; If we don't already have the content, get it and cache
;; it, as some messages reference the same cid: part many ;; it, as some messages reference the same cid: part many
;; times (hundreds!), which results in many calls to ;; times (hundreds!), which results in many calls to
;; `notmuch part'. ;; `notmuch part'.
(unless content (unless content
(setq content (notmuch-get-bodypart-internal (notmuch-id-to-query message-id) (setq content (notmuch-get-bodypart-binary
part-number notmuch-show-process-crypto)) msg part notmuch-show-process-crypto))
(with-current-buffer w3m-current-buffer (with-current-buffer w3m-current-buffer
(notmuch-show-w3m-cid-store-internal url msg part content))) (notmuch-show-w3m-cid-store-internal url msg part content)))
(insert content) (insert content)
@ -2162,15 +2160,14 @@ omit --in-reply-to=<Message-Id>."
;; Interactive part functions and their helpers ;; 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." "Return a temporary buffer containing the specified part's content."
(let ((buf (generate-new-buffer " *notmuch-part*")) (let ((buf (generate-new-buffer " *notmuch-part*"))
(process-crypto notmuch-show-process-crypto)) (process-crypto notmuch-show-process-crypto))
(with-current-buffer buf (with-current-buffer buf
(setq notmuch-show-process-crypto process-crypto) ;; This is always used in the content of mm handles, which
;; Always acquires the part via `notmuch part', even if it is ;; expect undecoded, binary part content.
;; available in the SEXP output. (insert (notmuch-get-bodypart-binary msg part process-crypto)))
(insert (notmuch-get-bodypart-internal message-id nth notmuch-show-process-crypto)))
buf)) buf))
(defun notmuch-show-current-part-handle () (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 This creates a temporary buffer for the part's content; the
caller is responsible for killing this buffer as appropriate." caller is responsible for killing this buffer as appropriate."
(let* ((part (notmuch-show-get-part-properties)) (let* ((msg (notmuch-show-get-message-properties))
(message-id (notmuch-show-get-message-id)) (part (notmuch-show-get-part-properties))
(nth (plist-get part :id)) (buf (notmuch-show-generate-part-buffer msg part))
(buf (notmuch-show-generate-part-buffer message-id nth))
(computed-type (plist-get part :computed-type)) (computed-type (plist-get part :computed-type))
(filename (plist-get part :filename)) (filename (plist-get part :filename))
(disposition (if filename `(attachment (filename . ,filename))))) (disposition (if filename `(attachment (filename . ,filename)))))