* Makefile.in (install-package-ja): Compile and install lisp files first.
[elisp/gnus.git-] / lisp / gnus-ofsetup.el
1 ;;; gnus-ofsetup.el --- Setup advisor for Offline reading for Mail/News.
2
3 ;; Copyright (C) 1998 Tatsuya Ichikawa
4
5 ;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
6 ;;      Tsukamoto Tetsuo <czkmt@remus.dti.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
26 ;;; Commentary:
27
28 ;; How to use.
29 ;;
30 ;;      M-x load[RET]gnus-ofsetup
31 ;;      M-x gnus-setup-for-offline
32 ;;
33
34 ;;; Code:
35
36 (eval-when-compile (require 'cl))
37 (eval-when-compile (require 'gnus-clfns))
38
39 (require 'read-passwd)
40
41 (eval-and-compile
42   (defvar gnus-offline-lang
43     (cond ((and (featurep 'meadow)
44                 (string= current-language-environment "Japanese"))
45            "ja_complete")
46           ((and (boundp 'current-language-environment)
47                 (string= current-language-environment "Japanese"))
48            "ja")
49           (t
50            "en"))
51     "This variable decides which language will be used for display."))
52
53 (eval-when-compile
54   (require 'gnus)
55   (require 'gnus-offline))
56
57 (defvar gnus-offline-setting-file
58   (let ((user (user-login-name))
59         (real-user (user-real-login-name)))
60     (if (string= user real-user)
61         "~/.gnus-offline.el"
62       ;; Seems it is after "su".
63       (let ((file (concat "~" user "/.gnus-offline.el"))
64             (real-file (concat "~" real-user "/.gnus-offline.el")))
65         (cond ((file-exists-p real-file)
66                real-file)
67               ((file-exists-p file)
68                file)
69               (t
70                real-file))))))
71
72 (eval-when-compile
73   (defvar gnus-ofsetup-prepare-for-miee
74     '(;; Spool directory setting - MIEE.
75       (setq mail-spool (or mail-spool "/usr/spool/mail.out"))
76       (setq news-spool (or news-spool "/usr/spool/news.out"))
77       (condition-case nil
78           (progn
79             (if (not (file-exists-p mail-spool))
80                 (make-directory mail-spool t))
81             (if (not (file-exists-p news-spool))
82                 (make-directory news-spool t)))
83         (error
84          (error (gnus-ofsetup-gettext 'prepare-miee-1))))))
85
86   (defvar gnus-ofsetup-update-setting-file
87     '((save-excursion
88         (set-buffer (get-buffer-create "* Setting"))
89         (erase-buffer)
90         (insert ";;\n")
91         (insert ";; This file is created by gnus-ofsetup.el\n")
92         (insert ";; Creation date : " (current-time-string) "\n")
93         (insert ";;\n")
94
95         ;; write Basic setting
96         (insert "(setq gnus-offline-news-fetch-method '"
97                 (prin1-to-string news-method) ")\n")
98         (insert "(setq gnus-offline-mail-fetch-method '"
99                 (prin1-to-string mail-method) ")\n")
100
101         ;; write dialup/hangup program and options.
102         (insert "(setq gnus-offline-dialup-program "
103                 (prin1-to-string dialup-program) ")\n")
104         (if (stringp dialup-program)
105             (insert "(setq gnus-offline-dialup-program-arguments '"
106                     (prin1-to-string dialup-program-arguments) ")\n"))
107         (insert "(setq gnus-offline-hangup-program "
108                 (prin1-to-string hangup-program) ")\n")
109         (if (stringp hangup-program)
110             (insert "(setq gnus-offline-hangup-program-arguments '"
111                     (prin1-to-string hangup-program-arguments) ")\n"))
112
113         (if (integerp interval)
114             (insert "(setq gnus-offline-interval-time "
115                     (prin1-to-string interval) ")\n"))
116
117         ;; write setting about MIEE.
118         (when use-miee
119           (insert "(setq sendmail-to-spool-directory "
120                   (prin1-to-string mail-spool) ")\n")
121           (insert "(setq news-spool-request-post-directory "
122                   (prin1-to-string news-spool) ")\n")
123           (insert "(if (not (boundp 'miee-version))
124     (load \"miee\"))\n")
125           (insert "(setq message-send-news-function 'gnspool-request-post)\n"))
126
127         ;; write setting about nnspool and gnus-agent.
128         (if (eq news-method 'nnspool)
129             (insert "(message-offline-state)\n")
130           (insert "(setq gnus-agent-directory "
131                   (prin1-to-string agent-directory) ")\n"))
132
133         ;; write setting about queue type -- MIEE or nnagent.
134         (insert "(setq gnus-offline-drafts-queue-type '"
135                 (prin1-to-string drafts-queue-type) ")\n")
136         (insert "(setq gnus-offline-MTA-type '"
137                 (prin1-to-string MTA-type) ")\n")
138
139         ;; Write setting about hooks.
140         (when (eq news-method 'nnspool)
141           (insert (format "%s %s %s\n"
142                           "(add-hook"
143                           "'after-getting-news-hook"
144                           "'gnus-offline-nnspool-hangup-line)"))
145           (insert (format "%s %s %s\n"
146                           "(add-hook"
147                           "'gnus-before-startup-hook"
148                           "(lambda () (setq nnmail-spool-file nil)
149            (setq mail-sources nil)))")))
150
151         ;; Write stting about mail-source.el
152         (insert "(setq gnus-offline-mail-source '"
153                 (prin1-to-string mail-source) ")\n")
154         (insert "(setq mail-sources gnus-offline-mail-source)\n")
155         (if save-passwd
156             (insert "(add-hook 'gnus-setup-news-hook
157           (lambda ()
158             (add-to-list 'gnus-variable-list 'mail-source-password-cache)))\n"))
159
160         ;;
161         (write-region (point-min) (point-max) gnus-offline-setting-file))
162       (kill-buffer "* Setting")))
163
164   (defmacro gnus-ofsetup-prepare (list)
165     (let ((forms (symbol-value list)))
166       `(progn ,@forms))))
167
168 (defvar gnus-ofsetup-resource-en
169   '((prepare-miee-1
170      . "Making directories failed. Set mail/news spool directories properly.")
171     (completing-read-symbol-1 . " (TAB to completion): ")
172     (setup-1 . "Method for offline News reading")
173     (setup-2 . "Agent directory: ")
174     (setup-3 . "Dialup program (give a null string if you do not use): ")
175     (setup-4 . "Dialup program options: ")
176     (setup-5 . "Hangup program (give a null string if you do not use): ")
177     (setup-6 . "Hangup program options: ")
178     (setup-7 . "Select MTA type for sending mail")
179     (setup-8 . "Use MIEE post/send message ")
180     (setup-9 . "News spool directory for sending: ")
181     (setup-10 . "Mail spool directory for sending: ")
182     (setup-11 . "How many mail sources will get mails from? : ")
183     (setup-12 . "What type of the mail source? ")
184     (setup-13 . "Mail Account name : ")
185     (setup-14 . "Mail server : ")
186     (setup-15 . "Authentification Method ")
187     (setup-16 . "Do you use pop3.el to fetch mail? ")
188     (setup-17 . "movemail program name: ")
189     (setup-18 . "movemail options: ")
190     (setup-19 . "What network stream? ")
191     (setup-20 . "File: ")
192     (setup-21 . "Directory: ")
193     (setup-22 . "Do you save password information to newsrc file? ")
194
195     (param-news-method-1 . "News Method")
196     (param-news-method-2 . "Gnus Agent")
197     (param-news-method-3 . "nnspool")
198     (param-news-method-4 . "\
199 Method to fetch news articles.")
200     (param-dialup-program-1 . "Dialup Program")
201     (param-dialup-program-2 . "Use program..")
202     (param-dialup-program-3 . "Don't use a program.")
203     (param-dialup-program-4 . "\
204 Program which does dial.")
205     (param-dialup-program-arg-1 . "Dialup Program Arguments")
206     (param-dialup-program-arg-2 . "Argument")
207     (param-dialup-program-arg-3 . "\
208 Program arguments of gnus-offline-dialup-program.")
209     (param-hangup-program-1 . "Hangup Program")
210     (param-hangup-program-2 . "Use program..")
211     (param-hangup-program-3 . "Don't use a program.")
212     (param-hangup-program-4 . "\
213 Program which does hangup.")
214     (param-hangup-program-arg-1 . "Hangup Program Arguments")
215     (param-hangup-program-arg-2 . "Argument")
216     (param-hangup-program-arg-3 . "\
217 Program arguments of gnus-offline-hangup-program.")
218     (param-interval-1 . "Interval between Jobs")
219     (param-interval-2 . "\
220 Interval time(minutes) to do online jobs.
221 If set to 0 , timer call is disabled.")
222     (param-drafts-queue-type-1 . "Drafts Queue Type")
223     (param-drafts-queue-type-2 . "Gnus Draft for queuing.")
224     (param-drafts-queue-type-3 . "I prefer MIEE for queuing.")
225     (param-drafts-queue-type-4 . "\
226 Type of queue used for draft messages.
227
228 If the select method for news is nnspool, you must choose MIEE.
229 MIEE is another library for offline messaging. It isn't part of
230 Semi-gnus. If you want to know about MIEE, see README-offline.{en,ja}.")
231     (param-mail-spool-1 . "Mail Spool Directory for MIEE")
232     (param-news-spool-1 . "News Spool Directory for MIEE")
233     (param-MTA-type-1 . "MTA Type")
234     (param-MTA-type-2 . "Use smtp.el")
235     (param-MTA-type-3 . "Use sendmail")
236     (param-MTA-type-4 . "\
237 Type of MTA used for sending mail.")
238     (param-save-passwd-1 . "Save Password in Startup File")
239     (param-save-passwd-2 . "OK, I'm sure it's safe.")
240     (param-save-passwd-3 . "No way, it's too dangerous!")
241     (param-save-passwd-4 . "\
242 Whether you want your POP passwords written in .newsrc.eld or not.")
243     (param-mail-source-1 . "Mail Sources")
244     (param-mail-source-2 . "\
245 Information of mail sources. Actually, a list of `Mail Source Specifiers'.
246
247 The format of this variable is just the same as `mail-sources' (or
248 `nnmail-spool-file' which seems obsolete).
249
250 `Mail Source Specifiers' can take a lot of keywords. For example,
251 if you want to use movemail instead of pop3.el which comes with
252 Gnus, you can set a specifier using the kerword :program as shown
253 below:
254
255           (pop :program \"movemail -pf po:%u %t %p\")
256
257 If you want to know more about mail source specifiers and keywords,
258 click the button below.")
259     (customize-1 . "Customize the Gnus Offline Parameters, and press ")
260     (customize-2 . "done")
261     (customize-3 . "Push me when done customizing.")
262     (customize-4 . "Parameters")
263     (customize-5 . "\
264 These parameters will be saved in ~/.gnus-offline.el.
265
266 Note: Touching these parameters may require Gnus or even Emacs to be
267 restarted.")
268     (customize-6 . "Push me to learn more.")
269     (customize-done-1 . "(No changes need to be saved)")
270     (customize-done-2
271      . "Invalid parameters. Check the news method and drafts queue type.")))
272
273 (defvar gnus-ofsetup-resource-ja
274   '((prepare-miee-1
275      . "\e$B%G%#%l%/%H%j$,:n$l$^$;$s!#%9%W!<%k$N@_Dj$r@5$7$/$7$F$/$@$5$$!#\e(B")
276     (completing-read-symbol-1 . "(TAB \e$B$GJd40$7$^$9\e(B): ")
277     (setup-1 . "\e$B%*%U%i%$%s$G%K%e!<%9$rFI$`J}K!$rA*$s$G$/$@$5$$\e(B ")
278     (setup-2 . "Gnus Agent \e$B$N%G%#%l%/%H%j\e(B: ")
279     (setup-3
280      . "\e$B%@%$%d%k@\B3%W%m%0%i%`L>\e(B (\e$B;H$o$J$$>l9g$O6uJ8;zNs$rJV$7$F2<$5$$\e(B): ")
281     (setup-4 . "\e$B%@%$%d%k@\B3%W%m%0%i%`$N0z?t\e(B: ")
282     (setup-5
283      . "\e$B%@%$%d%k@ZCG%W%m%0%i%`L>\e(B (\e$B;H$o$J$$>l9g$O6uJ8;zNs$rJV$7$F2<$5$$\e(B): ")
284     (setup-6 . "\e$B%@%$%d%k@ZCG%W%m%0%i%`$N0z?t\e(B: ")
285     (setup-7 . "\e$B%a!<%kAw?.$K;H$&\e(B MTA \e$B$rA*$s$G2<$5$$\e(B ")
286     (setup-8 . "\e$B%a%C%;!<%8$NAw?.$K\e(B MIEE \e$B$r;H$$$^$9$+\e(B? ")
287     (setup-9 . "\e$B%K%e!<%9$N%9%W!<%k%G%#%l%/%H%j\e(B: ")
288     (setup-10 . "\e$B%a!<%k$N%9%W!<%k%G%#%l%/%H%j\e(B: ")
289     (setup-11 . "\e$B@_Dj$9$k%a!<%k<hF@@h$N?t$O\e(B? (\e$B8e$GDI2C$G$-$^$9\e(B): ")
290     (setup-12 . "\e$B%a!<%k<hF@@h$N%?%$%W$O\e(B? ")
291     (setup-13 . "\e$B%a!<%k$N%"%+%&%s%HL>\e(B: ")
292     (setup-14 . "\e$B$=$N%"%+%&%s%H$N$"$k%a!<%k%5!<%PL>\e(B: ")
293     (setup-15 . "\e$BG'>ZJ}<0$O\e(B? ")
294     (setup-16 . "\e$B%a!<%k$N<u?.$K$O\e(B pop3.el \e$B$r;H$$$^$9$+\e(B? ")
295     (setup-17 . "movemail \e$B%W%m%0%i%`$NL>A0\e(B: ")
296     (setup-18 . "movemail \e$B%W%m%0%i%`$KEO$90z?t\e(B: ")
297     (setup-19 . "\e$B@\B3J}<0$O\e(B? ")
298     (setup-20 . "\e$B%U%!%$%k\e(B: ")
299     (setup-21 . "\e$B%G%#%l%/%H%j\e(B: ")
300     (setup-22 . "newsrc \e$B%U%!%$%k$K\e(B POP \e$B%Q%9%o!<%I$rJ]B8$7$^$9$+\e(B? ")
301
302     (param-news-method-4 . "\
303 \e$B%K%e!<%95-;v$r<hF@$9$kJ}K!$G$9!#\e(B")
304     (param-dialup-program-4 . "\
305 \e$B<+F0%@%$%d%k@\B3$K;H$&%W%m%0%i%`!#\e(B")
306     (param-dialup-program-arg-3 . "\
307 \e$B%@%$%d%k@\B3%W%m%0%i%`$KEO$90z?t!#\e(B")
308     (param-hangup-program-4 . "\
309 \e$B<+F0%@%$%d%k@ZCG$K;H$&%W%m%0%i%`!#\e(B")
310     (param-hangup-program-arg-3 . "\
311 \e$B%@%$%d%k@ZCG%W%m%0%i%`$KEO$90z?t!#\e(B")
312     (param-interval-2 . "\
313 \e$BAw<u?.%8%g%V$r9T$&4V3V!#J,C10L$G;XDj$7$^$9!#\e(B
314
315 \e$B$3$l$r\e(B 0 \e$B$K@_Dj$9$k$H<+F0Aw<u?.5!G=$O%*%U$K$J$j$^$9!#\e(B")
316     (param-drafts-queue-type-4 . "\
317 \e$B%I%i%U%H5-;v$rJ]B8$9$k%-%e!<$N<oN`$r;XDj$7$^$9!#\e(B
318
319 \e$B%K%e!<%9$N9VFI<jCJ$,\e(B nnspool \e$B$N>l9g!"\e(BMIEE \e$B$r;XDj$9$kI,MW$,$"$j$^$9!#\e(B
320 MIEE \e$B$O%*%U%i%$%s$G$N%a!<%k\e(B/\e$B%K%e!<%9Aw?.5!G=$rDs6!$9$k%i%$%V%i%j$G$9$,!"\e(B
321 Semi-gnus \e$B$K$OIUB0$7$F$$$^$;$s!#\e(BMIEE \e$B$K$D$$$FCN$j$?$$>l9g$O\e(B
322 README-offline.{en,ja} \e$B$r;2>H$7$F$/$@$5$$!#\e(B")
323     (param-MTA-type-4 . "\
324 MTA \e$B$O%a!<%k$NAw?.$r<u$1;}$D%W%m%0%i%`$G$9!#$=$N<oN`$r;XDj$7$^$9!#\e(B")
325     (param-save-passwd-4 . "\
326 POP \e$B%Q%9%o!<%I$r\e(B .newsrc.eld \e$B$KJ]B8$9$k$+H]$+$r;XDj$7$^$9!#\e(B")
327     (param-mail-source-2 . "\
328 \e$B%a!<%k<hF@@h$d<hF@J}K!$r;XDj$7$^$9!#\e(B
329
330 \e$B$3$N%*%W%7%g%s$N=q<0$O\e(B `mail-sources' \e$B$H$$$&JQ?t$HF1$8$G$"$j!"\e(B
331 `mail source specifier' \e$B$H8F$P$l$k$b$N$N%j%9%H$H$7$F5-=R$7$^$9!#\e(B
332
333 \e$B3F!9$N\e(B `mail source specifier' \e$B$K$O?'!9$J%-!<%o!<%I$r;XDj$9$k$3$H$,\e(B
334 \e$B$G$-$^$9!#Nc$($P%a!<%k$N<hF@$K$O\e(B pop3.el \e$B$NBe$o$j$K30It%W%m%0%i%`\e(B
335 (movemail \e$B$J$I\e(B) \e$B$r;H$$$?$$!"$H$$$&>l9g$K$O!"\e(B:program \e$B$r$$$&%-!<%o!<\e(B
336 \e$B%I$r;XDj$7$F0J2<$NMM$K5-=R$7$^$9!#\e(B
337
338         (pop :program \"movemail -pf po:%u %t %p\")
339
340 mail source specifier \e$B$H$+>e5-$N$h$&$J%-!<%o!<%I$K$D$$$F$b$C$H$h$/\e(B
341 \e$BCN$j$?$$>l9g$O!"0J2<$N%\%?%s$r%/%j%C%/$7$F$/$@$5$$!#\e(B(Info \e$B$N3:Ev2U=j\e(B
342 \e$B$X$N%j%s%/$K$J$C$F$$$^$9!#\e(B)" )
343
344      (customize-1
345       . "Gnus Offline \e$B$N%Q%i%a!<%?!#=*$o$C$?$i1&$N%\%?%s$r2!$7$F$/$@$5$$!#\e(B")
346      (customize-2 . "done")
347      (customize-3 . "\e$B@_Dj$7=*$o$C$?$i%\%/$r2!$7$F$M!#\e(B")
348      (customize-4 . "\e$B%Q%i%a!<%?\e(B")
349      (customize-5 . "\
350 \e$B$3$l$i$N%Q%i%a!<%?$O\e(B ~/.gnus-offline.el \e$B$KJ]B8$5$l$^$9!#\e(B
351
352 \e$BCm0U\e(B: \e$B$3$l$i$N%Q%i%a!<%?$NJQ99$O>l9g$K$h$C$F$O\e(B Gnus (\e$B$5$i$K>l9g$K\e(B
353 \e$B$h$C$F$O\e(B Emacs) \e$B$N:F5/F0$rI,MW$H$9$k$3$H$,$"$j$^$9!#\e(B")
354      (customize-6 . "\e$B$b$C$HCN$j$?$$>l9g$O%\%/$r2!$7$F$M!#\e(B")
355      (customize-done-1 . "(\e$BJ]B8$9$Y$-JQ99$O$"$j$^$;$s\e(B)")
356      (customize-done-2
357       . "\e$B%K%e!<%99VFI<jCJ$H%I%i%U%H5-;v<h$j07$$<jCJ$N@_Dj$r8+D>$7$F$/$@$5$$!#\e(B")
358   ))
359
360 (defvar gnus-ofsetup-resource-ja_complete
361   (append
362    gnus-ofsetup-resource-ja
363    '((param-news-method-1 . "\e$B%K%e!<%99VFIJ}K!\e(B")
364      (param-news-method-2 . "Gnus Agent")
365      (param-news-method-3 . "nnspool")
366      (param-dialup-program-1 . "\e$B%@%$%d%k@\B3%W%m%0%i%`\e(B")
367      (param-dialup-program-2 . "\e$B%W%m%0%i%`$r;H$&\e(B..")
368      (param-dialup-program-3 . "\e$B%W%m%0%i%`$O;XDj$7$J$$\e(B")
369      (param-dialup-program-arg-1 . "\e$B%@%$%d%k@\B3%W%m%0%i%`$N0z?t\e(B")
370      (param-dialup-program-arg-2 . "\e$B0z?t\e(B")
371      (param-hangup-program-1 . "\e$B%@%$%d%k@ZCG%W%m%0%i%`\e(B")
372      (param-hangup-program-2 . "\e$B%W%m%0%i%`$r;H$&\e(B..")
373      (param-hangup-program-3 . "\e$B%W%m%0%i%`$O;XDj$7$J$$\e(B")
374      (param-hangup-program-arg-1 . "\e$B%@%$%d%k@ZCG%W%m%0%i%`$N0z?t\e(B")
375      (param-hangup-program-arg-2 . "\e$B0z?t\e(B")
376      (param-interval-1 . "\e$B<+F0Aw<u?.%8%g%V$N4V3V\e(B")
377      (param-drafts-queue-type-1 . "\e$B%I%i%U%H5-;v$rJ]B8$9$k%-%e!<$N<oN`\e(B")
378      (param-drafts-queue-type-2 . "Gnus Draft \e$B$N5!G=$rMxMQ$9$k\e(B")
379      (param-drafts-queue-type-3 . "MIEE \e$B$N5!G=$rMxMQ$9$k\e(B")
380      (param-mail-spool-1 . "MIEE \e$B$,;H$&%a!<%k$N%9%W!<%k%G%#%l%/%H%j\e(B")
381      (param-news-spool-1 . "MIEE \e$B$,;H$&%K%e!<%9$N%9%W!<%k%G%#%l%/%H%j\e(B")
382      (param-MTA-type-1 . "MTA \e$B$N<oN`\e(B")
383      (param-MTA-type-2 . "smtp.el \e$B$r;H$&\e(B")
384      (param-MTA-type-3 . "sendmail \e$B$r;H$&\e(B")
385      (param-save-passwd-1
386       . "\e$B%U%!%$%k$K\e(B POP \e$B%Q%9%o!<%I$rJ]B8$9$k\e(B")
387      (param-save-passwd-2 . "\e$B0BA4$J$N$GJ]B8$9$k\e(B")
388      (param-save-passwd-3 . "\e$B4m81$@$+$i$d$a$H$/\e(B")
389      (param-mail-source-1 . "\e$B%a!<%k<hF@@h$N>pJs\e(B"))))
390
391 (defsubst gnus-ofsetup-gettext (symbol &optional lang)
392   (setq lang (or lang gnus-offline-lang))
393   (or
394    (cdr (assq symbol (symbol-value
395                       (intern (format "gnus-ofsetup-resource-%s" lang)))))
396    (cdr (assq symbol gnus-ofsetup-resource-en))))
397
398 (defun gnus-ofsetup-completing-read-symbol (msg &rest syms)
399   (intern
400    (completing-read (concat
401                      msg
402                      (gnus-ofsetup-gettext 'completing-read-symbol-1))
403                     (mapcar
404                      #'(lambda (sym)
405                          (list (symbol-name sym)))
406                      syms)
407                     nil t nil)))
408
409 (defun gnus-setup-for-offline (&optional force)
410   "*Set up Gnus for offline environment."
411   (interactive "P")
412   (unless (and (file-exists-p gnus-offline-setting-file) (not force))
413     (let (news-method
414           mail-method agent-directory drafts-queue-type news-spool mail-spool
415           use-miee MTA-type dialup-program dialup-program-arguments
416           hangup-program hangup-program-arguments interval
417           num-of-address i n mail-source save-passwd)
418       (setq news-method
419             (gnus-ofsetup-completing-read-symbol
420              (gnus-ofsetup-gettext 'setup-1)
421              'nnagent 'nnspool))
422       ;; Setting for gnus-agent.
423       (if (eq news-method 'nnagent)
424           (setq agent-directory
425                 (read-from-minibuffer
426                  (gnus-ofsetup-gettext 'setup-2) "~/News/agent")))
427       (setq mail-method 'nnmail)
428       (setq dialup-program
429             (read-file-name
430              (gnus-ofsetup-gettext 'setup-3)
431              nil nil t))
432       (if (string-match "^[ \t]*$" dialup-program)
433           (setq dialup-program nil)
434         (setq dialup-program-arguments
435               (delete "" (split-string
436                           (read-from-minibuffer
437                            (gnus-ofsetup-gettext 'setup-4))
438                           "[\t ]+"))))
439       (setq hangup-program
440             (read-file-name
441              (gnus-ofsetup-gettext 'setup-5)
442              nil nil t))
443       (if (string-match "^[ \t]*$" hangup-program)
444           (setq hangup-program nil)
445         (setq hangup-program-arguments
446               (delete "" (split-string
447                           (read-from-minibuffer
448                            (gnus-ofsetup-gettext 'setup-6))
449                           "[\t ]+"))))
450       (setq MTA-type (gnus-ofsetup-completing-read-symbol
451                       (gnus-ofsetup-gettext 'setup-7)
452                       'smtp 'sendmail))
453       (if (eq news-method 'nnspool)
454           (setq use-miee t)
455         (setq use-miee (y-or-n-p (gnus-ofsetup-gettext 'setup-8))))
456       (if use-miee
457           (progn
458             ;; Setting for MIEE.
459             (setq news-spool
460                   (read-from-minibuffer
461                    (gnus-ofsetup-gettext 'setup-9)
462                    "/usr/spool/news.out"))
463             (setq mail-spool
464                   (read-from-minibuffer
465                    (gnus-ofsetup-gettext 'setup-10)
466                    "/usr/spool/mail.out"))
467             (setq drafts-queue-type 'miee)
468             (gnus-ofsetup-prepare gnus-ofsetup-prepare-for-miee))
469         ;; Set drafts type gnus-agent.
470         (setq drafts-queue-type 'agent))
471       ;; Create a list of mail source specifiers.
472       (setq num-of-address
473             (read-from-minibuffer (gnus-ofsetup-gettext 'setup-11)))
474       (setq i (setq n (string-to-int num-of-address)))
475       ;;
476       (while (> i 0)
477         (let* ((j (- n (1- i)))
478                (type (gnus-ofsetup-completing-read-symbol
479                       (format "<%d of %d> %s" j n
480                               (gnus-ofsetup-gettext 'setup-12))
481                       'pop 'imap 'file 'directory 'maildir))
482                user server authentication stream islisp source
483                prog args program path)
484           ;; Prepare.
485           (when (or (string= type "pop") (string= type "imap"))
486             (setq user (read-from-minibuffer
487                         (format "<%d of %d> %s" j n
488                                 (gnus-ofsetup-gettext 'setup-13))))
489             (setq server (read-from-minibuffer
490                           (format "<%d of %d> %s" j n
491                                   (gnus-ofsetup-gettext 'setup-14)))))
492           (when (string= type "pop")
493             (setq authentication (gnus-ofsetup-completing-read-symbol
494                                   (format "<%d of %d> %s" j n
495                                           (gnus-ofsetup-gettext 'setup-15))
496                                   'password 'apop))
497             (setq islisp (y-or-n-p
498                           (format "<%d of %d> %s" j n
499                                   (gnus-ofsetup-gettext 'setup-16))))
500             (unless islisp
501               (setq prog (read-file-name
502                           (format "<%d of %d> %s" j n
503                                   (gnus-ofsetup-gettext 'setup-17))
504                           exec-directory "movemail"))
505               (setq args (read-from-minibuffer
506                           (format "<%d of %d> %s" j n
507                                   (gnus-ofsetup-gettext 'setup-18) "-pf")))
508               (setq program (format "%s %s %s %s %s"
509                                     prog args "po:%u" "%t" "%p"))))
510           (when (string= type "imap")
511             (setq stream (gnus-ofsetup-completing-read-symbol
512                           (format "<%d of %d> %s" j n
513                                   (gnus-ofsetup-gettext 'setup-19))
514                           'kerberos4 'starttls 'ssl 'network))
515             (setq authentication (gnus-ofsetup-completing-read-symbol
516                                   (format "<%d of %d> %s" j n
517                                           (gnus-ofsetup-gettext 'setup-14))
518                                   'kerberos4 'digest-md5 'cram-md5 'login
519                                   'anonymous)))
520           (when (string= type "file")
521             (setq path (read-file-name
522                         (format "<%d of %d> %s" j n
523                                 (gnus-ofsetup-gettext 'setup-20)))))
524           (when (or (string= type "directory") (string= type "maildir"))
525             (setq path (read-file-name
526                         (format "<%d of %d> %s" j n
527                                 (gnus-ofsetup-gettext 'setup-21)))))
528           ;; Now set a mail source specifier.
529           (setq source `(,type))
530           (mapc
531            #'(lambda (sym)
532                (when (symbol-value sym)
533                  (setq source
534                        (nconc source
535                               (list
536                                (make-symbol
537                                 (format ":%s" sym))
538                                (symbol-value sym))))))
539            '(path user server authentication stream program))
540           (setq mail-source (nconc mail-source (list source))))
541         (setq i (1- i)))
542       (setq save-passwd
543             (y-or-n-p (gnus-ofsetup-gettext 'setup-22)))
544       ;;
545       (gnus-ofsetup-prepare gnus-ofsetup-update-setting-file)))
546   (load gnus-offline-setting-file))
547
548
549 ;; Suppport for customizing gnus-ofsetup parameters.
550
551 (defvar sendmail-to-spool-directory)
552 (defvar news-spool-request-post-directory)
553
554 (defun gnus-ofsetup-find-parameters ()
555   "Return the each current value of gnus-offline parameters."
556   `((news-method
557      (choice :tag ,(gnus-ofsetup-gettext 'param-news-method-1)
558              :value ,gnus-offline-news-fetch-method
559              (const :tag ,(gnus-ofsetup-gettext 'param-news-method-2)
560                     nnagent)
561              (const :tag ,(gnus-ofsetup-gettext 'param-news-method-3)
562                     nnspool))
563      ,(gnus-ofsetup-gettext 'param-news-method-4))
564
565     (dialup-program
566      (choice :tag ,(gnus-ofsetup-gettext 'param-dialup-program-1)
567              :value ,gnus-offline-dialup-program
568              (string :tag ,(gnus-ofsetup-gettext 'param-dialup-program-2))
569              (const :tag ,(gnus-ofsetup-gettext
570                            'param-dialup-program-3) nil))
571      ,(gnus-ofsetup-gettext 'param-dialup-program-4))
572
573     (dialup-program-arguments
574      (repeat :tag ,(gnus-ofsetup-gettext 'param-dialup-program-arg-1)
575              :value ,gnus-offline-dialup-program-arguments
576              (string :tag ,(gnus-ofsetup-gettext
577                             'param-dialup-program-arg-2)))
578      ,(gnus-ofsetup-gettext 'param-dialup-program-arg-3))
579
580     (hangup-program
581      (choice :tag ,(gnus-ofsetup-gettext 'param-hangup-program-1)
582              :value ,gnus-offline-hangup-program
583              (string :tag ,(gnus-ofsetup-gettext 'param-hangup-program-2))
584              (const :tag ,(gnus-ofsetup-gettext 'param-hangup-program-3)
585                     nil))
586      ,(gnus-ofsetup-gettext 'param-hangup-program-4))
587
588     (hangup-program-arguments
589      (repeat :tag ,(gnus-ofsetup-gettext 'param-hangup-program-arg-1)
590              :value ,gnus-offline-hangup-program-arguments
591              (string :tag ,(gnus-ofsetup-gettext
592                             'param-hangup-program-arg-2)))
593      ,(gnus-ofsetup-gettext 'param-hangup-program-arg-3))
594
595     (interval
596      (integer :tag ,(gnus-ofsetup-gettext 'param-interval-1)
597               :value ,gnus-offline-interval-time)
598      ,(gnus-ofsetup-gettext 'param-interval-2))
599
600     (drafts-queue-type
601      (choice :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-1)
602              :value ,gnus-offline-drafts-queue-type
603              (const :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-2)
604                     agent)
605              (const :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-3)
606                     miee))
607      ,(gnus-ofsetup-gettext 'param-drafts-queue-type-4))
608
609     (mail-spool
610      (directory :tag ,(gnus-ofsetup-gettext 'param-mail-spool-1)
611                 :value ,(cond ((and (boundp 'sendmail-to-spool-directory)
612                                     sendmail-to-spool-directory)
613                                sendmail-to-spool-directory)
614                               (t
615                                "/usr/spool/mail.out"))))
616
617     (news-spool
618      (directory :tag ,(gnus-ofsetup-gettext 'param-news-spool-1)
619                 :value ,(cond ((and (boundp 'news-spool-request-post-directory)
620                                     news-spool-request-post-directory)
621                                news-spool-request-post-directory)
622                               (t
623                                "/usr/spool/news.out"))))
624
625     (MTA-type
626      (choice :tag ,(gnus-ofsetup-gettext 'param-MTA-type-1)
627              :value ,gnus-offline-MTA-type
628              (const :tag ,(gnus-ofsetup-gettext 'param-MTA-type-2) smtp)
629              (const :tag ,(gnus-ofsetup-gettext 'param-MTA-type-3)
630                     sendmail))
631      ,(gnus-ofsetup-gettext 'param-MTA-type-4))
632
633     (save-passwd
634      (choice :tag ,(gnus-ofsetup-gettext 'param-save-passwd-1)
635              :value ,(if (memq 'mail-source-password-cache gnus-variable-list)
636                          t
637                          nil)
638              (const :tag ,(gnus-ofsetup-gettext 'param-save-passwd-2) t)
639              (const :tag ,(gnus-ofsetup-gettext 'param-save-passwd-3) nil))
640      ,(gnus-ofsetup-gettext 'param-save-passwd-4))
641
642     (mail-source
643      (sexp :tag ,(gnus-ofsetup-gettext 'param-mail-source-1)
644            :value ,gnus-offline-mail-source)
645      ,(gnus-ofsetup-gettext 'param-mail-source-2))))
646
647 (defvar gnus-ofsetup-params)
648
649 (defun gnus-ofsetup-customize ()
650   "Edit the gnus-offline parameters."
651   (interactive)
652   (let* ((params (gnus-ofsetup-find-parameters))
653          (types (mapcar #'(lambda (entry)
654                             `(cons :format "%v%h\n"
655                                    :doc ,(nth 2 entry)
656                                    (const :format "" ,(nth 0 entry))
657                                    ,(nth 1 entry)))
658                         params)))
659   (kill-buffer (gnus-get-buffer-create "*Gnus Offline Customize*"))
660   (switch-to-buffer (gnus-get-buffer-create "*Gnus Offline Customize*"))
661   (gnus-custom-mode)
662   (widget-insert (gnus-ofsetup-gettext 'customize-1))
663   (widget-create 'push-button
664                    :tag (gnus-ofsetup-gettext 'customize-2)
665                    :help-echo (gnus-ofsetup-gettext 'customize-3)
666                    :action 'gnus-ofsetup-customize-done)
667   (widget-insert "\n\n")
668   (make-local-variable 'gnus-ofsetup-params)
669   (setq gnus-ofsetup-params
670         (widget-create 'group
671                        `(set :inline t
672                              :greedy t
673                              :tag ,(gnus-ofsetup-gettext 'customize-4)
674                              :format "%t:\n%h%v"
675                              :doc ,(gnus-ofsetup-gettext 'customize-5)
676                              ,@types)))
677
678   (widget-create 'info-link
679                  :help-echo (gnus-ofsetup-gettext 'customize-6)
680                  :tag "<Info> mail sources"
681                  (if (string-match "^ja" gnus-offline-lang)
682                      "(gnus-ja)Mail Sources"
683                    "(gnus)Mail Sources"))
684
685   (use-local-map widget-keymap)
686   (local-set-key "q" 'bury-buffer)
687   (widget-setup)
688   (goto-char (point-min))))
689
690 (defun gnus-ofsetup-customize-done (&rest ignore)
691   "Apply changes and bury the buffer."
692   (interactive)
693   (let ((params (widget-value gnus-ofsetup-params))
694         (news-method gnus-offline-news-fetch-method)
695         (mail-method gnus-offline-mail-fetch-method)
696         (agent-directory gnus-agent-directory)
697         (dialup-program gnus-offline-dialup-program)
698         (dialup-program-arguments gnus-offline-dialup-program-arguments)
699         (hangup-program gnus-offline-hangup-program)
700         (hangup-program-arguments gnus-offline-hangup-program-arguments)
701         (drafts-queue-type gnus-offline-drafts-queue-type)
702         (interval gnus-offline-interval-time)
703         (use-miee (and (boundp 'miee-version)
704                        (or (eq gnus-offline-news-fetch-method 'nnspool)
705                            (eq gnus-offline-drafts-queue-type 'miee))))
706         (mail-spool (or (and (boundp 'sendmail-to-spool-directory)
707                              sendmail-to-spool-directory)
708                         "/usr/spool/mail.out"))
709         (news-spool (or (and (boundp 'news-spool-request-post-directory)
710                              news-spool-request-post-directory)
711                         "/usr/spool/news.out"))
712         (MTA-type gnus-offline-MTA-type)
713         (mail-source gnus-offline-mail-source)
714         (save-passwd (and (memq 'mail-source-password-cache gnus-variable-list)
715                           t)))
716     (if (null params)
717         (gnus-message 4 (gnus-ofsetup-gettext 'customize-done-1))
718       (mapc #'(lambda (el)
719                 (let ((sym (car el))
720                       (val (cdr el)))
721                   (set sym val)
722                   (cond ((eq sym 'news-method)
723                          (if (eq val 'nnspool)
724                              (setq use-miee t)))
725                         ((eq sym 'drafts-queue-type)
726                          (setq use-miee
727                                (if (eq val 'miee) t nil)))
728                         ((eq sym 'save-passwd)
729                          (if val
730                              (add-to-list 'gnus-variable-list
731                                           'mail-source-password-cache)
732                            (setq gnus-variable-list
733                                  (delq 'mail-source-password-cache
734                                        gnus-variable-list)))))))
735             params)
736       (if (and (eq news-method 'nnspool)
737                (not (eq drafts-queue-type 'miee)))
738           (error (gnus-ofsetup-gettext 'customize-done-2)))
739       (if use-miee
740           (gnus-ofsetup-prepare gnus-ofsetup-prepare-for-miee))
741       (gnus-ofsetup-prepare gnus-ofsetup-update-setting-file)
742       (load gnus-offline-setting-file)))
743   (bury-buffer)
744   (switch-to-buffer gnus-group-buffer))
745
746
747 ;;; Code for making Gnus and Gnus Offline cooperate with each other.
748
749 ;; Advice.
750 (defadvice gnus (around gnus-ofsetup-advice activate preactivate)
751   "Setup offline environment when Gnus is invoked."
752   (require 'gnus-offline) ad-do-it (gnus-offline-setup))
753
754 ;; Miscellaneous settings.
755
756 (setq gnus-nntp-service nil)
757 (setq gnus-nntp-server nil)
758 (eval-after-load "gnus-start"
759   '(add-hook 'gnus-after-getting-new-news-hook 'gnus-offline-after-get-new-news))
760 (eval-after-load "message"
761   '(add-hook 'message-send-hook 'gnus-offline-message-add-header))
762 (setq mail-source-read-passwd 'read-pw-read-passwd)
763 (add-hook 'gnus-setup-news-hook 'read-pw-set-mail-source-passwd-cache)
764
765 (provide 'gnus-ofsetup)
766
767 ;;; gnus-ofsetup.el ends here