changeset 105779:4f83cd6cf378

* net/tramp-imap.el (top): Add `X-Size' to `imap-hash-headers'. (tramp-imap-do-copy-or-rename-file): Don't use the inode, when calling `tramp-imap-put-file'. Add file size to the call. (tramp-imap-get-file-entries): Compute also user name, file size, and date. (tramp-imap-handle-insert-directory): Insert uid and gid. (tramp-imap-handle-file-attributes): Transform uid and gid according to `id-format'. (tramp-imap-put-file): New optional parameter SIZE. Encode file size in header X-Size.
author Michael Albinus <michael.albinus@gmx.de>
date Tue, 27 Oct 2009 10:52:54 +0000
parents a431286b73b3
children f641cce94663
files lisp/net/tramp-imap.el
diffstat 1 files changed, 44 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/net/tramp-imap.el	Tue Oct 27 02:48:13 2009 +0000
+++ b/lisp/net/tramp-imap.el	Tue Oct 27 10:52:54 2009 +0000
@@ -60,6 +60,9 @@
 (require 'epa)
 (autoload 'auth-source-user-or-password "auth-source")
 
+;; We use the additional header "X-Size" for encoding the size of a file.
+(add-to-list 'imap-hash-headers 'X-Size 'append)
+
 ;; Define Tramp IMAP method ...
 (defconst tramp-imap-method "imap"
   "*Method to connect via IMAP protocol.")
@@ -243,8 +246,7 @@
 	    (tramp-imap-put-file
 	     v (current-buffer)
 	     (tramp-imap-file-name-name v)
-	     (tramp-imap-get-file-inode newname)
-	     nil))
+	     nil nil (nth 7 (file-attributes filename))))
 	;; One of them is not located on a IMAP mailbox.
 	(insert-file-contents filename)
 	(write-region (point-min) (point-max) newname)))
@@ -319,17 +321,25 @@
     (imap-hash-map (lambda (uid headers body)
 		     (let ((subject (substring
 				     (aget headers 'Subject "")
-				     (length tramp-imap-subject-marker))))
+				     (length tramp-imap-subject-marker)))
+			   (from (aget headers 'From ""))
+			   (date (date-to-time (aget headers 'Date "")))
+			   (size (string-to-number
+				  (or (aget headers 'X-Size "0") "0"))))
+		       (setq from
+			     (if (string-match "<\\([^@]+\\)@" from)
+				 (match-string 1 from)
+			       "nobody"))
 		       (list
 			subject
 			nil
 			-1
-			1
-			1
-			'(0 0)
-			'(0 0)
-			'(0 0)
-			1
+			from
+			"nogroup"
+			date
+			date
+			date
+			size
 			"-rw-rw-rw-"
 			nil
 			uid
@@ -440,7 +450,8 @@
 	       "%10s %3d %-8s %-8s %8s %s "
 	       (nth 9 x) ; mode
 	       (nth 11 x) ; inode
-	       "nobody" "nogroup"
+	       (nth 3 x) ; uid
+	       (nth 4 x) ; gid
 	       (nth 8 x) ; size
 	       (format-time-string
 		(if (tramp-time-less-p
@@ -499,7 +510,11 @@
 (defun tramp-imap-handle-file-attributes (filename &optional id-format)
   "Like `file-attributes' for Tramp-IMAP FILENAME."
   (with-parsed-tramp-file-name (expand-file-name filename) nil
-    (cdr-safe (nth 0 (tramp-imap-get-file-entries v localname)))))
+    (let ((res (cdr-safe (nth 0 (tramp-imap-get-file-entries v localname)))))
+      (unless (or (null res) (eq id-format 'string))
+	(setcar (nthcdr 2 res) 1)
+	(setcar (nthcdr 3 res) 1))
+      res)))
 
 (defun tramp-imap-get-file-inode (filename &optional id-format)
   "Get inode equivalent \(actually the UID) for Tramp-IMAP FILENAME."
@@ -560,10 +575,13 @@
  	(tramp-message v 4 "Fetching %s to tmp file %s...done" filename tmpfile)
  	tmpfile))))
 
-(defun tramp-imap-put-file (vec filename-or-buffer &optional subject inode encode)
+(defun tramp-imap-put-file
+  (vec filename-or-buffer &optional subject inode encode size)
   "Write contents of FILENAME-OR-BUFFER to Tramp-IMAP file VEC with name SUBJECT.
 When INODE is given, delete that old remote file after writing the new one
-\(normally this is the old file with the same name)."
+\(normally this is the old file with the same name).  A non-nil ENCODE
+forces the encoding of the buffer or file.  SIZE, when available, indicates
+the file size; this is needed, if the file or buffer is already encoded."
   ;; `tramp-current-host' is used in `tramp-imap-passphrase-callback-function'.
   (let ((tramp-current-host (tramp-file-name-real-host vec))
 	(iht (tramp-imap-make-iht vec)))
@@ -573,7 +591,18 @@
 			   (format
 			    "%s%s"
 			    tramp-imap-subject-marker
-			    (or subject "no subject"))))
+			    (or subject "no subject")))
+			  (cons
+			   'X-Size
+			   (number-to-string
+			    (cond
+			     ((numberp size) size)
+			     ((bufferp filename-or-buffer)
+			      (buffer-size filename-or-buffer))
+			     ((stringp filename-or-buffer)
+			      (nth 7 (file-attributes filename-or-buffer)))
+			     ;; We don't know the size.
+			     (t -1)))))
 		    (cond ((bufferp filename-or-buffer)
 			   (with-current-buffer filename-or-buffer
 			     (if encode
@@ -748,11 +777,7 @@
 ;;   "/imaps:imap.gmail.com:/INBOX.test/" results in error
 ;;   "error in process filter: Internal error, tag 5 status BAD code nil text UNSELECT not allowed now."
 
-;; * Improve `tramp-imap-handle-file-attributes'
-;;   - size
-;;   - modification time
-;;   - user
-;;   - Return info for directories.
+;; * Improve `tramp-imap-handle-file-attributes' for directories.
 
 ;; * Saving a file creates a second one, instead of overwriting.