update todo
[vng.git] / Logger.cpp
blob15b7ae76efec03c1622689c04c1ae3107b642969
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 "Logger_p.h"
21 #include <QDebug>
22 #include <QThread>
24 LoggerPrivate::LoggerPrivate()
25 : verbosity(Logger::Chatty),
26 dummy(new NullDevice()),
27 pagerStream(0),
28 pager(0),
29 colorPager(false)
33 LoggerPrivate::~LoggerPrivate() {
34 removePager();
37 void LoggerPrivate::insertPager()
39 if (pager)
40 return; // already present.
41 pager = new QProcess();
42 connect(pager, SIGNAL(finished(int )), this, SLOT(pagerFinished()));
43 pager->setProcessChannelMode(QProcess::ForwardedChannels);
44 colorPager = true;
45 if (! startPager("less", QStringList() << "-R" << "-E")) {
46 colorPager = false;
47 if (! startPager("less", QStringList() << "-E")) {
48 if (! startPager("more")) {
49 delete pager;
50 pager = 0;
51 return;
55 pagerStream = new QTextStream(pager);
58 void LoggerPrivate::removePager()
60 if (pager == 0)
61 return;
62 pagerStream->flush();
63 pager->closeWriteChannel();
64 pager->waitForFinished(-1);
65 delete pager;
66 pager = 0;
67 delete pagerStream;
68 pagerStream = 0;
71 bool LoggerPrivate::startPager(const QString &program, const QStringList &arguments)
73 Q_ASSERT(pager);
74 pager->start(program, arguments, QIODevice::ReadWrite);
75 if (! pager->waitForStarted()) {
76 if (pager->state() != QProcess::NotRunning) { // time out
77 standardOut() << "ERROR: the pager failed to start" << endl;
78 pager->kill();
80 return false;
82 if (pager->state() != QProcess::Running) // it already 'finished'
83 return false;
84 return true;
87 void LoggerPrivate::pagerFinished()
89 if (! pager)
90 return;
91 pager->close();
94 Q_GLOBAL_STATIC(LoggerPrivate, _vng_logger_private)
97 Logger::Logger()
98 : d(_vng_logger_private())
102 void Logger::setVerbosity(Verbosity verbosity)
104 _vng_logger_private()->verbosity = verbosity;
107 Logger::Verbosity Logger::verbosity()
109 return _vng_logger_private()->verbosity;
112 QTextStream & Logger::standardOut()
114 LoggerPrivate *self = _vng_logger_private();
115 if (self->pagerStream)
116 return *self->pagerStream;
117 return self->standardOut();
120 QTextStream &Logger::log(Verbosity verbosity)
122 LoggerPrivate *self = _vng_logger_private();
123 if (self->verbosity >= verbosity) {
124 if (self->pagerStream && QThread::currentThread() == self->pager->thread()) {
125 self->pager->waitForBytesWritten();
126 return *self->pagerStream;
128 return self->standardOut();
130 return self->dummy;
134 QTextStream & Logger::debug()
136 return log(Debug);
139 QTextStream & Logger::info()
141 return log(Verbose);
144 QTextStream & Logger::warn()
146 return log(Chatty);
149 QTextStream & Logger::error()
151 return log(Quiet);
154 void Logger::startPager()
156 _vng_logger_private()->insertPager();
159 void Logger::stopPager()
161 _vng_logger_private()->removePager();
164 void Logger::flushPager()
166 QProcess *pager = _vng_logger_private()->pager;
167 if (pager)
168 pager->waitForBytesWritten();
172 bool Logger::hasNonColorPager()
174 if (_vng_logger_private()->pager == 0)
175 return false;
176 return ! _vng_logger_private()->colorPager;