* README-offline.ja: New file - Variable and command description
[elisp/gnus.git-] / lisp / gnus-offline.el
index 280a870..83992f0 100644 (file)
@@ -1,13 +1,14 @@
 ;;; gnus-offline.el --- To process mail & news at offline environment.
-;;; $Id: gnus-offline.el,v 1.1.2.5.2.5 1998-11-09 14:44:06 ichikawa Exp $
+;;; $Id: gnus-offline.el,v 1.1.2.5.2.26 1999-01-25 07:09:51 ichikawa Exp $
 
 ;;; Copyright (C) 1998 Tatsuya Ichikawa
 ;;;                    Yukihiro Ito
 ;;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
 ;;;         Yukihiro Ito <ito@rs.civil.tohoku.ac.jp>
 ;;;         Hidekazu Nakamura <u90121@uis-inf.co.jp>
+;;;         Tsukamoto Tetsuo <czkmt@remus.dti.ne.jp>
 
-;;; Version: 2.00b1
+;;; Version: 2.02
 ;;; Keywords: news , mail , offline , gnus
 ;;;
 ;;; SPECIAL THANKS
 ;;;    (gnus-setup-for-offline)
 ;;;    (load gnus-offline-setting-file)
 ;;;
-;;; put following code in you .gnus-offline.el.
-;;;
-;;;  (setq gnus-offline-dialup-program-arguments '("-a" "-b"))
-;;;  (setq gnus-offline-hangup-program-arguments '("-c" "-d"))
-;;;
 ;;; If you use gnus-agent as souper , put gnus-agent setup code in you .gnus.el
 ;;;
 ;;; If you use nnspool as souper , put following code in your .emacs before
@@ -86,6 +82,7 @@
 (require 'cl)
 (require 'custom)
 (require 'pop3-fma)
+(require 'easymenu)
 
 (unless (and (condition-case ()
                 (require 'custom)
   :group 'mail
   :group 'news)
 
-(defconst gnus-offline-version-number "2.00b1")
+(defconst gnus-offline-version-number "2.02")
 (defconst gnus-offline-codename
-  "Beta1"
+;;  "Beta5"                    ; Beta
 ;;  "This is the time"         ; 2.00
 ;;  "A matter of trust"
-;;  "Modern Woman"
+  "Modern Woman"
 ;;  "Code of silence"
   )
 
@@ -192,6 +189,23 @@ If set to 0 , timer call is disabled."
   :group 'gnus-offline
   :type 'function)
 
+(defcustom gnus-offline-pop-password-file nil
+  "*File name for saving one's POP password information.
+This variable should be nil if there's some possibility that
+your passwords be stolen."
+  :group 'gnus-offline
+  :type '(choice (file :tag "File")
+                (const nil)))
+
+(defcustom gnus-offline-pop-password-decoding-function 
+  (function (lambda () (base64-decode-region (point-min) (point-max))))
+  "*Function for decoding one's password information.
+The value has no effect when `gnus-offline-pop-password-file'
+is nil.
+This variable might be nil if you don't need to encode your passwords."
+  :group 'gnus-offline
+  :type 'function)
+
 ;;; Internal variables.
 (defvar gnus-offline-connected nil
   "*If value is t , dialup line is connected status.
@@ -222,6 +236,7 @@ If value is nil , dialup line is disconnected status.")
 (defvar ver)
 (defvar passwd)
 (defvar num)
+(defvar gnus-offline-error-buffer " *Error*")
 (defvar gnus-offline-map (make-sparse-keymap))
 
 ;;; To silence byte compiler
@@ -255,6 +270,10 @@ If value is nil , dialup line is disconnected status.")
      (setq byte-compile-warnings nil))))
        
 (put 'gnus-offline-set-unplugged-state 'menu-enable 'gnus-offline-connected)
+(if (eq system-type 'windows-nt)
+    (define-process-argument-editing "/hang\\.exe\\'"
+      (lambda (x) (general-process-argument-editing-function
+                  x nil t t nil t t))))
 ;;; Functions
 ;;
 ;; Setting up...
@@ -265,23 +284,54 @@ If value is nil , dialup line is disconnected status.")
   ;; Load setting file - required.
   (load gnus-offline-setting-file)
 
-  ;; Menus.
+  ;; Menu and keymap
   (gnus-offline-define-menu-and-key)
   
   ;; To transfer Mail/News function.
   (cond ((eq gnus-offline-mail-treat-environ 'offline)
-        ;; send mail under online environ.
+        ;; send mail under offline environ.
         (gnus-offline-set-offline-sendmail-function))
        ((eq gnus-offline-mail-treat-environ 'online)
         ;; send mail under offline environ.
         (gnus-offline-set-online-sendmail-function))))
+;;  (add-hook 'gnus-group-mode-hook 'gnus-offline-setup))
+
+;;
+;; Setting Error check.
+(defun gnus-offline-error-check ()
+  ;; Check gnus-agent and nnspool setting.
+  (cond ((eq gnus-offline-news-fetch-method 'nnagent)
+        ;; nnagent and gnus-agent loaded ??
+        (if (not (and (featurep 'gnus-agent)
+                      (featurep 'nnagent)))
+            (progn
+              (get-buffer-create gnus-offline-error-buffer)
+              (set-buffer gnus-offline-error-buffer)
+              (erase-buffer)
+              (insert "WARNING!!: gnus-agent.el or nnagent.el is not loaded.\n")
+              (insert "Please check your .emacs or .gnus.el to work gnus-agent fine.")
+              (pop-to-buffer gnus-offline-error-buffer))))
+       
+       ((eq gnus-offline-news-fetch-method 'nnspool)
+        (if (not (featurep 'nnspool))
+            (progn
+              (get-buffer-create gnus-offline-error-buffer)
+              (set-buffer gnus-offline-error-buffer)
+              (erase-buffer)
+              (insert "WARNING!!: nnspool.el is not loaded.\n")
+              (insert "Please check your .emacs or .gnus.el to work nnspool fine.")
+              (pop-to-buffer gnus-offline-error-buffer))))))
 ;;
 ;;
 (defun gnus-offline-set-offline-sendmail-function ()
   "*Initialize sendmail-function when unplugged status."
   (if (eq gnus-offline-drafts-queue-type 'miee)
-      (setq message-send-mail-function 'sendmail-to-spool-in-gnspool-format)
-    (setq message-send-mail-function 'gnus-agent-send-mail)))
+      (progn
+       (if (eq gnus-offline-news-fetch-method 'nnagent)
+           (setq gnus-agent-send-mail-function 'sendmail-to-spool-in-gnspool-format))
+       (setq message-send-mail-function 'sendmail-to-spool-in-gnspool-format))
+    (setq gnus-agent-send-mail-function (gnus-offline-set-online-sendmail-function)
+         message-send-mail-function 'gnus-agent-send-mail)))
 ;;
 (defun gnus-offline-set-online-sendmail-function ()
   "*Initialize sendmail-function when plugged status."
@@ -301,13 +351,31 @@ If value is nil , dialup line is disconnected status.")
 ;; Get new news jobs. (gnus-agent and nnspool)
 ;;
 (defun gnus-offline-gnus-get-new-news (&optional arg)
-  "*Override function \"gnus-grou-get-new-news\"."
+  "*Override function \"gnus-group-get-new-news\"."
   (interactive "P")
   (run-hooks 'gnus-offline-before-online-hook)
   (if (functionp gnus-offline-dialup-function)
       (funcall gnus-offline-dialup-function))
   (gnus-offline-get-new-news-function)
-  (gnus-group-get-new-news arg))
+  (let (buffer)
+    (unwind-protect
+       (progn
+         (save-excursion
+           (or pop3-fma-password
+               (when gnus-offline-pop-password-file
+                 (setq pop3-fma-save-password-information t)
+                 (setq buffer (get-buffer-create "*offline-temp*"))
+                 (set-buffer buffer)
+                 (erase-buffer)
+                 (insert-file-contents-as-binary gnus-offline-pop-password-file)
+                 (and gnus-offline-pop-password-decoding-function
+                      (funcall gnus-offline-pop-password-decoding-function))
+                 (eval-buffer))))
+         (gnus-group-get-new-news arg))
+      (when gnus-offline-pop-password-file
+       (setq pop3-fma-password nil)
+       (setq pop3-fma-save-password-information nil)
+       (kill-buffer buffer)))))
 
 ;;
 ;; dialup...
@@ -556,9 +624,14 @@ If value is nil , dialup line is disconnected status.")
   (if (eq gnus-offline-articles-to-fetch 'mail)
       (gnus-offline-restore-mail-group-level))
   (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (gnus-offline-agent-expire))
-  (ding)
-  (message "All online jobs have done."))
+      (or gnus-agent-expire-all
+         (gnus-offline-agent-expire)))
+  (if (and (featurep 'xemacs)
+          (fboundp 'play-sound-file))
+      (ding nil 'drum)
+    (ding))
+  (gnus-group-save-newsrc)
+  (message "All online jobs has done."))
 
 \f
 ;;
@@ -682,7 +755,9 @@ If value is nil , dialup line is disconnected status.")
 (defun gnus-offline-define-menu-and-key ()
   "*Set key and menu."
   (if (eq gnus-offline-drafts-queue-type 'miee)
-      (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-miee)
+      (if (featurep 'xemacs)
+         (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-miee)
+       (gnus-offline-define-menu-on-miee))
     (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-agent))
   (add-hook 'gnus-group-mode-hook
            '(lambda ()
@@ -700,161 +775,123 @@ If value is nil , dialup line is disconnected status.")
                     (substitute-key-definition
                      'gnus-agent-toggle-plugged 'gnus-offline-toggle-plugged
                      gnus-agent-group-mode-map)
-                    (local-set-key "\C-coe" 'gnus-offline-agent-expire)))))
+                    (local-set-key "\C-coe" 'gnus-offline-agent-expire)))
+              (or (featurep 'xemacs)
+                  (define-key gnus-group-mode-map 
+                    (if (eq system-type 'windows-nt) [S-mouse-2] [mouse-3])
+                    'gnus-offline-popup-menu))))
   (if (eq gnus-offline-news-fetch-method 'nnagent)
       (add-hook 'gnus-summary-mode-hook
                '(lambda ()
                   (substitute-key-definition
                    'gnus-agent-toggle-plugged 'gnus-offline-toggle-plugged
-                   gnus-agent-summary-mode-map)))))
-
+                   gnus-agent-summary-mode-map))))
+  (if (featurep 'xemacs)
+      ;; Overwrite the toolbar spec for gnus-group-mode.
+      (add-hook 'gnus-startup-hook
+               (lambda ()
+                 (let ((i 0) (stat t) but)
+                   (while (and stat (setq but (nth i gnus-group-toolbar)))
+                     (and (equal 'gnus-group-get-new-news (aref but 1))
+                          (aset but 1 'gnus-offline-gnus-get-new-news)
+                          (setq stat nil))
+                     (setq i (1+ i))))))))
+;;
+;;
 (defun gnus-offline-define-menu-on-miee ()
-  "*Set menu bar on MIEE menu."
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline-hup-separator]
-   '("--"))
-
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline]
-   (cons "Gnus Offline Utility"
-        (make-sparse-keymap "Gnus Offline Utiliry")))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-toggle-movemail-program]
-   '("Toggle movemail program" .
-     gnus-offline-toggle-movemail-program))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-toggle-articles-to-fetch]
-   '("Toggle articles to fetch" .
-     gnus-offline-toggle-articles-to-fetch))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-toggle-on/off-send-mail]
-   '("Toggle online/offline send mail" .
-     gnus-offline-toggle-on/off-send-mail))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-toggle-auto-hangup]
-   '("Toggle auto hang up" . gnus-offline-toggle-auto-hangup))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-expire-separator]
-   '("--"))
-  
-  (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (global-set-key
-       [menu-bar
-       miee
-       gnus-offline
-       gnus-offline-agent-expire]
-       '("Expire articles" . gnus-offline-agent-expire)))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-set-interval-time]
-   '("Set interval time." . gnus-offline-set-interval-time))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-hup-separator]
-   '("--"))
-  
-  (global-set-key
-   [menu-bar
-    miee
-    gnus-offline
-    gnus-offline-set-unplugged-state]
-   '("Hang Up Line." . gnus-offline-set-unplugged-state)))
+  "*Set and change menu bar on MIEE menu."
+  (let ((menu
+  (if (featurep 'meadow)
+      (easy-menu-change
+       nil
+       "Miee"
+       '(
+        ["Spool \e$B$K$"$k5-;v$NAw?.\e(B" news-spool-post t]
+        ["Spool \e$B$K$"$k\e(B Mail \e$B$NAw?.\e(B" mail-spool-send t]
+        "----"
+        ["Offline \e$B>uBV$X\e(B" message-offline-state (not message-offline-state)]
+        ["Online \e$B>uBV$X\e(B" message-online-state message-offline-state]
+        "----"
+        ("Gnus Offline"
+         ["movemail \e$B$N@ZBX$(\e(B" gnus-offline-toggle-movemail-program t]
+         ["\e$B<hF@5-;v<oN`$NJQ99\e(B" gnus-offline-toggle-articles-to-fetch t]
+         ["Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B" gnus-offline-toggle-on/off-send-mail t]
+         ["\e$B<+F0@ZCG$N@ZBX$(\e(B" gnus-offline-toggle-auto-hangup t]
+         "----"
+         ["\e$B<hF@:Q5-;v$r>C$9\e(B" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
+         ["\e$B5-;v<hF@4V3V;~4V$N@_Dj\e(B" gnus-offline-set-interval-time t]
+         "----"
+         ["\e$B2s@~$N@ZCG\e(B" gnus-offline-set-unplugged-state gnus-offline-connected])
+        ))
+    (easy-menu-change
+     nil
+     "Miee"
+     '(
+       ["Post news in spool" news-spool-post t]
+       ["Send mails in spool" mail-spool-send t]
+       "----"
+       ["Message Offline" message-offline-state (not message-offline-state)]
+       ["Message Online" message-online-state message-offline-state]
+       "----"
+       ("Gnus Offline"
+       ["Toggle movemail program" gnus-offline-toggle-movemail-program t]
+       ["Toggle articles to fetch" gnus-offline-toggle-articles-to-fetch t]
+       ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail t]
+       ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
+       "----"
+       ["Expire articles" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
+       ["Set interval time" gnus-offline-set-interval-time t]
+       "----"
+       ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected]
+       ))))))
+  (and (featurep 'xemacs)
+       (easy-menu-add menu))))
 ;;
 ;; define menu without miee.
 ;;
 (defun gnus-offline-define-menu-on-agent ()
   "*Set menu bar on OFFLINE menu."
-  (define-key-after
-    (lookup-key global-map [menu-bar])
-    [offline]
-    (cons "Offline" (make-sparse-keymap "Offline"))
-    'help)               ;; Actually this adds before "Help".
-
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-toggle-movemail-program]
-   '("Toggle movemail program" . gnus-offline-toggle-movemail-program))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-toggle-articles-to-fetch]
-   '("Toggle articles to fetch" . gnus-offline-toggle-articles-to-fetch))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-toggle-on/off-send-mail]
-   '("Toggle online/offline send mail" . gnus-offline-toggle-on/off-send-mail))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-toggle-auto-hangup]
-   '("Toggle auto hang up" . gnus-offline-toggle-auto-hangup))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-separator]
-   '("--"))
-  
-  (if (eq gnus-offline-news-fetch-method 'nnagent)
-      (progn
-       (global-set-key
-        [menu-bar
-         offline
-         gnus-offline-agent-expire]
-        '("Expire articles" . gnus-offline-agent-expire))))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-set-interval-time]
-   '("Set interval time." . gnus-offline-set-interval-time))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-hup-separator]
-   '("--"))
-  
-  (global-set-key
-   [menu-bar
-    offline
-    gnus-offline-set-unplugged-state]
-   '("Hang Up Line." . gnus-offline-set-unplugged-state)))
+  (easy-menu-define 
+   gnus-offline-menu-on-agent
+   gnus-group-mode-map
+   "Gnus offline Menu"
+   (if (featurep 'meadow)
+       '("Offline"
+        ["movemail \e$B$N@ZBX$(\e(B" gnus-offline-toggle-movemail-program t]
+        ["\e$B<hF@5-;v<oN`$NJQ99\e(B" gnus-offline-toggle-articles-to-fetch t]
+        ["Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B" gnus-offline-toggle-on/off-send-mail t]
+        ["\e$B<+F0@ZCG$N@ZBX$(\e(B" gnus-offline-toggle-auto-hangup t]
+        "----"
+        ["\e$B<hF@:Q5-;v$r>C$9\e(B" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
+        ["\e$B5-;v<hF@4V3V;~4V$N@_Dj\e(B" gnus-offline-set-interval-time t]
+        "----"
+        ["\e$B2s@~$N@ZCG\e(B" gnus-offline-set-unplugged-state gnus-offline-connected])
+     '("Offline"
+       ["Toggle movemail program" gnus-offline-toggle-movemail-program t]
+       ["Toggle articles to fetch" gnus-offline-toggle-articles-to-fetch t]
+       ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail t]
+       ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
+       "----"
+       ["Expire articles" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
+       ["Set interval time" gnus-offline-set-interval-time t]
+       "----"
+       ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected])))
+  (and (featurep 'xemacs)
+       (easy-menu-add gnus-offline-menu-on-agent)))
+;;
+;; Popup menu within the group buffer (under Emacs).
+;;
+(defun gnus-offline-popup-menu (event)
+  "Popup menu for Gnus offline."
+  (interactive "e")
+  (let* ((menu (if (boundp 'miee-popup-menu)
+                  (or (assoc 'keymap
+                             (assoc 'Miee (assoc 'menu-bar global-map)))
+                      miee-popup-menu)
+                gnus-offline-menu-on-agent))
+        (pop (x-popup-menu t menu))
+        (func (and pop (lookup-key menu (apply 'vector pop)))))
+    (and pop func (funcall func))))
 \f
 ;;
 ;; Timer Function