Fix comment
[gnus] / lisp / mail-source.el
index 3ff8351..137a18f 100644 (file)
@@ -1,7 +1,7 @@
 ;;; mail-source.el --- functions for fetching mail
 
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+;;   2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news, mail
@@ -25,7 +25,7 @@
 
 ;;; Code:
 
-;; For Emacs < 22.2.
+;; For Emacs <22.2 and XEmacs.
 (eval-and-compile
   (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
 
 (eval-when-compile
   (require 'cl)
   (require 'imap))
-(eval-and-compile
-  (autoload 'auth-source-user-or-password "auth-source")
-  (autoload 'pop3-movemail "pop3")
-  (autoload 'pop3-get-message-count "pop3")
-  (autoload 'nnheader-cancel-timer "nnheader"))
+(autoload 'auth-source-user-or-password "auth-source")
+(autoload 'pop3-movemail "pop3")
+(autoload 'pop3-get-message-count "pop3")
+(autoload 'nnheader-cancel-timer "nnheader")
 (require 'mm-util)
 (require 'message) ;; for `message-directory'
 
@@ -218,34 +217,6 @@ See Info node `(gnus)Mail Source Specifiers'."
                                           (const :format ""
                                                  :value :dontexpunge)
                                           (boolean :tag "Dontexpunge"))
-                                   (group :inline t
-                                          (const :format "" :value :plugged)
-                                          (boolean :tag "Plugged"))))
-                  (cons :tag "Webmail server"
-                        (const :format "" webmail)
-                        (checklist :tag "Options" :greedy t
-                                   (group :inline t
-                                         (const :format "" :value :subtype)
-                                         ;; Should be generated from
-                                         ;; `webmail-type-definition', but we
-                                         ;; can't require webmail without W3.
-                                         (choice :tag "Subtype"
-                                                 :value hotmail
-                                                 (const hotmail)
-                                                 (const yahoo)
-                                                 (const netaddress)
-                                                 (const netscape)
-                                                 (const my-deja)))
-                                   (group :inline t
-                                          (const :format "" :value :user)
-                                          (string :tag "User"))
-                                   (group :inline t
-                                          (const :format "" :value :password)
-                                          (string :tag "Password"))
-                                   (group :inline t
-                                          (const :format ""
-                                                 :value :dontexpunge)
-                                          (boolean :tag "Dontexpunge"))
                                    (group :inline t
                                           (const :format "" :value :plugged)
                                           (boolean :tag "Plugged"))))))))
@@ -388,13 +359,7 @@ Common keywords should be listed here.")
        (:prescript)
        (:prescript-delay)
        (:postscript)
-       (:dontexpunge))
-      (webmail
-       (:subtype hotmail)
-       (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER")))
-       (:password)
-       (:dontexpunge)
-       (:authentication password)))
+       (:dontexpunge)))
     "Mapping from keywords to default values.
 All keywords that can be used must be listed here."))
 
@@ -403,8 +368,7 @@ All keywords that can be used must be listed here."))
     (directory mail-source-fetch-directory)
     (pop mail-source-fetch-pop)
     (maildir mail-source-fetch-maildir)
-    (imap mail-source-fetch-imap)
-    (webmail mail-source-fetch-webmail))
+    (imap mail-source-fetch-imap))
   "A mapping from source type to fetcher function.")
 
 (defvar mail-source-password-cache nil)
@@ -454,10 +418,11 @@ the `mail-source-keyword-map' variable."
 (put 'mail-source-bind 'lisp-indent-function 1)
 (put 'mail-source-bind 'edebug-form-spec '(sexp body))
 
+;; TODO: use the list format for auth-source-user-or-password modes
 (defun mail-source-set-1 (source)
   (let* ((type (pop source))
         (defaults (cdr (assq type mail-source-keyword-map)))
-        default value keyword user-auth pass-auth)
+        default value keyword auth-info user-auth pass-auth)
     (while (setq default (pop defaults))
       ;; for each default :SYMBOL, set SYMBOL to the plist value for :SYMBOL
       ;; using `mail-source-value' to evaluate the plist value
@@ -466,24 +431,25 @@ the `mail-source-keyword-map' variable."
           ;; 1) the auth-sources user and password override everything
           ;; 2) it avoids macros, so it's cleaner
           ;; 3) it falls through to the mail-sources and then default values
-          (cond 
+          (cond
            ((and
             (eq keyword :user)
-            (setq user-auth 
-                  (auth-source-user-or-password
-                   "login"
-                   ;; this is "host" in auth-sources
-                   (if (boundp 'server) (symbol-value 'server) "")
-                   type)))
+            (setq user-auth
+                  (nth 0 (auth-source-user-or-password
+                          '("login" "password")
+                          ;; this is "host" in auth-sources
+                          (if (boundp 'server) (symbol-value 'server) "")
+                          type))))
             user-auth)
            ((and
-            (eq keyword :password)
-            (setq pass-auth 
-                  (auth-source-user-or-password
-                   "password"
-                   ;; this is "host" in auth-sources
-                   (if (boundp 'server) (symbol-value 'server) "")
-                   type)))
+             (eq keyword :password)
+             (setq pass-auth
+                   (nth 1
+                        (auth-source-user-or-password
+                         '("login" "password")
+                         ;; this is "host" in auth-sources
+                         (if (boundp 'server) (symbol-value 'server) "")
+                         type))))
             pass-auth)
            (t (if (setq value (plist-get source keyword))
                 (mail-source-value value)
@@ -535,7 +501,9 @@ See `mail-source-bind'."
    (t
     value)))
 
-(defun mail-source-fetch (source callback)
+(autoload 'nnheader-message "nnheader")
+
+(defun mail-source-fetch (source callback &optional method)
   "Fetch mail from SOURCE and call CALLBACK zero or more times.
 CALLBACK will be called with the name of the file where (some of)
 the mail from SOURCE is put.
@@ -543,6 +511,16 @@ Return the number of files that were found."
   (mail-source-bind-common source
     (if (or mail-source-plugged plugged)
        (save-excursion
+         ;; Special-case the `file' handler since it's so common and
+         ;; just adds noise.
+         (when (or (not (eq (car source) 'file))
+                   (mail-source-bind (file source)
+                     (file-exists-p path)))
+           (nnheader-message 4 "%sReading incoming mail from %s..."
+                             (if method
+                                 (format "%s: " method)
+                               "")
+                             (car source)))
          (let ((function (cadr (assq (car source) mail-source-fetcher-alist)))
                (found 0))
            (unless function
@@ -573,10 +551,13 @@ Return the number of files that were found."
                      (error "Cannot get new mail"))
                    0)))))))))
 
+(declare-function gnus-message "gnus-util" (level &rest args))
+
 (defun mail-source-delete-old-incoming (&optional age confirm)
   "Remove incoming files older than AGE days.
 If CONFIRM is non-nil, ask for confirmation before removing a file."
   (interactive "P")
+  (require 'gnus-util)
   (let* ((high2days (/ 65536.0 60 60 24));; convert high bits to days
         (low2days  (/ 1.0 65536.0))     ;; convert low bits to days
         (diff (if (natnump age) age 30));; fallback, if no valid AGE given
@@ -615,6 +596,10 @@ Deleting old (> %s day(s)) incoming mail file `%s'." diff bfile)
        0)
     (funcall callback mail-source-crash-box info)))
 
+(autoload 'gnus-float-time "gnus-util")
+
+(defvar mail-source-incoming-last-checked-time nil)
+
 (defun mail-source-delete-crash-box ()
   (when (file-exists-p mail-source-crash-box)
     ;; Delete or move the incoming mail out of the way.
@@ -630,9 +615,16 @@ Deleting old (> %s day(s)) incoming mail file `%s'." diff bfile)
        (rename-file mail-source-crash-box incoming t)
        ;; remove old incoming files?
        (when (natnump mail-source-delete-incoming)
-         (mail-source-delete-old-incoming
-          mail-source-delete-incoming
-          mail-source-delete-old-incoming-confirm))))))
+         ;; Don't check for old incoming files more than once per day to
+         ;; save a lot of file accesses.
+         (when (or (null mail-source-incoming-last-checked-time)
+                   (> (gnus-float-time
+                       (time-since mail-source-incoming-last-checked-time))
+                      (* 24 60 60)))
+           (setq mail-source-incoming-last-checked-time (current-time))
+           (mail-source-delete-old-incoming
+            mail-source-delete-incoming
+            mail-source-delete-old-incoming-confirm)))))))
 
 (defun mail-source-movemail (from to)
   "Move FROM to TO using movemail."
@@ -970,7 +962,7 @@ This only works when `display-time' is enabled."
     (if on
        (progn
          (require 'time)
-         ;; display-time-mail-function is an Emacs 21 feature.
+         ;; display-time-mail-function is an Emacs feature.
          (setq display-time-mail-function #'mail-source-new-mail-p)
          ;; Set up the main timer.
          (setq mail-source-report-new-mail-timer
@@ -1023,20 +1015,19 @@ This only works when `display-time' is enabled."
              (mail-source-delete-crash-box)))))
       found)))
 
-(eval-and-compile
-  (autoload 'imap-open "imap")
-  (autoload 'imap-authenticate "imap")
-  (autoload 'imap-mailbox-select "imap")
-  (autoload 'imap-mailbox-unselect "imap")
-  (autoload 'imap-mailbox-close "imap")
-  (autoload 'imap-search "imap")
-  (autoload 'imap-fetch "imap")
-  (autoload 'imap-close "imap")
-  (autoload 'imap-error-text "imap")
-  (autoload 'imap-message-flags-add "imap")
-  (autoload 'imap-list-to-message-set "imap")
-  (autoload 'imap-range-to-message-set "imap")
-  (autoload 'nnheader-ms-strip-cr "nnheader"))
+(autoload 'imap-open "imap")
+(autoload 'imap-authenticate "imap")
+(autoload 'imap-mailbox-select "imap")
+(autoload 'imap-mailbox-unselect "imap")
+(autoload 'imap-mailbox-close "imap")
+(autoload 'imap-search "imap")
+(autoload 'imap-fetch "imap")
+(autoload 'imap-close "imap")
+(autoload 'imap-error-text "imap")
+(autoload 'imap-message-flags-add "imap")
+(autoload 'imap-list-to-message-set "imap")
+(autoload 'imap-range-to-message-set "imap")
+(autoload 'nnheader-ms-strip-cr "nnheader")
 
 (autoload 'gnus-compress-sequence "gnus-range")
 
@@ -1116,32 +1107,6 @@ This only works when `display-time' is enabled."
                         ?s server ?P port ?u user))
       found)))
 
-(eval-and-compile
-  (autoload 'webmail-fetch "webmail"))
-
-(defun mail-source-fetch-webmail (source callback)
-  "Fetch for webmail source."
-  (mail-source-bind (webmail source)
-    (let ((mail-source-string (format "webmail:%s:%s" subtype user))
-         (webmail-newmail-only dontexpunge)
-         (webmail-move-to-trash-can (not dontexpunge)))
-      (when (eq authentication 'password)
-       (setq password
-             (or password
-                 (cdr (assoc (format "webmail:%s:%s" subtype user)
-                             mail-source-password-cache))
-                 (read-passwd
-                  (format "Password for %s at %s: " user subtype))))
-       (when (and password
-                  (not (assoc (format "webmail:%s:%s" subtype user)
-                              mail-source-password-cache)))
-         (push (cons (format "webmail:%s:%s" subtype user) password)
-               mail-source-password-cache)))
-      (webmail-fetch mail-source-crash-box subtype user password)
-      (mail-source-callback callback (symbol-name subtype))
-      (mail-source-delete-crash-box))))
-
 (provide 'mail-source)
 
-;; arch-tag: 72948025-1d17-4d6c-bb12-ef1aa2c490fd
 ;;; mail-source.el ends here