* Makefile.am (EXTRA_DIST): Added aproxy.rb.
authorDaiki Ueno <ueno@unixuser.org>
Fri, 12 Aug 2005 04:06:31 +0000 (04:06 +0000)
committerDaiki Ueno <ueno@unixuser.org>
Fri, 12 Aug 2005 04:06:31 +0000 (04:06 +0000)
* COMPILE (riece-scripts): Added "aproxy.rb".

* riece-async.el (riece-async-buffer-size): Renamed from
riece-async-max-buffer-size.
(riece-async-backup-file): New user option.
(riece-async-server-program): New variable.
(riece-async-server-program-arguments): New variable.
(riece-async-open-network-stream): Use aproxy.rb.

* aproxy.rb: New file.

lisp/COMPILE
lisp/ChangeLog
lisp/Makefile.am
lisp/aproxy.rb [new file with mode: 0644]
lisp/riece-async.el

index ba93344..b4f4561 100644 (file)
@@ -90,7 +90,8 @@
     "riece-submit-bug-report.xpm"))
 
 (defvar riece-scripts
-  '("server.rb"))
+  '("server.rb"
+    "aproxy.rb"))
 
 (defun riece-compile-modules (modules)
   (let ((load-path (cons nil load-path))
index 990e7c3..8f8d5e7 100644 (file)
@@ -1,5 +1,18 @@
 2005-08-12  Daiki Ueno  <ueno@unixuser.org>
 
+       * Makefile.am (EXTRA_DIST): Added aproxy.rb.
+
+       * COMPILE (riece-scripts): Added "aproxy.rb".
+
+       * riece-async.el (riece-async-buffer-size): Renamed from
+       riece-async-max-buffer-size.
+       (riece-async-backup-file): New user option.
+       (riece-async-server-program): New variable.
+       (riece-async-server-program-arguments): New variable.
+       (riece-async-open-network-stream): Use aproxy.rb.
+
+       * aproxy.rb: New file.
+
        * riece-ruby.el (riece-ruby-out-file): New user option.
        (riece-ruby-err-file): New user option.
        (riece-ruby-log-file): New user option..
index c185dda..e15d83b 100644 (file)
@@ -19,7 +19,7 @@ EXTRA_DIST = COMPILE ChangeLog ChangeLog.Liece \
        riece-keepalive.el riece-eval-ruby.el url-riece.el \
        riece-command-previous-channel.xpm riece-command-next-channel.xpm \
        riece-submit-bug-report.xpm \
-       server.rb
+       server.rb aproxy.rb
 
 CLEANFILES = auto-autoloads.el custom-load.el *.elc
 FLAGS ?= -batch -q -no-site-file
diff --git a/lisp/aproxy.rb b/lisp/aproxy.rb
new file mode 100644 (file)
index 0000000..df88f94
--- /dev/null
@@ -0,0 +1,107 @@
+# aproxy.rb --- async proxy between an IRC server and a client
+# Copyright (C) 1998-2005 Daiki Ueno
+
+# Author: Daiki Ueno <ueno@unixuser.org>
+# Created: 1998-09-28
+# Keywords: IRC, riece
+
+# This file is part of Riece.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# 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.
+
+require 'io/nonblock'
+require 'socket'
+
+class AProxy
+  def initialize(host, port, size, back)
+    @host = host
+    @port = port
+    @size = size
+    @back = File.new(back, 'a') if back
+  end
+
+  def start
+    $stdout.nonblock = true
+    trap('STOP', 'IGNORE')
+    trap('TSTP', 'IGNORE')
+    socket = TCPSocket.new(@host, @port)
+    @out.write("NOTICE CONNECTED #{$$}\r\n")
+    wfds_in = []
+    buf = ''
+    loop do
+      rfds, wfds, = select([socket, $stdin], wfds_in)
+      unless wfds.empty?
+        if buf.length > @size
+          s = buf.slice!(0 ... @size)
+          @back.write(s) if @back
+        end
+        begin
+          until buf.empty?
+            len = $stdout.syswrite(buf)
+            buf.slice!(0 .. len)
+          end
+          wfds_in.clear
+        rescue Errno::EAGAIN
+        end
+      end
+      if rfds.include?(socket)
+        line = socket.gets("\r\n")
+        break unless line
+        if line =~ /\A(?::\S+\s+)?PING\s+(.*)\r\n/i
+          socket.write("PONG #{$1}\r\n")
+        else
+          wfds_in = [$stdout]
+          buf << line
+        end
+      end
+      if rfds.include?($stdin)
+        line = $stdin.gets("\r\n")
+        break unless line
+        socket.write(line)
+      end
+    end
+    socket.close
+  end
+end
+
+if $0 == __FILE__
+  require 'optparse'
+
+  opt_size, opt_back = nil, nil
+  opts = OptionParser.new do |opts|
+    opts.banner = <<"End"
+Usage: #{$0} [OPTIONS] host port
+End
+    opts.on('-s', '--size SIZE', 'Size of buffer.') do |size|
+      opt_size = size.to_i
+    end
+    opts.on('-b', '--back BACK', 'Send outdated messages to BACK.') do |back|
+      opt_back = back
+    end
+    opts.on_tail('--help', '-h', 'Show this message.') do
+      $stdout.print(opts.to_s)
+      exit(0)
+    end
+  end
+  begin
+    opts.parse!(ARGV)
+  rescue OptionParser::ParseError
+    $stderr.print(opts.to_s)
+    exit(1)
+  end
+
+  AProxy.new(ARGV.shift, ARGV.shift, opt_size, opt_back).start
+end
index 05827cd..4635643 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>
 ;;; Code:
 
 (require 'riece-options)
-(require 'riece-ruby)                  ;riece-ruby-command,
-                                       ;riece-ruby-substitute-variables
 
 (defgroup riece-async nil
   "Connect to IRC server via asynchronous proxy"
   :prefix "riece-"
   :group 'riece)
 
-(defcustom riece-async-server-program
-  '("\
-orequire 'io/nonblock'
-socket = TCPSocket.new(" host ", " service ")
-$stdout.write(\"NOTICE CONNECTED #{$$}\\r\\n\")
-$stdout.flush
-$stdout.nonblock = true
-trap('STOP', 'IGNORE')
-trap('TSTP', 'IGNORE')
-wfds_in = []
-buf = ''
-loop do
-  rfds, wfds, = select([socket, $stdin], wfds_in)
-  unless wfds.empty?
-    until buf.length <= " max-buffer-size "
-      i = buf.index(\"\\r\\n\")
-      break unless i
-      buf.slice!(0 .. i + 1)
-    end
-    begin
-      until buf.empty?
-        len = $stdout.syswrite(buf)
-        buf.slice!(0 .. len)
-      end
-      wfds_in = []
-    rescue Errno::EAGAIN
-    end
-  end
-  if rfds.include?(socket)
-    line = socket.gets(\"\\r\\n\")
-    break unless line
-    if line =~ /^(?::[^ ]+ +)?PING +(.+)\\r\\n/i
-      socket.write(\"PONG #{$1}\\r\\n\")
-      socket.flush
-    else
-      wfds_in = [$stdout]
-      buf << line
-    end
-  end
-  if rfds.include?($stdin)
-    line = $stdin.gets(\"\\r\\n\")
-    break unless line
-    socket.write(line)
-    socket.flush
-  end
-end
-socket.close
-")
-  "Ruby program of asynchronous proxy."
-  :type 'list
-  :group 'riece-async)
-
-(defcustom riece-async-max-buffer-size 65535
+(defcustom riece-async-buffer-size 65535
   "Maximum size of the write buffer."
   :type 'integer
   :group 'riece-async)
 
+(defcustom riece-async-backup-file (expand-file-name "riece-async.bak"
+                                                    riece-directory)
+  "A file which contains outdated messages."
+  :type 'string
+  :group 'riece-async)
+
+(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 riece-ruby-command "-rsocket")))
-    (process-kill-without-query process)
-    (process-send-string process
-                        (riece-ruby-substitute-variables
-                         (list (cons 'host
-                                     (concat "'" host "'"))
-                               (cons 'service
-                                     (if (numberp service)
-                                         (number-to-string service)
-                                       (concat "'" service "'")))
-                               (cons 'max-buffer-size
-                                     (number-to-string
-                                      riece-async-max-buffer-size)))))
-    (process-send-string process "\0\n") ;input to process is needed
+        (process (apply #'start-process name buffer riece-ruby-command
+                        riece-async-server-program
+                        riece-async-server-program-arguments)))
     (if buffer
        (save-excursion
          (set-buffer (process-buffer process))
@@ -132,6 +82,7 @@ socket.close
                        (not (looking-at (format "NOTICE CONNECTED %d"
                                                 (process-id process))))))
            (accept-process-output process))))
+    (process-kill-without-query process)
     process))
 
 (defun riece-async-insinuate ()