⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kdebug.cpp

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 CPP
字号:
/* This file is part of the KDE libraries    Copyright (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org)    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Library General Public    License as published by the Free Software Foundation; either    version 2 of the License, or (at your option) any later version.    This library 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    Library General Public License for more details.    You should have received a copy of the GNU Library General Public License    along with this library; see the file COPYING.LIB.  If not, write to    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,    Boston, MA 02111-1307, USA.*/#include "kdebugdialog.h"#include "kdebug.h"#include "kapp.h"#include <qfile.h>#include <qmessagebox.h>#include <qlist.h>#include <qstring.h>#include <qtextstream.h>#include <stdlib.h>	// abort#include <stdarg.h>	// vararg stuff#include <syslog.h>#include <math.h>	// pow#ifdef HAVE_CONFIG_H#include <config.h>#endifclass KDebugEntry{ public:  KDebugEntry (int n, QString d) {number=n; descr=d.copy();}  KDebugEntry (QString d, int n) {number=n; descr=d.copy();}  unsigned int number;  QString descr;};static QList<KDebugEntry> *KDebugCache;#define MAX_CACHE 20QString getDescrFromNum(unsigned short _num){  QString data, filename(KApplication::kde_configdir()+"/kdebug.areas");  QFile file(filename);  QTextStream *ts;  unsigned long number, space;  bool longOK;  if (!KDebugCache)      KDebugCache = new QList<KDebugEntry>;  KDebugEntry *ent=0L;  for (ent=KDebugCache->first(); ent != 0; ent=KDebugCache->next()) {    if (ent->number == _num) {      return ent->descr.copy();    }  }   if (!file.open(IO_ReadOnly)) {    warning("Couldn't open %s", (const char *)filename);    file.close();    return "";  }  ts = new QTextStream(&file);  while (!ts->eof()) {    data=ts->readLine().stripWhiteSpace().copy();    if (data.left(1) == "#")      continue; // It's a comment    if (data.find("#") != -1) {      data.remove(data.find("#"), data.length());      data=data.stripWhiteSpace();    }    if (data.isEmpty() || data.isNull())      continue;    if ( (data.find(" ") == -1) && (data.find("	") == -1) )      continue; // It only has one "part", need two    if (data.find(" ") == -1)      space=data.find("	");    else if (data.find("	") == -1)      space=data.find(" ");    else if (data.find(" ") < data.find("	"))      space=data.find(" ");    else      space=data.find("	");    number=data.left(space).toULong(&longOK);    if (!longOK)      continue; // The first part wasn't a number    if (number != _num)      continue; // Not the number we're looking for    data.remove(0, space); data=data.stripWhiteSpace();    if (KDebugCache->count() <= MAX_CACHE)      KDebugCache->removeFirst();    KDebugCache->append(new KDebugEntry(number,data.copy()));    delete ts;    file.close();    return data.copy();  }  delete ts;  file.close();  return "";}void kdebug_null( ushort nLevel, ushort nArea,                          const char* pFormat, ... ){	return;}void kdebug( ushort nLevel, ushort nArea,                          const char* pFormat, ... ){#ifndef NO_DEBUG  // Save old group  QString aOldGroup = kapp->getConfig()->group();  kapp->getConfig()->setGroup( "KDebug" );    /* The QBitArrays should rather be application-static, but since         some stupid platforms do not support that... */  va_list arguments; /* Handle variable arguments */  /* Determine output */  short nOutput = 0;  int nPriority = 0; // for syslog  QString aCaption;  QString aAppName = getDescrFromNum(nArea).copy();  if (aAppName.isEmpty() || aAppName.isNull()) {    aAppName=kapp->appName().copy();  }  switch( nLevel )        {        case KDEBUG_INFO:          nOutput = kapp->getConfig()->readNumEntry( "InfoOutput", 4 );          aCaption = "Info (" + aAppName.copy() + ")";          nPriority = LOG_INFO;          break;        case KDEBUG_WARN:          nOutput = kapp->getConfig()->readNumEntry( "WarnOutput", 2 );          aCaption = "Warning (" + aAppName.copy() + ")";          nPriority = LOG_WARNING;          break;        case KDEBUG_FATAL:          nOutput = kapp->getConfig()->readNumEntry( "FatalOutput", 2 );          aCaption = "Fatal Error (" + aAppName.copy() + ")";          nPriority = LOG_CRIT;          break;        case KDEBUG_ERROR:        default:          /* Programmer error, use "Error" as default */          nOutput = kapp->getConfig()->readNumEntry( "ErrorOutput", 2 );          aCaption = "Error (" + aAppName.copy() + ")";          nPriority = LOG_ERR;          break;        };  // Output  switch( nOutput )        {        case 0: // File          {                QString aOutputFileName;                switch( nLevel )                  {                  case KDEBUG_INFO:                        aOutputFileName = kapp->getConfig()->readEntry( "InfoFilename",                                                                                                                        "kdebug.dbg" );                        break;                  case KDEBUG_WARN:                        aOutputFileName = kapp->getConfig()->readEntry( "WarnFilename",                                                                                                                        "kdebug.dbg" );                        break;                  case KDEBUG_FATAL:                        aOutputFileName = kapp->getConfig()->readEntry( "FatalFilename",                                                                                                                        "kdebug.dbg" );                        break;                  case KDEBUG_ERROR:                  default:                        aOutputFileName = kapp->getConfig()->readEntry( "ErrorFilename",                                                                                                                        "kdebug.dbg" );                        break;                  };                char buf[4096];                int nPrefix = sprintf( buf, "%s: ", aAppName.data() );                va_start( arguments, pFormat );#ifdef HAVE_VSNPRINTF                // use the more secure version if we have it                int nSize = vsnprintf( buf, 4095, pFormat, arguments );#else                int nSize = vsprintf( buf, pFormat, arguments );#endif                if( nSize > (4094-nPrefix) ) nSize = 4094-nPrefix;                buf[nSize] = '\n';                buf[nSize+1] = '\0';                va_end( arguments );                QFile aOutputFile( aOutputFileName );                aOutputFile.open( IO_WriteOnly );                aOutputFile.writeBlock( buf, nSize+2 );                aOutputFile.close();                break;          }        case 1: // Message Box          {                // Since we are in kdecore here, we cannot use KMsgBox and use                // QMessageBox instead                 char buf[4096]; // constants are evil, but this is evil code anyway                va_start( arguments, pFormat );                int nSize = vsprintf( buf, pFormat, arguments );                if( nSize > 4094 ) nSize = 4094;                buf[nSize] = '\n';                buf[nSize+1] = '\0';                va_end( arguments );                QMessageBox::message( aCaption, buf, "OK" );                break;          }        case 2: // Shell          {                va_start( arguments, pFormat );                fprintf( stderr, "%s: ", aAppName.data() );                vfprintf( stderr, pFormat, arguments );                fprintf( stderr, "\n" );                va_end( arguments );                break;          }        case 3: // syslog          {                char buf[4096];                int nPrefix = sprintf( buf, "%s: ", aAppName.data() );                va_start( arguments, pFormat );                int nSize = vsprintf( &buf[nPrefix], pFormat, arguments );                if( nSize > (4094-nPrefix) ) nSize = 4094-nPrefix;                buf[nSize] = '\n';                buf[nSize+1] = '\0';                va_end( arguments );                syslog( nPriority, buf );          }               case 4: // nothing          {          }        }  // check if we should abort  if( ( nLevel == KDEBUG_FATAL ) &&          ( kapp->getConfig()->readNumEntry( "AbortFatal", 0 ) ) )        abort();  // restore old group  kapp->getConfig()->setGroup( aOldGroup );#endif}KDebugDialog::KDebugDialog() :  QDialog( 0L, "Debug Settings", true ){  pInfoGroup = new QGroupBox( "Information", this );  pInfoGroup->setGeometry( 5, 10, 140, 185 );  pInfoGroup->show();  pInfoLabel1 = new QLabel( "Output to:", this );  pInfoLabel1->setGeometry( 15, 30, 120, 15 );  pInfoLabel1->show();  pInfoCombo = new QComboBox( false, this );  pInfoCombo->setGeometry( 15, 50, 120, 20 );  pInfoCombo->insertItem( "File" );  pInfoCombo->insertItem( "Message Box" );  pInfoCombo->insertItem( "Shell" );  pInfoCombo->insertItem( "Syslog" );  pInfoCombo->insertItem( "None" );  pInfoCombo->show();  pInfoLabel2 = new QLabel( "Filename:", this );  pInfoLabel2->setGeometry( 15, 85, 120, 15 );  pInfoLabel2->show();  pInfoFile = new QLineEdit( this );  pInfoFile->setGeometry( 15, 105, 120, 20 );  pInfoFile->show();  pInfoLabel3 = new QLabel( "Show only area(s):", this );  pInfoLabel3->setGeometry( 15, 140, 120, 15 );  pInfoLabel3->show();  pInfoShow = new QLineEdit( this );  pInfoShow->setGeometry( 15, 160, 120, 20 );  pInfoShow->show();    pWarnGroup = new QGroupBox( "Warning", this );  pWarnGroup->setGeometry( 165, 10, 140, 185 );  pWarnGroup->show();  pWarnLabel1 = new QLabel( "Output to:", this );  pWarnLabel1->setGeometry( 175, 30, 120, 15 );  pWarnLabel1->show();  pWarnCombo = new QComboBox( false, this );  pWarnCombo->setGeometry( 175, 50, 120, 20 );  pWarnCombo->insertItem( "File" );  pWarnCombo->insertItem( "Message Box" );  pWarnCombo->insertItem( "Shell" );  pWarnCombo->insertItem( "Syslog" );  pWarnCombo->insertItem( "None" );  pWarnCombo->show();  pWarnLabel2 = new QLabel( "Filename:", this );  pWarnLabel2->setGeometry( 175, 85, 120, 15 );  pWarnLabel2->show();  pWarnFile = new QLineEdit( this );  pWarnFile->setGeometry( 175, 105, 120, 20 );  pWarnFile->show();  pWarnLabel3 = new QLabel( "Show only area(s):", this );  pWarnLabel3->setGeometry( 175, 140, 120, 15 );  pWarnLabel3->show();  pWarnShow = new QLineEdit( this );  pWarnShow->setGeometry( 175, 160, 120, 20 );  pWarnShow->show();  pErrorGroup = new QGroupBox( "Error", this );  pErrorGroup->setGeometry( 5, 215, 140, 185 );  pErrorGroup->show();  pErrorLabel1 = new QLabel( "Output to:", this );  pErrorLabel1->setGeometry( 15, 235, 120, 15 );  pErrorLabel1->show();  pErrorCombo = new QComboBox( false, this );  pErrorCombo->setGeometry( 15, 255, 120, 20 );  pErrorCombo->insertItem( "File" );  pErrorCombo->insertItem( "Message Box" );  pErrorCombo->insertItem( "Shell" );  pErrorCombo->insertItem( "Syslog" );  pErrorCombo->insertItem( "None" );  pErrorCombo->show();  pErrorLabel2 = new QLabel( "Filename:", this );  pErrorLabel2->setGeometry( 15, 290, 120, 15 );  pErrorLabel2->show();  pErrorFile = new QLineEdit( this );  pErrorFile->setGeometry( 15, 310, 120, 20 );  pErrorFile->show();  pErrorLabel3 = new QLabel( "Show only area(s):", this );  pErrorLabel3->setGeometry( 15, 345, 120, 15 );  pErrorLabel3->show();  pErrorShow = new QLineEdit( this );  pErrorShow->setGeometry( 15, 365, 120, 20 );  pErrorShow->show();  pFatalGroup = new QGroupBox( "Fatal error", this );  pFatalGroup->setGeometry( 165, 215, 140, 185 );  pFatalGroup->show();  pFatalLabel1 = new QLabel( "Output to:", this );  pFatalLabel1->setGeometry( 175, 235, 120, 15 );  pFatalLabel1->show();  pFatalCombo = new QComboBox( false, this );  pFatalCombo->setGeometry( 175, 255, 120, 20 );  pFatalCombo->insertItem( "File" );  pFatalCombo->insertItem( "Message Box" );  pFatalCombo->insertItem( "Shell" );  pFatalCombo->insertItem( "Syslog" );  pFatalCombo->insertItem( "None" );  pFatalCombo->show();  pFatalLabel2 = new QLabel( "Filename:", this );  pFatalLabel2->setGeometry( 175, 290, 120, 15 );  pFatalLabel2->show();  pFatalFile = new QLineEdit( this );  pFatalFile->setGeometry( 175, 310, 100, 20 );  pFatalFile->show();  pFatalLabel3 = new QLabel( "Show only area(s):", this );  pFatalLabel3->setGeometry( 175, 345, 120, 15 );  pFatalLabel3->show();  pFatalShow = new QLineEdit( this );  pFatalShow->setGeometry( 175, 365, 120, 20 );  pFatalShow->show();  pAbortFatal = new QCheckBox( "Abort on fatal errors", this );  pAbortFatal->setGeometry( 15, 420, 200, 15 );  pAbortFatal->show();  pOKButton = new QPushButton( "OK", this );  pOKButton->setGeometry( 15, 460, 80, 20 );  pOKButton->setDefault( true );  pOKButton->show();  connect( pOKButton, SIGNAL( clicked() ), SLOT( accept() ) );  pCancelButton = new QPushButton( "Cancel", this );  pCancelButton->setGeometry( 110, 460, 80, 20 );  pCancelButton->show();  connect( pCancelButton, SIGNAL( clicked() ), SLOT( reject() ) );  pHelpButton = new QPushButton( "Help", this );  pHelpButton->setGeometry( 205, 460, 80, 20 );  pHelpButton->show();  connect( pHelpButton, SIGNAL( clicked() ), SLOT( showHelp() ) );}KDebugDialog::~KDebugDialog(){  delete pInfoGroup;  delete pInfoLabel1;  delete pInfoCombo;  delete pInfoLabel2;  delete pInfoFile;  delete pInfoLabel3;  delete pInfoShow;  delete pWarnGroup;  delete pWarnLabel1;  delete pWarnCombo;  delete pWarnLabel2;  delete pWarnFile;  delete pWarnLabel3;  delete pWarnShow;  delete pErrorGroup;  delete pErrorLabel1;  delete pErrorCombo;  delete pErrorLabel2;  delete pErrorFile;  delete pErrorLabel3;  delete pErrorShow;  delete pFatalGroup;  delete pFatalLabel1;  delete pFatalCombo;  delete pFatalLabel2;  delete pFatalFile;  delete pFatalLabel3;  delete pFatalShow;  delete pAbortFatal;  delete pOKButton;  delete pCancelButton;  delete pHelpButton;}void KDebugDialog::showHelp(){  kapp->invokeHTMLHelp( "kdelibs/kdebug.html", "" );}#include "kdebugdialog.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -