(diary-file): Doc fix.
[bpt/emacs.git] / lisp / pgg.el
index 70aa27b..3de9b5e 100644 (file)
@@ -1,7 +1,7 @@
 ;;; pgg.el --- glue for the various PGP implementations.
 
 ;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
 ;;; pgg.el --- glue for the various PGP implementations.
 
 ;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
-;;   2005 Free Software Foundation, Inc.
+;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
 ;; Symmetric encryption added by: Sascha Wilde <wilde@sha-bang.de>
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
 ;; Symmetric encryption added by: Sascha Wilde <wilde@sha-bang.de>
@@ -12,7 +12,7 @@
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 
 ;; Don't merge these two `eval-when-compile's.
 (eval-when-compile
 
 ;; Don't merge these two `eval-when-compile's.
 (eval-when-compile
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))
   (require 'cl))
 
 ;;; @ utility functions
 ;;;
 
   (require 'cl))
 
 ;;; @ utility functions
 ;;;
 
+(eval-when-compile
+  ;; Define it as a null macro for Emacs in order to suppress a byte
+  ;; compile warning that Emacs 21 issues.
+  (defmacro pgg-run-at-time-1 (time repeat function args)
+    (when (featurep 'xemacs)
+      (if (condition-case nil
+             (let ((delete-itimer 'delete-itimer)
+                   (itimer-driver-start 'itimer-driver-start)
+                   (itimer-value 'itimer-value)
+                   (start-itimer 'start-itimer))
+               (unless (or (symbol-value 'itimer-process)
+                           (symbol-value 'itimer-timer))
+                 (funcall itimer-driver-start))
+               ;; Check whether there is a bug to which the difference of
+               ;; the present time and the time when the itimer driver was
+               ;; woken up is subtracted from the initial itimer value.
+               (let* ((inhibit-quit t)
+                      (ctime (current-time))
+                      (itimer-timer-last-wakeup
+                       (prog1
+                           ctime
+                         (setcar ctime (1- (car ctime)))))
+                      (itimer-list nil)
+                      (itimer (funcall start-itimer "pgg-run-at-time"
+                                       'ignore 5)))
+                 (sleep-for 0.1) ;; Accept the timeout interrupt.
+                 (prog1
+                     (> (funcall itimer-value itimer) 0)
+                   (funcall delete-itimer itimer))))
+           (error nil))
+         `(let ((time ,time))
+            (apply #'start-itimer "pgg-run-at-time"
+                   ,function (if time (max time 1e-9) 1e-9)
+                   ,repeat nil t ,args)))
+      `(let ((time ,time)
+            (itimers (list nil)))
+        (setcar
+         itimers
+         (apply #'start-itimer "pgg-run-at-time"
+                (lambda (itimers repeat function &rest args)
+                  (let ((itimer (car itimers)))
+                    (if repeat
+                        (progn
+                          (set-itimer-function
+                           itimer
+                           (lambda (itimer repeat function &rest args)
+                             (set-itimer-restart itimer repeat)
+                             (set-itimer-function itimer function)
+                             (set-itimer-function-arguments itimer args)
+                             (apply function args)))
+                          (set-itimer-function-arguments
+                           itimer
+                           (append (list itimer repeat function) args)))
+                      (set-itimer-function
+                       itimer
+                       (lambda (itimer function &rest args)
+                         (delete-itimer itimer)
+                         (apply function args)))
+                      (set-itimer-function-arguments
+                       itimer
+                       (append (list itimer function) args)))))
+                1e-9 (if time (max time 1e-9) 1e-9)
+                nil t itimers ,repeat ,function ,args))))))
+
+(eval-and-compile
+  (if (featurep 'xemacs)
+      (progn
+       (defun pgg-run-at-time (time repeat function &rest args)
+         "Emulating function run as `run-at-time'.
+TIME should be nil meaning now, or a number of seconds from now.
+Return an itimer object which can be used in either `delete-itimer'
+or `cancel-timer'."
+         (pgg-run-at-time-1 time repeat function args))
+       (defun pgg-cancel-timer (timer)
+         "Emulate cancel-timer for xemacs."
+         (let ((delete-itimer 'delete-itimer))
+           (funcall delete-itimer timer))))
+    (defalias 'pgg-run-at-time 'run-at-time)
+    (defalias 'pgg-cancel-timer 'cancel-timer)))
+
 (defun pgg-invoke (func scheme &rest args)
   (progn
     (require (intern (format "pgg-%s" scheme)))
 (defun pgg-invoke (func scheme &rest args)
   (progn
     (require (intern (format "pgg-%s" scheme)))
@@ -148,6 +229,13 @@ regulate cache behavior."
                            #'pgg-remove-passphrase-from-cache
                            key notruncate))))
 
                            #'pgg-remove-passphrase-from-cache
                            key notruncate))))
 
+(if (fboundp 'clear-string)
+    (defalias 'pgg-clear-string 'clear-string)
+  (defun pgg-clear-string (string)
+    (fillarray string ?_)))
+
+(declare-function pgg-clear-string "pgg" (string))
+
 (defun pgg-remove-passphrase-from-cache (key &optional notruncate)
   "Omit passphrase associated with KEY in time-limited passphrase cache.
 
 (defun pgg-remove-passphrase-from-cache (key &optional notruncate)
   "Omit passphrase associated with KEY in time-limited passphrase cache.
 
@@ -166,91 +254,12 @@ regulate cache behavior."
          (interned-timer-key (intern-soft key pgg-pending-timers))
          (old-timer (symbol-value interned-timer-key)))
     (when passphrase
          (interned-timer-key (intern-soft key pgg-pending-timers))
          (old-timer (symbol-value interned-timer-key)))
     (when passphrase
-      (fillarray passphrase ?_)
+      (pgg-clear-string passphrase)
       (unintern key pgg-passphrase-cache))
     (when old-timer
       (pgg-cancel-timer old-timer)
       (unintern interned-timer-key pgg-pending-timers))))
 
       (unintern key pgg-passphrase-cache))
     (when old-timer
       (pgg-cancel-timer old-timer)
       (unintern interned-timer-key pgg-pending-timers))))
 
-(eval-when-compile
-  (defmacro pgg-run-at-time-1 (time repeat function args)
-    (when (featurep 'xemacs)
-      (if (condition-case nil
-             (let ((delete-itimer 'delete-itimer)
-                   (itimer-driver-start 'itimer-driver-start)
-                   (itimer-value 'itimer-value)
-                   (start-itimer 'start-itimer))
-               (unless (or (symbol-value 'itimer-process)
-                           (symbol-value 'itimer-timer))
-                 (funcall itimer-driver-start))
-               ;; Check whether there is a bug to which the difference of
-               ;; the present time and the time when the itimer driver was
-               ;; woken up is subtracted from the initial itimer value.
-               (let* ((inhibit-quit t)
-                      (ctime (current-time))
-                      (itimer-timer-last-wakeup
-                       (prog1
-                           ctime
-                         (setcar ctime (1- (car ctime)))))
-                      (itimer-list nil)
-                      (itimer (funcall start-itimer "pgg-run-at-time"
-                                       'ignore 5)))
-                 (sleep-for 0.1) ;; Accept the timeout interrupt.
-                 (prog1
-                     (> (funcall itimer-value itimer) 0)
-                   (funcall delete-itimer itimer))))
-           (error nil))
-         `(let ((time ,time))
-            (apply #'start-itimer "pgg-run-at-time"
-                   ,function (if time (max time 1e-9) 1e-9)
-                   ,repeat nil t ,args)))
-      `(let ((time ,time)
-            (itimers (list nil)))
-        (setcar
-         itimers
-         (apply #'start-itimer "pgg-run-at-time"
-                (lambda (itimers repeat function &rest args)
-                  (let ((itimer (car itimers)))
-                    (if repeat
-                        (progn
-                          (set-itimer-function
-                           itimer
-                           (lambda (itimer repeat function &rest args)
-                             (set-itimer-restart itimer repeat)
-                             (set-itimer-function itimer function)
-                             (set-itimer-function-arguments itimer args)
-                             (apply function args)))
-                          (set-itimer-function-arguments
-                           itimer
-                           (append (list itimer repeat function) args)))
-                      (set-itimer-function
-                       itimer
-                       (lambda (itimer function &rest args)
-                         (delete-itimer itimer)
-                         (apply function args)))
-                      (set-itimer-function-arguments
-                       itimer
-                       (append (list itimer function) args)))))
-                1e-9 (if time (max time 1e-9) 1e-9)
-                nil t itimers ,repeat ,function ,args))))))
-
-(eval-and-compile
-  (if (featurep 'xemacs)
-      (progn
-        (defun pgg-run-at-time (time repeat function &rest args)
-          "Emulating function run as `run-at-time'.
-TIME should be nil meaning now, or a number of seconds from now.
-Return an itimer object which can be used in either `delete-itimer'
-or `cancel-timer'."
-          (pgg-run-at-time-1 time repeat function args))
-        (defun pgg-cancel-timer (timer)
-          "Emulate cancel-timer for xemacs."
-          (let ((delete-itimer 'delete-itimer))
-            (funcall delete-itimer timer)))
-        )
-    (defalias 'pgg-run-at-time 'run-at-time)
-    (defalias 'pgg-cancel-timer 'cancel-timer)))
-
 (defmacro pgg-convert-lbt-region (start end lbt)
   `(let ((pgg-conversion-end (set-marker (make-marker) ,end)))
      (goto-char ,start)
 (defmacro pgg-convert-lbt-region (start end lbt)
   `(let ((pgg-conversion-end (set-marker (make-marker) ,end)))
      (goto-char ,start)
@@ -327,7 +336,7 @@ cache or user."
   (interactive "r")
   (let ((status
         (pgg-save-coding-system start end
   (interactive "r")
   (let ((status
         (pgg-save-coding-system start end
-          (pgg-invoke "encrypt-symmetric-region" 
+          (pgg-invoke "encrypt-symmetric-region"
                       (or pgg-scheme pgg-default-scheme)
                       (point-min) (point-max) passphrase))))
     (when (interactive-p)
                       (or pgg-scheme pgg-default-scheme)
                       (point-min) (point-max) passphrase))))
     (when (interactive-p)
@@ -411,7 +420,7 @@ If the optional 3rd argument CLEARTEXT is non-nil, it does not create
 a detached signature.
 
 If this function is called interactively, CLEARTEXT is enabled
 a detached signature.
 
 If this function is called interactively, CLEARTEXT is enabled
-and the the output is displayed.
+and the output is displayed.
 
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
 
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
@@ -436,7 +445,7 @@ If optional arguments START and END are specified, only sign data
 within the region.
 
 If this function is called interactively, CLEARTEXT is enabled
 within the region.
 
 If this function is called interactively, CLEARTEXT is enabled
-and the the output is displayed.
+and the output is displayed.
 
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
 
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user."
@@ -480,7 +489,7 @@ signer's public key from `pgg-default-keyserver-address'."
               (or (cdr (assq 'preferred-key-server packet))
                   pgg-default-keyserver-address))
         (pgg-fetch-key keyserver key))
               (or (cdr (assq 'preferred-key-server packet))
                   pgg-default-keyserver-address))
         (pgg-fetch-key keyserver key))
-    (setq status 
+    (setq status
          (pgg-save-coding-system start end
            (pgg-invoke "verify-region" (or pgg-scheme pgg-default-scheme)
                        (point-min) (point-max) signature)))
          (pgg-save-coding-system start end
            (pgg-invoke "verify-region" (or pgg-scheme pgg-default-scheme)
                        (point-min) (point-max) signature)))