Function: pop3-uidl-stat

pop3-uidl-stat is a byte-compiled function defined in pop3.el.gz.

Signature

(pop3-uidl-stat PROCESS)

Documentation

Return a list of unread message numbers and total size.

Source Code

;; Defined in /usr/src/emacs/lisp/net/pop3.el.gz
(defun pop3-uidl-stat (process)
  "Return a list of unread message numbers and total size."
  (pop3-send-command process "UIDL")
  (let (err messages size)
    (if (condition-case code
	    (progn
	      (pop3-read-response process)
	      t)
	  (error (setq err (error-message-string code))
		 nil))
	(let ((start pop3-read-point)
	      saved list)
	  (with-current-buffer (process-buffer process)
	    (while (not (re-search-forward "^\\.\r\n" nil t))
	      (unless (memq (process-status process) '(open run))
		(error "pop3 server closed the connection"))
	      (pop3-accept-process-output process)
	      (goto-char start))
	    (setq pop3-read-point (point-marker)
		  pop3-uidl nil)
	    (while (progn (forward-line -1) (>= (point) start))
	      (when (looking-at "[0-9]+ \\([^\n\r ]+\\)")
		(push (match-string 1) pop3-uidl)))
	    (when pop3-uidl
	      (setq pop3-uidl-saved (pop3-uidl-load)
		    saved (cdr (assoc pop3-maildrop
				      (cdr (assoc pop3-mailhost
						  pop3-uidl-saved)))))
	      (let ((i (length pop3-uidl)))
		(while (> i 0)
		  (unless (member (nth (1- i) pop3-uidl) saved)
		    (push i messages))
                  (decf i)))
	      (when messages
		(setq list (pop3-list process)
		      size 0)
		(dolist (msg messages)
		  (setq size (+ size (cdr (assq msg list)))))
		(list messages size)))))
      (message "%s doesn't support UIDL (%s), so we try a regressive way..."
	       pop3-mailhost err)
      (sit-for 1)
      (setq size (pop3-stat process))
      (dotimes (i (car size)) (push (1+ i) messages))
      (setcar size (nreverse messages))
      size)))