+ (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)
+
+(defvar sasl-mechanism-alist)
+
+(defvar elmo-pop3-total-size 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)
+ (use-uidl location-alist))
+ (luna-define-internal-accessors 'elmo-pop3-folder))
+
+(luna-define-method elmo-folder-initialize :around ((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))
+ parse)
+ (setq name (luna-call-next-method))
+ ;; user
+ (setq parse (elmo-parse-token name "/:"))
+ (elmo-net-folder-set-user-internal folder
+ (if (eq (length (car parse)) 0)
+ elmo-pop3-default-user
+ (car parse)))
+ ;; auth
+ (setq parse (elmo-parse-prefixed-element ?/ (cdr parse) ":"))
+ (elmo-net-folder-set-auth-internal folder
+ (if (eq (length (car parse)) 0)
+ elmo-pop3-default-authenticate-type
+ (intern (downcase (car parse)))))
+ ;; uidl
+ (setq parse (elmo-parse-prefixed-element ?: (cdr parse)))
+ (elmo-pop3-folder-set-use-uidl-internal folder
+ (if (eq (length (car parse)) 0)
+ elmo-pop3-default-use-uidl
+ (string= (car parse) "uidl")))
+ (unless (elmo-net-folder-server-internal folder)
+ (elmo-net-folder-set-server-internal folder
+ elmo-pop3-default-server))
+ (unless (elmo-net-folder-port-internal folder)
+ (elmo-net-folder-set-port-internal folder
+ elmo-pop3-default-port))
+ (unless (elmo-net-folder-stream-type-internal folder)
+ (elmo-net-folder-set-stream-type-internal
+ folder
+ (elmo-get-network-stream-type
+ elmo-pop3-default-stream-type)))
+ folder))
+
+;;; POP3 session
+(luna-define-class elmo-pop3-session (elmo-network-session) ())