Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/util/OutputHandler.cc @ 2703

Last change on this file since 2703 was 2662, checked in by rgrieder, 16 years ago

Merged presentation branch back to trunk.

  • Property svn:eol-style set to native
File size: 6.5 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 Implementation of the OutputHandler class.
32*/
33
34#include "OutputHandler.h"
35#include <time.h>
36
37namespace orxonox
38{
39    /**
40        @brief Constructor: Opens the logfile and writes the first line.
41        @param logfilename The name of the logfile
42    */
43    OutputHandler::OutputHandler(const std::string& logfilename)
44    {
45        this->outputBuffer_ = &this->fallbackBuffer_;
46        this->softDebugLevel_[0] = this->softDebugLevel_[1] = this->softDebugLevel_[2] = this->softDebugLevel_[3] = 2;
47        this->logfilename_ = logfilename;
48        this->logfile_.open(this->logfilename_.c_str(), std::fstream::out);
49
50        time_t rawtime;
51        struct tm* timeinfo;
52        time(&rawtime);
53        timeinfo = localtime(&rawtime);
54
55        this->logfile_ << "Started log at " << asctime(timeinfo) << std::endl;
56        this->logfile_.flush();
57    }
58
59    /**
60        @brief Destructor: Writes the last line to the logfile and closes it.
61    */
62    OutputHandler::~OutputHandler()
63    {
64        this->logfile_ << "Closed log" << std::endl;
65        this->logfile_.close();
66    }
67
68    /**
69        @brief Returns a reference to the only existing instance of the OutputHandler class.
70        @return The instance
71    */
72    OutputHandler& OutputHandler::getOutStream()
73    {
74        static OutputHandler orxout("orxonox.log");
75        return orxout;
76    }
77
78    /**
79        @brief Sets the soft debug level for a given output device.
80        @param device The output device
81        @param level The debug level
82    */
83    void OutputHandler::setSoftDebugLevel(OutputHandler::OutputDevice device, int level)
84    {
85        OutputHandler::getOutStream().softDebugLevel_[(unsigned int)device] = level;
86    }
87
88    /**
89        @brief Returns the soft debug level for a given output device.
90        @param device The output device
91        @return The debug level
92    */
93    int OutputHandler::getSoftDebugLevel(OutputHandler::OutputDevice device)
94    {
95        return OutputHandler::getOutStream().softDebugLevel_[(unsigned int)device];
96    }
97
98    /**
99        @brief Sets the OutputBuffer, representing the third output stream.
100        @param buffer The OutputBuffer
101    */
102    void OutputHandler::setOutputBuffer(OutputBuffer* buffer)
103    {
104        if (buffer == NULL)
105            this->outputBuffer_ = &this->fallbackBuffer_;
106        else
107        {
108            buffer->getStream() >> this->outputBuffer_->getStream().rdbuf();
109            this->outputBuffer_ = buffer;
110        }
111    }
112
113    /**
114        @brief Overloaded << operator, redirects the output to the console and the logfile.
115        @param sb The streambuffer that should be shown in the console
116        @return A reference to the OutputHandler itself
117    */
118    OutputHandler& OutputHandler::operator<<(std::streambuf* sb)
119    {
120        if (getSoftDebugLevel(OutputHandler::LD_Console) >= this->outputLevel_)
121            std::cout << sb;
122
123        if (getSoftDebugLevel(OutputHandler::LD_Logfile) >= this->outputLevel_)
124        {
125            this->logfile_ << sb;
126            this->logfile_.flush();
127        }
128
129        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Shell) >= this->outputLevel_)
130            (*this->outputBuffer_) << sb;
131
132        return *this;
133    }
134
135    /**
136        @brief Overloaded << operator, redirects the output to the console, the logfile and the ingame shell.
137        @param manipulator A function, manipulating the outstream.
138        @return A reference to the OutputHandler itself
139    */
140    OutputHandler& OutputHandler::operator<<(std::ostream& (*manipulator)(std::ostream&))
141    {
142        if (getSoftDebugLevel(OutputHandler::LD_Console) >= this->outputLevel_)
143            manipulator(std::cout);
144
145        if (getSoftDebugLevel(OutputHandler::LD_Logfile) >= this->outputLevel_)
146        {
147            manipulator(this->logfile_);
148            this->logfile_.flush();
149        }
150
151        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Shell) >= this->outputLevel_)
152            (*this->outputBuffer_) << manipulator;
153
154        return *this;
155    }
156
157    /**
158        @brief Overloaded << operator, redirects the output to the console, the logfile and the ingame shell.
159        @param manipulator A function, manipulating the outstream.
160        @return A reference to the OutputHandler itself
161    */
162    OutputHandler& OutputHandler::operator<<(std::ios& (*manipulator)(std::ios&))
163    {
164        if (getSoftDebugLevel(OutputHandler::LD_Console) >= this->outputLevel_)
165            manipulator(std::cout);
166
167        if (getSoftDebugLevel(OutputHandler::LD_Logfile) >= this->outputLevel_)
168        {
169            manipulator(this->logfile_);
170            this->logfile_.flush();
171        }
172
173        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Shell) >= this->outputLevel_)
174            (*this->outputBuffer_) << manipulator;
175
176        return *this;
177    }
178
179    /**
180        @brief Overloaded << operator, redirects the output to the console, the logfile and the ingame shell.
181        @param manipulator A function, manipulating the outstream.
182        @return A reference to the OutputHandler itself
183    */
184    OutputHandler& OutputHandler::operator<<(std::ios_base& (*manipulator)(std::ios_base&))
185    {
186        if (getSoftDebugLevel(OutputHandler::LD_Console) >= this->outputLevel_)
187            manipulator(std::cout);
188
189        if (getSoftDebugLevel(OutputHandler::LD_Logfile) >= this->outputLevel_)
190        {
191            manipulator(this->logfile_);
192            this->logfile_.flush();
193        }
194
195        if (OutputHandler::getSoftDebugLevel(OutputHandler::LD_Shell) >= this->outputLevel_)
196            (*this->outputBuffer_) << manipulator;
197
198        return *this;
199    }
200}
Note: See TracBrowser for help on using the repository browser.