<?php

require_once "PEAR.php";
require_once "XML/Parser.php";
require_once "Net/Socket.php";

class XML_NParser extends PEAR {
    function XML_NParser($charset = 'UTF-8') {
	global $_XML_NParser;
	$this->PEAR();
	$xp = @xml_parser_create($charset);
	if (is_resource($xp)) {
	    $this->parser = $xp;
	    $_XML_NParser[$xp]=&$this;
	    xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING,1);
	    xml_set_object($xp, $this);
	    xml_set_element_handler($xp, "IstartHandler", "IendHandler");
	    xml_set_character_data_handler($xp, "IcdataHandler");
	    xml_set_default_handler($xp, "IdefaultHandler");
	    xml_set_processing_instruction_handler($xp, "IpiHandler");
	    xml_set_unparsed_entity_decl_handler($xp, "IunparsedHandler");
	    xml_set_notation_decl_handler($xp, "InotationHandler");
	    xml_set_external_entity_ref_handler($xp, "IentityrefHandler");
	}
    }
    function	IstartHandler( $p, $name, $attrib ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->startHandler( $p, $name, $attrib );
    }
    function	IendHandler( $p, $name) {
	global $_XML_NParser;
	$_XML_NParser[$p]->endHandler( $p, $name);
    }
    function	IstartHandler( $p, $name, $attrib ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->startHandler( $p, $name, $attrib );
    }
    function	IcdataHandler( $p, $data ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->cdataHandler( $p, $data );
    }
    function	IdefaultHandler( $p, $data ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->defaultHandler( $p, $data );
    }
    function	IpiHandler( $p, $target, $data ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->piHandler( $p, $target, $data );
    }
/*    
    function	IunparsedHandler( $p, $name, $attrib ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->unparsedHandler( $p, $name, $attrib );
    }
*/    
    function	IentityHandler( $p, $openEntityNames, $base, $systemId,  $publicId ) {
	global $_XML_NParser;
	$_XML_NParser[$p]->entityHandler( $p, $openEntityNames, $base, $systemId,  $publicId );
    }
    
    
    function	startHandler( $p, $name, $attrib ) {
    }
    function	endHandler( $p, $name) {
    }
    function	startHandler( $p, $name, $attrib ) {
    }
    function	cdataHandler( $p, $data ) {
    }
    function	defaultHandler( $p, $data ) {
    }
    function	piHandler( $p, $target, $data ) {
    }
/*    
    function	unparsedHandler( $p, $name, $attrib ) {
    }
*/    
    function	entityHandler( $p, $openEntityNames, $base, $systemId,  $publicId ) {
    }
    function setInputFile($file) {
	$fp = fopen($file, "r");
	if (is_resource($fp)) {
	    $this->fp = $fp;
	    return $fp;
	}
	return new XML_Parser_Error($php_errormsg);
    }

    function setInput($fp) {
	if (is_resource($fp)) {
	    $this->fp = $fp;
	    return true;
	}
	return new XML_Parser_Error("not a file resource");
    }

    function parse() {
	if (!is_resource($this->fp)) {
	    return new XML_Parser_Error("no input");
	}
	if (!is_resource($this->parser)) {
	    return new XML_Parser_Error("no parser");
	}
	while ($data = fread($this->fp, 2048)) {
	    $err = $this->parseString($data, feof($this->fp));
	    if (PEAR::isError($err)) {
		return $err;
	    }
	}
	return true;
    }

    function parseString($data, $eof = false) {
	if (!is_resource($this->parser)) {
	    return new XML_Parser_Error("no parser");
	}
	if (!xml_parse($this->parser, $data, $eof)) {
	    $err = new XML_Parser_Error($this->parser);
	    xml_parser_free($this->parser);
	    return $err;
	}
	return true;
    }

    function readSocket( &$socked ) {
	while( $line=$socked->ReadLine() ) {
	    $this->parseString( $line );
	}
    }
}


?>
