-(defun nnml-open-server (server &optional defs)
- (nnheader-init-server-buffer)
- (if (equal server nnml-current-server)
- t
- (if nnml-current-server
- (setq nnml-server-alist
- (cons (list nnml-current-server
- (nnheader-save-variables nnml-server-variables))
- nnml-server-alist)))
- (let ((state (assoc server nnml-server-alist)))
- (if state
- (progn
- (nnheader-restore-variables (nth 1 state))
- (setq nnml-server-alist (delq state nnml-server-alist)))
- (nnheader-set-init-variables nnml-server-variables defs)))
- (setq nnml-current-server server)))
-
-(defun nnml-close-server (&optional server)
- (setq nnml-current-server nil)
- t)
-
-(defun nnml-server-opened (&optional server)
- (and (equal server nnml-current-server)
- nntp-server-buffer
- (buffer-name nntp-server-buffer)))
-
-(defun nnml-status-message (&optional server)
- nnml-status-string)
-
-(defun nnml-request-article (id &optional newsgroup server buffer)
- (nnml-possibly-change-directory newsgroup)
- (let* ((group-num (and (stringp id) (nnml-find-group-number id)))
- (number (if (numberp id) id (cdr group-num)))
- (file
- (and number
- (concat
- (if (numberp id)
- nnml-current-directory
- (nnmail-group-pathname (car group-num) nnml-directory))
- (int-to-string number))))
- (nntp-server-buffer (or buffer nntp-server-buffer)))
- (and file
- (file-exists-p file)
- (not (file-directory-p file))
- (save-excursion (nnmail-find-file file))
- ;; We return the article number.
- (cons newsgroup (string-to-int (file-name-nondirectory file))))))
-
-(defun nnml-request-group (group &optional server dont-check)
- (if (not (nnml-possibly-change-directory group))
- (progn
- (setq nnml-status-string "Invalid group (no such directory)")
- nil)
- (if dont-check
- t
- (nnmail-activate 'nnml)
- (let ((active (nth 1 (assoc group nnml-group-alist))))
- (save-excursion
- (set-buffer nntp-server-buffer)
- (erase-buffer)
- (if (not active)
- ()
- (insert (format "211 %d %d %d %s\n"
- (max (1+ (- (cdr active) (car active))) 0)
- (car active) (cdr active) group))
- t))))))
-
-(defun nnml-request-scan (&optional group server)
+(deffoo nnml-open-server (server &optional defs)
+ (nnoo-change-server 'nnml server defs)
+ (when (not (file-exists-p nnml-directory))
+ (condition-case ()
+ (make-directory nnml-directory t)
+ (error t)))
+ (cond
+ ((not (file-exists-p nnml-directory))
+ (nnml-close-server)
+ (nnheader-report 'nnml "Couldn't create directory: %s" nnml-directory))
+ ((not (file-directory-p (file-truename nnml-directory)))
+ (nnml-close-server)
+ (nnheader-report 'nnml "Not a directory: %s" nnml-directory))
+ (t
+ (nnheader-report 'nnml "Opened server %s using directory %s"
+ server nnml-directory)
+ t)))
+
+(deffoo nnml-request-article (id &optional newsgroup server buffer)
+ (nnml-possibly-change-directory newsgroup server)
+ (let* ((nntp-server-buffer (or buffer nntp-server-buffer))
+ file path gpath group-num)
+ (if (stringp id)
+ (when (and (setq group-num (nnml-find-group-number id))
+ (setq file (cdr
+ (assq (cdr group-num)
+ (nnheader-article-to-file-alist
+ (setq gpath
+ (nnmail-group-pathname
+ (car group-num)
+ nnml-directory)))))))
+ (setq path (concat gpath (int-to-string (cdr group-num)))))
+ (unless nnml-article-file-alist
+ (setq nnml-article-file-alist
+ (nnheader-article-to-file-alist nnml-current-directory)))
+ (when (setq file (cdr (assq id nnml-article-file-alist)))
+ (setq path (concat nnml-current-directory file))))
+ (cond
+ ((not path)
+ (nnheader-report 'nnml "No such article: %s" id))
+ ((not (file-exists-p path))
+ (nnheader-report 'nnml "No such file: %s" path))
+ ((file-directory-p path)
+ (nnheader-report 'nnml "File is a directory: %s" path))
+ ((not (save-excursion (nnmail-find-file path)))
+ (nnheader-report 'nnml "Couldn't read file: %s" path))
+ (t
+ (nnheader-report 'nnml "Article %s retrieved" id)
+ ;; We return the article number.
+ (cons newsgroup (string-to-int (file-name-nondirectory path)))))))
+
+(deffoo nnml-request-group (group &optional server dont-check)
+ (cond
+ ((not (nnml-possibly-change-directory group server))
+ (nnheader-report 'nnml "Invalid group (no such directory)"))
+ ((not (file-directory-p nnml-current-directory))
+ (nnheader-report 'nnml "%s is not a directory" nnml-current-directory))
+ (dont-check
+ (nnheader-report 'nnml "Group %s selected" group)
+ t)
+ (t
+ (nnmail-activate 'nnml)
+ (let ((active (nth 1 (assoc group nnml-group-alist))))
+ (if (not active)
+ (nnheader-report 'nnml "No such group: %s" group)
+ (nnheader-report 'nnml "Selected group %s" group)
+ (nnheader-insert "211 %d %d %d %s\n"
+ (max (1+ (- (cdr active) (car active))) 0)
+ (car active) (cdr active) group))))))
+
+(deffoo nnml-request-scan (&optional group server)
+ (setq nnml-article-file-alist nil)