SimpleEventDispatcher.php 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. /*
  3. * This file is part of SwiftMailer.
  4. * (c) 2004-2009 Chris Corbyn
  5. *
  6. * For the full copyright and license information, please view the LICENSE
  7. * file that was distributed with this source code.
  8. */
  9. /**
  10. * The EventDispatcher which handles the event dispatching layer.
  11. *
  12. * @package Swift
  13. * @subpackage Events
  14. * @author Chris Corbyn
  15. */
  16. class Swift_Events_SimpleEventDispatcher implements Swift_Events_EventDispatcher
  17. {
  18. /** A map of event types to their associated listener types */
  19. private $_eventMap = array();
  20. /** Event listeners bound to this dispatcher */
  21. private $_listeners = array();
  22. /** Listeners queued to have an Event bubbled up the stack to them */
  23. private $_bubbleQueue = array();
  24. /**
  25. * Create a new EventDispatcher.
  26. */
  27. public function __construct()
  28. {
  29. $this->_eventMap = array(
  30. 'Swift_Events_CommandEvent' => 'Swift_Events_CommandListener',
  31. 'Swift_Events_ResponseEvent' => 'Swift_Events_ResponseListener',
  32. 'Swift_Events_SendEvent' => 'Swift_Events_SendListener',
  33. 'Swift_Events_TransportChangeEvent' => 'Swift_Events_TransportChangeListener',
  34. 'Swift_Events_TransportExceptionEvent' => 'Swift_Events_TransportExceptionListener'
  35. );
  36. }
  37. /**
  38. * Create a new SendEvent for $source and $message.
  39. *
  40. * @param Swift_Transport $source
  41. * @param Swift_Mime_Message
  42. *
  43. * @return Swift_Events_SendEvent
  44. */
  45. public function createSendEvent(Swift_Transport $source, Swift_Mime_Message $message)
  46. {
  47. return new Swift_Events_SendEvent($source, $message);
  48. }
  49. /**
  50. * Create a new CommandEvent for $source and $command.
  51. *
  52. * @param Swift_Transport $source
  53. * @param string $command That will be executed
  54. * @param array $successCodes That are needed
  55. *
  56. * @return Swift_Events_CommandEvent
  57. */
  58. public function createCommandEvent(Swift_Transport $source, $command, $successCodes = array())
  59. {
  60. return new Swift_Events_CommandEvent($source, $command, $successCodes);
  61. }
  62. /**
  63. * Create a new ResponseEvent for $source and $response.
  64. *
  65. * @param Swift_Transport $source
  66. * @param string $response
  67. * @param boolean $valid If the response is valid
  68. *
  69. * @return Swift_Events_ResponseEvent
  70. */
  71. public function createResponseEvent(Swift_Transport $source, $response, $valid)
  72. {
  73. return new Swift_Events_ResponseEvent($source, $response, $valid);
  74. }
  75. /**
  76. * Create a new TransportChangeEvent for $source.
  77. *
  78. * @param Swift_Transport $source
  79. *
  80. * @return Swift_Events_TransportChangeEvent
  81. */
  82. public function createTransportChangeEvent(Swift_Transport $source)
  83. {
  84. return new Swift_Events_TransportChangeEvent($source);
  85. }
  86. /**
  87. * Create a new TransportExceptionEvent for $source.
  88. *
  89. * @param Swift_Transport $source
  90. * @param Swift_TransportException $ex
  91. *
  92. * @return Swift_Events_TransportExceptionEvent
  93. */
  94. public function createTransportExceptionEvent(Swift_Transport $source, Swift_TransportException $ex)
  95. {
  96. return new Swift_Events_TransportExceptionEvent($source, $ex);
  97. }
  98. /**
  99. * Bind an event listener to this dispatcher.
  100. *
  101. * @param Swift_Events_EventListener $listener
  102. */
  103. public function bindEventListener(Swift_Events_EventListener $listener)
  104. {
  105. foreach ($this->_listeners as $l) {
  106. //Already loaded
  107. if ($l === $listener) {
  108. return;
  109. }
  110. }
  111. $this->_listeners[] = $listener;
  112. }
  113. /**
  114. * Dispatch the given Event to all suitable listeners.
  115. *
  116. * @param Swift_Events_EventObject $evt
  117. * @param string $target method
  118. */
  119. public function dispatchEvent(Swift_Events_EventObject $evt, $target)
  120. {
  121. $this->_prepareBubbleQueue($evt);
  122. $this->_bubble($evt, $target);
  123. }
  124. // -- Private methods
  125. /** Queue listeners on a stack ready for $evt to be bubbled up it */
  126. private function _prepareBubbleQueue(Swift_Events_EventObject $evt)
  127. {
  128. $this->_bubbleQueue = array();
  129. $evtClass = get_class($evt);
  130. foreach ($this->_listeners as $listener) {
  131. if (array_key_exists($evtClass, $this->_eventMap)
  132. && ($listener instanceof $this->_eventMap[$evtClass]))
  133. {
  134. $this->_bubbleQueue[] = $listener;
  135. }
  136. }
  137. }
  138. /** Bubble $evt up the stack calling $target() on each listener */
  139. private function _bubble(Swift_Events_EventObject $evt, $target)
  140. {
  141. if (!$evt->bubbleCancelled() && $listener = array_shift($this->_bubbleQueue)) {
  142. $listener->$target($evt);
  143. $this->_bubble($evt, $target);
  144. }
  145. }
  146. }