SimpleEventDispatcher.php 4.8 KB

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