;;; 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
(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"
)
: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.
(defvar ver)
(defvar passwd)
(defvar num)
+(defvar gnus-offline-error-buffer " *Error*")
(defvar gnus-offline-map (make-sparse-keymap))
;;; To silence byte compiler
(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...
;; 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."
;; 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...
(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
;;
(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 ()
(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