Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/console/src/core/OutputHandler.h @ 1255

Last change on this file since 1255 was 1230, checked in by landauf, 17 years ago

added a tcl-thread, but there are still some bugs and problems

File size: 9.7 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 OutputHandler.h
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.
35*/
36
37#ifndef _OutputHandler_H__
38#define _OutputHandler_H__
39
40#include "CorePrereqs.h"
41
42#include <iostream>
43#include <fstream>
44#include <string>
45
46namespace orxonox
47{
48    //! The OutputHandler acts like std::cout, but redirects output to the console AND the logfile.
49    class _CoreExport OutputHandler
50    {
51        public:
52            enum OutputDevice
53            {
54                LD_All,
55                LD_Console,
56                LD_Logfile,
57                LD_Shell
58            };
59
60            static OutputHandler& getOutStream();
61
62            /** @brief Puts some text on the outstream. @param text The text */
63            static inline std::string log(const std::string& text)
64                { OutputHandler::getOutStream().setOutputLevel(0); OutputHandler::getOutStream().output(text + "\n"); return text; }
65
66            /** @brief Puts an error on the outstream. @param text The text */
67            static inline std::string error(const std::string& text)
68                { OutputHandler::getOutStream().setOutputLevel(1); OutputHandler::getOutStream().output(text + "\n"); return text; }
69
70            /** @brief Puts a warning on the outstream. @param text The text */
71            static inline std::string warning(const std::string& text)
72                { OutputHandler::getOutStream().setOutputLevel(2); OutputHandler::getOutStream().output(text + "\n"); return text; }
73
74            /** @brief Puts an info on the outstream. @param text The text */
75            static inline std::string info(const std::string& text)
76                { OutputHandler::getOutStream().setOutputLevel(3); OutputHandler::getOutStream().output(text + "\n"); return text; }
77
78            /** @brief Puts some debug output on the outstream. @param text The text */
79            static inline std::string debug(const std::string& text)
80                { OutputHandler::getOutStream().setOutputLevel(4); OutputHandler::getOutStream().output(text + "\n"); return text; }
81
82            /** @brief Returns a reference to the logfile. @return The logfile */
83            inline std::ofstream& getLogfile()
84                { return this->logfile_; }
85
86            /** @brief Sets the level of the incoming output. @param level The level of the incoming output @return The OutputHandler itself */
87            inline OutputHandler& setOutputLevel(int level)
88                { this->outputLevel_ = level; return *this; }
89
90            /** @brief Returns the level of the incoming output. @return The level */
91            inline int getOutputLevel() const
92                { return this->outputLevel_; }
93
94            static int getSoftDebugLevel(OutputHandler::OutputDevice device);
95
96            template <class T>
97            OutputHandler& output(const T& output);
98
99            /** @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 */
100            inline OutputHandler& operator<<(unsigned char val)   { return this->output(val); }
101            /** @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 */
102            inline OutputHandler& operator<<(short val)           { return this->output(val); }
103            /** @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 */
104            inline OutputHandler& operator<<(unsigned short val)  { return this->output(val); }
105            /** @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 */
106            inline OutputHandler& operator<<(int val)             { return this->output(val); }
107            /** @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 */
108            inline OutputHandler& operator<<(unsigned int val)    { return this->output(val); }
109            /** @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 */
110            inline OutputHandler& operator<<(long val)            { return this->output(val); }
111            /** @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 */
112            inline OutputHandler& operator<<(unsigned long val)   { return this->output(val); }
113            /** @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 */
114            inline OutputHandler& operator<<(float val)           { return this->output(val); }
115            /** @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 */
116            inline OutputHandler& operator<<(double val)          { return this->output(val); }
117            /** @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 */
118            inline OutputHandler& operator<<(long double val)     { return this->output(val); }
119            /** @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 */
120            inline OutputHandler& operator<<(const void* val)     { return this->output(val); }
121            /** @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 */
122            inline OutputHandler& operator<<(bool val)            { return this->output(val); }
123
124            OutputHandler& operator<<(std::streambuf* sb);
125
126            OutputHandler& operator<<(std::ostream& (*manipulator)(std::ostream&));
127            OutputHandler& operator<<(std::ios& (*manipulator)(std::ios&));
128            OutputHandler& operator<<(std::ios_base& (*manipulator)(std::ios_base&));
129
130        private:
131            explicit OutputHandler(const std::string& logfilename);
132            OutputHandler(const OutputHandler& oh);  // don't copy
133            virtual ~OutputHandler();
134            std::ofstream logfile_;     //!< The logfile where the output is logged
135            std::string logfilename_;   //!< The name of the logfile
136            int outputLevel_;           //!< The level of the incoming output
137    };
138
139    /**
140        @brief Redirects the output to the console and the logfile.
141        @param output The value that should be shown in the console
142        @return A reference to the OutputHandler itself
143    */
144    template<class T>
145    OutputHandler& OutputHandler::output(const T& output)
146    {
147        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Console) >= this->outputLevel_)
148            std::cout << output;
149
150        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Logfile) >= this->outputLevel_)
151        {
152            this->logfile_ << output;
153            this->logfile_.flush();
154        }
155
156        return *this;
157    }
158
159    /**
160        @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.
161        @param out The OutputHandler itself
162        @param output The class that should be shown in the console
163        @return The OutputHandler itself
164    */
165    template<class T>
166    OutputHandler& operator<<(OutputHandler& out, const T& output)
167    {
168        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Console) >= out.getOutputLevel())
169            std::cout << output;
170
171        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Logfile) >= out.getOutputLevel())
172        {
173            out.getLogfile() << output;
174            out.getLogfile().flush();
175        }
176
177        return out;
178    }
179
180}
181
182#endif /* _OutputHandler_H__ */
Note: See TracBrowser for help on using the repository browser.