Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchy2/src/util/OutputHandler.h @ 2343

Last change on this file since 2343 was 2343, checked in by rgrieder, 15 years ago

Fixed a segfault bug than occurred when producing debug output after the Shell has been destroyed. The reason was that the Shell provides an OutputBuffer itself, so when the Shell gets destroyed, it has to set the fallback buffer again to the OutputHandler.

  • Property svn:eol-style set to native
File size: 11.2 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file
31    @brief Definition of the OutputHandler class.
32
33    The OutputHandler acts like std::cout, but output isn't only shown in the console,
34    but also written to the logfile and the ingame shell.
35*/
36
37#ifndef _OutputHandler_H__
38#define _OutputHandler_H__
39
40#include "UtilPrereqs.h"
41
42#include <iostream>
43#include <fstream>
44#include <string>
45
46#include "OutputBuffer.h"
47
48namespace orxonox
49{
50    //! The OutputHandler acts like std::cout, but redirects output to the console, the logfile and the ingame shell.
51    class _UtilExport OutputHandler
52    {
53        public:
54            enum OutputDevice
55            {
56                LD_All = 0,
57                LD_Console = 1,
58                LD_Logfile = 2,
59                LD_Shell = 3
60            };
61
62            static OutputHandler& getOutStream();
63
64            /** @brief Puts some text on the outstream. @param text The text */
65            static inline std::string log(const std::string& text)
66                { OutputHandler::getOutStream().setOutputLevel(0); OutputHandler::getOutStream().output(text + "\n"); return text; }
67
68            /** @brief Puts an error on the outstream. @param text The text */
69            static inline std::string error(const std::string& text)
70                { OutputHandler::getOutStream().setOutputLevel(1); OutputHandler::getOutStream().output(text + "\n"); return text; }
71
72            /** @brief Puts a warning on the outstream. @param text The text */
73            static inline std::string warning(const std::string& text)
74                { OutputHandler::getOutStream().setOutputLevel(2); OutputHandler::getOutStream().output(text + "\n"); return text; }
75
76            /** @brief Puts an info on the outstream. @param text The text */
77            static inline std::string info(const std::string& text)
78                { OutputHandler::getOutStream().setOutputLevel(3); OutputHandler::getOutStream().output(text + "\n"); return text; }
79
80            /** @brief Puts some debug output on the outstream. @param text The text */
81            static inline std::string debug(const std::string& text)
82                { OutputHandler::getOutStream().setOutputLevel(4); OutputHandler::getOutStream().output(text + "\n"); return text; }
83
84            /** @brief Returns a reference to the logfile. @return The logfile */
85            inline std::ofstream& getLogfile()
86                { return this->logfile_; }
87
88            /** @brief Returns a pointer to the OutputBuffer. @return The OutputBuffer */
89            inline OutputBuffer* getOutputBuffer()
90                { return this->outputBuffer_; }
91
92            /** @brief Sets the level of the incoming output. @param level The level of the incoming output @return The OutputHandler itself */
93            inline OutputHandler& setOutputLevel(int level)
94                { this->outputLevel_ = level; return *this; }
95
96            /** @brief Returns the level of the incoming output. @return The level */
97            inline int getOutputLevel() const
98                { return this->outputLevel_; }
99
100            static void setSoftDebugLevel(OutputHandler::OutputDevice device, int level);
101            static int getSoftDebugLevel(OutputHandler::OutputDevice device = OutputHandler::LD_All);
102
103            void setOutputBuffer(OutputBuffer* buffer);
104
105            template <class T>
106            OutputHandler& output(const T& output);
107
108            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
109            inline OutputHandler& operator<<(unsigned char val)      { return this->output(val); }
110            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
111            inline OutputHandler& operator<<(short val)              { return this->output(val); }
112            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
113            inline OutputHandler& operator<<(unsigned short val)     { return this->output(val); }
114            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
115            inline OutputHandler& operator<<(int val)                { return this->output(val); }
116            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
117            inline OutputHandler& operator<<(unsigned int val)       { return this->output(val); }
118            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
119            inline OutputHandler& operator<<(long val)               { return this->output(val); }
120            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
121            inline OutputHandler& operator<<(unsigned long val)      { return this->output(val); }
122            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
123            inline OutputHandler& operator<<(long long val)          { return this->output(val); }
124            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
125            inline OutputHandler& operator<<(unsigned long long val) { return this->output(val); }
126            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
127            inline OutputHandler& operator<<(float val)              { return this->output(val); }
128            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
129            inline OutputHandler& operator<<(double val)             { return this->output(val); }
130            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
131            inline OutputHandler& operator<<(long double val)        { return this->output(val); }
132            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
133            inline OutputHandler& operator<<(const void* val)        { return this->output(val); }
134            /** @brief Overloaded << operator, redirects the output to the console and the logfile. @param val The value that should be shown in the console @return A reference to the OutputHandler itself */
135            inline OutputHandler& operator<<(bool val)               { return this->output(val); }
136
137            OutputHandler& operator<<(std::streambuf* sb);
138
139            OutputHandler& operator<<(std::ostream& (*manipulator)(std::ostream&));
140            OutputHandler& operator<<(std::ios& (*manipulator)(std::ios&));
141            OutputHandler& operator<<(std::ios_base& (*manipulator)(std::ios_base&));
142
143        private:
144            explicit OutputHandler(const std::string& logfilename);
145            OutputHandler(const OutputHandler& oh);  // don't copy
146            virtual ~OutputHandler();
147
148            std::ofstream logfile_;              //!< The logfile where the output is logged
149            std::string logfilename_;            //!< The name of the logfile
150            OutputBuffer fallbackBuffer_;        //!< The OutputBuffer that gets used if there is no other OutputBuffer
151            OutputBuffer* outputBuffer_;         //!< The OutputBuffer to put output in (usually used by the Shell)
152            int outputLevel_;                    //!< The level of the incoming output
153            int softDebugLevel_[4];              //!< The soft debug level for each OutputDevice - the configurable maximal output level
154    };
155
156    /**
157        @brief Redirects the output to the console and the logfile.
158        @param output The value that should be shown in the console
159        @return A reference to the OutputHandler itself
160    */
161    template<class T>
162    OutputHandler& OutputHandler::output(const T& output)
163    {
164        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Console) >= this->outputLevel_)
165            std::cout << output;
166
167        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Logfile) >= this->outputLevel_)
168        {
169            this->logfile_ << output;
170            this->logfile_.flush();
171        }
172
173        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Shell) >= this->outputLevel_)
174            (*this->outputBuffer_) << output;
175
176        return *this;
177    }
178
179    /**
180        @brief Overloading of the non-member << operator to redirect the output of classes with self defined '<< to std::ostream' operators to the console and the logfile.
181        @param out The OutputHandler itself
182        @param output The class that should be shown in the console
183        @return The OutputHandler itself
184    */
185    template<class T>
186    OutputHandler& operator<<(OutputHandler& out, const T& output)
187    {
188        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Console) >= out.getOutputLevel())
189            std::cout << output;
190
191        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Logfile) >= out.getOutputLevel())
192        {
193            out.getLogfile() << output;
194            out.getLogfile().flush();
195        }
196
197        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Shell) >= out.getOutputLevel())
198            (*out.getOutputBuffer()) << output;
199
200        return out;
201    }
202}
203
204#endif /* _OutputHandler_H__ */
Note: See TracBrowser for help on using the repository browser.