;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
;;; Commentary:
(require 'nnheader)
(require 'rmail)
(require 'nnmail)
+(require 'nnoo)
+(eval-when-compile (require 'cl))
-(defvar nnmbox-mbox-file (expand-file-name "~/mbox")
+(nnoo-declare nnmbox)
+
+(defvoo nnmbox-mbox-file (expand-file-name "~/mbox")
"The name of the mail box file in the user's home directory.")
-(defvar nnmbox-active-file (expand-file-name "~/.mbox-active")
+(defvoo nnmbox-active-file (expand-file-name "~/.mbox-active")
"The name of the active file for the mail box.")
-(defvar nnmbox-get-new-mail t
+(defvoo nnmbox-get-new-mail t
"If non-nil, nnmbox will check the incoming mail file and split the mail.")
-(defvar nnmbox-prepare-save-mail-hook nil
+(defvoo nnmbox-prepare-save-mail-hook nil
"Hook run narrowed to an article before saving.")
\f
(defconst nnmbox-version "nnmbox 1.0"
"nnmbox version.")
-(defvar nnmbox-current-group nil
+(defvoo nnmbox-current-group nil
"Current nnmbox news group directory.")
(defconst nnmbox-mbox-buffer nil)
-(defvar nnmbox-status-string "")
-
-(defvar nnmbox-group-alist nil)
-(defvar nnmbox-active-timestamp nil)
-
-\f
+(defvoo nnmbox-status-string "")
-(defvar nnmbox-current-server nil)
-(defvar nnmbox-server-alist nil)
-(defvar nnmbox-server-variables
- (list
- (list 'nnmbox-mbox-file nnmbox-mbox-file)
- (list 'nnmbox-active-file nnmbox-active-file)
- (list 'nnmbox-get-new-mail nnmbox-get-new-mail)
- '(nnmbox-current-group nil)
- '(nnmbox-status-string "")
- '(nnmbox-group-alist nil)))
+(defvoo nnmbox-group-alist nil)
+(defvoo nnmbox-active-timestamp nil)
\f
;;; Interface functions
-(defun nnmbox-retrieve-headers (sequence &optional newsgroup server fetch-old)
+(nnoo-define-basics nnmbox)
+
+(deffoo nnmbox-retrieve-headers (sequence &optional newsgroup server fetch-old)
(save-excursion
(set-buffer nntp-server-buffer)
(erase-buffer)
(let ((number (length sequence))
(count 0)
article art-string start stop)
- (nnmbox-possibly-change-newsgroup newsgroup)
+ (nnmbox-possibly-change-newsgroup newsgroup server)
(while sequence
(setq article (car sequence))
(setq art-string (nnmbox-article-string article))
(nnheader-fold-continuation-lines)
'headers)))
-(defun nnmbox-open-server (server &optional defs)
- (nnheader-init-server-buffer)
- (if (equal server nnmbox-current-server)
- t
- (if nnmbox-current-server
- (setq nnmbox-server-alist
- (cons (list nnmbox-current-server
- (nnheader-save-variables nnmbox-server-variables))
- nnmbox-server-alist)))
- (let ((state (assoc server nnmbox-server-alist)))
- (if state
- (progn
- (nnheader-restore-variables (nth 1 state))
- (setq nnmbox-server-alist (delq state nnmbox-server-alist)))
- (nnheader-set-init-variables nnmbox-server-variables defs)))
- (setq nnmbox-current-server server)))
-
-(defun nnmbox-close-server (&optional server)
- (setq nnmbox-current-server nil)
+(deffoo nnmbox-open-server (server &optional defs)
+ (nnoo-change-server 'nnmbox server defs)
+ (cond
+ ((not (file-exists-p nnmbox-mbox-file))
+ (nnmbox-close-server)
+ (nnheader-report 'nnmbox "No such file: %s" nnmbox-mbox-file))
+ ((file-directory-p nnmbox-mbox-file)
+ (nnmbox-close-server)
+ (nnheader-report 'nnmbox "Not a regular file: %s" nnmbox-mbox-file))
+ (t
+ (nnheader-report 'nnmbox "Opened server %s using mbox %s" server
+ nnmbox-mbox-file)
+ t)))
+
+(deffoo nnmbox-close-server (&optional server)
+ (when (and nnmbox-mbox-buffer
+ (buffer-name nnmbox-mbox-buffer))
+ (kill-buffer nnmbox-mbox-buffer))
+ (nnoo-close-server 'nnmbox server)
t)
-(defun nnmbox-server-opened (&optional server)
- (and (equal server nnmbox-current-server)
+(deffoo nnmbox-server-opened (&optional server)
+ (and (nnoo-current-server-p 'nnmbox server)
nnmbox-mbox-buffer
(buffer-name nnmbox-mbox-buffer)
nntp-server-buffer
(buffer-name nntp-server-buffer)))
-(defun nnmbox-status-message (&optional server)
- nnmbox-status-string)
-
-(defun nnmbox-request-article (article &optional newsgroup server buffer)
- (nnmbox-possibly-change-newsgroup newsgroup)
+(deffoo nnmbox-request-article (article &optional newsgroup server buffer)
+ (nnmbox-possibly-change-newsgroup newsgroup server)
(save-excursion
(set-buffer nnmbox-mbox-buffer)
(goto-char (point-min))
(cons nnmbox-current-group article)
(nnmbox-article-group-number)))))))
-(defun nnmbox-request-group (group &optional server dont-check)
- (let ((active (assoc group nnmbox-group-alist)))
+(deffoo nnmbox-request-group (group &optional server dont-check)
+ (let ((active (cadr (assoc group nnmbox-group-alist))))
(cond
- ((null (nnmbox-possibly-change-newsgroup group))
+ ((null active)
+ (nnheader-report 'nnmbox "No such group: %s" group))
+ ((null (nnmbox-possibly-change-newsgroup group server))
(nnheader-report 'nnmbox "No such group: %s" group))
(dont-check
(nnheader-report 'nnmbox "Selected group %s" group)
(nnheader-insert ""))
- ((> (car active) (cdr active))
- (nnheader-report 'nnmbox "Empty group %s" group)
- (nnheader-insert "211 0 0 0 %s\n" group))
(t
(nnheader-report 'nnmbox "Selected group %s" group)
- (nnheader-insert
- "211 %d %d %d %s\n"
- (1+ (- (cdadr active) (caadr active)))
- (cadr active) (cdadr active) (car active))
+ (nnheader-insert "211 %d %d %d %s\n"
+ (1+ (- (cdr active) (car active)))
+ (car active) (cdr active) group)
t))))
-(defun nnmbox-request-scan (&optional group server)
+(deffoo nnmbox-request-scan (&optional group server)
(nnmbox-read-mbox)
(nnmail-get-new-mail
'nnmbox
(goto-char (point-max))
(insert-buffer-substring in-buf))))))
-(defun nnmbox-close-group (group &optional server)
+(deffoo nnmbox-close-group (group &optional server)
t)
-(defun nnmbox-request-list (&optional server)
+(deffoo nnmbox-request-list (&optional server)
(save-excursion
(or (nnmail-find-file nnmbox-active-file)
(progn
(nnmail-save-active nnmbox-group-alist nnmbox-active-file)
(nnmail-find-file nnmbox-active-file)))))
-(defun nnmbox-request-newgroups (date &optional server)
+(deffoo nnmbox-request-newgroups (date &optional server)
(nnmbox-request-list server))
-(defun nnmbox-request-list-newsgroups (&optional server)
- (setq nnmbox-status-string "nnmbox: LIST NEWSGROUPS is not implemented.")
- nil)
+(deffoo nnmbox-request-list-newsgroups (&optional server)
+ (nnheader-report 'nnmbox "LIST NEWSGROUPS is not implemented."))
-(defun nnmbox-request-post (&optional server)
- (mail-send-and-exit nil))
-
-(defun nnmbox-request-expire-articles
+(deffoo nnmbox-request-expire-articles
(articles newsgroup &optional server force)
- (nnmbox-possibly-change-newsgroup newsgroup)
+ (nnmbox-possibly-change-newsgroup newsgroup server)
(let* ((is-old t)
rest)
(nnmail-activate 'nnmbox)
(nnmail-save-active nnmbox-group-alist nnmbox-active-file)
(nconc rest articles))))
-(defun nnmbox-request-move-article
+(deffoo nnmbox-request-move-article
(article group server accept-form &optional last)
- (nnmbox-possibly-change-newsgroup group)
+ (nnmbox-possibly-change-newsgroup group server)
(let ((buf (get-buffer-create " *nnmbox move*"))
result)
(and
(and last (save-buffer))))
result))
-(defun nnmbox-request-accept-article (group &optional last)
+(deffoo nnmbox-request-accept-article (group &optional server last)
+ (nnmbox-possibly-change-newsgroup group server)
(let ((buf (current-buffer))
result)
(goto-char (point-min))
(setq result (nnmbox-save-mail (and (stringp group) group))))
(save-excursion
(set-buffer nnmbox-mbox-buffer)
+ (goto-char (point-max))
(insert-buffer-substring buf)
(and last (save-buffer))
result)
(nnmail-save-active nnmbox-group-alist nnmbox-active-file))
(car result)))
-(defun nnmbox-request-replace-article (article group buffer)
+(deffoo nnmbox-request-replace-article (article group buffer)
(nnmbox-possibly-change-newsgroup group)
(save-excursion
(set-buffer nnmbox-mbox-buffer)
(save-buffer)
t)))
-(defun nnmbox-request-delete-group (group &optional force server)
- (nnmbox-possibly-change-newsgroup group)
+(deffoo nnmbox-request-delete-group (group &optional force server)
+ (nnmbox-possibly-change-newsgroup group server)
;; Delete all articles in GROUP.
(if (not force)
() ; Don't delete the articles.
(nnmail-save-active nnmbox-group-alist nnmbox-active-file)
t)
-(defun nnmbox-request-rename-group (group new-name &optional server)
- (nnmbox-possibly-change-newsgroup group)
+(deffoo nnmbox-request-rename-group (group new-name &optional server)
+ (nnmbox-possibly-change-newsgroup group server)
(save-excursion
(set-buffer nnmbox-mbox-buffer)
(goto-char (point-min))
(if (or force (not (re-search-forward "^X-Gnus-Newsgroup: " nil t)))
(delete-region (point-min) (point-max))))))
-(defun nnmbox-possibly-change-newsgroup (newsgroup)
+(defun nnmbox-possibly-change-newsgroup (newsgroup &optional server)
+ (when (and server
+ (not (nnmbox-server-opened server)))
+ (nnmbox-open-server server))
(if (or (not nnmbox-mbox-buffer)
(not (buffer-name nnmbox-mbox-buffer)))
(save-excursion
(nnmail-activate 'nnmbox))
(if newsgroup
(if (assoc newsgroup nnmbox-group-alist)
- (setq nnmbox-current-group newsgroup))))
+ (setq nnmbox-current-group newsgroup))
+ t))
(defun nnmbox-article-string (article)
(if (numberp article)
(forward-char -1)
(while group-art
(insert (format "X-Gnus-Newsgroup: %s:%d %s\n"
- (car (car group-art)) (cdr (car group-art))
+ (caar group-art) (cdar group-art)
(current-time-string)))
(setq group-art (cdr group-art)))))
t))
(defun nnmbox-active-number (group)
;; Find the next article number in GROUP.
- (let ((active (car (cdr (assoc group nnmbox-group-alist)))))
+ (let ((active (cadr (assoc group nnmbox-group-alist))))
(if active
(setcdr active (1+ (cdr active)))
;; This group is new, so we create a new entry for it.
(let ((delim (concat "^" rmail-unix-mail-delimiter))
start end)
(set-buffer (setq nnmbox-mbox-buffer
- (find-file-noselect nnmbox-mbox-file nil 'raw)))
+ (nnheader-find-file-noselect
+ nnmbox-mbox-file nil 'raw)))
(buffer-disable-undo (current-buffer))
(goto-char (point-min))
(while (re-search-forward delim nil t)