summaryrefslogtreecommitdiff
path: root/src/base/Logger.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/Logger.h')
-rw-r--r--src/base/Logger.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/base/Logger.h b/src/base/Logger.h
new file mode 100644
index 0000000..197c0c2
--- /dev/null
+++ b/src/base/Logger.h
@@ -0,0 +1,154 @@
+//
+// libavg - Media Playback Engine.
+// Copyright (C) 2003-2014 Ulrich von Zadow
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// Current versions can be found at www.libavg.de
+//
+
+#ifndef _Logger_H_
+#define _Logger_H_
+
+#include "Exception.h"
+#include "ILogSink.h"
+#include "UTF8String.h"
+#include "ThreadHelper.h"
+#include "../api.h"
+
+#include <boost/noncopyable.hpp>
+#include <boost/functional/hash.hpp>
+#include <boost/unordered_map.hpp>
+
+#include <string>
+#include <vector>
+#include <sstream>
+
+#ifdef ERROR
+#undef ERROR
+#endif
+
+namespace avg {
+
+typedef boost::unordered_map< const category_t, const severity_t > CatToSeverityMap;
+
+#ifdef _WIN32
+// non dll-interface class used as base for dll-interface class
+#pragma warning(disable:4275)
+#endif
+class AVG_API Logger: private boost::noncopyable {
+public:
+ struct AVG_API severity
+ {
+ static const severity_t CRITICAL;
+ static const severity_t ERROR;
+ static const severity_t WARNING;
+ static const severity_t INFO;
+ static const severity_t DEBUG;
+ static const severity_t NONE;
+ };
+
+ struct AVG_API category
+ {
+ static const category_t NONE;
+ static const category_t PROFILE;
+ static const category_t PROFILE_VIDEO;
+ static const category_t EVENTS;
+ static const category_t CONFIG;
+ static const category_t MEMORY;
+ static const category_t APP;
+ static const category_t PLUGIN;
+ static const category_t PLAYER;
+ static const category_t SHADER;
+ static const category_t DEPRECATION;
+ };
+
+ static Logger* get();
+ virtual ~Logger();
+
+ static severity_t stringToSeverity(const string& sSeverity);
+ static const char * severityToString(const severity_t severity);
+
+ void addLogSink(const LogSinkPtr& logSink);
+ void removeLogSink(const LogSinkPtr& logSink);
+ void removeStdLogSink();
+
+ category_t configureCategory(category_t category,
+ severity_t severity=severity::NONE);
+ CatToSeverityMap getCategories();
+
+ void trace(const UTF8String& sMsg, const category_t& category,
+ severity_t severity) const;
+ void logDebug(const UTF8String& msg,
+ const category_t& category=category::APP) const;
+ void logInfo(const UTF8String& msg,
+ const category_t& category=category::APP) const;
+ void logWarning(const UTF8String& msg,
+ const category_t& category=category::APP) const;
+ void logError(const UTF8String& msg,
+ const category_t& category=category::APP) const;
+ void logCritical(const UTF8String& msg,
+ const category_t& category=category::APP) const;
+ void log(const UTF8String& msg, const category_t& category=category::APP,
+ severity_t severity=severity::INFO) const;
+
+ inline bool shouldLog(const category_t& category, severity_t severity) const {
+ lock_guard lock(m_CategoryMutex);
+ try {
+ severity_t targetSeverity = m_CategorySeverities.at(category);
+ return (targetSeverity <= severity);
+ } catch (out_of_range e){
+ string msg("Unknown category: " + category);
+ throw Exception(AVG_ERR_INVALID_ARGS, msg);
+ }
+ }
+
+private:
+ Logger();
+ void setupCategory();
+
+ std::vector<LogSinkPtr> m_pSinks;
+ LogSinkPtr m_pStdSink;
+ CatToSeverityMap m_CategorySeverities;
+ severity_t m_Severity;
+ static boost::mutex m_CategoryMutex;
+};
+
+#define AVG_TRACE(category, severity, sMsg) { \
+if (Logger::get()->shouldLog(category, severity)) { \
+ std::stringstream tmp(std::stringstream::in | std::stringstream::out); \
+ tmp << sMsg; \
+ Logger::get()->trace(tmp.str(), category, severity); \
+ }\
+}\
+
+#define AVG_LOG_ERROR(sMsg){ \
+ AVG_TRACE(Logger::category::NONE, Logger::severity::ERROR, sMsg); \
+}\
+
+#define AVG_LOG_WARNING(sMsg){ \
+ AVG_TRACE(Logger::category::NONE, Logger::severity::WARNING, sMsg); \
+}\
+
+#define AVG_LOG_INFO(sMsg){ \
+ AVG_TRACE(Logger::category::NONE, Logger::severity::INFO, sMsg); \
+}\
+
+#define AVG_LOG_DEBUG(sMsg){ \
+ AVG_TRACE(Logger::category::NONE, Logger::severity::DEBUG, sMsg); \
+}\
+
+}
+#endif