diff options
author | mensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f> | 2008-11-13 09:49:11 +0000 |
---|---|---|
committer | mensonge <mensonge@b3834d28-1941-0410-a4f8-b48e95affb8f> | 2008-11-13 09:49:11 +0000 |
commit | e44a7e37b6c7b5961adaffc62b9042b8d442938e (patch) | |
tree | 95b67c356e93163467db2451f2b8cce84ed5d582 /includes/js/dojox/rpc/tests/resources | |
parent | a62b9742ee5e28bcec6872d88f50f25b820914f6 (diff) | |
download | semanticscuttle-e44a7e37b6c7b5961adaffc62b9042b8d442938e.tar.gz semanticscuttle-e44a7e37b6c7b5961adaffc62b9042b8d442938e.tar.bz2 |
New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit
git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f
Diffstat (limited to 'includes/js/dojox/rpc/tests/resources')
22 files changed, 1279 insertions, 0 deletions
diff --git a/includes/js/dojox/rpc/tests/resources/JSON.php b/includes/js/dojox/rpc/tests/resources/JSON.php new file mode 100644 index 0000000..4a21ce7 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/JSON.php @@ -0,0 +1,724 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ + +/** + * Converts to and from JSON format. + * + * JSON (JavaScript Object Notation) is a lightweight data-interchange + * format. It is easy for humans to read and write. It is easy for machines + * to parse and generate. It is based on a subset of the JavaScript + * Programming Language, Standard ECMA-262 3rd Edition - December 1999. + * This feature can also be found in Python. JSON is a text format that is + * completely language independent but uses conventions that are familiar + * to programmers of the C-family of languages, including C, C++, C#, Java, + * JavaScript, Perl, TCL, and many others. These properties make JSON an + * ideal data-interchange language. + * + * This package provides a simple encoder and decoder for JSON notation. It + * is intended for use with client-side Javascript applications that make + * use of HTTPRequest to perform server communication functions - data can + * be encoded into JSON notation for use in a client-side javascript, or + * decoded from incoming Javascript requests. JSON format is native to + * Javascript, and can be directly eval()'ed with no further parsing + * overhead + * + * All strings should be in ASCII or UTF-8 format! + * + * LICENSE: Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: Redistributions of source code must retain the + * above copyright notice, this list of conditions and the following + * disclaimer. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * @category + * @package Services_JSON + * @author Michal Migurski <mike-json@teczno.com> + * @author Matt Knapp <mdknapp[at]gmail[dot]com> + * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com> + * @copyright 2005 Michal Migurski + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 8); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 10); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_STRICT_TYPE', 11); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * <code> + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * </code> + */ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior: when encoding or decoding, + * be loose or strict about object/array usage + * + * possible values: + * - SERVICES_JSON_STRICT_TYPE: strict typing, default. + * "{...}" syntax creates objects in decode(). + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays in decode(). + */ + function Services_JSON($use = SERVICES_JSON_STRICT_TYPE) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $ut8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return string JSON string representation of input var + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + return '{' . + join(',', array_map(array($this, 'name_value'), + array_keys($var), + array_values($var))) + . '}'; + } + + // treat it like a regular array + return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']'; + + case 'object': + $vars = get_object_vars($var); + return '{' . + join(',', array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars))) + . '}'; + + default: + return ''; + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + return $this->encode(strval($name)) . ':' . $this->encode($value); + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use == SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + (($chrs{$c - 1} != '\\') || + ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) { + // found a quote, we're in a string, and it's not escaped + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + +} + +?>
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/bigQuery b/includes/js/dojox/rpc/tests/resources/bigQuery new file mode 100644 index 0000000..e8f9429 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/bigQuery @@ -0,0 +1 @@ +[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/bigQuery5 b/includes/js/dojox/rpc/tests/resources/bigQuery5 new file mode 100644 index 0000000..e77ca8d --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/bigQuery5 @@ -0,0 +1 @@ +[1,2,3,4,5]
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/echo.php b/includes/js/dojox/rpc/tests/resources/echo.php new file mode 100644 index 0000000..b38a3ee --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/echo.php @@ -0,0 +1,7 @@ +<?php + if (!$_REQUEST["message"]){ + print "ERROR: message property not found"; + }else{ + print $_REQUEST["message"]; + } +?> diff --git a/includes/js/dojox/rpc/tests/resources/echoJson.php b/includes/js/dojox/rpc/tests/resources/echoJson.php new file mode 100644 index 0000000..52b5d03 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/echoJson.php @@ -0,0 +1,8 @@ +<?php + if (!$_REQUEST["message"]){ + print "ERROR: message property not found"; + }else{ + header("Content-Type: application/json"); + print $_REQUEST["message"]; + } +?> diff --git a/includes/js/dojox/rpc/tests/resources/fakestore.php b/includes/js/dojox/rpc/tests/resources/fakestore.php new file mode 100644 index 0000000..075926a --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/fakestore.php @@ -0,0 +1,36 @@ +<?php + session_start(); + $fn = preg_replace("/\W/","",$_REQUEST["location"]); + switch ($_SERVER["REQUEST_METHOD"]) { + case "GET" : + if (isset($_SESSION[$fn])) { + print($_SESSION[$fn]); + } + else { + $fh = fopen($fn, 'r'); + print(fread($fh, filesize($fn))); + fclose($fh); + } + break; + case "PUT" : + $contents = file_get_contents('php://input'); + print($contents); + $_SESSION[$fn]=$contents; + break; + case "POST" : + if (isset($_SESSION[$fn])) { + $old = $_SESSION[$fn]; + } + else { + $fh = fopen($fn, 'r'); + $old = fread($fh, filesize($fn)); + fclose($fh); + } + $contents = file_get_contents('php://input'); + $_SESSION[$fn]=$old . $contents; + break; + case "DELETE" : + $_SESSION[$fn]="deleted"; + break; + } +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc10.php b/includes/js/dojox/rpc/tests/resources/jsonRpc10.php new file mode 100644 index 0000000..fc99b75 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc10.php @@ -0,0 +1,47 @@ +<?php + require_once("./JSON.php"); + + // FIXME: doesn't look like we really need Pear at all + // which decreases the testing burden. + // Commenting out.the require and the new File() call. + + // NOTE: File.php is installed via Pear using: + // %> sudo pear install File + // Your server will also need the Pear library directory included in PHP's + // include_path configuration directive + // require_once('File.php'); + + // ensure that we don't try to send "html" down to the client + header("Content-Type: text/plain"); + + $json = new Services_JSON; + //$fp = new File(); + + $results = array(); + $results['error'] = null; + + $jsonRequest = file_get_contents('php://input'); + //$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + + $req = $json->decode($jsonRequest); + + $method = $req->method; + $params = $req->params; + + switch($method) { + case "postJsonRpc10EchoNamed": + case "postJsonRpc10Echo": + $results['result']=$params[0]; + break; + default: + $results['result']=""; + $results['error']="JSON-RPC 1.0 METHOD NOT FOUND"; + break; + } + + $results['id'] = $req->id; + + $encoded = $json->encode($results); + + print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc11.php b/includes/js/dojox/rpc/tests/resources/jsonRpc11.php new file mode 100644 index 0000000..1c91e51 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc11.php @@ -0,0 +1,52 @@ +<?php + require_once("./JSON.php"); + + // FIXME: doesn't look like we really need Pear at all + // which decreases the testing burden. + // Commenting out.the require and the new File() call. + + // NOTE: File.php is installed via Pear using: + // %> sudo pear install File + // Your server will also need the Pear library directory included in PHP's + // include_path configuration directive + // require_once('File.php'); + + // ensure that we don't try to send "html" down to the client + header("Content-Type: text/plain"); + + $json = new Services_JSON; + //$fp = new File(); + + $results = array(); + $results['error'] = null; + + $jsonRequest = file_get_contents('php://input'); + //$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + + $req = $json->decode($jsonRequest); + + $method = $req->method; + $params = $req->params; + + switch($method) { + case "rawPostJsonRpc11Echo": + if (is_array($params)){ + $results['result']=$params; + }else{ + $results['result']=$params->message; + } + break; + default: + $results['result']=""; + $results['error']=array(); + $results['error']['code']=-32601; + $results['error']["message"]="The requested remote-procedure does not exist / is not available."; + break; + } + + $results['id'] = $req->id; + + $encoded = $json->encode($results); + + print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpc12.php b/includes/js/dojox/rpc/tests/resources/jsonRpc12.php new file mode 100644 index 0000000..8fad2e5 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpc12.php @@ -0,0 +1,53 @@ +<?php + require_once("./JSON.php"); + + // FIXME: doesn't look like we really need Pear at all + // which decreases the testing burden. + // Commenting out.the require and the new File() call. + + // NOTE: File.php is installed via Pear using: + // %> sudo pear install File + // Your server will also need the Pear library directory included in PHP's + // include_path configuration directive + // require_once('File.php'); + + // ensure that we don't try to send "html" down to the client + header("Content-Type: text/plain"); + + $json = new Services_JSON; + //$fp = new File(); + + $results = array(); + $results['error'] = null; + + $jsonRequest = file_get_contents('php://input'); + //$jsonRequest = '{"params":["Blah"],"method":"myecho","id":86}'; + + $req = $json->decode($jsonRequest); + + $method = $req->method; + $params = $req->params; + + switch($method) { + case "postJsonRpc12Echo": + case "postJsonRpc12EchoNamed": + if (is_array($params)){ + $results['result']=$params; + }else{ + $results['result']=$params->message; + } + break; + default: + $results['result']=""; + $results['error']=array(); + $results['error']['code']=-32601; + $results['error']["message"]="The requested remote-procedure does not exist / is not available."; + break; + } + + $results['id'] = $req->id; + + $encoded = $json->encode($results); + + print $encoded; +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php b/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php new file mode 100644 index 0000000..7db9153 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonRpcPostGetEcho.php @@ -0,0 +1,38 @@ +<?php + require_once("./JSON.php"); + + $json = new Services_JSON; + $method = $_REQUEST["method"]; + $id = $_REQUEST["id"]; + $params = $_REQUEST["params"]; + $result = ""; + + switch ($method){ + case "postJsonRpc10Echo": + case "getJsonRpc10Echo": + case "postJsonRpc10EchoNamed": + case "getJsonRpc10EchoNamed": + $p = $json->decode($params); + $result = "{id:" . $id . ", 'result':'" . $p[0]. "', error:''}"; + break; + case "postJsonRpc12Echo": + case "getJsonRpc12Echo": + case "postJsonRpc12EchoNamed": + case "getJsonRpc12EchoNamed": + $p = $json->decode($params); + + if ($p->message){ + $d = $p->message; + }else{ + $d=$p[0]; + } + $result = "{id:" . $id . ", 'result':'" . $d . "'}"; + break; + default: + $result = "{id:'1','error':'Unknown Method', 'result':'this result only here for this test, shouldnt be here in real code'}"; + break; + } + + print $result; + +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonpEcho.php b/includes/js/dojox/rpc/tests/resources/jsonpEcho.php new file mode 100644 index 0000000..15d9aaa --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpEcho.php @@ -0,0 +1,23 @@ +<?php + $jsonp = false; + $result = ""; + + if ($_REQUEST["testCallbackParam"]){ + $jsonp=true; + $result .= $_REQUEST['testCallbackParam'] . "('"; + } + + if (!$_REQUEST["message"]){ + $result .= "ERROR: message property not found"; + } + + $result .= $_REQUEST["message"]; + + if ($jsonp) { + $result .= "');"; + } + + print $result; + + +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps b/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps new file mode 100644 index 0000000..15d9aaa --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpEcho.phps @@ -0,0 +1,23 @@ +<?php + $jsonp = false; + $result = ""; + + if ($_REQUEST["testCallbackParam"]){ + $jsonp=true; + $result .= $_REQUEST['testCallbackParam'] . "('"; + } + + if (!$_REQUEST["message"]){ + $result .= "ERROR: message property not found"; + } + + $result .= $_REQUEST["message"]; + + if ($jsonp) { + $result .= "');"; + } + + print $result; + + +?> diff --git a/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php b/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php new file mode 100644 index 0000000..251f38e --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/jsonpJsonRpcEcho.php @@ -0,0 +1,37 @@ +<?php + require_once("./JSON.php"); + $json = new Services_JSON; + + $id = $_REQUEST['id']; + $method = $_REQUEST['method']; + $params = $json->decode($_REQUEST['params']); + $callback = $_REQUEST["callback"]; + + switch($method){ + case "jsonpJsonRpc10EchoNamed": + case "jsonpJsonRpc11Echo": + case "jsonpJsonRpc11EchoNamed": + case "jsonpJsonRpc10Echo": + if ( ($method=="jsonpJsonRpc10EchoNamed")||($method=="jsonpJsonRpc11EchoNamed")){ + $message = $params->message; + }else{ + $message = $params[0]; + } + if ($message){ + switch($method){ + case "jsonpJsonRpc11Echo": + case "jsonpJsonRpc11EchoNamed": + $res = "{'id': '$id', result: '$message'}"; + break; + default: + $res = "{'id': '$id', result: '$message', 'error':''}"; + break; + } + }else{ + $res = "{'id': '$id', error: {'code': 100, 'message':'no message provided'}}"; + } + } + + print "$callback($res)"; + +?> diff --git a/includes/js/dojox/rpc/tests/resources/obj1 b/includes/js/dojox/rpc/tests/resources/obj1 new file mode 100644 index 0000000..ff02ba8 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj1 @@ -0,0 +1 @@ +{"id":"obj1","name":"Object 1","updated":1202755814406,"obj":{"foo":"bar"},"obj dup":{"$ref":"obj1.obj"},"testArray":[1,2,3,4]}
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj1testArray b/includes/js/dojox/rpc/tests/resources/obj1testArray new file mode 100644 index 0000000..0c624c1 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj1testArray @@ -0,0 +1 @@ +[1,2,3,undefined,4]
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj3 b/includes/js/dojox/rpc/tests/resources/obj3 new file mode 100644 index 0000000..21cb328 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj3 @@ -0,0 +1 @@ +{"id":"obj3","name":"Object 3"}
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/obj4 b/includes/js/dojox/rpc/tests/resources/obj4 new file mode 100644 index 0000000..a429ecf --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/obj4 @@ -0,0 +1 @@ +{"id":"obj4","name":"Object 4"}
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/query b/includes/js/dojox/rpc/tests/resources/query new file mode 100644 index 0000000..cd18d6e --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/query @@ -0,0 +1,6 @@ +[
+ {id:"obj1",name:"Object 1"},
+ {id:"obj2",name:"Object 2"},
+ {$ref:"obj3"},
+ {$ref:"obj4"}
+]
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/rawEcho.php b/includes/js/dojox/rpc/tests/resources/rawEcho.php new file mode 100644 index 0000000..e0c15c0 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/rawEcho.php @@ -0,0 +1,5 @@ +<?php + print file_get_contents('php://input'); + +?> + diff --git a/includes/js/dojox/rpc/tests/resources/res b/includes/js/dojox/rpc/tests/resources/res new file mode 100644 index 0000000..3c22137 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/res @@ -0,0 +1 @@ +deleted
\ No newline at end of file diff --git a/includes/js/dojox/rpc/tests/resources/store.php b/includes/js/dojox/rpc/tests/resources/store.php new file mode 100644 index 0000000..941e113 --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/store.php @@ -0,0 +1,24 @@ +<?php + $fn = preg_replace("/\W/","",$_REQUEST["location"]); + switch ($_SERVER["REQUEST_METHOD"]) { + case "GET" : + $fh = fopen($fn, 'r'); + print(fread($fh, filesize($fn))); + break; + case "PUT" : + $fh = fopen($fn, 'w'); + $contents = file_get_contents('php://input'); + print($contents); + fwrite($fh, $contents); + break; + case "POST" : + $fh = fopen($fn, "a+"); + fwrite($fh, file_get_contents('php://input')); + break; + case "DELETE" : + $fh = fopen($fn, 'w'); + fwrite($fh, "deleted"); + break; + } + fclose($fh); +?> diff --git a/includes/js/dojox/rpc/tests/resources/test.smd b/includes/js/dojox/rpc/tests/resources/test.smd new file mode 100644 index 0000000..6ad56be --- /dev/null +++ b/includes/js/dojox/rpc/tests/resources/test.smd @@ -0,0 +1,189 @@ +{ + transport: "POST", + envelope: "URL", + strictParameters: false, + parameters: { + appId: {}, + outputType: { + default: "json" + }, + + ignoreErrors: { + optional: true + } + }, + + services: { + postEcho: { + target: "echo.php", + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + getEcho: { + transport: "GET", + target: "echo.php", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + getEchoJson: { + transport: "GET", + target: "echoJson.php", + contentType:"application/json", + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + getPathEcho: { + transport: "GET", + envelope: "PATH", + target: "echo.php?message=", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + restStore: { + transport: "REST", + contentType:"text/plain", + target: "fakestore.php", + parameters: [ + {name: "location", type: "string", optional: true} + ] + }, + jsonRestStore: { + transport: "REST", + target: "fakestore.php", + contentType:"application/json", + parameters: [ + {name: "location", type: "string", optional: true} + ] + }, + + + + postJsonEcho: { + transport: "POST", + envelope: "JSON", + target: "rawEcho.php", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + jsonpEcho: { + transport: "JSONP", + target: "jsonpEcho.php", + callbackParamName: "testCallbackParam", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + postJsonRpc10Echo: { + transport: "POST", + envelope: "JSON-RPC-1.0", + target: "jsonRpc10.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + postJsonRpc10EchoNamed: { + transport: "POST", + envelope: "JSON-RPC-1.0", + target: "jsonRpc10.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + jsonpJsonRpc12Echo: { + transport: "JSONP", + envelope: "JSON-RPC-2.0", + target: "jsonpJsonRpcEcho.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + jsonpJsonRpc12EchoNamed: { + transport: "JSONP", + envelope: "JSON-RPC-2.0", + target: "jsonpJsonRpcEcho.php", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + postJsonRpc10ForcedError: { + envelope: "JSON-RPC-1.0", + transport: "POST", + target: "jsonRpc10.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + postJsonRpc12Echo: { + transport: "POST", + envelope: "JSON-RPC-2.0", + target: "jsonRpc12.php", + + parameters: [ + {name: "message", type: "string", optional: true} + ] + }, + + getJsonRpc12Echo: { + transport: "GET", + envelope: "JSON-RPC-2.0", + target: "jsonRpcPostGetEcho.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + postJsonRpc12EchoNamed: { + transport: "POST", + envelope: "JSON-RPC-2.0", + target: "jsonRpcPostGetEcho.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + getJsonRpc12EchoNamed: { + transport: "GET", + envelope: "JSON-RPC-2.0", + target: "jsonRpcPostGetEcho.php", + + parameters: [ + {type: "string", optional: true} + ] + }, + + + postJsonRpc12ForcedError: { + envelope: "JSON-RPC-2.0", + transport: "POST", + target: "jsonRpc12.php", + + parameters: [ + {type: "string", optional: true} + ] + } + } +} |