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

sync with trunk
author Henrik Enberg <henrik.enberg@telia.com>
date Mon, 16 Jan 2006 00:03:54 +0000
parents 7782e54757bb
children
line wrap: on
line diff
--- a/lisp/gnus/nneething.el	Sun Jan 15 23:02:10 2006 +0000
+++ b/lisp/gnus/nneething.el	Mon Jan 16 00:03:54 2006 +0000
@@ -1,10 +1,10 @@
 ;;; nneething.el --- arbitrary file access for Gnus
 
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000
-;;	Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;;   2004, 2005 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
-;; 	Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
+;;	Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;; Keywords: news, mail
 
 ;; This file is part of GNU Emacs.
@@ -21,8 +21,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:
 
@@ -37,7 +37,8 @@
 
 (nnoo-declare nneething)
 
-(defvoo nneething-map-file-directory "~/.nneething/"
+(defvoo nneething-map-file-directory
+  (nnheader-concat gnus-directory ".nneething/")
   "Where nneething stores the map files.")
 
 (defvoo nneething-map-file ".nneething"
@@ -64,7 +65,6 @@
 
 (defvoo nneething-status-string "")
 
-(defvoo nneething-message-id-number 0)
 (defvoo nneething-work-buffer " *nneething work*")
 
 (defvoo nneething-group nil)
@@ -122,15 +122,27 @@
   (let ((file (unless (stringp id)
 		(nneething-file-name id)))
 	(nntp-server-buffer (or buffer nntp-server-buffer)))
-    (and (stringp file)			; We did not request by Message-ID.
+    (and (stringp file)		   ; We did not request by Message-ID.
 	 (file-exists-p file)		; The file exists.
 	 (not (file-directory-p file))	; It's not a dir.
 	 (save-excursion
-	   (nnmail-find-file file)	; Insert the file in the nntp buf.
+	   (let ((nnmail-file-coding-system 'binary))
+	     (nnmail-find-file file))	; Insert the file in the nntp buf.
 	   (unless (nnheader-article-p)	; Either it's a real article...
-	     (goto-char (point-min))
-	     (nneething-make-head
-	      file (current-buffer))	; ... or we fake some headers.
+	     (let ((type
+		    (unless (file-directory-p file)
+		      (or (cdr (assoc (concat "." (file-name-extension file))
+				      mailcap-mime-extensions))
+			  "text/plain")))
+		   (charset
+		    (mm-detect-mime-charset-region (point-min) (point-max)))
+		   (encoding))
+	       (unless (string-match "\\`text/" type)
+		 (base64-encode-region (point-min) (point-max))
+		 (setq encoding "base64"))
+	       (goto-char (point-min))
+	       (nneething-make-head file (current-buffer)
+				    nil type charset encoding))
 	     (insert "\n"))
 	   t))))
 
@@ -234,7 +246,7 @@
 	    prev)
 	(while map
 	  (if (and (member (cadr (car map)) files)
-		   ;; We also remove files that have changed mod times.
+		  ;; We also remove files that have changed mod times.
 		   (equal (nth 5 (file-attributes
 				  (nneething-file-name (cadr (car map)))))
 			  (cadr (cdar map))))
@@ -272,13 +284,42 @@
     (insert-buffer-substring nneething-work-buffer)
     (goto-char (point-max))))
 
-(defun nneething-make-head (file &optional buffer)
+(defun nneething-encode-file-name (file &optional coding-system)
+  "Encode the name of the FILE in CODING-SYSTEM."
+  (let ((pos 0) buf)
+    (setq file (mm-encode-coding-string
+		file (or coding-system nnmail-pathname-coding-system)))
+    (while (string-match "[^-0-9a-zA-Z_:/.]" file pos)
+      (setq buf (cons (format "%%%02x" (aref file (match-beginning 0)))
+		      (cons (substring file pos (match-beginning 0)) buf))
+	    pos (match-end 0)))
+    (apply (function concat)
+	   (nreverse (cons (substring file pos) buf)))))
+
+(defun nneething-decode-file-name (file &optional coding-system)
+  "Decode the name of the FILE is encoded in CODING-SYSTEM."
+  (let ((pos 0) buf)
+    (while (string-match "%\\([0-9a-fA-F][0-9a-fA-F]\\)" file pos)
+      (setq buf (cons (string (string-to-number (match-string 1 file) 16))
+		      (cons (substring file pos (match-beginning 0)) buf))
+	    pos (match-end 0)))
+    (decode-coding-string
+     (apply (function concat)
+	    (nreverse (cons (substring file pos) buf)))
+     (or coding-system nnmail-pathname-coding-system))))
+
+(defun nneething-get-file-name (id)
+  "Extract the file name from the message ID string."
+  (when (string-match "\\`<nneething-\\([^@]+\\)@.*>\\'" id)
+    (nneething-decode-file-name (match-string 1 id))))
+
+(defun nneething-make-head (file &optional buffer extra-msg
+				 mime-type mime-charset mime-encoding)
   "Create a head by looking at the file attributes of FILE."
   (let ((atts (file-attributes file)))
     (insert
-     "Subject: " (file-name-nondirectory file) "\n"
-     "Message-ID: <nneething-"
-     (int-to-string (incf nneething-message-id-number))
+     "Subject: " (file-name-nondirectory file) (or extra-msg "") "\n"
+     "Message-ID: <nneething-" (nneething-encode-file-name file)
      "@" (system-name) ">\n"
      (if (equal '(0 0) (nth 5 atts)) ""
        (concat "Date: " (current-time-string (nth 5 atts)) "\n"))
@@ -288,7 +329,7 @@
 	     (when (re-search-forward "<[a-zA-Z0-9_]@[-a-zA-Z0-9_]>" 1000 t)
 	       (concat "From: " (match-string 0) "\n"))))
 	 (nneething-from-line (nth 2 atts) file))
-     (if (> (string-to-int (int-to-string (nth 7 atts))) 0)
+     (if (> (string-to-number (int-to-string (nth 7 atts))) 0)
 	 (concat "Chars: " (int-to-string (nth 7 atts)) "\n")
        "")
      (if buffer
@@ -297,6 +338,19 @@
 	   (concat "Lines: " (int-to-string
 			      (count-lines (point-min) (point-max)))
 		   "\n"))
+       "")
+     (if mime-type
+	 (concat "Content-Type: " mime-type
+		 (if mime-charset
+		     (concat "; charset="
+			     (if (stringp mime-charset)
+				 mime-charset
+			       (symbol-name mime-charset)))
+		   "")
+		 (if mime-encoding
+		     (concat "\nContent-Transfer-Encoding: " mime-encoding)
+		   "")
+		 "\nMIME-Version: 1.0\n")
        ""))))
 
 (defun nneething-from-line (uid &optional file)
@@ -344,24 +398,28 @@
       (nneething-make-head file) t)
      (t
       ;; We examine the file.
-      (nnheader-insert-head file)
-      (if (nnheader-article-p)
-	  (delete-region
-	   (progn
-	     (goto-char (point-min))
-	     (or (and (search-forward "\n\n" nil t)
-		      (1- (point)))
-		 (point-max)))
-	   (point-max))
-	(goto-char (point-min))
-	(nneething-make-head file (current-buffer))
-	(delete-region (point) (point-max)))
+      (condition-case ()
+	  (progn
+	    (nnheader-insert-head file)
+	    (if (nnheader-article-p)
+		(delete-region
+		 (progn
+		   (goto-char (point-min))
+		   (or (and (search-forward "\n\n" nil t)
+			    (1- (point)))
+		       (point-max)))
+		 (point-max))
+	      (goto-char (point-min))
+	      (nneething-make-head file (current-buffer))
+	      (delete-region (point) (point-max))))
+	(file-error
+	 (nneething-make-head file (current-buffer) " (unreadable)")))
       t))))
 
 (defun nneething-file-name (article)
   "Return the file name of ARTICLE."
   (let ((dir (file-name-as-directory nneething-address))
-        fname)
+	fname)
     (if (numberp article)
 	(if (setq fname (cadr (assq article nneething-map)))
 	    (expand-file-name fname dir)
@@ -370,4 +428,5 @@
 
 (provide 'nneething)
 
+;;; arch-tag: 1277f386-88f2-4459-bb24-f3f45962a6c5
 ;;; nneething.el ends here