X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Friece-async.el;h=b633ff5752d02b66691d47ae3641b357bbbb75cc;hb=bf2df5d4bf0f70c7f102eb924e352f83d46f3fa4;hp=8ac4e894b369ff126b796344707700bbb1152e01;hpb=24469fc22400b8b11b50548cabd9b3ab9737d740;p=elisp%2Friece.git diff --git a/lisp/riece-async.el b/lisp/riece-async.el index 8ac4e89..b633ff5 100644 --- a/lisp/riece-async.el +++ b/lisp/riece-async.el @@ -1,4 +1,4 @@ -;;; riece-async.el --- connect to IRC server via asynchronous proxy +;;; riece-async.el --- connect to IRC server via async proxy ;; Copyright (C) 1998-2003 Daiki Ueno ;; Author: Daiki Ueno @@ -18,18 +18,17 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: -;; This program allows to connect IRC server via asynchronous proxy -;; which responds to PING request from server in background. +;; NOTE: This is an add-on module for Riece. -;; To use, add the following line to your ~/.riece/init.el: -;; (add-to-list 'riece-addons 'riece-async) +;; This program allows to connect to an IRC server via local proxy +;; which responds to PING requests from server. -;; If you want to enable this feature to per server, write the server +;; If you want to enable this feature per server, write the server ;; spec like this: ;; (add-to-list 'riece-server-alist ;; '("async" :host "irc.tokyo.wide.ad.jp" @@ -37,82 +36,55 @@ ;;; Code: +(require 'riece-options) +(require 'riece-ruby) ;riece-ruby-command + (defgroup riece-async nil - "Connect to IRC server via asynchronous proxy" + "Connect to IRC server via async proxy." :prefix "riece-" :group 'riece) -(defcustom riece-async-ruby-command "ruby" - "Command name for Ruby interpreter." - :type 'string +(defcustom riece-async-buffer-size 65535 + "Maximum size of the write buffer." + :type 'integer :group 'riece-async) -(defcustom riece-async-server-program - '("\ -socket = TCPSocket.new(" host ", " service ") -$stdout.write(\"NOTICE CONNECTED\r\n\") -$stdout.flush -loop do - rfds, = select([socket, $stdin]) - if rfds.delete(socket) - line = socket.gets(\"\r\n\") - break unless line - if line =~ /^(?::[^ ]+ +)?PING +(.+)\r\n/i - socket.write(\"PONG #{$1}\r\n\") - socket.flush - else - $stdout.write(line) - $stdout.flush - end - end - if rfds.delete($stdin) - line = $stdin.gets(\"\r\n\") - break unless line - socket.write(line) - socket.flush - end -end -socket.close -exit -") - "Ruby program of asynchronous proxy" - :type 'list +(defcustom riece-async-backup-file (expand-file-name "riece-async.bak" + riece-directory) + "A file which contains outdated messages." + :type 'string :group 'riece-async) -(defun riece-async-substitute-variables (program variable value) - (setq program (copy-sequence program)) - (let ((pointer program)) - (while pointer - (setq pointer (memq variable program)) - (if pointer - (setcar pointer value))) - program)) +(defvar riece-async-server-program "aproxy.rb" + "The server program file. If the filename is not absolute, it is +assumed that the file is in the same directory of this file.") + +(defvar riece-async-server-program-arguments + (list "-s" (number-to-string riece-async-buffer-size) + "-b" riece-async-backup-file) + "Command line arguments passed to `riece-async-server-program'.") + +(defconst riece-async-description + "Connect to IRC server via async proxy.") ;;;###autoload (defun riece-async-open-network-stream (name buffer host service) - (let* ((process-connection-type nil) - (process (start-process name buffer "ruby" "-rsocket"))) - (process-kill-without-query process) - (process-send-string process - (apply #'concat - (riece-async-substitute-variables - (riece-async-substitute-variables - riece-async-server-program - 'host - (concat "'" host "'")) - 'service - (if (numberp service) - (number-to-string service) - (concat "'" service "'"))))) - (process-send-string process "\0\n") ;input to process is needed + (let* (process-connection-type + (process + (apply #'start-process name buffer riece-ruby-command + (expand-file-name riece-async-server-program + riece-data-directory) + riece-async-server-program-arguments))) (if buffer (save-excursion (set-buffer (process-buffer process)) (while (and (eq (process-status process) 'run) (progn (goto-char (point-min)) - (not (looking-at "NOTICE CONNECTED")))) + (not (looking-at (format "NOTICE CONNECTED %d" + (process-id process)))))) (accept-process-output process)))) + (process-kill-without-query process) process)) (defun riece-async-insinuate () @@ -121,4 +93,4 @@ exit (provide 'riece-async) -;;; riece-rdcc.el ends here +;;; riece-async.el ends here