author | zecke <zecke> | 2003-08-28 14:32:22 (UTC) |
---|---|---|
committer | zecke <zecke> | 2003-08-28 14:32:22 (UTC) |
commit | f3c6caca7e96488ad9e1873e9c853f11b17a944e (patch) (side-by-side diff) | |
tree | 4a83c306c573d5185f20c0f96f89aeffa24e2e1d | |
parent | a069f32d9339fad02af60ac8aa991c3dee011039 (diff) | |
download | opie-f3c6caca7e96488ad9e1873e9c853f11b17a944e.zip opie-f3c6caca7e96488ad9e1873e9c853f11b17a944e.tar.gz opie-f3c6caca7e96488ad9e1873e9c853f11b17a944e.tar.bz2 |
Make conpile with Opie
If QuickApps exec fails don't try to start it anytime soon
If application fails to start and /tmp/qcop-msg- is present don't try to restart
-rw-r--r-- | core/launcher/applauncher.cpp | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/core/launcher/applauncher.cpp b/core/launcher/applauncher.cpp index 50c1b71..d6f93da 100644 --- a/core/launcher/applauncher.cpp +++ b/core/launcher/applauncher.cpp @@ -26,9 +26,9 @@ #endif #ifndef QTOPIA_PROGRAM_MONITOR #define QTOPIA_PROGRAM_MONITOR #endif -#include <qtopia/qpeglobal.h> +#include <qtopia/global.h> #ifndef Q_OS_WIN32 #include <sys/stat.h> #include <sys/wait.h> @@ -60,8 +60,9 @@ #include <qtopia/global.h> #include "applauncher.h" #include "documentlist.h" +#include "launcherglobal.h" const int AppLauncher::RAISE_TIMEOUT_MS = 5000; //--------------------------------------------------------------------------- @@ -74,9 +75,9 @@ class AppStoppedEvent : public QCustomEvent { public: AppStoppedEvent(int pid, int status) : QCustomEvent( appStopEventID ), mPid(pid), mStatus(status) { } - + int pid() { return mPid; } int status() { return mStatus; } private: @@ -95,9 +96,9 @@ AppLauncher::AppLauncher(QObject *parent, const char *name) channel = new QCopChannel( "QPE/Server", this ); connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), this, SLOT(received(const QCString&, const QByteArray&)) ); - + #ifndef Q_OS_WIN32 signal(SIGCHLD, signalHandler); #else runningAppsProc.setAutoDelete( TRUE ); @@ -106,9 +107,9 @@ AppLauncher::AppLauncher(QObject *parent, const char *name) int pos = tmp.findRev('/'); if ( pos > -1 ) tmp = tmp.mid(++pos); runningApps[::getpid()] = tmp; - + appLauncherPtr = this; QTimer::singleShot( 1000, this, SLOT(createQuickLauncher()) ); } @@ -127,9 +128,9 @@ AppLauncher::~AppLauncher() } /* We use the QCopChannel of the app as an indicator of when it has been launched so that we can disable the busy indicators */ -void AppLauncher::newQcopChannel(const QString& channelName) +void AppLauncher::newQcopChannel(const QString& channelName) { // qDebug("channel %s added", channelName.data() ); QString prefix("QPE/Application/"); if (channelName.startsWith(prefix)) { @@ -150,9 +151,9 @@ void AppLauncher::newQcopChannel(const QString& channelName) qlReady = TRUE; } } -void AppLauncher::removedQcopChannel(const QString& channelName) +void AppLauncher::removedQcopChannel(const QString& channelName) { if (channelName.startsWith("QPE/Application/")) { QCopEnvelope e("QPE/System", "removedChannel(QString)"); e << channelName; @@ -258,9 +259,9 @@ bool AppLauncher::event(QEvent *e) AppStoppedEvent *ae = (AppStoppedEvent *) e; sigStopped(ae->pid(), ae->status() ); return TRUE; } - + return QObject::event(e); } void AppLauncher::timerEvent( QTimerEvent *e ) @@ -281,13 +282,13 @@ void AppLauncher::timerEvent( QTimerEvent *e ) // We store this incase the application responds while we're // waiting for user input so we know not to delete ourselves. appKillerBox = new QMessageBox(tr("Application Problem"), tr("<p>%1 is not responding.</p>").arg(appKillerName) + - tr("<p>Would you like to force the application to exit?</p>"), - QMessageBox::Warning, QMessageBox::Yes, - QMessageBox::No | QMessageBox::Default, + tr("<p>Would you like to force the application to exit?</p>"), + QMessageBox::Warning, QMessageBox::Yes, + QMessageBox::No | QMessageBox::Default, QMessageBox::NoButton); - if (appKillerBox->exec() == QMessageBox::Yes) { + if (appKillerBox->exec() == QMessageBox::Yes) { // qDebug("Killing the app!!! Bwuhahahaha!"); int pid = pidForName(appKillerName); if ( pid > 0 ) kill( pid ); @@ -301,13 +302,13 @@ void AppLauncher::timerEvent( QTimerEvent *e ) QObject::timerEvent( e ); } -#ifndef Q_OS_WIN32 +#ifndef Q_OS_WIN32 void AppLauncher::sigStopped(int sigPid, int sigStatus) { int exitStatus = 0; - + bool crashed = WIFSIGNALED(sigStatus); if ( !crashed ) { if ( WIFEXITED(sigStatus) ) exitStatus = WEXITSTATUS(sigStatus); @@ -363,14 +364,14 @@ void AppLauncher::sigStopped(int sigPid, int sigStatus) cfg.writeEntry("Apps",apps,','); preloadDisabled = TRUE; } - // clean up + // clean up if ( exitStatus ) { QCopEnvelope e("QPE/System", "notBusy(QString)"); e << app->exec(); } -/* +/* // debug info for (it = runningApps.begin(); it != runningApps.end(); ++it) { qDebug("running according to internal list: %s, with pid %d", (*it).data(), it.key() ); } @@ -395,26 +396,27 @@ void AppLauncher::sigStopped(int sigPid, int sigStatus) default: sig = QString("Unkown %1").arg(exitStatus); } if ( preloadDisabled ) sig += tr("<qt><p>Fast loading has been disabled for this application. Tap and hold the application icon to reenable it.</qt>"); - + QString str = tr("<qt><b>%1</b> was terminated due to signal code %2</qt>").arg( app->name() ).arg( sig ); QMessageBox::information(0, tr("Application terminated"), str ); } else { if ( exitStatus == 255 ) { //could not find app (because global returns -1) QMessageBox::information(0, tr("Application not found"), tr("<qt>Could not locate application <b>%1</b></qt>").arg( app->exec() ) ); } else { - QFileInfo fi(Global::tempDir() + "qcop-msg-" + appName); + QFileInfo fi(Opie::Global::tempDir() + "qcop-msg-" + appName); if ( fi.exists() && fi.size() ) { emit terminated(sigPid, appName); - execute( appName, QString::null ); + qWarning("Re executing obmitted for %s", appName.latin1() ); +// execute( appName, QString::null ); return; } } } #endif - + emit terminated(sigPid, appName); } #else void AppLauncher::sigStopped(int sigPid, int sigStatus) @@ -443,11 +445,11 @@ bool AppLauncher::isRunning(const QString &app) } bool AppLauncher::executeBuiltin(const QString &c, const QString &document) { - Global::Command* builtin = Global::builtinCommands(); - QGuardedPtr<QWidget> *running = Global::builtinRunning(); - + Global::Command* builtin = Opie::Global::builtinCommands(); + QGuardedPtr<QWidget> *running = Opie::Global::builtinRunning(); + // Attempt to execute the app using a builtin class for the app if (builtin) { for (int i = 0; builtin[i].file; i++) { if ( builtin[i].file == c ) { @@ -482,8 +484,9 @@ bool AppLauncher::executeBuiltin(const QString &c, const QString &document) } bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRaise) { + qWarning("AppLauncher::execute"); // Convert the command line in to a list of arguments QStringList list = QStringList::split(QRegExp(" *"),c); if ( !docParam.isEmpty() ) list.append( docParam ); @@ -491,16 +494,16 @@ bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRais QString appName = list[0]; if ( isRunning(appName) ) { QCString channel = "QPE/Application/"; channel += appName.latin1(); - + // Need to lock it to avoid race conditions with QPEApplication::processQCopFile - QFile f(Global::tempDir() + "qcop-msg-" + appName); + QFile f(Opie::Global::tempDir() + "qcop-msg-" + appName); if ( !noRaise && f.open(IO_WriteOnly | IO_Append) ) { #ifndef Q_OS_WIN32 flock(f.handle(), LOCK_EX); #endif - + QDataStream ds(&f); QByteArray b; QDataStream bstream(b, IO_WriteOnly); if ( !f.size() ) { @@ -522,14 +525,14 @@ bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRais f.close(); } if ( QCopChannel::isRegistered(channel) ) // avoid unnecessary warnings QCopChannel::send(channel,"QPEProcessQCop()"); - + return TRUE; } #ifdef QT_NO_QWS_MULTIPROCESS - QMessageBox::warning( 0, tr("Error"), tr("Could not find the application %1").arg(c), + QMessageBox::warning( 0, tr("Error"), tr("<qt>Could not find the application %1</qt>").arg(c), tr("OK"), 0, 0, 0, 1 ); #else QStrList slist; @@ -584,9 +587,9 @@ bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRais }else{ PROCESS_INFORMATION *procInfo = (PROCESS_INFORMATION *)proc->processIdentifier(); if (procInfo){ DWORD pid = procInfo->dwProcessId; - runningApps[pid] = QString(args[0]); + runningApps[pid] = QString(args[0]); runningAppsProc.append(proc); emit launched(pid, QString(args[0])); QCopEnvelope e("QPE/System", "busy()"); }else{ @@ -634,8 +637,12 @@ int AppLauncher::pidForName( const QString &appName ) } void AppLauncher::createQuickLauncher() { + static bool disabled = FALSE; + if (disabled) + return; + qlReady = FALSE; qlPid = ::vfork(); if ( !qlPid ) { char **args = new char *[2]; @@ -647,8 +654,10 @@ void AppLauncher::createQuickLauncher() // Try bindir first, so that foo/bar works too setenv( "LD_BIND_NOW", "1", 1 ); ::execv( QPEApplication::qpeDir()+"bin/quicklauncher", args ); ::execvp( "quicklauncher", args ); + delete []args; + disabled = TRUE; _exit( -1 ); } else if ( qlPid == -1 ) { qlPid = 0; } else { @@ -670,9 +679,9 @@ void AppLauncher::processExited() } QString appName = proc->arguments()[0]; qDebug("Removing application %s", appName.latin1()); - runningAppsProc.remove(proc); + runningAppsProc.remove(proc); QMap<QString,int>::Iterator hbit = waitingHeartbeat.find(appName); if ( hbit != waitingHeartbeat.end() ) { killTimer( *hbit ); @@ -698,8 +707,8 @@ void AppLauncher::processExited() runningApps.remove(it.key()); }else{ qDebug("Internal error application %s not listed as running", appName.latin1()); } - + #endif } |