2 // This file is part of the aMule Project.
4 // Copyright (c) 2005-2008 aMule Team ( admin@amule.org / http://www.amule.org )
6 // Any parts of this program derived from the xMule, lMule or eMule project,
7 // or contributed by third-party developers are copyrighted by their
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU General Public License for more details.
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
35 //! Standard warning, not debug
37 //! General warnings/errors.
39 //! Warnings/Errors for the main hashing thread.
41 //! Warnings/Errors for client-objects.
43 //! Warnings/Errors for the local client protocol.
45 //! Warnings/Errors for the remote client protocol.
47 //! Warnings/Errors when parsing packets.
49 //! Warnings/Errors for the CFile class.
51 //! Warnings/Errors related to reading/writing files.
53 //! Warnings/Errors when using the zLib library.
55 //! Warnings/Errors for the AICH-syncronization thread.
57 //! Warnings/Errors for transfering AICH hash-sets.
59 //! Warnings/Errors when recovering with AICH.
61 //! Warnings/Errors for the CListenSocket class.
63 //! Warnings/Errors for Client-Credits.
65 //! Warnings/Errors for the client UDP socket.
67 //! Warnings/Errors for the download-queue.
69 //! Warnings/Errors for the IP-Filter.
71 //! Warnings/Errors for known-files.
73 //! Warnings/Errors for part-files.
75 //! Warnings/Errors for SHA-hashset creation.
77 //! Warnings/Errors for servers, server connections.
79 //! Warnings/Errors for proxy.
81 //! Warnings/Errors related to searching.
83 //! Warnings/Errors related to the server UDP socket.
85 //! Warning/Errors related to Kademlia UDP comunication on client
87 //! Warning/Errors related to Kademlia Search
89 //! Warning/Errors related to Kademlia Routing
91 //! Warning/Errors related to Kademlia Indexing
93 //! Warning/Errors related to Kademlia Main Thread
95 //! Warning/Errors related to Kademlia Preferences
97 //! Warnings/Errors related to partfile importer
99 //! Warnings/Errors related to the basic UDP socket-class.
101 //! Warnings/Errors related to the thread-scheduler.
103 //! Warnings/Errors related to the Universal Plug and Play subsystem.
105 //! Warnings/Errors related to the UDP Firewall Tester
107 //! Warnings/Errors related to Kad packet tracking.
108 logKadPacketTracking
,
109 //! Warnings/Errors related to Kad entry tracking.
111 //! Full log of external connection packets
113 // IMPORTANT NOTE: when you add values to this enum, update the g_debugcats
114 // array in Logger.cpp!
120 * Container-class for the debugging categories.
128 * @param type The actual debug-category type.
129 * @param name The user-readable name.
131 CDebugCategory( DebugType type
, const wxString
& name
)
132 : m_name(name
), m_type(type
), m_enabled(false)
137 * Returns true if the category is enabled.
139 bool IsEnabled() const { return m_enabled
; }
142 * Enables/Disables the category.
144 void SetEnabled( bool enabled
) { m_enabled
= enabled
; }
148 * Returns the user-readable name.
150 const wxString
& GetName() const { return m_name
; }
153 * Returns the actual type.
155 DebugType
GetType() const { return m_type
; }
158 //! The user-readable name.
162 //! Whenever or not the category is enabled.
168 * Functions for logging operations.
170 class CLogger
: public wxEvtHandler
174 * Returns true if debug-messages should be generated for a specific category.
177 bool IsEnabled( DebugType
) const;
179 bool IsEnabled( DebugType
) const { return false; }
183 * Enables or disables debug-messages for a specific category.
185 void SetEnabled( DebugType type
, bool enabled
);
188 * Returns true if logging to stdout is enabled
190 bool IsEnabledStdoutLog() const { return m_StdoutLog
; }
193 * Enables or disables logging to stdout.
195 void SetEnabledStdoutLog(bool enabled
) { m_StdoutLog
= enabled
; }
199 * Logs the specified line of text, prefixed with the name of the DebugType.
200 * (except for logStandard)
204 * @param critical If true, then the message will be made visible directly to the user.
205 * @param type The debug-category, the name of which will be prepended to the line.
206 * @param str The actual line of text.
208 * This function is thread-safe. If it is called by the main thread, the
209 * event will be sent directly to the application, otherwise it will be
210 * queued in the event-loop.
213 const wxString
&file
,
218 bool toStdout
= false,
223 const wxString
&file
,
227 const std::ostringstream
&msg
);
230 const wxString
&file
,
233 const std::ostringstream
&msg
);
237 * Returns a category specified by index.
239 const CDebugCategory
& GetDebugCategory( int index
);
242 * Returns the number of debug-categories.
244 unsigned int GetDebugCategoryCount();
247 * Open Logfile, true on success
249 bool OpenLogfile(const wxString
& name
);
257 * Get name of Logfile
259 const wxString
& GetLogfileName() const {
260 return m_LogfileName
;
266 void OnLoggingEvent(class CLoggingEvent
& evt
);
278 class wxFFileOutputStream
* applog
; // the logfile
279 wxString m_LogfileName
;
280 wxString m_ApplogBuf
;
282 int m_count
; // output line counter
285 * Write all waiting log info to the logfile
290 * Really output a single line
292 void DoLine(const wxString
& line
, bool toStdout
, bool toGUI
);
294 DECLARE_EVENT_TABLE()
297 extern CLogger theLogger
;
300 * This class forwards log-lines from wxWidgets to CLogger.
302 class CLoggerTarget
: public wxLog
308 * @see wxLog::DoLogString
310 #if wxCHECK_VERSION(2, 9, 0)
311 void DoLogText(const wxString
&msg
);
313 void DoLogString(const wxChar
*msg
, time_t);
318 DECLARE_LOCAL_EVENT_TYPE(MULE_EVT_LOGLINE
, -1)
321 /** This event is sent when a log-line is queued. */
322 class CLoggingEvent
: public wxEvent
325 CLoggingEvent(bool critical
, bool toStdout
, bool toGUI
, const wxString
& msg
)
326 : wxEvent(-1, MULE_EVT_LOGLINE
)
327 , m_critical(critical
)
330 // Deep copy, to avoid thread-unsafe reference counting. */
331 , m_msg(msg
.c_str(), msg
.Length())
335 const wxString
& Message() const {
339 bool IsCritical() const {
343 bool ToStdout() const {
351 wxEvent
* Clone() const {
352 return new CLoggingEvent(m_critical
, m_stdout
, m_GUI
, m_msg
);
363 typedef void (wxEvtHandler::*MuleLogEventFunction
)(CLoggingEvent
&);
365 //! Event-handler for completed hashings of new shared files and partfiles.
366 #define EVT_MULE_LOGGING(func) \
367 DECLARE_EVENT_TABLE_ENTRY(MULE_EVT_LOGLINE, -1, -1, \
368 (wxObjectEventFunction) (wxEventFunction) \
369 wxStaticCastEvent(MuleLogEventFunction, &func), (wxObject*) NULL),
372 // access the logfile for EC
376 class wxFFileInputStream
* m_logfile
;
377 class wxCharBuffer
* m_buffer
;
384 // construct/destruct
389 // get a String (if there is one)
391 bool GetString(wxString
& s
);
393 // is a String available ?
400 * These macros should be used when logging. The
401 * AddLogLineM macro will simply call one of the
402 * two CLogger::AddLogLine functions depending on
403 * parameters, but AddDebugLogLineM will only log
404 * a message if the message is either critical or
405 * the specified debug-type is enabled in the
407 * AddLogLineMS will also always print to stdout.
409 #if defined(MULEUNIT)
410 #define AddDebugLogLineM(...) do {} while (false)
411 #define AddLogLineM(...) do {} while (false)
412 #define AddLogLineMS(...) do {} while (false)
413 #define AddDebugLogLineN(...) do {} while (false)
414 #define AddLogLineN(...) do {} while (false)
415 #define AddLogLineNS(...) do {} while (false)
416 #define AddDebugLogLineC(...) do {} while (false)
417 #define AddLogLineC(...) do {} while (false)
418 #define AddLogLineCS(...) do {} while (false)
420 // Macros passing critical flag (legacy)
421 #define AddDebugLogLineM(critical, type, string) theLogger.AddLogLine(__TFILE__, __LINE__, critical, type, string)
422 #define AddLogLineM(critical, string) theLogger.AddLogLine(__TFILE__, __LINE__, critical, logStandard, string)
423 #define AddLogLineMS(critical, string) theLogger.AddLogLine(__TFILE__, __LINE__, critical, logStandard, string, true)
424 // Macro for UPnP. This is not a debug macro, but wants its category printed nevertheless (sigh).
425 #define AddLogLineU(critical, type, string) theLogger.AddLogLine(__TFILE__, __LINE__, critical, type, string)
426 // Macros for 'N'on critical logging
428 #define AddDebugLogLineN(type, string) theLogger.AddLogLine(__TFILE__, __LINE__, false, type, string)
430 #define AddDebugLogLineN(type, string) do {} while (false)
432 #define AddLogLineN(string) theLogger.AddLogLine(__TFILE__, __LINE__, false, logStandard, string)
433 #define AddLogLineNS(string) theLogger.AddLogLine(__TFILE__, __LINE__, false, logStandard, string, true)
434 // Macros for 'C'ritical logging
435 #define AddDebugLogLineC(type, string) theLogger.AddLogLine(__TFILE__, __LINE__, true, type, string)
436 #define AddLogLineC(string) theLogger.AddLogLine(__TFILE__, __LINE__, true, logStandard, string)
437 #define AddLogLineCS(string) theLogger.AddLogLine(__TFILE__, __LINE__, true, logStandard, string, true)
438 // Macros for logging to logfile only
439 #define AddDebugLogLineF(type, string) theLogger.AddLogLine(__TFILE__, __LINE__, false, type, string, false, false)
440 #define AddLogLineF(string) theLogger.AddLogLine(__TFILE__, __LINE__, false, logStandard, string, false, false)
444 // File_checked_for_headers