]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - include/HTTP_WebDAV_Server/Tools/_parse_proppatch.php
Release 6.5.0
[Github/sugarcrm.git] / include / HTTP_WebDAV_Server / Tools / _parse_proppatch.php
1 <?php
2 //
3 // +----------------------------------------------------------------------+
4 // | PHP Version 4                                                        |
5 // +----------------------------------------------------------------------+
6 // | Copyright (c) 1997-2003 The PHP Group                                |
7 // +----------------------------------------------------------------------+
8 // | This source file is subject to version 3.0 of the PHP license,       |
9 // | that is bundled with this package in the file LICENSE, and is        |
10 // | available at through the world-wide-web at                           |
11 // | http://www.php.net/license/3_0.txt.                                  |
12 // | If you did not receive a copy of the PHP license and are unable to   |
13 // | obtain it through the world-wide-web, please send a note to          |
14 // | license@php.net so we can mail you a copy immediately.               |
15 // +----------------------------------------------------------------------+
16 // | Authors: Hartmut Holzgraefe <hholzgra@php.net>                       |
17 // |          Christian Stocker <chregu@bitflux.ch>                       |
18 // +----------------------------------------------------------------------+
19 //
20
21 //
22
23 /**
24  * helper class for parsing PROPPATCH request bodies
25  * 
26  * @package HTTP_WebDAV_Server
27  * @author Hartmut Holzgraefe <hholzgra@php.net>
28  * @version 0.99.1dev
29  */
30 class _parse_proppatch 
31 {
32     /**
33      *
34      * 
35      * @var
36      * @access
37      */
38     var $success;
39
40     /**
41      *
42      * 
43      * @var
44      * @access
45      */
46     var $props;
47
48     /**
49      *
50      * 
51      * @var
52      * @access
53      */
54     var $depth;
55
56     /**
57      *
58      * 
59      * @var
60      * @access
61      */
62     var $mode;
63
64     /**
65      *
66      * 
67      * @var
68      * @access
69      */
70     var $current;
71
72     /**
73      * constructor
74      * 
75      * @param  string  path of input stream 
76      * @access public
77      */
78     function _parse_proppatch($path) 
79     {
80         $this->success = true;
81
82         $this->depth = 0;
83         $this->props = array();
84         $had_input = false;
85
86         $f_in = fopen($path, "r");
87         if (!$f_in) {
88             $this->success = false;
89             return;
90         }
91
92         $xml_parser = xml_parser_create_ns("UTF-8", " ");
93
94         xml_set_element_handler($xml_parser,
95                                 array(&$this, "_startElement"),
96                                 array(&$this, "_endElement"));
97
98         xml_set_character_data_handler($xml_parser,
99                                        array(&$this, "_data"));
100
101         xml_parser_set_option($xml_parser,
102                               XML_OPTION_CASE_FOLDING, false);
103
104         while($this->success && !feof($f_in)) {
105             $line = fgets($f_in);
106             if (is_string($line)) {
107                 $had_input = true;
108                 $this->success &= xml_parse($xml_parser, $line, false);
109             }
110         } 
111         
112         if($had_input) {
113             $this->success &= xml_parse($xml_parser, "", true);
114         }
115
116         xml_parser_free($xml_parser);
117
118         fclose($f_in);
119     }
120
121     /**
122      * tag start handler
123      *
124      * @param  resource  parser
125      * @param  string    tag name
126      * @param  array     tag attributes
127      * @return void
128      * @access private
129      */
130     function _startElement($parser, $name, $attrs) 
131     {
132         if (strstr($name, " ")) {
133             list($ns, $tag) = explode(" ", $name);
134             if ($ns == "")
135                 $this->success = false;
136         } else {
137             $ns = "";
138             $tag = $name;
139         }
140
141         if ($this->depth == 1) {
142             $this->mode = $tag;
143         } 
144
145         if ($this->depth == 3) {
146             $prop = array("name" => $tag);
147             $this->current = array("name" => $tag, "ns" => $ns, "status"=> 200);
148             if ($this->mode == "set") {
149                 $this->current["val"] = "";     // default set val
150             }
151         }
152
153         if ($this->depth >= 4) {
154             $this->current["val"] .= "<$tag";
155             foreach ($attr as $key => $val) {
156                 $this->current["val"] .= ' '.$key.'="'.str_replace('"','&quot;', $val).'"';
157             }
158             $this->current["val"] .= ">";
159         }
160
161         
162
163         $this->depth++;
164     }
165
166     /**
167      * tag end handler
168      *
169      * @param  resource  parser
170      * @param  string    tag name
171      * @return void
172      * @access private
173      */
174     function _endElement($parser, $name) 
175     {
176         if (strstr($name, " ")) {
177             list($ns, $tag) = explode(" ", $name);
178             if ($ns == "")
179                 $this->success = false;
180         } else {
181             $ns = "";
182             $tag = $name;
183         }
184
185         $this->depth--;
186
187         if ($this->depth >= 4) {
188             $this->current["val"] .= "</$tag>";
189         }
190
191         if ($this->depth == 3) {
192             if (isset($this->current)) {
193                 $this->props[] = $this->current;
194                 unset($this->current);
195             }
196         }
197     }
198
199     /**
200      * input data handler
201      *
202      * @param  resource  parser
203      * @param  string    data
204      * @return void
205      * @access private
206      */
207     function _data($parser, $data) {
208         if (isset($this->current)) {
209             $this->current["val"] .= $data;
210         }
211     }
212 }
213
214 ?>