<?php
// $Id: xmlrpcparser.php,v 1.5.32.1 2005/08/15 15:04:58 skalpa Exp $
// ------------------------------------------------------------------------ //
// XOOPS - PHP Content Management System //
// Copyright (c) 2000 XOOPS.org //
// <http://www.xoops.org/> //
// ------------------------------------------------------------------------ //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (at your option) any later version. //
// //
// You may not change or alter any portion of this comment or credits //
// of supporting developers from this source code or any supporting //
// source code which is considered copyrighted (c) material of the //
// original comment or credit authors. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program; if not, write to the Free Software //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
// ------------------------------------------------------------------------ //
// Author: Kazumi Ono (AKA onokazu) //
// URL: http://www.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ //
// Project: The XOOPS Project //
// ------------------------------------------------------------------------- //
if (!defined('XOOPS_ROOT_PATH')) {
die("XOOPS root path not defined");
}
require_once XOOPS_ROOT_PATH.'/class/xml/saxparser.php';
require_once XOOPS_ROOT_PATH.'/class/xml/xmltaghandler.php';
/**
* Class RSS Parser
*
* This class offers methods to parse RSS Files
*
* @link http://www.xoops.org/ Latest release of this class
* @package XOOPS
* @copyright Copyright (c) 2001 xoops.org. All rights reserved.
* @author Kazumi Ono <hide@address.com>
* @version 1.6 ($Date: 2005/08/15 15:04:58 $) $Revision: 1.5.32.1 $
* @access public
*/
class XoopsXmlRpcParser extends SaxParser
{
/**
*
*
*
*
* @access private
* @var array
*/
var $_param;
/**
*
*
*
*
* @access private
* @var string
*/
var $_methodName;
/**
*
*
*
*
* @access private
* @var array
*/
var $_tempName;
/**
*
*
*
*
* @access private
* @var array
*/
var $_tempValue;
/**
*
*
*
*
* @access private
* @var array
*/
var $_tempMember;
/**
*
*
*
*
* @access private
* @var array
*/
var $_tempStruct;
/**
*
*
*
*
* @access private
* @var array
*/
var $_tempArray;
/**
*
*
*
*
* @access private
* @var array
*/
var $_workingLevel = array();
/**
* Constructor of the class
*
*
*
*
* @access
* @author
* @see
*/
function XoopsXmlRpcParser(&$input)
{
$this->SaxParser($input);
$this->addTagHandler(new RpcMethodNameHandler());
$this->addTagHandler(new RpcIntHandler());
$this->addTagHandler(new RpcDoubleHandler());
$this->addTagHandler(new RpcBooleanHandler());
$this->addTagHandler(new RpcStringHandler());
$this->addTagHandler(new RpcDateTimeHandler());
$this->addTagHandler(new RpcBase64Handler());
$this->addTagHandler(new RpcNameHandler());
$this->addTagHandler(new RpcValueHandler());
$this->addTagHandler(new RpcMemberHandler());
$this->addTagHandler(new RpcStructHandler());
$this->addTagHandler(new RpcArrayHandler());
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function setTempName($name)
{
$this->_tempName[$this->getWorkingLevel()] = $name;
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getTempName()
{
return $this->_tempName[$this->getWorkingLevel()];
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function setTempValue($value)
{
if (is_array($value)) {
settype($this->_tempValue, 'array');
foreach ($value as $k => $v) {
$this->_tempValue[$k] = $v;
}
} elseif (is_string($value)) {
if (isset($this->_tempValue)) {
if (is_string($this->_tempValue)) {
$this->_tempValue .= $value;
}
} else {
$this->_tempValue = $value;
}
} else {
$this->_tempValue = $value;
}
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getTempValue()
{
return $this->_tempValue;
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function resetTempValue()
{
unset($this->_tempValue);
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function setTempMember($name, $value)
{
$this->_tempMember[$this->getWorkingLevel()][$name] = $value;
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getTempMember()
{
return $this->_tempMember[$this->getWorkingLevel()];
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function resetTempMember()
{
$this->_tempMember[$this->getCurrentLevel()] = array();
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function setWorkingLevel()
{
array_push($this->_workingLevel, $this->getCurrentLevel());
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getWorkingLevel()
{
return $this->_workingLevel[count($this->_workingLevel) - 1];
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function releaseWorkingLevel()
{
array_pop($this->_workingLevel);
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function setTempStruct($member)
{
$key = key($member);
$this->_tempStruct[$this->getWorkingLevel()][$key] = $member[$key];
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getTempStruct()
{
return $this->_tempStruct[$this->getWorkingLevel()];
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function resetTempStruct()
{
$this->_tempStruct[$this->getCurrentLevel()] = array();
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function setTempArray($value)
{
$this->_tempArray[$this->getWorkingLevel()][] = $value;
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getTempArray()
{
return $this->_tempArray[$this->getWorkingLevel()];
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function resetTempArray()
{
$this->_tempArray[$this->getCurrentLevel()] = array();
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function setMethodName($methodName)
{
$this->_methodName = $methodName;
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getMethodName()
{
return $this->_methodName;
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function setParam($value)
{
$this->_param[] = $value;
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function &getParam()
{
return $this->_param;
}
}
class RpcMethodNameHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'methodName';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
$parser->setMethodName($data);
}
}
class RpcIntHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return array('int', 'i4');
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
$parser->setTempValue(intval($data));
}
}
class RpcDoubleHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'double';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
$data = (float)$data;
$parser->setTempValue($data);
}
}
class RpcBooleanHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'boolean';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
$data = (boolean)$data;
$parser->setTempValue($data);
}
}
class RpcStringHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'string';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
$parser->setTempValue(strval($data));
}
}
class RpcDateTimeHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'dateTime.iso8601';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
$matches = array();
if (!preg_match("/^([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})$/", $data, $matches)) {
$parser->setTempValue(time());
} else {
$parser->setTempValue(gmmktime($matches[4], $matches[5], $meatches[6], $matches[2], $matches[3], $matches[1]));
}
}
}
class RpcBase64Handler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'base64';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
$parser->setTempValue(base64_decode($data));
}
}
class RpcNameHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'name';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
switch ($parser->getParentTag()) {
case 'member':
$parser->setTempName($data);
break;
default:
break;
}
}
}
class RpcValueHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'value';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleCharacterData(&$parser, &$data)
{
switch ($parser->getParentTag()) {
case 'member':
$parser->setTempValue($data);
break;
case 'data':
case 'array':
$parser->setTempValue($data);
break;
default:
break;
}
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleBeginElement(&$parser, &$attributes)
{
//$parser->resetTempValue();
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleEndElement(&$parser)
{
switch ($parser->getCurrentTag()) {
case 'member':
$parser->setTempMember($parser->getTempName(), $parser->getTempValue());
break;
case 'array':
case 'data':
$parser->setTempArray($parser->getTempValue());
break;
default:
$parser->setParam($parser->getTempValue());
break;
}
$parser->resetTempValue();
}
}
class RpcMemberHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'member';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleBeginElement(&$parser, &$attributes)
{
$parser->setWorkingLevel();
$parser->resetTempMember();
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleEndElement(&$parser)
{
$member =& $parser->getTempMember();
$parser->releaseWorkingLevel();
$parser->setTempStruct($member);
}
}
class RpcArrayHandler extends XmlTagHandler
{
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'array';
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleBeginElement(&$parser, &$attributes)
{
$parser->setWorkingLevel();
$parser->resetTempArray();
}
/**
* This Method starts the parsing of the specified RDF File. The File can be a local or a remote File.
*
* @access
* @author
* @param
* @return
* @see
*/
function handleEndElement(&$parser)
{
$parser->setTempValue($parser->getTempArray());
$parser->releaseWorkingLevel();
}
}
class RpcStructHandler extends XmlTagHandler
{
/**
*
*
* @access
* @author
* @param
* @return
* @see
*/
function getName()
{
return 'struct';
}
/**
*
*
* @access
* @author
* @param
* @return
* @see
*/
function handleBeginElement(&$parser, &$attributes)
{
$parser->setWorkingLevel();
$parser->resetTempStruct();
}
/**
*
*
* @access
* @author
* @param
* @return
* @see
*/
function handleEndElement(&$parser)
{
$parser->setTempValue($parser->getTempStruct());
$parser->releaseWorkingLevel();
}
}
?>