Subversion Repositories cryptochat

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 daniel-mar 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;