Commit d832de18632f8b34518f0a14518023d831966d37
1 parent
47bad912
Exists in
master
and in
7 other branches
--no commit message
Showing
12 changed files
with
0 additions
and
5260 deletions
Show diff stats
classesjs/cpaint/JSON/json.js
... | ... | @@ -1,377 +0,0 @@ |
1 | -/* | |
2 | -Copyright (c) 2005 JSON.org | |
3 | - | |
4 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
5 | -of this software and associated documentation files (the "Software"), to deal | |
6 | -in the Software without restriction, including without limitation the rights | |
7 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
8 | -copies of the Software, and to permit persons to whom the Software is | |
9 | -furnished to do so, subject to the following conditions: | |
10 | - | |
11 | -The Software shall be used for Good, not Evil. | |
12 | - | |
13 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
14 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
15 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
16 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
17 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
18 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
19 | -SOFTWARE. | |
20 | -*/ | |
21 | - | |
22 | -Array.prototype.______array = '______array'; | |
23 | - | |
24 | -var JSON = { | |
25 | - org: 'http://www.JSON.org', | |
26 | - copyright: '(c)2005 JSON.org', | |
27 | - license: 'http://www.crockford.com/JSON/license.html', | |
28 | - | |
29 | - stringify: function (arg) { | |
30 | - var c, i, l, s = '', v; | |
31 | - var numeric = true; | |
32 | - | |
33 | - switch (typeof arg) { | |
34 | - case 'object': | |
35 | - if (arg) { | |
36 | - if (arg.______array == '______array') { | |
37 | - // do a test whether all array keys are numeric | |
38 | - for (i in arg) { | |
39 | - if (i != '______array' | |
40 | - && (isNaN(i) | |
41 | - || !isFinite(i))) { | |
42 | - numeric = false; | |
43 | - break; | |
44 | - } | |
45 | - } | |
46 | - | |
47 | - if (numeric == true) { | |
48 | - for (i = 0; i < arg.length; ++i) { | |
49 | - if (typeof arg[i] != 'undefined') { | |
50 | - v = this.stringify(arg[i]); | |
51 | - if (s) { | |
52 | - s += ','; | |
53 | - } | |
54 | - s += v; | |
55 | - } else { | |
56 | - s += ',null'; | |
57 | - } | |
58 | - } | |
59 | - return '[' + s + ']'; | |
60 | - } else { | |
61 | - for (i in arg) { | |
62 | - if (i != '______array') { | |
63 | - v = arg[i]; | |
64 | - if (typeof v != 'undefined' && typeof v != 'function') { | |
65 | - v = this.stringify(v); | |
66 | - if (s) { | |
67 | - s += ','; | |
68 | - } | |
69 | - s += this.stringify(i) + ':' + v; | |
70 | - } | |
71 | - } | |
72 | - } | |
73 | - // return as object | |
74 | - return '{' + s + '}'; | |
75 | - } | |
76 | - } else if (typeof arg.toString != 'undefined') { | |
77 | - for (i in arg) { | |
78 | - v = arg[i]; | |
79 | - if (typeof v != 'undefined' && typeof v != 'function') { | |
80 | - v = this.stringify(v); | |
81 | - if (s) { | |
82 | - s += ','; | |
83 | - } | |
84 | - s += this.stringify(i) + ':' + v; | |
85 | - } | |
86 | - } | |
87 | - return '{' + s + '}'; | |
88 | - } | |
89 | - } | |
90 | - return 'null'; | |
91 | - case 'number': | |
92 | - return isFinite(arg) ? String(arg) : 'null'; | |
93 | - case 'string': | |
94 | - l = arg.length; | |
95 | - s = '"'; | |
96 | - for (i = 0; i < l; i += 1) { | |
97 | - c = arg.charAt(i); | |
98 | - if (c >= ' ') { | |
99 | - if (c == '\\' || c == '"') { | |
100 | - s += '\\'; | |
101 | - } | |
102 | - s += c; | |
103 | - } else { | |
104 | - switch (c) { | |
105 | - case '\b': | |
106 | - s += '\\b'; | |
107 | - break; | |
108 | - case '\f': | |
109 | - s += '\\f'; | |
110 | - break; | |
111 | - case '\n': | |
112 | - s += '\\n'; | |
113 | - break; | |
114 | - case '\r': | |
115 | - s += '\\r'; | |
116 | - break; | |
117 | - case '\t': | |
118 | - s += '\\t'; | |
119 | - break; | |
120 | - default: | |
121 | - c = c.charCodeAt(); | |
122 | - s += '\\u00' + Math.floor(c / 16).toString(16) + | |
123 | - (c % 16).toString(16); | |
124 | - } | |
125 | - } | |
126 | - } | |
127 | - return s + '"'; | |
128 | - case 'boolean': | |
129 | - return String(arg); | |
130 | - default: | |
131 | - return 'null'; | |
132 | - } | |
133 | - }, | |
134 | - parse: function (text) { | |
135 | - var at = 0; | |
136 | - var ch = ' '; | |
137 | - | |
138 | - function error(m) { | |
139 | - throw { | |
140 | - name: 'JSONError', | |
141 | - message: m, | |
142 | - at: at - 1, | |
143 | - text: text | |
144 | - }; | |
145 | - } | |
146 | - | |
147 | - function next() { | |
148 | - ch = text.charAt(at); | |
149 | - at += 1; | |
150 | - return ch; | |
151 | - } | |
152 | - | |
153 | - function white() { | |
154 | - while (ch != '' && ch <= ' ') { | |
155 | - next(); | |
156 | - } | |
157 | - } | |
158 | - | |
159 | - function str() { | |
160 | - var i, s = '', t, u; | |
161 | - | |
162 | - if (ch == '"') { | |
163 | -outer: while (next()) { | |
164 | - if (ch == '"') { | |
165 | - next(); | |
166 | - return s; | |
167 | - } else if (ch == '\\') { | |
168 | - switch (next()) { | |
169 | - case 'b': | |
170 | - s += '\b'; | |
171 | - break; | |
172 | - case 'f': | |
173 | - s += '\f'; | |
174 | - break; | |
175 | - case 'n': | |
176 | - s += '\n'; | |
177 | - break; | |
178 | - case 'r': | |
179 | - s += '\r'; | |
180 | - break; | |
181 | - case 't': | |
182 | - s += '\t'; | |
183 | - break; | |
184 | - case 'u': | |
185 | - u = 0; | |
186 | - for (i = 0; i < 4; i += 1) { | |
187 | - t = parseInt(next(), 16); | |
188 | - if (!isFinite(t)) { | |
189 | - break outer; | |
190 | - } | |
191 | - u = u * 16 + t; | |
192 | - } | |
193 | - s += String.fromCharCode(u); | |
194 | - break; | |
195 | - default: | |
196 | - s += ch; | |
197 | - } | |
198 | - } else { | |
199 | - s += ch; | |
200 | - } | |
201 | - } | |
202 | - } | |
203 | - error("Bad string"); | |
204 | - } | |
205 | - | |
206 | - function arr() { | |
207 | - var a = []; | |
208 | - | |
209 | - if (ch == '[') { | |
210 | - next(); | |
211 | - white(); | |
212 | - if (ch == ']') { | |
213 | - next(); | |
214 | - return a; | |
215 | - } | |
216 | - while (ch) { | |
217 | - a.push(val()); | |
218 | - white(); | |
219 | - if (ch == ']') { | |
220 | - next(); | |
221 | - return a; | |
222 | - } else if (ch != ',') { | |
223 | - break; | |
224 | - } | |
225 | - next(); | |
226 | - white(); | |
227 | - } | |
228 | - } | |
229 | - error("Bad array"); | |
230 | - } | |
231 | - | |
232 | - function obj() { | |
233 | - var k, o = {}; | |
234 | - | |
235 | - if (ch == '{') { | |
236 | - next(); | |
237 | - white(); | |
238 | - if (ch == '}') { | |
239 | - next(); | |
240 | - return o; | |
241 | - } | |
242 | - while (ch) { | |
243 | - k = str(); | |
244 | - white(); | |
245 | - if (ch != ':') { | |
246 | - break; | |
247 | - } | |
248 | - next(); | |
249 | - o[k] = val(); | |
250 | - white(); | |
251 | - if (ch == '}') { | |
252 | - next(); | |
253 | - return o; | |
254 | - } else if (ch != ',') { | |
255 | - break; | |
256 | - } | |
257 | - next(); | |
258 | - white(); | |
259 | - } | |
260 | - } | |
261 | - error("Bad object"); | |
262 | - } | |
263 | - | |
264 | - function assoc() { | |
265 | - var k, a = []; | |
266 | - | |
267 | - if (ch == '<') { | |
268 | - next(); | |
269 | - white(); | |
270 | - if (ch == '>') { | |
271 | - next(); | |
272 | - return a; | |
273 | - } | |
274 | - while (ch) { | |
275 | - k = str(); | |
276 | - white(); | |
277 | - if (ch != ':') { | |
278 | - break; | |
279 | - } | |
280 | - next(); | |
281 | - a[k] = val(); | |
282 | - white(); | |
283 | - if (ch == '>') { | |
284 | - next(); | |
285 | - return a; | |
286 | - } else if (ch != ',') { | |
287 | - break; | |
288 | - } | |
289 | - next(); | |
290 | - white(); | |
291 | - } | |
292 | - } | |
293 | - error("Bad associative array"); | |
294 | - } | |
295 | - | |
296 | - function num() { | |
297 | - var n = '', v; | |
298 | - if (ch == '-') { | |
299 | - n = '-'; | |
300 | - next(); | |
301 | - } | |
302 | - while (ch >= '0' && ch <= '9') { | |
303 | - n += ch; | |
304 | - next(); | |
305 | - } | |
306 | - if (ch == '.') { | |
307 | - n += '.'; | |
308 | - while (next() && ch >= '0' && ch <= '9') { | |
309 | - n += ch; | |
310 | - } | |
311 | - } | |
312 | - if (ch == 'e' || ch == 'E') { | |
313 | - n += 'e'; | |
314 | - next(); | |
315 | - if (ch == '-' || ch == '+') { | |
316 | - n += ch; | |
317 | - next(); | |
318 | - } | |
319 | - while (ch >= '0' && ch <= '9') { | |
320 | - n += ch; | |
321 | - next(); | |
322 | - } | |
323 | - } | |
324 | - v = +n; | |
325 | - if (!isFinite(v)) { | |
326 | - error("Bad number"); | |
327 | - } else { | |
328 | - return v; | |
329 | - } | |
330 | - } | |
331 | - | |
332 | - function word() { | |
333 | - switch (ch) { | |
334 | - case 't': | |
335 | - if (next() == 'r' && next() == 'u' && next() == 'e') { | |
336 | - next(); | |
337 | - return true; | |
338 | - } | |
339 | - break; | |
340 | - case 'f': | |
341 | - if (next() == 'a' && next() == 'l' && next() == 's' && | |
342 | - next() == 'e') { | |
343 | - next(); | |
344 | - return false; | |
345 | - } | |
346 | - break; | |
347 | - case 'n': | |
348 | - if (next() == 'u' && next() == 'l' && next() == 'l') { | |
349 | - next(); | |
350 | - return null; | |
351 | - } | |
352 | - break; | |
353 | - } | |
354 | - error("Syntax error"); | |
355 | - } | |
356 | - | |
357 | - function val() { | |
358 | - white(); | |
359 | - switch (ch) { | |
360 | - case '{': | |
361 | - return obj(); | |
362 | - case '[': | |
363 | - return arr(); | |
364 | - case '<': | |
365 | - return assoc(); | |
366 | - case '"': | |
367 | - return str(); | |
368 | - case '-': | |
369 | - return num(); | |
370 | - default: | |
371 | - return ch >= '0' && ch <= '9' ? num() : word(); | |
372 | - } | |
373 | - } | |
374 | - | |
375 | - return val(); | |
376 | - } | |
377 | -}; |
classesjs/cpaint/JSON/json2.php
... | ... | @@ -1,663 +0,0 @@ |
1 | -<?php | |
2 | -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ | |
3 | - | |
4 | -/** | |
5 | -* Converts to and from JSON format. | |
6 | -* | |
7 | -* JSON (JavaScript Object Notation) is a lightweight data-interchange | |
8 | -* format. It is easy for humans to read and write. It is easy for machines | |
9 | -* to parse and generate. It is based on a subset of the JavaScript | |
10 | -* Programming Language, Standard ECMA-262 3rd Edition - December 1999. | |
11 | -* This feature can also be found in Python. JSON is a text format that is | |
12 | -* completely language independent but uses conventions that are familiar | |
13 | -* to programmers of the C-family of languages, including C, C++, C#, Java, | |
14 | -* JavaScript, Perl, TCL, and many others. These properties make JSON an | |
15 | -* ideal data-interchange language. | |
16 | -* | |
17 | -* This package provides a simple encoder and decoder for JSON notation. It | |
18 | -* is intended for use with client-side Javascript applications that make | |
19 | -* use of HTTPRequest to perform server communication functions - data can | |
20 | -* be encoded into JSON notation for use in a client-side javascript, or | |
21 | -* decoded from incoming Javascript requests. JSON format is native to | |
22 | -* Javascript, and can be directly eval()'ed with no further parsing | |
23 | -* overhead | |
24 | -* | |
25 | -* All strings should be in ASCII or UTF-8 format! | |
26 | -* | |
27 | -* LICENSE: Redistribution and use in source and binary forms, with or | |
28 | -* without modification, are permitted provided that the following | |
29 | -* conditions are met: Redistributions of source code must retain the | |
30 | -* above copyright notice, this list of conditions and the following | |
31 | -* disclaimer. Redistributions in binary form must reproduce the above | |
32 | -* copyright notice, this list of conditions and the following disclaimer | |
33 | -* in the documentation and/or other materials provided with the | |
34 | -* distribution. | |
35 | -* | |
36 | -* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | |
37 | -* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
38 | -* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | |
39 | -* NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
40 | -* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
41 | -* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS | |
42 | -* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
43 | -* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR | |
44 | -* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE | |
45 | -* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | |
46 | -* DAMAGE. | |
47 | -* | |
48 | -* @category | |
49 | -* @package Services_JSON | |
50 | -* @author Michal Migurski <mike-json@teczno.com> | |
51 | -* @author Matt Knapp <mdknapp[at]gmail[dot]com> | |
52 | -* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com> | |
53 | -* @copyright 2005 Michal Migurski | |
54 | -* @license http://www.opensource.org/licenses/bsd-license.php | |
55 | -* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 | |
56 | -*/ | |
57 | - | |
58 | -/** | |
59 | -* Marker constant for Services_JSON::decode(), used to flag stack state | |
60 | -*/ | |
61 | -define('SERVICES_JSON_SLICE', 1); | |
62 | - | |
63 | -/** | |
64 | -* Marker constant for Services_JSON::decode(), used to flag stack state | |
65 | -*/ | |
66 | -define('SERVICES_JSON_IN_STR', 2); | |
67 | - | |
68 | -/** | |
69 | -* Marker constant for Services_JSON::decode(), used to flag stack state | |
70 | -*/ | |
71 | -define('SERVICES_JSON_IN_ARR', 4); | |
72 | - | |
73 | -/** | |
74 | -* Marker constant for Services_JSON::decode(), used to flag stack state | |
75 | -*/ | |
76 | -define('SERVICES_JSON_IN_OBJ', 8); | |
77 | - | |
78 | -/** | |
79 | -* Marker constant for Services_JSON::decode(), used to flag stack state | |
80 | -*/ | |
81 | -define('SERVICES_JSON_IN_CMT', 16); | |
82 | - | |
83 | -/** | |
84 | -* Behavior switch for Services_JSON::decode() | |
85 | -*/ | |
86 | -define('SERVICES_JSON_LOOSE_TYPE', 10); | |
87 | - | |
88 | -/** | |
89 | -* Behavior switch for Services_JSON::decode() | |
90 | -*/ | |
91 | -define('SERVICES_JSON_STRICT_TYPE', 11); | |
92 | - | |
93 | -/** | |
94 | -* Converts to and from JSON format. | |
95 | -* | |
96 | -* Brief example of use: | |
97 | -* | |
98 | -* <code> | |
99 | -* // create a new instance of Services_JSON | |
100 | -* $json = new Services_JSON(); | |
101 | -* | |
102 | -* // convert a complexe value to JSON notation, and send it to the browser | |
103 | -* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); | |
104 | -* $output = $json->encode($value); | |
105 | -* | |
106 | -* print($output); | |
107 | -* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] | |
108 | -* | |
109 | -* // accept incoming POST data, assumed to be in JSON notation | |
110 | -* $input = file_get_contents('php://input', 1000000); | |
111 | -* $value = $json->decode($input); | |
112 | -* </code> | |
113 | -*/ | |
114 | -class Services_JSON | |
115 | -{ | |
116 | - /** | |
117 | - * constructs a new JSON instance | |
118 | - * | |
119 | - * @param int $use object behavior: when encoding or decoding, | |
120 | - * be loose or strict about object/array usage | |
121 | - * | |
122 | - * possible values: | |
123 | - * - SERVICES_JSON_STRICT_TYPE: strict typing, default. | |
124 | - * "{...}" syntax creates objects in decode(). | |
125 | - * - SERVICES_JSON_LOOSE_TYPE: loose typing. | |
126 | - * "{...}" syntax creates associative arrays in decode(). | |
127 | - */ | |
128 | - function Services_JSON($use = SERVICES_JSON_STRICT_TYPE) | |
129 | - { | |
130 | - $this->use = $use; | |
131 | - } | |
132 | - | |
133 | - /** | |
134 | - * convert a string from one UTF-16 char to one UTF-8 char | |
135 | - * | |
136 | - * Normally should be handled by mb_convert_encoding, but | |
137 | - * provides a slower PHP-only method for installations | |
138 | - * that lack the multibye string extension. | |
139 | - * | |
140 | - * @param string $utf16 UTF-16 character | |
141 | - * @return string UTF-8 character | |
142 | - * @access private | |
143 | - */ | |
144 | - function utf162utf8($utf16) | |
145 | - { | |
146 | - // oh please oh please oh please oh please oh please | |
147 | - if(function_exists('mb_convert_encoding')) | |
148 | - return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); | |
149 | - | |
150 | - $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); | |
151 | - | |
152 | - switch(true) { | |
153 | - case ((0x7F & $bytes) == $bytes): | |
154 | - // this case should never be reached, because we are in ASCII range | |
155 | - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
156 | - return chr(0x7F & $bytes); | |
157 | - | |
158 | - case (0x07FF & $bytes) == $bytes: | |
159 | - // return a 2-byte UTF-8 character | |
160 | - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
161 | - return chr(0xC0 | (($bytes >> 6) & 0x1F)) | |
162 | - . chr(0x80 | ($bytes & 0x3F)); | |
163 | - | |
164 | - case (0xFFFF & $bytes) == $bytes: | |
165 | - // return a 3-byte UTF-8 character | |
166 | - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
167 | - return chr(0xE0 | (($bytes >> 12) & 0x0F)) | |
168 | - . chr(0x80 | (($bytes >> 6) & 0x3F)) | |
169 | - . chr(0x80 | ($bytes & 0x3F)); | |
170 | - } | |
171 | - | |
172 | - // ignoring UTF-32 for now, sorry | |
173 | - return ''; | |
174 | - } | |
175 | - | |
176 | - /** | |
177 | - * convert a string from one UTF-8 char to one UTF-16 char | |
178 | - * | |
179 | - * Normally should be handled by mb_convert_encoding, but | |
180 | - * provides a slower PHP-only method for installations | |
181 | - * that lack the multibye string extension. | |
182 | - * | |
183 | - * @param string $utf8 UTF-8 character | |
184 | - * @return string UTF-16 character | |
185 | - * @access private | |
186 | - */ | |
187 | - function utf82utf16($utf8) | |
188 | - { | |
189 | - // oh please oh please oh please oh please oh please | |
190 | - if(function_exists('mb_convert_encoding')) | |
191 | - return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); | |
192 | - | |
193 | - switch(strlen($utf8)) { | |
194 | - case 1: | |
195 | - // this case should never be reached, because we are in ASCII range | |
196 | - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
197 | - return $utf8; //$ut8 | |
198 | - | |
199 | - case 2: | |
200 | - // return a UTF-16 character from a 2-byte UTF-8 char | |
201 | - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
202 | - return chr(0x07 & (ord($utf8{0}) >> 2)) | |
203 | - . chr((0xC0 & (ord($utf8{0}) << 6)) | |
204 | - | (0x3F & ord($utf8{1}))); | |
205 | - | |
206 | - case 3: | |
207 | - // return a UTF-16 character from a 3-byte UTF-8 char | |
208 | - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
209 | - return chr((0xF0 & (ord($utf8{0}) << 4)) | |
210 | - | (0x0F & (ord($utf8{1}) >> 2))) | |
211 | - . chr((0xC0 & (ord($utf8{1}) << 6)) | |
212 | - | (0x7F & ord($utf8{2}))); | |
213 | - } | |
214 | - | |
215 | - // ignoring UTF-32 for now, sorry | |
216 | - return ''; | |
217 | - } | |
218 | - | |
219 | - /** | |
220 | - * encodes an arbitrary variable into JSON format | |
221 | - * | |
222 | - * @param mixed $var any number, boolean, string, array, or object to be encoded. | |
223 | - * see argument 1 to Services_JSON() above for array-parsing behavior. | |
224 | - * if var is a strng, note that encode() always expects it | |
225 | - * to be in ASCII or UTF-8 format! | |
226 | - * | |
227 | - * @return string JSON string representation of input var | |
228 | - * @access public | |
229 | - */ | |
230 | - function encode($var) | |
231 | - { | |
232 | - switch (gettype($var)) { | |
233 | - case 'boolean': | |
234 | - return $var ? 'true' : 'false'; | |
235 | - | |
236 | - case 'NULL': | |
237 | - return 'null'; | |
238 | - | |
239 | - case 'integer': | |
240 | - return (int) $var; | |
241 | - | |
242 | - case 'double': | |
243 | - case 'float': | |
244 | - return (float) $var; | |
245 | - | |
246 | - case 'string': | |
247 | - $arg = $var; | |
248 | - $l = strlen($var); | |
249 | - $s = '"'; | |
250 | - | |
251 | - for ($i = 0; $i < $l; $i++) { | |
252 | - $c = $var{$i}; | |
253 | - | |
254 | - if (ord($c) >= ord(' ')) { | |
255 | - | |
256 | - if ($c == '\\' | |
257 | - || $c == '"') { | |
258 | - | |
259 | - $s .= '\\'; | |
260 | - } | |
261 | - $s .= $c; | |
262 | - | |
263 | - } else { | |
264 | - | |
265 | - switch ($c) { | |
266 | - | |
267 | - case '\b': | |
268 | - $s .= '\\b'; | |
269 | - break; | |
270 | - | |
271 | - case '\f': | |
272 | - $s .= '\\f'; | |
273 | - break; | |
274 | - | |
275 | - case '\n': | |
276 | - $s .= '\\n'; | |
277 | - break; | |
278 | - | |
279 | - case '\r': | |
280 | - $s .= '\\r'; | |
281 | - break; | |
282 | - | |
283 | - case '\t': | |
284 | - $s .= '\\t'; | |
285 | - break; | |
286 | - | |
287 | - default: | |
288 | - $s .= '\u00' . sprintf('%02x', ord($c)); | |
289 | - } | |
290 | - } | |
291 | - } | |
292 | - return $s . '"'; | |
293 | - break; | |
294 | - | |
295 | - | |
296 | - case 'array': | |
297 | - /* | |
298 | - * As per JSON spec if any array key is not an integer | |
299 | - * we must treat the the whole array as an object. We | |
300 | - * also try to catch a sparsely populated associative | |
301 | - * array with numeric keys here because some JS engines | |
302 | - * will create an array with empty indexes up to | |
303 | - * max_index which can cause memory issues and because | |
304 | - * the keys, which may be relevant, will be remapped | |
305 | - * otherwise. | |
306 | - * | |
307 | - * As per the ECMA and JSON specification an object may | |
308 | - * have any string as a property. Unfortunately due to | |
309 | - * a hole in the ECMA specification if the key is a | |
310 | - * ECMA reserved word or starts with a digit the | |
311 | - * parameter is only accessible using ECMAScript's | |
312 | - * bracket notation. | |
313 | - */ | |
314 | - | |
315 | - // treat as a JSON object | |
316 | - if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { | |
317 | - return "{/*Array*/" . | |
318 | - join(',', array_map(array($this, 'name_value'), | |
319 | - array_keys($var), | |
320 | - array_values($var))) | |
321 | - . '}'; | |
322 | - } | |
323 | - | |
324 | - // treat it like a regular array | |
325 | - return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']'; | |
326 | - | |
327 | - case 'object': | |
328 | - $vars = get_object_vars($var); | |
329 | - return '{' . | |
330 | - join(',', array_map(array($this, 'name_value'), | |
331 | - array_keys($vars), | |
332 | - array_values($vars))) | |
333 | - . '}'; | |
334 | - | |
335 | - default: | |
336 | - return ''; | |
337 | - } | |
338 | - } | |
339 | - | |
340 | - /** | |
341 | - * array-walking function for use in generating JSON-formatted name-value pairs | |
342 | - * | |
343 | - * @param string $name name of key to use | |
344 | - * @param mixed $value reference to an array element to be encoded | |
345 | - * | |
346 | - * @return string JSON-formatted name-value pair, like '"name":value' | |
347 | - * @access private | |
348 | - */ | |
349 | - function name_value($name, $value) | |
350 | - { | |
351 | - return $this->encode(strval($name)) . ':' . $this->encode($value); | |
352 | - } | |
353 | - | |
354 | - /** | |
355 | - * reduce a string by removing leading and trailing comments and whitespace | |
356 | - * | |
357 | - * @param $str string string value to strip of comments and whitespace | |
358 | - * | |
359 | - * @return string string value stripped of comments and whitespace | |
360 | - * @access private | |
361 | - */ | |
362 | - function reduce_string($str) | |
363 | - { | |
364 | - $str = preg_replace(array( | |
365 | - | |
366 | - // eliminate single line comments in '// ...' form | |
367 | - '#^\s*//(.+)$#m', | |
368 | - | |
369 | - // eliminate multi-line comments in '/* ... */' form, at start of string | |
370 | - '#^\s*/\*(.+)\*/#Us', | |
371 | - | |
372 | - // eliminate multi-line comments in '/* ... */' form, at end of string | |
373 | - '#/\*(.+)\*/\s*$#Us' | |
374 | - | |
375 | - ), '', $str); | |
376 | - | |
377 | - // eliminate extraneous space | |
378 | - return trim($str); | |
379 | - } | |
380 | - | |
381 | - /** | |
382 | - * decodes a JSON string into appropriate variable | |
383 | - * | |
384 | - * @param string $str JSON-formatted string | |
385 | - * | |
386 | - * @return mixed number, boolean, string, array, or object | |
387 | - * corresponding to given JSON input string. | |
388 | - * See argument 1 to Services_JSON() above for object-output behavior. | |
389 | - * Note that decode() always returns strings | |
390 | - * in ASCII or UTF-8 format! | |
391 | - * @access public | |
392 | - */ | |
393 | - function decode($str) | |
394 | - { | |
395 | - $imarray = false; | |
396 | - $str = $this->reduce_string($str); | |
397 | - | |
398 | - switch (strtolower($str)) { | |
399 | - case 'true': | |
400 | - return true; | |
401 | - | |
402 | - case 'false': | |
403 | - return false; | |
404 | - | |
405 | - case 'null': | |
406 | - return null; | |
407 | - | |
408 | - default: | |
409 | - if (is_numeric($str)) { | |
410 | - // Lookie-loo, it's a number | |
411 | - | |
412 | - // This would work on its own, but I'm trying to be | |
413 | - // good about returning integers where appropriate: | |
414 | - // return (float)$str; | |
415 | - | |
416 | - // Return float or int, as appropriate | |
417 | - return ((float)$str == (integer)$str) | |
418 | - ? (integer)$str | |
419 | - : (float)$str; | |
420 | - | |
421 | - } elseif (preg_match('/^("|\').+(\1)$/s', $str, $m) && $m[1] == $m[2]) { | |
422 | - // STRINGS RETURNED IN UTF-8 FORMAT | |
423 | - $delim = substr($str, 0, 1); | |
424 | - $chrs = substr($str, 1, -1); | |
425 | - $utf8 = ''; | |
426 | - $strlen_chrs = strlen($chrs); | |
427 | - | |
428 | - for ($c = 0; $c < $strlen_chrs; ++$c) { | |
429 | - | |
430 | - $substr_chrs_c_2 = substr($chrs, $c, 2); | |
431 | - $ord_chrs_c = ord($chrs{$c}); | |
432 | - | |
433 | - switch (true) { | |
434 | - case $substr_chrs_c_2 == '\b': | |
435 | - $utf8 .= chr(0x08); | |
436 | - ++$c; | |
437 | - break; | |
438 | - case $substr_chrs_c_2 == '\t': | |
439 | - $utf8 .= chr(0x09); | |
440 | - ++$c; | |
441 | - break; | |
442 | - case $substr_chrs_c_2 == '\n': | |
443 | - $utf8 .= chr(0x0A); | |
444 | - ++$c; | |
445 | - break; | |
446 | - case $substr_chrs_c_2 == '\f': | |
447 | - $utf8 .= chr(0x0C); | |
448 | - ++$c; | |
449 | - break; | |
450 | - case $substr_chrs_c_2 == '\r': | |
451 | - $utf8 .= chr(0x0D); | |
452 | - ++$c; | |
453 | - break; | |
454 | - | |
455 | - case $substr_chrs_c_2 == '\\"': | |
456 | - case $substr_chrs_c_2 == '\\\'': | |
457 | - case $substr_chrs_c_2 == '\\\\': | |
458 | - case $substr_chrs_c_2 == '\\/': | |
459 | - if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || | |
460 | - ($delim == "'" && $substr_chrs_c_2 != '\\"')) { | |
461 | - $utf8 .= $chrs{++$c}; | |
462 | - } | |
463 | - break; | |
464 | - | |
465 | - case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): | |
466 | - // single, escaped unicode character | |
467 | - $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) | |
468 | - . chr(hexdec(substr($chrs, ($c + 4), 2))); | |
469 | - $utf8 .= $this->utf162utf8($utf16); | |
470 | - $c += 5; | |
471 | - break; | |
472 | - | |
473 | - case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): | |
474 | - $utf8 .= $chrs{$c}; | |
475 | - break; | |
476 | - | |
477 | - case ($ord_chrs_c & 0xE0) == 0xC0: | |
478 | - // characters U-00000080 - U-000007FF, mask 110XXXXX | |
479 | - //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
480 | - $utf8 .= substr($chrs, $c, 2); | |
481 | - ++$c; | |
482 | - break; | |
483 | - | |
484 | - case ($ord_chrs_c & 0xF0) == 0xE0: | |
485 | - // characters U-00000800 - U-0000FFFF, mask 1110XXXX | |
486 | - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
487 | - $utf8 .= substr($chrs, $c, 3); | |
488 | - $c += 2; | |
489 | - break; | |
490 | - | |
491 | - case ($ord_chrs_c & 0xF8) == 0xF0: | |
492 | - // characters U-00010000 - U-001FFFFF, mask 11110XXX | |
493 | - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
494 | - $utf8 .= substr($chrs, $c, 4); | |
495 | - $c += 3; | |
496 | - break; | |
497 | - | |
498 | - case ($ord_chrs_c & 0xFC) == 0xF8: | |
499 | - // characters U-00200000 - U-03FFFFFF, mask 111110XX | |
500 | - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
501 | - $utf8 .= substr($chrs, $c, 5); | |
502 | - $c += 4; | |
503 | - break; | |
504 | - | |
505 | - case ($ord_chrs_c & 0xFE) == 0xFC: | |
506 | - // characters U-04000000 - U-7FFFFFFF, mask 1111110X | |
507 | - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 | |
508 | - $utf8 .= substr($chrs, $c, 6); | |
509 | - $c += 5; | |
510 | - break; | |
511 | - | |
512 | - } | |
513 | - | |
514 | - } | |
515 | - | |
516 | - return $utf8; | |
517 | - | |
518 | - } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { | |
519 | - // array, or object notation | |
520 | - | |
521 | - if ($str{0} == '[') { | |
522 | - $stk = array(SERVICES_JSON_IN_ARR); | |
523 | - $arr = array(); | |
524 | - } else { | |
525 | - if ($str{1} == '/' && $str{2} == '*' && $str{3} == 'A') | |
526 | - { | |
527 | - $stk = array(SERVICES_JSON_IN_OBJ); | |
528 | - $obj = array(); | |
529 | - | |
530 | - } | |
531 | - else | |
532 | - { | |
533 | - if ($this->use == SERVICES_JSON_LOOSE_TYPE) { | |
534 | - $stk = array(SERVICES_JSON_IN_OBJ); | |
535 | - $obj = array(); | |
536 | - | |
537 | - } else { | |
538 | - $stk = array(SERVICES_JSON_IN_OBJ); | |
539 | - $obj = new stdClass(); | |
540 | - } | |
541 | - } | |
542 | - } | |
543 | - | |
544 | - array_push($stk, array('what' => SERVICES_JSON_SLICE, | |
545 | - 'where' => 0, | |
546 | - 'delim' => false)); | |
547 | - | |
548 | - $chrs = substr($str, 1, -1); | |
549 | - $chrs = $this->reduce_string($chrs); | |
550 | - | |
551 | - if ($chrs == '') { | |
552 | - if (reset($stk) == SERVICES_JSON_IN_ARR) { | |
553 | - return $arr; | |
554 | - | |
555 | - } else { | |
556 | - return $obj; | |
557 | - | |
558 | - } | |
559 | - } | |
560 | - | |
561 | - //print("\nparsing {$chrs}\n"); | |
562 | - | |
563 | - $strlen_chrs = strlen($chrs); | |
564 | - | |
565 | - for ($c = 0; $c <= $strlen_chrs; ++$c) { | |
566 | - | |
567 | - $top = end($stk); | |
568 | - $substr_chrs_c_2 = substr($chrs, $c, 2); | |
569 | - | |
570 | - if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { | |
571 | - // found a comma that is not inside a string, array, etc., | |
572 | - // OR we've reached the end of the character list | |
573 | - $slice = substr($chrs, $top['where'], ($c - $top['where'])); | |
574 | - array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); | |
575 | - //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); | |
576 | - | |
577 | - if (reset($stk) == SERVICES_JSON_IN_ARR) { | |
578 | - // we are in an array, so just push an element onto the stack | |
579 | - array_push($arr, $this->decode($slice)); | |
580 | - | |
581 | - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { | |
582 | - // we are in an object, so figure | |
583 | - // out the property name and set an | |
584 | - // element in an associative array, | |
585 | - // for now | |
586 | - if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { | |
587 | - // "name":value pair | |
588 | - $key = $this->decode($parts[1]); | |
589 | - $val = $this->decode($parts[2]); | |
590 | - | |
591 | - if ($this->use == SERVICES_JSON_LOOSE_TYPE || is_array($obj)) { | |
592 | - $obj[$key] = $val; | |
593 | - } else { | |
594 | - $obj->$key = $val; | |
595 | - } | |
596 | - } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { | |
597 | - // name:value pair, where name is unquoted | |
598 | - $key = $parts[1]; | |
599 | - $val = $this->decode($parts[2]); | |
600 | - if ($this->use == SERVICES_JSON_LOOSE_TYPE|| is_array($obj)) { | |
601 | - $obj[$key] = $val; | |
602 | - } else { | |
603 | - $obj->$key = $val; | |
604 | - } | |
605 | - } | |
606 | - | |
607 | - } | |
608 | - | |
609 | - } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { | |
610 | - // found a quote, and we are not inside a string | |
611 | - array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); | |
612 | - //print("Found start of string at {$c}\n"); | |
613 | - | |
614 | - } elseif (($chrs{$c} == $top['delim']) && | |
615 | - ($top['what'] == SERVICES_JSON_IN_STR) && | |
616 | - (($chrs{$c - 1} != '\\') || | |
617 | - ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) { | |
618 | - // found a quote, we're in a string, and it's not escaped | |
619 | - array_pop($stk); | |
620 | - //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); | |
621 | - | |
622 | - } elseif (($chrs{$c} == '[') && | |
623 | - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { | |
624 | - // found a left-bracket, and we are in an array, object, or slice | |
625 | - array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); | |
626 | - //print("Found start of array at {$c}\n"); | |
627 | - | |
628 | - } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { | |
629 | - // found a right-bracket, and we're in an array | |
630 | - array_pop($stk); | |
631 | - //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); | |
632 | - | |
633 | - } elseif (($chrs{$c} == '{') && | |
634 | - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { | |
635 | - // found a left-brace, and we are in an array, object, or slice | |
636 | - array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); | |
637 | - //print("Found start of object at {$c}\n"); | |
638 | - | |
639 | - } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { | |
640 | - // found a right-brace, and we're in an object | |
641 | - array_pop($stk); | |
642 | - | |
643 | - //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); | |
644 | - | |
645 | - } | |
646 | - | |
647 | - } | |
648 | - | |
649 | - if (reset($stk) == SERVICES_JSON_IN_ARR) { | |
650 | - return $arr; | |
651 | - | |
652 | - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { | |
653 | - return $obj; | |
654 | - | |
655 | - } | |
656 | - | |
657 | - } | |
658 | - } | |
659 | - } | |
660 | - | |
661 | -} | |
662 | - | |
663 | -?> | |
664 | 0 | \ No newline at end of file |
classesjs/cpaint/JSON/testsuite.php
... | ... | @@ -1,351 +0,0 @@ |
1 | -<?php | |
2 | -/** | |
3 | -* The content of this file is (c) 2003-2005 digital media center GmbH | |
4 | -* All rights reserved | |
5 | -* | |
6 | -* JSON parser / generator test | |
7 | -* | |
8 | -* @package JSON | |
9 | -* @access public | |
10 | -* @copyright (c) 2003-2005 digital media center GmbH, all rights reserved | |
11 | -* @author Dominique Stender <dst@dmc.de> | |
12 | -*/ | |
13 | - | |
14 | -//---- includes ---------------------------------------------------------------- | |
15 | - /** | |
16 | - * @include JSON | |
17 | - */ | |
18 | - require_once('../json.php'); | |
19 | - | |
20 | -//---- class ------------------------------------------------------------------- | |
21 | - class MyObj { | |
22 | - var $id = ''; | |
23 | - var $name = ''; | |
24 | - var $attribs = array("first",'4'); | |
25 | - | |
26 | - function setId($id) { | |
27 | - $this->id = $id; | |
28 | - } | |
29 | - | |
30 | - function getId() { | |
31 | - return $this->id; | |
32 | - } | |
33 | - | |
34 | - function setName($name) { | |
35 | - $this->name = $name; | |
36 | - } | |
37 | - | |
38 | - function getName() { | |
39 | - return $this->name; | |
40 | - } | |
41 | - } | |
42 | - | |
43 | -//---- variables --------------------------------------------------------------- | |
44 | - $JSON = new JSON(); | |
45 | - $myObj = new MyObj(); | |
46 | - | |
47 | -//---- logic ------------------------------------------------------------------- | |
48 | - /* initialize object */ | |
49 | - $myObj->setId('Äl' . chr(18) . "ie\nn"); | |
50 | - $myObj->setName('objectName'); | |
51 | - array_push($myObj->attribs, 'øfirst'); | |
52 | - array_push($myObj->attribs, 'second'); | |
53 | - array_push($myObj->attribs, 3); | |
54 | - | |
55 | - /* create JSON representation */ | |
56 | - $jsonStr = $JSON->stringify($myObj); | |
57 | - | |
58 | -//---- clean-up ---------------------------------------------------------------- | |
59 | -//---- content ----------------------------------------------------------------- | |
60 | - | |
61 | -?><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | |
62 | -<head> | |
63 | - <title>JSON parser test</title> | |
64 | - <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> | |
65 | - <script type="text/javascript" src="json.js"></script> | |
66 | - <script type="text/javascript"> | |
67 | -JSON.arrayObj = new Array(); | |
68 | -JSON.parse2 = function (text) | |
69 | -{ | |
70 | - var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null|\/\*Array\*\/)\s*/, | |
71 | - token, | |
72 | - operator; | |
73 | - | |
74 | - function error(m, t) { | |
75 | - throw { | |
76 | - name: 'JSONError', | |
77 | - message: m, | |
78 | - text: t || operator || token | |
79 | - }; | |
80 | - } | |
81 | - | |
82 | - function next() { | |
83 | - if (text) { | |
84 | - var t = p.exec(text); | |
85 | - if (t) { | |
86 | - | |
87 | - if (t[2]) { | |
88 | - token = null; | |
89 | - operator = t[2]; | |
90 | - } else { | |
91 | - operator = null; | |
92 | - if(t[1].search (/^\/\*Array\*\/$/g) > -1) | |
93 | - { | |
94 | - token = function(){}; | |
95 | - } | |
96 | - else | |
97 | - { | |
98 | - try { | |
99 | - token = eval(t[1]); | |
100 | - } catch (e) { | |
101 | - error("Bad token", t[1]); | |
102 | - } | |
103 | - } | |
104 | - } | |
105 | - text = text.substring(t[0].length); | |
106 | - } else { | |
107 | - error("Unrecognized token", text); | |
108 | - } | |
109 | - } else { | |
110 | - token = operator = undefined; | |
111 | - } | |
112 | - } | |
113 | - | |
114 | - | |
115 | - function arr() { | |
116 | - var a = []; | |
117 | - | |
118 | - next(); | |
119 | - if (operator == ']') { | |
120 | - next(); | |
121 | - return a; | |
122 | - } | |
123 | - for (;;) { | |
124 | - a.push(val()); | |
125 | - switch (operator) { | |
126 | - case ']': | |
127 | - next(); | |
128 | - return a; | |
129 | - case ',': | |
130 | - next(); | |
131 | - break; | |
132 | - default: | |
133 | - error("Missing ']'"); | |
134 | - } | |
135 | - } | |
136 | - } | |
137 | - | |
138 | - function obj() { | |
139 | - var k, o = {}; | |
140 | - | |
141 | - next(); | |
142 | - if (operator == '}') { | |
143 | - next(); | |
144 | - return o; | |
145 | - } | |
146 | - if (typeof(token) == 'function') | |
147 | - { | |
148 | - o = []; | |
149 | - next(); | |
150 | - } | |
151 | - for (;;) | |
152 | - { | |
153 | - | |
154 | - | |
155 | - if (operator ||typeof token != 'string') { | |
156 | - error("Missing key"); | |
157 | - } | |
158 | - k = token; | |
159 | - next(); | |
160 | - | |
161 | - if (operator != ':') { | |
162 | - error("Missing ':'"); | |
163 | - } | |
164 | - | |
165 | - next(); | |
166 | - o[k] = val(); | |
167 | - | |
168 | - switch (operator) { | |
169 | - case '}': | |
170 | - next(); | |
171 | - return o; | |
172 | - case ',': | |
173 | - next(); | |
174 | - break; | |
175 | - case '#': | |
176 | - next(); | |
177 | - break; | |
178 | - default: | |
179 | - error("Missing '}'"); | |
180 | - } | |
181 | - } | |
182 | - } | |
183 | - | |
184 | - function val() { | |
185 | - switch (operator) { | |
186 | - case '{': | |
187 | - return obj(); | |
188 | - case '[': | |
189 | - return arr(); | |
190 | - default: | |
191 | - if (operator !== null) { | |
192 | - error("Missing value"); | |
193 | - } | |
194 | - var t = token; | |
195 | - next(); | |
196 | - return t; | |
197 | - } | |
198 | - } | |
199 | - next(); | |
200 | - return val(); | |
201 | -}; | |
202 | - | |
203 | -JSON.stringify2 = function(arg) | |
204 | -{ | |
205 | - var jsonstring = []; | |
206 | - var b = this; | |
207 | - function add(str) | |
208 | - { | |
209 | - jsonstring[jsonstring.length] = str; | |
210 | - } | |
211 | - function validObj(obj) | |
212 | - { | |
213 | - if (typeof(obj) != 'undefined' && typeof(obj) != 'function') | |
214 | - { | |
215 | - return true; | |
216 | - } | |
217 | - return false; | |
218 | - } | |
219 | - function recurse(obj, prefix) | |
220 | - { | |
221 | - switch (typeof(obj)) | |
222 | - { | |
223 | - case 'object': | |
224 | - if (obj) | |
225 | - { | |
226 | - var first = true; | |
227 | - if (obj.constructor == b.arrayObj.constructor) | |
228 | - { | |
229 | - add('{/*Array*/'); | |
230 | - //add ('{'); | |
231 | - } | |
232 | - else | |
233 | - { | |
234 | - add ('{'); | |
235 | - } | |
236 | - for (prop in obj) | |
237 | - { | |
238 | - if (validObj(obj[prop])) | |
239 | - { | |
240 | - if (!first) | |
241 | - { | |
242 | - add(','); | |
243 | - } | |
244 | - recurse(prop); | |
245 | - add(':'); | |
246 | - recurse (obj[prop]); | |
247 | - first =false; | |
248 | - } | |
249 | - } | |
250 | - return add ('}'); | |
251 | - } | |
252 | - return add('null'); | |
253 | - break; | |
254 | - case 'number': | |
255 | - return add(isFinite(obj) ? String(obj) : 'null'); | |
256 | - break; | |
257 | - case 'string': | |
258 | - l = obj.length; | |
259 | - add('"'); | |
260 | - for (i = 0; i < l; i += 1) { | |
261 | - c = obj.charAt(i); | |
262 | - if (c >= ' ') { | |
263 | - if (c == '\\' || c == '"') { | |
264 | - add('\\'); | |
265 | - } | |
266 | - add(c); | |
267 | - } else { | |
268 | - switch (c) { | |
269 | - case '\b': | |
270 | - add('\\b'); | |
271 | - break; | |
272 | - case '\f': | |
273 | - add('\\f'); | |
274 | - break; | |
275 | - case '\n': | |
276 | - add('\\n'); | |
277 | - break; | |
278 | - case '\r': | |
279 | - add('\\r'); | |
280 | - break; | |
281 | - case '\t': | |
282 | - add('\\t'); | |
283 | - break; | |
284 | - default: | |
285 | - c = c.charCodeAt(); | |
286 | - add('\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16)); | |
287 | - } | |
288 | - } | |
289 | - } | |
290 | - return add('"'); | |
291 | - break; | |
292 | - case 'boolean': | |
293 | - return add(String(obj)); | |
294 | - break; | |
295 | - default: | |
296 | - return add('null'); | |
297 | - break; | |
298 | - } | |
299 | - } | |
300 | - recurse(arg); | |
301 | - return jsonstring.join(''); | |
302 | -}; | |
303 | - </script> | |
304 | -</head> | |
305 | -<body> | |
306 | - <?php echo 'php JSONstr: ' . $jsonStr . "<br />\n"; ?> | |
307 | - <script type="text/javascript"> | |
308 | - <!-- | |
309 | - /* print JSON representation */ | |
310 | - var jsonStr = '<?php echo addslashes($jsonStr); ?>'; | |
311 | - | |
312 | - document.write('JavaScript JSONstr: ' + jsonStr); | |
313 | - | |
314 | - /* create another object from jsonStr */ | |
315 | - try | |
316 | - { | |
317 | - var myObj2 = JSON.parse(jsonStr); | |
318 | - | |
319 | - var myObj3 = JSON.parse2(jsonStr); | |
320 | - | |
321 | - | |
322 | - /* test the clone */ | |
323 | - document.write('<br /><br />Original JSON implementation'); | |
324 | - document.write('<br />id: ' + myObj2.id); | |
325 | - document.write('<br />name: ' + myObj2.name); | |
326 | - | |
327 | - for (var i = 0; i < myObj2.attribs.length; i++) { | |
328 | - document.write('<br />attrib[' + i + ']: ' + myObj2.attribs[i]); | |
329 | - } | |
330 | - document.write('<br /><br />new JSON implementation'); | |
331 | - document.write('<br />id: ' + myObj3.id); | |
332 | - document.write('<br />name: ' + myObj3.name); | |
333 | - | |
334 | - for (var i = 0; i < myObj3.attribs.length; i++) { | |
335 | - document.write('<br />attrib[' + i + ']: ' + myObj3.attribs[i]); | |
336 | - } | |
337 | - | |
338 | - /* convert newline to JSON */ | |
339 | - var nl = "\n" + String.fromCharCode(18); | |
340 | - document.write('<br /><br /> Original JSON <br />newline as JSON: ' + JSON.stringify(nl)); | |
341 | - document.write('<br /><br /> New JSON <br />newline as JSON: ' + JSON.stringify2(nl)); | |
342 | - | |
343 | - //--> | |
344 | -} | |
345 | - catch(e) | |
346 | - { | |
347 | - alert(e.message); | |
348 | - } | |
349 | - </script> | |
350 | -</body> | |
351 | -</html> | |
352 | 0 | \ No newline at end of file |
classesjs/cpaint/JSON/testsuite2.php
... | ... | @@ -1,413 +0,0 @@ |
1 | -<?php | |
2 | - | |
3 | -// New TestSuite | |
4 | -//---- includes ---------------------------------------------------------------- | |
5 | - /** | |
6 | - * @include JSON | |
7 | - */ | |
8 | - require_once('../json.php'); | |
9 | - require_once('json2.php'); | |
10 | - | |
11 | -// ----- PHP Test Objects | |
12 | -class object1 | |
13 | -{ | |
14 | - var $firstattr = 'firstvalue'; | |
15 | - var $foreignchars = "Äø\r\n"; | |
16 | - var $regarray = array("item1", "item2"); | |
17 | - var $assocarray = array("item1"=>"value1", "item2"=>"value2"); | |
18 | - var $boolean = true; | |
19 | - var $integer = 5; | |
20 | - var $float = 1.12; | |
21 | - var $innerobject; | |
22 | - function object1() | |
23 | - { | |
24 | - $this->innerobject = new object2(); | |
25 | - } | |
26 | -} | |
27 | -class object2 | |
28 | -{ | |
29 | - var $firstattr = 'firstvalue'; | |
30 | - var $secondattr = 'secondvalue'; | |
31 | -} | |
32 | -//---- variables --------------------------------------------------------------- | |
33 | - $JSON = new JSON(); | |
34 | - $object1 = new object1(); | |
35 | - $JSON2 = new Services_JSON(); | |
36 | - $submitted = false; | |
37 | -//---- logic ------------------------------------------------------------------- | |
38 | - $origjsonstring = $JSON->stringify($object1); | |
39 | - $newjsonstring = $JSON2->encode($object1); | |
40 | - $origjson = $_REQUEST["origjson"]; | |
41 | - if (!empty($origjson)) | |
42 | - { | |
43 | - $origjsonprintr = $JSON->parse(stripslashes($origjson)); | |
44 | - $submitted = true; | |
45 | - } | |
46 | - else | |
47 | - { | |
48 | - $origjsonprintr = "Not submitted"; | |
49 | - } | |
50 | - $newjson = $_REQUEST["newjson"]; | |
51 | - if (!empty($newjson)) | |
52 | - { | |
53 | - $newjsonprintr = $JSON2->decode(stripslashes($newjson)); | |
54 | - } | |
55 | - else | |
56 | - { | |
57 | - $newjsonprintr = "Not submitted"; | |
58 | - } | |
59 | - | |
60 | -//---- content ----------------------------------------------------------------- | |
61 | -?> | |
62 | -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | |
63 | -<head> | |
64 | - <title>JSON parser test</title> | |
65 | - <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> | |
66 | - <script type="text/javascript" src="json.js"></script> | |
67 | - <script type="text/javascript"> | |
68 | -JSON.arrayObj = new Array(); | |
69 | -JSON.parse2 = function (text) | |
70 | -{ | |
71 | - var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null|\/\*Array\*\/)\s*/, | |
72 | - token, | |
73 | - operator; | |
74 | - | |
75 | - function error(m, t) { | |
76 | - throw { | |
77 | - name: 'JSONError', | |
78 | - message: m, | |
79 | - text: t || operator || token | |
80 | - }; | |
81 | - } | |
82 | - | |
83 | - function next() { | |
84 | - if (text) { | |
85 | - var t = p.exec(text); | |
86 | - if (t) { | |
87 | - | |
88 | - if (t[2]) { | |
89 | - token = null; | |
90 | - operator = t[2]; | |
91 | - } else { | |
92 | - operator = null; | |
93 | - if(t[1].search (/^\/\*Array\*\/$/g) > -1) | |
94 | - { | |
95 | - token = function(){}; | |
96 | - } | |
97 | - else | |
98 | - { | |
99 | - try { | |
100 | - token = eval(t[1]); | |
101 | - } catch (e) { | |
102 | - error("Bad token", t[1]); | |
103 | - } | |
104 | - } | |
105 | - } | |
106 | - text = text.substring(t[0].length); | |
107 | - } else { | |
108 | - error("Unrecognized token", text); | |
109 | - } | |
110 | - } else { | |
111 | - token = operator = undefined; | |
112 | - } | |
113 | - } | |
114 | - | |
115 | - | |
116 | - function arr() { | |
117 | - var a = []; | |
118 | - | |
119 | - next(); | |
120 | - if (operator == ']') { | |
121 | - next(); | |
122 | - return a; | |
123 | - } | |
124 | - for (;;) { | |
125 | - a.push(val()); | |
126 | - switch (operator) { | |
127 | - case ']': | |
128 | - next(); | |
129 | - return a; | |
130 | - case ',': | |
131 | - next(); | |
132 | - break; | |
133 | - default: | |
134 | - error("Missing ']'"); | |
135 | - } | |
136 | - } | |
137 | - } | |
138 | - | |
139 | - function obj() { | |
140 | - var k, o = {}; | |
141 | - | |
142 | - next(); | |
143 | - if (operator == '}') { | |
144 | - next(); | |
145 | - return o; | |
146 | - } | |
147 | - if (typeof(token) == 'function') | |
148 | - { | |
149 | - o = []; | |
150 | - next(); | |
151 | - } | |
152 | - for (;;) | |
153 | - { | |
154 | - | |
155 | - | |
156 | - if (operator ||typeof token != 'string') { | |
157 | - error("Missing key"); | |
158 | - } | |
159 | - k = token; | |
160 | - next(); | |
161 | - | |
162 | - if (operator != ':') { | |
163 | - error("Missing ':'"); | |
164 | - } | |
165 | - | |
166 | - next(); | |
167 | - o[k] = val(); | |
168 | - | |
169 | - switch (operator) { | |
170 | - case '}': | |
171 | - next(); | |
172 | - return o; | |
173 | - case ',': | |
174 | - next(); | |
175 | - break; | |
176 | - case '#': | |
177 | - next(); | |
178 | - break; | |
179 | - default: | |
180 | - error("Missing '}'"); | |
181 | - } | |
182 | - } | |
183 | - } | |
184 | - | |
185 | - function val() { | |
186 | - switch (operator) { | |
187 | - case '{': | |
188 | - return obj(); | |
189 | - case '[': | |
190 | - return arr(); | |
191 | - default: | |
192 | - if (operator !== null) { | |
193 | - error("Missing value"); | |
194 | - } | |
195 | - var t = token; | |
196 | - next(); | |
197 | - return t; | |
198 | - } | |
199 | - } | |
200 | - next(); | |
201 | - return val(); | |
202 | -}; | |
203 | - | |
204 | -JSON.stringify2 = function(arg) | |
205 | -{ | |
206 | - var jsonstring = []; | |
207 | - var b = this; | |
208 | - function add(str) | |
209 | - { | |
210 | - jsonstring[jsonstring.length] = str; | |
211 | - } | |
212 | - function validObj(obj) | |
213 | - { | |
214 | - if (typeof(obj) != 'undefined' && typeof(obj) != 'function') | |
215 | - { | |
216 | - return true; | |
217 | - } | |
218 | - return false; | |
219 | - } | |
220 | - function recurse(obj, prefix) | |
221 | - { | |
222 | - switch (typeof(obj)) | |
223 | - { | |
224 | - case 'object': | |
225 | - if (obj) | |
226 | - { | |
227 | - var first = true; | |
228 | - if (obj.constructor == b.arrayObj.constructor) | |
229 | - { | |
230 | - add('{/*Array*/'); | |
231 | - //add ('{'); | |
232 | - } | |
233 | - else | |
234 | - { | |
235 | - add ('{'); | |
236 | - } | |
237 | - for (prop in obj) | |
238 | - { | |
239 | - if (validObj(obj[prop])) | |
240 | - { | |
241 | - if (!first) | |
242 | - { | |
243 | - add(','); | |
244 | - } | |
245 | - recurse(prop); | |
246 | - add(':'); | |
247 | - recurse (obj[prop]); | |
248 | - first =false; | |
249 | - } | |
250 | - } | |
251 | - return add ('}'); | |
252 | - } | |
253 | - return add('null'); | |
254 | - break; | |
255 | - case 'number': | |
256 | - return add(isFinite(obj) ? String(obj) : 'null'); | |
257 | - break; | |
258 | - case 'string': | |
259 | - l = obj.length; | |
260 | - add('"'); | |
261 | - for (i = 0; i < l; i += 1) { | |
262 | - c = obj.charAt(i); | |
263 | - if (c >= ' ') { | |
264 | - if (c == '\\' || c == '"') { | |
265 | - add('\\'); | |
266 | - } | |
267 | - add(c); | |
268 | - } else { | |
269 | - switch (c) { | |
270 | - case '\b': | |
271 | - add('\\b'); | |
272 | - break; | |
273 | - case '\f': | |
274 | - add('\\f'); | |
275 | - break; | |
276 | - case '\n': | |
277 | - add('\\n'); | |
278 | - break; | |
279 | - case '\r': | |
280 | - add('\\r'); | |
281 | - break; | |
282 | - case '\t': | |
283 | - add('\\t'); | |
284 | - break; | |
285 | - default: | |
286 | - c = c.charCodeAt(); | |
287 | - add('\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16)); | |
288 | - } | |
289 | - } | |
290 | - } | |
291 | - return add('"'); | |
292 | - break; | |
293 | - case 'boolean': | |
294 | - return add(String(obj)); | |
295 | - break; | |
296 | - default: | |
297 | - return add('null'); | |
298 | - break; | |
299 | - } | |
300 | - } | |
301 | - recurse(arg); | |
302 | - return jsonstring.join(''); | |
303 | -}; | |
304 | - </script> | |
305 | -</head> | |
306 | -<body> | |
307 | - <table width="100%"> | |
308 | - <tr> | |
309 | - <td> | |
310 | - <table width="100%"> | |
311 | - <caption>Original JSON PHP/Javascript</caption> | |
312 | - <tr> | |
313 | - <td> | |
314 | - Original PHP object (print_r) | |
315 | - <textarea rows="5" cols="50"><?php echo print_r($object1); ?></textarea> | |
316 | - </td> | |
317 | - </tr> | |
318 | - <tr> | |
319 | - <td>Result of PHP Stringify<br /><textarea rows="5" cols="50"><?php echo ($origjsonstring); ?></textarea></td> | |
320 | - </tr> | |
321 | - <tr> | |
322 | - <td>Did it Convert to a Javascript Object origjsobj ?<br /> | |
323 | - <script> | |
324 | - try | |
325 | - { | |
326 | - var origjsobj = JSON.parse('<?php echo addslashes($origjsonstring); ?>'); | |
327 | - document.write('Successful'); | |
328 | - } | |
329 | - catch(e) | |
330 | - { | |
331 | - document.write('Failed'); | |
332 | - document.write(' Original Parse Failed with this error "' + e.message + '"'); | |
333 | - } | |
334 | - </script> | |
335 | - <br /><button onclick="s=document.body.appendChild(document.createElement('script'));s.id='sst';s.language='javascript';void(s.src='http://snmp-dev.cableaz.com/beta/print_r_0_3.js');">Invoke Print_R</button> | |
336 | - </td> | |
337 | - </tr> | |
338 | - <tr> | |
339 | - <td>Result of Javascript Stringify<br /> | |
340 | - <script> | |
341 | - var origjsstr = JSON.stringify(origjsobj); | |
342 | - document.write('<textarea rows="5" cols="50">' + origjsstr + '</textarea>'); | |
343 | - </script> | |
344 | - </td> | |
345 | - </tr> | |
346 | - <tr> | |
347 | - <td> | |
348 | - Result of Conversion Back to PHP object (print_r) | |
349 | - <textarea rows="5" cols="50"><?php echo print_r($origjsonprintr); ?></textarea> | |
350 | - </td> | |
351 | - </tr> | |
352 | - </table> | |
353 | - </td> | |
354 | - <td> | |
355 | - <table width="100%"> | |
356 | - <caption>New JSON PHP/Javascript</caption> | |
357 | - <tr> | |
358 | - <td> | |
359 | - Original PHP object (print_r) | |
360 | - <textarea rows="5" cols="50"><?php echo print_r($object1); ?></textarea> | |
361 | - </td> | |
362 | - </tr> | |
363 | - <tr> | |
364 | - <td>Result of PHP Stringify<br /><textarea rows="5" cols="50"><?php echo ($newjsonstring); ?></textarea></td> | |
365 | - </tr> | |
366 | - <tr> | |
367 | - <td>Did it Convert to a Javascript Object newjsobj ?<br /> | |
368 | - <script> | |
369 | - try | |
370 | - { | |
371 | - var newjsobj = JSON.parse2('<?php echo addslashes($newjsonstring); ?>'); | |
372 | - document.write('Successful'); | |
373 | - } | |
374 | - catch(e) | |
375 | - { | |
376 | - document.write('Failed'); | |
377 | - document.write(' New Parse Failed with this error "' + e.message + '"'); | |
378 | - } | |
379 | - </script> | |
380 | - <br /><button onclick="s=document.body.appendChild(document.createElement('script'));s.id='sst';s.language='javascript';void(s.src='http://snmp-dev.cableaz.com/beta/print_r_0_3.js');">Invoke Print_R</button> | |
381 | - </td> | |
382 | - </tr> | |
383 | - <tr> | |
384 | - <td>Result of Javascript Stringify<br /> | |
385 | - <script> | |
386 | - var newjsstr = JSON.stringify2(newjsobj); | |
387 | - document.write('<textarea rows="5" cols="50">' + newjsstr + '</textarea>'); | |
388 | - </script> | |
389 | - </td> | |
390 | - </tr> | |
391 | - <tr> | |
392 | - <td> | |
393 | - Result of Conversion Back to PHP object (print_r) | |
394 | - <textarea rows="5" cols="50"><?php echo print_r($newjsonprintr); ?></textarea> | |
395 | - </td> | |
396 | - </tr> | |
397 | - </table> | |
398 | - </td> | |
399 | - </table> | |
400 | -<form method="GET" action="testsuite2.php" id="hiddenform"> | |
401 | - <script> | |
402 | - document.write ('<input name="origjson" type="hidden" value=\'' + origjsstr + '\' />'); | |
403 | - document.write ('<input name="newjson" type="hidden" value=\'' + newjsstr + '\' />'); | |
404 | - <?php | |
405 | - if (!$submitted) | |
406 | - { | |
407 | - echo "document.getElementById('hiddenform').submit();"; | |
408 | - } | |
409 | - ?> | |
410 | - </script> | |
411 | -</form> | |
412 | -</body> | |
413 | -</html> | |
414 | 0 | \ No newline at end of file |
classesjs/cpaint/changelog.txt
... | ... | @@ -1,134 +0,0 @@ |
1 | -CPAINT changelog | |
2 | - | |
3 | -//---- v2.0.3 (Released Feburary 8, 2006) -------------------------- | |
4 | -- PHP: nixed potential security hole with invalid response types | |
5 | - (Thanks to James Bercegay) | |
6 | - | |
7 | -//---- v2.0.2 (Released January 20, 2006) -------------------------- | |
8 | -- JS: check HTTP response code and throw an error if request was | |
9 | - not accepted by server. (thanks gloomyandy) | |
10 | -- JS: allowing the underscore in node names. | |
11 | -- JS: added support for the passing of arrays and objects to the | |
12 | - backend. | |
13 | -- JS: added X-Powered-By request header. | |
14 | -- JS: node names, attribute names and -values from backend are now | |
15 | - expected to be valid ISO-8859-1. | |
16 | -- JS: fixed wrong initialization of the data property to int zero in | |
17 | - class cpaint_result_object. | |
18 | -- JS: removed unneccessary setter() methods from internal classes | |
19 | - to reduce size. | |
20 | -- JS: added debugging level cp.set_debug(-1) to suppress errors. | |
21 | -- JS: fixed type conversion issue where non-empty, pure whitespace | |
22 | - strings where interpreted as numbers. | |
23 | -- JS: fixed problem with callback being called twice. | |
24 | - (thanks to Lance Rushing) | |
25 | -- JS: fixed problem with URLs with existing GET parameters. | |
26 | - (thanks to Nelson Antunes) | |
27 | -- JS / PHP: added support for JSON as response type. | |
28 | -- JS / PHP: added support for E4X as response type. | |
29 | -- PHP: added cpaint::unregister() | |
30 | -- PHP: added cpaint::get_response_type(); | |
31 | -- PHP: removed a bug in JSON library that prevented the generation of valid JSON | |
32 | - when including a leading zero character. | |
33 | -- PHP: Removed unneccessary unescaping of parameters in proxy script. | |
34 | -- PHP: added support for array and object parameters from JavaScript (JSON!). | |
35 | -- PHP: added X-Powered-By response header. | |
36 | -- PHP: removed encoding of node names, attribute names and attribute | |
37 | - values to UTF-8 if possible. those values must now be valid | |
38 | - ISO-8859-1. | |
39 | -- PHP: removed output buffer to make it possible to include backend | |
40 | - and frontend in the same file. | |
41 | -- PHP: fixed error output (a function was called...) when no | |
42 | - parameters where sent to CPAINT indicating a function call, thus | |
43 | - making it possible to include backend and frontend in the same file | |
44 | - (thanks S. Alexandre M. Lemaire) | |
45 | -- PHP: added backend debugger code to main source tree & documentation. | |
46 | -- PHP: secured proxy utility (see documentation). | |
47 | -- PHP: added backend configuration file (for proxy security and future use) | |
48 | -- ASP: removed from distribution to focus on PHP and other ports. | |
49 | - | |
50 | -//---- v2.0.1 (Released September 5, 2005) -------------------------- | |
51 | -- JS: added the returning of plain-text response when using XML|OBJECT | |
52 | - response type as second parameter to user-defined callback function | |
53 | - (thanks Gunther) | |
54 | -- JS: added cpaint.capable property to determine AJAX-compatible | |
55 | - browsers | |
56 | -- JS: cleaned up CPAINT parameters when not using CPAINT API w/ proxy | |
57 | -- PHP: fixed callability of object methods (thanks Markus Wolf) | |
58 | -- PHP: fixed HTTP authentication in proxy file | |
59 | -- ASP: improved security regarding incoming function arguments | |
60 | - | |
61 | -//---- v2.0 (Released August 20, 2005) ------------------------------ | |
62 | -- completely rewrote the JavaScript frontend. | |
63 | - - 100% OOP approach. | |
64 | - - completely configurable through setter methods. | |
65 | - - support for syncronized calls (SJAX?) ;-). | |
66 | - - automatic XML parsing into JavaScript document structure if | |
67 | - response_type='object'. | |
68 | - - support for arbitrary character sets, including non-printable | |
69 | - characters. | |
70 | - - automatic detection and conversion of numeric data into | |
71 | - integers / floats. | |
72 | - - unified use of call() for local and remote targets. | |
73 | - - can now use frontend to retrieve static files or backend | |
74 | - functions not implemented with CPAINT | |
75 | - - use of a single (persistent) connection for multiple calls. | |
76 | - - XML to JavaScript parser is able to parse any XML structure now. | |
77 | - - support for XML attributes. | |
78 | - - added find_item_by_type() to cpaint_result_object. | |
79 | - - added get_attribute(), set_attribute() to cpaint_result_object. | |
80 | - - improved debugging, added debuglevels 1, 2. see set_debug() | |
81 | - | |
82 | -- completely rewrote the PHP and ASP backends. | |
83 | - - 100% OOP approach. | |
84 | - - protection against remote code-execution. | |
85 | - - support for object methods as callable functions. | |
86 | - - nested XML support through composite pattern. | |
87 | - - arbitrary XML structure creation support. | |
88 | - - support for arbitrary character sets. | |
89 | - - replaced remote code-execution blacklisting approach of v1.3-SP | |
90 | - with whitelisting through cpaint.register(). | |
91 | - - changed XML name convention. Attributes and tagnames are send | |
92 | - as-is, not in uppercase. | |
93 | - | |
94 | -- improved readability of the ASP and PHP proxy utilities. | |
95 | - - fixed GET requests. | |
96 | - - proxy now uses attributenames identical to the CPAINT backend | |
97 | - itself whenever possible. | |
98 | - - added support for target ports other than 80. | |
99 | - - added support for Basic Authentication. | |
100 | - - completely redesigned and rewritten documentation! | |
101 | - | |
102 | -//---- v1.3-SP2 (Released August 16, 2005) -------------------------- | |
103 | -- improved the remote-code execution fix. | |
104 | - | |
105 | -//---- v1.3-SP (Released August 15, 2005) --------------------------- | |
106 | -- fixed a remote code-execution vulnerability on the backend by | |
107 | - adding a blacklist test on the function name passed by the | |
108 | - frontend. | |
109 | - | |
110 | -//---- v1.3 (Released July 10, 2005) -------------------------------- | |
111 | -- rewrote cpaint_parse_ajax_xml() to be able to parse arbitrary XML. | |
112 | -- added bugfix from v1.01 to cpaint_get_remote_file() as well. | |
113 | - | |
114 | -//---- v1.2 (Released June 20, 2005) -------------------------------- | |
115 | -- added method cpaint_parse_ajax_xml() to the JavaScript frontend for | |
116 | - primitive XML to JavaScript transformation of response data. | |
117 | - | |
118 | -//---- v1.01 (Released June 16, 2005) ------------------------------- | |
119 | -- bugfix regarding Unicode character encoding in cpaint_call(). | |
120 | - | |
121 | -//---- v1.0 (Released June 13, 2005) -------------------------------- | |
122 | -- added support for XML/DOM document object returns. | |
123 | -- added support for XML on the backend. | |
124 | -- added proxy files for accessing remote functions & data. | |
125 | -- greatly improved documentation & examples. | |
126 | -- code stablized | |
127 | -- development effort moved to SourceForge.Net | |
128 | - | |
129 | -//---- Pre-1.0 Releases and Dates ----------------------------------- | |
130 | -- v0.7 - released June 8, 2005 | |
131 | -- v0.5 & 0.6 - released June 6, 2005 | |
132 | -- v0.4 - released June 3, 2005 | |
133 | -- v0.2 & 0.3 - released June 2, 2005 | |
134 | -- v0.1 - released May 31, 2005 (first release) |
classesjs/cpaint/cpaint2.backend-debugger.php
... | ... | @@ -1,104 +0,0 @@ |
1 | -<? | |
2 | -/* | |
3 | - CPAINT Backend Debug Interface | |
4 | - | |
5 | - released under the terms of the GPL | |
6 | - see http://www.fsf.org/licensing/licenses/gpl.txt for details | |
7 | - | |
8 | - @package CPAINT | |
9 | - @access public | |
10 | - @author Paul Sullivan <wiley14@gmail.com> | |
11 | - @author Stephan Tijink <stijink@googlemail.com> | |
12 | - @copyright Copyright (c) 2005-2006 Paul Sullivan - http://sf.net/projects/cpaint | |
13 | - @version 2.0.3 | |
14 | -*/ | |
15 | - | |
16 | -if (!(isset($_REQUEST["cpaint_function"]))) { | |
17 | - $debug_html_start = ' | |
18 | - <html><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | |
19 | - <title>CPAINT Debug Interface</title> | |
20 | - <style type="text/css">body { background-color: #9999CC; margin-top: 0px; } | |
21 | - .style3 { font-family: Arial, Helvetica, sans-serif; font-size: 12px; } | |
22 | - .style4 { font-size: 20px; color: #FFFFFF; font-family: Arial, Helvetica, sans-serif;} | |
23 | - .style5 { font-size: 16px; color: #FFFFFF; font-family: Arial, Helvetica, sans-serif; font-weight: bold; } | |
24 | - .style6 { font-size: 12px; color: #FFFFFF; font-family: Arial, Helvetica, sans-serif; font-weight: bold; } | |
25 | - div, iframe { margin: 0px; border: 1px solid #9999CC; } | |
26 | - </style> | |
27 | - <script type="text/javascript"> | |
28 | - function showForm(divId) { | |
29 | - if (document.getElementById(divId).style.display == "block") { | |
30 | - document.getElementById(divId).style.display = "none"; | |
31 | - } else { | |
32 | - document.getElementById(divId).style.display = "block"; | |
33 | - } | |
34 | - } | |
35 | - </script> | |
36 | - </head> | |
37 | - <body> | |
38 | - <table width="100%" border="0" cellspacing="0" cellpadding="0"> | |
39 | - <tr><td bgcolor="#9999CC"><div align="justify"><span class="style4">CPAINT Debug Interface</span></div></td></tr> | |
40 | - <tr><td bgcolor="#9999CC"><div align="justify"><span class="style6" style="color:#FFFFFF;">backend filename: '.$_SERVER["SCRIPT_NAME"].'</span></div></td></tr> | |
41 | - <tr><td height="10" bgcolor="#9999CC" class="style3"></td></tr> | |
42 | - <tr><td height="10" bgcolor="#9999CC" class="style3"></td></tr> | |
43 | - <tr><td bgcolor="#FFFFFF" class="style3"><blockquote>'; | |
44 | - $debug_html_end = "</blockquote></td></tr></table><br><iframe name=\"results\" class=\"style3\" width=\"100%\" height=\"100%\" scrolling=\"yes\" allowtransparency=\"false\" style=\"background-color: #FFFFFF\"></iframe></body></html>"; | |
45 | - | |
46 | - // get function names and function variables/values | |
47 | - $functionArray = getCallableCode(); | |
48 | - | |
49 | - $debug_body = ""; | |
50 | - if (count($functionArray) > 0) { | |
51 | - foreach ($functionArray as $func_name=>$func_variables) { | |
52 | - $debug_body = $debug_body . "<form method=\"get\" target=\"results\"><a href=\"javascript:showForm('" . $func_name . "_form');\">" . $func_name . "</a><div id=\"" . $func_name . "_form\" style=\"display: none;\">"; | |
53 | - | |
54 | - $debug_body = $debug_body . '<table border="0">'; | |
55 | - if ( count($func_variables) > 0) { | |
56 | - foreach ($func_variables as $var_name=>$var_preset) { | |
57 | - $debug_body = $debug_body . '<tr><td class="style3">Parameter (<strong>$'.$var_name.'</strong>):</td><td><input type="text" name="cpaint_argument[]"></td>'; | |
58 | - if (strlen($var_preset) > 0) { $debug_body = $debug_body . "<td class=\"style3\"> default value is <strong>".$var_preset." </strong></td>"; } | |
59 | - $debug_body = $debug_body . '</tr>'; | |
60 | - } | |
61 | - } | |
62 | - $debug_body = $debug_body . "<tr><td class=\"style3\">Response Type:</td><td><select name=\"cpaint_response_type\"><option>TEXT</option><option>XML</option><option>OBJECT</option></select></td></tr>"; | |
63 | - $debug_body = $debug_body . "<tr><td colspan=\"3\"><input type=\"hidden\" name=\"cpaint_function\" value=\"" . $func_name . "\"><input type=\"submit\"></td></tr></table></div></form>"; | |
64 | - } | |
65 | - } | |
66 | - | |
67 | - print($debug_html_start . $debug_body . $debug_html_end); | |
68 | - die(); | |
69 | -} | |
70 | - | |
71 | -function getCallableCode() { | |
72 | - $scriptName = $_SERVER['SCRIPT_FILENAME']; | |
73 | - $fileLines = file($scriptName); | |
74 | - for ($i=0; $i < sizeof($fileLines); $i++) { | |
75 | - $line = trim($fileLines[$i]); | |
76 | - if (substr($line, 0, 9) == "FUNCTION " || substr($line,0,9) == "function ") { | |
77 | - $match[] = $line; | |
78 | - } | |
79 | - } | |
80 | - for ($i = 0; $i < sizeof($match); $i++) { | |
81 | - $line = str_replace("function ", "", $match[$i]); | |
82 | - $line = str_replace("FUNCTION ", "", $line); | |
83 | - $line = str_replace("{", "", $line); | |
84 | - $parts = explode("(", $line); | |
85 | - $func_name = trim($parts[0]); | |
86 | - | |
87 | - $Tempargs = explode(")", $parts[1]); | |
88 | - $args = explode(",", $Tempargs[0]); | |
89 | - $argSize = sizeof($args); | |
90 | - | |
91 | - // check args for preset values | |
92 | - if ($argSize > 0) { | |
93 | - foreach ($args as $arg) { | |
94 | - $arg = trim ($arg); | |
95 | - $varArray = explode ("=", $arg); | |
96 | - $var_name = trim (str_replace ("$", "", $varArray["0"])); | |
97 | - $var_value = trim ($varArray["1"]); | |
98 | - $resultArray[$func_name][$var_name] = $var_value; | |
99 | - } | |
100 | - } | |
101 | - } | |
102 | - return $resultArray; | |
103 | -} | |
104 | -?> | |
105 | 0 | \ No newline at end of file |
classesjs/cpaint/cpaint2.config.php
... | ... | @@ -1,35 +0,0 @@ |
1 | -<? | |
2 | -/** | |
3 | -* CPAINT (Cross-Platform Asynchronous INterface Toolkit) | |
4 | -* | |
5 | -* http://sf.net/projects/cpaint | |
6 | -* | |
7 | -* released under the terms of the GPL | |
8 | -* see http://www.fsf.org/licensing/licenses/gpl.txt for details | |
9 | -* | |
10 | -* $Id$ | |
11 | -* $Log$ | |
12 | -* | |
13 | -* Configuration file for backend scripts, including proxy | |
14 | -* | |
15 | -* @package CPAINT | |
16 | -* @author Paul Sullivan <wiley14@gmail.com> | |
17 | -* @author Dominique Stender <dstender@st-webdevelopment.de> | |
18 | -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint | |
19 | -* @version 2.0.3 | |
20 | -*/ | |
21 | - | |
22 | -//---- proxy settings ---------------------------------------------------------- | |
23 | - $cpaint2_config["proxy.security.use_whitelist"] = true; | |
24 | - // Use the whitelist for allowed URLs? | |
25 | - | |
26 | -//---- proxy security whitelist ------------------------------------------------ | |
27 | - /* whitelist data should be added to the variable $cpaint2_proxy_whitelist[] | |
28 | - example: $cpaint2_proxy_whitelist[] = "example.com/test.php"; | |
29 | - - or - | |
30 | - example: $cpaint2_proxy_whitelist[] = "example.com"; | |
31 | - ** Omit http:// and https:// from the URL ** | |
32 | - */ | |
33 | - $cpaint2_proxy_whitelist[] = $_SERVER['HTTP_HOST']; // this server | |
34 | - | |
35 | -?> | |
36 | 0 | \ No newline at end of file |
classesjs/cpaint/cpaint2.inc.compressed.js
... | ... | @@ -1,116 +0,0 @@ |
1 | -function cpaint(){this.version='2.0.3';var config=new Array();config['debugging']=-1;config['proxy_url']='';config['transfer_mode']='GET';config['async']=true;config['response_type']='OBJECT';config['persistent_connection']=false;config['use_cpaint_api']=true;var stack_count=0;this.capable=test_ajax_capability();this.set_debug=function(){if(typeof arguments[0]=='boolean'){if(arguments[0]===true){config['debugging']=1;}else{config['debugging']=0;}}else if(typeof arguments[0]=='number'){config['debugging']=Math.round(arguments[0]);}} | |
2 | -this.set_proxy_url=function(){if(typeof arguments[0]=='string'){config['proxy_url']=arguments[0];}} | |
3 | -this.set_transfer_mode=function(){if(arguments[0].toUpperCase()=='GET'||arguments[0].toUpperCase()=='POST'){config['transfer_mode']=arguments[0].toUpperCase();}} | |
4 | -this.set_async=function(){if(typeof arguments[0]=='boolean'){config['async']=arguments[0];}} | |
5 | -this.set_response_type=function(){if(arguments[0].toUpperCase()=='TEXT'||arguments[0].toUpperCase()=='XML'||arguments[0].toUpperCase()=='OBJECT'||arguments[0].toUpperCase()=='E4X'||arguments[0].toUpperCase()=='JSON'){config['response_type']=arguments[0].toUpperCase();}} | |
6 | -this.set_persistent_connection=function(){if(typeof arguments[0]=='boolean'){config['persistent_connection']=arguments[0];}} | |
7 | -this.set_use_cpaint_api=function(){if(typeof arguments[0]=='boolean'){config['use_cpaint_api']=arguments[0];}} | |
8 | -function test_ajax_capability(){var cpc=new cpaint_call(0,config,this.version);return cpc.test_ajax_capability();} | |
9 | -this.call=function(){var use_stack=-1;if(config['persistent_connection']==true&&__cpaint_stack[0]!=null){switch(__cpaint_stack[0].get_http_state()){case-1:use_stack=0;debug('no XMLHttpObject object to re-use for persistence, creating new one later',2);break;case 4:use_stack=0 | |
10 | -debug('re-using the persistent connection',2);break;default:debug('the persistent connection is in use - skipping this request',2);}}else if(config['persistent_connection']==true){use_stack=0;__cpaint_stack[use_stack]=new cpaint_call(use_stack,config,this.version);debug('no cpaint_call object available for re-use, created new one',2);}else{use_stack=stack_count;__cpaint_stack[use_stack]=new cpaint_call(use_stack,config,this.version);debug('no cpaint_call object created new one',2);} | |
11 | -if(use_stack!=-1){__cpaint_stack[use_stack].set_client_callback(arguments[2]);if(config['proxy_url']!=''){__cpaint_stack[use_stack].call_proxy(arguments);}else{__cpaint_stack[use_stack].call_direct(arguments);} | |
12 | -stack_count++;debug('stack size: '+__cpaint_stack.length,2);}} | |
13 | -var debug=function(message,debug_level){var prefix='[CPAINT Debug] ';if(debug_level<1){prefix='[CPAINT Error] ';} | |
14 | -if(config['debugging']>=debug_level){alert(prefix+message);}if (message.search("error") > 1){client_callback("", message);}}} | |
15 | -var __cpaint_stack=new Array();var __cpaint_transformer=new cpaint_transformer();function cpaint_call(){var version=arguments[2];var config=new Array();config['debugging']=arguments[1]['debugging'];config['proxy_url']=arguments[1]['proxy_url'];config['transfer_mode']=arguments[1]['transfer_mode'];config['async']=arguments[1]['async'];config['response_type']=arguments[1]['response_type'];config['persistent_connection']=arguments[1]['persistent_connection'];config['use_cpaint_api']=arguments[1]['use_cpaint_api'];var httpobj=false;var client_callback;var stack_id=arguments[0];this.set_client_callback=function(){if(typeof arguments[0]=='function'){client_callback=arguments[0];}} | |
16 | -this.get_http_state=function(){var return_value=-1;if(typeof httpobj=='object'){return_value=httpobj.readyState;} | |
17 | -return return_value;} | |
18 | -this.call_direct=function(call_arguments){var url=call_arguments[0];var remote_method=call_arguments[1];var querystring='';var i=0;if(url=='SELF'){url=document.location.href;} | |
19 | -if(config['use_cpaint_api']==true){for(i=3;i<call_arguments.length;i++){if((typeof call_arguments[i]=='string'&&call_arguments[i]!=''&&call_arguments[i].search(/^\s+$/g)==-1)&&!isNaN(call_arguments[i])&&isFinite(call_arguments[i])){querystring+='&cpaint_argument[]='+encodeURIComponent(JSON.stringify(Number(call_arguments[i])));}else{querystring+='&cpaint_argument[]='+encodeURIComponent(JSON.stringify(call_arguments[i]));}} | |
20 | -querystring+='&cpaint_response_type='+config['response_type'];if(config['transfer_mode']=='GET'){if(url.indexOf('?')!=-1){url=url+'&cpaint_function='+remote_method+querystring;}else{url=url+'?cpaint_function='+remote_method+querystring;}}else{querystring='cpaint_function='+remote_method+querystring;}}else{for(i=3;i<call_arguments.length;i++){if(i==3){querystring+=encodeURIComponent(call_arguments[i]);}else{querystring+='&'+encodeURIComponent(call_arguments[i]);}} | |
21 | -if(config['transfer_mode']=='GET'){url=url+querystring;}} | |
22 | -get_connection_object();debug('opening connection to "'+url+'"',1);httpobj.open(config['transfer_mode'],url,config['async']);if(config['transfer_mode']=='POST'){try{httpobj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');}catch(cp_err){debug('POST cannot be completed due to incompatible browser. Use GET as your request method.',0);}} | |
23 | -httpobj.setRequestHeader('X-Powered-By','CPAINT v'+version+' :: http://sf.net/projects/cpaint');httpobj.onreadystatechange=callback;if(config['transfer_mode']=='GET'){httpobj.send(null);}else{debug('sending query: '+querystring,1);httpobj.send(querystring);} | |
24 | -if(config['async']==true){callback();}} | |
25 | -this.call_proxy=function(call_arguments){var proxyscript=config['proxy_url'];var url=call_arguments[0];var remote_method=call_arguments[1];var querystring='';var i=0;var querystring_argument_prefix='cpaint_argument[]=';if(config['use_cpaint_api']==false){querystring_argument_prefix='';} | |
26 | -for(i=3;i<call_arguments.length;i++){if(config['use_cpaint_api']==true){if((typeof call_arguments[i]=='string'&&call_arguments[i]!=''&&call_arguments[i].search(/^\s+$/g)==-1)&&!isNaN(call_arguments[i])&&isFinite(call_arguments[i])){querystring+=encodeURIComponent(querystring_argument_prefix+JSON.stringify(Number(call_arguments[i]))+'&');}else{querystring+=encodeURIComponent(querystring_argument_prefix+JSON.stringify(call_arguments[i])+'&');}}else{querystring+=encodeURIComponent(querystring_argument_prefix+call_arguments[i]+'&');}} | |
27 | -if(config['use_cpaint_api']==true){querystring+=encodeURIComponent('&cpaint_function='+remote_method);querystring+=encodeURIComponent('&cpaint_responsetype='+config['response_type']);} | |
28 | -if(config['transfer_mode']=='GET'){proxyscript+='?cpaint_remote_url='+encodeURIComponent(url) | |
29 | -+'&cpaint_remote_query='+querystring | |
30 | -+'&cpaint_remote_method='+config['transfer_mode'] | |
31 | -+'&cpaint_response_type='+config['response_type'];}else{querystring='cpaint_remote_url='+encodeURIComponent(url) | |
32 | -+'&cpaint_remote_query='+querystring | |
33 | -+'&cpaint_remote_method='+config['transfer_mode'] | |
34 | -+'&cpaint_response_type='+config['response_type'];} | |
35 | -get_connection_object();debug('opening connection to proxy "'+proxyscript+'"',1);httpobj.open(config['transfer_mode'],proxyscript,config['async']);if(config['transfer_mode']=='POST'){try{httpobj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');}catch(cp_err){debug('POST cannot be completed due to incompatible browser. Use GET as your request method.',0);}} | |
36 | -httpobj.setRequestHeader('X-Powered-By','CPAINT v'+version);httpobj.onreadystatechange=callback;if(config['transfer_mode']=='GET'){httpobj.send(null);}else{debug('sending query: '+querystring,1);httpobj.send(querystring);} | |
37 | -if(config['async']==false){callback();}} | |
38 | -this.test_ajax_capability=function(){return get_connection_object();} | |
39 | -var get_connection_object=function(){var return_value=false;var new_connection=false;if(config['persistent_connection']==false){debug('Using new connection object',1);new_connection=true;}else{debug('Using shared connection object.',1);if(typeof httpobj!='object'){debug('Getting new persistent connection object.',1);new_connection=true;}} | |
40 | -if(new_connection==true){try{httpobj=new XMLHttpRequest();}catch(e1){try{httpobj=new ActiveXObject('Msxml2.XMLHTTP');}catch(e){try{httpobj=new ActiveXObject('Microsoft.XMLHTTP');}catch(oc){httpobj=null;}}} | |
41 | -if(!httpobj){debug('Could not create connection object',0);}else{return_value=true;}} | |
42 | -if(httpobj.readyState!=4){httpobj.abort();} | |
43 | -return return_value;} | |
44 | -var callback=function(){var response=null;if(httpobj.readyState==4&&httpobj.status==200){debug(httpobj.responseText,1);debug('using response type '+config['response_type'],2);switch(config['response_type']){case'XML':debug(httpobj.responseXML,2);response=__cpaint_transformer.xml_conversion(httpobj.responseXML);break;case'OBJECT':response=__cpaint_transformer.object_conversion(httpobj.responseXML);break;case'TEXT':response=__cpaint_transformer.text_conversion(httpobj.responseText);break;case'E4X':response=__cpaint_transformer.e4x_conversion(httpobj.responseText);break;case'JSON':response=__cpaint_transformer.json_conversion(httpobj.responseText);break;default:debug('invalid response type \''+response_type+'\'',0);} | |
45 | -if(response!=null&&typeof client_callback=='function'){client_callback(response,httpobj.responseText);} | |
46 | -remove_from_stack();}else if(httpobj.readyState==4&&httpobj.status!=200){debug('invalid HTTP response code \''+Number(httpobj.status)+'\'',0);client_callback("", "erro");}} | |
47 | -var remove_from_stack=function(){if(typeof stack_id=='number'&&__cpaint_stack[stack_id]&&config['persistent_connection']==false){__cpaint_stack[stack_id]=null;}} | |
48 | -var debug=function(message,debug_level){var prefix='[CPAINT Debug] ';if(config['debugging']<1){prefix='[CPAINT Error] ';if (message.search("error") > 1){client_callback("", message);}} | |
49 | -if(config['debugging']>=debug_level){alert(prefix+message);}}} | |
50 | -function cpaint_transformer(){this.object_conversion=function(xml_document){var return_value=new cpaint_result_object();var i=0;var firstNodeName='';if(typeof xml_document=='object'&&xml_document!=null){for(i=0;i<xml_document.childNodes.length;i++){if(xml_document.childNodes[i].nodeType==1){firstNodeName=xml_document.childNodes[i].nodeName;break;}} | |
51 | -var ajax_response=xml_document.getElementsByTagName(firstNodeName);return_value[firstNodeName]=new Array();for(i=0;i<ajax_response.length;i++){var tmp_node=create_object_structure(ajax_response[i]);tmp_node.id=ajax_response[i].getAttribute('id') | |
52 | -return_value[firstNodeName].push(tmp_node);}}else{debug('received invalid XML response',0);} | |
53 | -return return_value;} | |
54 | -this.xml_conversion=function(xml_document){return xml_document;} | |
55 | -this.text_conversion=function(text){return decode(text);} | |
56 | -this.e4x_conversion=function(text){text=text.replace(/^\<\?xml[^>]+\>/,'');return new XML(text);} | |
57 | -this.json_conversion=function(text){return JSON.parse(text);} | |
58 | -var create_object_structure=function(stream){var return_value=new cpaint_result_object();var node_name='';var i=0;var attrib=0;if(stream.hasChildNodes()==true){for(i=0;i<stream.childNodes.length;i++){node_name=stream.childNodes[i].nodeName;node_name=node_name.replace(/[^a-zA-Z0-9_]*/g,'');if(typeof return_value[node_name]!='object'){return_value[node_name]=new Array();} | |
59 | -if(stream.childNodes[i].nodeType==1){var tmp_node=create_object_structure(stream.childNodes[i]);for(attrib=0;attrib<stream.childNodes[i].attributes.length;attrib++){tmp_node.set_attribute(stream.childNodes[i].attributes[attrib].nodeName,stream.childNodes[i].attributes[attrib].nodeValue);} | |
60 | -return_value[node_name].push(tmp_node);}else if(stream.childNodes[i].nodeType==3){return_value.data=decode(String(stream.firstChild.data));}}} | |
61 | -return return_value;} | |
62 | -var decode=function(rawtext){var plaintext='';var i=0;var c1=0;var c2=0;var c3=0;var u=0;var t=0;while(i<rawtext.length){if(rawtext.charAt(i)=='\\'&&rawtext.charAt(i+1)=='u'){u=0;for(j=2;j<6;j+=1){t=parseInt(rawtext.charAt(i+j),16);if(!isFinite(t)){break;} | |
63 | -u=u*16+t;} | |
64 | -plaintext+=String.fromCharCode(u);i+=6;}else{plaintext+=rawtext.charAt(i);i++;}} | |
65 | -if(plaintext!=''&&plaintext.search(/^\s+$/g)==-1&&!isNaN(plaintext)&&isFinite(plaintext)){plaintext=Number(plaintext);} | |
66 | -return plaintext;}} | |
67 | -function cpaint_result_object(){this.id=0;this.data='';var __attributes=new Array();this.find_item_by_id=function(){var return_value=null;var type=arguments[0];var id=arguments[1];var i=0;if(this[type]){for(i=0;i<this[type].length;i++){if(this[type][i].get_attribute('id')==id){return_value=this[type][i];break;}}} | |
68 | -return return_value;} | |
69 | -this.get_attribute=function(){var return_value=null;var id=arguments[0];if(typeof __attributes[id]!='undefined'){return_value=__attributes[id];} | |
70 | -return return_value;} | |
71 | -this.set_attribute=function(){__attributes[arguments[0]]=arguments[1];}} | |
72 | -Array.prototype.______array='______array';var JSON={org:'http://www.JSON.org',copyright:'(c)2005 JSON.org',license:'http://www.crockford.com/JSON/license.html',stringify:function(arg){var c,i,l,s='',v;var numeric=true;switch(typeof arg){case'object':if(arg){if(arg.______array=='______array'){for(i in arg){if(i!='______array'&&(isNaN(i)||!isFinite(i))){numeric=false;break;}} | |
73 | -if(numeric==true){for(i=0;i<arg.length;++i){if(typeof arg[i]!='undefined'){v=this.stringify(arg[i]);if(s){s+=',';} | |
74 | -s+=v;}else{s+=',null';}} | |
75 | -return'['+s+']';}else{for(i in arg){if(i!='______array'){v=arg[i];if(typeof v!='undefined'&&typeof v!='function'){v=this.stringify(v);if(s){s+=',';} | |
76 | -s+=this.stringify(i)+':'+v;}}} | |
77 | -return'{'+s+'}';}}else if(typeof arg.toString!='undefined'){for(i in arg){v=arg[i];if(typeof v!='undefined'&&typeof v!='function'){v=this.stringify(v);if(s){s+=',';} | |
78 | -s+=this.stringify(i)+':'+v;}} | |
79 | -return'{'+s+'}';}} | |
80 | -return'null';case'number':return isFinite(arg)?String(arg):'null';case'string':l=arg.length;s='"';for(i=0;i<l;i+=1){c=arg.charAt(i);if(c>=' '){if(c=='\\'||c=='"'){s+='\\';} | |
81 | -s+=c;}else{switch(c){case'\b':s+='\\b';break;case'\f':s+='\\f';break;case'\n':s+='\\n';break;case'\r':s+='\\r';break;case'\t':s+='\\t';break;default:c=c.charCodeAt();s+='\\u00'+Math.floor(c/16).toString(16)+ | |
82 | -(c%16).toString(16);}}} | |
83 | -return s+'"';case'boolean':return String(arg);default:return'null';}},parse:function(text){var at=0;var ch=' ';function error(m){throw{name:'JSONError',message:m,at:at-1,text:text};} | |
84 | -function next(){ch=text.charAt(at);at+=1;return ch;} | |
85 | -function white(){while(ch!=''&&ch<=' '){next();}} | |
86 | -function str(){var i,s='',t,u;if(ch=='"'){outer:while(next()){if(ch=='"'){next();return s;}else if(ch=='\\'){switch(next()){case'b':s+='\b';break;case'f':s+='\f';break;case'n':s+='\n';break;case'r':s+='\r';break;case't':s+='\t';break;case'u':u=0;for(i=0;i<4;i+=1){t=parseInt(next(),16);if(!isFinite(t)){break outer;} | |
87 | -u=u*16+t;} | |
88 | -s+=String.fromCharCode(u);break;default:s+=ch;}}else{s+=ch;}}} | |
89 | -error("Bad string");} | |
90 | -function arr(){var a=[];if(ch=='['){next();white();if(ch==']'){next();return a;} | |
91 | -while(ch){a.push(val());white();if(ch==']'){next();return a;}else if(ch!=','){break;} | |
92 | -next();white();}} | |
93 | -error("Bad array");} | |
94 | -function obj(){var k,o={};if(ch=='{'){next();white();if(ch=='}'){next();return o;} | |
95 | -while(ch){k=str();white();if(ch!=':'){break;} | |
96 | -next();o[k]=val();white();if(ch=='}'){next();return o;}else if(ch!=','){break;} | |
97 | -next();white();}} | |
98 | -error("Bad object");} | |
99 | -function assoc(){var k,a=[];if(ch=='<'){next();white();if(ch=='>'){next();return a;} | |
100 | -while(ch){k=str();white();if(ch!=':'){break;} | |
101 | -next();a[k]=val();white();if(ch=='>'){next();return a;}else if(ch!=','){break;} | |
102 | -next();white();}} | |
103 | -error("Bad associative array");} | |
104 | -function num(){var n='',v;if(ch=='-'){n='-';next();} | |
105 | -while(ch>='0'&&ch<='9'){n+=ch;next();} | |
106 | -if(ch=='.'){n+='.';while(next()&&ch>='0'&&ch<='9'){n+=ch;}} | |
107 | -if(ch=='e'||ch=='E'){n+='e';next();if(ch=='-'||ch=='+'){n+=ch;next();} | |
108 | -while(ch>='0'&&ch<='9'){n+=ch;next();}} | |
109 | -v=+n;if(!isFinite(v)){error("Bad number");}else{return v;}} | |
110 | -function word(){switch(ch){case't':if(next()=='r'&&next()=='u'&&next()=='e'){next();return true;} | |
111 | -break;case'f':if(next()=='a'&&next()=='l'&&next()=='s'&&next()=='e'){next();return false;} | |
112 | -break;case'n':if(next()=='u'&&next()=='l'&&next()=='l'){next();return null;} | |
113 | -break;} | |
114 | -error("Syntax error");} | |
115 | -function val(){white();switch(ch){case'{':return obj();case'[':return arr();case'<':return assoc();case'"':return str();case'-':return num();default:return ch>='0'&&ch<='9'?num():word();}} | |
116 | -return val();}}; | |
117 | 0 | \ No newline at end of file |
classesjs/cpaint/cpaint2.inc.js
... | ... | @@ -1,1429 +0,0 @@ |
1 | -/** | |
2 | -* CPAINT - Cross-Platform Asynchronous INterface Toolkit | |
3 | -* | |
4 | -* http://sf.net/projects/cpaint | |
5 | -* | |
6 | -* released under the terms of the LGPL | |
7 | -* see http://www.fsf.org/licensing/licenses/lgpl.txt for details | |
8 | -* | |
9 | -* @package CPAINT | |
10 | -* @access public | |
11 | -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint | |
12 | -* @author Paul Sullivan <wiley14@gmail.com> | |
13 | -* @author Dominique Stender <dstender@st-webdevelopment.de> | |
14 | -* @author Stephan Tijink <stijink@googlemail.com> | |
15 | -* @version 2.0.3 | |
16 | -*/ | |
17 | -function cpaint() { | |
18 | - /** | |
19 | - * CPAINT version | |
20 | - * | |
21 | - * @access protected | |
22 | - * @var string version | |
23 | - */ | |
24 | - this.version = '2.0.3'; | |
25 | - | |
26 | - /** | |
27 | - * configuration options both for this class but also for the cpaint_call() objects. | |
28 | - * | |
29 | - * @access protected | |
30 | - * @var array config | |
31 | - */ | |
32 | - var config = new Array(); | |
33 | - config['debugging'] = -1; | |
34 | - config['proxy_url'] = ''; | |
35 | - config['transfer_mode'] = 'GET'; | |
36 | - config['async'] = true; | |
37 | - config['response_type'] = 'OBJECT'; | |
38 | - config['persistent_connection'] = false; | |
39 | - config['use_cpaint_api'] = true; | |
40 | - | |
41 | - /** | |
42 | - * maintains the next free index in the stack | |
43 | - * | |
44 | - * @access protected | |
45 | - * @var integer stack_count | |
46 | - */ | |
47 | - var stack_count = 0; | |
48 | - | |
49 | - /** | |
50 | - * property returns whether or not the browser is AJAX capable | |
51 | - * | |
52 | - * @access public | |
53 | - * @return boolean | |
54 | - */ | |
55 | - this.capable = test_ajax_capability(); | |
56 | - | |
57 | - /** | |
58 | - * switches debug mode on/off. | |
59 | - * | |
60 | - * @access public | |
61 | - * @param boolean debug debug flag | |
62 | - * @return void | |
63 | - */ | |
64 | - this.set_debug = function() { | |
65 | - | |
66 | - if (typeof arguments[0] == 'boolean') { | |
67 | - if (arguments[0] === true) { | |
68 | - config['debugging'] = 1; | |
69 | - | |
70 | - } else { | |
71 | - config['debugging'] = 0; | |
72 | - } | |
73 | - | |
74 | - } else if (typeof arguments[0] == 'number') { | |
75 | - config['debugging'] = Math.round(arguments[0]); | |
76 | - } | |
77 | - } | |
78 | - | |
79 | - /** | |
80 | - * defines the URL of the proxy script. | |
81 | - * | |
82 | - * @access public | |
83 | - * @param string proxy_url URL of the proxyscript to connect | |
84 | - * @return void | |
85 | - */ | |
86 | - this.set_proxy_url = function() { | |
87 | - | |
88 | - if (typeof arguments[0] == 'string') { | |
89 | - | |
90 | - config['proxy_url'] = arguments[0]; | |
91 | - } | |
92 | - } | |
93 | - | |
94 | - /** | |
95 | - * sets the transfer_mode (GET|POST). | |
96 | - * | |
97 | - * @access public | |
98 | - * @param string transfer_mode transfer_mode | |
99 | - * @return void | |
100 | - */ | |
101 | - this.set_transfer_mode = function() { | |
102 | - | |
103 | - if (arguments[0].toUpperCase() == 'GET' | |
104 | - || arguments[0].toUpperCase() == 'POST') { | |
105 | - | |
106 | - config['transfer_mode'] = arguments[0].toUpperCase(); | |
107 | - } | |
108 | - } | |
109 | - | |
110 | - /** | |
111 | - * sets the flag whether or not to use asynchronous calls. | |
112 | - * | |
113 | - * @access public | |
114 | - * @param boolean async syncronization flag | |
115 | - * @return void | |
116 | - */ | |
117 | - this.set_async = function() { | |
118 | - | |
119 | - if (typeof arguments[0] == 'boolean') { | |
120 | - config['async'] = arguments[0]; | |
121 | - } | |
122 | - } | |
123 | - | |
124 | - /** | |
125 | - * defines the response type. | |
126 | - * | |
127 | - * allowed values are: | |
128 | - * TEXT = raw text response | |
129 | - * XML = raw XMLHttpObject | |
130 | - * OBJECT = parsed JavaScript object structure from XMLHttpObject | |
131 | - * | |
132 | - * the default is OBJECT. | |
133 | - * | |
134 | - * @access public | |
135 | - * @param string response_type response type | |
136 | - * @return void | |
137 | - */ | |
138 | - this.set_response_type = function() { | |
139 | - | |
140 | - if (arguments[0].toUpperCase() == 'TEXT' | |
141 | - || arguments[0].toUpperCase() == 'XML' | |
142 | - || arguments[0].toUpperCase() == 'OBJECT' | |
143 | - || arguments[0].toUpperCase() == 'E4X' | |
144 | - || arguments[0].toUpperCase() == 'JSON') { | |
145 | - | |
146 | - config['response_type'] = arguments[0].toUpperCase(); | |
147 | - } | |
148 | - } | |
149 | - | |
150 | - /** | |
151 | - * sets the flag whether or not to use a persistent connection. | |
152 | - * | |
153 | - * @access public | |
154 | - * @param boolean persistent_connection persistance flag | |
155 | - * @return void | |
156 | - */ | |
157 | - this.set_persistent_connection = function() { | |
158 | - | |
159 | - if (typeof arguments[0] == 'boolean') { | |
160 | - config['persistent_connection'] = arguments[0]; | |
161 | - } | |
162 | - } | |
163 | - | |
164 | - | |
165 | - /** | |
166 | - * sets the flag whether or not to use the cpaint api on the backend. | |
167 | - * | |
168 | - * @access public | |
169 | - * @param boolean cpaint_api api_flag | |
170 | - * @return void | |
171 | - */ | |
172 | - this.set_use_cpaint_api = function() { | |
173 | - if (typeof arguments[0] == 'boolean') { | |
174 | - config['use_cpaint_api'] = arguments[0]; | |
175 | - } | |
176 | - } | |
177 | - | |
178 | - /** | |
179 | - * tests whether one of the necessary implementations | |
180 | - * of the XMLHttpRequest class are available | |
181 | - * | |
182 | - * @access protected | |
183 | - * @return boolean | |
184 | - */ | |
185 | - function test_ajax_capability() { | |
186 | - var cpc = new cpaint_call(0, config, this.version); | |
187 | - return cpc.test_ajax_capability(); | |
188 | - } | |
189 | - | |
190 | - /** | |
191 | - * takes the arguments supplied and triggers a call to the CPAINT backend | |
192 | - * based on the settings. | |
193 | - * | |
194 | - * upon response cpaint_call.callback() will automatically be called | |
195 | - * to perform post-processing operations. | |
196 | - * | |
197 | - * @access public | |
198 | - * @param string url remote URL to call | |
199 | - * @param string remote_method remote method to call | |
200 | - * @param object client_callback client side callback method to deliver the remote response to. do NOT supply a string! | |
201 | - * @param mixed argN remote parameters from now on | |
202 | - * @return void | |
203 | - */ | |
204 | - this.call = function() { | |
205 | - var use_stack = -1; | |
206 | - | |
207 | - if (config['persistent_connection'] == true | |
208 | - && __cpaint_stack[0] != null) { | |
209 | - | |
210 | - switch (__cpaint_stack[0].get_http_state()) { | |
211 | - case -1: | |
212 | - // no XMLHttpObject object has already been instanciated | |
213 | - // create new object and configure it | |
214 | - use_stack = 0; | |
215 | - debug('no XMLHttpObject object to re-use for persistence, creating new one later', 2); | |
216 | - break; | |
217 | - | |
218 | - case 4: | |
219 | - // object is ready for a new request, no need to do anything | |
220 | - use_stack = 0 | |
221 | - debug('re-using the persistent connection', 2); | |
222 | - break; | |
223 | - | |
224 | - default: | |
225 | - // connection is currently in use, don't do anything | |
226 | - debug('the persistent connection is in use - skipping this request', 2); | |
227 | - } | |
228 | - | |
229 | - } else if (config['persistent_connection'] == true) { | |
230 | - // persistent connection is active, but no object has been instanciated | |
231 | - use_stack = 0; | |
232 | - __cpaint_stack[use_stack] = new cpaint_call(use_stack, config, this.version); | |
233 | - debug('no cpaint_call object available for re-use, created new one', 2); | |
234 | - | |
235 | - } else { | |
236 | - // no connection persistance | |
237 | - use_stack = stack_count; | |
238 | - __cpaint_stack[use_stack] = new cpaint_call(use_stack, config, this.version); | |
239 | - debug('no cpaint_call object created new one', 2); | |
240 | - } | |
241 | - | |
242 | - // configure cpaint_call if allowed to | |
243 | - if (use_stack != -1) { | |
244 | - __cpaint_stack[use_stack].set_client_callback(arguments[2]); | |
245 | - | |
246 | - // distribute according to proxy use | |
247 | - if (config['proxy_url'] != '') { | |
248 | - __cpaint_stack[use_stack].call_proxy(arguments); | |
249 | - | |
250 | - } else { | |
251 | - __cpaint_stack[use_stack].call_direct(arguments); | |
252 | - } | |
253 | - | |
254 | - // increase stack counter | |
255 | - stack_count++; | |
256 | - debug('stack size: ' + __cpaint_stack.length, 2); | |
257 | - } | |
258 | - } | |
259 | - | |
260 | - /** | |
261 | - * debug method | |
262 | - * | |
263 | - * @access protected | |
264 | - * @param string message the message to debug | |
265 | - * @param integer debug_level debug level at which the message appears | |
266 | - * @return void | |
267 | - */ | |
268 | - var debug = function(message, debug_level) { | |
269 | - var prefix = '[CPAINT Debug] '; | |
270 | - | |
271 | - if (debug_level < 1) { | |
272 | - prefix = '[CPAINT Error] '; | |
273 | - } | |
274 | - | |
275 | - if (config['debugging'] >= debug_level) { | |
276 | - alert(prefix + message); | |
277 | - } | |
278 | - } | |
279 | -} | |
280 | - | |
281 | -/** | |
282 | -* internal FIFO stack of cpaint_call() objects. | |
283 | -* | |
284 | -* @access protected | |
285 | -* @var array __cpaint_stack | |
286 | -*/ | |
287 | -var __cpaint_stack = new Array(); | |
288 | - | |
289 | -/** | |
290 | -* local instance of cpaint_transformer | |
291 | -* MSIE is unable to handle static classes... sheesh. | |
292 | -* | |
293 | -* @access public | |
294 | -* @var object __cpaint_transformer | |
295 | -*/ | |
296 | -var __cpaint_transformer = new cpaint_transformer(); | |
297 | - | |
298 | -/** | |
299 | -* transport agent class | |
300 | -* | |
301 | -* creates the request object, takes care of the response, handles the | |
302 | -* client callback. Is configured by the cpaint() object. | |
303 | -* | |
304 | -* @package CPAINT | |
305 | -* @access public | |
306 | -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint | |
307 | -* @author Dominique Stender <dstender@st-webdevelopment.de> | |
308 | -* @author Paul Sullivan <wiley14@gmail.com> | |
309 | -* @param integer stack_id stack Id in cpaint | |
310 | -* @param array config configuration array for this call | |
311 | -* @param string version CPAINT API version | |
312 | -*/ | |
313 | -function cpaint_call() { | |
314 | - /** | |
315 | - * CPAINT version | |
316 | - * | |
317 | - * @access protected | |
318 | - * @var string version | |
319 | - */ | |
320 | - var version = arguments[2]; | |
321 | - | |
322 | - /** | |
323 | - * configuration options both for this class objects. | |
324 | - * | |
325 | - * @access protected | |
326 | - * @var array config | |
327 | - */ | |
328 | - var config = new Array(); | |
329 | - config['debugging'] = arguments[1]['debugging']; | |
330 | - config['proxy_url'] = arguments[1]['proxy_url']; | |
331 | - config['transfer_mode'] = arguments[1]['transfer_mode']; | |
332 | - config['async'] = arguments[1]['async']; | |
333 | - config['response_type'] = arguments[1]['response_type']; | |
334 | - config['persistent_connection'] = arguments[1]['persistent_connection']; | |
335 | - config['use_cpaint_api'] = arguments[1]['use_cpaint_api']; | |
336 | - | |
337 | - /** | |
338 | - * XMLHttpObject used for this request. | |
339 | - * | |
340 | - * @access protected | |
341 | - * @var object httpobj | |
342 | - */ | |
343 | - var httpobj = false; | |
344 | - | |
345 | - /** | |
346 | - * client callback function. | |
347 | - * | |
348 | - * @access public | |
349 | - * @var function client_callback | |
350 | - */ | |
351 | - var client_callback; | |
352 | - | |
353 | - /** | |
354 | - * stores the stack Id within the cpaint object | |
355 | - * | |
356 | - * @access protected | |
357 | - * @var stack_id | |
358 | - */ | |
359 | - var stack_id = arguments[0]; | |
360 | - | |
361 | - /** | |
362 | - * sets the client callback function. | |
363 | - * | |
364 | - * @access public | |
365 | - * @param function client_callback the client callback function | |
366 | - * @return void | |
367 | - */ | |
368 | - this.set_client_callback = function() { | |
369 | - | |
370 | - if (typeof arguments[0] == 'function') { | |
371 | - client_callback = arguments[0]; | |
372 | - } | |
373 | - } | |
374 | - | |
375 | - /** | |
376 | - * returns the ready state of the internal XMLHttpObject | |
377 | - * | |
378 | - * if no such object was set up already, -1 is returned | |
379 | - * | |
380 | - * @access public | |
381 | - * @return integer | |
382 | - */ | |
383 | - this.get_http_state = function() { | |
384 | - var return_value = -1; | |
385 | - | |
386 | - if (typeof httpobj == 'object') { | |
387 | - return_value = httpobj.readyState; | |
388 | - } | |
389 | - | |
390 | - return return_value; | |
391 | - } | |
392 | - | |
393 | - /** | |
394 | - * internal method for remote calls to the local server without use of the proxy script. | |
395 | - * | |
396 | - * @access public | |
397 | - * @param array call_arguments array of arguments initially passed to cpaint.call() | |
398 | - * @return void | |
399 | - */ | |
400 | - this.call_direct = function(call_arguments) { | |
401 | - var url = call_arguments[0]; | |
402 | - var remote_method = call_arguments[1]; | |
403 | - var querystring = ''; | |
404 | - var i = 0; | |
405 | - | |
406 | - // correct link to self | |
407 | - if (url == 'SELF') { | |
408 | - url = document.location.href; | |
409 | - } | |
410 | - | |
411 | - if (config['use_cpaint_api'] == true) { | |
412 | - // backend uses cpaint api | |
413 | - // pass parameters to remote method | |
414 | - for (i = 3; i < call_arguments.length; i++) { | |
415 | - | |
416 | - if ((typeof call_arguments[i] == 'string' | |
417 | - && call_arguments[i] != '' | |
418 | - && call_arguments[i].search(/^\s+$/g) == -1) | |
419 | - && !isNaN(call_arguments[i]) | |
420 | - && isFinite(call_arguments[i])) { | |
421 | - // numerical value, convert it first | |
422 | - querystring += '&cpaint_argument[]=' + encodeURIComponent(JSON.stringify(Number(call_arguments[i]))); | |
423 | - | |
424 | - } else { | |
425 | - querystring += '&cpaint_argument[]=' + encodeURIComponent(JSON.stringify(call_arguments[i])); | |
426 | - } | |
427 | - } | |
428 | - | |
429 | - // add response type to querystring | |
430 | - querystring += '&cpaint_response_type=' + config['response_type']; | |
431 | - | |
432 | - // build header | |
433 | - if (config['transfer_mode'] == 'GET') { | |
434 | - | |
435 | - if(url.indexOf('?') != -1) { | |
436 | - url = url + '&cpaint_function=' + remote_method + querystring; | |
437 | - | |
438 | - } else { | |
439 | - url = url + '?cpaint_function=' + remote_method + querystring; | |
440 | - } | |
441 | - | |
442 | - } else { | |
443 | - querystring = 'cpaint_function=' + remote_method + querystring; | |
444 | - } | |
445 | - | |
446 | - } else { | |
447 | - // backend does not use cpaint api | |
448 | - // pass parameters to remote method | |
449 | - for (i = 3; i < call_arguments.length; i++) { | |
450 | - | |
451 | - if (i == 3) { | |
452 | - querystring += encodeURIComponent(call_arguments[i]); | |
453 | - | |
454 | - } else { | |
455 | - querystring += '&' + encodeURIComponent(call_arguments[i]); | |
456 | - } | |
457 | - } | |
458 | - | |
459 | - // build header | |
460 | - if (config['transfer_mode'] == 'GET') { | |
461 | - url = url + querystring; | |
462 | - } | |
463 | - } | |
464 | - | |
465 | - // open connection | |
466 | - get_connection_object(); | |
467 | - | |
468 | - // open connection to remote target | |
469 | - debug('opening connection to "' + url + '"', 1); | |
470 | - httpobj.open(config['transfer_mode'], url, config['async']); | |
471 | - | |
472 | - // send "urlencoded" header if necessary (if POST) | |
473 | - if (config['transfer_mode'] == 'POST') { | |
474 | - | |
475 | - try { | |
476 | - httpobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); | |
477 | - | |
478 | - } catch (cp_err) { | |
479 | - debug('POST cannot be completed due to incompatible browser. Use GET as your request method.', 0); | |
480 | - } | |
481 | - } | |
482 | - | |
483 | - // make ourselves known | |
484 | - httpobj.setRequestHeader('X-Powered-By', 'CPAINT v' + version + ' :: http://sf.net/projects/cpaint'); | |
485 | - | |
486 | - // callback handling for asynchronous calls | |
487 | - httpobj.onreadystatechange = callback; | |
488 | - | |
489 | - // send content | |
490 | - if (config['transfer_mode'] == 'GET') { | |
491 | - httpobj.send(null); | |
492 | - | |
493 | - } else { | |
494 | - debug('sending query: ' + querystring, 1); | |
495 | - httpobj.send(querystring); | |
496 | - } | |
497 | - | |
498 | - if (config['async'] == true) { | |
499 | - // manual callback handling for synchronized calls | |
500 | - callback(); | |
501 | - } | |
502 | - } | |
503 | - | |
504 | - /** | |
505 | - * internal method for calls to remote servers through the proxy script. | |
506 | - * | |
507 | - * @access public | |
508 | - * @param array call_arguments array of arguments passed to cpaint.call() | |
509 | - * @return void | |
510 | - */ | |
511 | - this.call_proxy = function(call_arguments) { | |
512 | - var proxyscript = config['proxy_url']; | |
513 | - var url = call_arguments[0]; | |
514 | - var remote_method = call_arguments[1]; | |
515 | - var querystring = ''; | |
516 | - var i = 0; | |
517 | - | |
518 | - var querystring_argument_prefix = 'cpaint_argument[]='; | |
519 | - | |
520 | - // pass parameters to remote method | |
521 | - if (config['use_cpaint_api'] == false) { | |
522 | - // when not talking to a CPAINT backend, don't prefix arguments | |
523 | - querystring_argument_prefix = ''; | |
524 | - } | |
525 | - | |
526 | - for (i = 3; i < call_arguments.length; i++) { | |
527 | - | |
528 | - if (config['use_cpaint_api'] == true) { | |
529 | - | |
530 | - if ((typeof call_arguments[i] == 'string' | |
531 | - && call_arguments[i] != '' | |
532 | - && call_arguments[i].search(/^\s+$/g) == -1) | |
533 | - && !isNaN(call_arguments[i]) | |
534 | - && isFinite(call_arguments[i])) { | |
535 | - // numerical value, convert it first | |
536 | - querystring += encodeURIComponent(querystring_argument_prefix + JSON.stringify(Number(call_arguments[i])) + '&'); | |
537 | - | |
538 | - } else { | |
539 | - querystring += encodeURIComponent(querystring_argument_prefix + JSON.stringify(call_arguments[i]) + '&'); | |
540 | - } | |
541 | - | |
542 | - } else { | |
543 | - // no CPAINT in the backend | |
544 | - querystring += encodeURIComponent(querystring_argument_prefix + call_arguments[i] + '&'); | |
545 | - } | |
546 | - } | |
547 | - | |
548 | - if (config['use_cpaint_api'] == true) { | |
549 | - // add remote function name to querystring | |
550 | - querystring += encodeURIComponent('&cpaint_function=' + remote_method); | |
551 | - | |
552 | - // add response type to querystring | |
553 | - querystring += encodeURIComponent('&cpaint_responsetype=' + config['response_type']); | |
554 | - } | |
555 | - | |
556 | - // build header | |
557 | - if (config['transfer_mode'] == 'GET') { | |
558 | - proxyscript += '?cpaint_remote_url=' + encodeURIComponent(url) | |
559 | - + '&cpaint_remote_query=' + querystring | |
560 | - + '&cpaint_remote_method=' + config['transfer_mode'] | |
561 | - + '&cpaint_response_type=' + config['response_type']; | |
562 | - | |
563 | - } else { | |
564 | - querystring = 'cpaint_remote_url=' + encodeURIComponent(url) | |
565 | - + '&cpaint_remote_query=' + querystring | |
566 | - + '&cpaint_remote_method=' + config['transfer_mode'] | |
567 | - + '&cpaint_response_type=' + config['response_type']; | |
568 | - } | |
569 | - | |
570 | - // open connection | |
571 | - get_connection_object(); | |
572 | - | |
573 | - // open connection to remote target | |
574 | - debug('opening connection to proxy "' + proxyscript + '"', 1); | |
575 | - httpobj.open(config['transfer_mode'], proxyscript, config['async']); | |
576 | - | |
577 | - // send "urlencoded" header if necessary (if POST) | |
578 | - if (config['transfer_mode'] == 'POST') { | |
579 | - | |
580 | - try { | |
581 | - httpobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); | |
582 | - | |
583 | - } catch (cp_err) { | |
584 | - debug('POST cannot be completed due to incompatible browser. Use GET as your request method.', 0); | |
585 | - } | |
586 | - } | |
587 | - | |
588 | - httpobj.setRequestHeader('X-Powered-By', 'CPAINT v' + version); | |
589 | - | |
590 | - // callback handling for asynchronous calls | |
591 | - httpobj.onreadystatechange = callback; | |
592 | - | |
593 | - // send content | |
594 | - if (config['transfer_mode'] == 'GET') { | |
595 | - httpobj.send(null); | |
596 | - | |
597 | - } else { | |
598 | - debug('sending query: ' + querystring, 1); | |
599 | - httpobj.send(querystring); | |
600 | - } | |
601 | - | |
602 | - if (config['async'] == false) { | |
603 | - // manual callback handling for synchronized calls | |
604 | - callback(); | |
605 | - } | |
606 | - } | |
607 | - | |
608 | - this.test_ajax_capability = function() { | |
609 | - return get_connection_object(); | |
610 | - } | |
611 | - | |
612 | - /** | |
613 | - * creates a new connection object. | |
614 | - * | |
615 | - * @access protected | |
616 | - * @return boolean | |
617 | - */ | |
618 | - var get_connection_object = function() { | |
619 | - var return_value = false; | |
620 | - var new_connection = false; | |
621 | - | |
622 | - // open new connection only if necessary | |
623 | - if (config['persistent_connection'] == false) { | |
624 | - // no persistance, create a new object every time | |
625 | - debug('Using new connection object', 1); | |
626 | - new_connection = true; | |
627 | - | |
628 | - } else { | |
629 | - // persistent connection object, only open one if no object exists | |
630 | - debug('Using shared connection object.', 1); | |
631 | - | |
632 | - if (typeof httpobj != 'object') { | |
633 | - debug('Getting new persistent connection object.', 1); | |
634 | - new_connection = true; | |
635 | - } | |
636 | - } | |
637 | - | |
638 | - if (new_connection == true) { | |
639 | - | |
640 | - try { | |
641 | - httpobj = new XMLHttpRequest(); | |
642 | - } catch (e1) { | |
643 | - | |
644 | - try { | |
645 | - httpobj = new ActiveXObject('Msxml2.XMLHTTP'); | |
646 | - | |
647 | - } catch (e) { | |
648 | - | |
649 | - try { | |
650 | - httpobj = new ActiveXObject('Microsoft.XMLHTTP'); | |
651 | - | |
652 | - } catch (oc) { | |
653 | - httpobj = null; | |
654 | - } | |
655 | - } | |
656 | - } | |
657 | - | |
658 | - | |
659 | - if (!httpobj) { | |
660 | - debug('Could not create connection object', 0); | |
661 | - | |
662 | - } else { | |
663 | - return_value = true; | |
664 | - } | |
665 | - } | |
666 | - | |
667 | - if (httpobj.readyState != 4) { | |
668 | - httpobj.abort(); | |
669 | - } | |
670 | - | |
671 | - return return_value; | |
672 | - } | |
673 | - | |
674 | - /** | |
675 | - * internal callback function. | |
676 | - * | |
677 | - * will perform some consistency checks (response code, NULL value testing) | |
678 | - * and if response_type = 'OBJECT' it will automatically call | |
679 | - * cpaint_call.parse_ajax_xml() to have a JavaScript object structure generated. | |
680 | - * | |
681 | - * after all that is done the client side callback function will be called | |
682 | - * with the generated response as single value. | |
683 | - * | |
684 | - * @access protected | |
685 | - * @return void | |
686 | - */ | |
687 | - var callback = function() { | |
688 | - var response = null; | |
689 | - | |
690 | - if (httpobj.readyState == 4 | |
691 | - && httpobj.status == 200) { | |
692 | - | |
693 | - debug(httpobj.responseText, 1); | |
694 | - debug('using response type ' + config['response_type'], 2); | |
695 | - | |
696 | - // fetch correct response | |
697 | - switch (config['response_type']) { | |
698 | - case 'XML': | |
699 | - debug(httpobj.responseXML, 2); | |
700 | - response = __cpaint_transformer.xml_conversion(httpobj.responseXML); | |
701 | - break; | |
702 | - | |
703 | - case 'OBJECT': | |
704 | - response = __cpaint_transformer.object_conversion(httpobj.responseXML); | |
705 | - break; | |
706 | - | |
707 | - case 'TEXT': | |
708 | - response = __cpaint_transformer.text_conversion(httpobj.responseText); | |
709 | - break; | |
710 | - | |
711 | - case 'E4X': | |
712 | - response = __cpaint_transformer.e4x_conversion(httpobj.responseText); | |
713 | - break; | |
714 | - | |
715 | - case 'JSON': | |
716 | - response = __cpaint_transformer.json_conversion(httpobj.responseText); | |
717 | - break; | |
718 | - | |
719 | - default: | |
720 | - debug('invalid response type \'' + response_type + '\'', 0); | |
721 | - } | |
722 | - | |
723 | - // call client side callback | |
724 | - if (response != null | |
725 | - && typeof client_callback == 'function') { | |
726 | - client_callback(response, httpobj.responseText); | |
727 | - } | |
728 | - // remove ourselves from the stack | |
729 | - remove_from_stack(); | |
730 | - | |
731 | - } else if (httpobj.readyState == 4 | |
732 | - && httpobj.status != 200) { | |
733 | - // HTTP error of some kind | |
734 | - debug('invalid HTTP response code \'' + Number(httpobj.status) + '\'', 0); | |
735 | - //client_callback("", "erro"); | |
736 | - } | |
737 | - } | |
738 | - | |
739 | - /** | |
740 | - * removes an entry from the stack | |
741 | - * | |
742 | - * @access protected | |
743 | - * @return void | |
744 | - */ | |
745 | - var remove_from_stack = function() { | |
746 | - // remove only if everything is okay and we're not configured as persistent connection | |
747 | - if (typeof stack_id == 'number' | |
748 | - && __cpaint_stack[stack_id] | |
749 | - && config['persistent_connection'] == false) { | |
750 | - | |
751 | - __cpaint_stack[stack_id] = null; | |
752 | - } | |
753 | - } | |
754 | - | |
755 | - /** | |
756 | - * debug method | |
757 | - * | |
758 | - * @access protected | |
759 | - * @param string message the message to debug | |
760 | - * @param integer debug_level debug level at which the message appears | |
761 | - * @return void | |
762 | - */ | |
763 | - var debug = function(message, debug_level) { | |
764 | - var prefix = '[CPAINT Debug] '; | |
765 | - | |
766 | - if (config['debugging'] < 1) { | |
767 | - prefix = '[CPAINT Error] '; | |
768 | - } | |
769 | - | |
770 | - if (config['debugging'] >= debug_level) { | |
771 | - alert(prefix + message); | |
772 | - } | |
773 | - if (message.search("error") > 1){client_callback("", message);} | |
774 | - } | |
775 | -} | |
776 | - | |
777 | -/** | |
778 | -* CPAINT transformation object | |
779 | -* | |
780 | -* @package CPAINT | |
781 | -* @access public | |
782 | -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint | |
783 | -* @author Paul Sullivan <wiley14@gmail.com> | |
784 | -* @author Dominique Stender <dstender@st-webdevelopment.de> | |
785 | -*/ | |
786 | -function cpaint_transformer() { | |
787 | - | |
788 | - /** | |
789 | - * will take a XMLHttpObject and generate a JavaScript | |
790 | - * object structure from it. | |
791 | - * | |
792 | - * is internally called by cpaint_call.callback() if necessary. | |
793 | - * will call cpaint_call.create_object_structure() to create nested object structures. | |
794 | - * | |
795 | - * @access public | |
796 | - * @param object xml_document a XMLHttpObject | |
797 | - * @return object | |
798 | - */ | |
799 | - this.object_conversion = function(xml_document) { | |
800 | - var return_value = new cpaint_result_object(); | |
801 | - var i = 0; | |
802 | - var firstNodeName = ''; | |
803 | - | |
804 | - if (typeof xml_document == 'object' | |
805 | - && xml_document != null) { | |
806 | - | |
807 | - // find the first element node - for MSIE the <?xml?> node is the very first... | |
808 | - for (i = 0; i < xml_document.childNodes.length; i++) { | |
809 | - | |
810 | - if (xml_document.childNodes[i].nodeType == 1) { | |
811 | - firstNodeName = xml_document.childNodes[i].nodeName; | |
812 | - break; | |
813 | - } | |
814 | - } | |
815 | - | |
816 | - var ajax_response = xml_document.getElementsByTagName(firstNodeName); | |
817 | - | |
818 | - return_value[firstNodeName] = new Array(); | |
819 | - | |
820 | - for (i = 0; i < ajax_response.length; i++) { | |
821 | - var tmp_node = create_object_structure(ajax_response[i]); | |
822 | - tmp_node.id = ajax_response[i].getAttribute('id') | |
823 | - return_value[firstNodeName].push(tmp_node); | |
824 | - } | |
825 | - | |
826 | - } else { | |
827 | - debug('received invalid XML response', 0); | |
828 | - } | |
829 | - | |
830 | - return return_value; | |
831 | - } | |
832 | - | |
833 | - /** | |
834 | - * performs the necessary conversions for the XML response type | |
835 | - * | |
836 | - * @access public | |
837 | - * @param object xml_document a XMLHttpObject | |
838 | - * @return object | |
839 | - */ | |
840 | - this.xml_conversion = function(xml_document) { | |
841 | - return xml_document; | |
842 | - } | |
843 | - | |
844 | - /** | |
845 | - * performs the necessary conversions for the TEXT response type | |
846 | - * | |
847 | - * @access public | |
848 | - * @param string text the response text | |
849 | - * @return string | |
850 | - */ | |
851 | - this.text_conversion = function(text) { | |
852 | - return decode(text); | |
853 | - } | |
854 | - | |
855 | - /** | |
856 | - * performs the necessary conversions for the E4X response type | |
857 | - * | |
858 | - * @access public | |
859 | - * @param string text the response text | |
860 | - * @return string | |
861 | - */ | |
862 | - this.e4x_conversion = function(text) { | |
863 | - // remove <?xml ?>tag | |
864 | - text = text.replace(/^\<\?xml[^>]+\>/, ''); | |
865 | - return new XML(text); | |
866 | - } | |
867 | - | |
868 | - /** | |
869 | - * performs the necessary conversions for the JSON response type | |
870 | - * | |
871 | - * @access public | |
872 | - * @param string text the response text | |
873 | - * @return string | |
874 | - */ | |
875 | - this.json_conversion = function(text) { | |
876 | - return JSON.parse(text); | |
877 | - } | |
878 | - | |
879 | - /** | |
880 | - * this method takes a HTML / XML node object and creates a | |
881 | - * JavaScript object structure from it. | |
882 | - * | |
883 | - * @access public | |
884 | - * @param object stream a node in the XML structure | |
885 | - * @return object | |
886 | - */ | |
887 | - var create_object_structure = function(stream) { | |
888 | - var return_value = new cpaint_result_object(); | |
889 | - var node_name = ''; | |
890 | - var i = 0; | |
891 | - var attrib = 0; | |
892 | - | |
893 | - if (stream.hasChildNodes() == true) { | |
894 | - for (i = 0; i < stream.childNodes.length; i++) { | |
895 | - | |
896 | - node_name = stream.childNodes[i].nodeName; | |
897 | - node_name = node_name.replace(/[^a-zA-Z0-9_]*/g, ''); | |
898 | - | |
899 | - // reset / create subnode | |
900 | - if (typeof return_value[node_name] != 'object') { | |
901 | - return_value[node_name] = new Array(); | |
902 | - } | |
903 | - | |
904 | - if (stream.childNodes[i].nodeType == 1) { | |
905 | - var tmp_node = create_object_structure(stream.childNodes[i]); | |
906 | - | |
907 | - for (attrib = 0; attrib < stream.childNodes[i].attributes.length; attrib++) { | |
908 | - tmp_node.set_attribute(stream.childNodes[i].attributes[attrib].nodeName, stream.childNodes[i].attributes[attrib].nodeValue); | |
909 | - } | |
910 | - | |
911 | - return_value[node_name].push(tmp_node); | |
912 | - | |
913 | - } else if (stream.childNodes[i].nodeType == 3) { | |
914 | - return_value.data = decode(String(stream.firstChild.data)); | |
915 | - } | |
916 | - } | |
917 | - } | |
918 | - | |
919 | - return return_value; | |
920 | - } | |
921 | - | |
922 | - /** | |
923 | - * converts an encoded text back to viewable characters. | |
924 | - * | |
925 | - * @access public | |
926 | - * @param string rawtext raw text as provided by the backend | |
927 | - * @return mixed | |
928 | - */ | |
929 | - var decode = function(rawtext) { | |
930 | - var plaintext = ''; | |
931 | - var i = 0; | |
932 | - var c1 = 0; | |
933 | - var c2 = 0; | |
934 | - var c3 = 0; | |
935 | - var u = 0; | |
936 | - var t = 0; | |
937 | - | |
938 | - // remove special JavaScript encoded non-printable characters | |
939 | - while (i < rawtext.length) { | |
940 | - if (rawtext.charAt(i) == '\\' | |
941 | - && rawtext.charAt(i + 1) == 'u') { | |
942 | - | |
943 | - u = 0; | |
944 | - | |
945 | - for (j = 2; j < 6; j += 1) { | |
946 | - t = parseInt(rawtext.charAt(i + j), 16); | |
947 | - | |
948 | - if (!isFinite(t)) { | |
949 | - break; | |
950 | - } | |
951 | - u = u * 16 + t; | |
952 | - } | |
953 | - | |
954 | - plaintext += String.fromCharCode(u); | |
955 | - i += 6; | |
956 | - | |
957 | - } else { | |
958 | - plaintext += rawtext.charAt(i); | |
959 | - i++; | |
960 | - } | |
961 | - } | |
962 | - | |
963 | - // convert numeric data to number type | |
964 | - if (plaintext != '' | |
965 | - && plaintext.search(/^\s+$/g) == -1 | |
966 | - && !isNaN(plaintext) | |
967 | - && isFinite(plaintext)) { | |
968 | - | |
969 | - plaintext = Number(plaintext); | |
970 | - } | |
971 | - | |
972 | - return plaintext; | |
973 | - } | |
974 | -} | |
975 | - | |
976 | -/** | |
977 | -* this is the basic prototype for a cpaint node object | |
978 | -* as used in cpaint_call.parse_ajax_xml() | |
979 | -* | |
980 | -* @package CPAINT | |
981 | -* @access public | |
982 | -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint | |
983 | -* @author Paul Sullivan <wiley14@gmail.com> | |
984 | -* @author Dominique Stender <dstender@st-webdevelopment.de> | |
985 | -*/ | |
986 | -function cpaint_result_object() { | |
987 | - this.id = 0; | |
988 | - this.data = ''; | |
989 | - var __attributes = new Array(); | |
990 | - | |
991 | - /** | |
992 | - * Returns a subnode with the given type and id. | |
993 | - * | |
994 | - * @access public | |
995 | - * @param string type The type of the subnode. Equivalent to the XML tag name. | |
996 | - * @param string id The id of the subnode. Equivalent to the XML tag names id attribute. | |
997 | - * @return object | |
998 | - */ | |
999 | - this.find_item_by_id = function() { | |
1000 | - var return_value = null; | |
1001 | - var type = arguments[0]; | |
1002 | - var id = arguments[1]; | |
1003 | - var i = 0; | |
1004 | - | |
1005 | - if (this[type]) { | |
1006 | - | |
1007 | - for (i = 0; i < this[type].length; i++) { | |
1008 | - | |
1009 | - if (this[type][i].get_attribute('id') == id) { | |
1010 | - return_value = this[type][i]; | |
1011 | - break; | |
1012 | - } | |
1013 | - } | |
1014 | - } | |
1015 | - | |
1016 | - return return_value; | |
1017 | - } | |
1018 | - | |
1019 | - /** | |
1020 | - * retrieves the value of an attribute. | |
1021 | - * | |
1022 | - * @access public | |
1023 | - * @param string name name of the attribute | |
1024 | - * @return mixed | |
1025 | - */ | |
1026 | - this.get_attribute = function() { | |
1027 | - var return_value = null; | |
1028 | - var id = arguments[0]; | |
1029 | - | |
1030 | - if (typeof __attributes[id] != 'undefined') { | |
1031 | - return_value = __attributes[id]; | |
1032 | - } | |
1033 | - | |
1034 | - return return_value; | |
1035 | - } | |
1036 | - | |
1037 | - /** | |
1038 | - * assigns a value to an attribute. | |
1039 | - * | |
1040 | - * if that attribute does not exist it will be created. | |
1041 | - * | |
1042 | - * @access public | |
1043 | - * @param string name name of the attribute | |
1044 | - * @param string value value of the attribute | |
1045 | - * @return void | |
1046 | - */ | |
1047 | - this.set_attribute = function() { | |
1048 | - __attributes[arguments[0]] = arguments[1]; | |
1049 | - } | |
1050 | -} | |
1051 | - | |
1052 | - | |
1053 | -/* | |
1054 | -Copyright (c) 2005 JSON.org | |
1055 | - | |
1056 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
1057 | -of this software and associated documentation files (the "Software"), to deal | |
1058 | -in the Software without restriction, including without limitation the rights | |
1059 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
1060 | -copies of the Software, and to permit persons to whom the Software is | |
1061 | -furnished to do so, subject to the following conditions: | |
1062 | - | |
1063 | -The Software shall be used for Good, not Evil. | |
1064 | - | |
1065 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
1066 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
1067 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
1068 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
1069 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
1070 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
1071 | -SOFTWARE. | |
1072 | -*/ | |
1073 | - | |
1074 | -Array.prototype.______array = '______array'; | |
1075 | - | |
1076 | -var JSON = { | |
1077 | - org: 'http://www.JSON.org', | |
1078 | - copyright: '(c)2005 JSON.org', | |
1079 | - license: 'http://www.crockford.com/JSON/license.html', | |
1080 | - | |
1081 | - stringify: function (arg) { | |
1082 | - var c, i, l, s = '', v; | |
1083 | - var numeric = true; | |
1084 | - | |
1085 | - switch (typeof arg) { | |
1086 | - case 'object': | |
1087 | - if (arg) { | |
1088 | - if (arg.______array == '______array') { | |
1089 | - // do a test whether all array keys are numeric | |
1090 | - for (i in arg) { | |
1091 | - if (i != '______array' | |
1092 | - && (isNaN(i) | |
1093 | - || !isFinite(i))) { | |
1094 | - numeric = false; | |
1095 | - break; | |
1096 | - } | |
1097 | - } | |
1098 | - | |
1099 | - if (numeric == true) { | |
1100 | - for (i = 0; i < arg.length; ++i) { | |
1101 | - if (typeof arg[i] != 'undefined') { | |
1102 | - v = this.stringify(arg[i]); | |
1103 | - if (s) { | |
1104 | - s += ','; | |
1105 | - } | |
1106 | - s += v; | |
1107 | - } else { | |
1108 | - s += ',null'; | |
1109 | - } | |
1110 | - } | |
1111 | - return '[' + s + ']'; | |
1112 | - } else { | |
1113 | - for (i in arg) { | |
1114 | - if (i != '______array') { | |
1115 | - v = arg[i]; | |
1116 | - if (typeof v != 'undefined' && typeof v != 'function') { | |
1117 | - v = this.stringify(v); | |
1118 | - if (s) { | |
1119 | - s += ','; | |
1120 | - } | |
1121 | - s += this.stringify(i) + ':' + v; | |
1122 | - } | |
1123 | - } | |
1124 | - } | |
1125 | - // return as object | |
1126 | - return '{' + s + '}'; | |
1127 | - } | |
1128 | - } else if (typeof arg.toString != 'undefined') { | |
1129 | - for (i in arg) { | |
1130 | - v = arg[i]; | |
1131 | - if (typeof v != 'undefined' && typeof v != 'function') { | |
1132 | - v = this.stringify(v); | |
1133 | - if (s) { | |
1134 | - s += ','; | |
1135 | - } | |
1136 | - s += this.stringify(i) + ':' + v; | |
1137 | - } | |
1138 | - } | |
1139 | - return '{' + s + '}'; | |
1140 | - } | |
1141 | - } | |
1142 | - return 'null'; | |
1143 | - case 'number': | |
1144 | - return isFinite(arg) ? String(arg) : 'null'; | |
1145 | - case 'string': | |
1146 | - l = arg.length; | |
1147 | - s = '"'; | |
1148 | - for (i = 0; i < l; i += 1) { | |
1149 | - c = arg.charAt(i); | |
1150 | - if (c >= ' ') { | |
1151 | - if (c == '\\' || c == '"') { | |
1152 | - s += '\\'; | |
1153 | - } | |
1154 | - s += c; | |
1155 | - } else { | |
1156 | - switch (c) { | |
1157 | - case '\b': | |
1158 | - s += '\\b'; | |
1159 | - break; | |
1160 | - case '\f': | |
1161 | - s += '\\f'; | |
1162 | - break; | |
1163 | - case '\n': | |
1164 | - s += '\\n'; | |
1165 | - break; | |
1166 | - case '\r': | |
1167 | - s += '\\r'; | |
1168 | - break; | |
1169 | - case '\t': | |
1170 | - s += '\\t'; | |
1171 | - break; | |
1172 | - default: | |
1173 | - c = c.charCodeAt(); | |
1174 | - s += '\\u00' + Math.floor(c / 16).toString(16) + | |
1175 | - (c % 16).toString(16); | |
1176 | - } | |
1177 | - } | |
1178 | - } | |
1179 | - return s + '"'; | |
1180 | - case 'boolean': | |
1181 | - return String(arg); | |
1182 | - default: | |
1183 | - return 'null'; | |
1184 | - } | |
1185 | - }, | |
1186 | - parse: function (text) { | |
1187 | - var at = 0; | |
1188 | - var ch = ' '; | |
1189 | - | |
1190 | - function error(m) { | |
1191 | - throw { | |
1192 | - name: 'JSONError', | |
1193 | - message: m, | |
1194 | - at: at - 1, | |
1195 | - text: text | |
1196 | - }; | |
1197 | - } | |
1198 | - | |
1199 | - function next() { | |
1200 | - ch = text.charAt(at); | |
1201 | - at += 1; | |
1202 | - return ch; | |
1203 | - } | |
1204 | - | |
1205 | - function white() { | |
1206 | - while (ch != '' && ch <= ' ') { | |
1207 | - next(); | |
1208 | - } | |
1209 | - } | |
1210 | - | |
1211 | - function str() { | |
1212 | - var i, s = '', t, u; | |
1213 | - | |
1214 | - if (ch == '"') { | |
1215 | -outer: while (next()) { | |
1216 | - if (ch == '"') { | |
1217 | - next(); | |
1218 | - return s; | |
1219 | - } else if (ch == '\\') { | |
1220 | - switch (next()) { | |
1221 | - case 'b': | |
1222 | - s += '\b'; | |
1223 | - break; | |
1224 | - case 'f': | |
1225 | - s += '\f'; | |
1226 | - break; | |
1227 | - case 'n': | |
1228 | - s += '\n'; | |
1229 | - break; | |
1230 | - case 'r': | |
1231 | - s += '\r'; | |
1232 | - break; | |
1233 | - case 't': | |
1234 | - s += '\t'; | |
1235 | - break; | |
1236 | - case 'u': | |
1237 | - u = 0; | |
1238 | - for (i = 0; i < 4; i += 1) { | |
1239 | - t = parseInt(next(), 16); | |
1240 | - if (!isFinite(t)) { | |
1241 | - break outer; | |
1242 | - } | |
1243 | - u = u * 16 + t; | |
1244 | - } | |
1245 | - s += String.fromCharCode(u); | |
1246 | - break; | |
1247 | - default: | |
1248 | - s += ch; | |
1249 | - } | |
1250 | - } else { | |
1251 | - s += ch; | |
1252 | - } | |
1253 | - } | |
1254 | - } | |
1255 | - error("Bad string"); | |
1256 | - } | |
1257 | - | |
1258 | - function arr() { | |
1259 | - var a = []; | |
1260 | - | |
1261 | - if (ch == '[') { | |
1262 | - next(); | |
1263 | - white(); | |
1264 | - if (ch == ']') { | |
1265 | - next(); | |
1266 | - return a; | |
1267 | - } | |
1268 | - while (ch) { | |
1269 | - a.push(val()); | |
1270 | - white(); | |
1271 | - if (ch == ']') { | |
1272 | - next(); | |
1273 | - return a; | |
1274 | - } else if (ch != ',') { | |
1275 | - break; | |
1276 | - } | |
1277 | - next(); | |
1278 | - white(); | |
1279 | - } | |
1280 | - } | |
1281 | - error("Bad array"); | |
1282 | - } | |
1283 | - | |
1284 | - function obj() { | |
1285 | - var k, o = {}; | |
1286 | - | |
1287 | - if (ch == '{') { | |
1288 | - next(); | |
1289 | - white(); | |
1290 | - if (ch == '}') { | |
1291 | - next(); | |
1292 | - return o; | |
1293 | - } | |
1294 | - while (ch) { | |
1295 | - k = str(); | |
1296 | - white(); | |
1297 | - if (ch != ':') { | |
1298 | - break; | |
1299 | - } | |
1300 | - next(); | |
1301 | - o[k] = val(); | |
1302 | - white(); | |
1303 | - if (ch == '}') { | |
1304 | - next(); | |
1305 | - return o; | |
1306 | - } else if (ch != ',') { | |
1307 | - break; | |
1308 | - } | |
1309 | - next(); | |
1310 | - white(); | |
1311 | - } | |
1312 | - } | |
1313 | - error("Bad object"); | |
1314 | - } | |
1315 | - | |
1316 | - function assoc() { | |
1317 | - var k, a = []; | |
1318 | - | |
1319 | - if (ch == '<') { | |
1320 | - next(); | |
1321 | - white(); | |
1322 | - if (ch == '>') { | |
1323 | - next(); | |
1324 | - return a; | |
1325 | - } | |
1326 | - while (ch) { | |
1327 | - k = str(); | |
1328 | - white(); | |
1329 | - if (ch != ':') { | |
1330 | - break; | |
1331 | - } | |
1332 | - next(); | |
1333 | - a[k] = val(); | |
1334 | - white(); | |
1335 | - if (ch == '>') { | |
1336 | - next(); | |
1337 | - return a; | |
1338 | - } else if (ch != ',') { | |
1339 | - break; | |
1340 | - } | |
1341 | - next(); | |
1342 | - white(); | |
1343 | - } | |
1344 | - } | |
1345 | - error("Bad associative array"); | |
1346 | - } | |
1347 | - | |
1348 | - function num() { | |
1349 | - var n = '', v; | |
1350 | - if (ch == '-') { | |
1351 | - n = '-'; | |
1352 | - next(); | |
1353 | - } | |
1354 | - while (ch >= '0' && ch <= '9') { | |
1355 | - n += ch; | |
1356 | - next(); | |
1357 | - } | |
1358 | - if (ch == '.') { | |
1359 | - n += '.'; | |
1360 | - while (next() && ch >= '0' && ch <= '9') { | |
1361 | - n += ch; | |
1362 | - } | |
1363 | - } | |
1364 | - if (ch == 'e' || ch == 'E') { | |
1365 | - n += 'e'; | |
1366 | - next(); | |
1367 | - if (ch == '-' || ch == '+') { | |
1368 | - n += ch; | |
1369 | - next(); | |
1370 | - } | |
1371 | - while (ch >= '0' && ch <= '9') { | |
1372 | - n += ch; | |
1373 | - next(); | |
1374 | - } | |
1375 | - } | |
1376 | - v = +n; | |
1377 | - if (!isFinite(v)) { | |
1378 | - error("Bad number"); | |
1379 | - } else { | |
1380 | - return v; | |
1381 | - } | |
1382 | - } | |
1383 | - | |
1384 | - function word() { | |
1385 | - switch (ch) { | |
1386 | - case 't': | |
1387 | - if (next() == 'r' && next() == 'u' && next() == 'e') { | |
1388 | - next(); | |
1389 | - return true; | |
1390 | - } | |
1391 | - break; | |
1392 | - case 'f': | |
1393 | - if (next() == 'a' && next() == 'l' && next() == 's' && | |
1394 | - next() == 'e') { | |
1395 | - next(); | |
1396 | - return false; | |
1397 | - } | |
1398 | - break; | |
1399 | - case 'n': | |
1400 | - if (next() == 'u' && next() == 'l' && next() == 'l') { | |
1401 | - next(); | |
1402 | - return null; | |
1403 | - } | |
1404 | - break; | |
1405 | - } | |
1406 | - error("Syntax error"); | |
1407 | - } | |
1408 | - | |
1409 | - function val() { | |
1410 | - white(); | |
1411 | - switch (ch) { | |
1412 | - case '{': | |
1413 | - return obj(); | |
1414 | - case '[': | |
1415 | - return arr(); | |
1416 | - case '<': | |
1417 | - return assoc(); | |
1418 | - case '"': | |
1419 | - return str(); | |
1420 | - case '-': | |
1421 | - return num(); | |
1422 | - default: | |
1423 | - return ch >= '0' && ch <= '9' ? num() : word(); | |
1424 | - } | |
1425 | - } | |
1426 | - | |
1427 | - return val(); | |
1428 | - } | |
1429 | -}; |
classesjs/cpaint/cpaint2.inc.php
... | ... | @@ -1,941 +0,0 @@ |
1 | -<?php | |
2 | -/** | |
3 | -* CPAINT - Cross-Platform Asynchronous INterface Toolkit | |
4 | -* | |
5 | -* http://sf.net/projects/cpaint | |
6 | -* | |
7 | -* released under the terms of the LGPL | |
8 | -* see http://www.fsf.org/licensing/licenses/lgpl.txt for details | |
9 | -* | |
10 | -* @package CPAINT | |
11 | -* @author Paul Sullivan <wiley14@gmail.com> | |
12 | -* @author Dominique Stender <dstender@st-webdevelopment.de> | |
13 | -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint | |
14 | -* @version 2.0.3 | |
15 | -*/ | |
16 | - | |
17 | -//---- includes ---------------------------------------------------------------- | |
18 | - /** | |
19 | - * @include JSON | |
20 | - */ | |
21 | - require_once(dirname(__FILE__) . '/json.php'); | |
22 | - | |
23 | - /** | |
24 | - * @include config | |
25 | - */ | |
26 | - require_once("cpaint2.config.php"); | |
27 | - | |
28 | -//---- variables --------------------------------------------------------------- | |
29 | - $GLOBALS['__cpaint_json'] = new JSON(); | |
30 | - | |
31 | -//---- error reporting --------------------------------------------------------- | |
32 | - error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING); | |
33 | - | |
34 | -//---- classes ----------------------------------------------------------------- | |
35 | - /** | |
36 | - * cpaint base class. | |
37 | - * | |
38 | - * @package CPAINT | |
39 | - * @access public | |
40 | - * @author Paul Sullivan <wiley14@gmail.com> | |
41 | - * @author Dominique Stender <dstender@st-webdevelopment.de> | |
42 | - * @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint | |
43 | - * @version 2.0.3 | |
44 | - */ | |
45 | - class cpaint { | |
46 | - /** | |
47 | - * version number | |
48 | - * | |
49 | - * @access private | |
50 | - * @var string $version | |
51 | - */ | |
52 | - var $version = '2.0.3'; | |
53 | - | |
54 | - /** | |
55 | - * response type. | |
56 | - * | |
57 | - * @access protected | |
58 | - * @var string $response_type | |
59 | - */ | |
60 | - var $response_type; | |
61 | - | |
62 | - /** | |
63 | - * the basenode ajaxResponse. | |
64 | - * | |
65 | - * @access protected | |
66 | - * @var object $basenode | |
67 | - */ | |
68 | - var $basenode; | |
69 | - | |
70 | - /** | |
71 | - * list of registered methods available through the CPAINT API | |
72 | - * | |
73 | - * @access protected | |
74 | - * @var array $api_functions | |
75 | - */ | |
76 | - var $api_functions; | |
77 | - | |
78 | - /** | |
79 | - * list of registered complex types used in the CPAINT API | |
80 | - * | |
81 | - * @access protected | |
82 | - * @var array $api_datatypes | |
83 | - */ | |
84 | - var $api_datatypes; | |
85 | - | |
86 | - /** | |
87 | - * whether or not the CPAINT API generates a WSDL when called with ?wsdl querystring | |
88 | - * | |
89 | - * @access private | |
90 | - * @var boolean $use_wsdl | |
91 | - */ | |
92 | - var $use_wsdl; | |
93 | - | |
94 | - /** | |
95 | - * PHP4 constructor. | |
96 | - * | |
97 | - * @access public | |
98 | - * @return void | |
99 | - */ | |
100 | - function cpaint() { | |
101 | - $this->__construct(); | |
102 | - } | |
103 | - | |
104 | - /** | |
105 | - * PHP 5 constructor. | |
106 | - * | |
107 | - * @access public | |
108 | - * @return void | |
109 | - * @todo -o"Dominique Stender" -ccpaint implement a better debugging | |
110 | - */ | |
111 | - function __construct() { | |
112 | - // initialize properties | |
113 | - $this->basenode = new cpaint_node(); | |
114 | - $this->basenode->set_name('ajaxResponse'); | |
115 | - $this->basenode->set_attribute('id', ''); | |
116 | - $this->basenode->set_encoding('UTF-8'); | |
117 | - | |
118 | - $this->response_type = 'TEXT'; | |
119 | - $this->api_functions = array(); | |
120 | - $this->api_datatypes = array(); | |
121 | - $this->use_wsdl = true; | |
122 | - | |
123 | - $this->complex_type(array( | |
124 | - 'name' => 'cpaintResponseType', | |
125 | - 'type' => 'restriction', // (restriction|complex|list) | |
126 | - 'base_type' => 'string', // scalar type of all values, e.g. 'string', for type = (restriction|list) only | |
127 | - 'values' => array( // for type = 'restriction' only: list of allowed values | |
128 | - 'XML', 'TEXT', 'OBJECT', 'E4X', 'JSON', | |
129 | - ), | |
130 | - ) | |
131 | - ); | |
132 | - $this->complex_type(array( | |
133 | - 'name' => 'cpaintDebugLevel', | |
134 | - 'type' => 'restriction', | |
135 | - 'base_type' => 'long', | |
136 | - 'values' => array( | |
137 | - -1, 0, 1, 2 | |
138 | - ), | |
139 | - ) | |
140 | - ); | |
141 | - $this->complex_type(array( | |
142 | - 'name' => 'cpaintDebugMessage', | |
143 | - 'type' => 'list', | |
144 | - 'base_type' => 'string', | |
145 | - ) | |
146 | - ); | |
147 | - | |
148 | - $this->complex_type(array( | |
149 | - 'name' => 'cpaintRequestHead', | |
150 | - 'type' => 'complex', | |
151 | - 'struct' => array( | |
152 | - 0 => array('name' => 'functionName', 'type' => 'string'), | |
153 | - 1 => array('name' => 'responseType', 'type' => 'cpaintResponseType'), | |
154 | - 2 => array('name' => 'debugLevel', 'type' => 'cpaintDebugLevel'), | |
155 | - ), | |
156 | - ) | |
157 | - ); | |
158 | - | |
159 | - $this->complex_type(array( | |
160 | - 'name' => 'cpaintResponseHead', | |
161 | - 'type' => 'complex', | |
162 | - 'struct' => array( | |
163 | - 0 => array('name' => 'success', 'type' => 'boolean'), | |
164 | - 1 => array('name' => 'debugger', 'type' => 'cpaintDebugMessage'), | |
165 | - ), | |
166 | - ) | |
167 | - ); | |
168 | - | |
169 | - // determine response type | |
170 | - if (isset($_REQUEST['cpaint_response_type'])) { | |
171 | - $this->response_type = htmlentities(strip_tags(strtoupper((string) $_REQUEST['cpaint_response_type']))); | |
172 | - } // end: if | |
173 | - } | |
174 | - | |
175 | - /** | |
176 | - * calls the user function responsible for this specific call. | |
177 | - * | |
178 | - * @access public | |
179 | - * @param string $input_encoding input data character encoding, default is UTF-8 | |
180 | - * @return void | |
181 | - */ | |
182 | - function start($input_encoding = 'UTF-8') { | |
183 | - $user_function = ''; | |
184 | - $arguments = array(); | |
185 | - | |
186 | - // work only if there is no API version request | |
187 | - if (!isset($_REQUEST['api_query']) | |
188 | - && !isset($_REQUEST['wsdl'])) { | |
189 | - $this->basenode->set_encoding($input_encoding); | |
190 | - | |
191 | - if ($_REQUEST['cpaint_function'] != '') { | |
192 | - $user_function = $_REQUEST['cpaint_function']; | |
193 | - if(@$_REQUEST['cpaint_argument']) | |
194 | - $arguments = $_REQUEST['cpaint_argument']; | |
195 | - else | |
196 | - $arguments = array(); | |
197 | - } | |
198 | - | |
199 | - // perform character conversion on every argument | |
200 | - foreach ($arguments as $key => $value) { | |
201 | - | |
202 | - if (get_magic_quotes_gpc() == true) { | |
203 | - $value = stripslashes($value); | |
204 | - } // end: if | |
205 | - | |
206 | - // convert from JSON string | |
207 | - $arguments[$key] = $GLOBALS['__cpaint_json']->parse($value); | |
208 | - } // end: foreach | |
209 | - | |
210 | - $arguments = cpaint_transformer::decode_array($arguments, $this->basenode->get_encoding()); | |
211 | - | |
212 | - if (is_array($this->api_functions[$user_function]) | |
213 | - && is_callable($this->api_functions[$user_function]['call'])) { | |
214 | - // a valid API function is to be called | |
215 | - call_user_func_array($this->api_functions[$user_function]['call'], $arguments); | |
216 | - } else if ($user_function != '') { | |
217 | - // desired function is not registered as API function | |
218 | - $this->basenode->set_data('[CPAINT] A function name was passed that is not allowed to execute on this server.'); | |
219 | - } | |
220 | - } // end: if | |
221 | - } | |
222 | - | |
223 | - /** | |
224 | - * generates and prints the response based on response type supplied by the frontend. | |
225 | - * | |
226 | - * @access public | |
227 | - * @return void | |
228 | - */ | |
229 | - function return_data() { | |
230 | - // send appropriate headers to avoid caching | |
231 | - header('Expires: Fri, 14 Mar 1980 20:53:00 GMT'); | |
232 | - header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); | |
233 | - header('Cache-Control: no-cache, must-revalidate'); | |
234 | - header('Pragma: no-cache'); | |
235 | - header('X-Powered-By: CPAINT v' . $this->version . '/PHP v' . phpversion()); | |
236 | - | |
237 | - // work only if there is no API version request | |
238 | - | |
239 | - if (!isset($_REQUEST['api_query']) | |
240 | - && !isset($_REQUEST['wsdl'])) { | |
241 | - // trigger generation of response | |
242 | - switch (trim($this->response_type)) { | |
243 | - | |
244 | - case 'TEXT': | |
245 | - header('Content-type: text/plain; charset=' . cpaint_transformer::find_output_charset($this->basenode->get_encoding())); | |
246 | - echo cpaint_transformer::toString($this->basenode); | |
247 | - break; | |
248 | - | |
249 | - case 'JSON': | |
250 | - header('Content-type: text/plain; charset=' . cpaint_transformer::find_output_charset($this->basenode->get_encoding())); | |
251 | - echo cpaint_transformer::toJSON($this->basenode); | |
252 | - break; | |
253 | - | |
254 | - case 'OBJECT': | |
255 | - case 'E4X': | |
256 | - case 'XML': | |
257 | - header('Content-type: text/xml; charset=' . cpaint_transformer::find_output_charset($this->basenode->get_encoding())); | |
258 | - echo '<?xml version="1.0" encoding="' . cpaint_transformer::find_output_charset($this->basenode->get_encoding()) . '"?>' | |
259 | - . cpaint_transformer::toXML($this->basenode); | |
260 | - break; | |
261 | - | |
262 | - default: | |
263 | - echo 'ERROR: invalid response type \'' . $this->response_type . '\''; | |
264 | - } // end: switch | |
265 | - | |
266 | - } elseif (isset($_REQUEST['api_query'])) { | |
267 | - // API version request | |
268 | - header('Content-type: text/plain; charset=ISO-8859-1'); | |
269 | - echo 'CPAINT v' . $this->version . '/PHP v' . phpversion(); | |
270 | - | |
271 | - } elseif ($this->use_wsdl == true | |
272 | - && isset($_REQUEST['wsdl'])) { | |
273 | - | |
274 | - if (is_file(dirname(__FILE__) . '/cpaint2.wsdl.php') | |
275 | - && is_readable(dirname(__FILE__) . '/cpaint2.wsdl.php')) { | |
276 | - | |
277 | - require_once(dirname(__FILE__) . '/cpaint2.wsdl.php'); | |
278 | - | |
279 | - if (class_exists('cpaint_wsdl')) { | |
280 | - // create new instance of WSDL library | |
281 | - $wsdl = new cpaint_wsdl(); | |
282 | - | |
283 | - // build WSDL info | |
284 | - header('Content-type: text/xml; charset=UTF-8'); | |
285 | - echo $wsdl->generate($this->api_functions, $this->api_datatypes); | |
286 | - | |
287 | - } else { | |
288 | - header('Content-type: text/plain; charset=ISO-8859-1'); | |
289 | - echo 'WSDL generator is unavailable'; | |
290 | - } // end: if | |
291 | - | |
292 | - } else { | |
293 | - header('Content-type: text/plain; charset=ISO-8859-1'); | |
294 | - echo 'WSDL generator is unavailable'; | |
295 | - } // end: if | |
296 | - } // end: if | |
297 | - } | |
298 | - | |
299 | - /** | |
300 | - * registers a new function or method as part of the CPAINT API | |
301 | - * | |
302 | - * @access public | |
303 | - * @param mixed $func function name, array(&$object, 'function_name') or array('class', 'function_name') | |
304 | - * @param array $input function input parameters (not yet used by CPAINT and subject to change) | |
305 | - * @param array $output function output format (not yed used by CPAINT and subject to change) | |
306 | - * @param string $comment description of the functionality | |
307 | - * @return boolean | |
308 | - */ | |
309 | - function register($func, $input = array(), $output = array(), $comment = '') { | |
310 | - $return_value = false; | |
311 | - $input = (array) $input; | |
312 | - $output = (array) $output; | |
313 | - $comment = (string) $comment; | |
314 | - | |
315 | - if (is_array($func) | |
316 | - && (is_object($func[0]) || is_string($func[0])) | |
317 | - && is_string($func[1]) | |
318 | - && is_callable($func)) { | |
319 | - | |
320 | - // calling a method of an object | |
321 | - $this->api_functions[$func[1]] = array( | |
322 | - 'call' => $func, | |
323 | - 'input' => $input, | |
324 | - 'output' => $output, | |
325 | - 'comment' => $comment, | |
326 | - ); | |
327 | - $return_value = true; | |
328 | - | |
329 | - } elseif (is_string($func)) { | |
330 | - // calling a standalone function | |
331 | - $this->api_functions[$func] = array( | |
332 | - 'call' => $func, | |
333 | - 'input' => $input, | |
334 | - 'output' => $output, | |
335 | - 'comment' => $comment, | |
336 | - ); | |
337 | - $return_value = true; | |
338 | - } // end: if | |
339 | - | |
340 | - return $return_value; | |
341 | - } | |
342 | - | |
343 | - | |
344 | - | |
345 | - /** | |
346 | - * unregisters a function that is currently part of the CPAINT API. | |
347 | - * | |
348 | - * proves useful when the same set of functions is to be used in the | |
349 | - * frontend and in some kind of administration environment. you might | |
350 | - * want to unregister a few (admin) functions for the frontend in this | |
351 | - * case. | |
352 | - * | |
353 | - * @access public | |
354 | - * @param string $func function name | |
355 | - * @return boolean | |
356 | - */ | |
357 | - function unregister($func) { | |
358 | - $retval = false; | |
359 | - | |
360 | - if (is_array($this->api_functions[$func])) { | |
361 | - unset($this->api_functions[$func]); | |
362 | - } // end: if | |
363 | - | |
364 | - return $retval; | |
365 | - } | |
366 | - | |
367 | - | |
368 | - | |
369 | - /** | |
370 | - * registers a complex data type | |
371 | - * | |
372 | - * @access public | |
373 | - * @param array $schema schema definition for the complex type | |
374 | - * @return boolean | |
375 | - */ | |
376 | - function complex_type($schema) { | |
377 | - $return_value = false; | |
378 | - $schema = (array) $schema; | |
379 | - | |
380 | - if ($schema['name'] != '' | |
381 | - && in_array($schema['type'], array('restriction', 'complex', 'list'))) { | |
382 | - | |
383 | - $this->api_datatypes[] = $schema; | |
384 | - $return_value = true; | |
385 | - } // end: if | |
386 | - | |
387 | - return $return_value; | |
388 | - } | |
389 | - | |
390 | - /** | |
391 | - * switches the generation of WSDL on/off. default is on | |
392 | - * | |
393 | - * @access public | |
394 | - * @param boolean $state state of WSDL generation | |
395 | - * @return void | |
396 | - */ | |
397 | - function use_wsdl($state) { | |
398 | - $this->use_wsdl = (boolean) $state; | |
399 | - } | |
400 | - | |
401 | - /** | |
402 | - * adds a new subnode to the basenode. | |
403 | - * | |
404 | - * will return a reference to it for further processing. | |
405 | - * | |
406 | - * @access public | |
407 | - * @param string $nodename name of the new node | |
408 | - * @param string $id id of the new node | |
409 | - * @return object | |
410 | - */ | |
411 | - function &add_node($nodename, $id = '') { | |
412 | - return $this->basenode->add_node($nodename, $id); | |
413 | - } | |
414 | - | |
415 | - /** | |
416 | - * assigns textual data to the basenode. | |
417 | - * | |
418 | - * @access public | |
419 | - * @param mixed $data data to assign to this node | |
420 | - * @return void | |
421 | - */ | |
422 | - function set_data($data) { | |
423 | - $this->basenode->set_data($data); | |
424 | - } | |
425 | - | |
426 | - /** | |
427 | - * returns the data assigned to the basenode. | |
428 | - * | |
429 | - * @access public | |
430 | - * @return mixed | |
431 | - */ | |
432 | - function get_data() { | |
433 | - return $this->basenode->get_data(); | |
434 | - } | |
435 | - | |
436 | - /** | |
437 | - * sets the id property of the basenode. | |
438 | - * | |
439 | - * @deprecated deprecated since version 2.0.0 | |
440 | - * @access public | |
441 | - * @param string $id the id | |
442 | - * @return void | |
443 | - */ | |
444 | - function set_id($id) { | |
445 | - $this->basenode->set_attribute('id', $id); | |
446 | - } | |
447 | - | |
448 | - /** | |
449 | - * gets the id property of the basenode. | |
450 | - * | |
451 | - * @deprecated deprecated since version 2.0.0 | |
452 | - * @access public | |
453 | - * @return string | |
454 | - */ | |
455 | - function get_id() { | |
456 | - return $this->basenode->get_attribute('id'); | |
457 | - } | |
458 | - | |
459 | - /** | |
460 | - * adds a new attribute to the basenode. | |
461 | - * | |
462 | - * @access public | |
463 | - * @param string $name attribute name | |
464 | - * @param mixed $value attribute value | |
465 | - * @return void | |
466 | - */ | |
467 | - function set_attribute($name, $value) { | |
468 | - $this->basenode->set_attribute($name, $value); | |
469 | - } | |
470 | - | |
471 | - /** | |
472 | - * retrieves an attribute of the basenode by name. | |
473 | - * | |
474 | - * @access public | |
475 | - * @param string $name attribute name | |
476 | - * @return string | |
477 | - */ | |
478 | - function get_attribute($name) { | |
479 | - return $this->basenode->get_attributes($name); | |
480 | - } | |
481 | - | |
482 | - /** | |
483 | - * set name property of the basenode. | |
484 | - * | |
485 | - * @access public | |
486 | - * @param string $name the name | |
487 | - * @return void | |
488 | - */ | |
489 | - function set_name($name) { | |
490 | - $this->basenode->set_name($name); | |
491 | - } | |
492 | - | |
493 | - /** | |
494 | - * get name property of the basenode. | |
495 | - * | |
496 | - * @access public | |
497 | - * @return string | |
498 | - */ | |
499 | - function get_name() { | |
500 | - return $this->basenode->get_name(); | |
501 | - } | |
502 | - | |
503 | - | |
504 | - | |
505 | - /** | |
506 | - * returns the response type as requested by the client | |
507 | - * | |
508 | - * @access public | |
509 | - * @return string | |
510 | - */ | |
511 | - function get_response_type() { | |
512 | - return $this->response_type; | |
513 | - } | |
514 | - | |
515 | - } | |
516 | - | |
517 | - /** | |
518 | - * a cpaint data node. Data nodes are used to build up the response. | |
519 | - * | |
520 | - * @package CPAINT | |
521 | - * @access public | |
522 | - * @author Dominique Stender <dstender@st-webdevelopment.de> | |
523 | - * @copyright 2005-2006 (Dominique Stender); All rights reserved | |
524 | - * @version 2.0.3 | |
525 | - */ | |
526 | - class cpaint_node { | |
527 | - /** | |
528 | - * array of subnodes. | |
529 | - * | |
530 | - * @access public | |
531 | - * @var array $composites | |
532 | - */ | |
533 | - var $composites; | |
534 | - | |
535 | - /** | |
536 | - * node attributes. | |
537 | - * | |
538 | - * @access public | |
539 | - * @var array $attributes | |
540 | - */ | |
541 | - var $attributes; | |
542 | - | |
543 | - /** | |
544 | - * name of this node. | |
545 | - * | |
546 | - * @access public | |
547 | - * @var string $nodename | |
548 | - */ | |
549 | - var $nodename; | |
550 | - | |
551 | - /** | |
552 | - * textual data of this node. | |
553 | - * | |
554 | - * @access public | |
555 | - * @var string $data | |
556 | - */ | |
557 | - var $data; | |
558 | - | |
559 | - /** | |
560 | - * character encoding for input data | |
561 | - * | |
562 | - * @access private | |
563 | - * @var $input_encoding | |
564 | - */ | |
565 | - var $input_encoding; | |
566 | - | |
567 | - /** | |
568 | - * PHP4 constructor. | |
569 | - * | |
570 | - * @package CPAINT | |
571 | - * @access public | |
572 | - * @return void | |
573 | - */ | |
574 | - function cpaint_node() { | |
575 | - $this->__construct(); | |
576 | - } | |
577 | - | |
578 | - /** | |
579 | - * PHP 5 constructor. | |
580 | - * | |
581 | - * @access public | |
582 | - * @return void | |
583 | - */ | |
584 | - function __construct() { | |
585 | - // initialize properties | |
586 | - $this->composites = array(); | |
587 | - $this->attributes = array(); | |
588 | - $this->data = ''; | |
589 | - | |
590 | - $this->set_encoding('UTF-8'); | |
591 | - $this->set_name(''); | |
592 | - $this->set_attribute('id', ''); | |
593 | - } | |
594 | - | |
595 | - /** | |
596 | - * adds a new subnode to this node. | |
597 | - * | |
598 | - * will return a reference to it for further processing. | |
599 | - * | |
600 | - * @access public | |
601 | - * @param string $nodename name of the new node | |
602 | - * @param string $id id of the new node | |
603 | - * @return object | |
604 | - */ | |
605 | - function &add_node($nodename, $id = '') { | |
606 | - $composites = count($this->composites); | |
607 | - | |
608 | - // create new node | |
609 | - $this->composites[$composites] =& new cpaint_node(); | |
610 | - $this->composites[$composites]->set_name($nodename); | |
611 | - $this->composites[$composites]->set_attribute('id', $id); | |
612 | - $this->composites[$composites]->set_encoding($this->input_encoding); | |
613 | - | |
614 | - return $this->composites[$composites]; | |
615 | - } | |
616 | - | |
617 | - /** | |
618 | - * assigns textual data to this node. | |
619 | - * | |
620 | - * @access public | |
621 | - * @param mixed $data data to assign to this node | |
622 | - * @return void | |
623 | - */ | |
624 | - function set_data($data) { | |
625 | - $this->data = $data; | |
626 | - } | |
627 | - | |
628 | - /** | |
629 | - * returns the textual data assigned to this node. | |
630 | - * | |
631 | - * @access public | |
632 | - * @return mixed | |
633 | - */ | |
634 | - function get_data() { | |
635 | - return $this->data; | |
636 | - } | |
637 | - | |
638 | - /** | |
639 | - * sets the id property of this node. | |
640 | - * | |
641 | - * @deprecated deprecated since version 2.0.0 | |
642 | - * @access public | |
643 | - * @param string id the id | |
644 | - * @return void | |
645 | - */ | |
646 | - function set_id($id) { | |
647 | - if ($id != '') { | |
648 | - $this->set_attribute('id', $id); | |
649 | - } // end: if | |
650 | - } | |
651 | - | |
652 | - /** | |
653 | - * returns the id property if this node. | |
654 | - * | |
655 | - * @deprecated deprecated since version 2.0.0 | |
656 | - * @access public | |
657 | - * @return string | |
658 | - */ | |
659 | - function get_id() { | |
660 | - return $this->get_attribute('id'); | |
661 | - } | |
662 | - | |
663 | - /** | |
664 | - * adds a new attribute to this node. | |
665 | - * | |
666 | - * @access public | |
667 | - * @param string $name attribute name | |
668 | - * @param mixed $value attribute value | |
669 | - * @return void | |
670 | - */ | |
671 | - function set_attribute($name, $value) { | |
672 | - $this->attributes[$name] = (string) $value; | |
673 | - } | |
674 | - | |
675 | - /** | |
676 | - * retrieves an attribute by name. | |
677 | - * | |
678 | - * @access public | |
679 | - * @param string $name attribute name | |
680 | - * @return string | |
681 | - */ | |
682 | - function get_attribute($name) { | |
683 | - return $this->attributes[$name]; | |
684 | - } | |
685 | - | |
686 | - /** | |
687 | - * set name property. | |
688 | - * | |
689 | - * @access public | |
690 | - * @param string $name the name | |
691 | - * @return void | |
692 | - */ | |
693 | - function set_name($name) { | |
694 | - $this->nodename = (string) $name; | |
695 | - } | |
696 | - | |
697 | - /** | |
698 | - * get name property. | |
699 | - * | |
700 | - * @access public | |
701 | - * @return string | |
702 | - */ | |
703 | - function get_name() { | |
704 | - return $this->nodename; | |
705 | - } | |
706 | - | |
707 | - /** | |
708 | - * sets the character encoding for this node | |
709 | - * | |
710 | - * @access public | |
711 | - * @param string $encoding character encoding | |
712 | - * @return void | |
713 | - */ | |
714 | - function set_encoding($encoding) { | |
715 | - $this->input_encoding = strtoupper((string) $encoding); | |
716 | - } | |
717 | - | |
718 | - /** | |
719 | - * returns the character encoding for this node | |
720 | - * | |
721 | - * @access public | |
722 | - * @return string | |
723 | - */ | |
724 | - function get_encoding() { | |
725 | - return $this->input_encoding; | |
726 | - } | |
727 | - } | |
728 | - | |
729 | - /** | |
730 | - * static class of output transformers. | |
731 | - * | |
732 | - * @package CPAINT | |
733 | - * @access public | |
734 | - * @author Dominique Stender <dstender@st-webdevelopment.de> | |
735 | - * @copyright 2003-2006 (Dominique Stender); All rights reserved | |
736 | - * @version 2.0.3 | |
737 | - */ | |
738 | - class cpaint_transformer { | |
739 | - /** | |
740 | - * toString method, used to generate response of type TEXT. | |
741 | - * will perform character transformation according to parameters. | |
742 | - * | |
743 | - * @access public | |
744 | - * @param object $node a cpaint_node object | |
745 | - * @return string | |
746 | - */ | |
747 | - function toString(&$node) { | |
748 | - $return_value = ''; | |
749 | - | |
750 | - foreach ($node->composites as $composite) { | |
751 | - $return_value .= cpaint_transformer::toString($composite); | |
752 | - } | |
753 | - | |
754 | - $return_value .= cpaint_transformer::encode($node->get_data(), $node->get_encoding()); | |
755 | - | |
756 | - return $return_value; | |
757 | - } | |
758 | - | |
759 | - /** | |
760 | - * XML response generator. | |
761 | - * will perform character transformation according to parameters. | |
762 | - * | |
763 | - * @access public | |
764 | - * @param object $node a cpaint_node object | |
765 | - * @return string | |
766 | - */ | |
767 | - function toXML(&$node) { | |
768 | - $return_value = '<' . $node->get_name(); | |
769 | - | |
770 | - // handle attributes | |
771 | - foreach ($node->attributes as $name => $value) { | |
772 | - if ($value != '') { | |
773 | - $return_value .= ' ' . $name . '="' . $node->get_attribute($name) . '"'; | |
774 | - } | |
775 | - } // end: foreach | |
776 | - | |
777 | - $return_value .= '>'; | |
778 | - | |
779 | - // handle subnodes | |
780 | - foreach ($node->composites as $composite) { | |
781 | - $return_value .= cpaint_transformer::toXML($composite); | |
782 | - } | |
783 | - | |
784 | - $return_value .= cpaint_transformer::encode($node->get_data(), $node->get_encoding()) | |
785 | - . '</' . $node->get_name() . '>'; | |
786 | - | |
787 | - return $return_value; | |
788 | - } | |
789 | - | |
790 | - /** | |
791 | - * JSON response generator. | |
792 | - * will perform character transformation according to parameters. | |
793 | - * | |
794 | - * @access public | |
795 | - * @param object $node a cpaint_node object | |
796 | - * @return string | |
797 | - */ | |
798 | - function toJSON($node) { | |
799 | - $return_value = ''; | |
800 | - $JSON_node = new stdClass(); | |
801 | - | |
802 | - // handle attributes | |
803 | - $JSON_node->attributes = $node->attributes; | |
804 | - | |
805 | - // handle subnodes | |
806 | - foreach ($node->composites as $composite) { | |
807 | - | |
808 | - if (!is_array($JSON_node->{$composite->nodename})) { | |
809 | - $JSON_node->{$composite->nodename} = array(); | |
810 | - } // end: if | |
811 | - | |
812 | - // we need to parse the JSON object again to avoid multiple encoding | |
813 | - $JSON_node->{$composite->nodename}[] = $GLOBALS['__cpaint_json']->parse(cpaint_transformer::toJSON($composite)); | |
814 | - } | |
815 | - | |
816 | - // handle data | |
817 | - $JSON_node->data = $node->data; | |
818 | - | |
819 | - return $GLOBALS['__cpaint_json']->stringify($JSON_node); | |
820 | - } | |
821 | - | |
822 | - /** | |
823 | - * performs conversion to JavaScript-safe UTF-8 characters | |
824 | - * | |
825 | - * @access public | |
826 | - * @param string $data data to convert | |
827 | - * @param string $encoding character encoding | |
828 | - * @return string | |
829 | - */ | |
830 | - function encode($data, $encoding) { | |
831 | - // convert string | |
832 | - if (function_exists('iconv')) { | |
833 | - // iconv is by far the most flexible approach, try this first | |
834 | - $return_value = iconv($encoding, 'UTF-8', $data); | |
835 | - | |
836 | - } elseif ($encoding == 'ISO-8859-1') { | |
837 | - // for ISO-8859-1 we can use utf8-encode() | |
838 | - $return_value = utf8_encode($data); | |
839 | - | |
840 | - } else { | |
841 | - // give up. if UTF-8 data was supplied everything is fine! | |
842 | - $return_value = $data; | |
843 | - } /* end: if */ | |
844 | - | |
845 | - // now encode non-printable characters | |
846 | - for ($i = 0; $i < 32; $i++) { | |
847 | - $return_value = str_replace(chr($i), '\u00' . sprintf('%02x', $i), $return_value); | |
848 | - } // end: for | |
849 | - | |
850 | - // encode <, >, and & respectively for XML sanity | |
851 | - $return_value = str_replace(chr(0x26), '\u0026', $return_value); | |
852 | - $return_value = str_replace(chr(0x3c), '\u003c', $return_value); | |
853 | - $return_value = str_replace(chr(0x3e), '\u003e', $return_value); | |
854 | - | |
855 | - return $return_value; | |
856 | - } | |
857 | - | |
858 | - /** | |
859 | - * performs conversion from JavaScript encodeURIComponent() string (UTF-8) to | |
860 | - * the charset in use. | |
861 | - * | |
862 | - * @access public | |
863 | - * @param string $data data to convert | |
864 | - * @param string $encoding character encoding | |
865 | - * @return string | |
866 | - */ | |
867 | - function decode($data, $encoding) { | |
868 | - // convert string | |
869 | - | |
870 | - if (is_string($data)) { | |
871 | - if (function_exists('iconv')) { | |
872 | - // iconv is by far the most flexible approach, try this first | |
873 | - $return_value = iconv('UTF-8', $encoding, $data); | |
874 | - | |
875 | - } elseif ($encoding == 'ISO-8859-1') { | |
876 | - // for ISO-8859-1 we can use utf8-decode() | |
877 | - $return_value = utf8_decode($data); | |
878 | - | |
879 | - } else { | |
880 | - // give up. if data was supplied in the correct format everything is fine! | |
881 | - $return_value = $data; | |
882 | - } // end: if | |
883 | - | |
884 | - } else { | |
885 | - // non-string value | |
886 | - $return_value = $data; | |
887 | - } // end: if | |
888 | - | |
889 | - return $return_value; | |
890 | - } | |
891 | - | |
892 | - /** | |
893 | - * decodes a (nested) array of data from UTF-8 into the configured character set | |
894 | - * | |
895 | - * @access public | |
896 | - * @param array $data data to convert | |
897 | - * @param string $encoding character encoding | |
898 | - * @return array | |
899 | - */ | |
900 | - function decode_array($data, $encoding) { | |
901 | - $return_value = array(); | |
902 | - | |
903 | - foreach ($data as $key => $value) { | |
904 | - | |
905 | - if (!is_array($value)) { | |
906 | - $return_value[$key] = cpaint_transformer::decode($value, $encoding); | |
907 | - | |
908 | - } else { | |
909 | - $return_value[$key] = cpaint_transformer::decode_array($value, $encoding); | |
910 | - } | |
911 | - } | |
912 | - | |
913 | - return $return_value; | |
914 | - } | |
915 | - | |
916 | - /** | |
917 | - * determines the output character set | |
918 | - * based on input character set | |
919 | - * | |
920 | - * @access public | |
921 | - * @param string $encoding character encoding | |
922 | - * @return string | |
923 | - */ | |
924 | - function find_output_charset($encoding) { | |
925 | - $return_value = 'UTF-8'; | |
926 | - | |
927 | - if (function_exists('iconv') | |
928 | - || $encoding == 'UTF-8' | |
929 | - || $encoding == 'ISO-8859-1') { | |
930 | - | |
931 | - $return_value = 'UTF-8'; | |
932 | - | |
933 | - } else { | |
934 | - $return_value = $encoding; | |
935 | - } // end: if | |
936 | - | |
937 | - return $return_value; | |
938 | - } | |
939 | - } | |
940 | - | |
941 | -?> | |
942 | 0 | \ No newline at end of file |
classesjs/cpaint/cpaint2.proxy.php
... | ... | @@ -1,117 +0,0 @@ |
1 | -<?php | |
2 | -/** | |
3 | -* CPAINT (Cross-Platform Asynchronous INterface Toolkit) | |
4 | -* | |
5 | -* http://sf.net/projects/cpaint | |
6 | -* | |
7 | -* released under the terms of the GPL | |
8 | -* see http://www.fsf.org/licensing/licenses/gpl.txt for details | |
9 | -* | |
10 | -* | |
11 | -* proxy script to pass request on to remote servers | |
12 | -* | |
13 | -* @package CPAINT | |
14 | -* @author Paul Sullivan <wiley14@gmail.com> | |
15 | -* @author Dominique Stender <dstender@st-webdevelopment.de> | |
16 | -* @copyright Copyright (c) 2005-2006 Paul Sullivan, Dominique Stender - http://sf.net/projects/cpaint | |
17 | -* @version 2.0.3 | |
18 | -*/ | |
19 | - | |
20 | -//---- includes ---------------------------------------------------------------- | |
21 | - /** | |
22 | - * @include config | |
23 | - */ | |
24 | - require_once("cpaint2.config.php"); | |
25 | - | |
26 | -//---- main code --------------------------------------------------------------- | |
27 | - | |
28 | - error_reporting (E_ALL ^ E_NOTICE ^ E_WARNING); | |
29 | - set_time_limit(0); | |
30 | - | |
31 | - if ($_REQUEST['cpaint_remote_url'] != "") { | |
32 | - $cp_remote_url = urldecode($_REQUEST['cpaint_remote_url']); | |
33 | - $cp_remote_method = urldecode($_REQUEST['cpaint_remote_method']); | |
34 | - $cp_remote_query = urldecode($_REQUEST['cpaint_remote_query']); | |
35 | - $cp_response_type = strtoupper($_REQUEST['cpaint_response_type']); | |
36 | - } | |
37 | - | |
38 | - // propagate XML header if necessary | |
39 | - if ($cp_response_type == 'XML' | |
40 | - || $cp_response_type == 'OBJECT') { | |
41 | - header("Content-type: text/xml"); | |
42 | - } | |
43 | - | |
44 | - // transfer mode specifics | |
45 | - if ($cp_remote_method == 'GET') { | |
46 | - $cp_remote_url .= '?' . $cp_remote_query; | |
47 | - $cp_request_body = ''; | |
48 | - | |
49 | - // prepare parameters | |
50 | - $url_parts = parse_url($cp_remote_url); | |
51 | - | |
52 | - // build basic header | |
53 | - $cp_request_header = 'GET ' . $url_parts['path'] . '?' . str_replace(' ', '+', $url_parts['query']) . " HTTP/1.0\r\n" | |
54 | - . "Host: " . $url_parts['host'] . "\r\n"; | |
55 | - | |
56 | - } elseif ($cp_remote_method == 'POST') { | |
57 | - $cp_request_body = '&' . $cp_remote_query; | |
58 | - | |
59 | - // prepare parameters | |
60 | - $url_parts = parse_url($cp_remote_url); | |
61 | - | |
62 | - // check against whitelist | |
63 | - if ($cpaint2_config["proxy.security.use_whitelist"] == true) { | |
64 | - $url_allowed = false; | |
65 | - foreach($cpaint2_proxy_whitelist as $whitelistURL) { | |
66 | - $whiteList_parts = parse_url("http://" . $whitelistURL); | |
67 | - $url_parts_temp = parse_url("http://" . $cp_remote_url); | |
68 | - if (array_key_exists("path", $whiteList_parts)) { | |
69 | - if ((strtolower($whiteList_parts["path"]) == strtolower($url_parts_temp["path"])) && (strtolower($whiteList_parts["host"]) == strtolower($url_parts_temp["host"]))) $url_allowed = true; | |
70 | - } else { // no path, check only host | |
71 | - if (strtolower($whiteList_parts["host"]) == strtolower($url_parts_temp["host"])) $url_allowed = true; | |
72 | - } | |
73 | - } | |
74 | - if ($url_allowed == false) die("[CPAINT] The host or script cannot be accessed through this proxy."); | |
75 | - } | |
76 | - | |
77 | - // build basic header | |
78 | - $cp_request_header = 'POST ' . $url_parts['path'] . " HTTP/1.0\r\n" | |
79 | - . "Host: " . $url_parts['host'] . "\r\n" | |
80 | - . "Content-Type: application/x-www-form-urlencoded\r\n"; | |
81 | - } | |
82 | - | |
83 | - // add port if none exists | |
84 | - if (!isset($url_parts['port'])) { | |
85 | - $url_parts['port'] = 80; | |
86 | - } | |
87 | - | |
88 | - // add content-length header | |
89 | - $cp_request_header .= "Content-Length: " . strlen($cp_request_body) . "\r\n"; | |
90 | - | |
91 | - // add authentication to header if necessary | |
92 | - if ($url_parts['user'] != '') { | |
93 | - $cp_request_header .= 'Authorization: Basic ' . base64_encode($url_parts['user'] . ':' . $url_parts['pass']) . "\r\n"; | |
94 | - } | |
95 | - | |
96 | - // open connection | |
97 | - $cp_socket = @fsockopen($url_parts['host'], $url_parts['port'], $error, $errstr, 10); | |
98 | - | |
99 | - if ($cp_socket !== false) { | |
100 | - // send headers | |
101 | - @fwrite($cp_socket, $cp_request_header . "\r\n\r\n"); | |
102 | - | |
103 | - // send body if necessary | |
104 | - if ($cp_request_body != '') { | |
105 | - @fwrite($cp_socket, $cp_request_body . "\r\n"); | |
106 | - } | |
107 | - | |
108 | - while (!feof($cp_socket)) { | |
109 | - $http_data = $http_data . fgets($cp_socket); | |
110 | - } | |
111 | - | |
112 | - list($http_headers, $http_body) = split("\r\n\r\n", $http_data, 2); | |
113 | - echo($http_body); | |
114 | - @fclose($cp_socket); | |
115 | - } | |
116 | - | |
117 | -?> | |
118 | 0 | \ No newline at end of file |
classesjs/cpaint/json.php
... | ... | @@ -1,580 +0,0 @@ |
1 | -<?php | |
2 | -/** | |
3 | -* The content of this file is (c) 2003-2005 digital media center GmbH | |
4 | -* All rights reserved | |
5 | -* | |
6 | -* a JSON parser / generator. | |
7 | -* implemented as 100% compatible port of the original JSON parser | |
8 | -* by Douglas Crockford on http://www.JSON.org. | |
9 | -* | |
10 | -* @package JSON | |
11 | -* @access public | |
12 | -* @copyright Copyright (c) 2005-2006 Dominique Stender - http://sf.net/projects/cpaint | |
13 | -* @license http://www.crockford.com/JSON/license.html | |
14 | -* @author Dominique Stender <dstender@st-webdevelopment.de> | |
15 | -* @version 1.0.1 | |
16 | -*/ | |
17 | - | |
18 | - | |
19 | - | |
20 | - /** | |
21 | - * a JSON parser / generator | |
22 | - * | |
23 | - * @access public | |
24 | - * @author Dominique Stender <dst@dmc.de> | |
25 | - * @version 1.0.1 | |
26 | - */ | |
27 | - class JSON { | |
28 | - /** | |
29 | - * line counter | |
30 | - * | |
31 | - * @access private | |
32 | - * @var integer $at | |
33 | - */ | |
34 | - var $at = 0; | |
35 | - | |
36 | - /** | |
37 | - * | |
38 | - * @access private | |
39 | - * @var string $ch | |
40 | - */ | |
41 | - var $ch = ' '; | |
42 | - | |
43 | - /** | |
44 | - * JSON representation | |
45 | - * | |
46 | - * @access private | |
47 | - * @var string $text | |
48 | - */ | |
49 | - var $text = ''; | |
50 | - | |
51 | - /** | |
52 | - * takes an arbitrary PHP data structure and generates a valid JSON representation from it | |
53 | - * | |
54 | - * @param mixed $arg an arbitrary PHP data structure | |
55 | - * @access public | |
56 | - * @return string | |
57 | - * @version 1.0.1 fixed tests whether $s has content by using strlen(). this enables the user to use 0 as very first character | |
58 | - */ | |
59 | - function stringify($arg) { | |
60 | - $returnValue = ''; | |
61 | - $c = ''; | |
62 | - $i = ''; | |
63 | - $l = ''; | |
64 | - $s = ''; | |
65 | - $v = ''; | |
66 | - $numeric = true; | |
67 | - | |
68 | - switch (gettype($arg)) { | |
69 | - | |
70 | - case 'array': | |
71 | - // do a test whether all array keys are numeric | |
72 | - foreach ($arg as $i => $v) { | |
73 | - if (!is_numeric($i)) { | |
74 | - $numeric = false; | |
75 | - break; | |
76 | - } | |
77 | - } | |
78 | - | |
79 | - if ($numeric) { | |
80 | - | |
81 | - foreach ($arg as $i => $v) { | |
82 | - if (strlen($s) > 0) { | |
83 | - $s .= ','; | |
84 | - } | |
85 | - | |
86 | - $s .= $this->stringify($arg[$i]); | |
87 | - } // end: foreach | |
88 | - | |
89 | - $returnValue = '[' . $s . ']'; | |
90 | - | |
91 | - } else { | |
92 | - // associative array | |
93 | - foreach ($arg as $i => $v) { | |
94 | - if (strlen($s) > 0) { | |
95 | - $s .= ','; | |
96 | - } | |
97 | - $s .= $this->stringify($i) . ':' . $this->stringify($arg[$i]); | |
98 | - } | |
99 | - // return as object | |
100 | - $returnValue = '{' . $s . '}'; | |
101 | - } | |
102 | - break; | |
103 | - | |
104 | - case 'object': | |
105 | - | |
106 | - foreach (get_object_vars($arg) as $i => $v) { | |
107 | - $v = $this->stringify($v); | |
108 | - | |
109 | - if (strlen($s) > 0) { | |
110 | - $s .= ','; | |
111 | - } | |
112 | - | |
113 | - $s .= $this->stringify($i) . ':' . $v; | |
114 | - } | |
115 | - | |
116 | - $returnValue = '{' . $s . '}'; | |
117 | - break; | |
118 | - | |
119 | - case 'integer': | |
120 | - case 'double': | |
121 | - $returnValue = is_numeric($arg) ? (string) $arg : 'null'; | |
122 | - break; | |
123 | - | |
124 | - case 'string': | |
125 | - $l = strlen($arg); | |
126 | - $s = '"'; | |
127 | - | |
128 | - for ($i = 0; $i < $l; $i++) { | |
129 | - $c = $arg{$i}; | |
130 | - | |
131 | - if (ord($c) >= ord(' ')) { | |
132 | - | |
133 | - if ($c == '\\' | |
134 | - || $c == '"') { | |
135 | - | |
136 | - $s .= '\\'; | |
137 | - } | |
138 | - $s .= $c; | |
139 | - | |
140 | - } else { | |
141 | - | |
142 | - switch ($c) { | |
143 | - | |
144 | - case '\b': | |
145 | - $s .= '\\b'; | |
146 | - break; | |
147 | - | |
148 | - case '\f': | |
149 | - $s .= '\\f'; | |
150 | - break; | |
151 | - | |
152 | - case '\n': | |
153 | - $s .= '\\n'; | |
154 | - break; | |
155 | - | |
156 | - case '\r': | |
157 | - $s .= '\\r'; | |
158 | - break; | |
159 | - | |
160 | - case '\t': | |
161 | - $s .= '\\t'; | |
162 | - break; | |
163 | - | |
164 | - default: | |
165 | - $s .= '\u00' . sprintf('%02x', ord($c)); | |
166 | - } | |
167 | - } | |
168 | - } | |
169 | - $returnValue = $s . '"'; | |
170 | - break; | |
171 | - | |
172 | - case 'boolean': | |
173 | - $returnValue = (string) $arg; | |
174 | - break; | |
175 | - | |
176 | - default: | |
177 | - $returnValue = 'null'; | |
178 | - } | |
179 | - | |
180 | - return $returnValue; | |
181 | - } | |
182 | - | |
183 | - | |
184 | - /** | |
185 | - * parses the given string into a PHP data structure | |
186 | - * | |
187 | - * @param string $text JSON data representation | |
188 | - * @access public | |
189 | - * @return mixed | |
190 | - */ | |
191 | - function parse($text) { | |
192 | - $this->at = 0; | |
193 | - $this->ch = ' '; | |
194 | - $this->text = $text; | |
195 | - | |
196 | - return $this->val(); | |
197 | - } | |
198 | - | |
199 | - /** | |
200 | - * triggers a PHP_ERROR | |
201 | - * | |
202 | - * @access private | |
203 | - * @param string $m error message | |
204 | - * @return void | |
205 | - */ | |
206 | - function error($m) { | |
207 | - trigger_error($m . ' at offset ' . $this->at . ': ' . $this->text, E_USER_ERROR); | |
208 | - } | |
209 | - | |
210 | - /** | |
211 | - * returns the next character of a JSON string | |
212 | - * | |
213 | - * @access private | |
214 | - * @return string | |
215 | - */ | |
216 | - function next() { | |
217 | - $this->ch = $this->text{$this->at}; | |
218 | - $this->at++; | |
219 | - return $this->ch; | |
220 | - } | |
221 | - | |
222 | - /** | |
223 | - * handles whitespace and comments | |
224 | - * | |
225 | - * @access private | |
226 | - * @return void | |
227 | - */ | |
228 | - function white() { | |
229 | - | |
230 | - while ($this->ch != '' | |
231 | - && ord($this->ch) <= ord(' ')) { | |
232 | - | |
233 | - $this->next(); | |
234 | - } | |
235 | - } | |
236 | - | |
237 | - /** | |
238 | - * handles strings | |
239 | - * | |
240 | - * @access private | |
241 | - * @return void | |
242 | - */ | |
243 | - function str() { | |
244 | - $i = ''; | |
245 | - $s = ''; | |
246 | - $t = ''; | |
247 | - $u = ''; | |
248 | - | |
249 | - if ($this->ch == '"') { | |
250 | - | |
251 | - while ($this->next() !== null) { | |
252 | - | |
253 | - if ($this->ch == '"') { | |
254 | - $this->next(); | |
255 | - return $s; | |
256 | - | |
257 | - } elseif ($this->ch == '\\') { | |
258 | - | |
259 | - switch ($this->next()) { | |
260 | - case 'b': | |
261 | - $s .= '\b'; | |
262 | - break; | |
263 | - | |
264 | - case 'f': | |
265 | - $s .= '\f'; | |
266 | - break; | |
267 | - | |
268 | - case 'n': | |
269 | - $s .= '\n'; | |
270 | - break; | |
271 | - | |
272 | - case 'r': | |
273 | - $s .= '\r'; | |
274 | - break; | |
275 | - | |
276 | - case 't': | |
277 | - $s .= '\t'; | |
278 | - break; | |
279 | - | |
280 | - case 'u': | |
281 | - $u = 0; | |
282 | - | |
283 | - for ($i = 0; $i < 4; $i += 1) { | |
284 | - $t = (integer) sprintf('%01c', hexdec($this->next())); | |
285 | - | |
286 | - if (!is_numeric($t)) { | |
287 | - break 2; | |
288 | - } | |
289 | - $u = $u * 16 + $t; | |
290 | - } | |
291 | - | |
292 | - $s .= chr($u); | |
293 | - break; | |
294 | - | |
295 | - default: | |
296 | - $s .= $this->ch; | |
297 | - } | |
298 | - } else { | |
299 | - $s .= $this->ch; | |
300 | - } | |
301 | - } | |
302 | - } | |
303 | - | |
304 | - $this->error('Bad string'); | |
305 | - } | |
306 | - | |
307 | - /** | |
308 | - * handless arrays | |
309 | - * | |
310 | - * @access private | |
311 | - * @return void | |
312 | - */ | |
313 | - function arr() { | |
314 | - $a = array(); | |
315 | - | |
316 | - if ($this->ch == '[') { | |
317 | - $this->next(); | |
318 | - $this->white(); | |
319 | - | |
320 | - if ($this->ch == ']') { | |
321 | - $this->next(); | |
322 | - return $a; | |
323 | - } | |
324 | - | |
325 | - while ($this->ch) { | |
326 | - array_push($a, $this->val()); | |
327 | - $this->white(); | |
328 | - | |
329 | - if ($this->ch == ']') { | |
330 | - $this->next(); | |
331 | - return $a; | |
332 | - | |
333 | - } elseif ($this->ch != ',') { | |
334 | - break; | |
335 | - } | |
336 | - | |
337 | - $this->next(); | |
338 | - $this->white(); | |
339 | - } | |
340 | - | |
341 | - $this->error('Bad array'); | |
342 | - } | |
343 | - } | |
344 | - | |
345 | - /** | |
346 | - * handles objects | |
347 | - * | |
348 | - * @access public | |
349 | - * @return void | |
350 | - */ | |
351 | - function obj() { | |
352 | - $k = ''; | |
353 | - $o = new stdClass(); | |
354 | - | |
355 | - if ($this->ch == '{') { | |
356 | - $this->next(); | |
357 | - $this->white(); | |
358 | - | |
359 | - if ($this->ch == '}') { | |
360 | - $this->next(); | |
361 | - return $o; | |
362 | - } | |
363 | - | |
364 | - while ($this->ch) { | |
365 | - $k = $this->str(); | |
366 | - $this->white(); | |
367 | - | |
368 | - if ($this->ch != ':') { | |
369 | - break; | |
370 | - } | |
371 | - | |
372 | - $this->next(); | |
373 | - $o->$k = $this->val(); | |
374 | - $this->white(); | |
375 | - | |
376 | - if ($this->ch == '}') { | |
377 | - $this->next(); | |
378 | - return $o; | |
379 | - | |
380 | - } elseif ($this->ch != ',') { | |
381 | - break; | |
382 | - } | |
383 | - | |
384 | - $this->next(); | |
385 | - $this->white(); | |
386 | - } | |
387 | - } | |
388 | - | |
389 | - $this->error('Bad object'); | |
390 | - } | |
391 | - | |
392 | - /** | |
393 | - * handles objects | |
394 | - * | |
395 | - * @access public | |
396 | - * @return void | |
397 | - */ | |
398 | - function assoc() { | |
399 | - $k = ''; | |
400 | - $a = array(); | |
401 | - | |
402 | - if ($this->ch == '<') { | |
403 | - $this->next(); | |
404 | - $this->white(); | |
405 | - | |
406 | - if ($this->ch == '>') { | |
407 | - $this->next(); | |
408 | - return $a; | |
409 | - } | |
410 | - | |
411 | - while ($this->ch) { | |
412 | - $k = $this->str(); | |
413 | - $this->white(); | |
414 | - | |
415 | - if ($this->ch != ':') { | |
416 | - break; | |
417 | - } | |
418 | - | |
419 | - $this->next(); | |
420 | - $a[$k] = $this->val(); | |
421 | - $this->white(); | |
422 | - | |
423 | - if ($this->ch == '>') { | |
424 | - $this->next(); | |
425 | - return $a; | |
426 | - | |
427 | - } elseif ($this->ch != ',') { | |
428 | - break; | |
429 | - } | |
430 | - | |
431 | - $this->next(); | |
432 | - $this->white(); | |
433 | - } | |
434 | - } | |
435 | - | |
436 | - $this->error('Bad associative array'); | |
437 | - } | |
438 | - | |
439 | - /** | |
440 | - * handles numbers | |
441 | - * | |
442 | - * @access private | |
443 | - * @return void | |
444 | - */ | |
445 | - function num() { | |
446 | - $n = ''; | |
447 | - $v = ''; | |
448 | - | |
449 | - if ($this->ch == '-') { | |
450 | - $n = '-'; | |
451 | - $this->next(); | |
452 | - } | |
453 | - | |
454 | - while ($this->ch >= '0' | |
455 | - && $this->ch <= '9') { | |
456 | - | |
457 | - $n .= $this->ch; | |
458 | - $this->next(); | |
459 | - } | |
460 | - | |
461 | - if ($this->ch == '.') { | |
462 | - $n .= '.'; | |
463 | - | |
464 | - while ($this->next() | |
465 | - && $this->ch >= '0' | |
466 | - && $this->ch <= '9') { | |
467 | - | |
468 | - $n .= $this->ch; | |
469 | - } | |
470 | - } | |
471 | - | |
472 | - if ($this->ch == 'e' | |
473 | - || $this->ch == 'E') { | |
474 | - | |
475 | - $n .= 'e'; | |
476 | - $this->next(); | |
477 | - | |
478 | - if ($this->ch == '-' | |
479 | - || $this->ch == '+') { | |
480 | - | |
481 | - $n .= $this->ch; | |
482 | - $this->next(); | |
483 | - } | |
484 | - | |
485 | - while ($this->ch >= '0' | |
486 | - && $this->ch <= '9') { | |
487 | - | |
488 | - $n .= $this->ch; | |
489 | - $this->next(); | |
490 | - } | |
491 | - } | |
492 | - | |
493 | - $v += $n; | |
494 | - | |
495 | - if (!is_numeric($v)) { | |
496 | - $this->error('Bad number'); | |
497 | - | |
498 | - } else { | |
499 | - return $v; | |
500 | - } // end: if | |
501 | - } | |
502 | - | |
503 | - /** | |
504 | - * handles words | |
505 | - * | |
506 | - * @access private | |
507 | - * @return mixed | |
508 | - */ | |
509 | - function word() { | |
510 | - switch ($this->ch) { | |
511 | - | |
512 | - case 't': | |
513 | - | |
514 | - if ($this->next() == 'r' | |
515 | - && $this->next() == 'u' | |
516 | - && $this->next() == 'e') { | |
517 | - | |
518 | - $this->next(); | |
519 | - return true; | |
520 | - } | |
521 | - break; | |
522 | - | |
523 | - case 'f': | |
524 | - if ($this->next() == 'a' | |
525 | - && $this->next() == 'l' | |
526 | - && $this->next() == 's' | |
527 | - && $this->next() == 'e') { | |
528 | - | |
529 | - $this->next(); | |
530 | - return false; | |
531 | - } | |
532 | - break; | |
533 | - | |
534 | - case 'n': | |
535 | - if ($this->next() == 'u' | |
536 | - && $this->next() == 'l' | |
537 | - && $this->next() == 'l') { | |
538 | - | |
539 | - $this->next(); | |
540 | - return null; | |
541 | - } | |
542 | - break; | |
543 | - } | |
544 | - | |
545 | - $this->error('Syntax error'); | |
546 | - } | |
547 | - | |
548 | - /** | |
549 | - * generic value handler | |
550 | - * | |
551 | - * @access private | |
552 | - * @return mixed | |
553 | - */ | |
554 | - function val() { | |
555 | - $this->white(); | |
556 | - | |
557 | - switch ($this->ch) { | |
558 | - | |
559 | - case '{': | |
560 | - return $this->obj(); | |
561 | - | |
562 | - case '[': | |
563 | - return $this->arr(); | |
564 | - | |
565 | - case '<': | |
566 | - return $this->assoc(); | |
567 | - | |
568 | - case '"': | |
569 | - return $this->str(); | |
570 | - | |
571 | - case '-': | |
572 | - return $this->num(); | |
573 | - | |
574 | - default: | |
575 | - return ($this->ch >= '0' && $this->ch <= '9') ? $this->num() : $this->word(); | |
576 | - } | |
577 | - } | |
578 | - } | |
579 | - | |
580 | -?> | |
581 | 0 | \ No newline at end of file |