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; |