Don't allow to unrecord past the branch point
[vng.git] / Logger.cpp
blobf44d08deb36b95e87d7c6bbe15e1d986794919a8
1 /*
2 * This file is part of the vng project
3 * Copyright (C) 2008 Thomas Zander <tzander@trolltech.com>
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "Logger.h"
20 #include <QProcess>
21 #include <QDebug>
23 class NullDevice : public QIODevice {
24 public:
25 virtual qint64 readData (char *data, qint64 maxlen) {
26 Q_UNUSED(data);
27 Q_UNUSED(maxlen);
28 return 0;
30 virtual qint64 writeData (const char *data, qint64 len) {
31 Q_UNUSED(data);
32 return len;
36 class LoggerPrivate {
37 public:
38 LoggerPrivate()
39 : verbosity(Logger::Chatty),
40 dummy(new NullDevice()),
41 standardOut(stdout),
42 pagerStream(0),
43 pager(0),
44 colorPager(false)
48 ~LoggerPrivate() {
49 standardOut.flush();
50 removePager();
53 void insertPager()
55 if (pager)
56 return; // already present.
57 pager = new QProcess();
58 pager->setProcessChannelMode(QProcess::ForwardedChannels);
59 colorPager = true;
60 if (! startPager("less", QStringList() << "-R" << "-E")) {
61 colorPager = false;
62 if (! startPager("less", QStringList() << "-E")) {
63 if (! startPager("more")) {
64 delete pager;
65 pager = 0;
66 return;
70 pagerStream = new QTextStream(pager);
73 void removePager()
75 if (pager == 0)
76 return;
77 pagerStream->flush();
78 pager->closeWriteChannel();
79 pager->waitForFinished(-1);
80 delete pager;
81 pager = 0;
82 delete pagerStream;
83 pagerStream = 0;
86 bool startPager(const QString &program, const QStringList &arguments = QStringList())
88 Q_ASSERT(pager);
89 pager->start(program, arguments, QIODevice::ReadWrite);
90 if (! pager->waitForStarted()) {
91 if (pager->state() != QProcess::NotRunning) { // time out
92 standardOut << "ERROR: the pager failed to start" << endl;
93 pager->kill();
95 return false;
97 if (pager->state() != QProcess::Running) // it already 'finished'
98 return false;
99 return true;
102 Logger::Verbosity verbosity;
103 QTextStream dummy;
104 QTextStream standardOut;
105 QTextStream *pagerStream;
106 QProcess *pager;
107 bool colorPager;
110 Q_GLOBAL_STATIC(LoggerPrivate, _vng_logger_private)
113 Logger::Logger()
114 : d(_vng_logger_private())
118 void Logger::setVerbosity(Verbosity verbosity)
120 _vng_logger_private()->verbosity = verbosity;
123 Logger::Verbosity Logger::verbosity()
125 return _vng_logger_private()->verbosity;
128 QTextStream & Logger::standardOut()
130 LoggerPrivate *self = _vng_logger_private();
131 if (self->pagerStream)
132 return *self->pagerStream;
133 return self->standardOut;
136 QTextStream &Logger::log(Verbosity verbosity)
138 LoggerPrivate *self = _vng_logger_private();
139 if (self->verbosity >= verbosity) {
140 if (self->pagerStream)
141 return *self->pagerStream;
142 return self->standardOut;
144 return self->dummy;
148 QTextStream & Logger::debug()
150 return log(Debug);
153 QTextStream & Logger::info()
155 return log(Chatty);
158 QTextStream & Logger::warn()
160 return log(Verbose);
163 QTextStream & Logger::error()
165 return log(Quiet);
168 void Logger::startPager()
170 _vng_logger_private()->insertPager();
173 void Logger::stopPager()
175 _vng_logger_private()->removePager();
179 bool Logger::hasNonColorPager()
181 if (_vng_logger_private()->pager == 0)
182 return false;
183 return ! _vng_logger_private()->colorPager;