[ Index ]
 

Code source de Joomla 1.0.13

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/includes/domit/ -> dom_xmlrpc_object_parser.php (source)

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


Généré le : Wed Nov 21 14:43:32 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics