aboutsummaryrefslogtreecommitdiffstats
path: root/lib/HTTP/WebDAV/Tools/_parse_propfind.php
diff options
context:
space:
mode:
authorJack Bates <jablko@users.sourceforge.net>2006-04-14 02:50:09 +0000
committerJack Bates <jablko@users.sourceforge.net>2006-04-14 02:50:09 +0000
commit40e077eb346693da15662632a90e5df0ff305046 (patch)
treec00c8197ae733e7e56e61e2aacecbde2c6818082 /lib/HTTP/WebDAV/Tools/_parse_propfind.php
parentdfc4ff9ca8e46383d68320738b0336cf27458bab (diff)
downloadphpicalendar-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.php280
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--;
+ }
}
-
?>

© 2014-2024 Faster IT GmbH | imprint | privacy policy