Revision fc4e8df8
Added by Phil Davis over 10 years ago
etc/inc/xmlreader.inc | ||
---|---|---|
37 | 37 |
/* The following items will be treated as arrays in config.xml */ |
38 | 38 |
function listtags() { |
39 | 39 |
/* |
40 |
* Please keep this list alpha sorted and no longer than 80 characters
|
|
41 |
* I know it's a pain, but it's a pain to find stuff too if it's not
|
|
42 |
*/
|
|
40 |
* Please keep this list alpha sorted and no longer than 80 characters
|
|
41 |
* I know it's a pain, but it's a pain to find stuff too if it's not
|
|
42 |
*/
|
|
43 | 43 |
$ret = array( |
44 | 44 |
'acls', 'alias', 'aliasurl', 'allowedip', 'allowedhostname', 'authserver', |
45 | 45 |
'bridged', 'build_port_path', |
... | ... | |
72 | 72 |
} |
73 | 73 |
|
74 | 74 |
function add_elements(&$cfgarray, &$parser) { |
75 |
global $listtags; |
|
76 |
|
|
77 |
while ($parser->read()) { |
|
78 |
switch ($parser->nodeType) { |
|
79 |
case XMLReader::WHITESPACE: |
|
80 |
case XMLReader::SIGNIFICANT_WHITESPACE: |
|
81 |
break; |
|
82 |
case XMLReader::ELEMENT: |
|
83 |
if (isset($listtags[strtolower($parser->name)])) { |
|
84 |
$cfgref =& $cfgarray[$parser->name][count($cfgarray[$parser->name])]; |
|
85 |
if (!$parser->isEmptyElement) { |
|
86 |
add_elements($cfgref, $parser); |
|
87 |
} else |
|
88 |
$cfgref = array(); |
|
89 |
|
|
90 |
} else { |
|
91 |
if (isset($cfgarray[$parser->name]) && (!is_array($cfgarray[$parser->name]) || !isset($cfgarray[$parser->name][0]))) { |
|
92 |
$nodebkp = $cfgarray[$parser->name]; |
|
93 |
$cfgarray[$parser->name] = array(); |
|
94 |
$cfgarray[$parser->name][] = $nodebkp; |
|
95 |
$cfgref =& $cfgarray[$parser->name][0]; |
|
96 |
unset($nodebkp); |
|
97 |
} else |
|
98 |
$cfgref =& $cfgarray[$parser->name]; |
|
99 |
|
|
100 |
if ($parser->isEmptyElement) { |
|
101 |
if (is_array($cfgref)) |
|
102 |
$cfgref[] = array(); |
|
103 |
else |
|
104 |
$cfgref = ""; |
|
105 |
} else { |
|
106 |
if (is_array($cfgref)) { |
|
107 |
$cfgref =& $cfgarray[$parser->name][count($cfgarray[$parser->name])]; |
|
108 |
add_elements($cfgref, $parser); |
|
109 |
} else |
|
75 |
global $listtags; |
|
76 |
|
|
77 |
while ($parser->read()) { |
|
78 |
switch ($parser->nodeType) { |
|
79 |
case XMLReader::WHITESPACE: |
|
80 |
case XMLReader::SIGNIFICANT_WHITESPACE: |
|
81 |
break; |
|
82 |
case XMLReader::ELEMENT: |
|
83 |
if (isset($listtags[strtolower($parser->name)])) { |
|
84 |
$cfgref =& $cfgarray[$parser->name][count($cfgarray[$parser->name])]; |
|
85 |
if (!$parser->isEmptyElement) { |
|
110 | 86 |
add_elements($cfgref, $parser); |
87 |
} else { |
|
88 |
$cfgref = array(); |
|
89 |
} |
|
90 |
} else { |
|
91 |
if (isset($cfgarray[$parser->name]) && (!is_array($cfgarray[$parser->name]) || !isset($cfgarray[$parser->name][0]))) { |
|
92 |
$nodebkp = $cfgarray[$parser->name]; |
|
93 |
$cfgarray[$parser->name] = array(); |
|
94 |
$cfgarray[$parser->name][] = $nodebkp; |
|
95 |
$cfgref =& $cfgarray[$parser->name][0]; |
|
96 |
unset($nodebkp); |
|
97 |
} else { |
|
98 |
$cfgref =& $cfgarray[$parser->name]; |
|
99 |
} |
|
100 |
|
|
101 |
if ($parser->isEmptyElement) { |
|
102 |
if (is_array($cfgref)) { |
|
103 |
$cfgref[] = array(); |
|
104 |
} else { |
|
105 |
$cfgref = ""; |
|
106 |
} |
|
107 |
} else { |
|
108 |
if (is_array($cfgref)) { |
|
109 |
$cfgref =& $cfgarray[$parser->name][count($cfgarray[$parser->name])]; |
|
110 |
add_elements($cfgref, $parser); |
|
111 |
} else { |
|
112 |
add_elements($cfgref, $parser); |
|
113 |
} |
|
114 |
} |
|
111 | 115 |
} |
112 |
} |
|
113 | 116 |
|
114 |
$i = 0; |
|
115 |
while ($parser->moveToAttributeNo($i)) { |
|
116 |
$cfgref[$parser->name] = $parser->value; |
|
117 |
$i++; |
|
118 |
} |
|
119 |
break;
|
|
120 |
case XMLReader::TEXT:
|
|
121 |
case XMLReader::CDATA: |
|
122 |
$cfgarray = $parser->value;
|
|
123 |
break;
|
|
124 |
case XMLReader::END_ELEMENT:
|
|
125 |
return; |
|
126 |
break; |
|
127 |
default:
|
|
128 |
break;
|
|
129 |
}
|
|
117 |
$i = 0;
|
|
118 |
while ($parser->moveToAttributeNo($i)) {
|
|
119 |
$cfgref[$parser->name] = $parser->value;
|
|
120 |
$i++;
|
|
121 |
}
|
|
122 |
break;
|
|
123 |
case XMLReader::TEXT:
|
|
124 |
case XMLReader::CDATA:
|
|
125 |
$cfgarray = $parser->value;
|
|
126 |
break;
|
|
127 |
case XMLReader::END_ELEMENT:
|
|
128 |
return;
|
|
129 |
break;
|
|
130 |
default:
|
|
131 |
break;
|
|
132 |
}
|
|
130 | 133 |
} |
131 | 134 |
} |
132 | 135 |
|
... | ... | |
134 | 137 |
global $listtags; |
135 | 138 |
|
136 | 139 |
$listtags = listtags(); |
137 |
if (isset($GLOBALS['custom_listtags'])) {
|
|
138 |
foreach($GLOBALS['custom_listtags'] as $tag) {
|
|
139 |
$listtags[$tag] = $tag;
|
|
140 |
}
|
|
141 |
}
|
|
140 |
if (isset($GLOBALS['custom_listtags'])) {
|
|
141 |
foreach ($GLOBALS['custom_listtags'] as $tag) {
|
|
142 |
$listtags[$tag] = $tag;
|
|
143 |
}
|
|
144 |
}
|
|
142 | 145 |
|
143 | 146 |
return parse_xml_config_raw($cffile, $rootobj); |
144 | 147 |
} |
... | ... | |
147 | 150 |
global $listtags; |
148 | 151 |
|
149 | 152 |
$listtags = listtags_pkg(); |
150 |
if (isset($GLOBALS['custom_listtags_pkg'])) {
|
|
151 |
foreach($GLOBALS['custom_listtags_pkg'] as $tag) {
|
|
152 |
$listtags[$tag] = $tag;
|
|
153 |
}
|
|
154 |
}
|
|
153 |
if (isset($GLOBALS['custom_listtags_pkg'])) {
|
|
154 |
foreach ($GLOBALS['custom_listtags_pkg'] as $tag) {
|
|
155 |
$listtags[$tag] = $tag;
|
|
156 |
}
|
|
157 |
}
|
|
155 | 158 |
return parse_xml_config_raw($cffile, $rootobj, $isstring); |
156 | 159 |
} |
157 | 160 |
|
... | ... | |
164 | 167 |
if ($par->open($cffile, "UTF-8", LIBXML_NOERROR | LIBXML_NOWARNING)) { |
165 | 168 |
add_elements($parsedcfg, $par); |
166 | 169 |
$par->close(); |
167 |
} else |
|
170 |
} else {
|
|
168 | 171 |
log_error(sprintf(gettext("Error returned while trying to parse %s"), $cffile)); |
172 |
} |
|
169 | 173 |
|
170 | 174 |
if ($rootobj) { |
171 |
if (!is_array($rootobj)) |
|
175 |
if (!is_array($rootobj)) {
|
|
172 | 176 |
$rootobj = array($rootobj); |
173 |
foreach ($rootobj as $rootobj_name) |
|
174 |
if ($parsedcfg[$rootobj_name]) |
|
177 |
} |
|
178 |
foreach ($rootobj as $rootobj_name) { |
|
179 |
if ($parsedcfg[$rootobj_name]) { |
|
175 | 180 |
break; |
176 |
|
|
181 |
} |
|
182 |
} |
|
183 |
|
|
177 | 184 |
return $parsedcfg[$rootobj_name]; |
178 | 185 |
} else { |
179 | 186 |
return $parsedcfg; |
... | ... | |
181 | 188 |
} |
182 | 189 |
|
183 | 190 |
function dump_xml_config_sub(& $writer, $arr) { |
184 |
global $listtags; |
|
185 |
|
|
186 |
foreach ($arr as $ent => $val) { |
|
187 |
if (is_array($val)) { |
|
188 |
/* is it just a list of multiple values? */ |
|
189 |
if (isset($listtags[strtolower($ent)])) { |
|
190 |
foreach ($val as $cval) { |
|
191 |
if (is_array($cval)) { |
|
192 |
if (empty($cval)) |
|
193 |
$writer->writeElement($ent); |
|
194 |
else { |
|
195 |
$writer->startElement($ent); |
|
196 |
dump_xml_config_sub($writer, $cval); |
|
197 |
$writer->endElement(); |
|
198 |
} |
|
199 |
} else { |
|
200 |
if($cval === false) continue; |
|
201 |
if ((is_bool($val) && ($val == true)) || ($val === "")) |
|
202 |
$writer->writeElement($ent); |
|
203 |
else if (!is_bool($val)) |
|
191 |
global $listtags; |
|
192 |
|
|
193 |
foreach ($arr as $ent => $val) { |
|
194 |
if (is_array($val)) { |
|
195 |
/* is it just a list of multiple values? */ |
|
196 |
if (isset($listtags[strtolower($ent)])) { |
|
197 |
foreach ($val as $cval) { |
|
198 |
if (is_array($cval)) { |
|
199 |
if (empty($cval)) { |
|
200 |
$writer->writeElement($ent); |
|
201 |
} else { |
|
202 |
$writer->startElement($ent); |
|
203 |
dump_xml_config_sub($writer, $cval); |
|
204 |
$writer->endElement(); |
|
205 |
} |
|
206 |
} else { |
|
207 |
if ($cval === false) { |
|
208 |
continue; |
|
209 |
} |
|
210 |
if ((is_bool($val) && ($val == true)) || ($val === "")) { |
|
211 |
$writer->writeElement($ent); |
|
212 |
} else if (!is_bool($val)) { |
|
204 | 213 |
$writer->writeElement($ent, $cval); |
205 |
} |
|
206 |
} |
|
207 |
} else if (empty($val)) { |
|
208 |
$writer->writeElement($ent); |
|
209 |
} else { |
|
210 |
/* it's an array */ |
|
211 |
$writer->startElement($ent); |
|
212 |
dump_xml_config_sub($writer, $val); |
|
213 |
$writer->endElement(); |
|
214 |
} |
|
215 |
} else { |
|
216 |
if ((is_bool($val) && ($val == true)) || ($val === "")) |
|
217 |
$writer->writeElement($ent); |
|
218 |
else if (!is_bool($val)) |
|
219 |
$writer->writeElement($ent, $val); |
|
220 |
} |
|
221 |
} |
|
214 |
} |
|
215 |
} |
|
216 |
} |
|
217 |
} else if (empty($val)) { |
|
218 |
$writer->writeElement($ent); |
|
219 |
} else { |
|
220 |
/* it's an array */ |
|
221 |
$writer->startElement($ent); |
|
222 |
dump_xml_config_sub($writer, $val); |
|
223 |
$writer->endElement(); |
|
224 |
} |
|
225 |
} else { |
|
226 |
if ((is_bool($val) && ($val == true)) || ($val === "")) { |
|
227 |
$writer->writeElement($ent); |
|
228 |
} else if (!is_bool($val)) { |
|
229 |
$writer->writeElement($ent, $val); |
|
230 |
} |
|
231 |
} |
|
232 |
} |
|
222 | 233 |
} |
223 | 234 |
|
224 | 235 |
function dump_xml_config($arr, $rootobj) { |
225 | 236 |
global $listtags; |
226 | 237 |
|
227 | 238 |
$listtags = listtags(); |
228 |
if (isset($GLOBALS['custom_listtags'])) {
|
|
229 |
foreach($GLOBALS['custom_listtags'] as $tag) {
|
|
230 |
$listtags[$tag] = $tag;
|
|
231 |
}
|
|
232 |
}
|
|
239 |
if (isset($GLOBALS['custom_listtags'])) {
|
|
240 |
foreach ($GLOBALS['custom_listtags'] as $tag) {
|
|
241 |
$listtags[$tag] = $tag;
|
|
242 |
}
|
|
243 |
}
|
|
233 | 244 |
return dump_xml_config_raw($arr, $rootobj); |
234 | 245 |
} |
235 | 246 |
|
... | ... | |
237 | 248 |
global $listtags; |
238 | 249 |
|
239 | 250 |
$listtags = listtags_pkg(); |
240 |
if (isset($GLOBALS['custom_listtags_pkg'])) {
|
|
241 |
foreach($GLOBALS['custom_listtags_pkg'] as $tag) {
|
|
242 |
$listtags[$tag] = $tag;
|
|
243 |
}
|
|
244 |
}
|
|
251 |
if (isset($GLOBALS['custom_listtags_pkg'])) {
|
|
252 |
foreach ($GLOBALS['custom_listtags_pkg'] as $tag) {
|
|
253 |
$listtags[$tag] = $tag;
|
|
254 |
}
|
|
255 |
}
|
|
245 | 256 |
return dump_xml_config_raw($arr, $rootobj); |
246 | 257 |
} |
247 | 258 |
|
248 | 259 |
function dump_xml_config_raw($arr, $rootobj) { |
249 | 260 |
|
250 |
$writer = new XMLWriter();
|
|
251 |
$writer->openMemory();
|
|
252 |
$writer->setIndent(true);
|
|
253 |
$writer->setIndentString("\t");
|
|
254 |
$writer->startDocument("1.0", "UTF-8");
|
|
255 |
$writer->startElement($rootobj);
|
|
261 |
$writer = new XMLWriter();
|
|
262 |
$writer->openMemory();
|
|
263 |
$writer->setIndent(true);
|
|
264 |
$writer->setIndentString("\t");
|
|
265 |
$writer->startDocument("1.0", "UTF-8");
|
|
266 |
$writer->startElement($rootobj);
|
|
256 | 267 |
|
257 |
dump_xml_config_sub($writer, $arr);
|
|
268 |
dump_xml_config_sub($writer, $arr);
|
|
258 | 269 |
|
259 |
$writer->endElement();
|
|
260 |
$writer->endDocument();
|
|
261 |
$xmlconfig = $writer->outputMemory(true);
|
|
270 |
$writer->endElement();
|
|
271 |
$writer->endDocument();
|
|
272 |
$xmlconfig = $writer->outputMemory(true);
|
|
262 | 273 |
|
263 |
return $xmlconfig;
|
|
274 |
return $xmlconfig;
|
|
264 | 275 |
} |
265 | 276 |
|
266 | 277 |
?> |
Also available in: Unified diff
Code style etc inc vwx3
rebased version with conflicts resolved due to a bunch of recent changes
in vpn.inc