';
$this->xmlfile = $file;
$this->mosParameter = $mosParameter;
$this->name = $name;
$this->setTree();
$parser = xml_parser_create();
$startfunc = array (&$this, 'start_element');
$endfunc = array (&$this, 'end_element');
$charfunc = array (&$this, 'character_data');
xml_set_element_handler ($parser, $startfunc, $endfunc);
xml_set_character_data_handler ($parser, $charfunc);
if ($fp = fopen($file, 'rb')) {
while ($data = fread($fp, 4096) AND !$this->terminalError) {
$data = str_replace('&', ' ampersand ', $data);
$ret = xml_parse($parser, $data, feof($fp)) or die (sprintf('XML ERROR: %s at line %d',
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
}
else die ("Unable to open XML file $file");
if (count($this->opentags) != 0) {
$tags = implode (', ', $this->opentags);
trigger_error ("XML error - unclosed tag(s) ($tags) at end of file");
}
xml_parser_free($parser);
if (count($this->errors)) var_dump ($this->errors);
}
function setTree () {
$this->accept['MOSINSTALL'] = array ('NAME', 'CREATIONDATE', 'AUTHOR', 'COPYRIGHT',
'LICENSE', 'AUTHOREMAIL', 'AUTHORURL', 'VERSION', 'DESCRIPTION', 'FILES', 'MEDIA',
'PARAMS', 'INSTALL', 'UNINSTALL', 'INSTALLFILE', 'UNINSTALLFILE', 'ADMINISTRATION',
'IMAGES', 'CSS', 'GROUP');
$this->accept['PARAMS'] = array ('PARAM');
$this->accept['PARAM'] = array ('OPTION');
$this->accept['FILES'] = array ('FILENAME');
$this->accept['INSTALL'] = array ('QUERIES');
$this->accept['UNINSTALL'] = array ('QUERIES');
$this->accept['QUERIES'] = array ('QUERY');
$this->accept['ADMINISTRATION'] = array ('FILES', 'IMAGES', 'MENU', 'SUBMENU');
$this->accept['IMAGES'] = array ('FILENAME');
$this->accept['SUBMENU'] = array('MENU');
$this->accept['MEDIA'] = array('FILENAME');
$this->accept['CSS'] = array('FILENAME');
}
function start_element ($parser, $element_name, $element_attrs) {
if ($this->terminalError) return;
if ($this->mosinstall) {
$container = $this->opentags[0];
if (!isset($this->accept[$container]) OR !is_array($this->accept[$container])) trigger_error ("XML error $container is not a valid containing element");
if (!in_array($element_name, $this->accept[$container])) trigger_error ("XML error $element_name not permitted within $container");
}
if ($this->mosinstall OR $element_name == 'MOSINSTALL') {
$this->opencount = array_unshift ($this->opentags, $element_name);
$this->mosinstall = true;
$method = 'element_'.$element_name;
$specific = array (&$this, $method);
if (is_callable($specific)) $this->$method($element_attrs);
}
else trigger_error ("XML expected MOSINSTALL but found $element_name");
// echo '
Start of '.$element_name;
}
function end_element ($parser, $element_name) {
if ($this->terminalError) return;
if ($this->opentags[0] != $element_name) {
trigger_error("XML last open tag was $check, but found end of $element_name");
return;
}
$method = 'end_element_'.$element_name;
$specific = array (&$this, $method);
if (is_callable($specific)) $this->$method();
array_shift ($this->opentags);
$this->opencount--;
// echo '
End of '.$element_name;
}
function character_data ($parser, $data) {
// Should be overridden by inheriting class
$this->errors[] = 'XML handler error - no method provided to deal with character data';
$this->terminalError = true;
}
function element_mosinstall ($attrs) {
if (isset($attrs['TYPE'])) $this->type = $attrs['TYPE'];
else trigger_error ("XML error - mosinstall does not have type attribute");
}
function getType () {
return $this->type;
}
}
/**
* Extend basic parser to extract the description for a type of install file
**/
class mosXMLDescription extends mosBasicXML {
var $values = array();
function character_data ($parser, $data) {
if ($this->terminalError) return;
$this->topLevelCharacterData($data);
}
function topLevelCharacterData ($data) {
if ($data = trim($data)) {
if (isset($this->opentags[1]) AND $this->opentags[1] == 'MOSINSTALL') $this->values[$this->opentags[0]] = $data;
}
}
function getDescription ($type) {
if ($type == $this->type AND isset($this->values['DESCRIPTION'])) return $this->values['DESCRIPTION'];
else return '';
}
function getName ($type) {
if ($type == $this->type AND isset($this->values['NAME'])) return $this->values['NAME'];
else return '';
}
function getGroup ($type) {
if ($type == $this->type AND isset($this->values['GROUP'])) return $this->values['GROUP'];
else return '';
}
function getCreationDate ($type) {
if ($type == $this->type AND isset($this->values['CREATIONDATE'])) return $this->values['CREATIONDATE'];
else return '';
}
function getAuthor ($type) {
if ($type == $this->type AND isset($this->values['AUTHOR'])) return $this->values['AUTHOR'];
else return '';
}
function getCopyright ($type) {
if ($type == $this->type AND isset($this->values['COPYRIGHT'])) return $this->values['COPYRIGHT'];
else return '';
}
function getAuthorEmail ($type) {
if ($type == $this->type AND isset($this->values['AUTHOREMAIL'])) return $this->values['AUTHOREMAIL'];
else return '';
}
function getAuthorUrl ($type) {
if ($type == $this->type AND isset($this->values['AUTHORURL'])) return $this->values['AUTHORURL'];
else return '';
}
function getVersion ($type) {
if ($type == $this->type AND isset($this->values['VERSION'])) return $this->values['VERSION'];
else return '';
}
}
class mosXMLParams extends mosXMLDescription {
var $options = array();
var $optvalue = '';
var $optdata = '';
var $paramattrs = array();
var $paramcount = 0;
var $html = array();
function element_params ($attrs) {
$this->html[] = '
| $pname | |||
| '.$label.' | '; $controlname = $this->name; switch ($type) { case 'text': $size = mosGetParam ($this->paramattrs, 'SIZE', 0); $controlstring = ''; break; case 'list': $controlstring = mosHTML::selectList($this->options, $controlname.'['.$name.']', 'class="inputbox"', 'value', 'text', $value); break; case 'radio': $controlstring = mosHTML::radioList($this->options, $controlname.'['.$name.']', '', $value); break; case 'imagelist': $directory = new mosDirectory (mamboCore::get('mosConfig_absolute_path').mosGetParam($this->paramattrs, 'DIRECTORY', '')); $files = $directory->listFiles ('\.png$|\.gif$|\.jpg$|\.bmp$|\.ico$'); $options = array(); foreach ($files as $file) $options[] = mosHTML::makeOption($file, $file); if (!isset($this->paramattrs['HIDE_NONE'])) array_unshift($options, mosHTML::makeOption('-1', '- Do not use an image -' )); if (!isset($this->paramattrs['HIDE_DEFAULT'])) array_unshift($options, mosHTML::makeOption('', '- Use Default image -')); $controlstring = mosHTML::selectList ($options, "$controlname[$name]", 'class="inputbox"', 'value', 'text', $value); break; case 'textarea': $rows = mosGetParam ($this->paramattrs, 'ROWS', 0); $cols = mosGetParam ($this->paramattrs, 'COLS', 0); $value = str_replace ('$type | "; $this->html[] = "$controlstring | "; $this->html[] = "$tooltip | "; $this->html[] = '