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()
38 void LoggerPrivate::insertPager()
41 return; // already present.
42 pager
= new QProcess();
43 connect(pager
, SIGNAL(finished(int )), this, SLOT(pagerFinished()));
44 pager
->setProcessChannelMode(QProcess::ForwardedChannels
);
46 if (! startPager(QLatin1String("less"), QStringList() << QLatin1String("-R") << QLatin1String("-E"))) {
48 if (! startPager(QLatin1String("less"), QStringList() << QLatin1String("-E"))) {
49 if (! startPager(QLatin1String("more"))) {
56 pagerStream
= new QTextStream(pager
);
59 void LoggerPrivate::removePager()
64 pager
->closeWriteChannel();
65 pager
->waitForFinished(-1);
72 bool LoggerPrivate::startPager(const QString
&program
, const QStringList
&arguments
)
75 pager
->start(program
, arguments
, QIODevice::ReadWrite
);
76 if (! pager
->waitForStarted()) {
77 if (pager
->state() != QProcess::NotRunning
) { // time out
78 standardOut() << "ERROR: the pager failed to start" << endl
;
83 if (pager
->state() != QProcess::Running
) // it already 'finished'
88 void LoggerPrivate::pagerFinished()
95 Q_GLOBAL_STATIC(LoggerPrivate
, _vng_logger_private
)
99 : d(_vng_logger_private())
103 void Logger::setVerbosity(Verbosity verbosity
)
105 _vng_logger_private()->verbosity
= verbosity
;
108 Logger::Verbosity
Logger::verbosity()
110 return _vng_logger_private()->verbosity
;
113 QTextStream
& Logger::standardOut()
115 LoggerPrivate
*self
= _vng_logger_private();
116 if (self
->pagerStream
)
117 return *self
->pagerStream
;
118 return self
->standardOut();
121 QTextStream
&Logger::log(Verbosity verbosity
)
123 LoggerPrivate
*self
= _vng_logger_private();
124 if (self
->verbosity
>= verbosity
) {
125 if (self
->pagerStream
&& QThread::currentThread() == self
->pager
->thread()) {
126 self
->pager
->waitForBytesWritten();
127 return *self
->pagerStream
;
129 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();
171 bool Logger::hasNonColorPager()
173 if (_vng_logger_private()->pager
== 0)
175 return ! _vng_logger_private()->colorPager
;