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/>.
24 LoggerPrivate::LoggerPrivate()
25 : verbosity(Logger::Chatty
),
26 dummy(new NullDevice()),
33 LoggerPrivate::~LoggerPrivate() {
37 void LoggerPrivate::insertPager()
40 return; // already present.
41 pager
= new QProcess();
42 connect(pager
, SIGNAL(finished(int )), this, SLOT(pagerFinished()));
43 pager
->setProcessChannelMode(QProcess::ForwardedChannels
);
45 if (! startPager("less", QStringList() << "-R" << "-E")) {
47 if (! startPager("less", QStringList() << "-E")) {
48 if (! startPager("more")) {
55 pagerStream
= new QTextStream(pager
);
58 void LoggerPrivate::removePager()
63 pager
->closeWriteChannel();
64 pager
->waitForFinished(-1);
71 bool LoggerPrivate::startPager(const QString
&program
, const QStringList
&arguments
)
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
;
82 if (pager
->state() != QProcess::Running
) // it already 'finished'
87 void LoggerPrivate::pagerFinished()
94 Q_GLOBAL_STATIC(LoggerPrivate
, _vng_logger_private
)
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();
134 QTextStream
& Logger::debug()
139 QTextStream
& Logger::info()
144 QTextStream
& Logger::warn()
149 QTextStream
& Logger::error()
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
;
168 pager
->waitForBytesWritten();
172 bool Logger::hasNonColorPager()
174 if (_vng_logger_private()->pager
== 0)
176 return ! _vng_logger_private()->colorPager
;