[ Index ] |
|
Code source de Joomla 1.0.13 |
1 <?php 2 /** 3 * dom_xmlrpc_object_parser handles SAX events to convert a DOM XML-RPC XML string into a PHP array 4 * 5 * Will generate PHP objects instead of structs if directed 6 * @package dom-xmlrpc 7 * @copyright (C) 2004 John Heinstein. All rights reserved 8 * @license http://www.gnu.org/copyleft/lesser.html LGPL License 9 * @author John Heinstein <johnkarl@nbnet.nb.ca> 10 * @link http://www.engageinteractive.com/dom_xmlrpc/ DOM XML-RPC Home Page 11 * DOM XML-RPC is Free Software 12 **/ 13 14 if (!defined('DOM_XMLRPC_INCLUDE_PATH')) { 15 define('DOM_XMLRPC_INCLUDE_PATH', (dirname(__FILE__) . "/")); 16 } 17 18 require_once (DOM_XMLRPC_INCLUDE_PATH . 'dom_xmlrpc_parser.php'); 19 20 /** 21 * Handles SAX events to convert a DOM XML-RPC XML string into a PHP array 22 * 23 * Will generate PHP objects instead of structs if directed 24 * @package dom-xmlrpc 25 * @author John Heinstein <johnkarl@nbnet.nb.ca> 26 */ 27 class dom_xmlrpc_object_parser extends dom_xmlrpc_parser { 28 /** @var boolean If true, objects will be tested for */ 29 var $testingForObject = false; //when a struct is encountered, turn this on 30 /** @var object Handler for PHP objects */ 31 var $objectDefinitionHandler = null; //fired when a __phpobject__ definition is required 32 33 /** 34 * Constructor 35 * @param object Reference to a handler for PHP objects 36 */ 37 function dom_xmlrpc_object_parser(&$objectDefinitionHandler) { 38 $this->objectDefinitionHandler =& $objectDefinitionHandler; 39 } //dom_xmlrpc_object_parser 40 41 /** 42 * Handles start element events 43 * @param object A reference to the SAX parser 44 * @param string The name of the start element tag 45 * @param array An array of attributes (never used by XML-RPC spec) 46 */ 47 function startElement($parser, $name, $attrs) { 48 switch($name) { 49 case DOM_XMLRPC_TYPE_METHODCALL: 50 case DOM_XMLRPC_TYPE_METHODRESPONSE: 51 case DOM_XMLRPC_TYPE_FAULT: 52 $this->arrayDocument->methodType = $name; //register methodType 53 break; 54 case DOM_XMLRPC_TYPE_ARRAY: 55 case DOM_XMLRPC_TYPE_STRUCT: 56 $this->lastArrayType[] = $name; 57 $this->lastArray[] = array(); 58 $this->testingForObject = true; 59 break; 60 } 61 } //startElement 62 63 /** 64 * Handles end element events 65 * @param object A reference to the SAX parser 66 * @param string The name of the end element tag 67 */ 68 function endElement($parser, $name) { 69 switch($name) { 70 case DOM_XMLRPC_TYPE_STRING: 71 //$this->addValue(html_entity_decode($this->charContainer, ENT_QUOTES)); 72 $this->addValue($this->charContainer); 73 break; 74 case DOM_XMLRPC_TYPE_I4: 75 case DOM_XMLRPC_TYPE_INT: 76 $this->addValue((int)($this->charContainer)); 77 break; 78 case DOM_XMLRPC_TYPE_DOUBLE: 79 $this->addValue(floatval($this->charContainer)); 80 break; 81 case DOM_XMLRPC_TYPE_BOOLEAN: 82 $this->addValue((bool)(trim($this->charContainer))); 83 break; 84 case DOM_XMLRPC_TYPE_BASE64: 85 require_once (DOM_XMLRPC_INCLUDE_PATH . 'dom_xmlrpc_base64.php'); 86 $base64 = new dom_xmlrpc_base64(); 87 $base64->fromString($this->charContainer); 88 $this->addValue($base64); //should I add object or string? 89 break; 90 case DOM_XMLRPC_TYPE_DATETIME: 91 require_once (DOM_XMLRPC_INCLUDE_PATH . 'dom_xmlrpc_datetime_iso8601.php'); 92 $dateTime = new dom_xmlrpc_datetime_iso8601($this->charContainer); 93 $this->addValue($dateTime); //should I add object or string? 94 break; 95 case DOM_XMLRPC_TYPE_VALUE: 96 //if charContainer has anything in it, 97 //then there mustn't be a subnode, therefore a <string> 98 $myValue = trim($this->charContainer); 99 //if ($myValue != '') $this->addValue(html_entity_decode($myValue, ENT_QUOTES)); 100 if ($myValue != '') $this->addValue($myValue); 101 break; 102 case DOM_XMLRPC_TYPE_ARRAY: 103 case DOM_XMLRPC_TYPE_STRUCT: 104 $value =& array_pop($this->lastArray); 105 $this->addValue($value); 106 array_pop($this->lastArrayType); 107 break; 108 case DOM_XMLRPC_TYPE_MEMBER: 109 array_pop($this->lastStructName); 110 break; 111 case DOM_XMLRPC_TYPE_NAME: 112 $cn = trim($this->charContainer); 113 $this->lastStructName[] = $cn; 114 $this->charContainer = ''; 115 116 if ($this->testingForObject && ($cn == DOM_XMLRPC_PHPOBJECT)) { 117 $this->lastArrayType[(count($this->lastArray) - 1)] = DOM_XMLRPC_PHPOBJECT; 118 } 119 120 $this->testingForObject = false; 121 break; 122 case DOM_XMLRPC_TYPE_METHODNAME: 123 $this->arrayDocument->methodName = trim($this->charContainer); 124 $this->charContainer = ''; 125 break; 126 } 127 } //endElement 128 129 /** 130 * Adds an XML-RPC value to the results array 131 * @param mixed The value 132 */ 133 function addValue($value) { 134 $upper = count($this->lastArray) - 1; 135 136 if ($upper > -1) { 137 $lastArrayType = $this->lastArrayType[$upper]; 138 139 if ($lastArrayType == DOM_XMLRPC_TYPE_STRUCT) { 140 $currentName = $this->lastStructName[(count($this->lastStructName) - 1)]; 141 142 switch ($currentName) { 143 case DOM_XMLRPC_NODEVALUE_FAULTCODE: 144 $this->arrayDocument->faultCode = $value; 145 break; 146 147 case DOM_XMLRPC_NODEVALUE_FAULTSTRING: 148 $this->arrayDocument->faultString = $value; 149 break; 150 151 default: 152 //associative array item 153 $this->lastArray[$upper][$currentName] = $value; 154 } 155 } 156 else if ($lastArrayType == DOM_XMLRPC_PHPOBJECT) { 157 $currentName = $this->lastStructName[(count($this->lastStructName) - 1)]; 158 159 if ($currentName == DOM_XMLRPC_PHPOBJECT) { 160 //import class and instantiate new object 161 call_user_func($this->objectDefinitionHandler, $value); 162 $this->lastArray[$upper] = new $value; 163 } 164 else { 165 if ($currentName == DOM_XMLRPC_SERIALIZED) { 166 //could also check for this... 167 //if (is_object($value) && (get_class($value) == 'dom_xmlrpc_base64')) { 168 //unserialize object 169 $serialized =& $value->getBinary(); 170 $this->lastArray[$upper] =& unserialize($serialized); 171 } 172 else { 173 //add property to object 174 $myObj =& $this->lastArray[$upper]; 175 $myObj->$currentName =& $value; 176 } 177 } 178 } 179 else { 180 //indexed array item 181 $this->lastArray[$upper][] =& $value; 182 } 183 } 184 else { 185 //at root level, add value as a new param 186 array_push($this->arrayDocument->params, $value); 187 } 188 189 $this->charContainer = ''; 190 } //addValue 191 } //dom_xmlrpc_object_parser 192 193 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Wed Nov 21 14:43:32 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |