-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 @@ | |||
26 | #endif | 26 | #endif |
27 | #ifndef QTOPIA_PROGRAM_MONITOR | 27 | #ifndef QTOPIA_PROGRAM_MONITOR |
28 | #define QTOPIA_PROGRAM_MONITOR | 28 | #define QTOPIA_PROGRAM_MONITOR |
29 | #endif | 29 | #endif |
30 | #include <qtopia/qpeglobal.h> | 30 | #include <qtopia/global.h> |
31 | 31 | ||
32 | #ifndef Q_OS_WIN32 | 32 | #ifndef Q_OS_WIN32 |
33 | #include <sys/stat.h> | 33 | #include <sys/stat.h> |
34 | #include <sys/wait.h> | 34 | #include <sys/wait.h> |
@@ -60,8 +60,9 @@ | |||
60 | #include <qtopia/global.h> | 60 | #include <qtopia/global.h> |
61 | 61 | ||
62 | #include "applauncher.h" | 62 | #include "applauncher.h" |
63 | #include "documentlist.h" | 63 | #include "documentlist.h" |
64 | #include "launcherglobal.h" | ||
64 | 65 | ||
65 | const int AppLauncher::RAISE_TIMEOUT_MS = 5000; | 66 | const int AppLauncher::RAISE_TIMEOUT_MS = 5000; |
66 | 67 | ||
67 | //--------------------------------------------------------------------------- | 68 | //--------------------------------------------------------------------------- |
@@ -74,9 +75,9 @@ class AppStoppedEvent : public QCustomEvent | |||
74 | { | 75 | { |
75 | public: | 76 | public: |
76 | AppStoppedEvent(int pid, int status) | 77 | AppStoppedEvent(int pid, int status) |
77 | : QCustomEvent( appStopEventID ), mPid(pid), mStatus(status) { } | 78 | : QCustomEvent( appStopEventID ), mPid(pid), mStatus(status) { } |
78 | 79 | ||
79 | int pid() { return mPid; } | 80 | int pid() { return mPid; } |
80 | int status() { return mStatus; } | 81 | int status() { return mStatus; } |
81 | 82 | ||
82 | private: | 83 | private: |
@@ -95,9 +96,9 @@ AppLauncher::AppLauncher(QObject *parent, const char *name) | |||
95 | 96 | ||
96 | channel = new QCopChannel( "QPE/Server", this ); | 97 | channel = new QCopChannel( "QPE/Server", this ); |
97 | connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), | 98 | connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), |
98 | this, SLOT(received(const QCString&, const QByteArray&)) ); | 99 | this, SLOT(received(const QCString&, const QByteArray&)) ); |
99 | 100 | ||
100 | #ifndef Q_OS_WIN32 | 101 | #ifndef Q_OS_WIN32 |
101 | signal(SIGCHLD, signalHandler); | 102 | signal(SIGCHLD, signalHandler); |
102 | #else | 103 | #else |
103 | runningAppsProc.setAutoDelete( TRUE ); | 104 | runningAppsProc.setAutoDelete( TRUE ); |
@@ -106,9 +107,9 @@ AppLauncher::AppLauncher(QObject *parent, const char *name) | |||
106 | int pos = tmp.findRev('/'); | 107 | int pos = tmp.findRev('/'); |
107 | if ( pos > -1 ) | 108 | if ( pos > -1 ) |
108 | tmp = tmp.mid(++pos); | 109 | tmp = tmp.mid(++pos); |
109 | runningApps[::getpid()] = tmp; | 110 | runningApps[::getpid()] = tmp; |
110 | 111 | ||
111 | appLauncherPtr = this; | 112 | appLauncherPtr = this; |
112 | 113 | ||
113 | QTimer::singleShot( 1000, this, SLOT(createQuickLauncher()) ); | 114 | QTimer::singleShot( 1000, this, SLOT(createQuickLauncher()) ); |
114 | } | 115 | } |
@@ -127,9 +128,9 @@ AppLauncher::~AppLauncher() | |||
127 | } | 128 | } |
128 | 129 | ||
129 | /* We use the QCopChannel of the app as an indicator of when it has been launched | 130 | /* We use the QCopChannel of the app as an indicator of when it has been launched |
130 | so that we can disable the busy indicators */ | 131 | so that we can disable the busy indicators */ |
131 | void AppLauncher::newQcopChannel(const QString& channelName) | 132 | void AppLauncher::newQcopChannel(const QString& channelName) |
132 | { | 133 | { |
133 | // qDebug("channel %s added", channelName.data() ); | 134 | // qDebug("channel %s added", channelName.data() ); |
134 | QString prefix("QPE/Application/"); | 135 | QString prefix("QPE/Application/"); |
135 | if (channelName.startsWith(prefix)) { | 136 | if (channelName.startsWith(prefix)) { |
@@ -150,9 +151,9 @@ void AppLauncher::newQcopChannel(const QString& channelName) | |||
150 | qlReady = TRUE; | 151 | qlReady = TRUE; |
151 | } | 152 | } |
152 | } | 153 | } |
153 | 154 | ||
154 | void AppLauncher::removedQcopChannel(const QString& channelName) | 155 | void AppLauncher::removedQcopChannel(const QString& channelName) |
155 | { | 156 | { |
156 | if (channelName.startsWith("QPE/Application/")) { | 157 | if (channelName.startsWith("QPE/Application/")) { |
157 | QCopEnvelope e("QPE/System", "removedChannel(QString)"); | 158 | QCopEnvelope e("QPE/System", "removedChannel(QString)"); |
158 | e << channelName; | 159 | e << channelName; |
@@ -258,9 +259,9 @@ bool AppLauncher::event(QEvent *e) | |||
258 | AppStoppedEvent *ae = (AppStoppedEvent *) e; | 259 | AppStoppedEvent *ae = (AppStoppedEvent *) e; |
259 | sigStopped(ae->pid(), ae->status() ); | 260 | sigStopped(ae->pid(), ae->status() ); |
260 | return TRUE; | 261 | return TRUE; |
261 | } | 262 | } |
262 | 263 | ||
263 | return QObject::event(e); | 264 | return QObject::event(e); |
264 | } | 265 | } |
265 | 266 | ||
266 | void AppLauncher::timerEvent( QTimerEvent *e ) | 267 | void AppLauncher::timerEvent( QTimerEvent *e ) |
@@ -281,13 +282,13 @@ void AppLauncher::timerEvent( QTimerEvent *e ) | |||
281 | // We store this incase the application responds while we're | 282 | // We store this incase the application responds while we're |
282 | // waiting for user input so we know not to delete ourselves. | 283 | // waiting for user input so we know not to delete ourselves. |
283 | appKillerBox = new QMessageBox(tr("Application Problem"), | 284 | appKillerBox = new QMessageBox(tr("Application Problem"), |
284 | tr("<p>%1 is not responding.</p>").arg(appKillerName) + | 285 | tr("<p>%1 is not responding.</p>").arg(appKillerName) + |
285 | tr("<p>Would you like to force the application to exit?</p>"), | 286 | tr("<p>Would you like to force the application to exit?</p>"), |
286 | QMessageBox::Warning, QMessageBox::Yes, | 287 | QMessageBox::Warning, QMessageBox::Yes, |
287 | QMessageBox::No | QMessageBox::Default, | 288 | QMessageBox::No | QMessageBox::Default, |
288 | QMessageBox::NoButton); | 289 | QMessageBox::NoButton); |
289 | if (appKillerBox->exec() == QMessageBox::Yes) { | 290 | if (appKillerBox->exec() == QMessageBox::Yes) { |
290 | // qDebug("Killing the app!!! Bwuhahahaha!"); | 291 | // qDebug("Killing the app!!! Bwuhahahaha!"); |
291 | int pid = pidForName(appKillerName); | 292 | int pid = pidForName(appKillerName); |
292 | if ( pid > 0 ) | 293 | if ( pid > 0 ) |
293 | kill( pid ); | 294 | kill( pid ); |
@@ -301,13 +302,13 @@ void AppLauncher::timerEvent( QTimerEvent *e ) | |||
301 | 302 | ||
302 | QObject::timerEvent( e ); | 303 | QObject::timerEvent( e ); |
303 | } | 304 | } |
304 | 305 | ||
305 | #ifndef Q_OS_WIN32 | 306 | #ifndef Q_OS_WIN32 |
306 | void AppLauncher::sigStopped(int sigPid, int sigStatus) | 307 | void AppLauncher::sigStopped(int sigPid, int sigStatus) |
307 | { | 308 | { |
308 | int exitStatus = 0; | 309 | int exitStatus = 0; |
309 | 310 | ||
310 | bool crashed = WIFSIGNALED(sigStatus); | 311 | bool crashed = WIFSIGNALED(sigStatus); |
311 | if ( !crashed ) { | 312 | if ( !crashed ) { |
312 | if ( WIFEXITED(sigStatus) ) | 313 | if ( WIFEXITED(sigStatus) ) |
313 | exitStatus = WEXITSTATUS(sigStatus); | 314 | exitStatus = WEXITSTATUS(sigStatus); |
@@ -363,14 +364,14 @@ void AppLauncher::sigStopped(int sigPid, int sigStatus) | |||
363 | cfg.writeEntry("Apps",apps,','); | 364 | cfg.writeEntry("Apps",apps,','); |
364 | preloadDisabled = TRUE; | 365 | preloadDisabled = TRUE; |
365 | } | 366 | } |
366 | 367 | ||
367 | // clean up | 368 | // clean up |
368 | if ( exitStatus ) { | 369 | if ( exitStatus ) { |
369 | QCopEnvelope e("QPE/System", "notBusy(QString)"); | 370 | QCopEnvelope e("QPE/System", "notBusy(QString)"); |
370 | e << app->exec(); | 371 | e << app->exec(); |
371 | } | 372 | } |
372 | /* | 373 | /* |
373 | // debug info | 374 | // debug info |
374 | for (it = runningApps.begin(); it != runningApps.end(); ++it) { | 375 | for (it = runningApps.begin(); it != runningApps.end(); ++it) { |
375 | qDebug("running according to internal list: %s, with pid %d", (*it).data(), it.key() ); | 376 | qDebug("running according to internal list: %s, with pid %d", (*it).data(), it.key() ); |
376 | } | 377 | } |
@@ -395,26 +396,27 @@ void AppLauncher::sigStopped(int sigPid, int sigStatus) | |||
395 | default: sig = QString("Unkown %1").arg(exitStatus); | 396 | default: sig = QString("Unkown %1").arg(exitStatus); |
396 | } | 397 | } |
397 | if ( preloadDisabled ) | 398 | if ( preloadDisabled ) |
398 | sig += tr("<qt><p>Fast loading has been disabled for this application. Tap and hold the application icon to reenable it.</qt>"); | 399 | sig += tr("<qt><p>Fast loading has been disabled for this application. Tap and hold the application icon to reenable it.</qt>"); |
399 | 400 | ||
400 | QString str = tr("<qt><b>%1</b> was terminated due to signal code %2</qt>").arg( app->name() ).arg( sig ); | 401 | QString str = tr("<qt><b>%1</b> was terminated due to signal code %2</qt>").arg( app->name() ).arg( sig ); |
401 | QMessageBox::information(0, tr("Application terminated"), str ); | 402 | QMessageBox::information(0, tr("Application terminated"), str ); |
402 | } else { | 403 | } else { |
403 | if ( exitStatus == 255 ) { //could not find app (because global returns -1) | 404 | if ( exitStatus == 255 ) { //could not find app (because global returns -1) |
404 | QMessageBox::information(0, tr("Application not found"), tr("<qt>Could not locate application <b>%1</b></qt>").arg( app->exec() ) ); | 405 | QMessageBox::information(0, tr("Application not found"), tr("<qt>Could not locate application <b>%1</b></qt>").arg( app->exec() ) ); |
405 | } else { | 406 | } else { |
406 | QFileInfo fi(Global::tempDir() + "qcop-msg-" + appName); | 407 | QFileInfo fi(Opie::Global::tempDir() + "qcop-msg-" + appName); |
407 | if ( fi.exists() && fi.size() ) { | 408 | if ( fi.exists() && fi.size() ) { |
408 | emit terminated(sigPid, appName); | 409 | emit terminated(sigPid, appName); |
409 | execute( appName, QString::null ); | 410 | qWarning("Re executing obmitted for %s", appName.latin1() ); |
411 | // execute( appName, QString::null ); | ||
410 | return; | 412 | return; |
411 | } | 413 | } |
412 | } | 414 | } |
413 | } | 415 | } |
414 | 416 | ||
415 | #endif | 417 | #endif |
416 | 418 | ||
417 | emit terminated(sigPid, appName); | 419 | emit terminated(sigPid, appName); |
418 | } | 420 | } |
419 | #else | 421 | #else |
420 | void AppLauncher::sigStopped(int sigPid, int sigStatus) | 422 | void AppLauncher::sigStopped(int sigPid, int sigStatus) |
@@ -443,11 +445,11 @@ bool AppLauncher::isRunning(const QString &app) | |||
443 | } | 445 | } |
444 | 446 | ||
445 | bool AppLauncher::executeBuiltin(const QString &c, const QString &document) | 447 | bool AppLauncher::executeBuiltin(const QString &c, const QString &document) |
446 | { | 448 | { |
447 | Global::Command* builtin = Global::builtinCommands(); | 449 | Global::Command* builtin = Opie::Global::builtinCommands(); |
448 | QGuardedPtr<QWidget> *running = Global::builtinRunning(); | 450 | QGuardedPtr<QWidget> *running = Opie::Global::builtinRunning(); |
449 | 451 | ||
450 | // Attempt to execute the app using a builtin class for the app | 452 | // Attempt to execute the app using a builtin class for the app |
451 | if (builtin) { | 453 | if (builtin) { |
452 | for (int i = 0; builtin[i].file; i++) { | 454 | for (int i = 0; builtin[i].file; i++) { |
453 | if ( builtin[i].file == c ) { | 455 | if ( builtin[i].file == c ) { |
@@ -482,8 +484,9 @@ bool AppLauncher::executeBuiltin(const QString &c, const QString &document) | |||
482 | } | 484 | } |
483 | 485 | ||
484 | bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRaise) | 486 | bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRaise) |
485 | { | 487 | { |
488 | qWarning("AppLauncher::execute"); | ||
486 | // Convert the command line in to a list of arguments | 489 | // Convert the command line in to a list of arguments |
487 | QStringList list = QStringList::split(QRegExp(" *"),c); | 490 | QStringList list = QStringList::split(QRegExp(" *"),c); |
488 | if ( !docParam.isEmpty() ) | 491 | if ( !docParam.isEmpty() ) |
489 | list.append( docParam ); | 492 | list.append( docParam ); |
@@ -491,16 +494,16 @@ bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRais | |||
491 | QString appName = list[0]; | 494 | QString appName = list[0]; |
492 | if ( isRunning(appName) ) { | 495 | if ( isRunning(appName) ) { |
493 | QCString channel = "QPE/Application/"; | 496 | QCString channel = "QPE/Application/"; |
494 | channel += appName.latin1(); | 497 | channel += appName.latin1(); |
495 | 498 | ||
496 | // Need to lock it to avoid race conditions with QPEApplication::processQCopFile | 499 | // Need to lock it to avoid race conditions with QPEApplication::processQCopFile |
497 | QFile f(Global::tempDir() + "qcop-msg-" + appName); | 500 | QFile f(Opie::Global::tempDir() + "qcop-msg-" + appName); |
498 | if ( !noRaise && f.open(IO_WriteOnly | IO_Append) ) { | 501 | if ( !noRaise && f.open(IO_WriteOnly | IO_Append) ) { |
499 | #ifndef Q_OS_WIN32 | 502 | #ifndef Q_OS_WIN32 |
500 | flock(f.handle(), LOCK_EX); | 503 | flock(f.handle(), LOCK_EX); |
501 | #endif | 504 | #endif |
502 | 505 | ||
503 | QDataStream ds(&f); | 506 | QDataStream ds(&f); |
504 | QByteArray b; | 507 | QByteArray b; |
505 | QDataStream bstream(b, IO_WriteOnly); | 508 | QDataStream bstream(b, IO_WriteOnly); |
506 | if ( !f.size() ) { | 509 | if ( !f.size() ) { |
@@ -522,14 +525,14 @@ bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRais | |||
522 | f.close(); | 525 | f.close(); |
523 | } | 526 | } |
524 | if ( QCopChannel::isRegistered(channel) ) // avoid unnecessary warnings | 527 | if ( QCopChannel::isRegistered(channel) ) // avoid unnecessary warnings |
525 | QCopChannel::send(channel,"QPEProcessQCop()"); | 528 | QCopChannel::send(channel,"QPEProcessQCop()"); |
526 | 529 | ||
527 | return TRUE; | 530 | return TRUE; |
528 | } | 531 | } |
529 | 532 | ||
530 | #ifdef QT_NO_QWS_MULTIPROCESS | 533 | #ifdef QT_NO_QWS_MULTIPROCESS |
531 | QMessageBox::warning( 0, tr("Error"), tr("Could not find the application %1").arg(c), | 534 | QMessageBox::warning( 0, tr("Error"), tr("<qt>Could not find the application %1</qt>").arg(c), |
532 | tr("OK"), 0, 0, 0, 1 ); | 535 | tr("OK"), 0, 0, 0, 1 ); |
533 | #else | 536 | #else |
534 | 537 | ||
535 | QStrList slist; | 538 | QStrList slist; |
@@ -584,9 +587,9 @@ bool AppLauncher::execute(const QString &c, const QString &docParam, bool noRais | |||
584 | }else{ | 587 | }else{ |
585 | PROCESS_INFORMATION *procInfo = (PROCESS_INFORMATION *)proc->processIdentifier(); | 588 | PROCESS_INFORMATION *procInfo = (PROCESS_INFORMATION *)proc->processIdentifier(); |
586 | if (procInfo){ | 589 | if (procInfo){ |
587 | DWORD pid = procInfo->dwProcessId; | 590 | DWORD pid = procInfo->dwProcessId; |
588 | runningApps[pid] = QString(args[0]); | 591 | runningApps[pid] = QString(args[0]); |
589 | runningAppsProc.append(proc); | 592 | runningAppsProc.append(proc); |
590 | emit launched(pid, QString(args[0])); | 593 | emit launched(pid, QString(args[0])); |
591 | QCopEnvelope e("QPE/System", "busy()"); | 594 | QCopEnvelope e("QPE/System", "busy()"); |
592 | }else{ | 595 | }else{ |
@@ -634,8 +637,12 @@ int AppLauncher::pidForName( const QString &appName ) | |||
634 | } | 637 | } |
635 | 638 | ||
636 | void AppLauncher::createQuickLauncher() | 639 | void AppLauncher::createQuickLauncher() |
637 | { | 640 | { |
641 | static bool disabled = FALSE; | ||
642 | if (disabled) | ||
643 | return; | ||
644 | |||
638 | qlReady = FALSE; | 645 | qlReady = FALSE; |
639 | qlPid = ::vfork(); | 646 | qlPid = ::vfork(); |
640 | if ( !qlPid ) { | 647 | if ( !qlPid ) { |
641 | char **args = new char *[2]; | 648 | char **args = new char *[2]; |
@@ -647,8 +654,10 @@ void AppLauncher::createQuickLauncher() | |||
647 | // Try bindir first, so that foo/bar works too | 654 | // Try bindir first, so that foo/bar works too |
648 | setenv( "LD_BIND_NOW", "1", 1 ); | 655 | setenv( "LD_BIND_NOW", "1", 1 ); |
649 | ::execv( QPEApplication::qpeDir()+"bin/quicklauncher", args ); | 656 | ::execv( QPEApplication::qpeDir()+"bin/quicklauncher", args ); |
650 | ::execvp( "quicklauncher", args ); | 657 | ::execvp( "quicklauncher", args ); |
658 | delete []args; | ||
659 | disabled = TRUE; | ||
651 | _exit( -1 ); | 660 | _exit( -1 ); |
652 | } else if ( qlPid == -1 ) { | 661 | } else if ( qlPid == -1 ) { |
653 | qlPid = 0; | 662 | qlPid = 0; |
654 | } else { | 663 | } else { |
@@ -670,9 +679,9 @@ void AppLauncher::processExited() | |||
670 | } | 679 | } |
671 | 680 | ||
672 | QString appName = proc->arguments()[0]; | 681 | QString appName = proc->arguments()[0]; |
673 | qDebug("Removing application %s", appName.latin1()); | 682 | qDebug("Removing application %s", appName.latin1()); |
674 | runningAppsProc.remove(proc); | 683 | runningAppsProc.remove(proc); |
675 | 684 | ||
676 | QMap<QString,int>::Iterator hbit = waitingHeartbeat.find(appName); | 685 | QMap<QString,int>::Iterator hbit = waitingHeartbeat.find(appName); |
677 | if ( hbit != waitingHeartbeat.end() ) { | 686 | if ( hbit != waitingHeartbeat.end() ) { |
678 | killTimer( *hbit ); | 687 | killTimer( *hbit ); |
@@ -698,8 +707,8 @@ void AppLauncher::processExited() | |||
698 | runningApps.remove(it.key()); | 707 | runningApps.remove(it.key()); |
699 | }else{ | 708 | }else{ |
700 | qDebug("Internal error application %s not listed as running", appName.latin1()); | 709 | qDebug("Internal error application %s not listed as running", appName.latin1()); |
701 | } | 710 | } |
702 | 711 | ||
703 | #endif | 712 | #endif |
704 | } | 713 | } |
705 | 714 | ||