SimpleEventDispatcher.php 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. * @return Swift_Events_SendEvent
  43. */
  44. public function createSendEvent(Swift_Transport $source, Swift_Mime_Message $message)
  45. {
  46. return new Swift_Events_SendEvent($source, $message);
  47. }
  48. /**
  49. * Create a new CommandEvent for $source and $command.
  50. *
  51. * @param Swift_Transport $source
  52. * @param string $command That will be executed
  53. * @param array $successCodes That are needed
  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 boolean $valid If the response is valid
  66. * @return Swift_Events_ResponseEvent
  67. */
  68. public function createResponseEvent(Swift_Transport $source, $response, $valid)
  69. {
  70. return new Swift_Events_ResponseEvent($source, $response, $valid);
  71. }
  72. /**
  73. * Create a new TransportChangeEvent for $source.
  74. *
  75. * @param Swift_Transport $source
  76. * @return Swift_Events_TransportChangeEvent
  77. */
  78. public function createTransportChangeEvent(Swift_Transport $source)
  79. {
  80. return new Swift_Events_TransportChangeEvent($source);
  81. }
  82. /**
  83. * Create a new TransportExceptionEvent for $source.
  84. *
  85. * @param Swift_Transport $source
  86. * @param Swift_TransportException $ex
  87. * @return Swift_Events_TransportExceptionEvent
  88. */
  89. public function createTransportExceptionEvent(Swift_Transport $source, Swift_TransportException $ex)
  90. {
  91. return new Swift_Events_TransportExceptionEvent($source, $ex);
  92. }
  93. /**
  94. * Bind an event listener to this dispatcher.
  95. *
  96. * @param Swift_Events_EventListener $listener
  97. */
  98. public function bindEventListener(Swift_Events_EventListener $listener)
  99. {
  100. foreach ($this->_listeners as $l) {
  101. //Already loaded
  102. if ($l === $listener) {
  103. return;
  104. }
  105. }
  106. $this->_listeners[] = $listener;
  107. }
  108. /**
  109. * Dispatch the given Event to all suitable listeners.
  110. *
  111. * @param Swift_Events_EventObject $evt
  112. * @param string $target method
  113. */
  114. public function dispatchEvent(Swift_Events_EventObject $evt, $target)
  115. {
  116. $this->_prepareBubbleQueue($evt);
  117. $this->_bubble($evt, $target);
  118. }
  119. // -- Private methods
  120. /** Queue listeners on a stack ready for $evt to be bubbled up it */
  121. private function _prepareBubbleQueue(Swift_Events_EventObject $evt)
  122. {
  123. $this->_bubbleQueue = array();
  124. $evtClass = get_class($evt);
  125. foreach ($this->_listeners as $listener) {
  126. if (array_key_exists($evtClass, $this->_eventMap)
  127. && ($listener instanceof $this->_eventMap[$evtClass]))
  128. {
  129. $this->_bubbleQueue[] = $listener;
  130. }
  131. }
  132. }
  133. /** Bubble $evt up the stack calling $target() on each listener */
  134. private function _bubble(Swift_Events_EventObject $evt, $target)
  135. {
  136. if (!$evt->bubbleCancelled() && $listener = array_shift($this->_bubbleQueue)) {
  137. $listener->$target($evt);
  138. $this->_bubble($evt, $target);
  139. }
  140. }
  141. }