2
0

DefaultLogger.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include "DefaultLogger.h"
  2. #include "aiAssert.h"
  3. #include "DefaultIOSystem.h"
  4. #include "Win32DebugLogStream.h"
  5. #include "IOStream.h"
  6. #include "FileLogStream.h"
  7. #include <iostream>
  8. namespace Assimp
  9. {
  10. // ---------------------------------------------------------------------------
  11. DefaultLogger *DefaultLogger::m_pLogger = NULL;
  12. // ---------------------------------------------------------------------------
  13. //
  14. struct LogStreamInfo
  15. {
  16. unsigned int m_uiErrorSeverity;
  17. LogStream *m_pStream;
  18. // Constructor
  19. LogStreamInfo( unsigned int uiErrorSev, LogStream *pStream ) :
  20. m_uiErrorSeverity( uiErrorSev ),
  21. m_pStream( pStream )
  22. {
  23. // empty
  24. }
  25. };
  26. // ---------------------------------------------------------------------------
  27. // Creates the only singleton instance
  28. Logger *DefaultLogger::create(const std::string &name, LogSeverity severity)
  29. {
  30. ai_assert (NULL == m_pLogger);
  31. m_pLogger = new DefaultLogger( name, severity );
  32. return m_pLogger;
  33. }
  34. // ---------------------------------------------------------------------------
  35. // Singleton getter
  36. Logger *DefaultLogger::get()
  37. {
  38. ai_assert (NULL != m_pLogger);
  39. return m_pLogger;
  40. }
  41. // ---------------------------------------------------------------------------
  42. // Kills the only instance
  43. void DefaultLogger::kill()
  44. {
  45. ai_assert (NULL != m_pLogger);
  46. delete m_pLogger;
  47. m_pLogger = NULL;
  48. }
  49. // ---------------------------------------------------------------------------
  50. // Debug message
  51. void DefaultLogger::debug(const std::string &message)
  52. {
  53. if ( m_Severity == Logger::NORMAL )
  54. return;
  55. const std::string msg( "Debug: " + message );
  56. writeToStreams( msg, Logger::DEBUGGING );
  57. }
  58. // ---------------------------------------------------------------------------
  59. // Logs an info
  60. void DefaultLogger::info(const std::string &message)
  61. {
  62. const std::string msg( "Info: " + message );
  63. writeToStreams( msg , Logger::INFO );
  64. }
  65. // ---------------------------------------------------------------------------
  66. // Logs a warning
  67. void DefaultLogger::warn( const std::string &message )
  68. {
  69. const std::string msg( "Warn: " + message );
  70. writeToStreams( msg, Logger::WARN );
  71. }
  72. // ---------------------------------------------------------------------------
  73. // Logs an error
  74. void DefaultLogger::error( const std::string &message )
  75. {
  76. const std::string msg( "Error: " + message );
  77. writeToStreams( msg, Logger::ERR );
  78. }
  79. // ---------------------------------------------------------------------------
  80. // Severity setter
  81. void DefaultLogger::setLogSeverity( LogSeverity log_severity )
  82. {
  83. m_Severity = log_severity;
  84. }
  85. // ---------------------------------------------------------------------------
  86. // Attachs a new stream
  87. void DefaultLogger::attachStream( LogStream *pStream, unsigned int severity )
  88. {
  89. ai_assert ( NULL != pStream );
  90. LogStreamInfo *pInfo = new LogStreamInfo( severity, pStream );
  91. m_StreamArray.push_back( pInfo );
  92. }
  93. // ---------------------------------------------------------------------------
  94. // Detatch a stream
  95. void DefaultLogger::detatchStream( LogStream *pStream, unsigned int severity )
  96. {
  97. ai_assert ( NULL != pStream );
  98. for ( StreamIt it = m_StreamArray.begin();
  99. it != m_StreamArray.end();
  100. ++it )
  101. {
  102. if ( (*it)->m_pStream == pStream )
  103. {
  104. unsigned int uiSev = (*it)->m_uiErrorSeverity;
  105. if ( severity & Logger::INFO )
  106. uiSev &= ( ~Logger::INFO );
  107. if ( severity & Logger::WARN )
  108. uiSev &= ( ~Logger::WARN );
  109. if ( severity & Logger::ERR )
  110. uiSev &= ( ~Logger::ERR );
  111. (*it)->m_uiErrorSeverity = uiSev;
  112. if ( (*it)->m_uiErrorSeverity == 0 )
  113. {
  114. it = m_StreamArray.erase( it );
  115. break;
  116. }
  117. }
  118. }
  119. }
  120. // ---------------------------------------------------------------------------
  121. // Constructor
  122. DefaultLogger::DefaultLogger( const std::string &name, LogSeverity severity ) :
  123. m_Severity( severity )
  124. {
  125. if (name.empty())
  126. return;
  127. m_Streams.push_back( new FileLogStream( name ) );
  128. m_Streams.push_back( new Win32DebugLogStream() );
  129. }
  130. // ---------------------------------------------------------------------------
  131. // Destructor
  132. DefaultLogger::~DefaultLogger()
  133. {
  134. for ( StreamIt it = m_StreamArray.begin();
  135. it != m_StreamArray.end();
  136. ++it )
  137. {
  138. delete *it;
  139. }
  140. for (std::vector<LogStream*>::iterator it = m_Streams.begin();
  141. it != m_Streams.end();
  142. ++it)
  143. {
  144. delete *it;
  145. }
  146. m_Streams.clear();
  147. }
  148. // ---------------------------------------------------------------------------
  149. // Writes message to stream
  150. void DefaultLogger::writeToStreams(const std::string &message,
  151. ErrorSeverity ErrorSev )
  152. {
  153. if ( message.empty() )
  154. return;
  155. for ( ConstStreamIt it = this->m_StreamArray.begin();
  156. it != m_StreamArray.end();
  157. ++it)
  158. {
  159. if ( ErrorSev & (*it)->m_uiErrorSeverity )
  160. {
  161. (*it)->m_pStream->write( message );
  162. }
  163. }
  164. for (std::vector<LogStream*>::iterator it = m_Streams.begin();
  165. it != m_Streams.end();
  166. ++it)
  167. {
  168. (*it)->write( message + std::string("\n"));
  169. }
  170. }
  171. // ---------------------------------------------------------------------------
  172. } // Namespace Assimp