summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/qcopbridge.cpp210
-rw-r--r--core/launcher/qcopbridge.h17
-rw-r--r--core/launcher/runningappbar.cpp238
3 files changed, 159 insertions, 306 deletions
diff --git a/core/launcher/qcopbridge.cpp b/core/launcher/qcopbridge.cpp
index 6177a7c..f780235 100644
--- a/core/launcher/qcopbridge.cpp
+++ b/core/launcher/qcopbridge.cpp
@@ -21,30 +21,41 @@
#include "qcopbridge.h"
#include "transferserver.h"
-#include <qpe/qcopenvelope_qws.h>
-#include <qpe/qpeapplication.h>
-#include <qpe/version.h>
+#ifdef Q_WS_QWS
+#include <qtopia/qcopenvelope_qws.h>
+#endif
+#include <qtopia/qpeapplication.h>
+#include <qtopia/global.h>
+#include <qtopia/version.h>
#include <qdir.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qdatastream.h>
+#include <qcstring.h>
#include <qstringlist.h>
#include <qfileinfo.h>
#include <qregexp.h>
-#ifdef QWS
+#include <qtimer.h>
+#ifdef Q_WS_QWS
#include <qcopchannel_qws.h>
#endif
+#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE
+#endif
+#ifndef Q_OS_WIN32
#include <pwd.h>
-#include <sys/types.h>
#include <unistd.h>
+#include <sys/types.h>
+#endif
#if defined(_OS_LINUX_)
#include <shadow.h>
#endif
+#include "launcherglobal.h"
+
//#define INSECURE
const int block_size = 51200;
@@ -68,6 +79,7 @@ QCopBridge::QCopBridge( Q_UINT16 port, QObject *parent ,
#endif
}
sendSync = FALSE;
+ openConnections.setAutoDelete( TRUE );
}
QCopBridge::~QCopBridge()
@@ -77,11 +89,28 @@ QCopBridge::~QCopBridge()
#endif
}
+void QCopBridge::authorizeConnections()
+{
+ QListIterator<QCopBridgePI> it(openConnections);
+ while ( it.current() ) {
+ if ( !it.current()->verifyAuthorised() ) {
+ disconnect ( it.current(), SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( closed( QCopBridgePI *) ) );
+ openConnections.removeRef( it.current() );
+ } else
+ ++it;
+ }
+}
+
void QCopBridge::newConnection( int socket )
{
QCopBridgePI *pi = new QCopBridgePI( socket, this );
openConnections.append( pi );
- connect ( pi, SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( connectionClosed( QCopBridgePI *) ) );
+ connect ( pi, SIGNAL( connectionClosed( QCopBridgePI *) ), this, SLOT( closed( QCopBridgePI *) ) );
+
+ /* ### libqtopia merge FIXME */
+#if 0
+ QPEApplication::setTempScreenSaverMode( QPEApplication::DisableSuspend );
+#endif
#ifndef QT_NO_COP
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::DisableSuspend;
#endif
@@ -92,10 +121,15 @@ void QCopBridge::newConnection( int socket )
}
}
-void QCopBridge::connectionClosed( QCopBridgePI *pi )
+void QCopBridge::closed( QCopBridgePI *pi )
{
- openConnections.remove( pi );
+ emit connectionClosed( pi->peerAddress() );
+ openConnections.removeRef( pi );
if ( openConnections.count() == 0 ) {
+ /* ### FIXME libqtopia merge */
+#if 0
+ QPEApplication::setTempScreenSaverMode( QPEApplication::Enable );
+#endif
#ifndef QT_NO_COP
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
#endif
@@ -110,84 +144,18 @@ void QCopBridge::closeOpenConnections()
}
-void QCopBridge::desktopMessage( const QCString &command, const QByteArray &args )
+void QCopBridge::desktopMessage( const QCString &command, const QByteArray &data )
{
- command.stripWhiteSpace();
-
- int paren = command.find( "(" );
- if ( paren <= 0 ) {
- qDebug("DesktopMessage: bad qcop syntax");
- return;
- }
-
- QString params = command.mid( paren + 1 );
- if ( params[params.length()-1] != ')' ) {
- qDebug("DesktopMessage: bad qcop syntax");
- return;
- }
-
- params.truncate( params.length()-1 );
-
- QStringList paramList = QStringList::split( ",", params );
- QString data;
- if ( paramList.count() ) {
- QDataStream stream( args, IO_ReadOnly );
- for ( QStringList::Iterator it = paramList.begin(); it != paramList.end(); ++it ) {
- QString str;
- if ( *it == "QString" ) {
- stream >> str;
- } else if ( *it == "QCString" ) {
- QCString cstr;
- stream >> cstr;
- str = QString::fromLocal8Bit( cstr );
- } else if ( *it == "int" ) {
- int i;
- stream >> i;
- str = QString::number( i );
- } else if ( *it == "bool" ) {
- int i;
- stream >> i;
- str = QString::number( i );
- } else {
- qDebug(" cannot route the argument type %s throught the qcop bridge", (*it).latin1() );
- return;
- }
- QString estr;
- for (int i=0; i<(int)str.length(); i++) {
- QChar ch = str[i];
- if ( ch.row() )
- goto quick;
- switch (ch.cell()) {
- case '&':
- estr.append( "&amp;" );
- break;
- case ' ':
- estr.append( "&0x20;" );
- break;
- case '\n':
- estr.append( "&0x0d;" );
- break;
- case '\r':
- estr.append( "&0x0a;" );
- break;
- default: quick:
- estr.append(ch);
- }
- }
- data += " " + estr;
- }
- }
- QString sendCommand = QString(command.data()) + data;
- // send the command to all open connections
if ( command == "startSync()" ) {
// we need to buffer it a bit
sendSync = TRUE;
startTimer( 20000 );
}
+ // send the command to all open connections
QCopBridgePI *pi;
for ( pi = openConnections.first(); pi != 0; pi = openConnections.next() ) {
- pi->sendDesktopMessage( sendCommand );
+ pi->sendDesktopMessage( command, data );
}
}
@@ -209,51 +177,72 @@ QCopBridgePI::QCopBridgePI( int socket, QObject *parent , const char* name )
#ifndef INSECURE
if ( !SyncAuthentication::isAuthorized(peeraddress) ) {
state = Forbidden;
- startTimer( 0 );
+ close();
} else
#endif
{
state = Connected;
- sendSync = FALSE;
connect( this, SIGNAL( readyRead() ), SLOT( read() ) );
- connect( this, SIGNAL( connectionClosed() ), SLOT( connectionClosed() ) );
-
QString intro="220 Qtopia ";
intro += QPE_VERSION; intro += ";";
- intro += "challenge="; intro += SyncAuthentication::serverId(); intro += ";";
+ intro += "challenge="; intro += SyncAuthentication::serverId(); intro += ";"; // No tr
intro += "loginname="; intro += SyncAuthentication::loginName(); intro += ";";
intro += "displayname="; intro += SyncAuthentication::ownerName(); intro += ";";
send( intro );
state = Wait_USER;
+ }
+ sendSync = FALSE;
+ connect( this, SIGNAL( connectionClosed() ), SLOT( myConnectionClosed() ) );
// idle timer to close connections when not used anymore
- startTimer( 60000 );
- connected = TRUE;
- }
+ timer = new QTimer(this);
+ connect( timer, SIGNAL(timeout()), this, SLOT(myConnectionClosed()) );
+ timer->start( 300000, TRUE );
}
QCopBridgePI::~QCopBridgePI()
{
+}
+bool QCopBridgePI::verifyAuthorised()
+{
+ if ( !SyncAuthentication::isAuthorized(peerAddress()) ) {
+ state = Forbidden;
+ return FALSE;
+ }
+ return TRUE;
}
-void QCopBridgePI::connectionClosed()
+void QCopBridgePI::myConnectionClosed()
{
emit connectionClosed( this );
- // qDebug( "Debug: Connection closed" );
- delete this;
}
void QCopBridgePI::sendDesktopMessage( const QString &msg )
{
- QString str = "CALL QPE/Desktop " + msg;
+ QString str = "CALL QPE/Desktop " + msg; // No tr
send ( str );
}
+void QCopBridgePI::sendDesktopMessage( const QCString &msg, const QByteArray& data )
+{
+ if ( !isOpen() ) // eg. Forbidden
+ return;
+ const char hdr[]="CALLB QPE/Desktop ";
+ writeBlock(hdr,sizeof(hdr)-1);
+ writeBlock(msg,msg.length());
+ writeBlock(" ",1);
+ QByteArray b64 = Opie::Global::encodeBase64(data);
+ writeBlock(b64.data(),b64.size());
+ writeBlock("\r\n",2);
+}
+
void QCopBridgePI::send( const QString& msg )
{
+ if ( !isOpen() ) // eg. Forbidden
+ return;
QTextStream os( this );
os << msg << endl;
//qDebug( "sending qcop message: %s", msg.latin1() );
@@ -261,9 +250,11 @@ void QCopBridgePI::send( const QString& msg )
void QCopBridgePI::read()
{
- while ( canReadLine() )
+ while ( canReadLine() ) {
+ timer->start( 300000, TRUE );
process( readLine().stripWhiteSpace() );
}
+}
void QCopBridgePI::process( const QString& message )
{
@@ -283,8 +274,8 @@ void QCopBridgePI::process( const QString& message )
// we always respond to QUIT, regardless of state
if ( cmd == "QUIT" ) {
- send( "211 Have a nice day!" );
- delete this;
+ send( "211 Have a nice day!" ); // No tr
+ close();
return;
}
@@ -296,10 +287,10 @@ void QCopBridgePI::process( const QString& message )
if ( Wait_USER == state ) {
if ( cmd != "USER" || msg.count() < 2 || !SyncAuthentication::checkUser( arg ) ) {
- send( "530 Please login with USER and PASS" );
+ send( "530 Please login with USER and PASS" ); // No tr
return;
}
- send( "331 User name ok, need password" );
+ send( "331 User name ok, need password" ); // No tr
state = Wait_PASS;
return;
}
@@ -308,10 +299,10 @@ void QCopBridgePI::process( const QString& message )
if ( Wait_PASS == state ) {
if ( cmd != "PASS" || !SyncAuthentication::checkPassword( arg ) ) {
- send( "530 Please login with USER and PASS" );
+ send( "530 Please login with USER and PASS" ); // No tr
return;
}
- send( "230 User logged in, proceed" );
+ send( "230 User logged in, proceed" ); // No tr
state = Ready;
if ( sendSync ) {
sendDesktopMessage( "startSync()" );
@@ -322,8 +313,7 @@ void QCopBridgePI::process( const QString& message )
// noop (NOOP)
else if ( cmd == "NOOP" ) {
- connected = TRUE;
- send( "200 Command okay" );
+ send( "200 Command okay" ); // No tr
}
// call (CALL)
@@ -332,7 +322,7 @@ void QCopBridgePI::process( const QString& message )
// example: call QPE/System execute(QString) addressbook
if ( msg.count() < 3 ) {
- send( "500 Syntax error, command unrecognized" );
+ send( "500 Syntax error, command unrecognized" ); // No tr
}
else {
@@ -343,13 +333,13 @@ void QCopBridgePI::process( const QString& message )
int paren = command.find( "(" );
if ( paren <= 0 ) {
- send( "500 Syntax error, command unrecognized" );
+ send( "500 Syntax error, command unrecognized" ); // No tr
return;
}
QString params = command.mid( paren + 1 );
- if ( params[params.length()-1] != ')' ) {
- send( "500 Syntax error, command unrecognized" );
+ if ( params[(int)params.length()-1] != ')' ) {
+ send( "500 Syntax error, command unrecognized" ); // No tr
return;
}
@@ -361,7 +351,7 @@ void QCopBridgePI::process( const QString& message )
QStringList paramList = QStringList::split( ",", params );
if ( paramList.count() > msg.count() - 3 ) {
- send( "500 Syntax error, command unrecognized" );
+ send( "500 Syntax error, command unrecognized" ); // No tr
return;
}
@@ -381,7 +371,7 @@ void QCopBridgePI::process( const QString& message )
else if ( *it == "bool" )
ds << arg.toInt();
else {
- send( "500 Syntax error, command unrecognized" );
+ send( "500 Syntax error, command unrecognized" ); // No tr
return;
}
msgId++;
@@ -402,21 +392,13 @@ void QCopBridgePI::process( const QString& message )
else
QCopChannel::send( channel.latin1(), command.latin1() );
- send( "200 Command okay" );
+ send( "200 Command okay" ); // No tr
#endif
}
}
// not implemented
else
- send( "502 Command not implemented" );
+ send( "502 Command not implemented" ); // No tr
}
-
-void QCopBridgePI::timerEvent( QTimerEvent * )
-{
- if ( connected )
- connected = FALSE;
- else
- connectionClosed();
-}
diff --git a/core/launcher/qcopbridge.h b/core/launcher/qcopbridge.h
index 408d10d..bae3f88 100644
--- a/core/launcher/qcopbridge.h
+++ b/core/launcher/qcopbridge.h
@@ -20,6 +20,7 @@
#ifndef __qcopbridge_h__
#define __qcopbridge_h__
+#include <qtopia/global.h>
#include <qserversocket.h>
#include <qsocket.h>
#include <qdir.h>
@@ -29,6 +30,7 @@
class QFileInfo;
class QCopBridgePI;
class QCopChannel;
+class QTimer;
class QCopBridge : public QServerSocket
{
@@ -40,11 +42,15 @@ public:
void newConnection( int socket );
void closeOpenConnections();
+ void authorizeConnections();
public slots:
- void connectionClosed( QCopBridgePI *pi );
+ void closed( QCopBridgePI *pi );
void desktopMessage( const QCString &call, const QByteArray & );
+signals:
+ void connectionClosed( const QHostAddress & );
+
protected:
void timerEvent( QTimerEvent * );
@@ -67,7 +73,9 @@ public:
virtual ~QCopBridgePI();
void sendDesktopMessage( const QString &msg );
+ void sendDesktopMessage( const QCString &msg, const QByteArray& );
void startSync() { sendSync = TRUE; }
+ bool verifyAuthorised();
signals:
void connectionClosed( QCopBridgePI *);
@@ -76,17 +84,14 @@ protected slots:
void read();
void send( const QString& msg );
void process( const QString& command );
- void connectionClosed();
-
-protected:
- void timerEvent( QTimerEvent *e );
+ void myConnectionClosed();
private:
State state;
Q_UINT16 peerport;
QHostAddress peeraddress;
- bool connected;
bool sendSync;
+ QTimer *timer;
};
#endif
diff --git a/core/launcher/runningappbar.cpp b/core/launcher/runningappbar.cpp
index 356200b..1fda5a4 100644
--- a/core/launcher/runningappbar.cpp
+++ b/core/launcher/runningappbar.cpp
@@ -16,43 +16,30 @@
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
-**********************************************************************
-*/
+***********************************************************************/
#define QTOPIA_INTERNAL_PRELOADACCESS
-// For "kill"
-#include <sys/types.h>
-#include <signal.h>
-#include <stdio.h>
+#include <qtopia/global.h>
+
#include <stdlib.h>
-#include <qdir.h>
#include <qtimer.h>
#include <qpopupmenu.h>
-#include <qmessagebox.h>
#include <qpainter.h>
-#include <opie/oprocess.h>
-#include <qpe/qpeapplication.h>
-#include <qpe/applnk.h>
-#include <qpe/qcopenvelope_qws.h>
-#include <qpe/global.h>
-#include <qwindowsystem_qws.h>
+#include <qmessagebox.h>
+
+#include <qtopia/qpeapplication.h>
+#include <qtopia/applnk.h>
+#include <qtopia/qcopenvelope_qws.h>
+#include <qtopia/mimetype.h>
+
#include "runningappbar.h"
+#include "serverinterface.h"
RunningAppBar::RunningAppBar(QWidget* parent)
- : QFrame(parent), m_AppLnkSet(0L), m_SelectedAppIndex( -1)
+ : QFrame(parent), selectedAppIndex(-1)
{
- setBackgroundMode( PaletteBackground );
-
- m_AppLnkSet = new AppLnkSet( QPEApplication::qpeDir() + "apps" );
-
-#ifdef QWS
-
- connect(qwsServer, SIGNAL(newChannel(const QString&)), this, SLOT(newQcopChannel(const QString&)));
- connect(qwsServer, SIGNAL(removedChannel(const QString&)), this, SLOT(removedQcopChannel(const QString&)));
-#endif
-
QCopChannel* channel = new QCopChannel( "QPE/System", this );
connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
this, SLOT(received(const QCString&, const QByteArray&)) );
@@ -61,69 +48,42 @@ RunningAppBar::RunningAppBar(QWidget* parent)
}
RunningAppBar::~RunningAppBar()
-{}
-
-void RunningAppBar::newQcopChannel(const QString& channelName)
-{
- QString prefix("QPE/Application/");
- if (channelName.startsWith(prefix)) {
- QString appName = channelName.mid(prefix.length());
- // qDebug("App %s just connected!", appName.latin1());
- const AppLnk* newGuy = m_AppLnkSet->findExec(appName);
- if (newGuy && !newGuy->isPreloaded()) {
- addTask(*newGuy);
- }
- }
-}
-
-void RunningAppBar::removedQcopChannel(const QString& channelName)
{
- QString prefix("QPE/Application/");
- if (channelName.startsWith(prefix)) {
- QString appName = channelName.mid(prefix.length());
- qDebug("App %s just disconnected!", appName.latin1());
- const AppLnk* newGuy = m_AppLnkSet->findExec(appName);
- if (newGuy) {
- removeTask(*newGuy);
- }
- }
}
-void RunningAppBar::received(const QCString& msg, const QByteArray& data)
-{
+void RunningAppBar::received(const QCString& msg, const QByteArray& data) {
// Since fast apps appear and disappear without disconnecting from their
// channel we need to watch for the showing/hiding events and update according.
QDataStream stream( data, IO_ReadOnly );
if ( msg == "fastAppShowing(QString)") {
QString appName;
stream >> appName;
- addTask(*m_AppLnkSet->findExec(appName));
- }
- else if ( msg == "fastAppHiding(QString)") {
+ // qDebug("fastAppShowing %s", appName.data() );
+ const AppLnk* f = ServerInterface::appLnks().findExec(appName);
+ if ( f ) addTask(*f);
+ } else if ( msg == "fastAppHiding(QString)") {
QString appName;
stream >> appName;
- removeTask(*m_AppLnkSet->findExec(appName));
+ const AppLnk* f = ServerInterface::appLnks().findExec(appName);
+ if ( f ) removeTask(*f);
}
}
-void RunningAppBar::addTask(const AppLnk& appLnk)
-{
- // qDebug("Added %s to app list.", appLnk.name().latin1());
+void RunningAppBar::addTask(const AppLnk& appLnk) {
+ qDebug("Added %s to app list.", appLnk.name().latin1());
AppLnk* newApp = new AppLnk(appLnk);
newApp->setExec(appLnk.exec());
- m_AppList.prepend(newApp);
+ appList.prepend(newApp);
update();
}
-void RunningAppBar::removeTask(const AppLnk& appLnk)
-{
+void RunningAppBar::removeTask(const AppLnk& appLnk) {
unsigned int i = 0;
- for (; i < m_AppList.count() ; i++) {
- AppLnk* target = m_AppList.at(i);
+ for (; i < appList.count() ; i++) {
+ AppLnk* target = appList.at(i);
if (target->exec() == appLnk.exec()) {
qDebug("Removing %s from app list.", appLnk.name().latin1());
- m_AppList.remove();
-
+ appList.remove();
delete target;
}
}
@@ -135,44 +95,34 @@ void RunningAppBar::mousePressEvent(QMouseEvent *e)
// Find out if the user is clicking on an app icon...
// If so, snag the index so when we repaint we show it
// as highlighed.
- m_SelectedAppIndex = 0;
+ selectedAppIndex = 0;
int x = 0;
- QListIterator<AppLnk> it( m_AppList );
- for ( ; it.current(); ++it, ++m_SelectedAppIndex, x += spacing ) {
+ QListIterator<AppLnk> it( appList );
+ for ( ; it.current(); ++it,++selectedAppIndex,x+=spacing ) {
if ( x + spacing <= width() ) {
if ( e->x() >= x && e->x() < x + spacing ) {
- if ( m_SelectedAppIndex < (int)m_AppList.count() ) {
+ if ( selectedAppIndex < (int)appList.count() ) {
repaint(FALSE);
return ;
}
}
- }
- else {
+ } else {
break;
}
}
- m_SelectedAppIndex = -1;
+ selectedAppIndex = -1;
repaint( FALSE );
}
void RunningAppBar::mouseReleaseEvent(QMouseEvent *e)
{
- if (e->button() == QMouseEvent::RightButton) {
+ if (e->button() == QMouseEvent::RightButton)
return ;
- }
- if ( m_SelectedAppIndex >= 0 ) {
- QString channel = QString("QPE/Application/") + m_AppList.at(m_SelectedAppIndex)->exec();
- if (QCopChannel::isRegistered(channel.latin1())) {
- // qDebug("%s is running!", m_AppList.at(m_SelectedAppIndex)->exec().latin1());
- QCopEnvelope e(channel.latin1(), "raise()");
- // This class will delete itself after hearing from the app or the timer expiring
- (void)new AppMonitor(*m_AppList.at(m_SelectedAppIndex), *this);
- }
- else {
- removeTask(*m_AppList.at(m_SelectedAppIndex));
- }
-
- m_SelectedAppIndex = -1;
+ if ( selectedAppIndex >= 0 ) {
+ QString app = appList.at(selectedAppIndex)->exec();
+ QCopEnvelope e("QPE/System", "raise(QString)");
+ e << app;
+ selectedAppIndex = -1;
update();
}
}
@@ -185,17 +135,18 @@ void RunningAppBar::paintEvent( QPaintEvent * )
int y = (height() - AppLnk::smallIconSize()) / 2;
int i = 0;
- //p.fillRect( 0, 0, width(), height(), colorGroup().background() );
+ p.fillRect( 0, 0, width(), height(), colorGroup().background() );
- QListIterator<AppLnk> it(m_AppList);
+ QListIterator<AppLnk> it(appList);
for (; it.current(); i++, ++it ) {
if ( x + spacing <= width() ) {
curApp = it.current();
- if ( (int)i == m_SelectedAppIndex )
+ qWarning("Drawing %s", curApp->name().latin1() );
+ if ( (int)i == selectedAppIndex )
p.fillRect( x, y, spacing, curApp->pixmap().height() + 1, colorGroup().highlight() );
else
- // p.eraseRect( x, y, spacing, curApp->pixmap().height()+1 );
+ p.eraseRect( x, y, spacing, curApp->pixmap().height()+1 );
p.drawPixmap( x, y, curApp->pixmap() );
x += spacing;
}
@@ -207,107 +158,22 @@ QSize RunningAppBar::sizeHint() const
return QSize( frameWidth(), AppLnk::smallIconSize() + frameWidth()*2 + 3 );
}
-const int AppMonitor::RAISE_TIMEOUT_MS = 500;
-
-AppMonitor::AppMonitor(const AppLnk& app, RunningAppBar& owner)
- : QObject(0L), m_Owner(owner), m_App(app), m_AppKillerBox(0L)
+void RunningAppBar::applicationLaunched(const QString &appName)
{
- QCopChannel* channel = new QCopChannel( "QPE/System", this );
- connect( channel, SIGNAL(received(const QCString&, const QByteArray&)),
- this, SLOT(received(const QCString&, const QByteArray&)) );
- connect(&m_Timer, SIGNAL(timeout()), this, SLOT(timerExpired()));
- m_Timer.start(RAISE_TIMEOUT_MS, TRUE);
-}
-
-AppMonitor::~AppMonitor()
-{
- if (m_AppKillerBox) {
- delete m_AppKillerBox;
- m_AppKillerBox = 0L;
+ qDebug("desktop:: app: %s launched with pid ", appName.data() );
+ const AppLnk* newGuy = ServerInterface::appLnks().findExec(appName);
+ if ( newGuy && !newGuy->isPreloaded() ) {
+ addTask( *newGuy );
}
}
-void AppMonitor::received(const QCString& msg, const QByteArray& data)
+void RunningAppBar::applicationTerminated(const QString &app)
{
- QDataStream stream( data, IO_ReadOnly );
-
- if (msg == "appRaised(QString)") {
- QString appName;
- stream >> appName;
- if (appName == m_App.exec()) {
- // qDebug("Got a heartbeat from %s", appName.latin1());
- m_Timer.stop();
- // Check to make sure we're not waiting on user input...
- if (m_AppKillerBox) {
- // If we are, we kill the dialog box, and the code waiting on the result
- // will clean us up (basically the user said "no").
- delete m_AppKillerBox;
- m_AppKillerBox = 0L;
- }
- else {
- // Ok, we're not waiting on user input, so clean us up now.
- // WE DELETE OURSELVES HERE! Don't do anything else!!
- delete this;
- }
+ const AppLnk* gone = ServerInterface::appLnks().findExec(app);
+ if ( gone ) {
+ removeTask(*gone);
}
}
-}
-
-void AppMonitor::timerExpired()
-{
- // We store this incase the application responds while we're
- // waiting for user input so we know not to delete ourselves. This
- // will be cleaned up in the destructor.
- m_AppKillerBox = new QMessageBox(tr("Application Problem"),
- tr("<p>%1 is not responding.</p>").arg(m_App.name()) +
- tr("<p>Would you like to force the application to exit?</p>"),
- QMessageBox::Warning, QMessageBox::Yes,
- QMessageBox::No | QMessageBox::Default,
- QMessageBox::NoButton);
- if ( m_AppKillerBox-> exec ( ) == QMessageBox::Yes ) {
- QDir proc ( "/proc/", "[0-9]*", QDir::Name | QDir::Reversed, QDir::Dirs );
- QStringList allprocs = proc. entryList ( );
-
- pid_t mypid = ::getpid ( );
- for ( QStringList::Iterator it = allprocs. begin ( ); it != allprocs. end ( ); ++it ) {
- if (( *it ). toInt ( ) <= mypid ) // only interested in children
- continue;
- QCString s = QString ( "/proc/" + *it + "/stat" ). local8Bit ( );
-
- FILE *fp = ::fopen ( s. data ( ), "r" );
- if ( fp ) {
- pid_t pid, ppid;
- char *execptr, *exec = 0;
-
- if ( ::fscanf ( fp, "%d %as %*c %d ", &pid, &execptr, &ppid ) == 3 ) {
- exec = execptr [0] ? execptr + 1 : execptr;
- if ( exec [0] )
- exec [::strlen ( exec ) - 1] = 0;
-
- if (( ppid == ::getpid ( )) && ( m_App. exec ( ). local8Bit ( ) == exec )) {
- bool success = false;
-
- qDebug ( "trying to kill pid=%d, exec=%s, ppid=%d", pid, exec, ppid );
-
-
- success |= ( ::kill ( pid, SIGTERM ) == 0 );
- ::usleep ( 1000 * 500 );
- success |= ( ::kill ( pid, SIGKILL ) == 0 );
-
- if ( success )
- m_Owner. removeTask ( m_App );
-
- ::free ( execptr );
- break;
- }
- ::free ( execptr );
- }
- ::fclose ( fp );
- }
- }
- }
- delete this;
-}