Commit 4bf65fe4 authored by Christian Kandeler's avatar Christian Kandeler
Browse files

RemoteLinux: Split up "remote processes" functionality...

... into generic and Maemo-specific parts.

Change-Id: If1f3664ed7320d3e51655cc092cea36be1a9fe66
Reviewed-on: http://codereview.qt.nokia.com/2026

Reviewed-by: default avatarChristian Kandeler <christian.kandeler@nokia.com>
parent a1748e4b
......@@ -33,8 +33,9 @@
#include "genericlinuxdeviceconfigurationwizard.h"
#include "linuxdevicetestdialog.h"
#include "maemoremoteprocessesdialog.h"
#include "publickeydeploymentdialog.h"
#include "remotelinuxprocessesdialog.h"
#include "remotelinuxprocesslist.h"
#include "remotelinux_constants.h"
#include <utils/qtcassert.h>
......@@ -93,12 +94,12 @@ QDialog *GenericLinuxDeviceConfigurationFactory::createDeviceAction(const QStrin
{
Q_ASSERT(supportedDeviceActionIds().contains(actionId));
if (actionId == QLatin1String(Constants::GenericTestDeviceActionId)) {
return new LinuxDeviceTestDialog(deviceConfig, new GenericLinuxDeviceTester(parent),
if (actionId == QLatin1String(Constants::GenericTestDeviceActionId))
return new LinuxDeviceTestDialog(deviceConfig, new GenericLinuxDeviceTester, parent);
if (actionId == QLatin1String(Constants::GenericRemoteProcessesActionId)) {
return new RemoteLinuxProcessesDialog(new GenericRemoteLinuxProcessList(deviceConfig),
parent);
}
if (actionId == QLatin1String(Constants::GenericRemoteProcessesActionId))
return new MaemoRemoteProcessesDialog(deviceConfig, parent);
if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId))
return new PublicKeyDeploymentDialog(deviceConfig, parent);
return 0; // Can't happen.
......
......@@ -35,56 +35,70 @@
#include <QtGui/QPushButton>
namespace RemoteLinux {
namespace Internal {
class LinuxDeviceTestDialogPrivate {
public:
LinuxDeviceTestDialogPrivate(AbstractLinuxDeviceTester *tester)
: deviceTester(tester), finished(false)
{
}
Ui::LinuxDeviceTestDialog ui;
AbstractLinuxDeviceTester * const deviceTester;
bool finished;
};
} // namespace Internal
using namespace Internal;
LinuxDeviceTestDialog::LinuxDeviceTestDialog(const QSharedPointer<const LinuxDeviceConfiguration> &deviceConfiguration,
AbstractLinuxDeviceTester *deviceTester, QWidget *parent)
: QDialog(parent),
m_ui(new Ui::LinuxDeviceTestDialog),
m_deviceTester(deviceTester),
m_finished(false)
: QDialog(parent), m_d(new LinuxDeviceTestDialogPrivate(deviceTester))
{
m_ui->setupUi(this);
m_d->ui.setupUi(this);
connect(m_deviceTester, SIGNAL(progressMessage(QString)), SLOT(handleProgressMessage(QString)));
connect(m_deviceTester, SIGNAL(errorMessage(QString)), SLOT(handleErrorMessage(QString)));
connect(m_deviceTester, SIGNAL(finished(RemoteLinux::AbstractLinuxDeviceTester::TestResult)),
m_d->deviceTester->setParent(this);
connect(m_d->deviceTester, SIGNAL(progressMessage(QString)), SLOT(handleProgressMessage(QString)));
connect(m_d->deviceTester, SIGNAL(errorMessage(QString)), SLOT(handleErrorMessage(QString)));
connect(m_d->deviceTester, SIGNAL(finished(RemoteLinux::AbstractLinuxDeviceTester::TestResult)),
SLOT(handleTestFinished(RemoteLinux::AbstractLinuxDeviceTester::TestResult)));
m_deviceTester->testDevice(deviceConfiguration);
m_d->deviceTester->testDevice(deviceConfiguration);
}
LinuxDeviceTestDialog::~LinuxDeviceTestDialog()
{
delete m_ui;
delete m_d;
}
void LinuxDeviceTestDialog::reject()
{
if (!m_finished)
m_deviceTester->stopTest();
if (!m_d->finished)
m_d->deviceTester->stopTest();
QDialog::reject();
}
void LinuxDeviceTestDialog::handleProgressMessage(const QString &message)
{
m_ui->textEdit->appendPlainText(message);
m_d->ui.textEdit->appendPlainText(message);
}
void LinuxDeviceTestDialog::handleErrorMessage(const QString &message)
{
m_ui->textEdit->appendHtml(QLatin1String("<font color=\"red\">") + message
m_d->ui.textEdit->appendHtml(QLatin1String("<font color=\"red\">") + message
+ QLatin1String("</font><p/><p/>"));
}
void LinuxDeviceTestDialog::handleTestFinished(AbstractLinuxDeviceTester::TestResult result)
{
m_finished = true;
m_ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Close"));
m_d->finished = true;
m_d->ui.buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Close"));
if (result == AbstractLinuxDeviceTester::TestSuccess) {
m_ui->textEdit->appendHtml(QLatin1String("<b><font color=\"blue\">")
m_d->ui.textEdit->appendHtml(QLatin1String("<b><font color=\"blue\">")
+ tr("Device test finished successfully.") + QLatin1String("</font></b>"));
} else {
m_ui->textEdit->appendHtml(QLatin1String("<b><font color=\"red\">")
m_d->ui.textEdit->appendHtml(QLatin1String("<b><font color=\"red\">")
+ tr("Device test failed.") + QLatin1String("</font></b><p/>"));
}
}
......
......@@ -37,18 +37,17 @@
#include <QtGui/QDialog>
QT_BEGIN_NAMESPACE
namespace Ui {
class LinuxDeviceTestDialog;
}
QT_END_NAMESPACE
namespace RemoteLinux {
namespace Internal {
class LinuxDeviceTestDialogPrivate;
} // namespace Internal
class REMOTELINUX_EXPORT LinuxDeviceTestDialog : public QDialog
{
Q_OBJECT
public:
// Note: The dialog takes ownership of deviceTester
explicit LinuxDeviceTestDialog(const QSharedPointer<const LinuxDeviceConfiguration> &deviceConfiguration,
AbstractLinuxDeviceTester * deviceTester, QWidget *parent = 0);
~LinuxDeviceTestDialog();
......@@ -61,9 +60,7 @@ private slots:
void handleTestFinished(RemoteLinux::AbstractLinuxDeviceTester::TestResult result);
private:
Ui::LinuxDeviceTestDialog * const m_ui;
AbstractLinuxDeviceTester * const m_deviceTester;
bool m_finished;
Internal::LinuxDeviceTestDialogPrivate * const m_d;
};
} // namespace RemoteLinux
......
......@@ -33,10 +33,11 @@
#include "maddedevicetester.h"
#include "maemodeviceconfigwizard.h"
#include "maemoremoteprocessesdialog.h"
#include "publickeydeploymentdialog.h"
#include "madderemoteprocesslist.h"
#include <remotelinux/linuxdevicetestdialog.h>
#include <remotelinux/remotelinuxprocessesdialog.h>
#include <remotelinux/remotelinux_constants.h>
#include <utils/qtcassert.h>
......@@ -44,6 +45,7 @@ namespace RemoteLinux {
namespace Internal {
namespace {
const char MaddeDeviceTestActionId[] = "Madde.DeviceTestAction";
const char MaddeRemoteProcessesActionId[] = "Madde.RemoteProcessesAction";
} // anonymous namespace
MaddeDeviceConfigurationFactory::MaddeDeviceConfigurationFactory(QObject *parent)
......@@ -82,7 +84,7 @@ QStringList MaddeDeviceConfigurationFactory::supportedDeviceActionIds() const
{
return QStringList() << QLatin1String(MaddeDeviceTestActionId)
<< QLatin1String(Constants::GenericDeployKeyToDeviceActionId)
<< QLatin1String(Constants::GenericRemoteProcessesActionId);
<< QLatin1String(MaddeRemoteProcessesActionId);
}
QString MaddeDeviceConfigurationFactory::displayNameForActionId(const QString &actionId) const
......@@ -91,7 +93,7 @@ QString MaddeDeviceConfigurationFactory::displayNameForActionId(const QString &a
if (actionId == QLatin1String(MaddeDeviceTestActionId))
return tr("Test");
if (actionId == QLatin1String(Constants::GenericRemoteProcessesActionId))
if (actionId == QLatin1String(MaddeRemoteProcessesActionId))
return tr("Remote Processes");
if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId))
return tr("Deploy Public Key");
......@@ -104,9 +106,9 @@ QDialog *MaddeDeviceConfigurationFactory::createDeviceAction(const QString &acti
Q_ASSERT(supportedDeviceActionIds().contains(actionId));
if (actionId == QLatin1String(MaddeDeviceTestActionId))
return new LinuxDeviceTestDialog(deviceConfig, new MaddeDeviceTester(parent), parent);
if (actionId == QLatin1String(Constants::GenericRemoteProcessesActionId))
return new MaemoRemoteProcessesDialog(deviceConfig, parent);
return new LinuxDeviceTestDialog(deviceConfig, new MaddeDeviceTester, parent);
if (actionId == QLatin1String(MaddeRemoteProcessesActionId))
return new RemoteLinuxProcessesDialog(new MaddeRemoteProcessList(deviceConfig), parent);
if (actionId == QLatin1String(Constants::GenericDeployKeyToDeviceActionId))
return new PublicKeyDeploymentDialog(deviceConfig, parent);
return 0; // Can't happen.
......
......@@ -47,7 +47,7 @@ class MaddeDeviceTester : public RemoteLinux::AbstractLinuxDeviceTester
{
Q_OBJECT
public:
explicit MaddeDeviceTester(QObject *parent);
explicit MaddeDeviceTester(QObject *parent = 0);
~MaddeDeviceTester();
void testDevice(const QSharedPointer<const LinuxDeviceConfiguration> &deviceConfiguration);
......
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#include "madderemoteprocesslist.h"
#include <remotelinux/linuxdeviceconfiguration.h>
#include <QtCore/QString>
namespace RemoteLinux {
namespace Internal {
namespace {
const char FremantleLineSeparator1[] = "---";
const char FremantleLineSeparator2[] = "QTCENDOFLINE---";
} // anonymous namespace
MaddeRemoteProcessList::MaddeRemoteProcessList(const LinuxDeviceConfiguration::ConstPtr &devConfig,
QObject *parent) : GenericRemoteLinuxProcessList(devConfig, parent)
{
}
QString MaddeRemoteProcessList::listProcessesCommandLine() const
{
// The ps command on Fremantle ignores all command line options, so
// we have to collect the information in /proc manually.
if (deviceConfiguration()->osType() == LinuxDeviceConfiguration::Maemo5OsType) {
return QLatin1String("sep1=") + QLatin1String(FremantleLineSeparator1) + QLatin1Char(';')
+ QLatin1String("sep2=") + QLatin1String(FremantleLineSeparator2) + QLatin1Char(';')
+ QLatin1String("pidlist=`ls /proc |grep -E '^[[:digit:]]+$' |sort -n`; "
"for pid in $pidlist;"
"do "
" echo -n \"$pid \";"
" tr '\\0' ' ' < /proc/$pid/cmdline;"
" echo -n \"$sep1$sep2\";"
"done;"
"echo ''");
}
return GenericRemoteLinuxProcessList::listProcessesCommandLine();
}
QList<AbstractRemoteLinuxProcessList::RemoteProcess> MaddeRemoteProcessList::buildProcessList(const QString &listProcessesReply) const
{
QString adaptedReply = listProcessesReply;
if (deviceConfiguration()->osType() == LinuxDeviceConfiguration::Maemo5OsType) {
adaptedReply.replace(QLatin1String(FremantleLineSeparator1)
+ QLatin1String(FremantleLineSeparator2), QLatin1String("\n"));
adaptedReply.prepend(QLatin1String("dummy\n"));
}
return GenericRemoteLinuxProcessList::buildProcessList(adaptedReply);
}
} // namespace Internal
} // namespace RemoteLinux
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#ifndef MADDEREMOTEPROCESSLIST_H
#define MADDEREMOTEPROCESSLIST_H
#include <remotelinux/remotelinuxprocesslist.h>
namespace RemoteLinux {
namespace Internal {
class MaddeRemoteProcessList : public RemoteLinux::GenericRemoteLinuxProcessList
{
Q_OBJECT
public:
MaddeRemoteProcessList(const QSharedPointer<const LinuxDeviceConfiguration> &devConfig,
QObject *parent = 0);
private:
QString listProcessesCommandLine() const;
QList<RemoteProcess> buildProcessList(const QString &listProcessesReply) const;
};
} // namespace Internal
} // namespace RemoteLinux
#endif // MADDEREMOTEPROCESSLIST_H
......@@ -30,8 +30,6 @@ HEADERS += \
maemoremotemounter.h \
maemoprofilesupdatedialog.h \
maemousedportsgatherer.h \
maemoremoteprocesslist.h \
maemoremoteprocessesdialog.h \
maemopublishingwizardfactories.h \
maemopublishingbuildsettingspagefremantlefree.h \
maemopublishingfileselectiondialog.h \
......@@ -95,7 +93,10 @@ HEADERS += \
linuxdevicetester.h \
maddedevicetester.h \
remotelinux_constants.h \
linuxdevicetestdialog.h
linuxdevicetestdialog.h \
remotelinuxprocesslist.h \
madderemoteprocesslist.h \
remotelinuxprocessesdialog.h
SOURCES += \
remotelinuxplugin.cpp \
......@@ -121,8 +122,6 @@ SOURCES += \
maemoremotemounter.cpp \
maemoprofilesupdatedialog.cpp \
maemousedportsgatherer.cpp \
maemoremoteprocesslist.cpp \
maemoremoteprocessesdialog.cpp \
maemopublishingwizardfactories.cpp \
maemopublishingbuildsettingspagefremantlefree.cpp \
maemopublishingfileselectiondialog.cpp \
......@@ -183,14 +182,16 @@ SOURCES += \
packageuploader.cpp \
linuxdevicetester.cpp \
maddedevicetester.cpp \
linuxdevicetestdialog.cpp
linuxdevicetestdialog.cpp \
remotelinuxprocesslist.cpp \
madderemoteprocesslist.cpp \
remotelinuxprocessesdialog.cpp
FORMS += \
maemodeviceconfigurationssettingswidget.ui \
maemosshconfigdialog.ui \
maemopackagecreationwidget.ui \
maemoprofilesupdatedialog.ui \
maemoremoteprocessesdialog.ui \
maemopublishingbuildsettingspagefremantlefree.ui \
maemopublishingfileselectiondialog.ui \
maemopublishinguploadsettingspagefremantlefree.ui \
......@@ -204,7 +205,8 @@ FORMS += \
maemodeployconfigurationwidget.ui \
linuxdevicefactoryselectiondialog.ui \
genericlinuxdeviceconfigurationwizardsetuppage.ui \
linuxdevicetestdialog.ui
linuxdevicetestdialog.ui \
remotelinuxprocessesdialog.ui
RESOURCES += qt-maemo.qrc
DEFINES += QT_NO_CAST_TO_ASCII
......
......@@ -29,103 +29,111 @@
**
**************************************************************************/
#include "maemoremoteprocessesdialog.h"
#include "ui_maemoremoteprocessesdialog.h"
#include "remotelinuxprocessesdialog.h"
#include "ui_remotelinuxprocessesdialog.h"
#include "linuxdeviceconfiguration.h"
#include "maemoremoteprocesslist.h"
#include "remotelinuxprocesslist.h"
#include <QtGui/QMessageBox>
#include <QtGui/QSortFilterProxyModel>
namespace RemoteLinux {
namespace Internal {
class RemoteLinuxProcessesDialogPrivate
{
public:
RemoteLinuxProcessesDialogPrivate(AbstractRemoteLinuxProcessList *processList)
: processList(processList)
{
}
Ui::RemoteLinuxProcessesDialog ui;
AbstractRemoteLinuxProcessList * const processList;
QSortFilterProxyModel proxyModel;
};
} // namespace Internal
MaemoRemoteProcessesDialog::MaemoRemoteProcessesDialog(const LinuxDeviceConfiguration::ConstPtr &devConfig,
QWidget *parent):
QDialog(parent),
m_ui(new Ui::MaemoRemoteProcessesDialog),
m_processList(new MaemoRemoteProcessList(devConfig, this)),
m_proxyModel(new QSortFilterProxyModel(this))
using namespace Internal;
RemoteLinuxProcessesDialog::RemoteLinuxProcessesDialog(AbstractRemoteLinuxProcessList *processList,
QWidget *parent)
: QDialog(parent), m_d(new RemoteLinuxProcessesDialogPrivate(processList))
{
m_ui->setupUi(this);
m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
m_proxyModel->setSourceModel(m_processList);
m_proxyModel->setDynamicSortFilter(true);
m_proxyModel->setFilterKeyColumn(1);
m_ui->tableView->setModel(m_proxyModel);
connect(m_ui->processFilterLineEdit, SIGNAL(textChanged(QString)),
m_proxyModel, SLOT(setFilterRegExp(QString)));
// Manually gathered process information is missing the command line for
// some system processes. Dont's show these lines by default.
if (devConfig->osType() == LinuxDeviceConfiguration::Maemo5OsType)
m_ui->processFilterLineEdit->setText(QLatin1String("[^ ]+"));
connect(m_ui->tableView->selectionModel(),
processList->setParent(this);
m_d->ui.setupUi(this);
m_d->ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
m_d->proxyModel.setSourceModel(m_d->processList);
m_d->proxyModel.setDynamicSortFilter(true);
m_d->proxyModel.setFilterKeyColumn(1);
m_d->ui.tableView->setModel(&m_d->proxyModel);
connect(m_d->ui.processFilterLineEdit, SIGNAL(textChanged(QString)),
&m_d->proxyModel, SLOT(setFilterRegExp(QString)));
connect(m_d->ui.tableView->selectionModel(),
SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
SLOT(handleSelectionChanged()));
connect(m_ui->updateListButton, SIGNAL(clicked()),
connect(m_d->ui.updateListButton, SIGNAL(clicked()),
SLOT(updateProcessList()));
connect(m_ui->killProcessButton, SIGNAL(clicked()), SLOT(killProcess()));
connect(m_processList, SIGNAL(error(QString)),
connect(m_d->ui.killProcessButton, SIGNAL(clicked()), SLOT(killProcess()));
connect(m_d->processList, SIGNAL(error(QString)),
SLOT(handleRemoteError(QString)));
connect(m_processList, SIGNAL(modelReset()),
connect(m_d->processList, SIGNAL(modelReset()),
SLOT(handleProcessListUpdated()));
connect(m_processList, SIGNAL(processKilled()),
connect(m_d->processList, SIGNAL(processKilled()),
SLOT(handleProcessKilled()), Qt::QueuedConnection);
connect(m_proxyModel, SIGNAL(layoutChanged()),
connect(&m_d->proxyModel, SIGNAL(layoutChanged()),
SLOT(handleProcessListUpdated()));
handleSelectionChanged();
updateProcessList();
}
MaemoRemoteProcessesDialog::~MaemoRemoteProcessesDialog()
RemoteLinuxProcessesDialog::~RemoteLinuxProcessesDialog()
{
delete m_ui;
delete m_d;
}
void MaemoRemoteProcessesDialog::handleRemoteError(const QString &errorMsg)
void RemoteLinuxProcessesDialog::handleRemoteError(const QString &errorMsg)
{
QMessageBox::critical(this, tr("Remote Error"), errorMsg);
m_ui->updateListButton->setEnabled(true);
m_d->ui.updateListButton->setEnabled(true);
handleSelectionChanged();
}
void MaemoRemoteProcessesDialog::handleProcessListUpdated()
void RemoteLinuxProcessesDialog::handleProcessListUpdated()
{
m_ui->updateListButton->setEnabled(true);
m_ui->tableView->resizeRowsToContents();
m_d->ui.updateListButton->setEnabled(true);
m_d->ui.tableView->resizeRowsToContents();
handleSelectionChanged();
}
void MaemoRemoteProcessesDialog::updateProcessList()
void RemoteLinuxProcessesDialog::updateProcessList()
{
m_ui->updateListButton->setEnabled(false);
m_ui->killProcessButton->setEnabled(false);
m_processList->update();
m_d->ui.updateListButton->setEnabled(false);
m_d->ui.killProcessButton->setEnabled(false);
m_d->processList->update();
}
void MaemoRemoteProcessesDialog::killProcess()
void RemoteLinuxProcessesDialog::killProcess()
{
const QModelIndexList &indexes
= m_ui->tableView->selectionModel()->selectedIndexes();
= m_d->ui.tableView->selectionModel()->selectedIndexes();
if (indexes.empty())
return;
m_ui->updateListButton->setEnabled(false);
m_ui->killProcessButton->setEnabled(false);
m_processList->killProcess(m_proxyModel->mapToSource(indexes.first()).row());
m_d->ui.updateListButton->setEnabled(false);
m_d->ui.killProcessButton->setEnabled(false);
m_d->processList->killProcess(m_d->proxyModel.mapToSource(indexes.first()).row());
}
void MaemoRemoteProcessesDialog::handleProcessKilled()
void RemoteLinuxProcessesDialog::handleProcessKilled()
{
updateProcessList();
}
void MaemoRemoteProcessesDialog::handleSelectionChanged()
void RemoteLinuxProcessesDialog::handleSelectionChanged()
{
m_ui->killProcessButton->setEnabled(m_ui->tableView->selectionModel()->hasSelection());
m_d->ui.killProcessButton->setEnabled(m_d->ui.tableView->selectionModel()->hasSelection());
}
} // namespace Internal
} // namespace RemoteLinux
......@@ -28,34 +28,28 @@
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#ifndef REMOTELINUXPROCESSESDIALOG_H
#define REMOTELINUXPROCESSESDIALOG_H
#ifndef MAEMOREMOTEPROCESSDIALOG_H
#define MAEMOREMOTEPROCESSDIALOG_H
#include "remotelinux_export.h"
#include <QtCore/QSharedPointer>
#include <QtGui/QDialog>
QT_BEGIN_NAMESPACE
namespace Ui {
class MaemoRemoteProcessesDialog;
}