SimpleEventDispatcher.php 4.3 KB

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