Fixed.
[riece] / lisp / riece-async.el
index 8ac4e89..0c102e2 100644 (file)
@@ -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 <ueno@unixuser.org>
 
 ;;; 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"
 
 ;;; 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
+        (process
+         (apply #'start-process name buffer riece-ruby-command
+                (if (file-name-absolute-p riece-ruby-server-program)
+                    riece-async-server-program
+                  (expand-file-name
+                   riece-async-server-program
+                   (file-name-directory
+                    (locate-library
+                     (symbol-file 'riece-async-open-network-stream)))))
+                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 ()