Subversion Repositories cryptochat

Rev

Blame | Last modification | View Log | RSS feed

  1. package Sajax;
  2. use Data::Dumper;
  3.  
  4. my $rs_debug_mode = 0;
  5. my $rs_js_has_been_shown = 0;
  6. my %rs_export_list = ();
  7. my %rs_coderef_list = ();
  8.  
  9. sub incl_sajax {
  10. }
  11. sub rs_init {
  12.     $rs_debug_mode = 0;
  13.     $rs_js_has_been_shown = 0;
  14.     %rs_export_list = ();
  15.     %rs_coderef_list = ();
  16.  
  17. }
  18.        
  19. sub rs_handle_client_request {
  20.     my($q)=@_;
  21.     my $rv="";
  22.    
  23.     if (!defined $q->param("rs")) {
  24.         return undef;
  25.     }
  26.    
  27.     my $func_name = $q->param("rs");
  28.  
  29.     if ( defined $rs_export_list{$func_name}) {
  30.         $rv .= "+:";
  31.         eval {
  32.             $rv .= &$func_name($q->param("rsargs"));
  33.         };
  34.         if($@) {
  35.             print STDERR "Err:[$@]\n";
  36.         }
  37.     } elsif ( defined $rs_coderef_list{$func_name}) {
  38.         $rv .= "+:";
  39.         my $cr = $rs_coderef_list{$func_name};
  40.         eval {
  41.             $rv .= &$cr($q->param("rsargs"));
  42.         };
  43.         if($@) {
  44.             print STDERR "Err:[$@]\n";
  45.         }
  46.     } else {
  47.         $rv .= "-:$func_name not callable";
  48.     }
  49.    
  50.     return $rv;
  51. }
  52.        
  53. sub rs_show_common_js() {
  54.     my $rv = "";
  55.     my $debug_mode = $rs_debug_mode ? "true" : "false";
  56.     my $CC = "\n// Perl backend version (c) copyright 2005 Nathan Schmidt";
  57.     $CC = "";
  58.     $rv .= <<EOT;
  59. // remote scripting library
  60. // (c) copyright 2005 modernmethod, inc$CC
  61. var rs_debug_mode = $debug_mode;
  62. var rs_obj = false;
  63. var rs_callback = false;
  64.  
  65. function rs_debug(text) {
  66.         if (rs_debug_mode)
  67.                 alert("RSD: " + text)
  68. }
  69. function rs_init_object() {
  70.         rs_debug("rs_init_object() called..")
  71.        
  72.         var A;
  73.         try {
  74.                 A=new ActiveXObject("Msxml2.XMLHTTP");
  75.         } catch (e) {
  76.                 try {
  77.                         A=new ActiveXObject("Microsoft.XMLHTTP");
  78.                 } catch (oc) {
  79.                         A=null;
  80.                 }
  81.         }
  82.         if(!A && typeof XMLHttpRequest != "undefined")
  83.                 A = new XMLHttpRequest();
  84.         if (!A)
  85.                 rs_debug("Could not create connection object.");
  86.         return A;
  87. }
  88. EOT
  89.     return $rv;
  90. }      
  91.  
  92.  
  93. #javascript escape a value
  94. sub rs_esc {
  95.     my ($val)=@_;
  96.     $val =~ s/\"/\\\\\"/;
  97.     return $val;
  98. }      
  99.  
  100. sub rs_urlencode {
  101.     my($enc) = @_;
  102.     $enc =~ s/^\s+|\s+$//gs;
  103.     $enc =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
  104.     $enc =~ s/ /\+/g;
  105.     $enc =~ s/%20/\+/g;
  106.     return $enc;
  107. }    
  108.  
  109. sub rs_show_one {
  110.     my($q,$func_name)=@_;
  111.     my $rv = "";
  112.     my $uri = $q->url(-query=>1);
  113.     if ($uri =~ m/\?/) {
  114.         $uri .= "&rs=".rs_urlencode($func_name);
  115.     } else {
  116.         $uri .= "?rs=".rs_urlencode($func_name);
  117.     }
  118.  
  119.     my $urie = rs_esc($uri);
  120.  
  121.     $rv .= <<EOT;      
  122.  
  123.     // wrapper for $func_name
  124.     function x_$func_name() {
  125.         // count args; build URL
  126.         var i, x, n;
  127.         var url = "$urie", a = x_$func_name.arguments;
  128.         for (i = 0; i < a.length-1; i++)
  129.             url = url + "&rsargs=" + escape(a[i]);
  130.         url = url.replace( /[+]/g, '%2B'); // fix the unescaped plus signs
  131.         x = rs_init_object();
  132.         x.open("GET", url, true);
  133.         x.onreadystatechange = function() {
  134.             if (x.readyState != 4)
  135.                 return;
  136.             rs_debug("received " + x.responseText);
  137.            
  138.             var status;
  139.             var data;
  140.             status = x.responseText.charAt(0);
  141.             data = x.responseText.substring(2);
  142.             if (status == "-")
  143.                 alert("Error: " + callback_n);
  144.             else  
  145.                 a[a.length-1](data);
  146.         }
  147.         x.send(null);
  148.         rs_debug("x_$func_name url = " + url);
  149.         rs_debug("x_$func_name waiting..");
  150.     }
  151.  
  152.  
  153. EOT
  154.     return $rv;
  155. }
  156.  
  157. sub rs_register {
  158.     my($fn,$coderef)=@_;
  159.     $rs_coderef_list{$fn} = $coderef;
  160. }      
  161. sub rs_export {
  162.     map {$rs_export_list{$_}=$_} @_;
  163.     return;
  164. }      
  165.  
  166. sub rs_show_javascript {
  167.     my ($q) = @_;
  168.     my $rv = "";
  169.     if (! $rs_js_has_been_shown) {
  170.         $rv .= rs_show_common_js();
  171.         $rs_js_has_been_shown = 1;
  172.     }
  173.  
  174.     foreach my $func (keys %rs_export_list) {
  175.         $rv .= rs_show_one($q,$func);
  176.     }
  177.     foreach my $func (keys %rs_coderef_list) {
  178.         $rv .= rs_show_one($q,$func);
  179.     }
  180.  
  181.     return $rv;
  182. }
  183.  
  184. 1;
  185.