* epa-file.el
[elisp/epg.git] / epa-file.el
index 4a59d8d..ff5b65f 100644 (file)
   :type 'regexp
   :group 'epa-file)
 
   :type 'regexp
   :group 'epa-file)
 
+(defcustom epa-file-cache-passphrase-for-symmetric-encryption nil
+  "If t, cache passphrase for symmetric encryption."
+  :type 'boolean
+  :group 'epa-file)
+
 (defvar epa-file-handler
   (cons epa-file-name-regexp 'epa-file-handler))
 (defvar epa-file-handler
   (cons epa-file-name-regexp 'epa-file-handler))
-  
+
 (defvar epa-file-passphrase-alist nil)
 
 (defun epa-file-passphrase-callback-function (context key-id file)
 (defvar epa-file-passphrase-alist nil)
 
 (defun epa-file-passphrase-callback-function (context key-id file)
-  (if (eq key-id 'SYM)
+  (if (and epa-file-cache-passphrase-for-symmetric-encryption
+          (eq key-id 'SYM))
       (let ((entry (assoc file epa-file-passphrase-alist))
            passphrase)
        (or (copy-sequence (cdr entry))
       (let ((entry (assoc file epa-file-passphrase-alist))
            passphrase)
        (or (copy-sequence (cdr entry))
                (setq entry (list file)
                      epa-file-passphrase-alist (cons entry
                                                 epa-file-passphrase-alist)))
                (setq entry (list file)
                      epa-file-passphrase-alist (cons entry
                                                 epa-file-passphrase-alist)))
-             (setq passphrase (epg-passphrase-callback-function context
+             (setq passphrase (epa-passphrase-callback-function context
                                                                 key-id nil))
              (setcdr entry (copy-sequence passphrase))
              passphrase)))
                                                                 key-id nil))
              (setcdr entry (copy-sequence passphrase))
              passphrase)))
-    (epg-passphrase-callback-function context key-id nil)))
+    (epa-passphrase-callback-function context key-id nil)))
 
 (defun epa-file-handler (operation &rest args)
   (save-match-data
 
 (defun epa-file-handler (operation &rest args)
   (save-match-data
        (inhibit-file-name-operation operation))
     (apply operation args)))
 
        (inhibit-file-name-operation operation))
     (apply operation args)))
 
+(defun epa-file-decode-and-insert (string file visit beg end replace)
+  (if (fboundp 'decode-coding-inserted-region)
+      (save-restriction
+       (narrow-to-region (point) (point))
+       (let ((multibyte enable-multibyte-characters))
+         (set-buffer-multibyte nil)
+         (insert string)
+         (set-buffer-multibyte multibyte)
+         (decode-coding-inserted-region
+          (point-min) (point-max)
+          (substring file 0 (string-match epa-file-name-regexp file))
+          visit beg end replace)))
+    (insert (decode-coding-string string (or coding-system-for-read
+                                            'undecided)))))
+
 (defvar last-coding-system-used)
 (defun epa-file-insert-file-contents (file &optional visit beg end replace)
   (barf-if-buffer-read-only)
 (defvar last-coding-system-used)
 (defun epa-file-insert-file-contents (file &optional visit beg end replace)
   (barf-if-buffer-read-only)
      context
      (cons #'epa-file-passphrase-callback-function
           file))
      context
      (cons #'epa-file-passphrase-callback-function
           file))
+    (epg-context-set-progress-callback context
+                                      #'epa-progress-callback-function)
     (unwind-protect
        (progn
          (if replace
     (unwind-protect
        (progn
          (if replace
                     (cons "Opening input file" (cdr error)))))
          (if (or beg end)
              (setq string (substring string (or beg 0) end)))
                     (cons "Opening input file" (cdr error)))))
          (if (or beg end)
              (setq string (substring string (or beg 0) end)))
-         (setq string
-               (decode-coding-string string
-                                     (or coding-system-for-read 'undecided)))
-         (if (boundp 'last-coding-system-used)
-             (set-buffer-file-coding-system last-coding-system-used)
-           (set-buffer-file-coding-system default-buffer-file-coding-system))
          (save-excursion
          (save-excursion
-           (insert string)
-           (setq length (length string))
+           (save-restriction
+             (narrow-to-region (point) (point))
+             (epa-file-decode-and-insert string file visit beg end replace)
+             (setq length (- (point-max) (point-min))))
            (if replace
                (delete-region (point) (point-max)))))
       (if (and local-copy
            (if replace
                (delete-region (point) (point-max)))))
       (if (and local-copy
      context
      (cons #'epa-file-passphrase-callback-function
           file))
      context
      (cons #'epa-file-passphrase-callback-function
           file))
+    (epg-context-set-progress-callback context
+                                      #'epa-progress-callback-function)
     (condition-case error
        (setq string
              (epg-encrypt-string
     (condition-case error
        (setq string
              (epg-encrypt-string