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,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,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 | \ No newline at end of file | 0 | \ No newline at end of file |
classesjs/cpaint/JSON/testsuite.php
@@ -1,351 +0,0 @@ | @@ -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 | \ No newline at end of file | 0 | \ No newline at end of file |
classesjs/cpaint/JSON/testsuite2.php
@@ -1,413 +0,0 @@ | @@ -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 | \ No newline at end of file | 0 | \ No newline at end of file |
classesjs/cpaint/changelog.txt
@@ -1,134 +0,0 @@ | @@ -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,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 | \ No newline at end of file | 0 | \ No newline at end of file |
classesjs/cpaint/cpaint2.config.php
@@ -1,35 +0,0 @@ | @@ -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 | \ No newline at end of file | 0 | \ No newline at end of file |
classesjs/cpaint/cpaint2.inc.compressed.js
@@ -1,116 +0,0 @@ | @@ -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 | \ No newline at end of file | 0 | \ No newline at end of file |
classesjs/cpaint/cpaint2.inc.js
@@ -1,1429 +0,0 @@ | @@ -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,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 | \ No newline at end of file | 0 | \ No newline at end of file |
classesjs/cpaint/cpaint2.proxy.php
@@ -1,117 +0,0 @@ | @@ -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 | \ No newline at end of file | 0 | \ No newline at end of file |
classesjs/cpaint/json.php
@@ -1,580 +0,0 @@ | @@ -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 | \ No newline at end of file | 0 | \ No newline at end of file |