mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-25 04:18:08 +01:00
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:
parent
c67a04de60
commit
021906d6ec
2 changed files with 23 additions and 27 deletions
|
@ -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
|
||||||
|
|
|
@ -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)))))
|
||||||
|
|
Loading…
Reference in a new issue