show 'edit' in help if the repo is in edit mode
[vng.git] / Logger.cpp
blob10d0193b3e143b039517722c356ecda09f729291
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>
23 LoggerPrivate::LoggerPrivate()
24 : verbosity(Logger::Chatty),
25 dummy(new NullDevice()),
26 pagerStream(0),
27 pager(0),
28 colorPager(false)
32 LoggerPrivate::~LoggerPrivate() {
33 removePager();
36 void LoggerPrivate::insertPager()
38 if (pager)
39 return; // already present.
40 pager = new QProcess();
41 connect(pager, SIGNAL(finished(int )), this, SLOT(pagerFinished()));
42 pager->setProcessChannelMode(QProcess::ForwardedChannels);
43 colorPager = true;
44 if (! startPager("less", QStringList() << "-R" << "-E")) {
45 colorPager = false;
46 if (! startPager("less", QStringList() << "-E")) {
47 if (! startPager("more")) {
48 delete pager;
49 pager = 0;
50 return;
54 pagerStream = new QTextStream(pager);
57 void LoggerPrivate::removePager()
59 if (pager == 0)
60 return;
61 pagerStream->flush();
62 pager->closeWriteChannel();
63 pager->waitForFinished(-1);
64 delete pager;
65 pager = 0;
66 delete pagerStream;
67 pagerStream = 0;
70 bool LoggerPrivate::startPager(const QString &program, const QStringList &arguments)
72 Q_ASSERT(pager);
73 pager->start(program, arguments, QIODevice::ReadWrite);
74 if (! pager->waitForStarted()) {
75 if (pager->state() != QProcess::NotRunning) { // time out
76 standardOut() << "ERROR: the pager failed to start" << endl;
77 pager->kill();
79 return false;
81 if (pager->state() != QProcess::Running) // it already 'finished'
82 return false;
83 return true;
86 void LoggerPrivate::pagerFinished()
88 if (! pager)
89 return;
90 pager->close();
93 Q_GLOBAL_STATIC(LoggerPrivate, _vng_logger_private)
96 Logger::Logger()
97 : d(_vng_logger_private())
101 void Logger::setVerbosity(Verbosity verbosity)
103 _vng_logger_private()->verbosity = verbosity;
106 Logger::Verbosity Logger::verbosity()
108 return _vng_logger_private()->verbosity;
111 QTextStream & Logger::standardOut()
113 LoggerPrivate *self = _vng_logger_private();
114 if (self->pagerStream)
115 return *self->pagerStream;
116 return self->standardOut();
119 QTextStream &Logger::log(Verbosity verbosity)
121 LoggerPrivate *self = _vng_logger_private();
122 if (self->verbosity >= verbosity) {
123 if (self->pagerStream) {
124 self->pager->waitForBytesWritten();
125 return *self->pagerStream;
127 return self->standardOut();
129 return self->dummy;
133 QTextStream & Logger::debug()
135 return log(Debug);
138 QTextStream & Logger::info()
140 return log(Verbose);
143 QTextStream & Logger::warn()
145 return log(Chatty);
148 QTextStream & Logger::error()
150 return log(Quiet);
153 void Logger::startPager()
155 _vng_logger_private()->insertPager();
158 void Logger::stopPager()
160 _vng_logger_private()->removePager();
163 void Logger::flushPager()
165 QProcess *pager = _vng_logger_private()->pager;
166 if (pager)
167 pager->waitForBytesWritten();
171 bool Logger::hasNonColorPager()
173 if (_vng_logger_private()->pager == 0)
174 return false;
175 return ! _vng_logger_private()->colorPager;