Project

General

Profile

Download (6.46 KB) Statistics
| Branch: | Tag: | Revision:
1 1fb064e8 Erik Fonnesbeck
<?php
2
/*
3
	xmlparse_attr.inc
4
	functions to parse configuration files in XML format with attributes
5
	Copyright (C) 2010 Erik Fonnesbeck
6
	All rights reserved.
7
8
	Based on xmlparse.inc, originally part of m0n0wall (http://m0n0.ch/wall)
9
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
10
	All rights reserved.
11
12
	Redistribution and use in source and binary forms, with or without
13
	modification, are permitted provided that the following conditions are met:
14
15
	1. Redistributions of source code must retain the above copyright notice,
16
	   this list of conditions and the following disclaimer.
17
18
	2. Redistributions in binary form must reproduce the above copyright
19
	   notice, this list of conditions and the following disclaimer in the
20
	   documentation and/or other materials provided with the distribution.
21
22
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
23
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
24
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
26
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
	POSSIBILITY OF SUCH DAMAGE.
32
*/
33
34
/* The following items will be treated as arrays in regdomain.xml */
35
function listtags_rd() {
36
	$ret = explode(" ",
37
		"band country flags freqband netband rd"
38
		);
39
	return $ret;
40
}
41
42
function startElement_attr($parser, $name, $attrs) {
43
	global $parsedcfg, $depth, $curpath, $havedata, $listtags, $parsedattrs;
44
45
	array_push($curpath, strtolower($name));
46
47
	$ptr =& $parsedcfg;
48
	if (!empty($attrs)) {
49
		$attrptr =& $parsedattrs;
50
		$writeattrs = true;
51
	}
52
	foreach ($curpath as $path) {
53
		$ptr =& $ptr[$path];
54 79262830 Phil Davis
		if (isset($writeattrs)) {
55 1fb064e8 Erik Fonnesbeck
			$attrptr =& $attrptr[$path];
56 79262830 Phil Davis
		}
57 1fb064e8 Erik Fonnesbeck
	}
58
59
	/* is it an element that belongs to a list? */
60
	if (in_array(strtolower($name), $listtags)) {
61
62
		/* is there an array already? */
63
		if (!is_array($ptr)) {
64
			/* make an array */
65
			$ptr = array();
66
		}
67
68
		array_push($curpath, count($ptr));
69
70
		if (isset($writeattrs)) {
71 79262830 Phil Davis
			if (!is_array($attrptr)) {
72 1fb064e8 Erik Fonnesbeck
				$attrptr = array();
73 79262830 Phil Davis
			}
74 1fb064e8 Erik Fonnesbeck
			$attrptr[count($ptr)] = $attrs;
75
		}
76
77
	} else if (isset($ptr)) {
78
		/* multiple entries not allowed for this element, bail out */
79 addc0439 Renato Botelho
		die(sprintf(gettext('XML error: %1$s at line %2$d cannot occur more than once') . "\n",
80 79262830 Phil Davis
			$name,
81
			xml_get_current_line_number($parser)));
82 1fb064e8 Erik Fonnesbeck
	} else if (isset($writeattrs)) {
83
		$attrptr = $attrs;
84
	}
85
86
	$depth++;
87
	$havedata = $depth;
88
}
89
90
function endElement_attr($parser, $name) {
91
	global $depth, $curpath, $parsedcfg, $havedata, $listtags;
92
93
	if ($havedata == $depth) {
94
		$ptr =& $parsedcfg;
95
		foreach ($curpath as $path) {
96
			$ptr =& $ptr[$path];
97
		}
98
		$ptr = "";
99
	}
100
101
	array_pop($curpath);
102
103 79262830 Phil Davis
	if (in_array(strtolower($name), $listtags)) {
104 1fb064e8 Erik Fonnesbeck
		array_pop($curpath);
105 79262830 Phil Davis
	}
106 1fb064e8 Erik Fonnesbeck
107
	$depth--;
108
}
109
110
function cData_attr($parser, $data) {
111
	global $depth, $curpath, $parsedcfg, $havedata;
112
113
	$data = trim($data, "\t\n\r");
114
115
	if ($data != "") {
116
		$ptr =& $parsedcfg;
117
		foreach ($curpath as $path) {
118
			$ptr =& $ptr[$path];
119
		}
120
121
		if (is_string($ptr)) {
122
			$ptr .= html_entity_decode($data);
123
		} else {
124
			if (trim($data, " ") != "") {
125
				$ptr = html_entity_decode($data);
126
				$havedata++;
127
			}
128
		}
129
	}
130
}
131
132 7017b54e Erik Fonnesbeck
function parse_xml_regdomain(&$rdattributes, $rdfile = '', $rootobj = 'regulatory-data') {
133
	global $g, $listtags;
134
135 79262830 Phil Davis
	if (empty($rdfile)) {
136 7017b54e Erik Fonnesbeck
		$rdfile = $g['etc_path'] . '/regdomain.xml';
137 79262830 Phil Davis
	}
138 1fb064e8 Erik Fonnesbeck
	$listtags = listtags_rd();
139 7017b54e Erik Fonnesbeck
	$parsed_xml = array();
140
141
	if (file_exists($g['tmp_path'] . '/regdomain.cache')) {
142
		$parsed_xml = unserialize(file_get_contents($g['tmp_path'] . '/regdomain.cache'));
143
		if (!empty($parsed_xml)) {
144
			$rdmain = $parsed_xml['main'];
145
			$rdattributes = $parsed_xml['attributes'];
146
		}
147
	}
148
	if (empty($parsed_xml) && file_exists($g['etc_path'] . '/regdomain.xml')) {
149
		$rdmain = parse_xml_config_raw_attr($rdfile, $rootobj, $rdattributes);
150
151
		// unset parts that aren't used before making cache
152
		foreach ($rdmain['regulatory-domains']['rd'] as $rdkey => $rdentry) {
153 79262830 Phil Davis
			if (isset($rdmain['regulatory-domains']['rd'][$rdkey]['netband'])) {
154 7017b54e Erik Fonnesbeck
				unset($rdmain['regulatory-domains']['rd'][$rdkey]['netband']);
155 79262830 Phil Davis
			}
156
			if (isset($rdattributes['regulatory-domains']['rd'][$rdkey]['netband'])) {
157 7017b54e Erik Fonnesbeck
				unset($rdattributes['regulatory-domains']['rd'][$rdkey]['netband']);
158 79262830 Phil Davis
			}
159 7017b54e Erik Fonnesbeck
		}
160 79262830 Phil Davis
		if (isset($rdmain['shared-frequency-bands'])) {
161 7017b54e Erik Fonnesbeck
			unset($rdmain['shared-frequency-bands']);
162 79262830 Phil Davis
		}
163
		if (isset($rdattributes['shared-frequency-bands'])) {
164 7017b54e Erik Fonnesbeck
			unset($rdattributes['shared-frequency-bands']);
165 79262830 Phil Davis
		}
166 7017b54e Erik Fonnesbeck
167
		$parsed_xml = array('main' => $rdmain, 'attributes' => $rdattributes);
168
		$rdcache = fopen($g['tmp_path'] . '/regdomain.cache', "w");
169
		fwrite($rdcache, serialize($parsed_xml));
170
		fclose($rdcache);
171
	}
172
173
	return $rdmain;
174 1fb064e8 Erik Fonnesbeck
}
175
176
function parse_xml_config_raw_attr($cffile, $rootobj, &$parsed_attributes, $isstring = "false") {
177
178
	global $depth, $curpath, $parsedcfg, $havedata, $listtags, $parsedattrs;
179
	$parsedcfg = array();
180
	$curpath = array();
181
	$depth = 0;
182
	$havedata = 0;
183
184 79262830 Phil Davis
	if (isset($parsed_attributes)) {
185 1fb064e8 Erik Fonnesbeck
		$parsedattrs = array();
186 79262830 Phil Davis
	}
187 1fb064e8 Erik Fonnesbeck
188
	$xml_parser = xml_parser_create();
189
190
	xml_set_element_handler($xml_parser, "startElement_attr", "endElement_attr");
191
	xml_set_character_data_handler($xml_parser, "cData_attr");
192 086cf944 Phil Davis
	xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);
193 1fb064e8 Erik Fonnesbeck
194
	if (!($fp = fopen($cffile, "r"))) {
195 f55943aa Renato Botelho
		log_error(gettext("Error: could not open XML input") . "\n");
196 1fb064e8 Erik Fonnesbeck
		if (isset($parsed_attributes)) {
197
			$parsed_attributes = array();
198
			unset($parsedattrs);
199
		}
200
		return -1;
201
	}
202
203
	while ($data = fread($fp, 4096)) {
204
		if (!xml_parse($xml_parser, $data, feof($fp))) {
205 addc0439 Renato Botelho
			log_error(sprintf(gettext('XML error: %1$s at line %2$d') . "\n",
206 79262830 Phil Davis
				xml_error_string(xml_get_error_code($xml_parser)),
207
				xml_get_current_line_number($xml_parser)));
208 1fb064e8 Erik Fonnesbeck
			if (isset($parsed_attributes)) {
209
				$parsed_attributes = array();
210
				unset($parsedattrs);
211
			}
212
			return -1;
213
		}
214
	}
215
	xml_parser_free($xml_parser);
216
217
	if (!$parsedcfg[$rootobj]) {
218 f55943aa Renato Botelho
		log_error(sprintf(gettext("XML error: no %s object found!") . "\n", $rootobj));
219 1fb064e8 Erik Fonnesbeck
		if (isset($parsed_attributes)) {
220
			$parsed_attributes = array();
221
			unset($parsedattrs);
222
		}
223
		return -1;
224
	}
225
226
	if (isset($parsed_attributes)) {
227 79262830 Phil Davis
		if ($parsedattrs[$rootobj]) {
228 1fb064e8 Erik Fonnesbeck
			$parsed_attributes = $parsedattrs[$rootobj];
229 79262830 Phil Davis
		}
230 1fb064e8 Erik Fonnesbeck
		unset($parsedattrs);
231
	}
232
233
	return $parsedcfg[$rootobj];
234
}
235
236
?>