summaryrefslogtreecommitdiffstats
path: root/src/corelib/global/qlogging.cpp
diff options
context:
space:
mode:
authorKai Koehne <kai.koehne@digia.com>2014-01-09 15:38:17 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-21 14:58:03 +0100
commitb8a38a6737acd670d92197ca5b009590d9fd8a9c (patch)
tree1b01d7a85a6f35cd420e3cef1bd50490988d7058 /src/corelib/global/qlogging.cpp
parentb152b425f74788b2f2845fb7d1a5032d86b8746d (diff)
Allow printf style for qCDebug, qCWarning, qCCritical macros
Add support for using qCDebug and friends in the 'printf style' way. This allows an almost mechanical conversion of existing qDebug, qWarning, qCritical macros, and allows avoiding the size overhead the streaming style incurs (mostly due to inlined QDebug code). To handle this gracefully we require variadic macros (part of C++11/C99). For compilers not supporting variadic macros we fall back to checking the category in QMessageLogger. [ChangeLog][QtCore][Logging] Allow qCDebug macros to be used in a printf style. Change-Id: I5a8fb135dca504e1d621bb67bf4b2a50c73d41b9 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/global/qlogging.cpp')
-rw-r--r--src/corelib/global/qlogging.cpp275
1 files changed, 273 insertions, 2 deletions
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index 23d046acf0..9cc525bd0e 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -46,10 +46,10 @@
#include "qvarlengtharray.h"
#include "qdebug.h"
#include "qmutex.h"
+#include "qloggingcategory.h"
#ifndef QT_BOOTSTRAPPED
#include "qcoreapplication.h"
#include "qthread.h"
-#include "qloggingcategory.h"
#include "private/qloggingregistry_p.h"
#endif
#ifdef Q_OS_WIN
@@ -270,6 +270,74 @@ void QMessageLogger::debug(const char *msg, ...) const
qt_message_fatal(QtDebugMsg, context, message);
}
+/*!
+ \typedef QMessageLogger::CategoryFunction
+
+ This is a typedef for a pointer to a function with the following
+ signature:
+
+ \snippet code/qlogging/qlogging.cpp 2
+
+ A function which this signature is generated by Q_DECLARE_LOGGING_CATEGORY,
+ Q_LOGGING_CATEGORY.
+
+ \since 5.3
+*/
+
+/*!
+ Logs a debug message specified with format \a msg for the context \a cat.
+ Additional parameters, specified by \a msg, may be used.
+
+ \since 5.3
+ \sa qCDebug()
+*/
+void QMessageLogger::debug(const QLoggingCategory &cat, const char *msg, ...) const
+{
+ if (!cat.isDebugEnabled())
+ return;
+
+ QMessageLogContext ctxt;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ QString message;
+
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtDebugMsg, ctxt, msg, ap, message);
+ va_end(ap);
+
+ if (isFatal(QtDebugMsg))
+ qt_message_fatal(QtDebugMsg, ctxt, message);
+}
+
+/*!
+ Logs a debug message specified with format \a msg for the context returned
+ by \a catFunc. Additional parameters, specified by \a msg, may be used.
+
+ \since 5.3
+ \sa qCDebug()
+*/
+void QMessageLogger::debug(QMessageLogger::CategoryFunction catFunc,
+ const char *msg, ...) const
+{
+ const QLoggingCategory &cat = (*catFunc)();
+
+ QMessageLogContext ctxt;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ QString message;
+
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtDebugMsg, ctxt, msg, ap, message);
+ va_end(ap);
+
+ if (isFatal(QtDebugMsg))
+ qt_message_fatal(QtDebugMsg, ctxt, message);
+}
+
#ifndef QT_NO_DEBUG_STREAM
/*!
@@ -286,6 +354,36 @@ QDebug QMessageLogger::debug() const
}
/*!
+ Logs a debug message into category \a cat using a QDebug stream.
+
+ \since 5.3
+ \sa qCDebug(), QDebug
+*/
+QDebug QMessageLogger::debug(const QLoggingCategory &cat) const
+{
+ QDebug dbg = QDebug(QtDebugMsg);
+ if (!cat.isDebugEnabled())
+ dbg.stream->message_output = false;
+
+ QMessageLogContext &ctxt = dbg.stream->context;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ return dbg;
+}
+
+/*!
+ Logs a debug message into category returned by \a catFunc using a QDebug stream.
+
+ \since 5.3
+ \sa qCDebug(), QDebug
+*/
+QDebug QMessageLogger::debug(QMessageLogger::CategoryFunction catFunc) const
+{
+ return debug((*catFunc)());
+}
+
+/*!
\internal
Returns a QNoDebug object, which is used to ignore debugging output.
@@ -319,9 +417,65 @@ void QMessageLogger::warning(const char *msg, ...) const
qt_message_fatal(QtWarningMsg, context, message);
}
+/*!
+ Logs a warning message specified with format \a msg for the context \a cat.
+ Additional parameters, specified by \a msg, may be used.
+
+ \since 5.3
+ \sa qCWarning()
+*/
+void QMessageLogger::warning(const QLoggingCategory &cat, const char *msg, ...) const
+{
+ if (!cat.isWarningEnabled())
+ return;
+
+ QMessageLogContext ctxt;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ QString message;
+
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtWarningMsg, ctxt, msg, ap, message);
+ va_end(ap);
+
+ if (isFatal(QtWarningMsg))
+ qt_message_fatal(QtWarningMsg, ctxt, message);
+}
+
+/*!
+ Logs a warning message specified with format \a msg for the context returned
+ by \a catFunc. Additional parameters, specified by \a msg, may be used.
+
+ \since 5.3
+ \sa qCWarning()
+*/
+void QMessageLogger::warning(QMessageLogger::CategoryFunction catFunc,
+ const char *msg, ...) const
+{
+ const QLoggingCategory &cat = (*catFunc)();
+ if (!cat.isWarningEnabled())
+ return;
+
+ QMessageLogContext ctxt;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ QString message;
+
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtWarningMsg, ctxt, msg, ap, message);
+ va_end(ap);
+
+ if (isFatal(QtWarningMsg))
+ qt_message_fatal(QtWarningMsg, ctxt, message);
+}
+
#ifndef QT_NO_DEBUG_STREAM
/*!
- Logs a debug message using a QDebug stream
+ Logs a warning message using a QDebug stream
\sa qWarning(), QDebug
*/
@@ -332,6 +486,36 @@ QDebug QMessageLogger::warning() const
ctxt.copy(context);
return dbg;
}
+
+/*!
+ Logs a warning message into category \a cat using a QDebug stream.
+
+ \sa qCWarning(), QDebug
+*/
+QDebug QMessageLogger::warning(const QLoggingCategory &cat) const
+{
+ QDebug dbg = QDebug(QtWarningMsg);
+ if (!cat.isWarningEnabled())
+ dbg.stream->message_output = false;
+
+ QMessageLogContext &ctxt = dbg.stream->context;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ return dbg;
+}
+
+/*!
+ Logs a warning message into category returned by \a catFunc using a QDebug stream.
+
+ \since 5.3
+ \sa qCWarning(), QDebug
+*/
+QDebug QMessageLogger::warning(QMessageLogger::CategoryFunction catFunc) const
+{
+ return warning((*catFunc)());
+}
+
#endif
#undef qCritical
@@ -355,6 +539,62 @@ void QMessageLogger::critical(const char *msg, ...) const
qt_message_fatal(QtCriticalMsg, context, message);
}
+/*!
+ Logs a critical message specified with format \a msg for the context \a cat.
+ Additional parameters, specified by \a msg, may be used.
+
+ \since 5.3
+ \sa qCCritical()
+*/
+void QMessageLogger::critical(const QLoggingCategory &cat, const char *msg, ...) const
+{
+ if (!cat.isCriticalEnabled())
+ return;
+
+ QMessageLogContext ctxt;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ QString message;
+
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtCriticalMsg, ctxt, msg, ap, message);
+ va_end(ap);
+
+ if (isFatal(QtCriticalMsg))
+ qt_message_fatal(QtCriticalMsg, ctxt, message);
+}
+
+/*!
+ Logs a critical message specified with format \a msg for the context returned
+ by \a catFunc. Additional parameters, specified by \a msg, may be used.
+
+ \since 5.3
+ \sa qCCritical()
+*/
+void QMessageLogger::critical(QMessageLogger::CategoryFunction catFunc,
+ const char *msg, ...) const
+{
+ const QLoggingCategory &cat = (*catFunc)();
+ if (!cat.isCriticalEnabled())
+ return;
+
+ QMessageLogContext ctxt;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ QString message;
+
+ va_list ap;
+ va_start(ap, msg); // use variable arg list
+ qt_message(QtCriticalMsg, ctxt, msg, ap, message);
+ va_end(ap);
+
+ if (isFatal(QtCriticalMsg))
+ qt_message_fatal(QtCriticalMsg, ctxt, message);
+}
+
#ifndef QT_NO_DEBUG_STREAM
/*!
Logs a critical message using a QDebug stream
@@ -368,6 +608,37 @@ QDebug QMessageLogger::critical() const
ctxt.copy(context);
return dbg;
}
+
+/*!
+ Logs a critical message into category \a cat using a QDebug stream.
+
+ \since 5.3
+ \sa qCCritical(), QDebug
+*/
+QDebug QMessageLogger::critical(const QLoggingCategory &cat) const
+{
+ QDebug dbg = QDebug(QtCriticalMsg);
+ if (!cat.isCriticalEnabled())
+ dbg.stream->message_output = false;
+
+ QMessageLogContext &ctxt = dbg.stream->context;
+ ctxt.copy(context);
+ ctxt.category = cat.categoryName();
+
+ return dbg;
+}
+
+/*!
+ Logs a critical message into category returned by \a catFunc using a QDebug stream.
+
+ \since 5.3
+ \sa qCCritical(), QDebug
+*/
+QDebug QMessageLogger::critical(QMessageLogger::CategoryFunction catFunc) const
+{
+ return critical((*catFunc)());
+}
+
#endif
#undef qFatal