diff options
Diffstat (limited to 'Swiften/Base/Log.h')
-rw-r--r-- | Swiften/Base/Log.h | 77 |
1 files changed, 48 insertions, 29 deletions
diff --git a/Swiften/Base/Log.h b/Swiften/Base/Log.h index a46860f..255e478 100644 --- a/Swiften/Base/Log.h +++ b/Swiften/Base/Log.h @@ -1,44 +1,63 @@ /* - * Copyright (c) 2010-2013 Remko Tronçon - * Licensed under the GNU General Public License v3. - * See Documentation/Licenses/GPLv3.txt for more information. + * Copyright (c) 2010-2013 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. */ #pragma once +#include <cstdio> +#include <functional> +#include <memory> #include <sstream> #include <Swiften/Base/API.h> namespace Swift { - class SWIFTEN_API Log { - public: - enum Severity { - error, warning, info, debug - }; - - Log(); - ~Log(); - - std::ostringstream& getStream( - Severity severity, - const std::string& severityString, - const std::string& file, - int line, - const std::string& function); - - static Severity getLogLevel(); - static void setLogLevel(Severity level); - - private: - std::ostringstream stream; - }; + class SWIFTEN_API Log { + public: + enum Severity { + error, warning, info, debug + }; + using Callback = std::function<void(Severity severity, std::string file, int line, std::string function, std::string message)>; + + Log(); + ~Log(); + + std::ostringstream& getStream( + Severity severity, + std::string severityString, + std::string file, + int line, + std::string function); + + static Severity getLogLevel(); + static void setLogLevel(Severity level); + static void setLogFile(const std::string& fileName); + static void setLogCallback(Callback callback); + + private: + struct LogFileClose { + void operator()(FILE* p) { + if (p) { + fclose(p); + } + } + }; + std::ostringstream stream; + static std::unique_ptr<FILE, LogFileClose> logfile; + static Callback logCallback; + Severity severity_; + std::string file_; + int line_; + std::string function_; + }; } #define SWIFT_LOG(severity) \ - if (Log::severity > Log::getLogLevel()) ; \ - else Log().getStream(Log::severity, #severity, __FILE__, __LINE__, __FUNCTION__) + if (Log::severity > Log::getLogLevel()) ; \ + else Log().getStream(Log::severity, #severity, __FILE__, __LINE__, __FUNCTION__) #define SWIFT_LOG_ASSERT(test, severity) \ - if (Log::severity > Log::getLogLevel() || (test)) ; \ - else Log().getStream(Log::severity, #severity, __FILE__, __LINE__, __FUNCTION__) << "Assertion failed: " << #test << ". " + if (Log::severity > Log::getLogLevel() || (test)) ; \ + else Log().getStream(Log::severity, #severity, __FILE__, __LINE__, __FUNCTION__) << "Assertion failed: " << #test << ". " |