1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/******************************************************************************
*
* Copyright (C) 2002 Hugo PEREIRA <mailto: hugo.pereira@free.fr>
*
* This is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT
* Any WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
*******************************************************************************/
#include "ErrorHandler.h"
#include "Debug.h"
#include <QTextStream>
#include <cstdlib>
//_____________________________________________________________
void ErrorHandler::initialize()
{
#if QT_VERSION >= 0x050000
qInstallMessageHandler( _throw );
#else
qInstallMsgHandler( _throw );
#endif
}
//_____________________________________________________________
ErrorHandler& ErrorHandler::get()
{
static ErrorHandler singleton;
return singleton;
}
//_____________________________________________________________
void ErrorHandler::exit()
{
#if QT_VERSION >= 0x050000
qInstallMessageHandler( 0 );
#else
qInstallMsgHandler( 0 );
#endif
}
//_____________________________________________________________
#if QT_VERSION >= 0x050000
void ErrorHandler::_throw( QtMsgType type, const QMessageLogContext& context, const QString& message )
{
const QString fullMessage = QString( "%1 file: %2 line: %3 function: %4" )
.arg( message )
.arg( context.file )
.arg( context.line )
.arg( context.function );
_throw( type, qPrintable( fullMessage ) );
}
#endif
//_____________________________________________________________
void ErrorHandler::_throw( QtMsgType type, const char* message )
{
QString localMessage( message );
// check if message is to be disabled
bool disabled( false );
for( const auto& message:get()._disabledMessages() )
{
if( localMessage.indexOf( message ) >= 0 )
{
disabled = true;
break;
}
}
// check message type
QTextStream what( stderr );
switch ( type ) {
case QtDebugMsg: break;
case QtWarningMsg:
if( !disabled ) what << "ErrorHandler::Throw - warning: " << message << endl;
break;
case QtFatalMsg:
what << "ErrorHandler::Throw - fatal: " << message << endl;
disabled = false;
abort();
break;
default:
if( !disabled ) what << "ErrorHandler::Throw - unknown: " << message << endl;
break;
}
return;
}
//_______________________________________________________________
ErrorHandler::ErrorHandler()
{
// install 'default' disabled messages
disableMessage( "QSocketNotifier: invalid socket" );
disableMessage( "QServerSocket: failed to bind or listen to the socket" );
disableMessage( "QPixmap::resize: TODO: resize alpha data" );
disableMessage( "QPainterPath::arcTo: Adding arc where a parameter is NaN, results are undefined" );
disableMessage( "warning: Couldn't resolve property" );
disableMessage( "QProcess: Destroyed while process is still running" );
disableMessage( "QPainter::begin: Paint device returned engine == 0, type: 3" );
disableMessage( "QPainter::setCompositionMode: Painter not active" );
disableMessage( "QPainter::end: Painter not active, aborted" );
disableMessage( "QCoreApplication::postEvent: Unexpected null receiver" );
disableMessage( "Invalid entry (missing '=')" );
disableMessage( "KConfigIni" );
disableMessage( "Qt: Session management error: Could not open network socket" );
// QT5 specific messages
disableMessage( "void QWindow::setTransientParent" );
disableMessage( "QBackingStore::flush() called with non-exposed window" );
disableMessage( "QXcbClipboard: SelectionRequest too old" );
disableMessage( "QXcbConnection: XCB error: 8 (BadMatch)" );
}
|