void KUiServerJobTracker::registerJob(KJob *job) { // Already registered job? if (d->progressJobView.contains(job)) { return; } KComponentData componentData = KGlobal::mainComponent(); QString programIconName = componentData.aboutData()->programIconName(); if (programIconName.isEmpty()) { programIconName = componentData.aboutData()->appName(); } QWeakPointer<KJob> jobWatch = job; QDBusReply<QDBusObjectPath> reply = serverProxy->uiserver().requestView(componentData.aboutData()->programName(), programIconName, job->capabilities()); // If we got a valid reply, register the interface for later usage. if (reply.isValid()) { org::kde::JobViewV2 *jobView = new org::kde::JobViewV2("org.kde.JobViewServer", reply.value().path(), QDBusConnection::sessionBus()); if (!jobWatch) { //kDebug() << "deleted out from under us when asking the server proxy for the view"; jobView->terminate(QString()); delete jobView; return; } QObject::connect(jobView, SIGNAL(cancelRequested()), this, SLOT(_k_killJob())); QObject::connect(jobView, SIGNAL(suspendRequested()), job, SLOT(suspend())); QObject::connect(jobView, SIGNAL(resumeRequested()), job, SLOT(resume())); QVariant destUrl = job->property("destUrl"); if (destUrl.isValid()) { jobView->setDestUrl(QDBusVariant(destUrl)); } if (!jobWatch) { //kDebug() << "deleted out from under us when creating the dbus interface"; jobView->terminate(QString()); delete jobView; return; } d->progressJobView.insert(job, jobView); } else if (!jobWatch) { qWarning() << "Uh-oh...KUiServerJobTracker was trying to forward a job, but it was deleted from under us." << "kuiserver *may* have a stranded job. we can't do anything about it because the returned objectPath is invalid."; return; } KJobTrackerInterface::registerJob(job); }
void KCrash::defaultCrashHandler (int sig) { // WABA: Do NOT use kDebug() in this function because it is much too risky! // Handle possible recursions static int crashRecursionCounter = 0; crashRecursionCounter++; // Nothing before this, please ! #if !defined(Q_OS_WIN) signal(SIGALRM, SIG_DFL); alarm(3); // Kill me... (in case we deadlock in malloc) #endif #ifdef Q_OS_SOLARIS (void) printstack(2 /* stderr, assuming it's still open. */); #endif if (crashRecursionCounter < 2) { if (s_emergencySaveFunction) { s_emergencySaveFunction (sig); } if ((s_flags & AutoRestart) && s_autoRestartCommand) { sleep(1); startProcess(s_autoRestartArgc, const_cast<const char**>(s_autoRestartCommandLine), false); } crashRecursionCounter++; } #if !defined(Q_OS_WIN) if (!(s_flags & KeepFDs)) closeAllFDs(); # if defined(Q_WS_X11) else if (QX11Info::display()) close(ConnectionNumber(QX11Info::display())); # endif #endif if (crashRecursionCounter < 3) { #ifndef NDEBUG fprintf(stderr, "KCrash: crashing... crashRecursionCounter = %d\n", crashRecursionCounter); fprintf(stderr, "KCrash: Application Name = %s path = %s pid = %lld\n", s_appName ? s_appName : "<unknown>" , s_appPath ? s_appPath : "<unknown>", QCoreApplication::applicationPid()); fprintf(stderr, "KCrash: Arguments: "); for (int i = 0; s_autoRestartCommandLine[i]; ++i) { fprintf(stderr, "%s ", s_autoRestartCommandLine[i]); } fprintf(stderr, "\n"); #else fprintf(stderr, "KCrash: Application '%s' crashing...\n", s_appName ? s_appName : "<unknown>"); #endif if (!s_launchDrKonqi) { setCrashHandler(0); #if !defined(Q_OS_WIN) raise(sig); // dump core, or whatever is the default action for this signal. #endif return; } const char * argv[27]; // don't forget to update this int i = 0; // argument 0 has to be drkonqi argv[i++] = s_drkonqiPath; #if defined Q_WS_X11 // start up on the correct display argv[i++] = "-display"; if ( QX11Info::display() ) argv[i++] = XDisplayString(QX11Info::display()); else argv[i++] = getenv("DISPLAY"); #elif defined(Q_WS_QWS) // start up on the correct display argv[i++] = "-display"; argv[i++] = getenv("QWS_DISPLAY"); #endif argv[i++] = "--appname"; argv[i++] = s_appName ? s_appName : "<unknown>"; if (KApplication::loadedByKdeinit) argv[i++] = "--kdeinit"; // only add apppath if it's not NULL if (s_appPath && *s_appPath) { argv[i++] = "--apppath"; argv[i++] = s_appPath; } // signal number -- will never be NULL char sigtxt[ 10 ]; sprintf( sigtxt, "%d", sig ); argv[i++] = "--signal"; argv[i++] = sigtxt; char pidtxt[ 20 ]; sprintf( pidtxt, "%lld", QCoreApplication::applicationPid()); argv[i++] = "--pid"; argv[i++] = pidtxt; const KComponentData componentData = KGlobal::mainComponent(); const KAboutData *about = componentData.isValid() ? componentData.aboutData() : 0; if (about) { if (about->internalVersion()) { argv[i++] = "--appversion"; argv[i++] = about->internalVersion(); } if (about->internalProgramName()) { argv[i++] = "--programname"; argv[i++] = about->internalProgramName(); } if (about->internalBugAddress()) { argv[i++] = "--bugaddress"; argv[i++] = about->internalBugAddress(); } } char sidtxt[256]; if ( kapp && !kapp->startupId().isNull()) { argv[i++] = "--startupid"; strlcpy(sidtxt, kapp->startupId().constData(), sizeof(sidtxt)); argv[i++] = sidtxt; } if ( s_flags & SaferDialog ) argv[i++] = "--safer"; if ((s_flags & AutoRestart) && s_autoRestartCommand) argv[i++] = "--restarted"; //tell drkonqi if the app has been restarted #if defined(Q_OS_WIN) char threadId[8] = { 0 }; sprintf( threadId, "%d", GetCurrentThreadId() ); argv[i++] = "--thread"; argv[i++] = threadId; #endif // NULL terminated list argv[i] = NULL; startProcess(i, argv, true); } if (crashRecursionCounter < 4) { fprintf(stderr, "Unable to start Dr. Konqi\n"); } _exit(255); }