[PATCH v2 2/8] emacs: Create an API for fetching parts as undecoded binary
Austin Clements
amdragon at mit.edu
Sat Jan 24 13:16:57 PST 2015
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 | 28 ++++++++++++++--------------
emacs/notmuch-show.el | 22 +++++++++-------------
2 files changed, 23 insertions(+), 27 deletions(-)
diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
index fd25f7c..d4b6684 100644
--- a/emacs/notmuch-lib.el
+++ b/emacs/notmuch-lib.el
@@ -529,25 +529,25 @@ (defun notmuch-parts-filter-by-type (parts 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
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index df2389e..b3e339e 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -579,16 +579,14 @@ (defun notmuch-show-w3m-cid-retrieve (url &rest args)
(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 @@ (defun notmuch-show-stash-git-send-email (&optional no-in-reply-to)
;; 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 @@ (defun notmuch-show-current-part-handle ()
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)))))
--
2.1.3
More information about the notmuch
mailing list