changeset 111885:bbc996a3871b

Implement rmail-search-mime-message-function.
author Kenichi Handa <handa@m17n.org>
date Mon, 29 Nov 2010 21:22:39 +0900
parents 7db1ebaea814
children aa074c12a65c
files lisp/ChangeLog lisp/mail/rmailmm.el
diffstat 2 files changed, 69 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Fri Nov 26 21:58:41 2010 +0900
+++ b/lisp/ChangeLog	Mon Nov 29 21:22:39 2010 +0900
@@ -1,3 +1,12 @@
+2010-11-29  Kenichi Handa  <handa@m17n.org>
+
+	* mail/rmailmm.el (rmail-mime-parse): Call rmail-mime-process
+	within condition-case.
+	(rmail-show-mime): Don't use condition-case.
+	(rmail-search-mime-message): New function.
+	(rmail-search-mime-message-function): Set to
+	rmail-search-mime-message.
+
 2010-11-26  Kenichi Handa  <handa@m17n.org>
 
 	* mail/rmailmm.el (rmail-mime-insert-multipart): For unsupported
--- a/lisp/mail/rmailmm.el	Fri Nov 26 21:58:41 2010 +0900
+++ b/lisp/mail/rmailmm.el	Mon Nov 29 21:22:39 2010 +0900
@@ -690,7 +690,9 @@
 The value is a MIME-entiy object (see `rmail-mime-enty-new')."
   (save-excursion
     (goto-char (point-min))
-    (rmail-mime-process nil t)))
+    (condition-case nil
+	(rmail-mime-process nil t)
+      (error nil))))
 
 (defun rmail-mime-insert (entity &optional content-type disposition)
   "Insert a MIME-entity ENTITY in the current buffer.
@@ -743,30 +745,31 @@
 	 message type disposition encoding))
 
 (defun rmail-show-mime ()
-  (let ((mbox-buf rmail-buffer))
-    (condition-case nil
-	(let ((entity (rmail-mime-parse)))
-	  (with-current-buffer rmail-view-buffer
-	    (let ((inhibit-read-only t)
-		  (rmail-buffer mbox-buf))
-	      (erase-buffer)
-	      (rmail-mime-insert entity))))
-      (error
-       ;; Decoding failed.  Insert the original message body as is.
-       (let ((region (with-current-buffer mbox-buf
-		       (goto-char (point-min))
-		       (re-search-forward "^$" nil t)
-		       (forward-line 1)
-		       (cons (point) (point-max)))))
-	 (with-current-buffer rmail-view-buffer
-	   (let ((inhibit-read-only t))
-	     (erase-buffer)
-	     (insert-buffer-substring mbox-buf (car region) (cdr region))))
-	 (message "MIME decoding failed"))))))
+  "Function to set in `rmail-show-mime-function' (which see)."
+  (let ((mbox-buf rmail-buffer)
+	(entity (rmail-mime-parse)))
+    (if entity
+	(with-current-buffer rmail-view-buffer
+	  (let ((inhibit-read-only t)
+		(rmail-buffer mbox-buf))
+	    (erase-buffer)
+	    (rmail-mime-insert entity)))
+      ;; Decoding failed.  Insert the original message body as is.
+      (let ((region (with-current-buffer mbox-buf
+		      (goto-char (point-min))
+		      (re-search-forward "^$" nil t)
+		      (forward-line 1)
+		      (cons (point) (point-max)))))
+	(with-current-buffer rmail-view-buffer
+	  (let ((inhibit-read-only t))
+	    (erase-buffer)
+	    (insert-buffer-substring mbox-buf (car region) (cdr region))))
+	(message "MIME decoding failed")))))
 
 (setq rmail-show-mime-function 'rmail-show-mime)
 
 (defun rmail-insert-mime-forwarded-message (forward-buffer)
+  "Function to set in `rmail-insert-mime-forwarded-message-function' (which see)."
   (let ((mbox-buf (with-current-buffer forward-buffer rmail-view-buffer)))
     (save-restriction
       (narrow-to-region (point) (point))
@@ -776,6 +779,7 @@
       'rmail-insert-mime-forwarded-message)
 
 (defun rmail-insert-mime-resent-message (forward-buffer)
+  "Function to set in `rmail-insert-mime-resent-message-function' (which see)."
   (insert-buffer-substring
    (with-current-buffer forward-buffer rmail-view-buffer))
   (goto-char (point-min))
@@ -786,6 +790,41 @@
 (setq rmail-insert-mime-resent-message-function
       'rmail-insert-mime-resent-message)
 
+(defun rmail-search-mime-message (msg regexp)
+  "Function to set in `rmail-search-mime-message-function' (which see)."
+  (save-restriction
+    (narrow-to-region (rmail-msgbeg msg) (rmail-msgend msg))
+    (let ((mbox-buf (current-buffer))
+	  (header-end (save-excursion
+			(re-search-forward "^$" nil 'move) (point)))
+	  (body-end (point-max))
+	  (entity (rmail-mime-parse)))
+      (or 
+       ;; At first, just search the headers.
+       (with-temp-buffer
+	 (insert-buffer-substring mbox-buf nil header-end)
+	 (rfc2047-decode-region (point-min) (point))
+	 (goto-char (point-min))
+	 (re-search-forward regexp nil t))
+       ;; Next, search the body.
+       (if (and entity
+		(let* ((content-type (rmail-mime-entity-type entity))
+		       (charset (cdr (assq 'charset (cdr content-type)))))
+		  (or (not (string-match "text/.*" (car content-type))) 
+		      (and charset
+			   (not (string= (downcase charset) "us-ascii"))))))
+	   ;; Search the decoded MIME message.
+	   (with-temp-buffer
+	     (let ((rmail-buffer mbox-buf))
+	       (rmail-mime-insert entity))
+	     (goto-char (point-min))
+	     (re-search-forward regexp nil t))
+	 ;; Search the body without decoding.
+	 (goto-char header-end)
+	 (re-search-forward regexp nil t))))))
+
+(setq rmail-search-mime-message-function 'rmail-search-mime-message)
+
 (provide 'rmailmm)
 
 ;; Local Variables: