X-Git-Url: http://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-async.el;h=1434c73f1271b0a171def2f462756220591dc427;hp=8ac4e894b369ff126b796344707700bbb1152e01;hb=394c46861ed968134a068ecce381bc5e924e0c6f;hpb=ea1ca67a0458e8c6a8b2c723294f7e332728f69e diff --git a/lisp/riece-async.el b/lisp/riece-async.el index 8ac4e89..1434c73 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 @@ -23,13 +23,13 @@ ;;; Commentary: -;; This program allows to connect IRC server via asynchronous proxy -;; which responds to PING request from server in background. +;; This program allows to connect to an IRC server via local proxy +;; which responds to PING requests from server. ;; To use, add the following line to your ~/.riece/init.el: ;; (add-to-list 'riece-addons 'riece-async) -;; 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 +37,54 @@ ;;; Code: +(require 'riece-options) + (defgroup riece-async nil "Connect to IRC server via asynchronous 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" riece-async-buffer-size + "-b" riece-async-backup-file) + "Command line arguments passed to `riece-async-server-program'.") + +(defconst riece-async-description + "Keep IRC connection with external process") ;;;###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