4 * This file is part of SwiftMailer.
5 * (c) 2004-2009 Chris Corbyn
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 //@require 'Swift/Events/EventDispatcher.php';
12 //@require 'Swift/Events/EventListener.php';
13 //@require 'Swift/Events/EventObject.php';
14 //@require 'Swift/Events/CommandEvent.php';
15 //@require 'Swift/Events/ResponseEvent.php';
16 //@require 'Swift/Events/SendEvent.php';
17 //@require 'Swift/Events/TransportChangeEvent.php';
18 //@require 'Swift/Events/TransportExceptionEvent.php';
21 * The EventDispatcher which handles the event dispatching layer.
25 * @author Chris Corbyn
27 class Swift_Events_SimpleEventDispatcher
implements Swift_Events_EventDispatcher
30 /** A map of event types to their associated listener types */
31 private $_eventMap = array();
33 /** Event listeners bound to this dispatcher */
34 private $_listeners = array();
36 /** Listeners queued to have an Event bubbled up the stack to them */
37 private $_bubbleQueue = array();
40 * Create a new EventDispatcher.
42 public function __construct()
44 $this->_eventMap
= array(
45 'Swift_Events_CommandEvent' => 'Swift_Events_CommandListener',
46 'Swift_Events_ResponseEvent' => 'Swift_Events_ResponseListener',
47 'Swift_Events_SendEvent' => 'Swift_Events_SendListener',
48 'Swift_Events_TransportChangeEvent' => 'Swift_Events_TransportChangeListener',
49 'Swift_Events_TransportExceptionEvent' => 'Swift_Events_TransportExceptionListener'
54 * Create a new SendEvent for $source and $message.
56 * @param Swift_Transport $source
57 * @param Swift_Mime_Message
58 * @return Swift_Events_SendEvent
60 public function createSendEvent(Swift_Transport
$source,
61 Swift_Mime_Message
$message)
63 return new Swift_Events_SendEvent($source, $message);
67 * Create a new CommandEvent for $source and $command.
69 * @param Swift_Transport $source
70 * @param string $command That will be executed
71 * @param array $successCodes That are needed
72 * @return Swift_Events_CommandEvent
74 public function createCommandEvent(Swift_Transport
$source,
75 $command, $successCodes = array())
77 return new Swift_Events_CommandEvent($source, $command, $successCodes);
81 * Create a new ResponseEvent for $source and $response.
83 * @param Swift_Transport $source
84 * @param string $response
85 * @param boolean $valid If the response is valid
86 * @return Swift_Events_ResponseEvent
88 public function createResponseEvent(Swift_Transport
$source,
91 return new Swift_Events_ResponseEvent($source, $response, $valid);
95 * Create a new TransportChangeEvent for $source.
97 * @param Swift_Transport $source
98 * @return Swift_Events_TransportChangeEvent
100 public function createTransportChangeEvent(Swift_Transport
$source)
102 return new Swift_Events_TransportChangeEvent($source);
106 * Create a new TransportExceptionEvent for $source.
108 * @param Swift_Transport $source
109 * @param Swift_TransportException $ex
110 * @return Swift_Events_TransportExceptionEvent
112 public function createTransportExceptionEvent(Swift_Transport
$source,
113 Swift_TransportException
$ex)
115 return new Swift_Events_TransportExceptionEvent($source, $ex);
119 * Bind an event listener to this dispatcher.
121 * @param Swift_Events_EventListener $listener
123 public function bindEventListener(Swift_Events_EventListener
$listener)
125 foreach ($this->_listeners
as $l)
128 if ($l === $listener)
133 $this->_listeners
[] = $listener;
137 * Dispatch the given Event to all suitable listeners.
139 * @param Swift_Events_EventObject $evt
140 * @param string $target method
142 public function dispatchEvent(Swift_Events_EventObject
$evt, $target)
144 $this->_prepareBubbleQueue($evt);
145 $this->_bubble($evt, $target);
148 // -- Private methods
150 /** Queue listeners on a stack ready for $evt to be bubbled up it */
151 private function _prepareBubbleQueue(Swift_Events_EventObject
$evt)
153 $this->_bubbleQueue
= array();
154 $evtClass = get_class($evt);
155 foreach ($this->_listeners
as $listener)
157 if (array_key_exists($evtClass, $this->_eventMap
)
158 && ($listener instanceof $this->_eventMap
[$evtClass]))
160 $this->_bubbleQueue
[] = $listener;
165 /** Bubble $evt up the stack calling $target() on each listener */
166 private function _bubble(Swift_Events_EventObject
$evt, $target)
168 if (!$evt->bubbleCancelled() && $listener = array_shift($this->_bubbleQueue
))
170 $listener->$target($evt);
171 $this->_bubble($evt, $target);