234 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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_);
 | |
|     }
 | |
| }
 | 
