Reshuffle code between qglobal, qlogging
authorKai Koehne <kai.koehne@nokia.com>
Fri, 10 Feb 2012 14:54:50 +0000 (15:54 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 13 Feb 2012 11:02:11 +0000 (12:02 +0100)
Make the content of the .h, .cpp files match.

Change-Id: Ib2506aeff74281ec4bcbf04d21da451038391203
Reviewed-by: David Faure <faure@kde.org>
src/corelib/global/qglobal.cpp
src/corelib/global/qglobal.h
src/corelib/global/qlogging.cpp
src/corelib/global/qlogging.h

index 983116f..58a3a6b 100644 (file)
 #include "qlist.h"
 #include "qthreadstorage.h"
 #include "qdir.h"
-#include "qstringlist.h"
 #include "qdatetime.h"
-#include "qdebug.h"
 
 #ifndef QT_NO_QOBJECT
 #include <private/qthread_p.h>
 #endif
 
-#include <stdio.h>
 #include <stdlib.h>
 #include <limits.h>
 #include <stdarg.h>
@@ -678,34 +675,6 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
-    \typedef QtMsgHandler
-    \relates <QtGlobal>
-    \deprecated
-
-    This is a typedef for a pointer to a function with the following
-    signature:
-
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 7
-
-    This typedef is deprecated, you should use QMessageHandler instead.
-    \sa QtMsgType, QMessageHandler, qInstallMsgHandler(), qInstallMessageHandler()
-*/
-
-/*!
-    \typedef QMessageHandler
-    \relates <QtGlobal>
-    \since 5.0
-
-    This is a typedef for a pointer to a function with the following
-    signature:
-
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 49
-
-    \sa QtMsgType, qInstallMessageHandler()
-*/
-
-
-/*!
     \enum QtMsgType
     \relates <QtGlobal>
 
@@ -1726,9 +1695,6 @@ Q_CORE_EXPORT unsigned int qt_int_sqrt(unsigned int n)
 void *qMemCopy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); }
 void *qMemSet(void *dest, int c, size_t n) { return memset(dest, c, n); }
 
-static QtMsgHandler msgHandler = 0;                // pointer to debug handler (without context)
-static QMessageHandler messageHandler = 0;         // pointer to debug handler (with context)
-
 #if !defined(Q_OS_WIN) && !defined(QT_NO_THREAD) && !defined(Q_OS_INTEGRITY) && !defined(Q_OS_QNX) && \
     defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L
 namespace {
@@ -1808,439 +1774,6 @@ QString qt_error_string(int errorCode)
     return ret.trimmed();
 }
 
-/*!
-    \fn QtMsgHandler qInstallMsgHandler(QtMsgHandler handler)
-    \relates <QtGlobal>
-    \deprecated
-
-    Installs a Qt message \a handler which has been defined
-    previously. This method is deprecated, use qInstallMessageHandler
-    instead.
-
-    \sa QtMsgHandler, qInstallMessageHandler
-*/
-
-/*!
-    \fn QMessageHandler qInstallMessageHandler(QMessageHandler handler)
-    \relates <QtGlobal>
-    \since 5.0
-
-    Installs a Qt message \a handler which has been defined
-    previously. Returns a pointer to the previous message handler
-    (which may be 0).
-
-    The message handler is a function that prints out debug messages,
-    warnings, critical and fatal error messages. The Qt library (debug
-    mode) contains hundreds of warning messages that are printed
-    when internal errors (usually invalid function arguments)
-    occur. Qt built in release mode also contains such warnings unless
-    QT_NO_WARNING_OUTPUT and/or QT_NO_DEBUG_OUTPUT have been set during
-    compilation. If you implement your own message handler, you get total
-    control of these messages.
-
-    The default message handler prints the message to the standard
-    output under X11 or to the debugger under Windows. If it is a
-    fatal message, the application aborts immediately.
-
-    Only one message handler can be defined, since this is usually
-    done on an application-wide basis to control debug output.
-
-    To restore the message handler, call \c qInstallMessageHandler(0).
-
-    Example:
-
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 23
-
-    \sa qDebug(), qWarning(), qCritical(), qFatal(), QtMsgType,
-    {Debugging Techniques}
-*/
-
-#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
-extern bool usingWinMain;
-extern Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char *str);
-extern Q_CORE_EXPORT void qWinMessageHandler(QtMsgType t, const QMessageLogContext &context,
-                                             const char *str);
-#endif
-
-// defined in qlogging.cpp
-extern Q_CORE_EXPORT QByteArray qMessageFormatString(QtMsgType type, const QMessageLogContext &context,
-                                                     const char *str);
-
-/*!
-    \internal
-*/
-static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &context, const char *buf)
-{
-    QByteArray logMessage = qMessageFormatString(type, context, buf);
-#if defined(Q_OS_WINCE)
-    QString fstr = QString::fromLocal8Bit(logMessage);
-    OutputDebugString(reinterpret_cast<const wchar_t *> (fstr.utf16()));
-#else
-    fprintf(stderr, "%s", logMessage.constData());
-    fflush(stderr);
-#endif
-}
-
-/*!
-    \internal
-*/
-static void qDefaultMsgHandler(QtMsgType type, const char *buf)
-{
-    QMessageLogContext emptyContext;
-    qDefaultMessageHandler(type, emptyContext, buf);
-}
-
-QMessageHandler qInstallMessageHandler(QMessageHandler h)
-{
-    if (!messageHandler)
-        messageHandler = qDefaultMessageHandler;
-    QMessageHandler old = messageHandler;
-    messageHandler = h;
-#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
-    if (!messageHandler && usingWinMain)
-        messageHandler = qWinMessageHandler;
-#endif
-    return old;
-}
-
-QtMsgHandler qInstallMsgHandler(QtMsgHandler h)
-{
-    //if handler is 0, set it to the
-    //default message handler
-    if (!msgHandler)
-        msgHandler = qDefaultMsgHandler;
-    QtMsgHandler old = msgHandler;
-    msgHandler = h;
-#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
-    if (!msgHandler && usingWinMain)
-        msgHandler = qWinMsgHandler;
-#endif
-    return old;
-}
-
-/*!
-    \internal
-*/
-void qt_message_output(QtMsgType msgType, const QMessageLogContext &context, const char *buf)
-{
-    if (!msgHandler)
-        msgHandler = qDefaultMsgHandler;
-    if (!messageHandler)
-        messageHandler = qDefaultMessageHandler;
-
-    // prefer new message handler over the old one
-    if (msgHandler == qDefaultMsgHandler
-            || messageHandler != qDefaultMessageHandler) {
-        (*messageHandler)(msgType, context, buf);
-    } else {
-        (*msgHandler)(msgType, buf);
-    }
-
-    if (msgType == QtFatalMsg
-        || (msgType == QtWarningMsg
-            && (!qgetenv("QT_FATAL_WARNINGS").isNull())) ) {
-
-#if defined(Q_CC_MSVC) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
-        // get the current report mode
-        int reportMode = _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW);
-        _CrtSetReportMode(_CRT_ERROR, reportMode);
-#if !defined(Q_OS_WINCE)
-        int ret = _CrtDbgReport(_CRT_ERROR, __FILE__, __LINE__, QT_VERSION_STR, buf);
-#else
-        int ret = _CrtDbgReportW(_CRT_ERROR, _CRT_WIDE(__FILE__),
-            __LINE__, _CRT_WIDE(QT_VERSION_STR), reinterpret_cast<const wchar_t *> (QString::fromLatin1(buf).utf16()));
-#endif
-        if (ret == 0  && reportMode & _CRTDBG_MODE_WNDW)
-            return; // ignore
-        else if (ret == 1)
-            _CrtDbgBreak();
-#endif
-
-#if (defined(Q_OS_UNIX) || defined(Q_CC_MINGW))
-        abort(); // trap; generates core dump
-#else
-        exit(1); // goodbye cruel world
-#endif
-    }
-}
-
-#if !defined(QT_NO_EXCEPTIONS)
-/*!
-    \internal
-    Uses a local buffer to output the message. Not locale safe + cuts off
-    everything after character 255, but will work in out of memory situations.
-*/
-static void qEmergencyOut(QtMsgType msgType, const char *msg, va_list ap)
-{
-    char emergency_buf[256] = { '\0' };
-    emergency_buf[255] = '\0';
-    if (msg)
-        qvsnprintf(emergency_buf, 255, msg, ap);
-    QMessageLogContext context;
-    qt_message_output(msgType, context, emergency_buf);
-}
-#endif
-
-/*!
-    \internal
-*/
-static void qt_message(QtMsgType msgType, const QMessageLogContext &context, const char *msg, va_list ap)
-{
-#if !defined(QT_NO_EXCEPTIONS)
-    if (std::uncaught_exception()) {
-        qEmergencyOut(msgType, msg, ap);
-        return;
-    }
-#endif
-    QByteArray buf;
-    if (msg) {
-        QT_TRY {
-            buf = QString().vsprintf(msg, ap).toLocal8Bit();
-        } QT_CATCH(const std::bad_alloc &) {
-#if !defined(QT_NO_EXCEPTIONS)
-            qEmergencyOut(msgType, msg, ap);
-            // don't rethrow - we use qWarning and friends in destructors.
-            return;
-#endif
-        }
-    }
-    qt_message_output(msgType, context, buf.constData());
-}
-
-#undef qDebug
-/*!
-    \fn qDebug(const char *message, ...)
-    \relates <QtGlobal>
-
-    Calls the message handler with the debug message \a msg. If no
-    message handler has been installed, the message is printed to
-    stderr. Under Windows, the message is sent to the console, if it is a
-    console application; otherwise, it is sent to the debugger. This
-    function does nothing if \c QT_NO_DEBUG_OUTPUT was defined
-    during compilation.
-
-    If you pass the function a format string and a list of arguments,
-    it works in similar way to the C printf() function. The format
-    should be a Latin-1 string.
-
-    Example:
-
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 24
-
-    If you include \c <QtDebug>, a more convenient syntax is also
-    available:
-
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 25
-
-    With this syntax, the function returns a QDebug object that is
-    configured to use the QtDebugMsg message type. It automatically
-    puts a single space between each item, and outputs a newline at
-    the end. It supports many C++ and Qt types.
-
-    To suppress the output at run-time, install your own message handler
-    with qInstallMessageHandler().
-
-    \sa qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
-        {Debugging Techniques}
-*/
-
-void QMessageLogger::debug(const char *msg, ...)
-{
-    va_list ap;
-    va_start(ap, msg); // use variable arg list
-    qt_message(QtDebugMsg, context, msg, ap);
-    va_end(ap);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-
-QDebug QMessageLogger::debug()
-{
-    QDebug dbg = QDebug(QtDebugMsg);
-    QMessageLogContext &ctxt = dbg.stream->context;
-    ctxt.file = context.file;
-    ctxt.line = context.line;
-    ctxt.function = context.function;
-    return dbg;
-}
-
-QNoDebug QMessageLogger::noDebug()
-{
-    return QNoDebug();
-}
-
-#endif
-
-#undef qWarning
-/*!
-    \fn qWarning(const char *message, ...)
-    \relates <QtGlobal>
-
-    Calls the message handler with the warning message \a msg. If no
-    message handler has been installed, the message is printed to
-    stderr. Under Windows, the message is sent to the debugger. This
-    function does nothing if \c QT_NO_WARNING_OUTPUT was defined
-    during compilation; it exits if the environment variable \c
-    QT_FATAL_WARNINGS is defined.
-
-    This function takes a format string and a list of arguments,
-    similar to the C printf() function. The format should be a Latin-1
-    string.
-
-    Example:
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 26
-
-    If you include <QtDebug>, a more convenient syntax is
-    also available:
-
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 27
-
-    This syntax inserts a space between each item, and
-    appends a newline at the end.
-
-    To suppress the output at runtime, install your own message handler
-    with qInstallMessageHandler().
-
-    \sa qDebug(), qCritical(), qFatal(), qInstallMessageHandler(),
-        {Debugging Techniques}
-*/
-
-void QMessageLogger::warning(const char *msg, ...)
-{
-    va_list ap;
-    va_start(ap, msg); // use variable arg list
-    qt_message(QtWarningMsg, context, msg, ap);
-    va_end(ap);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug QMessageLogger::warning()
-{
-    QDebug dbg = QDebug(QtWarningMsg);
-    QMessageLogContext &ctxt = dbg.stream->context;
-    ctxt.file = context.file;
-    ctxt.line = context.line;
-    ctxt.function = context.function;
-    return dbg;
-}
-#endif
-
-#undef qCritical
-/*!
-    \fn qCritical(const char *message, ...)
-    \relates <QtGlobal>
-
-    Calls the message handler with the critical message \a msg. If no
-    message handler has been installed, the message is printed to
-    stderr. Under Windows, the message is sent to the debugger.
-
-    This function takes a format string and a list of arguments,
-    similar to the C printf() function. The format should be a Latin-1
-    string.
-
-    Example:
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 28
-
-    If you include <QtDebug>, a more convenient syntax is
-    also available:
-
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 29
-
-    A space is inserted between the items, and a newline is
-    appended at the end.
-
-    To suppress the output at runtime, install your own message handler
-    with qInstallMessageHandler().
-
-    \sa qDebug(), qWarning(), qFatal(), qInstallMessageHandler(),
-        {Debugging Techniques}
-*/
-
-void QMessageLogger::critical(const char *msg, ...)
-{
-    va_list ap;
-    va_start(ap, msg); // use variable arg list
-    qt_message(QtCriticalMsg, context, msg, ap);
-    va_end(ap);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug QMessageLogger::critical()
-{
-    QDebug dbg = QDebug(QtCriticalMsg);
-    QMessageLogContext &ctxt = dbg.stream->context;
-    ctxt.file = context.file;
-    ctxt.line = context.line;
-    ctxt.function = context.function;
-    return dbg;
-}
-#endif
-
-void qErrnoWarning(const char *msg, ...)
-{
-    // qt_error_string() will allocate anyway, so we don't have
-    // to be careful here (like we do in plain qWarning())
-    QString buf;
-    va_list ap;
-    va_start(ap, msg);
-    if (msg)
-        buf.vsprintf(msg, ap);
-    va_end(ap);
-
-    QMessageLogger().critical("%s (%s)", buf.toLocal8Bit().constData(),
-                             qt_error_string(-1).toLocal8Bit().constData());
-}
-
-void qErrnoWarning(int code, const char *msg, ...)
-{
-    // qt_error_string() will allocate anyway, so we don't have
-    // to be careful here (like we do in plain qWarning())
-    QString buf;
-    va_list ap;
-    va_start(ap, msg);
-    if (msg)
-        buf.vsprintf(msg, ap);
-    va_end(ap);
-
-    QMessageLogger().critical("%s (%s)", buf.toLocal8Bit().constData(),
-                             qt_error_string(code).toLocal8Bit().constData());
-}
-
-#undef qFatal
-/*!
-    \fn qFatal(const char *message, ...)
-    \relates <QtGlobal>
-
-    Calls the message handler with the fatal message \a msg. If no
-    message handler has been installed, the message is printed to
-    stderr. Under Windows, the message is sent to the debugger.
-
-    If you are using the \bold{default message handler} this function will
-    abort on Unix systems to create a core dump. On Windows, for debug builds,
-    this function will report a _CRT_ERROR enabling you to connect a debugger
-    to the application.
-
-    This function takes a format string and a list of arguments,
-    similar to the C printf() function.
-
-    Example:
-    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 30
-
-    To suppress the output at runtime, install your own message handler
-    with qInstallMessageHandler().
-
-    \sa qDebug(), qCritical(), qWarning(), qInstallMessageHandler(),
-        {Debugging Techniques}
-*/
-
-void QMessageLogger::fatal(const char *msg, ...)
-{
-    va_list ap;
-    va_start(ap, msg); // use variable arg list
-    qt_message(QtFatalMsg, context, msg, ap);
-    va_end(ap);
-}
-
 // getenv is declared as deprecated in VS2005. This function
 // makes use of the new secure getenv function.
 /*!
index 0e45093..4566240 100644 (file)
@@ -992,10 +992,6 @@ inline void qUnused(T &x) { (void)x; }
 
 class QString;
 Q_CORE_EXPORT QString qt_error_string(int errorCode = -1);
-
-Q_CORE_EXPORT void qErrnoWarning(int code, const char *msg, ...);
-Q_CORE_EXPORT void qErrnoWarning(const char *msg, ...);
-
 Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line);
 
 #if !defined(Q_ASSERT)
index 164b846..8a75f5a 100644 (file)
@@ -44,6 +44,7 @@
 #include "qbytearray.h"
 #include "qstring.h"
 #include "qvarlengtharray.h"
+#include "qdebug.h"
 
 #include <stdio.h>
 
@@ -79,6 +80,254 @@ QT_BEGIN_NAMESPACE
     \sa QMessageLogContext, qDebug(), qWarning(), qCritical(), qFatal()
 */
 
+#if !defined(QT_NO_EXCEPTIONS)
+/*!
+    \internal
+    Uses a local buffer to output the message. Not locale safe + cuts off
+    everything after character 255, but will work in out of memory situations.
+*/
+static void qEmergencyOut(QtMsgType msgType, const char *msg, va_list ap)
+{
+    char emergency_buf[256] = { '\0' };
+    emergency_buf[255] = '\0';
+    if (msg)
+        qvsnprintf(emergency_buf, 255, msg, ap);
+    QMessageLogContext context;
+    qt_message_output(msgType, context, emergency_buf);
+}
+#endif
+
+/*!
+    \internal
+*/
+static void qt_message(QtMsgType msgType, const QMessageLogContext &context, const char *msg,
+                       va_list ap)
+{
+#if !defined(QT_NO_EXCEPTIONS)
+    if (std::uncaught_exception()) {
+        qEmergencyOut(msgType, msg, ap);
+        return;
+    }
+#endif
+    QByteArray buf;
+    if (msg) {
+        QT_TRY {
+            buf = QString().vsprintf(msg, ap).toLocal8Bit();
+        } QT_CATCH(const std::bad_alloc &) {
+#if !defined(QT_NO_EXCEPTIONS)
+            qEmergencyOut(msgType, msg, ap);
+            // don't rethrow - we use qWarning and friends in destructors.
+            return;
+#endif
+        }
+    }
+    qt_message_output(msgType, context, buf.constData());
+}
+
+#undef qDebug
+/*!
+    \fn qDebug(const char *message, ...)
+    \relates <QtGlobal>
+
+    Calls the message handler with the debug message \a msg. If no
+    message handler has been installed, the message is printed to
+    stderr. Under Windows, the message is sent to the console, if it is a
+    console application; otherwise, it is sent to the debugger. This
+    function does nothing if \c QT_NO_DEBUG_OUTPUT was defined
+    during compilation.
+
+    If you pass the function a format string and a list of arguments,
+    it works in similar way to the C printf() function. The format
+    should be a Latin-1 string.
+
+    Example:
+
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 24
+
+    If you include \c <QtDebug>, a more convenient syntax is also
+    available:
+
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 25
+
+    With this syntax, the function returns a QDebug object that is
+    configured to use the QtDebugMsg message type. It automatically
+    puts a single space between each item, and outputs a newline at
+    the end. It supports many C++ and Qt types.
+
+    To suppress the output at run-time, install your own message handler
+    with qInstallMessageHandler().
+
+    \sa qWarning(), qCritical(), qFatal(), qInstallMessageHandler(),
+        {Debugging Techniques}
+*/
+
+void QMessageLogger::debug(const char *msg, ...)
+{
+    va_list ap;
+    va_start(ap, msg); // use variable arg list
+    qt_message(QtDebugMsg, context, msg, ap);
+    va_end(ap);
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+QDebug QMessageLogger::debug()
+{
+    QDebug dbg = QDebug(QtDebugMsg);
+    QMessageLogContext &ctxt = dbg.stream->context;
+    ctxt.file = context.file;
+    ctxt.line = context.line;
+    ctxt.function = context.function;
+    return dbg;
+}
+
+QNoDebug QMessageLogger::noDebug()
+{
+    return QNoDebug();
+}
+
+#endif
+
+#undef qWarning
+/*!
+    \fn qWarning(const char *message, ...)
+    \relates <QtGlobal>
+
+    Calls the message handler with the warning message \a msg. If no
+    message handler has been installed, the message is printed to
+    stderr. Under Windows, the message is sent to the debugger. This
+    function does nothing if \c QT_NO_WARNING_OUTPUT was defined
+    during compilation; it exits if the environment variable \c
+    QT_FATAL_WARNINGS is defined.
+
+    This function takes a format string and a list of arguments,
+    similar to the C printf() function. The format should be a Latin-1
+    string.
+
+    Example:
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 26
+
+    If you include <QtDebug>, a more convenient syntax is
+    also available:
+
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 27
+
+    This syntax inserts a space between each item, and
+    appends a newline at the end.
+
+    To suppress the output at runtime, install your own message handler
+    with qInstallMessageHandler().
+
+    \sa qDebug(), qCritical(), qFatal(), qInstallMessageHandler(),
+        {Debugging Techniques}
+*/
+
+void QMessageLogger::warning(const char *msg, ...)
+{
+    va_list ap;
+    va_start(ap, msg); // use variable arg list
+    qt_message(QtWarningMsg, context, msg, ap);
+    va_end(ap);
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug QMessageLogger::warning()
+{
+    QDebug dbg = QDebug(QtWarningMsg);
+    QMessageLogContext &ctxt = dbg.stream->context;
+    ctxt.file = context.file;
+    ctxt.line = context.line;
+    ctxt.function = context.function;
+    return dbg;
+}
+#endif
+
+#undef qCritical
+/*!
+    \fn qCritical(const char *message, ...)
+    \relates <QtGlobal>
+
+    Calls the message handler with the critical message \a msg. If no
+    message handler has been installed, the message is printed to
+    stderr. Under Windows, the message is sent to the debugger.
+
+    This function takes a format string and a list of arguments,
+    similar to the C printf() function. The format should be a Latin-1
+    string.
+
+    Example:
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 28
+
+    If you include <QtDebug>, a more convenient syntax is
+    also available:
+
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 29
+
+    A space is inserted between the items, and a newline is
+    appended at the end.
+
+    To suppress the output at runtime, install your own message handler
+    with qInstallMessageHandler().
+
+    \sa qDebug(), qWarning(), qFatal(), qInstallMessageHandler(),
+        {Debugging Techniques}
+*/
+
+void QMessageLogger::critical(const char *msg, ...)
+{
+    va_list ap;
+    va_start(ap, msg); // use variable arg list
+    qt_message(QtCriticalMsg, context, msg, ap);
+    va_end(ap);
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug QMessageLogger::critical()
+{
+    QDebug dbg = QDebug(QtCriticalMsg);
+    QMessageLogContext &ctxt = dbg.stream->context;
+    ctxt.file = context.file;
+    ctxt.line = context.line;
+    ctxt.function = context.function;
+    return dbg;
+}
+#endif
+
+#undef qFatal
+/*!
+    \fn qFatal(const char *message, ...)
+    \relates <QtGlobal>
+
+    Calls the message handler with the fatal message \a msg. If no
+    message handler has been installed, the message is printed to
+    stderr. Under Windows, the message is sent to the debugger.
+
+    If you are using the \bold{default message handler} this function will
+    abort on Unix systems to create a core dump. On Windows, for debug builds,
+    this function will report a _CRT_ERROR enabling you to connect a debugger
+    to the application.
+
+    This function takes a format string and a list of arguments,
+    similar to the C printf() function.
+
+    Example:
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 30
+
+    To suppress the output at runtime, install your own message handler
+    with qInstallMessageHandler().
+
+    \sa qDebug(), qCritical(), qWarning(), qInstallMessageHandler(),
+        {Debugging Techniques}
+*/
+
+void QMessageLogger::fatal(const char *msg, ...)
+{
+    va_list ap;
+    va_start(ap, msg); // use variable arg list
+    qt_message(QtFatalMsg, context, msg, ap);
+    va_end(ap);
+}
+
 /*!
     \internal
 */
@@ -345,7 +594,7 @@ Q_GLOBAL_STATIC(QMessagePattern, qMessagePattern)
     \internal
 */
 Q_CORE_EXPORT QByteArray qMessageFormatString(QtMsgType type, const QMessageLogContext &context,
-                                               const char *str)
+                                              const char *str)
 {
     QByteArray message;
 
@@ -389,4 +638,218 @@ Q_CORE_EXPORT QByteArray qMessageFormatString(QtMsgType type, const QMessageLogC
     return message;
 }
 
+static QtMsgHandler msgHandler = 0;                // pointer to debug handler (without context)
+static QMessageHandler messageHandler = 0;         // pointer to debug handler (with context)
+
+/*!
+    \internal
+*/
+static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &context,
+                                   const char *buf)
+{
+    QByteArray logMessage = qMessageFormatString(type, context, buf);
+#if defined(Q_OS_WINCE)
+    QString fstr = QString::fromLocal8Bit(logMessage);
+    OutputDebugString(reinterpret_cast<const wchar_t *> (fstr.utf16()));
+#else
+    fprintf(stderr, "%s", logMessage.constData());
+    fflush(stderr);
+#endif
+}
+
+/*!
+    \internal
+*/
+static void qDefaultMsgHandler(QtMsgType type, const char *buf)
+{
+    QMessageLogContext emptyContext;
+    qDefaultMessageHandler(type, emptyContext, buf);
+}
+
+/*!
+    \internal
+*/
+void qt_message_output(QtMsgType msgType, const QMessageLogContext &context, const char *buf)
+{
+    if (!msgHandler)
+        msgHandler = qDefaultMsgHandler;
+    if (!messageHandler)
+        messageHandler = qDefaultMessageHandler;
+
+    // prefer new message handler over the old one
+    if (msgHandler == qDefaultMsgHandler
+            || messageHandler != qDefaultMessageHandler) {
+        (*messageHandler)(msgType, context, buf);
+    } else {
+        (*msgHandler)(msgType, buf);
+    }
+
+    if (msgType == QtFatalMsg
+            || (msgType == QtWarningMsg
+                && (!qgetenv("QT_FATAL_WARNINGS").isNull())) ) {
+
+#if defined(Q_CC_MSVC) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR)
+        // get the current report mode
+        int reportMode = _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW);
+        _CrtSetReportMode(_CRT_ERROR, reportMode);
+#if !defined(Q_OS_WINCE)
+        int ret = _CrtDbgReport(_CRT_ERROR, __FILE__, __LINE__, QT_VERSION_STR, buf);
+#else
+        int ret = _CrtDbgReportW(_CRT_ERROR, _CRT_WIDE(__FILE__),
+                                 __LINE__, _CRT_WIDE(QT_VERSION_STR),
+                                 reinterpret_cast<const wchar_t *> (
+                                     QString::fromLatin1(buf).utf16()));
+#endif
+        if (ret == 0  && reportMode & _CRTDBG_MODE_WNDW)
+            return; // ignore
+        else if (ret == 1)
+            _CrtDbgBreak();
+#endif
+
+#if (defined(Q_OS_UNIX) || defined(Q_CC_MINGW))
+        abort(); // trap; generates core dump
+#else
+        exit(1); // goodbye cruel world
+#endif
+    }
+}
+
+void qErrnoWarning(const char *msg, ...)
+{
+    // qt_error_string() will allocate anyway, so we don't have
+    // to be careful here (like we do in plain qWarning())
+    QString buf;
+    va_list ap;
+    va_start(ap, msg);
+    if (msg)
+        buf.vsprintf(msg, ap);
+    va_end(ap);
+
+    QMessageLogger().critical("%s (%s)", buf.toLocal8Bit().constData(),
+                              qt_error_string(-1).toLocal8Bit().constData());
+}
+
+void qErrnoWarning(int code, const char *msg, ...)
+{
+    // qt_error_string() will allocate anyway, so we don't have
+    // to be careful here (like we do in plain qWarning())
+    QString buf;
+    va_list ap;
+    va_start(ap, msg);
+    if (msg)
+        buf.vsprintf(msg, ap);
+    va_end(ap);
+
+    QMessageLogger().critical("%s (%s)", buf.toLocal8Bit().constData(),
+                              qt_error_string(code).toLocal8Bit().constData());
+}
+
+#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
+extern bool usingWinMain;
+extern Q_CORE_EXPORT void qWinMsgHandler(QtMsgType t, const char *str);
+extern Q_CORE_EXPORT void qWinMessageHandler(QtMsgType t, const QMessageLogContext &context,
+                                             const char *str);
+#endif
+
+/*!
+    \typedef QtMsgHandler
+    \relates <QtGlobal>
+    \deprecated
+
+    This is a typedef for a pointer to a function with the following
+    signature:
+
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 7
+
+    This typedef is deprecated, you should use QMessageHandler instead.
+    \sa QtMsgType, QMessageHandler, qInstallMsgHandler(), qInstallMessageHandler()
+*/
+
+/*!
+    \typedef QMessageHandler
+    \relates <QtGlobal>
+    \since 5.0
+
+    This is a typedef for a pointer to a function with the following
+    signature:
+
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 49
+
+    \sa QtMsgType, qInstallMessageHandler()
+*/
+
+/*!
+    \fn QMessageHandler qInstallMessageHandler(QMessageHandler handler)
+    \relates <QtGlobal>
+    \since 5.0
+
+    Installs a Qt message \a handler which has been defined
+    previously. Returns a pointer to the previous message handler
+    (which may be 0).
+
+    The message handler is a function that prints out debug messages,
+    warnings, critical and fatal error messages. The Qt library (debug
+    mode) contains hundreds of warning messages that are printed
+    when internal errors (usually invalid function arguments)
+    occur. Qt built in release mode also contains such warnings unless
+    QT_NO_WARNING_OUTPUT and/or QT_NO_DEBUG_OUTPUT have been set during
+    compilation. If you implement your own message handler, you get total
+    control of these messages.
+
+    The default message handler prints the message to the standard
+    output under X11 or to the debugger under Windows. If it is a
+    fatal message, the application aborts immediately.
+
+    Only one message handler can be defined, since this is usually
+    done on an application-wide basis to control debug output.
+
+    To restore the message handler, call \c qInstallMessageHandler(0).
+
+    Example:
+
+    \snippet doc/src/snippets/code/src_corelib_global_qglobal.cpp 23
+
+    \sa qDebug(), qWarning(), qCritical(), qFatal(), QtMsgType,
+    {Debugging Techniques}
+*/
+
+QMessageHandler qInstallMessageHandler(QMessageHandler h)
+{
+    if (!messageHandler)
+        messageHandler = qDefaultMessageHandler;
+    QMessageHandler old = messageHandler;
+    messageHandler = h;
+#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
+    if (!messageHandler && usingWinMain)
+        messageHandler = qWinMessageHandler;
+#endif
+    return old;
+}
+
+/*!
+    \fn QtMsgHandler qInstallMsgHandler(QtMsgHandler handler)
+    \relates <QtGlobal>
+    \deprecated
+
+    Installs a Qt message \a handler which has been defined
+    previously. This method is deprecated, use qInstallMessageHandler
+    instead.
+    \sa QtMsgHandler, qInstallMessageHandler
+*/
+
+QtMsgHandler qInstallMsgHandler(QtMsgHandler h)
+{
+    //if handler is 0, set it to the
+    //default message handler
+    if (!msgHandler)
+        msgHandler = qDefaultMsgHandler;
+    QtMsgHandler old = msgHandler;
+    msgHandler = h;
+#if defined(Q_OS_WIN) && defined(QT_BUILD_CORE_LIB)
+    if (!msgHandler && usingWinMain)
+        msgHandler = qWinMsgHandler;
+#endif
+    return old;
+}
+
 QT_END_NAMESPACE
index 5ac6cc0..4de04bd 100644 (file)
@@ -67,7 +67,8 @@ class QMessageLogContext
     Q_DISABLE_COPY(QMessageLogContext)
 public:
     QMessageLogContext() : version(1), line(0), file(0), function(0) {}
-    Q_DECL_CONSTEXPR QMessageLogContext(const char *fileName, int lineNumber, const char *functionName)
+    Q_DECL_CONSTEXPR QMessageLogContext(const char *fileName, int lineNumber,
+                                        const char *functionName)
         : version(1), line(lineNumber), file(fileName), function(functionName) {}
 
     int version;
@@ -126,8 +127,6 @@ private:
     QMessageLogContext context;
 };
 
-Q_CORE_EXPORT void qt_message_output(QtMsgType, const QMessageLogContext &context, const char *buf);
-
 /*
   qDebug, qWarning, qCritical, qFatal are redefined to automatically include context information
  */
@@ -139,15 +138,20 @@ Q_CORE_EXPORT void qt_message_output(QtMsgType, const QMessageLogContext &contex
 #define QT_NO_QDEBUG_MACRO while (false) QMessageLogger().noDebug
 #define QT_NO_QWARNING_MACRO while (false) QMessageLogger().noDebug
 
-#ifdef QT_NO_DEBUG_OUTPUT
+#if defined(QT_NO_DEBUG_OUTPUT)
 #  undef qDebug
 #  define qDebug QT_NO_QDEBUG_MACRO
 #endif
-#ifdef QT_NO_WARNING_OUTPUT
+#if defined(QT_NO_WARNING_OUTPUT)
 #  undef qWarning
 #  define qWarning QT_NO_QWARNING_MACRO
 #endif
 
+Q_CORE_EXPORT void qt_message_output(QtMsgType, const QMessageLogContext &context, const char *buf);
+
+Q_CORE_EXPORT void qErrnoWarning(int code, const char *msg, ...);
+Q_CORE_EXPORT void qErrnoWarning(const char *msg, ...);
+
 // deprecated. Use qInstallMessageHandler instead!
 typedef void (*QtMsgHandler)(QtMsgType, const char *);
 Q_CORE_EXPORT QtMsgHandler qInstallMsgHandler(QtMsgHandler);