| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 | <?php namespace Sieve;class SieveKeywordRegistry{    protected $registry_ = array();    protected $matchTypes_ = array();    protected $comparators_ = array();    protected $addressParts_ = array();    protected $commands_ = array();    protected $tests_ = array();    protected $arguments_ = array();    protected static $refcount = 0;    protected static $instance = null;    protected function __construct()    {        $keywords = simplexml_load_file(dirname(__FILE__) .'/keywords.xml');        foreach ($keywords->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_);    }}
 |