nuclear@0: /* nuclear@0: Open Asset Import Library (assimp) nuclear@0: ---------------------------------------------------------------------- nuclear@0: nuclear@0: Copyright (c) 2006-2018, assimp team nuclear@0: nuclear@0: nuclear@0: All rights reserved. nuclear@0: nuclear@0: Redistribution and use of this software in source and binary forms, nuclear@0: with or without modification, are permitted provided that the nuclear@0: following conditions are met: nuclear@0: nuclear@0: * Redistributions of source code must retain the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer. nuclear@0: nuclear@0: * Redistributions in binary form must reproduce the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer in the documentation and/or other nuclear@0: materials provided with the distribution. nuclear@0: nuclear@0: * Neither the name of the assimp team, nor the names of its nuclear@0: contributors may be used to endorse or promote products nuclear@0: derived from this software without specific prior nuclear@0: written permission of the assimp team. nuclear@0: nuclear@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS nuclear@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT nuclear@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR nuclear@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT nuclear@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, nuclear@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT nuclear@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, nuclear@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY nuclear@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT nuclear@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE nuclear@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nuclear@0: nuclear@0: ---------------------------------------------------------------------- nuclear@0: */ nuclear@0: nuclear@0: /** @file Logger.hpp nuclear@0: * @brief Abstract base class 'Logger', base of the logging system. nuclear@0: */ nuclear@0: #ifndef INCLUDED_AI_LOGGER_H nuclear@0: #define INCLUDED_AI_LOGGER_H nuclear@0: nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: namespace Assimp { nuclear@0: nuclear@0: class LogStream; nuclear@0: nuclear@0: // Maximum length of a log message. Longer messages are rejected. nuclear@0: #define MAX_LOG_MESSAGE_LENGTH 1024u nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: /** @brief CPP-API: Abstract interface for logger implementations. nuclear@0: * Assimp provides a default implementation and uses it for almost all nuclear@0: * logging stuff ('DefaultLogger'). This class defines just basic logging nuclear@0: * behavior and is not of interest for you. Instead, take a look at #DefaultLogger. */ nuclear@0: class ASSIMP_API Logger nuclear@0: #ifndef SWIG nuclear@0: : public Intern::AllocateFromAssimpHeap nuclear@0: #endif nuclear@0: { nuclear@0: public: nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @enum LogSeverity nuclear@0: * @brief Log severity to describe the granularity of logging. nuclear@0: */ nuclear@0: enum LogSeverity { nuclear@0: NORMAL, //!< Normal granularity of logging nuclear@0: VERBOSE //!< Debug infos will be logged, too nuclear@0: }; nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @enum ErrorSeverity nuclear@0: * @brief Description for severity of a log message. nuclear@0: * nuclear@0: * Every LogStream has a bitwise combination of these flags. nuclear@0: * A LogStream doesn't receive any messages of a specific type nuclear@0: * if it doesn't specify the corresponding ErrorSeverity flag. nuclear@0: */ nuclear@0: enum ErrorSeverity { nuclear@0: Debugging = 1, //!< Debug log message nuclear@0: Info = 2, //!< Info log message nuclear@0: Warn = 4, //!< Warn log message nuclear@0: Err = 8 //!< Error log message nuclear@0: }; nuclear@0: nuclear@0: public: nuclear@0: nuclear@0: /** @brief Virtual destructor */ nuclear@0: virtual ~Logger(); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Writes a debug message nuclear@0: * @param message Debug message*/ nuclear@0: void debug(const char* message); nuclear@0: void debug(const std::string &message); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Writes a info message nuclear@0: * @param message Info message*/ nuclear@0: void info(const char* message); nuclear@0: void info(const std::string &message); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Writes a warning message nuclear@0: * @param message Warn message*/ nuclear@0: void warn(const char* message); nuclear@0: void warn(const std::string &message); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Writes an error message nuclear@0: * @param message Error message*/ nuclear@0: void error(const char* message); nuclear@0: void error(const std::string &message); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Set a new log severity. nuclear@0: * @param log_severity New severity for logging*/ nuclear@0: void setLogSeverity(LogSeverity log_severity); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Get the current log severity*/ nuclear@0: LogSeverity getLogSeverity() const; nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Attach a new log-stream nuclear@0: * nuclear@0: * The logger takes ownership of the stream and is responsible nuclear@0: * for its destruction (which is done using ::delete when the logger nuclear@0: * itself is destroyed). Call detachStream to detach a stream and to nuclear@0: * gain ownership of it again. nuclear@0: * @param pStream Log-stream to attach nuclear@0: * @param severity Message filter, specified which types of log nuclear@0: * messages are dispatched to the stream. Provide a bitwise nuclear@0: * combination of the ErrorSeverity flags. nuclear@0: * @return true if the stream has been attached, false otherwise.*/ nuclear@0: virtual bool attachStream(LogStream *pStream, nuclear@0: unsigned int severity = Debugging | Err | Warn | Info) = 0; nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Detach a still attached stream from the logger (or nuclear@0: * modify the filter flags bits) nuclear@0: * @param pStream Log-stream instance for detaching nuclear@0: * @param severity Provide a bitwise combination of the ErrorSeverity nuclear@0: * flags. This value is &~ed with the current flags of the stream, nuclear@0: * if the result is 0 the stream is detached from the Logger and nuclear@0: * the caller retakes the possession of the stream. nuclear@0: * @return true if the stream has been detached, false otherwise.*/ nuclear@0: virtual bool detatchStream(LogStream *pStream, nuclear@0: unsigned int severity = Debugging | Err | Warn | Info) = 0; nuclear@0: nuclear@0: protected: nuclear@0: /** nuclear@0: * Default constructor nuclear@0: */ nuclear@0: Logger() AI_NO_EXCEPT; nuclear@0: nuclear@0: /** nuclear@0: * Construction with a given log severity nuclear@0: */ nuclear@0: explicit Logger(LogSeverity severity); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** nuclear@0: * @brief Called as a request to write a specific debug message nuclear@0: * @param message Debug message. Never longer than nuclear@0: * MAX_LOG_MESSAGE_LENGTH characters (excluding the '0'). nuclear@0: * @note The message string is only valid until the scope of nuclear@0: * the function is left. nuclear@0: */ nuclear@0: virtual void OnDebug(const char* message)= 0; nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** nuclear@0: * @brief Called as a request to write a specific info message nuclear@0: * @param message Info message. Never longer than nuclear@0: * MAX_LOG_MESSAGE_LENGTH characters (ecxluding the '0'). nuclear@0: * @note The message string is only valid until the scope of nuclear@0: * the function is left. nuclear@0: */ nuclear@0: virtual void OnInfo(const char* message) = 0; nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** nuclear@0: * @brief Called as a request to write a specific warn message nuclear@0: * @param message Warn message. Never longer than nuclear@0: * MAX_LOG_MESSAGE_LENGTH characters (exluding the '0'). nuclear@0: * @note The message string is only valid until the scope of nuclear@0: * the function is left. nuclear@0: */ nuclear@0: virtual void OnWarn(const char* essage) = 0; nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** nuclear@0: * @brief Called as a request to write a specific error message nuclear@0: * @param message Error message. Never longer than nuclear@0: * MAX_LOG_MESSAGE_LENGTH characters (exluding the '0'). nuclear@0: * @note The message string is only valid until the scope of nuclear@0: * the function is left. nuclear@0: */ nuclear@0: virtual void OnError(const char* message) = 0; nuclear@0: nuclear@0: protected: nuclear@0: LogSeverity m_Severity; nuclear@0: }; nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: // Default constructor nuclear@0: inline nuclear@0: Logger::Logger() AI_NO_EXCEPT nuclear@0: : m_Severity(NORMAL) { nuclear@0: // empty nuclear@0: } nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: // Virtual destructor nuclear@0: inline nuclear@0: Logger::~Logger() { nuclear@0: // empty nuclear@0: } nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: // Construction with given logging severity nuclear@0: inline nuclear@0: Logger::Logger(LogSeverity severity) nuclear@0: : m_Severity(severity) { nuclear@0: // empty nuclear@0: } nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: // Log severity setter nuclear@0: inline nuclear@0: void Logger::setLogSeverity(LogSeverity log_severity){ nuclear@0: m_Severity = log_severity; nuclear@0: } nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: // Log severity getter nuclear@0: inline nuclear@0: Logger::LogSeverity Logger::getLogSeverity() const { nuclear@0: return m_Severity; nuclear@0: } nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: inline nuclear@0: void Logger::debug(const std::string &message) { nuclear@0: return debug(message.c_str()); nuclear@0: } nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: inline nuclear@0: void Logger::error(const std::string &message) { nuclear@0: return error(message.c_str()); nuclear@0: } nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: inline nuclear@0: void Logger::warn(const std::string &message) { nuclear@0: return warn(message.c_str()); nuclear@0: } nuclear@0: nuclear@0: // ---------------------------------------------------------------------------------- nuclear@0: inline nuclear@0: void Logger::info(const std::string &message) { nuclear@0: return info(message.c_str()); nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: #define ASSIMP_LOG_WARN_F(string,...)\ nuclear@0: DefaultLogger::get()->warn((Formatter::format(string),__VA_ARGS__)) nuclear@0: nuclear@0: #define ASSIMP_LOG_ERROR_F(string,...)\ nuclear@0: DefaultLogger::get()->error((Formatter::format(string),__VA_ARGS__)) nuclear@0: nuclear@0: #define ASSIMP_LOG_DEBUG_F(string,...)\ nuclear@0: DefaultLogger::get()->debug((Formatter::format(string),__VA_ARGS__)) nuclear@0: nuclear@0: #define ASSIMP_LOG_INFO_F(string,...)\ nuclear@0: DefaultLogger::get()->info((Formatter::format(string),__VA_ARGS__)) nuclear@0: nuclear@0: nuclear@0: #define ASSIMP_LOG_WARN(string)\ nuclear@0: DefaultLogger::get()->warn(string) nuclear@0: nuclear@0: #define ASSIMP_LOG_ERROR(string)\ nuclear@0: DefaultLogger::get()->error(string) nuclear@0: nuclear@0: #define ASSIMP_LOG_DEBUG(string)\ nuclear@0: DefaultLogger::get()->debug(string) nuclear@0: nuclear@0: #define ASSIMP_LOG_INFO(string)\ nuclear@0: DefaultLogger::get()->info(string) nuclear@0: nuclear@0: nuclear@0: } // Namespace Assimp nuclear@0: nuclear@0: #endif // !! INCLUDED_AI_LOGGER_H