From 96ea41502aef0558f7d6c3db625519c3e1944206 Mon Sep 17 00:00:00 2001 From: kimmi Date: Thu, 8 May 2008 20:02:51 +0000 Subject: [PATCH] FEATURE: Add default logger with file- and win32 debuglogging git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@3 67173fc5-114c-0410-ac8e-9d2fd5bffc1f --- code/DefaultLogger.cpp | 199 +++++++++++++++++++++++++++++++++++ code/DefaultLogger.h | 85 +++++++++++++++ code/FileLogStream.h | 66 ++++++++++++ code/ObjFileImporter.cpp | 8 +- code/Win32DebugLogStream.h | 59 +++++++++++ include/LogStream.h | 2 + workspaces/vc8/assimp.vcproj | 36 +++++++ 7 files changed, 453 insertions(+), 2 deletions(-) create mode 100644 code/DefaultLogger.cpp create mode 100644 code/DefaultLogger.h create mode 100644 code/FileLogStream.h create mode 100644 code/Win32DebugLogStream.h diff --git a/code/DefaultLogger.cpp b/code/DefaultLogger.cpp new file mode 100644 index 000000000..725dd4ad3 --- /dev/null +++ b/code/DefaultLogger.cpp @@ -0,0 +1,199 @@ +#include "DefaultLogger.h" +#include "aiAssert.h" +#include "DefaultIOSystem.h" +#include "Win32DebugLogStream.h" +#include "IOStream.h" +#include "FileLogStream.h" + +#include + +namespace Assimp +{ +// --------------------------------------------------------------------------- +DefaultLogger *DefaultLogger::m_pLogger = NULL; + +// --------------------------------------------------------------------------- +// +struct LogStreamInfo +{ + unsigned int m_uiErrorSeverity; + LogStream *m_pStream; + + // Constructor + LogStreamInfo( unsigned int uiErrorSev, LogStream *pStream ) : + m_uiErrorSeverity( uiErrorSev ), + m_pStream( pStream ) + { + // empty + } +}; +// --------------------------------------------------------------------------- +// Creates the only singleton instance +Logger *DefaultLogger::create(const std::string &name, LogSeverity severity) +{ + ai_assert (NULL == m_pLogger); + m_pLogger = new DefaultLogger( name, severity ); + + return m_pLogger; +} + +// --------------------------------------------------------------------------- +// Singleton getter +Logger *DefaultLogger::get() +{ + ai_assert (NULL != m_pLogger); + return m_pLogger; +} + +// --------------------------------------------------------------------------- +// Kills the only instance +void DefaultLogger::kill() +{ + ai_assert (NULL != m_pLogger); + delete m_pLogger; + m_pLogger = NULL; +} + +// --------------------------------------------------------------------------- +// Debug message +void DefaultLogger::debug(const std::string &message) +{ + if ( m_Severity == Logger::NORMAL ) + return; + + const std::string msg( "Debug: " + message ); + writeToStreams( msg, Logger::DEBUGGING ); +} + +// --------------------------------------------------------------------------- +// Logs an info +void DefaultLogger::info(const std::string &message) +{ + const std::string msg( "Info: " + message ); + writeToStreams( msg , Logger::INFO ); +} + +// --------------------------------------------------------------------------- +// Logs a warning +void DefaultLogger::warn( const std::string &message ) +{ + const std::string msg( "Warn: " + message ); + writeToStreams( msg, Logger::WARN ); +} + +// --------------------------------------------------------------------------- +// Logs an error +void DefaultLogger::error( const std::string &message ) +{ + const std::string msg( "Error: " + message ); + writeToStreams( msg, Logger::ERR ); +} + +// --------------------------------------------------------------------------- +// Severity setter +void DefaultLogger::setLogSeverity( LogSeverity log_severity ) +{ + m_Severity = log_severity; +} + +// --------------------------------------------------------------------------- +// Attachs a new stream +void DefaultLogger::attachStream( LogStream *pStream, unsigned int severity ) +{ + ai_assert ( NULL != pStream ); + + LogStreamInfo *pInfo = new LogStreamInfo( severity, pStream ); + m_StreamArray.push_back( pInfo ); +} + +// --------------------------------------------------------------------------- +// Detatch a stream +void DefaultLogger::detatchStream( LogStream *pStream, unsigned int severity ) +{ + ai_assert ( NULL != pStream ); + + for ( StreamIt it = m_StreamArray.begin(); + it != m_StreamArray.end(); + ++it ) + { + if ( (*it)->m_pStream == pStream ) + { + unsigned int uiSev = (*it)->m_uiErrorSeverity; + if ( severity & Logger::INFO ) + uiSev &= ( ~Logger::INFO ); + if ( severity & Logger::WARN ) + uiSev &= ( ~Logger::WARN ); + if ( severity & Logger::ERR ) + uiSev &= ( ~Logger::ERR ); + + (*it)->m_uiErrorSeverity = uiSev; + + if ( (*it)->m_uiErrorSeverity == 0 ) + { + it = m_StreamArray.erase( it ); + break; + } + } + } +} + +// --------------------------------------------------------------------------- +// Constructor +DefaultLogger::DefaultLogger( const std::string &name, LogSeverity severity ) : + m_Severity( severity ) +{ + if (name.empty()) + return; + + m_Streams.push_back( new FileLogStream( name ) ); + m_Streams.push_back( new Win32DebugLogStream() ); +} + +// --------------------------------------------------------------------------- +// Destructor +DefaultLogger::~DefaultLogger() +{ + for ( StreamIt it = m_StreamArray.begin(); + it != m_StreamArray.end(); + ++it ) + { + delete *it; + } + + for (std::vector::iterator it = m_Streams.begin(); + it != m_Streams.end(); + ++it) + { + delete *it; + } + m_Streams.clear(); +} + +// --------------------------------------------------------------------------- +// Writes message to stream +void DefaultLogger::writeToStreams(const std::string &message, + ErrorSeverity ErrorSev ) +{ + if ( message.empty() ) + return; + + for ( ConstStreamIt it = this->m_StreamArray.begin(); + it != m_StreamArray.end(); + ++it) + { + if ( ErrorSev & (*it)->m_uiErrorSeverity ) + { + (*it)->m_pStream->write( message ); + } + } + for (std::vector::iterator it = m_Streams.begin(); + it != m_Streams.end(); + ++it) + { + (*it)->write( message + std::string("\n")); + } +} + +// --------------------------------------------------------------------------- + +} // Namespace Assimp diff --git a/code/DefaultLogger.h b/code/DefaultLogger.h new file mode 100644 index 000000000..c88a3bbe5 --- /dev/null +++ b/code/DefaultLogger.h @@ -0,0 +1,85 @@ +#include "Logger.h" +#include + +namespace Assimp +{ +// --------------------------------------------------------------------------- +class IOStream; +struct LogStreamInfo; + +// --------------------------------------------------------------------------- +/** @class DefaultLogger + * @brief Default logging implementation. The logger writes into a file. + * The name can be set by creating the logger. If no filename was specified + * the logger will use the standard out and error streams. + */ +class DefaultLogger : + public Logger +{ +public: + /** @brief Creates the only logging instance + * @param name Name for logfile + * @param severity Log severity, VERBOSE will activate debug messages + */ + static Logger *create(const std::string &name, LogSeverity severity); + + /** @brief Getter for singleton instance + * @return Only instance + */ + static Logger *get(); + + /** @brief Will kill the singleton instance */ + static void kill(); + + /** @brief Logs debug infos, only been written when severity level VERBOSE is set */ + void debug(const std::string &message); + + /** @brief Logs an info message */ + void info(const std::string &message); + + /** @brief Logs a warning message */ + void warn(const std::string &message); + + /** @brief Logs an error message */ + void error(const std::string &message); + + /** @drief Severity setter */ + void setLogSeverity(LogSeverity log_severity); + + /** @brief Detach a still attached stream from logger */ + void attachStream(LogStream *pStream, unsigned int severity); + + /** @brief Detach a still attached stream from logger */ + void detatchStream(LogStream *pStream, unsigned int severity); + +private: + /** @brief Constructor + * @param name Name for logfile, keep this empty to use std::cout and std::cerr + * @param severity Severity of logger + */ + DefaultLogger(const std::string &name, LogSeverity severity); + + /** @brief Destructor */ + ~DefaultLogger(); + + /** @brief Writes message into a file */ + void writeToStreams(const std::string &message, ErrorSeverity ErrorSev ); + +private: + // Aliases for stream container + typedef std::vector StreamArray; + typedef std::vector::iterator StreamIt; + typedef std::vector::const_iterator ConstStreamIt; + + //! only logging instance + static DefaultLogger *m_pLogger; + //! Logger severity + LogSeverity m_Severity; + //! Attached streams + StreamArray m_StreamArray; + //! Array with default streams + std::vector m_Streams; +}; +// --------------------------------------------------------------------------- + +} // Namespace Assimp diff --git a/code/FileLogStream.h b/code/FileLogStream.h new file mode 100644 index 000000000..c95bbd30a --- /dev/null +++ b/code/FileLogStream.h @@ -0,0 +1,66 @@ +#ifndef ASSIMP_FILELOGSTREAM_H_INC +#define ASSIMP_FILELOGSTREAM_H_INC + +#include "LogStream.h" +#include "IOStream.h" + +namespace Assimp +{ + +// --------------------------------------------------------------------------- +/** @class FileLogStream + * @brief Logstream to write into a file. + */ +class FileLogStream : + public LogStream +{ +public: + FileLogStream( const std::string &strFileName ); + ~FileLogStream(); + void write( const std::string &message ); + +private: + IOStream *m_pStream; +}; +// --------------------------------------------------------------------------- +// Constructor +inline FileLogStream::FileLogStream( const std::string &strFileName ) : + m_pStream(NULL) +{ + if ( strFileName.empty() ) + return; + + DefaultIOSystem FileSystem; + const std::string mode = "w"; + m_pStream = FileSystem.Open( strFileName, mode ); +} + +// --------------------------------------------------------------------------- +// Destructor +inline FileLogStream::~FileLogStream() +{ + if (NULL != m_pStream) + { + DefaultIOSystem FileSystem; + FileSystem.Close( m_pStream ); + } +} + +// --------------------------------------------------------------------------- +// Write method +inline void FileLogStream::write( const std::string &message ) +{ + if (m_pStream != NULL) + { + size_t size = m_pStream->Write(message.c_str(), sizeof(char), + message.size()); + int i=0; + i++; + } +} + +// --------------------------------------------------------------------------- + +} // Namespace Assimp + +#endif diff --git a/code/ObjFileImporter.cpp b/code/ObjFileImporter.cpp index 4dc2cafa2..a263b383b 100644 --- a/code/ObjFileImporter.cpp +++ b/code/ObjFileImporter.cpp @@ -7,7 +7,7 @@ #include "../include/aiScene.h" #include "aiAssert.h" #include "MaterialSystem.h" - +#include "DefaultLogger.h" #include #include @@ -26,7 +26,8 @@ ObjFileImporter::ObjFileImporter() : m_pRootObject(NULL), m_strAbsPath("\\") { - // empty + DefaultLogger::create( "test.log", DefaultLogger::VERBOSE ); + DefaultLogger::get()->info("Start logging"); } // ------------------------------------------------------------------------------------------------ @@ -39,6 +40,8 @@ ObjFileImporter::~ObjFileImporter() delete m_pRootObject; m_pRootObject = NULL; } + + DefaultLogger::kill(); } // ------------------------------------------------------------------------------------------------ @@ -48,6 +51,7 @@ bool ObjFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) c if (pFile.empty()) return false; + DefaultLogger::get()->info("ObjFileImporter::CanRead"); string::size_type pos = pFile.find_last_of("."); if (string::npos == pos) return false; diff --git a/code/Win32DebugLogStream.h b/code/Win32DebugLogStream.h new file mode 100644 index 000000000..66b22f4ee --- /dev/null +++ b/code/Win32DebugLogStream.h @@ -0,0 +1,59 @@ +#ifndef AI_WIN32DEBUGLOGSTREAM_H_INC +#define AI_WIN32DEBUGLOGSTREAM_H_INC + +#include "LogStream.h" + +#ifdef _MSC_VER +#include "Windows.h" +#endif + +namespace Assimp +{ +#ifdef _MSC_VER + +// --------------------------------------------------------------------------- +/** @class Win32DebugLogStream + * @brief Logs into the debug stream from win32. + */ +class Win32DebugLogStream : + public LogStream +{ +public: + /** @brief Default constructor */ + Win32DebugLogStream(); + + /** @brief Destructor */ + ~Win32DebugLogStream(); + + /** @brief Writer */ + void write(const std::string &messgae); +}; + +// --------------------------------------------------------------------------- +// Default constructor +inline Win32DebugLogStream::Win32DebugLogStream() +{ + // empty +} + +// --------------------------------------------------------------------------- +// Default constructor +inline Win32DebugLogStream::~Win32DebugLogStream() +{ + // empty +} + +// --------------------------------------------------------------------------- +// Write method +inline void Win32DebugLogStream::write(const std::string &message) +{ + OutputDebugString( message.c_str() ); +} + +// --------------------------------------------------------------------------- + +#endif + +} // Namespace Assimp + +#endif diff --git a/include/LogStream.h b/include/LogStream.h index f28585b9f..f87dfe84e 100644 --- a/include/LogStream.h +++ b/include/LogStream.h @@ -1,6 +1,8 @@ #ifndef AI_LOGSTREAM_H_INC #define AI_LOGSTREAM_H_INC +#include + namespace Assimp { // --------------------------------------------------------------------------- diff --git a/workspaces/vc8/assimp.vcproj b/workspaces/vc8/assimp.vcproj index 37d685fc1..4ed16778b 100644 --- a/workspaces/vc8/assimp.vcproj +++ b/workspaces/vc8/assimp.vcproj @@ -235,6 +235,18 @@ + + + + + + + + + + + + + + + + + +