diff lisp/gnus/rfc2231.el @ 88155:d7ddb3e565de

sync with trunk
author Henrik Enberg <henrik.enberg@telia.com>
date Mon, 16 Jan 2006 00:03:54 +0000
parents a26d9b55abb6
children
line wrap: on
line diff
--- a/lisp/gnus/rfc2231.el	Sun Jan 15 23:02:10 2006 +0000
+++ b/lisp/gnus/rfc2231.el	Mon Jan 16 00:03:54 2006 +0000
@@ -1,6 +1,7 @@
-;;; rfc2231.el --- functions for decoding rfc2231 headers
+;;; rfc2231.el --- Functions for decoding rfc2231 headers
 
-;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004,
+;;   2005 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; This file is part of GNU Emacs.
@@ -17,8 +18,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
@@ -26,11 +27,20 @@
 
 (eval-when-compile (require 'cl))
 (require 'ietf-drums)
+(require 'rfc2047)
+(autoload 'mm-encode-body "mm-bodies")
+(autoload 'mail-header-remove-whitespace "mail-parse")
+(autoload 'mail-header-remove-comments "mail-parse")
 
 (defun rfc2231-get-value (ct attribute)
   "Return the value of ATTRIBUTE from CT."
   (cdr (assq attribute (cdr ct))))
 
+(defun rfc2231-parse-qp-string (string)
+  "Parse QP-encoded string using `rfc2231-parse-string'.
+N.B.  This is in violation with RFC2047, but it seem to be in common use."
+  (rfc2231-parse-string (rfc2047-decode-string string)))
+
 (defun rfc2231-parse-string (string)
   "Parse STRING and return a list.
 The list will be on the form
@@ -42,11 +52,14 @@
 	  (prev-value "")
 	  display-name mailbox c display-string parameters
 	  attribute value type subtype number encoded
-	  prev-attribute)
+	  prev-attribute prev-encoded)
       (ietf-drums-init (mail-header-remove-whitespace
 			(mail-header-remove-comments string)))
       (let ((table (copy-syntax-table ietf-drums-syntax-table)))
 	(modify-syntax-entry ?\' "w" table)
+	(modify-syntax-entry ?* " " table)
+	(modify-syntax-entry ?\; " " table)
+	(modify-syntax-entry ?= " " table)
 	;; The following isn't valid, but one should be liberal
 	;; in what one receives.
 	(modify-syntax-entry ?\: "w" table)
@@ -75,11 +88,12 @@
 			 (point) (progn (forward-sexp 1) (point))))))
 	      (error "Invalid header: %s" string))
 	    (setq c (char-after))
-	    (setq encoded nil)
 	    (when (eq c ?*)
 	      (forward-char 1)
 	      (setq c (char-after))
-	      (when (memq c ntoken)
+	      (if (not (memq c ntoken))
+		  (setq encoded t
+			number nil)
 		(setq number
 		      (string-to-number
 		       (buffer-substring
@@ -92,9 +106,14 @@
 	    ;; See if we have any previous continuations.
 	    (when (and prev-attribute
 		       (not (eq prev-attribute attribute)))
-	      (push (cons prev-attribute prev-value) parameters)
+	      (push (cons prev-attribute
+			  (if prev-encoded
+			      (rfc2231-decode-encoded-string prev-value)
+			    prev-value))
+		    parameters)
 	      (setq prev-attribute nil
-		    prev-value ""))
+		    prev-value ""
+		    prev-encoded nil))
 	    (unless (eq c ?=)
 	      (error "Invalid header: %s" string))
 	    (forward-char 1)
@@ -104,22 +123,40 @@
 	      (setq value
 		    (buffer-substring (1+ (point))
 				      (progn (forward-sexp 1) (1- (point))))))
-	     ((and (memq c ttoken)
+	     ((and (or (memq c ttoken)
+		       (> c ?\177)) ;; EXTENSION: Support non-ascii chars.
 		   (not (memq c stoken)))
 	      (setq value (buffer-substring
-			   (point) (progn (forward-sexp 1) (point)))))
+			   (point)
+			   (progn
+			     (forward-sexp)
+			     ;; We might not have reached at the end of
+			     ;; the value because of non-ascii chars,
+			     ;; so we should jump over them if any.
+			     (while (and (not (eobp))
+					 (> (char-after) ?\177))
+			       (forward-char 1)
+			       (forward-sexp))
+			     (point)))))
 	     (t
 	      (error "Invalid header: %s" string)))
-	    (when encoded
-	      (setq value (rfc2231-decode-encoded-string value)))
 	    (if number
 		(setq prev-attribute attribute
-		      prev-value (concat prev-value value))
-	      (push (cons attribute value) parameters))))
+		      prev-value (concat prev-value value)
+		      prev-encoded encoded)
+	      (push (cons attribute
+			  (if encoded
+			      (rfc2231-decode-encoded-string value)
+			    value))
+		    parameters))))
 
 	;; Take care of any final continuations.
 	(when prev-attribute
-	  (push (cons prev-attribute prev-value) parameters))
+	  (push (cons prev-attribute
+		      (if prev-encoded
+			  (rfc2231-decode-encoded-string prev-value)
+			prev-value))
+		parameters))
 
 	(when type
 	  `(,type ,@(nreverse parameters)))))))
@@ -140,10 +177,11 @@
 	     (string-to-number (buffer-substring (point) (+ (point) 2)) 16)
 	   (delete-region (1- (point)) (+ (point) 2)))))
       ;; Encode using the charset, if any.
-      (when (and (< (length elems) 1)
-		 (not (equal (intern (car elems)) 'us-ascii)))
+      (when (and (mm-multibyte-p)
+		 (> (length elems) 1)
+		 (not (equal (intern (downcase (car elems))) 'us-ascii)))
 	(mm-decode-coding-region (point-min) (point-max)
-				 (intern (car elems))))
+				 (intern (downcase (car elems)))))
       (buffer-string))))
 
 (defun rfc2231-encode-string (param value)
@@ -175,7 +213,7 @@
 	(goto-char (point-min))
 	(while (not (eobp))
 	  (when (> (current-column) 60)
-	    (insert "\n")
+	    (insert ";\n")
 	    (setq broken t))
 	  (if (or (not (memq (following-char) ascii))
 		  (memq (following-char) control)
@@ -187,12 +225,13 @@
 		(delete-char 1))
 	    (forward-char 1)))
 	(goto-char (point-min))
-	(insert (or charset "ascii") "''")
+	(insert (symbol-name (or charset 'us-ascii)) "''")
 	(goto-char (point-min))
 	(if (not broken)
 	    (insert param "*=")
 	  (while (not (eobp))
-	    (insert param "*" (format "%d" (incf num)) "*=")
+	    (insert (if (>= num 0) " " "\n ")
+		    param "*" (format "%d" (incf num)) "*=")
 	    (forward-line 1))))
        (spacep
 	(goto-char (point-min))
@@ -206,4 +245,5 @@
 
 (provide 'rfc2231)
 
+;;; arch-tag: c3ab751d-d108-406a-b301-68882ad8cd63
 ;;; rfc2231.el ends here