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: /** @file DefaultLogger.hpp nuclear@0: */ nuclear@0: nuclear@0: #ifndef INCLUDED_AI_DEFAULTLOGGER nuclear@0: #define INCLUDED_AI_DEFAULTLOGGER nuclear@0: nuclear@0: #include "Logger.hpp" nuclear@0: #include "LogStream.hpp" nuclear@0: #include "NullLogger.hpp" nuclear@0: #include nuclear@0: nuclear@0: namespace Assimp { nuclear@0: // ------------------------------------------------------------------------------------ nuclear@0: class IOStream; nuclear@0: struct LogStreamInfo; nuclear@0: nuclear@0: /** default name of logfile */ nuclear@0: #define ASSIMP_DEFAULT_LOG_NAME "AssimpLog.txt" nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------ nuclear@0: /** @brief CPP-API: Primary logging facility of Assimp. nuclear@0: * nuclear@0: * The library stores its primary #Logger as a static member of this class. nuclear@0: * #get() returns this primary logger. By default the underlying implementation is nuclear@0: * just a #NullLogger which rejects all log messages. By calling #create(), logging nuclear@0: * is turned on. To capture the log output multiple log streams (#LogStream) can be nuclear@0: * attach to the logger. Some default streams for common streaming locations (such as nuclear@0: * a file, std::cout, OutputDebugString()) are also provided. nuclear@0: * nuclear@0: * If you wish to customize the logging at an even deeper level supply your own nuclear@0: * implementation of #Logger to #set(). nuclear@0: * @note The whole logging stuff causes a small extra overhead for all imports. */ nuclear@0: class ASSIMP_API DefaultLogger : nuclear@0: public Logger { nuclear@0: nuclear@0: public: nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Creates a logging instance. nuclear@0: * @param name Name for log file. Only valid in combination nuclear@0: * with the aiDefaultLogStream_FILE flag. nuclear@0: * @param severity Log severity, VERBOSE turns on debug messages nuclear@0: * @param defStreams Default log streams to be attached. Any bitwise nuclear@0: * combination of the aiDefaultLogStream enumerated values. nuclear@0: * If #aiDefaultLogStream_FILE is specified but an empty string is nuclear@0: * passed for 'name', no log file is created at all. nuclear@0: * @param io IOSystem to be used to open external files (such as the nuclear@0: * log file). Pass NULL to rely on the default implementation. nuclear@0: * This replaces the default #NullLogger with a #DefaultLogger instance. */ nuclear@0: static Logger *create(const char* name = ASSIMP_DEFAULT_LOG_NAME, nuclear@0: LogSeverity severity = NORMAL, nuclear@0: unsigned int defStreams = aiDefaultLogStream_DEBUGGER | aiDefaultLogStream_FILE, nuclear@0: IOSystem* io = NULL); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Setup a custom #Logger implementation. nuclear@0: * nuclear@0: * Use this if the provided #DefaultLogger class doesn't fit into nuclear@0: * your needs. If the provided message formatting is OK for you, nuclear@0: * it's much easier to use #create() and to attach your own custom nuclear@0: * output streams to it. nuclear@0: * @param logger Pass NULL to setup a default NullLogger*/ nuclear@0: static void set (Logger *logger); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Getter for singleton instance nuclear@0: * @return Only instance. This is never null, but it could be a nuclear@0: * NullLogger. Use isNullLogger to check this.*/ nuclear@0: static Logger *get(); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Return whether a #NullLogger is currently active nuclear@0: * @return true if the current logger is a #NullLogger. nuclear@0: * Use create() or set() to setup a logger that does actually do nuclear@0: * something else than just rejecting all log messages. */ nuclear@0: static bool isNullLogger(); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Kills the current singleton logger and replaces it with a nuclear@0: * #NullLogger instance. */ nuclear@0: static void kill(); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @copydoc Logger::attachStream */ nuclear@0: bool attachStream(LogStream *pStream, nuclear@0: unsigned int severity); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @copydoc Logger::detatchStream */ nuclear@0: bool detatchStream(LogStream *pStream, nuclear@0: unsigned int severity); nuclear@0: nuclear@0: private: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @briefPrivate construction for internal use by create(). nuclear@0: * @param severity Logging granularity */ nuclear@0: explicit DefaultLogger(LogSeverity severity); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @briefDestructor */ nuclear@0: ~DefaultLogger(); nuclear@0: nuclear@0: /** @brief Logs debug infos, only been written when severity level VERBOSE is set */ nuclear@0: void OnDebug(const char* message); nuclear@0: nuclear@0: /** @brief Logs an info message */ nuclear@0: void OnInfo(const char* message); nuclear@0: nuclear@0: /** @brief Logs a warning message */ nuclear@0: void OnWarn(const char* message); nuclear@0: nuclear@0: /** @brief Logs an error message */ nuclear@0: void OnError(const char* message); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Writes a message to all streams */ nuclear@0: void WriteToStreams(const char* message, ErrorSeverity ErrorSev ); nuclear@0: nuclear@0: // ---------------------------------------------------------------------- nuclear@0: /** @brief Returns the thread id. nuclear@0: * @note This is an OS specific feature, if not supported, a nuclear@0: * zero will be returned. nuclear@0: */ nuclear@0: unsigned int GetThreadID(); nuclear@0: nuclear@0: private: nuclear@0: // Aliases for stream container nuclear@0: typedef std::vector StreamArray; nuclear@0: typedef std::vector::iterator StreamIt; nuclear@0: typedef std::vector::const_iterator ConstStreamIt; nuclear@0: nuclear@0: //! only logging instance nuclear@0: static Logger *m_pLogger; nuclear@0: static NullLogger s_pNullLogger; nuclear@0: nuclear@0: //! Attached streams nuclear@0: StreamArray m_StreamArray; nuclear@0: nuclear@0: bool noRepeatMsg; nuclear@0: char lastMsg[MAX_LOG_MESSAGE_LENGTH*2]; nuclear@0: size_t lastLen; nuclear@0: }; nuclear@0: // ------------------------------------------------------------------------------------ nuclear@0: nuclear@0: } // Namespace Assimp nuclear@0: nuclear@0: #endif // !! INCLUDED_AI_DEFAULTLOGGER