TYPO3 API  SVNRelease
SimpleEventDispatcher.php
Go to the documentation of this file.
00001 <?php
00002 
00003 /*
00004  * This file is part of SwiftMailer.
00005  * (c) 2004-2009 Chris Corbyn
00006  *
00007  * For the full copyright and license information, please view the LICENSE
00008  * file that was distributed with this source code.
00009  */
00010 
00011 //@require 'Swift/Events/EventDispatcher.php';
00012 //@require 'Swift/Events/EventListener.php';
00013 //@require 'Swift/Events/EventObject.php';
00014 //@require 'Swift/Events/CommandEvent.php';
00015 //@require 'Swift/Events/ResponseEvent.php';
00016 //@require 'Swift/Events/SendEvent.php';
00017 //@require 'Swift/Events/TransportChangeEvent.php';
00018 //@require 'Swift/Events/TransportExceptionEvent.php';
00019 
00020 /**
00021  * The EventDispatcher which handles the event dispatching layer.
00022  *
00023  * @package Swift
00024  * @subpackage Events
00025  * @author Chris Corbyn
00026  */
00027 class Swift_Events_SimpleEventDispatcher implements Swift_Events_EventDispatcher
00028 {
00029 
00030   /** A map of event types to their associated listener types */
00031   private $_eventMap = array();
00032 
00033   /** Event listeners bound to this dispatcher */
00034   private $_listeners = array();
00035 
00036   /** Listeners queued to have an Event bubbled up the stack to them */
00037   private $_bubbleQueue = array();
00038 
00039   /**
00040    * Create a new EventDispatcher.
00041    */
00042   public function __construct()
00043   {
00044     $this->_eventMap = array(
00045       'Swift_Events_CommandEvent' => 'Swift_Events_CommandListener',
00046       'Swift_Events_ResponseEvent' => 'Swift_Events_ResponseListener',
00047       'Swift_Events_SendEvent' => 'Swift_Events_SendListener',
00048       'Swift_Events_TransportChangeEvent' => 'Swift_Events_TransportChangeListener',
00049       'Swift_Events_TransportExceptionEvent' => 'Swift_Events_TransportExceptionListener'
00050       );
00051   }
00052 
00053   /**
00054    * Create a new SendEvent for $source and $message.
00055    *
00056    * @param Swift_Transport $source
00057    * @param Swift_Mime_Message
00058    * @return Swift_Events_SendEvent
00059    */
00060   public function createSendEvent(Swift_Transport $source,
00061     Swift_Mime_Message $message)
00062   {
00063     return new Swift_Events_SendEvent($source, $message);
00064   }
00065 
00066   /**
00067    * Create a new CommandEvent for $source and $command.
00068    *
00069    * @param Swift_Transport $source
00070    * @param string $command That will be executed
00071    * @param array $successCodes That are needed
00072    * @return Swift_Events_CommandEvent
00073    */
00074   public function createCommandEvent(Swift_Transport $source,
00075     $command, $successCodes = array())
00076   {
00077     return new Swift_Events_CommandEvent($source, $command, $successCodes);
00078   }
00079 
00080   /**
00081    * Create a new ResponseEvent for $source and $response.
00082    *
00083    * @param Swift_Transport $source
00084    * @param string $response
00085    * @param boolean $valid If the response is valid
00086    * @return Swift_Events_ResponseEvent
00087    */
00088   public function createResponseEvent(Swift_Transport $source,
00089     $response, $valid)
00090   {
00091     return new Swift_Events_ResponseEvent($source, $response, $valid);
00092   }
00093 
00094   /**
00095    * Create a new TransportChangeEvent for $source.
00096    *
00097    * @param Swift_Transport $source
00098    * @return Swift_Events_TransportChangeEvent
00099    */
00100   public function createTransportChangeEvent(Swift_Transport $source)
00101   {
00102     return new Swift_Events_TransportChangeEvent($source);
00103   }
00104 
00105   /**
00106    * Create a new TransportExceptionEvent for $source.
00107    *
00108    * @param Swift_Transport $source
00109    * @param Swift_TransportException $ex
00110    * @return Swift_Events_TransportExceptionEvent
00111    */
00112   public function createTransportExceptionEvent(Swift_Transport $source,
00113     Swift_TransportException $ex)
00114   {
00115     return new Swift_Events_TransportExceptionEvent($source, $ex);
00116   }
00117 
00118   /**
00119    * Bind an event listener to this dispatcher.
00120    *
00121    * @param Swift_Events_EventListener $listener
00122    */
00123   public function bindEventListener(Swift_Events_EventListener $listener)
00124   {
00125     foreach ($this->_listeners as $l)
00126     {
00127       //Already loaded
00128       if ($l === $listener)
00129       {
00130         return;
00131       }
00132     }
00133     $this->_listeners[] = $listener;
00134   }
00135 
00136   /**
00137    * Dispatch the given Event to all suitable listeners.
00138    *
00139    * @param Swift_Events_EventObject $evt
00140    * @param string $target method
00141    */
00142   public function dispatchEvent(Swift_Events_EventObject $evt, $target)
00143   {
00144     $this->_prepareBubbleQueue($evt);
00145     $this->_bubble($evt, $target);
00146   }
00147 
00148   // -- Private methods
00149 
00150   /** Queue listeners on a stack ready for $evt to be bubbled up it */
00151   private function _prepareBubbleQueue(Swift_Events_EventObject $evt)
00152   {
00153     $this->_bubbleQueue = array();
00154     $evtClass = get_class($evt);
00155     foreach ($this->_listeners as $listener)
00156     {
00157       if (array_key_exists($evtClass, $this->_eventMap)
00158         && ($listener instanceof $this->_eventMap[$evtClass]))
00159       {
00160         $this->_bubbleQueue[] = $listener;
00161       }
00162     }
00163   }
00164 
00165   /** Bubble $evt up the stack calling $target() on each listener */
00166   private function _bubble(Swift_Events_EventObject $evt, $target)
00167   {
00168     if (!$evt->bubbleCancelled() && $listener = array_shift($this->_bubbleQueue))
00169     {
00170       $listener->$target($evt);
00171       $this->_bubble($evt, $target);
00172     }
00173   }
00174 
00175 }