lisp/gnus-offline.el: Bug fix by Hidekazu Nakamura
[elisp/gnus.git-] / lisp / gnus-ofsetup.el
1 ;;; gnus-ofsetup.el --- Setup advisor for Offline reading for Mail/News.
2 ;;;
3 ;;; $Id: gnus-ofsetup.el,v 1.1.2.8 1998-12-11 15:54:35 ichikawa Exp $
4 ;;;
5 ;;; Copyright (C) 1998 Tatsuya Ichikawa
6 ;;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
7 ;;;
8 ;;; This file is part of Semi-gnus.
9 ;;;
10 ;;; GNU Emacs is free software; you can redistribute it and/or modify
11 ;;; it under the terms of the GNU General Public License as published by
12 ;;; the Free Software Foundation; either version 2, or (at your option)
13 ;;; any later version.
14
15 ;;; GNU Emacs is distributed in the hope that it will be useful,
16 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;;; GNU General Public License for more details.
19
20 ;;; You should have received a copy of the GNU General Public License
21 ;;; along with GNU Emacs; see the file COPYING.  If not, write to the
22 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;;; Boston, MA 02111-1307, USA.
24 ;;;
25 ;;;; Commentary:
26 ;;; How to use.
27 ;;;
28 ;;;      M-x load[RET]gnus-ofsetup
29 ;;;      M-x gnus-setup-for-offline
30 ;;;
31
32 ;;; Code:
33
34 (defvar gnus-offline-setting-file "~/.gnus-offline.el")
35 (defvar gnus-offline-use-miee nil)
36 (defvar gnus-offline-news-fetch-method nil)
37 (defvar gnus-offline-mail-fetch-method nil)
38 (defvar gnus-offline-hangup-program nil)
39 (defvar gnus-offline-dialup-program nil)
40 (defvar pop3-fma-spool-file-alist nil)
41 (defvar pop3-fma-movemail-type nil)
42 (defvar pop3-fma-movemail-arguments nil)
43 (defvar use-miee nil)
44 (defvar address)
45 (defvar options)
46
47 ;;; To silence byte compiler
48 (and
49  (fboundp 'eval-when-compile)
50  (eval-when-compile
51    (save-excursion
52      (beginning-of-defun)
53      (eval-region (point-min) (point)))
54    (let (case-fold-search)
55      (mapcar
56       (function
57        (lambda (symbol)
58          (unless (boundp symbol)
59            (make-local-variable symbol)
60            (eval (list 'setq symbol nil)))))
61       '(:group
62         :prefix :type
63         sendmail-to-spool-directory
64         news-spool-request-post-directory
65         nnspool-version
66         nnagent-version
67         msspool-news-server
68         msspool-news-service
69         gnspool-get-news
70         mail-spool-send
71         news-spool-post
72         gnus-agent-handle-level
73         ))
74      (make-local-variable 'byte-compile-warnings)
75      (setq byte-compile-warnings nil))))
76
77 (defun gnus-setup-for-offline ()
78   "*Set up Gnus for offline environment."
79   (interactive)
80   
81   (if (not (file-exists-p gnus-offline-setting-file))
82       (progn
83         (let ((news-method
84                (completing-read
85                 "Method for offline News reading (TAB to completion): "
86                 '(("gnus-agent" 1) ("nnspool" 2))
87                 nil t nil))
88               (mail-method 'nnmail)
89               (program
90                (read-file-name "Dialup/Hangup program(type nil you do not use): "))
91               (mta-type
92                (completing-read
93                 "Select MTA type for sending mail (TAB to completion): "
94                 '(("smtp" 1) ("sendmail" 2))
95                 nil t nil))
96               (num-of-address
97                (read-from-minibuffer "How many e-mail address do you have: "))
98               )
99           (if (string-equal news-method "nnspool")
100               (setq use-miee t)
101             (setq use-miee (y-or-n-p "Use MIEE post/send message ")))
102           ;;
103           ;; Set variables.
104           (if (string-equal news-method "gnus-agent")
105               (setq gnus-offline-news-fetch-method 'nnagent)
106             (setq gnus-offline-news-fetch-method 'nnspool))
107           ;;
108           (setq gnus-offline-mail-fetch-method mail-method)
109           (setq gnus-offline-use-miee use-miee)
110           
111           ;; Set programs.
112           (if (string-equal program "nil")
113               (progn
114                 (setq gnus-offline-hangup-program nil)
115                 (setq gnus-offline-dialup-program nil))
116             (let ((options
117                    (read-from-minibuffer "Dialup program options: ")))
118               (setq gnus-offline-dialup-program-arguments
119                     (split-string options "[\t ]+")))
120             (let ((options
121                    (read-from-minibuffer "Hangup program options: ")))
122               (setq gnus-offline-hangup-program-arguments
123                     (split-string options "[\t ]+")))
124             (setq gnus-offline-hangup-program program)
125             (setq gnus-offline-dialup-program program))
126             
127             ;; Set spool directory for outgoing messages.
128           (if use-miee
129               (progn
130                 ;; Setting for MIEE with nnspool.
131                 (let ((news-spool
132                        (read-from-minibuffer
133                         "News spool directory for sending: "
134                         "/usr/spool/news.out"))
135                       (mail-spool
136                        (read-from-minibuffer
137                         "Mail spool directory for sending: "
138                         "/usr/spool/mail.out")))
139                   (setq gnus-offline-mail-spool-directory mail-spool)
140                   (setq gnus-offline-news-spool-directory news-spool)
141                   (setq gnus-offline-drafts-queue-type 'miee)
142                   
143                   ;; Load MIEE.
144                   (load "miee")
145                   ;; Set news post function for MIEE.
146                   (setq message-send-news-function 'gnspool-request-post)
147                   ;; Spool directory setting - MIEE.
148                   (if (not (file-exists-p gnus-offline-mail-spool-directory))
149                       (make-directory gnus-offline-mail-spool-directory t))
150                   (setq sendmail-to-spool-directory
151                         gnus-offline-mail-spool-directory)
152                   (if (not (file-exists-p gnus-offline-news-spool-directory))
153                       (make-directory gnus-offline-news-spool-directory t))
154                   (setq news-spool-request-post-directory
155                         gnus-offline-news-spool-directory)))
156             
157             ;; Set drafts type gnus-agent.
158             (setq gnus-offline-drafts-queue-type 'agent))
159           
160           ;; Setting for gnus-agent.
161           (if (eq gnus-offline-news-fetch-method 'nnagent)
162               (let ((agent-directory
163                      (read-from-minibuffer "Agent directory: " "~/News/agent")))
164                 (setq gnus-agent-directory agent-directory)))
165             
166           ;; Determin MTA type.
167           (if (string-equal mta-type "smtp")
168               (setq gnus-offline-MTA-type 'smtp)
169             (setq gnus-offline-MTA-type 'sendmail)
170             )
171           ;;
172           ;; Set E-Mail Address and pop3 movemail type.
173           (setq i (string-to-int num-of-address))
174           (setq address nil)
175           (while (> i 0)
176             (setq address
177                   (append address
178                           (list
179                            (list
180                             (concat "po:"
181                                     (read-from-minibuffer
182                                      "Email address (user@mailhost): "))
183                             (completing-read
184                              "Authentification Method (TAB to completion): "
185                              '(("pass" 1) ("apop" 2)) nil t nil)))))
186             (setq i (- i 1)))
187           
188           ;; Replace "hoge" -> 'hoge
189           (mapcar
190            (lambda (x)
191              (if (string-equal (nth 1 x) "pass")
192                  (setcar (cdr x) 'pass)
193                (setcar (cdr x) 'apop)))
194            address)
195           (setq pop3-fma-spool-file-alist address)
196           
197           ;; Set movemail type.
198           (let ((movemail-type
199                  (completing-read
200                   "Select movemail type for retreave mail (TAB to completion): "
201                   '(("exe" 1) ("lisp" 2))
202                   nil t nil))
203                 )
204             (if (string-equal movemail-type "exe")
205                 (let ((options
206                        (read-from-minibuffer "movemail options: ")))
207                   (setq pop3-fma-movemail-arguments (split-string options "[\t ]+"))))
208             (if (string-equal movemail-type "exe")
209                 (setq pop3-fma-movemail-type 'exe)
210               (setq pop3-fma-movemail-type 'lisp))))
211         
212         ;; Write to setting file.
213         (setq tmp-buffer (get-buffer-create "* Setting"))
214         (set-buffer "* Setting")
215         (erase-buffer)
216         (insert ";;\n");
217         (insert ";; This file is created by gnus-ofsetup.el\n")
218         (insert ";; Creation date : ")
219         (insert (current-time-string))
220         (insert "\n")
221         (insert ";;\n")
222
223         ;; write Basic setting
224         (insert "(setq gnus-offline-news-fetch-method '")
225         (insert (prin1-to-string gnus-offline-news-fetch-method))
226         (insert ")\n")
227         (insert "(setq gnus-offline-mail-fetch-method '")
228         (insert (prin1-to-string gnus-offline-mail-fetch-method))
229         (insert ")\n")
230         (insert "(setq gnus-offline-use-miee ")
231         (insert (prin1-to-string gnus-offline-use-miee))
232         (insert ")\n")
233         (insert "(setq gnus-offline-dialup-program ")
234         (insert (prin1-to-string gnus-offline-dialup-program))
235         (insert ")\n")
236
237         ;; write dialup/hangup program and options.
238         (if (stringp gnus-offline-dialup-program)
239             (progn
240               (insert "(setq gnus-offline-dialup-program-arguments '")
241               (insert (prin1-to-string gnus-offline-dialup-program-arguments))
242               (insert ")\n")))
243         (insert "(setq gnus-offline-hangup-program ")
244         (insert (prin1-to-string gnus-offline-hangup-program))
245         (insert ")\n")
246         (if (stringp gnus-offline-hangup-program)
247             (progn
248               (insert "(setq gnus-offline-hangup-program-arguments '")
249               (insert (prin1-to-string gnus-offline-hangup-program-arguments))
250               (insert ")\n")))
251
252         ;; write setting about MIEE.
253         (if gnus-offline-use-miee
254             (progn
255               (insert "(setq gnus-offline-mail-spool-directory ")
256               (insert (prin1-to-string gnus-offline-mail-spool-directory))
257               (insert ")\n")
258               (insert "(setq gnus-offline-news-spool-directory ")
259               (insert (prin1-to-string gnus-offline-news-spool-directory))
260               (insert ")\n")
261               (insert "(setq sendmail-to-spool-directory gnus-offline-mail-spool-directory)\n")
262               (insert "(setq news-spool-request-post-directory gnus-offline-news-spool-directory)\n")
263               (insert "(load \"miee\")\n")
264               (insert "(setq message-send-news-function '")
265               (insert (prin1-to-string message-send-news-function))
266               (insert ")\n")))
267
268         ;; write setting about nnspool and gnus-agent.
269         (if (equal gnus-offline-news-fetch-method 'nnspool)
270             (insert "(message-offline-state)\n")
271           (insert "(setq gnus-agent-directory ")
272           (insert (prin1-to-string gnus-agent-directory))
273           (insert ")\n"))
274
275         ;; write setting about queue type -- MIEE or nnagent.
276         (insert "(setq gnus-offline-drafts-queue-type '")
277         (insert (prin1-to-string gnus-offline-drafts-queue-type))
278         (insert ")\n")
279         (insert "(setq gnus-offline-MTA-type '")
280         (insert (prin1-to-string gnus-offline-MTA-type))
281         (insert ")\n")
282
283         ;; Offline setting for gnus-nntp-*
284         (insert "(setq gnus-nntp-service nil)\n")
285         (insert "(setq gnus-nntp-server nil)\n")
286         (insert "(setq nnmail-spool-file nil)\n")
287
288         ;; Write setting about hooks.
289         (insert "(add-hook 'gnus-group-mode-hook 'gnus-offline-processed-by-timer t)\n")
290         (insert "(add-hook 'gnus-group-mode-hook 'gnus-offline-error-check t)\n")
291         (insert "(add-hook 'gnus-after-getting-new-news-hook 'gnus-offline-after-get-new-news)\n")
292         (insert "(add-hook 'gnus-after-getting-news-hook 'gnus-offline-after-get-new-news)\n")
293         (if (eq gnus-offline-news-fetch-method 'nnspool)
294             (insert "(add-hook 'after-getting-news-hook 'gnus-offline-nnspool-hangup-line)\n"))
295         (insert "(add-hook 'message-send-hook 'gnus-offline-message-add-header)\n")
296         (insert "(autoload 'gnus-offline-setup \"gnus-offline\")\n")
297         (insert "(add-hook 'gnus-load-hook 'gnus-offline-setup)\n")
298
299         ;; Write setting about pop3-fma.
300         (insert "(require 'pop3-fma)\n")
301         (insert "(add-hook 'message-send-hook 'pop3-fma-message-add-header)\n")
302         (insert "(setq pop3-fma-spool-file-alist '")
303         (insert (prin1-to-string pop3-fma-spool-file-alist))
304         (insert ")\n")
305         (insert "(setq pop3-fma-movemail-type '")
306         (insert (prin1-to-string pop3-fma-movemail-type))
307         (insert ")\n")
308         (if (eq pop3-fma-movemail-type 'exe)
309             (progn
310               (insert "(setq pop3-fma-movemail-arguments '")
311               (insert (prin1-to-string pop3-fma-movemail-arguments))
312               (insert ")\n")))
313         (write-region (point-min) (point-max) gnus-offline-setting-file)
314         (kill-buffer "* Setting"))
315     )
316   (load gnus-offline-setting-file))
317 ;; gnus-ofsetup.el Ends here.