Add qmodmaster and move udp app to applications
This commit is contained in:
193
Applications/qModMaster/3rdparty/QsLog/QsLog.cpp
vendored
Normal file
193
Applications/qModMaster/3rdparty/QsLog/QsLog.cpp
vendored
Normal file
@@ -0,0 +1,193 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "QsLog.h"
|
||||
#include "QsLogDest.h"
|
||||
#ifdef QS_LOG_SEPARATE_THREAD
|
||||
#include <QThreadPool>
|
||||
#include <QRunnable>
|
||||
#else
|
||||
#include <QMutex>
|
||||
#endif
|
||||
#include <QVector>
|
||||
#include <QDateTime>
|
||||
#include <QtGlobal>
|
||||
#include <cassert>
|
||||
#include <cstdlib>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace QsLogging
|
||||
{
|
||||
typedef QVector<DestinationPtr> DestinationList;
|
||||
|
||||
static const char TraceString[] = "TRACE";
|
||||
static const char DebugString[] = "DEBUG";
|
||||
static const char InfoString[] = "INFO";
|
||||
static const char WarnString[] = "WARN";
|
||||
static const char ErrorString[] = "ERROR";
|
||||
static const char FatalString[] = "FATAL";
|
||||
|
||||
// not using Qt::ISODate because we need the milliseconds too
|
||||
static const QString fmtDateTime("yyyy-MM-ddThh:mm:ss.zzz");
|
||||
|
||||
static const char* LevelToText(Level theLevel)
|
||||
{
|
||||
switch (theLevel) {
|
||||
case TraceLevel:
|
||||
return TraceString;
|
||||
case DebugLevel:
|
||||
return DebugString;
|
||||
case InfoLevel:
|
||||
return InfoString;
|
||||
case WarnLevel:
|
||||
return WarnString;
|
||||
case ErrorLevel:
|
||||
return ErrorString;
|
||||
case FatalLevel:
|
||||
return FatalString;
|
||||
case OffLevel:
|
||||
return "";
|
||||
default: {
|
||||
assert(!"bad log level");
|
||||
return InfoString;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef QS_LOG_SEPARATE_THREAD
|
||||
class LogWriterRunnable : public QRunnable
|
||||
{
|
||||
public:
|
||||
LogWriterRunnable(const QString &message, Level level)
|
||||
: mMessage(message)
|
||||
, mLevel(level) {}
|
||||
|
||||
virtual void run()
|
||||
{
|
||||
Logger::instance().write(mMessage, mLevel);
|
||||
}
|
||||
|
||||
private:
|
||||
QString mMessage;
|
||||
Level mLevel;
|
||||
};
|
||||
#endif
|
||||
|
||||
class LoggerImpl
|
||||
{
|
||||
public:
|
||||
LoggerImpl() :
|
||||
level(InfoLevel)
|
||||
{
|
||||
// assume at least file + console
|
||||
destList.reserve(2);
|
||||
#ifdef QS_LOG_SEPARATE_THREAD
|
||||
threadPool.setMaxThreadCount(1);
|
||||
threadPool.setExpiryTimeout(-1);
|
||||
#endif
|
||||
}
|
||||
#ifdef QS_LOG_SEPARATE_THREAD
|
||||
QThreadPool threadPool;
|
||||
#else
|
||||
QMutex logMutex;
|
||||
#endif
|
||||
Level level;
|
||||
DestinationList destList;
|
||||
};
|
||||
|
||||
Logger::Logger() :
|
||||
d(new LoggerImpl)
|
||||
{
|
||||
}
|
||||
|
||||
Logger::~Logger()
|
||||
{
|
||||
delete d;
|
||||
}
|
||||
|
||||
void Logger::addDestination(DestinationPtr destination)
|
||||
{
|
||||
assert(destination.data());
|
||||
d->destList.push_back(destination);
|
||||
}
|
||||
|
||||
void Logger::setLoggingLevel(Level newLevel)
|
||||
{
|
||||
d->level = newLevel;
|
||||
}
|
||||
|
||||
Level Logger::loggingLevel() const
|
||||
{
|
||||
return d->level;
|
||||
}
|
||||
|
||||
//! creates the complete log message and passes it to the logger
|
||||
void Logger::Helper::writeToLog()
|
||||
{
|
||||
const char* const levelName = LevelToText(level);
|
||||
const QString completeMessage(QString("%1 %2 %3")
|
||||
.arg(levelName, 5)
|
||||
.arg(QDateTime::currentDateTime().toString(fmtDateTime))
|
||||
.arg(buffer)
|
||||
);
|
||||
|
||||
Logger::instance().enqueueWrite(completeMessage, level);
|
||||
}
|
||||
|
||||
Logger::Helper::~Helper()
|
||||
{
|
||||
try {
|
||||
writeToLog();
|
||||
}
|
||||
catch(std::exception&) {
|
||||
// you shouldn't throw exceptions from a sink
|
||||
assert(!"exception in logger helper destructor");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
//! directs the message to the task queue or writes it directly
|
||||
void Logger::enqueueWrite(const QString& message, Level level)
|
||||
{
|
||||
#ifdef QS_LOG_SEPARATE_THREAD
|
||||
LogWriterRunnable *r = new LogWriterRunnable(message, level);
|
||||
d->threadPool.start(r);
|
||||
#else
|
||||
QMutexLocker lock(&d->logMutex);
|
||||
write(message, level);
|
||||
#endif
|
||||
}
|
||||
|
||||
//! Sends the message to all the destinations. The level for this message is passed in case
|
||||
//! it's useful for processing in the destination.
|
||||
void Logger::write(const QString& message, Level level)
|
||||
{
|
||||
for (DestinationList::iterator it = d->destList.begin(),
|
||||
endIt = d->destList.end();it != endIt;++it) {
|
||||
(*it)->write(message, level);
|
||||
}
|
||||
}
|
||||
|
||||
} // end namespace
|
||||
138
Applications/qModMaster/3rdparty/QsLog/QsLog.h
vendored
Normal file
138
Applications/qModMaster/3rdparty/QsLog/QsLog.h
vendored
Normal file
@@ -0,0 +1,138 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#ifndef QSLOG_H
|
||||
#define QSLOG_H
|
||||
|
||||
#include "QsLogLevel.h"
|
||||
#include "QsLogDest.h"
|
||||
#include <QDebug>
|
||||
#include <QString>
|
||||
|
||||
#define QS_LOG_VERSION "2.0b1"
|
||||
|
||||
namespace QsLogging
|
||||
{
|
||||
class Destination;
|
||||
class LoggerImpl; // d pointer
|
||||
|
||||
class Logger
|
||||
{
|
||||
public:
|
||||
static Logger& instance()
|
||||
{
|
||||
static Logger staticLog;
|
||||
return staticLog;
|
||||
}
|
||||
|
||||
//! Adds a log message destination. Don't add null destinations.
|
||||
void addDestination(DestinationPtr destination);
|
||||
//! Logging at a level < 'newLevel' will be ignored
|
||||
void setLoggingLevel(Level newLevel);
|
||||
//! The default level is INFO
|
||||
Level loggingLevel() const;
|
||||
|
||||
//! The helper forwards the streaming to QDebug and builds the final
|
||||
//! log message.
|
||||
class Helper
|
||||
{
|
||||
public:
|
||||
explicit Helper(Level logLevel) :
|
||||
level(logLevel),
|
||||
qtDebug(&buffer) {}
|
||||
~Helper();
|
||||
QDebug& stream(){ return qtDebug; }
|
||||
|
||||
private:
|
||||
void writeToLog();
|
||||
|
||||
Level level;
|
||||
QString buffer;
|
||||
QDebug qtDebug;
|
||||
};
|
||||
|
||||
private:
|
||||
Logger();
|
||||
Logger(const Logger&);
|
||||
Logger& operator=(const Logger&);
|
||||
~Logger();
|
||||
|
||||
void enqueueWrite(const QString& message, Level level);
|
||||
void write(const QString& message, Level level);
|
||||
|
||||
LoggerImpl* d;
|
||||
|
||||
friend class LogWriterRunnable;
|
||||
};
|
||||
|
||||
} // end namespace
|
||||
|
||||
//! Logging macros: define QS_LOG_LINE_NUMBERS to get the file and line number
|
||||
//! in the log output.
|
||||
#ifndef QS_LOG_LINE_NUMBERS
|
||||
#define QLOG_TRACE() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::TraceLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::TraceLevel).stream()
|
||||
#define QLOG_DEBUG() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::DebugLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::DebugLevel).stream()
|
||||
#define QLOG_INFO() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::InfoLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::InfoLevel).stream()
|
||||
#define QLOG_WARN() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::WarnLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::WarnLevel).stream()
|
||||
#define QLOG_ERROR() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::ErrorLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::ErrorLevel).stream()
|
||||
#define QLOG_FATAL() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::FatalLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::FatalLevel).stream()
|
||||
#else
|
||||
#define QLOG_TRACE() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::TraceLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::TraceLevel).stream() << __FILE__ << '@' << __LINE__
|
||||
#define QLOG_DEBUG() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::DebugLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::DebugLevel).stream() << __FILE__ << '@' << __LINE__
|
||||
#define QLOG_INFO() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::InfoLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::InfoLevel).stream() << __FILE__ << '@' << __LINE__
|
||||
#define QLOG_WARN() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::WarnLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::WarnLevel).stream() << __FILE__ << '@' << __LINE__
|
||||
#define QLOG_ERROR() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::ErrorLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::ErrorLevel).stream() << __FILE__ << '@' << __LINE__
|
||||
#define QLOG_FATAL() \
|
||||
if (QsLogging::Logger::instance().loggingLevel() > QsLogging::FatalLevel) {} \
|
||||
else QsLogging::Logger::Helper(QsLogging::FatalLevel).stream() << __FILE__ << '@' << __LINE__
|
||||
#endif
|
||||
|
||||
#ifdef QS_LOG_DISABLE
|
||||
#include "QsLogDisableForThisFile.h"
|
||||
#endif
|
||||
|
||||
#endif // QSLOG_H
|
||||
19
Applications/qModMaster/3rdparty/QsLog/QsLog.pri
vendored
Normal file
19
Applications/qModMaster/3rdparty/QsLog/QsLog.pri
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
INCLUDEPATH += $$PWD
|
||||
#DEFINES += QS_LOG_LINE_NUMBERS # automatically writes the file and line for each log message
|
||||
#DEFINES += QS_LOG_DISABLE # logging code is replaced with a no-op
|
||||
#DEFINES += QS_LOG_SEPARATE_THREAD # messages are queued and written from a separate thread
|
||||
SOURCES += $$PWD/QsLogDest.cpp \
|
||||
$$PWD/QsLog.cpp \
|
||||
$$PWD/QsLogDestConsole.cpp \
|
||||
$$PWD/QsLogDestFile.cpp
|
||||
|
||||
HEADERS += $$PWD/QSLogDest.h \
|
||||
$$PWD/QsLog.h \
|
||||
$$PWD/QsLogDestConsole.h \
|
||||
$$PWD/QsLogLevel.h \
|
||||
$$PWD/QsLogDestFile.h \
|
||||
$$PWD/QsLogDisableForThisFile.h
|
||||
|
||||
OTHER_FILES += \
|
||||
$$PWD/QsLogChanges.txt \
|
||||
$$PWD/QsLogReadme.txt
|
||||
12
Applications/qModMaster/3rdparty/QsLog/QsLogChanges.txt
vendored
Normal file
12
Applications/qModMaster/3rdparty/QsLog/QsLogChanges.txt
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
QsLog version 2.0b1
|
||||
|
||||
Changes:
|
||||
* destination pointers use shared pointer semantics
|
||||
* the file destination supports log rotation. As a consequence, log files are encoded as UTF-8 and
|
||||
the log appends rather than truncating on every startup when rotation is enabled.
|
||||
* added the posibility of disabling logging either at run time or compile time.
|
||||
* added the possibility of using a separate thread for writing to the log destinations.
|
||||
|
||||
Fixes:
|
||||
* renamed the main.cpp example to avoid QtCreator confusion
|
||||
* offer a way to check if the destination creation has failed (for e.g files)
|
||||
54
Applications/qModMaster/3rdparty/QsLog/QsLogDest.cpp
vendored
Normal file
54
Applications/qModMaster/3rdparty/QsLog/QsLogDest.cpp
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "QsLogDest.h"
|
||||
#include "QsLogDestConsole.h"
|
||||
#include "QsLogDestFile.h"
|
||||
#include <QString>
|
||||
|
||||
namespace QsLogging
|
||||
{
|
||||
|
||||
//! destination factory
|
||||
DestinationPtr DestinationFactory::MakeFileDestination(const QString& filePath, bool enableRotation,
|
||||
qint64 sizeInBytesToRotateAfter, int oldLogsToKeep)
|
||||
{
|
||||
if (enableRotation) {
|
||||
QScopedPointer<SizeRotationStrategy> logRotation(new SizeRotationStrategy);
|
||||
logRotation->setMaximumSizeInBytes(sizeInBytesToRotateAfter);
|
||||
logRotation->setBackupCount(oldLogsToKeep);
|
||||
|
||||
return DestinationPtr(new FileDestination(filePath, RotationStrategyPtr(logRotation.take())));
|
||||
}
|
||||
|
||||
return DestinationPtr(new FileDestination(filePath, RotationStrategyPtr(new NullRotationStrategy)));
|
||||
}
|
||||
|
||||
DestinationPtr DestinationFactory::MakeDebugOutputDestination()
|
||||
{
|
||||
return DestinationPtr(new DebugOutputDestination);
|
||||
}
|
||||
|
||||
} // end namespace
|
||||
57
Applications/qModMaster/3rdparty/QsLog/QsLogDest.h
vendored
Normal file
57
Applications/qModMaster/3rdparty/QsLog/QsLogDest.h
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#ifndef QSLOGDEST_H
|
||||
#define QSLOGDEST_H
|
||||
|
||||
#include "QsLogLevel.h"
|
||||
#include <QSharedPointer>
|
||||
#include <QtGlobal>
|
||||
class QString;
|
||||
|
||||
namespace QsLogging
|
||||
{
|
||||
|
||||
class Destination
|
||||
{
|
||||
public:
|
||||
virtual ~Destination(){}
|
||||
virtual void write(const QString& message, Level level) = 0;
|
||||
virtual bool isValid() = 0; // returns whether the destination was created correctly
|
||||
};
|
||||
typedef QSharedPointer<Destination> DestinationPtr;
|
||||
|
||||
//! Creates logging destinations/sinks. The caller will have ownership of
|
||||
//! the newly created destinations.
|
||||
class DestinationFactory
|
||||
{
|
||||
public:
|
||||
static DestinationPtr MakeFileDestination(const QString& filePath, bool enableRotation = false, qint64 sizeInBytesToRotateAfter = 0, int oldLogsToKeep = 0);
|
||||
static DestinationPtr MakeDebugOutputDestination();
|
||||
};
|
||||
|
||||
} // end namespace
|
||||
|
||||
#endif // QSLOGDEST_H
|
||||
75
Applications/qModMaster/3rdparty/QsLog/QsLogDestConsole.cpp
vendored
Normal file
75
Applications/qModMaster/3rdparty/QsLog/QsLogDestConsole.cpp
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "QsLogDestConsole.h"
|
||||
#include <QString>
|
||||
#include <QtGlobal>
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
void QsDebugOutput::output( const QString& message )
|
||||
{
|
||||
OutputDebugStringW(reinterpret_cast<const WCHAR*>(message.utf16()));
|
||||
OutputDebugStringW(L"\n");
|
||||
}
|
||||
#elif defined(Q_OS_SYMBIAN)
|
||||
#include <e32debug.h>
|
||||
void QsDebugOutput::output( const QString& message )
|
||||
{
|
||||
const int maxPrintSize = 256;
|
||||
if (message.size() <= maxPrintSize) {
|
||||
TPtrC16 symbianMessage(reinterpret_cast<const TUint16*>(message.utf16()));
|
||||
RDebug::RawPrint(symbianMessage);
|
||||
} else {
|
||||
QString slicedMessage = message;
|
||||
while (!slicedMessage.isEmpty()) {
|
||||
const int sliceSize = qMin(maxPrintSize, slicedMessage.size());
|
||||
const QString slice = slicedMessage.left(sliceSize);
|
||||
slicedMessage.remove(0, sliceSize);
|
||||
|
||||
TPtrC16 symbianSlice(reinterpret_cast<const TUint16*>(slice.utf16()));
|
||||
RDebug::RawPrint(symbianSlice);
|
||||
}
|
||||
}
|
||||
}
|
||||
#elif defined(Q_OS_UNIX)
|
||||
#include <cstdio>
|
||||
void QsDebugOutput::output( const QString& message )
|
||||
{
|
||||
fprintf(stderr, "%s\n", qPrintable(message));
|
||||
fflush(stderr);
|
||||
}
|
||||
#endif
|
||||
|
||||
void QsLogging::DebugOutputDestination::write(const QString& message, Level)
|
||||
{
|
||||
QsDebugOutput::output(message);
|
||||
}
|
||||
|
||||
bool QsLogging::DebugOutputDestination::isValid()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
52
Applications/qModMaster/3rdparty/QsLog/QsLogDestConsole.h
vendored
Normal file
52
Applications/qModMaster/3rdparty/QsLog/QsLogDestConsole.h
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#ifndef QSLOGDESTCONSOLE_H
|
||||
#define QSLOGDESTCONSOLE_H
|
||||
|
||||
#include "QsLogDest.h"
|
||||
|
||||
class QString;
|
||||
|
||||
class QsDebugOutput
|
||||
{
|
||||
public:
|
||||
static void output(const QString& a_message);
|
||||
};
|
||||
|
||||
namespace QsLogging
|
||||
{
|
||||
|
||||
// debugger sink
|
||||
class DebugOutputDestination : public Destination
|
||||
{
|
||||
public:
|
||||
virtual void write(const QString& message, Level level);
|
||||
virtual bool isValid();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // QSLOGDESTCONSOLE_H
|
||||
155
Applications/qModMaster/3rdparty/QsLog/QsLogDestFile.cpp
vendored
Normal file
155
Applications/qModMaster/3rdparty/QsLog/QsLogDestFile.cpp
vendored
Normal file
@@ -0,0 +1,155 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "QsLogDestFile.h"
|
||||
#include <QtCore5Compat/QTextCodec>
|
||||
#include <QDateTime>
|
||||
#include <QtGlobal>
|
||||
#include <iostream>
|
||||
|
||||
const int QsLogging::SizeRotationStrategy::MaxBackupCount = 10;
|
||||
|
||||
QsLogging::RotationStrategy::~RotationStrategy()
|
||||
{
|
||||
}
|
||||
|
||||
QsLogging::SizeRotationStrategy::SizeRotationStrategy()
|
||||
: mCurrentSizeInBytes(0)
|
||||
, mMaxSizeInBytes(0)
|
||||
, mBackupsCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
void QsLogging::SizeRotationStrategy::setInitialInfo(const QFile &file)
|
||||
{
|
||||
mFileName = file.fileName();
|
||||
mCurrentSizeInBytes = file.size();
|
||||
}
|
||||
|
||||
void QsLogging::SizeRotationStrategy::includeMessageInCalculation(const QString &message)
|
||||
{
|
||||
mCurrentSizeInBytes += message.toUtf8().size();
|
||||
}
|
||||
|
||||
bool QsLogging::SizeRotationStrategy::shouldRotate()
|
||||
{
|
||||
return mCurrentSizeInBytes > mMaxSizeInBytes;
|
||||
}
|
||||
|
||||
// Algorithm assumes backups will be named filename.X, where 1 <= X <= mBackupsCount.
|
||||
// All X's will be shifted up.
|
||||
void QsLogging::SizeRotationStrategy::rotate()
|
||||
{
|
||||
if (!mBackupsCount) {
|
||||
if (!QFile::remove(mFileName))
|
||||
std::cerr << "QsLog: backup delete failed " << qPrintable(mFileName);
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. find the last existing backup than can be shifted up
|
||||
const QString logNamePattern = mFileName + QString::fromUtf8(".%1");
|
||||
int lastExistingBackupIndex = 0;
|
||||
for (int i = 1;i <= mBackupsCount;++i) {
|
||||
const QString backupFileName = logNamePattern.arg(i);
|
||||
if (QFile::exists(backupFileName))
|
||||
lastExistingBackupIndex = qMin(i, mBackupsCount - 1);
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
// 2. shift up
|
||||
for (int i = lastExistingBackupIndex;i >= 1;--i) {
|
||||
const QString oldName = logNamePattern.arg(i);
|
||||
const QString newName = logNamePattern.arg(i + 1);
|
||||
QFile::remove(newName);
|
||||
const bool renamed = QFile::rename(oldName, newName);
|
||||
if (!renamed) {
|
||||
std::cerr << "QsLog: could not rename backup " << qPrintable(oldName)
|
||||
<< " to " << qPrintable(newName);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. rename current log file
|
||||
const QString newName = logNamePattern.arg(1);
|
||||
if (QFile::exists(newName))
|
||||
QFile::remove(newName);
|
||||
if (!QFile::rename(mFileName, newName)) {
|
||||
std::cerr << "QsLog: could not rename log " << qPrintable(mFileName)
|
||||
<< " to " << qPrintable(newName);
|
||||
}
|
||||
}
|
||||
|
||||
QIODevice::OpenMode QsLogging::SizeRotationStrategy::recommendedOpenModeFlag()
|
||||
{
|
||||
return QIODevice::Append;
|
||||
}
|
||||
|
||||
void QsLogging::SizeRotationStrategy::setMaximumSizeInBytes(qint64 size)
|
||||
{
|
||||
Q_ASSERT(size >= 0);
|
||||
mMaxSizeInBytes = size;
|
||||
}
|
||||
|
||||
void QsLogging::SizeRotationStrategy::setBackupCount(int backups)
|
||||
{
|
||||
Q_ASSERT(backups >= 0);
|
||||
mBackupsCount = qMin(backups, SizeRotationStrategy::MaxBackupCount);
|
||||
}
|
||||
|
||||
|
||||
QsLogging::FileDestination::FileDestination(const QString& filePath, RotationStrategyPtr rotationStrategy)
|
||||
: mRotationStrategy(rotationStrategy)
|
||||
{
|
||||
mFile.setFileName(filePath);
|
||||
if (!mFile.open(QFile::WriteOnly | QFile::Text | mRotationStrategy->recommendedOpenModeFlag()))
|
||||
std::cerr << "QsLog: could not open log file " << qPrintable(filePath);
|
||||
mOutputStream.setDevice(&mFile);
|
||||
/*mOutputStream.setCodec(QTextCodec::codecForName("UTF-8"));*/
|
||||
|
||||
mRotationStrategy->setInitialInfo(mFile);
|
||||
}
|
||||
|
||||
void QsLogging::FileDestination::write(const QString& message, Level)
|
||||
{
|
||||
mRotationStrategy->includeMessageInCalculation(message);
|
||||
if (mRotationStrategy->shouldRotate()) {
|
||||
mOutputStream.setDevice(NULL);
|
||||
mFile.close();
|
||||
mRotationStrategy->rotate();
|
||||
if (!mFile.open(QFile::WriteOnly | QFile::Text | mRotationStrategy->recommendedOpenModeFlag()))
|
||||
std::cerr << "QsLog: could not reopen log file " << qPrintable(mFile.fileName());
|
||||
mRotationStrategy->setInitialInfo(mFile);
|
||||
mOutputStream.setDevice(&mFile);
|
||||
}
|
||||
|
||||
mOutputStream << message << Qt::endl;
|
||||
mOutputStream.flush();
|
||||
}
|
||||
|
||||
bool QsLogging::FileDestination::isValid()
|
||||
{
|
||||
return mFile.isOpen();
|
||||
}
|
||||
|
||||
101
Applications/qModMaster/3rdparty/QsLog/QsLogDestFile.h
vendored
Normal file
101
Applications/qModMaster/3rdparty/QsLog/QsLogDestFile.h
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#ifndef QSLOGDESTFILE_H
|
||||
#define QSLOGDESTFILE_H
|
||||
|
||||
#include "QsLogDest.h"
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#include <QtGlobal>
|
||||
#include <QSharedPointer>
|
||||
|
||||
namespace QsLogging
|
||||
{
|
||||
class RotationStrategy
|
||||
{
|
||||
public:
|
||||
virtual ~RotationStrategy();
|
||||
|
||||
virtual void setInitialInfo(const QFile &file) = 0;
|
||||
virtual void includeMessageInCalculation(const QString &message) = 0;
|
||||
virtual bool shouldRotate() = 0;
|
||||
virtual void rotate() = 0;
|
||||
virtual QIODevice::OpenMode recommendedOpenModeFlag() = 0;
|
||||
};
|
||||
|
||||
// Never rotates file, overwrites existing file.
|
||||
class NullRotationStrategy : public RotationStrategy
|
||||
{
|
||||
public:
|
||||
virtual void setInitialInfo(const QFile &) {}
|
||||
virtual void includeMessageInCalculation(const QString &) {}
|
||||
virtual bool shouldRotate() { return false; }
|
||||
virtual void rotate() {}
|
||||
virtual QIODevice::OpenMode recommendedOpenModeFlag() { return QIODevice::Truncate; }
|
||||
};
|
||||
|
||||
// Rotates after a size is reached, keeps a number of <= 10 backups, appends to existing file.
|
||||
class SizeRotationStrategy : public RotationStrategy
|
||||
{
|
||||
public:
|
||||
SizeRotationStrategy();
|
||||
static const int MaxBackupCount;
|
||||
|
||||
virtual void setInitialInfo(const QFile &file);
|
||||
virtual void includeMessageInCalculation(const QString &message);
|
||||
virtual bool shouldRotate();
|
||||
virtual void rotate();
|
||||
virtual QIODevice::OpenMode recommendedOpenModeFlag();
|
||||
|
||||
void setMaximumSizeInBytes(qint64 size);
|
||||
void setBackupCount(int backups);
|
||||
|
||||
private:
|
||||
QString mFileName;
|
||||
qint64 mCurrentSizeInBytes;
|
||||
qint64 mMaxSizeInBytes;
|
||||
int mBackupsCount;
|
||||
};
|
||||
|
||||
typedef QSharedPointer<RotationStrategy> RotationStrategyPtr;
|
||||
|
||||
// file message sink
|
||||
class FileDestination : public Destination
|
||||
{
|
||||
public:
|
||||
FileDestination(const QString& filePath, RotationStrategyPtr rotationStrategy);
|
||||
virtual void write(const QString& message, Level level);
|
||||
virtual bool isValid();
|
||||
|
||||
private:
|
||||
QFile mFile;
|
||||
QTextStream mOutputStream;
|
||||
QSharedPointer<RotationStrategy> mRotationStrategy;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // QSLOGDESTFILE_H
|
||||
22
Applications/qModMaster/3rdparty/QsLog/QsLogDisableForThisFile.h
vendored
Normal file
22
Applications/qModMaster/3rdparty/QsLog/QsLogDisableForThisFile.h
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef QSLOGDISABLEFORTHISFILE_H
|
||||
#define QSLOGDISABLEFORTHISFILE_H
|
||||
|
||||
#include <QtDebug>
|
||||
// When included AFTER QsLog.h, this file will disable logging in that C++ file. When included
|
||||
// before, it will lead to compiler warnings or errors about macro redefinitions.
|
||||
|
||||
#undef QLOG_TRACE
|
||||
#undef QLOG_DEBUG
|
||||
#undef QLOG_INFO
|
||||
#undef QLOG_WARN
|
||||
#undef QLOG_ERROR
|
||||
#undef QLOG_FATAL
|
||||
|
||||
#define QLOG_TRACE() if (1) {} else qDebug()
|
||||
#define QLOG_DEBUG() if (1) {} else qDebug()
|
||||
#define QLOG_INFO() if (1) {} else qDebug()
|
||||
#define QLOG_WARN() if (1) {} else qDebug()
|
||||
#define QLOG_ERROR() if (1) {} else qDebug()
|
||||
#define QLOG_FATAL() if (1) {} else qDebug()
|
||||
|
||||
#endif // QSLOGDISABLEFORTHISFILE_H
|
||||
45
Applications/qModMaster/3rdparty/QsLog/QsLogLevel.h
vendored
Normal file
45
Applications/qModMaster/3rdparty/QsLog/QsLogLevel.h
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
// Copyright (c) 2013, Razvan Petru
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
|
||||
// * Redistributions of source code must retain the above copyright notice, this
|
||||
// list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice, this
|
||||
// list of conditions and the following disclaimer in the documentation and/or other
|
||||
// materials provided with the distribution.
|
||||
// * The name of the contributors may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
// OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#ifndef QSLOGLEVEL_H
|
||||
#define QSLOGLEVEL_H
|
||||
|
||||
namespace QsLogging
|
||||
{
|
||||
|
||||
enum Level
|
||||
{
|
||||
TraceLevel = 0,
|
||||
DebugLevel,
|
||||
InfoLevel,
|
||||
WarnLevel,
|
||||
ErrorLevel,
|
||||
FatalLevel,
|
||||
OffLevel
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // QSLOGLEVEL_H
|
||||
34
Applications/qModMaster/3rdparty/QsLog/QsLogReadme.txt
vendored
Normal file
34
Applications/qModMaster/3rdparty/QsLog/QsLogReadme.txt
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
QsLog - the simple Qt logger
|
||||
|
||||
QsLog is an easy to use logger that is based on Qt's QDebug class.
|
||||
Features
|
||||
|
||||
Six logging levels (from trace to fatal)
|
||||
Logging level threshold configurable at runtime.
|
||||
Minimum overhead when logging is turned off.
|
||||
Supports multiple destinations, comes with file and debug destinations.
|
||||
Thread-safe
|
||||
Supports logging of common Qt types out of the box.
|
||||
Small dependency: just drop it in your project directly.
|
||||
|
||||
Usage
|
||||
|
||||
Include QsLog.h. Include QsLogDest.h only where you create/add destinations.
|
||||
Get the instance of the logger by calling QsLogging::Logger::instance();
|
||||
Optionally set the logging level. Info is default.
|
||||
Create as many destinations as you want by using the QsLogging::DestinationFactory.
|
||||
Add the destinations to the logger instance by calling addDestination.
|
||||
|
||||
Disabling logging
|
||||
|
||||
Sometimes it's necessary to turn off logging. This can be done in several ways:
|
||||
|
||||
globally, at compile time, by enabling the QS_LOG_DISABLE macro in the supplied .pri file.
|
||||
globally, at run time, by setting the log level to "OffLevel".
|
||||
per file, at compile time, by including QsLogDisableForThisFile.h in the target file.
|
||||
|
||||
Thread safety
|
||||
|
||||
The Qt docs say: A thread-safe function can be called simultaneously from multiple threads, even when the invocations use shared data, because all references to the shared data are serialized. A reentrant function can also be called simultaneously from multiple threads, but only if each invocation uses its own data.
|
||||
|
||||
Since sending the log message to the destinations is protected by a mutex, the logging macros are thread-safe provided that the log has been initialized - i.e: instance() has been called. The instance function and the setup functions (e.g: setLoggingLevel, addDestination) are NOT thread-safe and are NOT reentrant.
|
||||
40
Applications/qModMaster/3rdparty/QsLog/examplemain.cpp
vendored
Normal file
40
Applications/qModMaster/3rdparty/QsLog/examplemain.cpp
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
#include "QsLog.h"
|
||||
#include "QsLogDest.h"
|
||||
#include <QtCore/QCoreApplication>
|
||||
#include <QtCore/QDir>
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication a(argc, argv);
|
||||
|
||||
// init the logging mechanism
|
||||
QsLogging::Logger& logger = QsLogging::Logger::instance();
|
||||
logger.setLoggingLevel(QsLogging::TraceLevel);
|
||||
const QString sLogPath(QDir(a.applicationDirPath()).filePath("log.txt"));
|
||||
|
||||
QsLogging::DestinationPtr fileDestination(
|
||||
QsLogging::DestinationFactory::MakeFileDestination(sLogPath, true, 512, 2) );
|
||||
QsLogging::DestinationPtr debugDestination(
|
||||
QsLogging::DestinationFactory::MakeDebugOutputDestination() );
|
||||
logger.addDestination(debugDestination);
|
||||
logger.addDestination(fileDestination);
|
||||
|
||||
QLOG_INFO() << "Program started";
|
||||
QLOG_INFO() << "Built with Qt" << QT_VERSION_STR << "running on" << qVersion();
|
||||
|
||||
QLOG_TRACE() << "Here's a" << QString::fromUtf8("trace") << "message";
|
||||
QLOG_DEBUG() << "Here's a" << static_cast<int>(QsLogging::DebugLevel) << "message";
|
||||
QLOG_WARN() << "Uh-oh!";
|
||||
qDebug() << "This message won't be picked up by the logger";
|
||||
QLOG_ERROR() << "An error has occurred";
|
||||
qWarning() << "Neither will this one";
|
||||
QLOG_FATAL() << "Fatal error!";
|
||||
|
||||
logger.setLoggingLevel(QsLogging::OffLevel);
|
||||
for (int i = 0;i < 10000000;++i) {
|
||||
QLOG_ERROR() << QString::fromUtf8("logging is turned off");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
11
Applications/qModMaster/3rdparty/QsLog/log_example.pro
vendored
Normal file
11
Applications/qModMaster/3rdparty/QsLog/log_example.pro
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# -------------------------------------------------
|
||||
# Project created by QtCreator 2010-03-20T12:17:43
|
||||
# -------------------------------------------------
|
||||
QT -= gui
|
||||
TARGET = log_example
|
||||
CONFIG += console
|
||||
CONFIG -= app_bundle
|
||||
TEMPLATE = app
|
||||
SOURCES += \
|
||||
examplemain.cpp
|
||||
include(QsLog.pri)
|
||||
Reference in New Issue
Block a user