You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/drkonqi/krashconf.cpp

166 lines
6.1 KiB

/*****************************************************************
* drkonqi - The KDE Crash Handler
*
* Copyright (C) 2000-2003 Hans Petter Bieker <bieker@kde.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 <kconfig.h>
#include <kglobal.h>
#include <kaboutdata.h>
#include <kcmdlineargs.h>
#include <klocale.h>
#include <kdebug.h>
#include <kstartupinfo.h>
#include <dcopclient.h>
#include <kmacroexpander.h>
#include "krashconf.h"
KrashConfig :: KrashConfig()
{
setObjId("krashinfo");
readConfig();
}
KrashConfig :: ~KrashConfig()
{
delete m_aboutData;
}
ASYNC KrashConfig :: registerDebuggingApplication(const TQString& launchName)
{
emit newDebuggingApplication( launchName );
}
void KrashConfig :: acceptDebuggingApp()
{
acceptDebuggingApplication();
}
void KrashConfig :: readConfig()
{
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
m_signalnum = args->getOption( "signal" ).toInt();
m_pid = args->getOption( "pid" ).toInt();
m_startedByKdeinit = args->isSet("tdeinit");
m_safeMode = args->isSet("safer");
m_execname = args->getOption( "appname" );
if ( !args->getOption( "apppath" ).isEmpty() )
m_execname.prepend( args->getOption( "apppath" ) + '/' );
TQCString programname = args->getOption("programname");
if (programname.isEmpty())
programname.setStr(I18N_NOOP("unknown"));
// leak some memory... Well. It's only done once anyway :-)
const char * progname = qstrdup(programname);
m_aboutData = new KAboutData(args->getOption("appname"),
progname,
args->getOption("appversion"),
0, 0, 0, 0, 0,
args->getOption("bugaddress"));
TQCString startup_id( args->getOption( "startupid" ));
if (!startup_id.isEmpty())
{ // stop startup notification
KStartupInfoId id;
id.initId( startup_id );
KStartupInfo::sendFinish( id );
}
KConfig *config = KGlobal::config();
config->setGroup("drkonqi");
// maybe we should check if it's relative?
TQString configname = config->readEntry("ConfigName",
TQString::tqfromLatin1("enduser"));
TQString debuggername = config->readEntry("Debugger",
TQString::tqfromLatin1("gdb"));
KConfig debuggers(TQString::tqfromLatin1("debuggers/%1rc").arg(debuggername),
true, false, "appdata");
debuggers.setGroup("General");
m_debugger = debuggers.readPathEntry("Exec");
m_debuggerBatch = debuggers.readPathEntry("ExecBatch");
m_tryExec = debuggers.readPathEntry("TryExec");
m_backtraceCommand = debuggers.readEntry("BacktraceCommand");
m_removeFromBacktraceRegExp = debuggers.readEntry("RemoveFromBacktraceRegExp");
m_invalidStackFrameRegExp = debuggers.readEntry("InvalidStackFrameRegExp");
m_frameRegExp = debuggers.readEntry("FrameRegExp");
m_neededInValidBacktraceRegExp = debuggers.readEntry("NeededInValidBacktraceRegExp");
m_kcrashRegExp = debuggers.readEntry("KCrashRegExp");
KConfig preset(TQString::tqfromLatin1("presets/%1rc").arg(configname),
true, false, "appdata");
preset.setGroup("ErrorDescription");
if (preset.readBoolEntry("Enable"), true)
m_errorDescriptionText = preset.readEntry("Name");
preset.setGroup("WhatToDoHint");
if (preset.readBoolEntry("Enable"))
m_whatToDoText = preset.readEntry("Name");
preset.setGroup("General");
m_showbugreport = preset.readBoolEntry("ShowBugReportButton", false);
m_showdebugger = m_showbacktrace = m_pid != 0;
if (m_showbacktrace)
{
m_showbacktrace = preset.readBoolEntry("ShowBacktraceButton", true);
m_showdebugger = preset.readBoolEntry("ShowDebugButton", true);
}
m_disablechecks = preset.readBoolEntry("DisableChecks", false);
bool b = preset.readBoolEntry("SignalDetails", true);
TQString str = TQString::number(m_signalnum);
// use group unknown if signal not found
if (!preset.hasGroup(str))
str = TQString::tqfromLatin1("unknown");
preset.setGroup(str);
m_signalName = preset.readEntry("Name");
if (b)
m_signalText = preset.readEntry("Comment");
}
// replace some of the strings
void KrashConfig :: expandString(TQString &str, bool shell, const TQString &tempFile) const
{
TQMap<TQString,TQString> map;
map[TQString::tqfromLatin1("appname")] = TQString::tqfromLatin1(appName());
map[TQString::tqfromLatin1("execname")] = startedByKdeinit() ? TQString::tqfromLatin1("tdeinit") : m_execname;
map[TQString::tqfromLatin1("signum")] = TQString::number(signalNumber());
map[TQString::tqfromLatin1("signame")] = signalName();
map[TQString::tqfromLatin1("progname")] = programName();
map[TQString::tqfromLatin1("pid")] = TQString::number(pid());
map[TQString::tqfromLatin1("tempfile")] = tempFile;
if (shell)
str = KMacroExpander::expandMacrosShellQuote( str, map );
else
str = KMacroExpander::expandMacros( str, map );
}
#include "krashconf.moc"