children() as $keyword) { switch ($keyword->getName()) { case 'matchtype': $type =& $this->matchTypes_; break; case 'comparator': $type =& $this->comparators_; break; case 'addresspart': $type =& $this->addressParts_; break; case 'test': $type =& $this->tests_; break; case 'command': $type =& $this->commands_; break; default: trigger_error('Unsupported keyword type "'. $keyword->getName() . '" in file "keywords/'. basename($file) .'"'); return; } $name = (string) $keyword['name']; if (array_key_exists($name, $type)) trigger_error("redefinition of $type $name - skipping"); else $type[$name] = $keyword->children(); } foreach (glob(dirname(__FILE__) .'/extensions/*.xml') as $file) { $extension = simplexml_load_file($file); $name = (string) $extension['name']; if (array_key_exists($name, $this->registry_)) { trigger_error('overwriting extension "'. $name .'"'); } $this->registry_[$name] = $extension; } } public static function get() { if (self::$instance == null) { self::$instance = new SieveKeywordRegistry(); } self::$refcount++; return self::$instance; } public function put() { if (--self::$refcount == 0) { self::$instance = null; } } public function activate($extension) { if (!isset($this->registry_[$extension])) { return; } $xml = $this->registry_[$extension]; foreach ($xml->children() as $e) { switch ($e->getName()) { case 'matchtype': $type =& $this->matchTypes_; break; case 'comparator': $type =& $this->comparators_; break; case 'addresspart': $type =& $this->addressParts_; break; case 'test': $type =& $this->tests_; break; case 'command': $type =& $this->commands_; break; case 'tagged-argument': $xml = $e->parameter[0]; $this->arguments_[(string) $xml['name']] = array( 'extends' => (string) $e['extends'], 'rules' => $xml ); continue; default: trigger_error('Unsupported extension type \''. $e->getName() ."' in extension '$extension'"); return; } $name = (string) $e['name']; if (!isset($type[$name]) || (string) $e['overrides'] == 'true') { $type[$name] = $e->children(); } } } public function isTest($name) { return (isset($this->tests_[$name]) ? true : false); } public function isCommand($name) { return (isset($this->commands_[$name]) ? true : false); } public function matchtype($name) { if (isset($this->matchTypes_[$name])) { return $this->matchTypes_[$name]; } return null; } public function addresspart($name) { if (isset($this->addressParts_[$name])) { return $this->addressParts_[$name]; } return null; } public function comparator($name) { if (isset($this->comparators_[$name])) { return $this->comparators_[$name]; } return null; } public function test($name) { if (isset($this->tests_[$name])) { return $this->tests_[$name]; } return null; } public function command($name) { if (isset($this->commands_[$name])) { return $this->commands_[$name]; } return null; } public function arguments($command) { $res = array(); foreach ($this->arguments_ as $arg) { if (preg_match('/'.$arg['extends'].'/', $command)) array_push($res, $arg['rules']); } return $res; } public function argument($name) { if (isset($this->arguments_[$name])) { return $this->arguments_[$name]['rules']; } return null; } public function requireStrings() { return array_keys($this->registry_); } public function matchTypes() { return array_keys($this->matchTypes_); } public function comparators() { return array_keys($this->comparators_); } public function addressParts() { return array_keys($this->addressParts_); } public function tests() { return array_keys($this->tests_); } public function commands() { return array_keys($this->commands_); } }