Source of file SimpleEventDispatcher.php
Size: 4,959 Bytes - Last Modified: 2013-06-17T15:32:32+02:00
/home/theseer/Downloads/Symfony/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Events/SimpleEventDispatcher.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | <?php /* * This file is part of SwiftMailer. * (c) 2004-2009 Chris Corbyn * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * The EventDispatcher which handles the event dispatching layer. * * @package Swift * @subpackage Events * @author Chris Corbyn */ class Swift_Events_SimpleEventDispatcher implements Swift_Events_EventDispatcher { /** A map of event types to their associated listener types */ private $_eventMap = array(); /** Event listeners bound to this dispatcher */ private $_listeners = array(); /** Listeners queued to have an Event bubbled up the stack to them */ private $_bubbleQueue = array(); /** * Create a new EventDispatcher. */ public function __construct() { $this->_eventMap = array( 'Swift_Events_CommandEvent' => 'Swift_Events_CommandListener', 'Swift_Events_ResponseEvent' => 'Swift_Events_ResponseListener', 'Swift_Events_SendEvent' => 'Swift_Events_SendListener', 'Swift_Events_TransportChangeEvent' => 'Swift_Events_TransportChangeListener', 'Swift_Events_TransportExceptionEvent' => 'Swift_Events_TransportExceptionListener' ); } /** * Create a new SendEvent for $source and $message. * * @param Swift_Transport $source * @param Swift_Mime_Message * * @return Swift_Events_SendEvent */ public function createSendEvent(Swift_Transport $source, Swift_Mime_Message $message) { return new Swift_Events_SendEvent($source, $message); } /** * Create a new CommandEvent for $source and $command. * * @param Swift_Transport $source * @param string $command That will be executed * @param array $successCodes That are needed * * @return Swift_Events_CommandEvent */ public function createCommandEvent(Swift_Transport $source, $command, $successCodes = array()) { return new Swift_Events_CommandEvent($source, $command, $successCodes); } /** * Create a new ResponseEvent for $source and $response. * * @param Swift_Transport $source * @param string $response * @param boolean $valid If the response is valid * * @return Swift_Events_ResponseEvent */ public function createResponseEvent(Swift_Transport $source, $response, $valid) { return new Swift_Events_ResponseEvent($source, $response, $valid); } /** * Create a new TransportChangeEvent for $source. * * @param Swift_Transport $source * * @return Swift_Events_TransportChangeEvent */ public function createTransportChangeEvent(Swift_Transport $source) { return new Swift_Events_TransportChangeEvent($source); } /** * Create a new TransportExceptionEvent for $source. * * @param Swift_Transport $source * @param Swift_TransportException $ex * * @return Swift_Events_TransportExceptionEvent */ public function createTransportExceptionEvent(Swift_Transport $source, Swift_TransportException $ex) { return new Swift_Events_TransportExceptionEvent($source, $ex); } /** * Bind an event listener to this dispatcher. * * @param Swift_Events_EventListener $listener */ public function bindEventListener(Swift_Events_EventListener $listener) { foreach ($this->_listeners as $l) { //Already loaded if ($l === $listener) { return; } } $this->_listeners[] = $listener; } /** * Dispatch the given Event to all suitable listeners. * * @param Swift_Events_EventObject $evt * @param string $target method */ public function dispatchEvent(Swift_Events_EventObject $evt, $target) { $this->_prepareBubbleQueue($evt); $this->_bubble($evt, $target); } // -- Private methods /** Queue listeners on a stack ready for $evt to be bubbled up it */ private function _prepareBubbleQueue(Swift_Events_EventObject $evt) { $this->_bubbleQueue = array(); $evtClass = get_class($evt); foreach ($this->_listeners as $listener) { if (array_key_exists($evtClass, $this->_eventMap) && ($listener instanceof $this->_eventMap[$evtClass])) { $this->_bubbleQueue[] = $listener; } } } /** Bubble $evt up the stack calling $target() on each listener */ private function _bubble(Swift_Events_EventObject $evt, $target) { if (!$evt->bubbleCancelled() && $listener = array_shift($this->_bubbleQueue)) { $listener->$target($evt); $this->_bubble($evt, $target); } } } |