Subversion Repositories cryptochat

Rev

Blame | Last modification | View Log | RSS feed

  1. #!/usr/bin/env ruby
  2. require 'cgi'
  3. require 'date'
  4.  
  5. class Sajax
  6.  
  7.   def initialize(debug_mode=false)
  8.     @debug_mode = debug_mode
  9.     @export_list = Hash.new
  10.     @js_has_been_shown = false
  11.     @cgi = CGI.new
  12.   end
  13.  
  14.   def handle_client_request
  15.     func_name = @cgi.params['rs'].to_s
  16.     if func_name == ""
  17.       return
  18.     end
  19.     # Bust cache in the head
  20.     @cgi.out({
  21.       "Expires"    => "Mon, 26 Jul 1997 05:00:00 GMT",
  22.       "Last-Modified" => DateTime.now.new_offset.strftime("%a, %d %m %H:%M:%S GMT"), # always modified
  23.       "Cache-Control" => "no-cache, must-revalidate",  # HTTP/1.1
  24.       "Pragma" => "no-cache",  # HTTP/1.0
  25.       })
  26.    
  27.     unless @export_list.has_key?(func_name)
  28.       print "-:%s not callable" % func_name
  29.     else
  30.       print "+:"
  31.       rsargs = @cgi.params['rsargs[]']
  32.       result = __send__(@export_list[func_name],*rsargs)
  33.       print result
  34.     end
  35.     exit()
  36.   end
  37.  
  38.   def show_common_js
  39.     js_debug_mode = @debug_mode.to_s.downcase
  40.     print <<-"EOS"
  41.       // remote scripting library
  42.       // (c) copyright 2005 modernmethod, inc
  43.       var rs_debug_mode = #{js_debug_mode};
  44.       var rs_obj = false;
  45.       var rs_callback = false;
  46.      
  47.       function rs_debug(text) {
  48.          if (rs_debug_mode)
  49.             alert("RSD: " + text)
  50.       }
  51.      
  52.        function rs_init_object() {
  53.           rs_debug("rs_init_object() called..")
  54.          
  55.           var A;
  56.          try {
  57.             A=new ActiveXObject("Msxml2.XMLHTTP");
  58.          } catch (e) {
  59.             try {
  60.                A=new ActiveXObject("Microsoft.XMLHTTP");
  61.             } catch (oc) {
  62.                A=null;
  63.             }
  64.          }
  65.          if(!A && typeof XMLHttpRequest != "undefined")
  66.             A = new XMLHttpRequest();
  67.          if (!A)
  68.             rs_debug("Could not create connection object.");
  69.          return A;
  70.       }
  71. EOS
  72.   end
  73.  
  74.   def rs_esc(val)
  75.     return val.gsub('"', '\\\\"')  
  76.   end
  77.        
  78.   def show_one(func_name)
  79.     uri = ENV['REQUEST_URI']
  80.     unless uri.include?('?')
  81.       uri += "?rs=%s" % CGI.escape(func_name)
  82.     else
  83.       uri += "&rs=%s" % CGI.escape(func_name)
  84.     end
  85.     escapeduri = rs_esc(uri)
  86.     print <<-"EOS"
  87.    // wrapper for #{func_name}
  88.    function x_#{func_name}(){
  89.       // count args; build URL
  90.          var i, x, n;
  91.          var url = "#{escapeduri}", a = x_#{func_name}.arguments;
  92.          for (i = 0; i < a.length-1; i++)
  93.             url = url + "&rsargs[]=" + escape(a[i]);
  94.          x = rs_init_object();
  95.          x.open("GET", url, true);
  96.          x.onreadystatechange = function() {
  97.             if (x.readyState != 4)
  98.                return;
  99.             rs_debug("received " + x.responseText);
  100.            
  101.             var status;
  102.             var data;
  103.             status = x.responseText.charAt(0);
  104.             data = x.responseText.substring(2);
  105.             if (status == "-")
  106.                alert("Error: " + callback_n);
  107.             else
  108.                a[a.length-1](data);
  109.          }
  110.          x.send(null);
  111.          rs_debug("x_#{func_name} url = " + url);
  112.          rs_debug("x_#{func_name} waiting..");
  113.       }
  114.      
  115.     EOS
  116.   end
  117.  
  118.   def export(*args)
  119.    for f in args
  120.       @export_list[f] = f      
  121.    end                
  122.   end
  123.          
  124.   def show_javascript
  125.     unless @js_has_been_shown
  126.       show_common_js()
  127.       @js_has_been_shown = true
  128.     end
  129.     for func_name in @export_list.keys
  130.       show_one(func_name)
  131.     end
  132.   end
  133.                
  134. end
  135.