00001
00015 #pragma once
00016
00017 #include "GenericLogPrinter.h"
00018 #include "LogContentsPrinter.h"
00019 #include "Loggable.h"
00020 #include "CompositeLoggable.h"
00021 #include "LogInfo.h"
00022 #include "RegistryKey.h"
00023
00024 #include "TStd.h"
00025 #include "TBoostFormat.h"
00026
00027 #include <boost/utility.hpp>
00028
00029 namespace Nvidia {
00030 namespace Logging {
00031
00032 namespace Test {
00033 class LoggerTest;
00034 class LoggerConstructorTest;
00035 }
00036
00041 class SimpleContentsPrinter : public LogContentsPrinter, private boost::noncopyable
00042 {
00043 private:
00044 std::tostringstream& m_stream;
00045 public:
00046 SimpleContentsPrinter(std::tostringstream& stream);
00047 void LogContentInternal(const std::tstring& name, const SimpleLoggable& loggable);
00048 void LogContentInternal(const std::tstring& name, const CompositeLoggable& loggable);
00049 };
00050
00057 class FirstLevelContentsPrinter : public LogContentsPrinter, private boost::noncopyable
00058 {
00059 private:
00060 std::tostringstream& m_stream;
00061 SimpleContentsPrinter m_simpleContentsPrinter;
00062 public:
00063 FirstLevelContentsPrinter(std::tostringstream& stream);
00064 void LogContentInternal(const std::tstring& name, const SimpleLoggable& loggable);
00065 void LogContentInternal(const std::tstring& name, const CompositeLoggable& loggable);
00066 };
00067
00079 class SimpleTextLogPrinter : public GenericLogPrinter<std::tstring>
00080 {
00081 friend class Nvidia::Logging::Test::LoggerTest;
00082 friend class Nvidia::Logging::Test::LoggerConstructorTest;
00083
00084 private:
00085 boost::tformat m_formatter;
00086 std::tostringstream m_stream;
00087 FirstLevelContentsPrinter m_firstLevelContentsPrinter;
00088
00089 public:
00091 SimpleTextLogPrinter();
00092
00098 SimpleTextLogPrinter(const RegistryKey& key);
00099
00100 private:
00106 std::tstring DoFormatMessage(const LogInfo& logInfo, const CompositeLoggable& message);
00107 };
00108
00109 inline SimpleContentsPrinter::SimpleContentsPrinter(std::tostringstream& stream) :
00110 m_stream(stream) {}
00111
00112 inline void SimpleContentsPrinter::LogContentInternal(const std::tstring& name, const SimpleLoggable& loggable)
00113 {
00114 if ( name.length() > 0 )
00115 m_stream << name << _T("=");
00116
00117 m_stream << _T("\"") << loggable.GetStringValue() << _T("\" ") ;
00118 }
00119
00120 inline void SimpleContentsPrinter::LogContentInternal(const std::tstring& name, const CompositeLoggable& loggable)
00121 {
00122 if ( name.length() > 0 )
00123 m_stream << name << _T("=");
00124
00125 m_stream << loggable.GetHumanReadableTypeName() << _T("( ") ;
00126
00127 loggable.LogContentsOn(*this);
00128 m_stream << _T(") ");
00129 }
00130
00131 inline FirstLevelContentsPrinter::FirstLevelContentsPrinter(std::tostringstream& stream) :
00132 m_stream(stream),
00133 m_simpleContentsPrinter(stream) {}
00134
00135 inline void FirstLevelContentsPrinter::LogContentInternal(const std::tstring&, const SimpleLoggable&)
00136 {
00137 return;
00138 }
00139
00140 inline void FirstLevelContentsPrinter::LogContentInternal(const std::tstring&, const CompositeLoggable& loggable)
00141 {
00142 m_stream << loggable.GetHumanReadableTypeName() << _T("( ") ;
00143 loggable.LogContentsOn(m_simpleContentsPrinter);
00144 m_stream << _T(") ");
00145 }
00146
00147 inline SimpleTextLogPrinter::SimpleTextLogPrinter() :
00148 m_stream(),
00149 m_formatter(_T("%11.3lf | %8x: [%x] %d@%x : %x. ")),
00150 m_firstLevelContentsPrinter(m_stream) {}
00151
00152 inline SimpleTextLogPrinter::SimpleTextLogPrinter(const RegistryKey&) :
00153 m_stream(),
00154 m_formatter(_T("%11.3lf | %8x: [%x] %d@%x : %x. ")),
00155 m_firstLevelContentsPrinter(m_stream) {}
00156
00157 inline std::tstring SimpleTextLogPrinter::DoFormatMessage(const LogInfo& logInfo, const CompositeLoggable& message)
00158 {
00159 m_formatter % (((double) logInfo.GetRelativeTimestamp()) / 1000);
00160 m_formatter % Utils::CapitalizeString(boost::lexical_cast<std::tstring>(logInfo.GetLevel()));
00161 m_formatter % logInfo.GetScopeLoggerName();
00162 m_formatter % logInfo.GetLineNumber();
00163 m_formatter % logInfo.GetFunctionName();
00164 m_formatter % message.GetStringValue();
00165
00166 m_stream.str(_T(""));
00167 m_stream << m_formatter;
00168 message.LogContentsOn(m_firstLevelContentsPrinter);
00169 return m_stream.str();
00170 }
00171
00172 }
00173 }