source: trunk/src/halEvent.hpp @ 376

Revision 376, 7.6 KB checked in by Eoin, 12 years ago (diff)

v 0.3.0.2 release.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2008.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#pragma once
8
9#define HAL_EVENT_BEGIN                                 81000
10#define HAL_EVENT_EXP                   HAL_EVENT_BEGIN + 1
11#define HAL_EVENT_XML_EXP               HAL_EVENT_BEGIN + 2
12#define HAL_EVENT_UNICODE_EXP           HAL_EVENT_BEGIN + 3
13#define HAL_EVENT_DEBUG                 HAL_EVENT_BEGIN + 4
14#define HAL_EVENT_UNCLASSIFIED          HAL_EVENT_BEGIN + 5
15#define HAL_EVENT_PEER                  HAL_EVENT_BEGIN + 6
16#define HAL_EVENT_TRACKER               HAL_EVENT_BEGIN + 7
17#define HAL_EVENT_TORRENTEXP            HAL_EVENT_BEGIN + 8
18#define HAL_EVENT_INVTORRENT            HAL_EVENT_BEGIN + 9
19#define HAL_EVENT_DEV                   HAL_EVENT_BEGIN + 10
20
21#ifndef RC_INVOKED
22
23#include <string>
24#include <vector>
25
26#include <boost/date_time/posix_time/posix_time.hpp>
27#include <boost/smart_ptr.hpp>
28
29#include "global/wtl_app.hpp"
30#include "global/string_conv.hpp"
31
32#include "halTorrent.hpp"
33
34#ifdef TORRENT_LOGGING
35#       define HAL_DEV_MSG(msg) \
36        hal::event().post(boost::shared_ptr<hal::EventDetail>( \
37                        new hal::EventMsg(msg, hal::Event::dev)))
38#else
39#       define HAL_DEV_MSG(msg)
40#endif
41
42namespace hal
43{
44
45class Event
46{
47public:
48        enum eventLevel { dev, debug, info, warning, critical, fatal, none };
49       
50        enum codes {
51                noEvent = 0,
52                unclassified = HAL_EVENT_UNCLASSIFIED,
53                debugEvent = HAL_EVENT_DEBUG,
54                devEvent = HAL_EVENT_DEV,
55                invalidTorrent = HAL_EVENT_INVTORRENT,
56                torrentException = HAL_EVENT_TORRENTEXP,
57                generalException = HAL_EVENT_EXP,
58                xmlException = HAL_EVENT_XML_EXP,
59                unicodeException = HAL_EVENT_UNICODE_EXP,
60                peer = HAL_EVENT_PEER,
61                tracker = HAL_EVENT_TRACKER,
62                infoCode
63        };
64       
65        static std::wstring eventLevelToStr(eventLevel);       
66        void post(boost::shared_ptr<EventDetail> event);
67       
68        boost::signals::connection attach(boost::function<void (boost::shared_ptr<EventDetail>)> fn)
69        {
70                return event_signal_.connect(fn);
71        }
72       
73private:
74        boost::signal<void (boost::shared_ptr<EventDetail>)> event_signal_;
75};
76
77Event& event();
78
79class EventDetail
80{
81public:
82        EventDetail(Event::eventLevel l, boost::posix_time::ptime t, Event::codes c) :
83                level_(l),
84                timeStamp_(t),
85                code_(c)
86        {}
87        virtual ~EventDetail() 
88        {}
89       
90        virtual std::wstring msg()
91        {
92                return (boost::wformat(L"Code %1%") % code()).str();
93        }
94
95        Event::eventLevel level() { return level_; }
96        boost::posix_time::ptime timeStamp() { return timeStamp_; }
97        Event::codes code() { return code_; }
98       
99private:       
100        Event::eventLevel level_;
101        boost::posix_time::ptime timeStamp_;
102        Event::codes code_;
103};
104
105class EventLibtorrent : public EventDetail
106{
107public:
108        EventLibtorrent(Event::eventLevel l, boost::posix_time::ptime t, Event::codes c, std::wstring m) :
109                EventDetail(l, t, c),
110                msg_(m)
111        {}
112       
113        virtual std::wstring msg()
114        {
115                return (boost::wformat(hal::app().res_wstr(code())) % msg_).str();
116        }
117       
118private:
119        std::wstring msg_;
120};
121
122class EventGeneral : public EventDetail
123{
124public:
125        EventGeneral(Event::eventLevel l, Event::codes c, std::wstring m) :
126                EventDetail(l, boost::posix_time::second_clock::universal_time(), c),
127                msg_(m)
128        {}
129       
130        EventGeneral(Event::eventLevel l, boost::posix_time::ptime t, std::wstring m) :
131                EventDetail(l, t, Event::noEvent),
132                msg_(m)
133        {}
134       
135        template<typename str_t>
136        EventGeneral(Event::eventLevel l, str_t m) :
137                EventDetail(l, boost::posix_time::second_clock::universal_time(), Event::noEvent),
138                msg_(hal::to_wstr_shim(m))
139        {}
140       
141        template<typename str_t>       
142        EventGeneral(Event::eventLevel l, boost::posix_time::ptime t, str_t m) :
143                EventDetail(l, t, Event::noEvent),
144                msg_(hal::to_wstr_shim(m))
145        {}
146       
147        virtual std::wstring msg()
148        {
149                if (Event::noEvent != code())
150                        return (boost::wformat(hal::app().res_wstr(code())) % msg_).str();
151                else
152                        return msg_;
153        }
154       
155private:
156        std::wstring msg_;
157};
158
159class EventMsg : public EventDetail
160{
161public:
162        template<typename str_t>
163        EventMsg(str_t m, Event::eventLevel l=Event::debug, 
164                boost::posix_time::ptime t=boost::posix_time::second_clock::universal_time(), Event::codes c=Event::noEvent) :
165                EventDetail(l, t, c),
166                msg_(hal::to_wstr_shim(m))
167        {}
168       
169        virtual std::wstring msg()
170        {
171                if (Event::noEvent != code())
172                        return (boost::wformat(hal::app().res_wstr(code())) % msg_).str();
173                else
174                        return msg_;
175        }
176       
177private:
178        std::wstring msg_;
179};
180
181class EventPeerAlert : public EventDetail
182{
183public:
184        EventPeerAlert(Event::eventLevel l, boost::posix_time::ptime t, std::wstring m) :
185                EventDetail(l, t, Event::peer),
186                msg_(m)
187        {}
188       
189        virtual std::wstring msg()
190        {
191                return (boost::wformat(hal::app().res_wstr(code())) % msg_).str();
192        }
193       
194private:
195        std::wstring msg_;
196};
197
198class EventXmlException : public EventDetail
199{
200public:
201        EventXmlException(std::wstring e, std::wstring m) :
202                EventDetail(Event::warning, boost::posix_time::second_clock::universal_time(), Event::xmlException),
203                exp_(e),
204                msg_(m)
205        {}
206       
207        virtual std::wstring msg()
208        {
209                return (boost::wformat(hal::app().res_wstr(HAL_EVENT_XML_EXP)) % exp_ % msg_).str();
210        }
211       
212private:
213        std::wstring exp_;
214        std::wstring msg_;
215};
216
217class EventInvalidTorrent : public EventDetail
218{
219public:
220        template<typename t_str, typename f_str>
221        EventInvalidTorrent(Event::eventLevel l, Event::codes code, t_str t, f_str f) :
222                EventDetail(l, boost::posix_time::second_clock::universal_time(), code),
223                torrent_(hal::to_wstr_shim(t)),
224                function_(hal::to_wstr_shim(f))
225        {}
226       
227        virtual std::wstring msg()
228        {
229                return (boost::wformat(hal::app().res_wstr(code())) % torrent_ % function_).str();
230        }
231       
232private:
233        std::wstring function_;
234        std::wstring torrent_;
235        std::wstring exception_;
236};
237
238class EventTorrentException : public EventDetail
239{
240public:
241        template<typename e_str, typename t_str, typename f_str>
242        EventTorrentException(Event::eventLevel l, Event::codes code, e_str e, t_str t, f_str f) :
243                EventDetail(l, boost::posix_time::second_clock::universal_time(), code),
244                torrent_(hal::to_wstr_shim(t)),
245                function_(hal::to_wstr_shim(f)),
246                exception_(hal::to_wstr_shim(e))
247        {}
248       
249        virtual std::wstring msg()
250        {
251                return (boost::wformat(hal::app().res_wstr(code())) % torrent_ % exception_ % function_).str();
252        }
253       
254private:
255        std::wstring torrent_;
256        std::wstring function_;
257        std::wstring exception_;
258};
259
260class EventStdException : public EventDetail
261{
262public:
263        EventStdException(Event::eventLevel l, const std::exception& e, std::wstring from) :
264                EventDetail(l, boost::posix_time::second_clock::universal_time(), Event::generalException),
265                exception_(hal::from_utf8(e.what())),
266                from_(from)
267        {}
268       
269        virtual std::wstring msg()
270        {
271                return (boost::wformat(hal::app().res_wstr(code())) % exception_ % from_).str();
272        }
273       
274private:
275        std::wstring exception_;
276        std::wstring from_;
277};
278
279class EventDebug : public EventDetail
280{
281public:
282        EventDebug(Event::eventLevel l, std::wstring msg) :
283                EventDetail(l, boost::posix_time::second_clock::universal_time(), Event::debugEvent),
284                msg_(msg)
285        {}
286       
287        virtual std::wstring msg()
288        {
289                return (boost::wformat(hal::app().res_wstr(code())) % msg_).str();
290        }
291       
292private:
293        std::wstring msg_;
294};
295
296class EventInfo : public EventDetail
297{
298public:
299        EventInfo(std::wstring msg) :
300                EventDetail(Event::info, boost::posix_time::second_clock::universal_time(), Event::infoCode),
301                msg_(msg)
302        {}
303       
304        virtual std::wstring msg() { return msg_; }
305       
306private:
307        std::wstring msg_;
308};
309
310class EventSession : public EventDetail
311{
312
313};
314
315}// namespace hal
316
317#endif
Note: See TracBrowser for help on using the repository browser.