source: filezilla/trunk/fuentes/src/engine/logging_private.h @ 130

Last change on this file since 130 was 130, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 2.7 KB
Line 
1#ifndef __LOGGING_PRIVATE_H__
2#define __LOGGING_PRIVATE_H__
3
4#include "engineprivate.h"
5#include <mutex.h>
6#include <utility>
7
8class CLogging
9{
10public:
11        explicit CLogging(CFileZillaEnginePrivate & engine);
12        virtual ~CLogging();
13
14        CLogging(CLogging const&) = delete;
15        CLogging& operator=(CLogging const&) = delete;
16
17        template<typename String, typename...Args>
18        void LogMessage(MessageType nMessageType, String&& msgFormat, Args&& ...args) const
19        {
20                if( !ShouldLog(nMessageType) ) {
21                        return;
22                }
23
24                CLogmsgNotification *notification = new CLogmsgNotification(nMessageType);
25                notification->msg.Printf(std::forward<String>(msgFormat), std::forward<Args>(args)...);
26
27                LogToFile(nMessageType, notification->msg);
28                engine_.AddLogNotification(notification);
29        }
30
31        template<typename String>
32        void LogMessageRaw(MessageType nMessageType, String&& msg) const
33        {
34                if( !ShouldLog(nMessageType) ) {
35                        return;
36                }
37
38                CLogmsgNotification *notification = new CLogmsgNotification(nMessageType, std::forward<String>(msg));
39
40                LogToFile(nMessageType, notification->msg);
41                engine_.AddLogNotification(notification);
42        }
43
44        template<typename String, typename String2, typename...Args>
45        void LogMessage(String&& sourceFile, int nSourceLine, void *pInstance, MessageType nMessageType
46                                        , String2&& msgFormat, Args&& ...args) const
47        {
48                if( !ShouldLog(nMessageType) ) {
49                        return;
50                }
51
52                wxString source(sourceFile);
53                int pos = source.Find('\\', true);
54                if (pos != -1)
55                        source = source.Mid(pos+1);
56
57                pos = source.Find('/', true);
58                if (pos != -1)
59                        source = source.Mid(pos+1);
60
61                wxString text = wxString::Format(std::forward<String2>(msgFormat), std::forward<Args>(args)...);
62
63                CLogmsgNotification *notification = new CLogmsgNotification(nMessageType);
64                notification->msg.Printf(_T("%s(%d): %s   caller=%p"), source, nSourceLine, text, pInstance);
65
66                LogToFile(nMessageType, notification->msg);
67                engine_.AddLogNotification(notification);
68        }
69
70        bool ShouldLog(MessageType nMessageType) const;
71
72        // Only affects calling thread
73        static void UpdateLogLevel(COptionsBase & options);
74
75private:
76        CFileZillaEnginePrivate & engine_;
77
78        void InitLogFile() const;
79        void LogToFile(MessageType nMessageType, const wxString& msg) const;
80
81        static bool m_logfile_initialized;
82#ifdef __WXMSW__
83        static HANDLE m_log_fd;
84#else
85        static int m_log_fd;
86#endif
87        static wxString m_prefixes[static_cast<int>(MessageType::count)];
88        static unsigned int m_pid;
89        static int m_max_size;
90        static wxString m_file;
91
92        static int m_refcount;
93
94        static mutex mutex_;
95
96#if HAVE_NO_THREAD_LOCAL
97        // Fixme: Get rid of this once OS X's clang supports it.
98        #define thread_local __thread
99#endif
100        static thread_local int debug_level_;
101        static thread_local int raw_listing_;
102};
103
104#endif
Note: See TracBrowser for help on using the repository browser.