+ (autoload 'md5 "md5"))
+
+(defcustom elmo-pop3-default-use-uidl t
+ "If non-nil, use UIDL on POP3."
+ :type 'boolean
+ :group 'elmo)
+
+(defvar elmo-pop3-use-uidl-internal t
+ "(Internal switch for using UIDL on POP3).")
+
+(defvar elmo-pop3-use-cache t
+ "Use cache in pop3 folder.")
+
+(defvar elmo-pop3-send-command-synchronously nil
+ "If non-nil, commands are send synchronously.
+If server doesn't accept asynchronous commands, this variable should be
+set as non-nil.")
+
+(defcustom elmo-pop3-exists-exactly nil
+ "If non-nil, POP3 folder existence is checked everytime before the session."
+ :type 'boolean
+ :group 'elmo)
+
+(defconst elmo-pop3-folder-name-syntax `(([user ".+"])
+ (?/ [auth ".+"])
+ (?: [uidl "^[A-Za-z]+$"])
+ ,@elmo-net-folder-name-syntax))
+
+(defvar sasl-mechanism-alist)
+
+(defvar elmo-pop3-retrieve-progress-reporter nil)
+
+;; For debugging.
+(defvar elmo-pop3-debug nil
+ "Non-nil forces POP3 folder as debug mode.
+Debug information is inserted in the buffer \"*POP3 DEBUG*\"")
+
+;;; Debug
+(defsubst elmo-pop3-debug (message &rest args)
+ (if elmo-pop3-debug
+ (let ((biff (string-match "BIFF-" (buffer-name)))
+ pos)
+ (with-current-buffer (get-buffer-create (concat "*POP3 DEBUG*"
+ (if biff "BIFF")))
+ (goto-char (point-max))
+ (setq pos (point))
+ (insert (apply 'format message args) "\n")))))
+
+;;; ELMO POP3 folder
+(eval-and-compile
+ (luna-define-class elmo-pop3-folder (elmo-net-folder elmo-location-map)
+ (use-uidl))
+ (luna-define-internal-accessors 'elmo-pop3-folder))
+
+(defsubst elmo-pop3-folder-use-uidl (folder)
+ (if elmo-inhibit-number-mapping
+ nil
+ (elmo-pop3-folder-use-uidl-internal folder)))
+
+(luna-define-method elmo-folder-initialize ((folder elmo-pop3-folder) name)
+ (let ((elmo-network-stream-type-alist
+ (if elmo-pop3-stream-type-alist
+ (append elmo-pop3-stream-type-alist
+ elmo-network-stream-type-alist)
+ elmo-network-stream-type-alist))
+ tokens auth uidl)
+ (setq tokens (car (elmo-parse-separated-tokens
+ name
+ elmo-pop3-folder-name-syntax)))
+ ;; user
+ (elmo-net-folder-set-user-internal folder
+ (or (cdr (assq 'user tokens))
+ elmo-pop3-default-user))
+ ;; auth
+ (setq auth (cdr (assq 'auth tokens)))
+ (elmo-net-folder-set-auth-internal folder
+ (if auth
+ (intern (downcase auth))
+ elmo-pop3-default-authenticate-type))
+ ;; uidl
+ (setq uidl (cdr (assq 'uidl tokens)))
+ (elmo-pop3-folder-set-use-uidl-internal folder
+ (if uidl
+ (string= uidl "uidl")
+ elmo-pop3-default-use-uidl))
+ ;; network
+ (elmo-net-folder-set-parameters
+ folder
+ tokens
+ (list :server elmo-pop3-default-server
+ :port elmo-pop3-default-port
+ :stream-type
+ (elmo-get-network-stream-type elmo-pop3-default-stream-type)))
+ folder))
+
+;;; POP3 session
+(luna-define-class elmo-pop3-session (elmo-network-session) ())