Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchy/src/util/OutputHandler.h @ 2155

Last change on this file since 2155 was 2114, checked in by rgrieder, 16 years ago

Replaced all "@file Blah.cc" with "@file" for better flexibility. DoxyGen will use the filename as default.

  • 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.