Avail feature updated
[ninja.git] / application / vendor / swiftmailer / classes / Swift / Events / SimpleEventDispatcher.php
blob3e6c0beb3dcf828e0d20ac114527bb9aed82c9e6
1 <?php
3 /*
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.
9 */
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';
20 /**
21 * The EventDispatcher which handles the event dispatching layer.
23 * @package Swift
24 * @subpackage Events
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();
39 /**
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'
53 /**
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);
66 /**
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);
80 /**
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,
89 $response, $valid)
91 return new Swift_Events_ResponseEvent($source, $response, $valid);
94 /**
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)
127 //Already loaded
128 if ($l === $listener)
130 return;
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);