diff options
author | Jack Bates <jablko@users.sourceforge.net> | 2006-04-14 02:50:09 +0000 |
---|---|---|
committer | Jack Bates <jablko@users.sourceforge.net> | 2006-04-14 02:50:09 +0000 |
commit | 40e077eb346693da15662632a90e5df0ff305046 (patch) | |
tree | c00c8197ae733e7e56e61e2aacecbde2c6818082 /lib/HTTP/WebDAV/Tools/_parse_propfind.php | |
parent | dfc4ff9ca8e46383d68320738b0336cf27458bab (diff) | |
download | phpicalendar-40e077eb346693da15662632a90e5df0ff305046.tar.gz phpicalendar-40e077eb346693da15662632a90e5df0ff305046.tar.bz2 phpicalendar-40e077eb346693da15662632a90e5df0ff305046.zip |
* Depth: header support
* Committing current WebDAV library
Diffstat (limited to 'lib/HTTP/WebDAV/Tools/_parse_propfind.php')
-rw-r--r-- | lib/HTTP/WebDAV/Tools/_parse_propfind.php | 280 |
1 files changed, 137 insertions, 143 deletions
diff --git a/lib/HTTP/WebDAV/Tools/_parse_propfind.php b/lib/HTTP/WebDAV/Tools/_parse_propfind.php index be560a8..a44c3a9 100644 --- a/lib/HTTP/WebDAV/Tools/_parse_propfind.php +++ b/lib/HTTP/WebDAV/Tools/_parse_propfind.php @@ -1,5 +1,4 @@ <?php -// // +----------------------------------------------------------------------+ // | PHP Version 4 | // +----------------------------------------------------------------------+ @@ -17,8 +16,7 @@ // | Christian Stocker <chregu@bitflux.ch> | // +----------------------------------------------------------------------+ // -// $Id: _parse_propfind.php,v 1.1 2006/04/09 19:27:12 jablko Exp $ -// +// $Id: _parse_propfind.php,v 1.2 2006/04/14 02:50:10 jablko Exp $ /** * helper class for parsing PROPFIND request bodies @@ -29,145 +27,141 @@ */ class _parse_propfind { - /** - * success state flag - * - * @var bool - * @access public - */ - var $success = false; - - /** - * found properties are collected here - * - * @var array - * @access public - */ - var $props = false; - - /** - * internal tag nesting depth counter - * - * @var int - * @access private - */ - var $depth = 0; - - /** - * constructor - * - * @access public - */ - function _parse_propfind($path) - { - // success state flag - $this->success = true; - - // property storage array - $this->props = array(); - - // internal tag depth counter - $this->depth = 0; - - // remember if any input was parsed - $had_input = false; - - // open input stream - $f_in = fopen($path, 'r'); - if (!$f_in) { - $this->success = false; - return; - } - - // create XML parser - $xml_parser = xml_parser_create_ns('UTF-8', ' '); - - // set tag and data handlers - xml_set_element_handler($xml_parser, - array(&$this, '_startElement'), - array(&$this, '_endElement')); - - // we want a case sensitive parser - xml_parser_set_option($xml_parser, - XML_OPTION_CASE_FOLDING, false); - - // parse input - while($this->success && !feof($f_in)) { - $line = fgets($f_in); - if (is_string($line)) { - $had_input = true; - $this->success &= xml_parse($xml_parser, $line, false); - } - } - - // finish parsing - if($had_input) { - $this->success &= xml_parse($xml_parser, '', true); - } - - // free parser - xml_parser_free($xml_parser); - - // close input stream - fclose($f_in); - - // if no input was parsed it was a request - if(!count($this->props)) $this->props = 'all'; // default - } - - /** - * start tag handler - * - * @access private - * @param resource parser - * @param string tag name - * @param array tag attributes - */ - function _startElement($parser, $name, $attrs) - { - // name space handling - if (strstr($name, ' ')) { - list($ns, $tag) = explode(' ', $name); - if ($ns == '') - $this->success = false; - } else { - $ns = ''; - $tag = $name; - } - - // special tags at level 1: <allprop> and <propname> - if ($this->depth == 1) { - if ($tag == 'allprop') - $this->props = 'all'; - - if ($tag == 'propname') - $this->props = 'names'; - } - - // requested properties are found at level 2 - if ($this->depth == 2) { - $prop = array('name' => $tag); - if ($ns) - $prop['xmlns'] = $ns; - $this->props[] = $prop; - } - - // increment depth count - $this->depth++; - } - - /** - * end tag handler - * - * @access private - * @param resource parser - * @param string tag name - */ - function _endElement($parser, $name) - { - // here we only need to decrement the depth count - $this->depth--; - } + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * found properties are collected here + * + * @var array + * @access public + */ + var $props = false; + + /** + * internal tag nesting depth counter + * + * @var int + * @access private + */ + var $depth = 0; + + /** + * constructor + * + * @access public + */ + function _parse_propfind($input) + { + // success state flag + $this->success = true; + + // property storage array + $this->props = array(); + + // internal tag depth counter + $this->depth = 0; + + // remember if any input was parsed + $had_input = false; + + // open input stream + $handle = fopen($input, 'r'); + if (!$handle) { + $this->success = false; + return; + } + + // create XML parser + $parser = xml_parser_create_ns('UTF-8', ' '); + + // set tag and data handlers + xml_set_element_handler($parser, array(&$this, '_startElement'), + array(&$this, '_endElement')); + + // we want a case sensitive parser + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); + + // parse input + while ($this->success && !feof($handle)) { + $line = fgets($handle); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($parser, $line, false); + } + } + + // finish parsing + if ($had_input) { + $this->success &= xml_parse($parser, '', true); + } + + // free parser + xml_parser_free($parser); + + // close input stream + fclose($handle); + + // if no input was parsed it was a request + if (empty($this->props)) { + $this->props = 'allprop'; + } + } + + /** + * start tag handler + * + * @access private + * @param resource parser + * @param string tag name + * @param array tag attributes + */ + function _startElement($parser, $name, $attrs) + { + // name space handling + if (strstr($name, ' ')) { + list ($ns, $name) = explode(' ', $name); + if (!$ns) { + $this->success = false; + } + } + + // special tags at level 1: <allprop> and <propname> + if ($this->depth == 1) { + if ($name == 'allprop' || $name == 'propname') { + $this->props = $name; + } + } + + // requested properties are found at level 2 + if ($this->depth == 2) { + $prop = array('name' => $name); + if ($ns) { + $prop['ns'] = $ns; + } + $this->props[] = $prop; + } + + // increment depth count + $this->depth++; + } + + /** + * end tag handler + * + * @access private + * @param resource parser + * @param string tag name + */ + function _endElement($parser, $name) + { + // here we only need to decrement the depth count + $this->depth--; + } } - ?> |