Fix detecting of binary file status for new files
[vng.git] / src / Logger.cpp
blobb6e747b5ee7b8043110c50038de2c55d0cdfd6cd
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()
35 removePager();
38 void LoggerPrivate::insertPager()
40 if (pager)
41 return; // already present.
42 pager = new QProcess();
43 connect(pager, SIGNAL(finished(int )), this, SLOT(pagerFinished()));
44 pager->setProcessChannelMode(QProcess::ForwardedChannels);
45 colorPager = true;
46 if (! startPager(QLatin1String("less"), QStringList() << QLatin1String("-R") << QLatin1String("-E"))) {
47 colorPager = false;
48 if (! startPager(QLatin1String("less"), QStringList() << QLatin1String("-E"))) {
49 if (! startPager(QLatin1String("more"))) {
50 delete pager;
51 pager = 0;
52 return;
56 pagerStream = new QTextStream(pager);
59 void LoggerPrivate::removePager()
61 if (pager == 0)
62 return;
63 pagerStream->flush();
64 pager->closeWriteChannel();
65 pager->waitForFinished(-1);
66 delete pager;
67 pager = 0;
68 delete pagerStream;
69 pagerStream = 0;
72 bool LoggerPrivate::startPager(const QString &program, const QStringList &arguments)
74 Q_ASSERT(pager);
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;
79 pager->kill();
81 return false;
83 if (pager->state() != QProcess::Running) // it already 'finished'
84 return false;
85 return true;
88 void LoggerPrivate::pagerFinished()
90 if (! pager)
91 return;
92 pager->close();
95 Q_GLOBAL_STATIC(LoggerPrivate, _vng_logger_private)
98 Logger::Logger()
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();
131 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();
171 bool Logger::hasNonColorPager()
173 if (_vng_logger_private()->pager == 0)
174 return false;
175 return ! _vng_logger_private()->colorPager;