location = $location.'/'; } else { $this->location = NULL; } $this->type = $type; } function getPlugins($active_only=true) { if (($list_files = $this->_readDir()) !== false) { $this->p_list = array(); foreach ($list_files as $entry => $pfile) { if (($info = $this->_getPluginInfo($pfile)) !== false) { if (($active_only && $info['active']) || !$active_only) { $this->p_list[$entry] = $info; } } } ksort($this->p_list); return true; } else { return false; } } function getPluginsList() { return $this->p_list; } function getFunctions($f='functions.php') { $res = array(); if (($list_files = $this->_readDir()) !== false) { foreach ($list_files as $entry => $pfile) { if (file_exists(dirname($pfile).'/'.$f)) { $res[] = dirname($pfile).'/'.$f; } } } return $res; } function loadCallbacks() { $res['onPost'] = array(); $ires = array_keys($res); foreach ($this->p_list as $k => $v) { # Chargement des fichiers events.php if (file_exists($this->location.$k.'/events.php')) { require_once $this->location.$k.'/events.php'; foreach ($v['callbacks'] as $f) { if (in_array($f[0],$ires)) { $pf = explode('::',$f[1]); if (count($pf) == 2 && is_callable($pf)) { $res[$f[0]][] = $pf; } } } } } return $res; } function loadl10n($p) { if (defined('DC_LANG')) { if (dc_encoding == 'UTF-8') { l10n::set($this->location.$p.'/l10n/'.DC_LANG.'-utf8/main'); } else { l10n::set($this->location.$p.'/l10n/'.DC_LANG.'/main'); } } } function switchStatus($p) { $xml_path = $this->location.$p.'/desc.xml'; $p_info = $this->_getPluginInfo($xml_path); $xml = implode('',file($xml_path)); $active = (integer) !$p_info['active']; $xml = preg_replace('|(<'.$this->type.'[^>]*?active=)"([^"]+)([^>]*>)|ms', '$1"'.$active.'$3',$xml); if (!files::putContent($xml_path,$xml)) { return false; } return true; } /* Installation d'un plugin */ function install($url) { $dest = $this->location.'/'.basename($url); if (($err = files::copyRemote($url,$dest)) !== true) { return $err; } else { if (($content = @implode('',@gzfile($dest))) === false) { return __('Cannot open file'); } else { if (($list = unserialize($content)) === false) { return __('Plugin not valid'); } else { if (is_dir($this->location.'/'.$list['name'])) { /*if (files::deltree($this->location.'/'.$list['name']) === false) { return 'Impossible de supprimer le plugin existant'; }*/ unlink($dest); return __('This plugin still exists. Delete it before.'); } foreach ($list['dirs'] as $d) { mkdir ($this->location.'/'.$d,fileperms($this->location)); chmod($this->location.'/'.$d,fileperms($this->location)); } foreach ($list['files'] as $f => $v) { $v = base64_decode($v); $fp = fopen($this->location.'/'.$f,'w'); fwrite($fp,$v,strlen($v)); fclose($fp); chmod($this->location.'/'.$f,fileperms($this->location) & ~0111); } unlink($dest); } } } return true; } /* Lecture d'un répertoire à la recherche des desc.xml */ function _readDir() { if ($this->location === NULL) { return false; } $res = array(); $d = dir($this->location); # Liste du répertoire des plugins while (($entry = $d->read()) !== false) { if ($entry != '.' && $entry != '..' && is_dir($this->location.$entry) && file_exists($this->location.$entry.'/desc.xml')) { $res[$entry] = $this->location.$entry.'/desc.xml'; } } return $res; } function _getPluginInfo($p) { if (file_exists($p)) { $this->_current_tag_cdata = ''; $this->_p_info = array('name'=>NULL,'version'=>NULL, 'active'=>NULL,'author'=>NULL,'label'=>NULL, 'desc'=>NULL,'callbacks'=>array()); $this->_xml = xml_parser_create('ISO-8859-1'); xml_parser_set_option($this->_xml, XML_OPTION_CASE_FOLDING, false); xml_set_object($this->_xml, $this); xml_set_element_handler($this->_xml,'_openTag','_closeTag'); xml_set_character_data_handler($this->_xml, '_cdata'); xml_parse($this->_xml,implode('',file($p))); xml_parser_free($this->_xml); if (!empty($this->_p_info['name'])) { return $this->_p_info; } else { return false; } } } function _openTag($p,$tag,$attr) { if ($tag == $this->type && !empty($attr['name'])) { $this->_p_info['name'] = $attr['name']; $this->_p_info['version'] = (!empty($attr['version'])) ? $attr['version'] : NULL; $this->_p_info['active'] = (!empty($attr['active'])) ? (boolean) $attr['active'] : false; } if ($tag == 'callback') { $this->_p_info['callbacks'][] = array($attr['event'],$attr['function']); } } function _closeTag($p,$tag) { switch ($tag) { case 'author': case 'label': case 'desc': $this->_p_info[$tag] = $this->_current_tag_cdata; break; } } function _cdata($p,$cdata) { $this->_current_tag_cdata = $cdata; } } ?>