1<?php
2
3/*
4 * This file is part of SwiftMailer.
5 * (c) 2004-2009 Chris Corbyn
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11/**
12 * Does real time logging of Transport level information.
13 *
14 * @author     Chris Corbyn
15 */
16class Swift_Plugins_LoggerPlugin implements Swift_Events_CommandListener, Swift_Events_ResponseListener, Swift_Events_TransportChangeListener, Swift_Events_TransportExceptionListener, Swift_Plugins_Logger
17{
18    /** The logger which is delegated to */
19    private $logger;
20
21    /**
22     * Create a new LoggerPlugin using $logger.
23     *
24     * @param Swift_Plugins_Logger $logger
25     */
26    public function __construct(Swift_Plugins_Logger $logger)
27    {
28        $this->logger = $logger;
29    }
30
31    /**
32     * Add a log entry.
33     *
34     * @param string $entry
35     */
36    public function add($entry)
37    {
38        $this->logger->add($entry);
39    }
40
41    /**
42     * Clear the log contents.
43     */
44    public function clear()
45    {
46        $this->logger->clear();
47    }
48
49    /**
50     * Get this log as a string.
51     *
52     * @return string
53     */
54    public function dump()
55    {
56        return $this->logger->dump();
57    }
58
59    /**
60     * Invoked immediately following a command being sent.
61     *
62     * @param Swift_Events_CommandEvent $evt
63     */
64    public function commandSent(Swift_Events_CommandEvent $evt)
65    {
66        $command = $evt->getCommand();
67        $this->logger->add(sprintf('>> %s', $command));
68    }
69
70    /**
71     * Invoked immediately following a response coming back.
72     *
73     * @param Swift_Events_ResponseEvent $evt
74     */
75    public function responseReceived(Swift_Events_ResponseEvent $evt)
76    {
77        $response = $evt->getResponse();
78        $this->logger->add(sprintf('<< %s', $response));
79    }
80
81    /**
82     * Invoked just before a Transport is started.
83     *
84     * @param Swift_Events_TransportChangeEvent $evt
85     */
86    public function beforeTransportStarted(Swift_Events_TransportChangeEvent $evt)
87    {
88        $transportName = get_class($evt->getSource());
89        $this->logger->add(sprintf('++ Starting %s', $transportName));
90    }
91
92    /**
93     * Invoked immediately after the Transport is started.
94     *
95     * @param Swift_Events_TransportChangeEvent $evt
96     */
97    public function transportStarted(Swift_Events_TransportChangeEvent $evt)
98    {
99        $transportName = get_class($evt->getSource());
100        $this->logger->add(sprintf('++ %s started', $transportName));
101    }
102
103    /**
104     * Invoked just before a Transport is stopped.
105     *
106     * @param Swift_Events_TransportChangeEvent $evt
107     */
108    public function beforeTransportStopped(Swift_Events_TransportChangeEvent $evt)
109    {
110        $transportName = get_class($evt->getSource());
111        $this->logger->add(sprintf('++ Stopping %s', $transportName));
112    }
113
114    /**
115     * Invoked immediately after the Transport is stopped.
116     *
117     * @param Swift_Events_TransportChangeEvent $evt
118     */
119    public function transportStopped(Swift_Events_TransportChangeEvent $evt)
120    {
121        $transportName = get_class($evt->getSource());
122        $this->logger->add(sprintf('++ %s stopped', $transportName));
123    }
124
125    /**
126     * Invoked as a TransportException is thrown in the Transport system.
127     *
128     * @param Swift_Events_TransportExceptionEvent $evt
129     */
130    public function exceptionThrown(Swift_Events_TransportExceptionEvent $evt)
131    {
132        $e = $evt->getException();
133        $message = $e->getMessage();
134        $code = $e->getCode();
135        $this->logger->add(sprintf('!! %s (code: %s)', $message, $code));
136        $message .= PHP_EOL;
137        $message .= 'Log data:'.PHP_EOL;
138        $message .= $this->logger->dump();
139        $evt->cancelBubble();
140        throw new Swift_TransportException($message, $code, $e->getPrevious());
141    }
142}
143