diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.cpp new file mode 100644 index 00000000000..a2b45dd0b4c --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.cpp @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of Qt Creator. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "maemoremoteprocessesdialog.h" +#include "ui_maemoremoteprocessesdialog.h" + +#include "maemoremoteprocesslist.h" + +#include +#include + +namespace Qt4ProjectManager { +namespace Internal { + +MaemoRemoteProcessesDialog::MaemoRemoteProcessesDialog(const Core::SshConnectionParameters ¶ms, + QWidget *parent) : + QDialog(parent), + m_ui(new Ui::MaemoRemoteProcessesDialog), + m_processList(new MaemoRemoteProcessList(params, this)), + m_proxyModel(new QSortFilterProxyModel(this)) +{ + m_ui->setupUi(this); + m_ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_proxyModel->setSourceModel(m_processList); + m_proxyModel->setDynamicSortFilter(true); + m_ui->tableView->setModel(m_proxyModel); + connect(m_ui->tableView->selectionModel(), + SIGNAL(selectionChanged(QItemSelection,QItemSelection)), + SLOT(handleSelectionChanged())); + connect(m_ui->updateListButton, SIGNAL(clicked()), + SLOT(updateProcessList())); + connect(m_ui->killProcessButton, SIGNAL(clicked()), SLOT(killProcess())); + connect(m_processList, SIGNAL(error(QString)), + SLOT(handleRemoteError(QString))); + connect(m_processList, SIGNAL(modelReset()), + SLOT(handleProcessListUpdated())); + connect(m_processList, SIGNAL(processKilled()), + SLOT(handleProcessKilled()), Qt::QueuedConnection); + connect(m_proxyModel, SIGNAL(layoutChanged()), + SLOT(handleProcessListUpdated())); + handleSelectionChanged(); + updateProcessList(); +} + +MaemoRemoteProcessesDialog::~MaemoRemoteProcessesDialog() +{ + delete m_ui; +} + +void MaemoRemoteProcessesDialog::handleRemoteError(const QString &errorMsg) +{ + QMessageBox::critical(this, tr("Remote error"), errorMsg); + m_ui->updateListButton->setEnabled(true); + handleSelectionChanged(); +} + +void MaemoRemoteProcessesDialog::handleProcessListUpdated() +{ + m_ui->updateListButton->setEnabled(true); + m_ui->tableView->resizeRowsToContents(); + handleSelectionChanged(); +} + +void MaemoRemoteProcessesDialog::updateProcessList() +{ + m_ui->updateListButton->setEnabled(false); + m_ui->killProcessButton->setEnabled(false); + m_processList->update(); +} + +void MaemoRemoteProcessesDialog::killProcess() +{ + const QModelIndexList &indexes + = m_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()); +} + +void MaemoRemoteProcessesDialog::handleProcessKilled() +{ + updateProcessList(); +} + +void MaemoRemoteProcessesDialog::handleSelectionChanged() +{ + m_ui->killProcessButton->setEnabled(m_ui->tableView->selectionModel()->hasSelection()); +} + +} // namespace Internal +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.h b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.h new file mode 100644 index 00000000000..b0ad6c01d58 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of Qt Creator. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef MAEMOREMOTEPROCESSDIALOG_H +#define MAEMOREMOTEPROCESSDIALOG_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { + class MaemoRemoteProcessesDialog; +} +class QSortFilterProxyModel; +QT_END_NAMESPACE + +namespace Core { class SshConnectionParameters; } + +namespace Qt4ProjectManager { +namespace Internal { +class MaemoRemoteProcessList; + +class MaemoRemoteProcessesDialog : public QDialog +{ + Q_OBJECT + +public: + explicit MaemoRemoteProcessesDialog(const Core::SshConnectionParameters ¶ms, + QWidget *parent = 0); + ~MaemoRemoteProcessesDialog(); + +private slots: + void updateProcessList(); + void killProcess(); + void handleRemoteError(const QString &errorMsg); + void handleProcessListUpdated(); + void handleProcessKilled(); + void handleSelectionChanged(); + +private: + Ui::MaemoRemoteProcessesDialog *m_ui; + MaemoRemoteProcessList *const m_processList; + QSortFilterProxyModel *const m_proxyModel; +}; + +} // namespace Internal +} // namespace Qt4ProjectManager + +#endif // MAEMOREMOTEPROCESSDIALOG_H diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.ui b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.ui new file mode 100644 index 00000000000..6b02f228e7a --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocessesdialog.ui @@ -0,0 +1,125 @@ + + + MaemoRemoteProcessesDialog + + + + 0 + 0 + 766 + 684 + + + + Dialog + + + + + + Processes running on remote host: + + + + + + + + + false + + + true + + + 100 + + + true + + + false + + + + + + + + + Update List + + + + + + + Kill Selected Process + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + buttonBox + accepted() + MaemoRemoteProcessesDialog + accept() + + + 257 + 290 + + + 157 + 274 + + + + + buttonBox + rejected() + MaemoRemoteProcessesDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocesslist.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocesslist.cpp new file mode 100644 index 00000000000..212b6ae5f63 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocesslist.cpp @@ -0,0 +1,248 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of Qt Creator. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "maemoremoteprocesslist.h" + +#include + +#include + +using namespace Core; + +namespace Qt4ProjectManager { +namespace Internal { +namespace { +const QByteArray LineSeparator1("---"); +const QByteArray LineSeparator2("QTCENDOFLINE---"); +const QByteArray LineSeparator = LineSeparator1 + LineSeparator2; +} // anonymous namespace + +MaemoRemoteProcessList::MaemoRemoteProcessList(const Core::SshConnectionParameters ¶ms, + QObject *parent) + : QAbstractTableModel(parent), + m_process(SshRemoteProcessRunner::create(params)), + m_state(Inactive) +{ +} + +MaemoRemoteProcessList::~MaemoRemoteProcessList() {} + +void MaemoRemoteProcessList::update() +{ + if (m_state != Inactive) { + qDebug("%s: Did not expect state to be %d.", Q_FUNC_INFO, m_state); + stop(); + } + beginResetModel(); + m_remoteProcs.clear(); + const QByteArray command = QByteArray() + + "sep1=" + LineSeparator1 + '\n' + + "sep2=" + LineSeparator2 + '\n' + + "pidlist=`ls /proc |grep -E '^[[:digit:]]+$' |sort -n`; " + + "for pid in $pidlist\n" + + "do\n" + + " echo -n \"$pid \"\n" + + " tr '\\0' ' ' < /proc/$pid/cmdline\n" + + " echo -n \"$sep1$sep2\"\n" + + "done\n" + + "echo ''"; + startProcess(command, Listing); +} + +void MaemoRemoteProcessList::killProcess(int row) +{ + Q_ASSERT(row >= 0 && row < m_remoteProcs.count()); + const QByteArray command + = "kill -9 " + QByteArray::number(m_remoteProcs.at(row).pid); + startProcess(command, Killing); +} + +void MaemoRemoteProcessList::startProcess(const QByteArray &cmdLine, + State newState) +{ + if (m_state != Inactive) { + qDebug("%s: Did not expect state to be %d.", Q_FUNC_INFO, m_state); + stop(); + } + m_state = newState; + connect(m_process.data(), SIGNAL(connectionError(Core::SshError)), + SLOT(handleConnectionError())); + connect(m_process.data(), SIGNAL(processOutputAvailable(QByteArray)), + SLOT(handleRemoteStdOut(QByteArray))); + connect(m_process.data(), + SIGNAL(processErrorOutputAvailable(QByteArray)), + SLOT(handleRemoteStdErr(QByteArray))); + connect(m_process.data(), SIGNAL(processClosed(int)), + SLOT(handleRemoteProcessFinished(int))); + m_remoteStdout.clear(); + m_remoteStderr.clear(); + m_errorMsg.clear(); + m_process->run(cmdLine); +} + +void MaemoRemoteProcessList::handleConnectionError() +{ + if (m_state == Inactive) + return; + + emit error(tr("Connection failure: %1") + .arg(m_process->connection()->errorString())); + stop(); +} + +void MaemoRemoteProcessList::handleRemoteStdOut(const QByteArray &output) +{ + if (m_state == Listing) + m_remoteStdout += output; +} + +void MaemoRemoteProcessList::handleRemoteStdErr(const QByteArray &output) +{ + if (m_state != Inactive) + m_remoteStderr += output; +} + +void MaemoRemoteProcessList::handleRemoteProcessFinished(int exitStatus) +{ + if (m_state == Inactive) + return; + + switch (exitStatus) { + case SshRemoteProcess::FailedToStart: + m_errorMsg = tr("Error: Remote process failed to start: %1") + .arg(m_process->process()->errorString()); + break; + case SshRemoteProcess::KilledBySignal: + m_errorMsg = tr("Error: Remote process crashed: %1") + .arg(m_process->process()->errorString()); + break; + case SshRemoteProcess::ExitedNormally: + if (m_process->process()->exitCode() == 0) { + if (m_state == Listing) + buildProcessList(); + } else { + m_errorMsg = tr("Remote process failed."); + } + break; + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid exit status"); + } + + if (!m_errorMsg.isEmpty()) { + if (!m_remoteStderr.isEmpty()) { + m_errorMsg += tr("\nRemote stderr was: %1") + .arg(QString::fromUtf8(m_remoteStderr)); + } + emit error(m_errorMsg); + } + stop(); +} + +void MaemoRemoteProcessList::stop() +{ + if (m_state == Inactive) + return; + + disconnect(m_process.data(), 0, this, 0); + if (m_state == Listing) + endResetModel(); + else if (m_errorMsg.isEmpty()) + emit processKilled(); + m_state = Inactive; +} + +void MaemoRemoteProcessList::buildProcessList() +{ + const QString remoteOutput = QString::fromUtf8(m_remoteStdout); + const QStringList &lines + = remoteOutput.split(QString::fromUtf8(LineSeparator)); + foreach (const QString &line, lines) { + const int pidEndPos = line.indexOf(' '); + if (pidEndPos == -1) + continue; + bool isNumber; + const int pid = line.left(pidEndPos).toInt(&isNumber); + if (!isNumber) { + qDebug("%s: Non-integer value where pid was expected. Line was: '%s'", + Q_FUNC_INFO, qPrintable(line)); + continue; + } + m_remoteProcs << RemoteProc(pid, line.mid(pidEndPos)); + } +} + +int MaemoRemoteProcessList::rowCount(const QModelIndex &parent) const +{ + return parent.isValid() ? 0 : m_remoteProcs.count(); +} + +int MaemoRemoteProcessList::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return 2; +} + +QVariant MaemoRemoteProcessList::headerData(int section, + Qt::Orientation orientation, int role) const +{ + if (orientation != Qt::Horizontal || role != Qt::DisplayRole + || section < 0 || section >= columnCount()) + return QVariant(); + if (section == 0) + return tr("PID"); + else + return tr("Command Line"); +} + +QVariant MaemoRemoteProcessList::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() >= rowCount(index.parent()) + || index.column() >= columnCount() || role != Qt::DisplayRole) + return QVariant(); + const RemoteProc &proc = m_remoteProcs.at(index.row()); + if (index.column() == 0) + return proc.pid; + else + return proc.cmdLine; +} + +} // namespace Internal +} // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocesslist.h b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocesslist.h new file mode 100644 index 00000000000..c524e4d5af7 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/maemoremoteprocesslist.h @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of Qt Creator. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MAEMOREMOTEPROCESSLIST_H +#define MAEMOREMOTEPROCESSLIST_H + +#include +#include +#include +#include +#include + +namespace Core { +class SshConnectionParameters; +class SshRemoteProcessRunner; +} + +namespace Qt4ProjectManager { +namespace Internal { + +class MaemoRemoteProcessList : public QAbstractTableModel +{ + Q_OBJECT +public: + explicit MaemoRemoteProcessList(const Core::SshConnectionParameters ¶ms, + QObject *parent = 0); + ~MaemoRemoteProcessList(); + void update(); + void killProcess(int row); + +signals: + void error(const QString &errorMsg); + void processKilled(); + +private slots: + void handleRemoteStdOut(const QByteArray &output); + void handleRemoteStdErr(const QByteArray &output); + void handleConnectionError(); + void handleRemoteProcessFinished(int exitStatus); + +private: + enum State { Inactive, Listing, Killing }; + + virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; + virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; + virtual QVariant data(const QModelIndex &index, + int role = Qt::DisplayRole) const; + virtual QVariant headerData(int section, Qt::Orientation orientation, + int role = Qt::DisplayRole) const; + + void buildProcessList(); + void stop(); + void startProcess(const QByteArray &cmdLine, State newState); + + const QSharedPointer m_process; + QByteArray m_remoteStdout; + QByteArray m_remoteStderr; + QString m_errorMsg; + State m_state; + + struct RemoteProc { + RemoteProc(int pid, const QString &cmdLine) + : pid(pid), cmdLine(cmdLine) {} + int pid; + QString cmdLine; + }; + QList m_remoteProcs; +}; + +} // namespace Internal +} // namespace Qt4ProjectManager + +#endif // MAEMOREMOTEPROCESSLIST_H diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.cpp index bef307b311a..ed3c933abb3 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.cpp @@ -38,6 +38,7 @@ #include "maemoconfigtestdialog.h" #include "maemodeviceconfigurations.h" +#include "maemoremoteprocessesdialog.h" #include "maemosshconfigdialog.h" #include @@ -342,6 +343,12 @@ void MaemoSettingsWidget::showGenerateSshKeyDialog() dialog.exec(); } +void MaemoSettingsWidget::showRemoteProcesses() +{ + MaemoRemoteProcessesDialog dlg(currentConfig().server, this); + dlg.exec(); +} + void MaemoSettingsWidget::setPrivateKey(const QString &path) { m_ui->keyFileLineEdit->setPath(path); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.h b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.h index 344cbbc196f..09b49d54196 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.h @@ -82,6 +82,7 @@ private slots: void keyFileEditingFinished(); void showPassword(bool showClearText); void handleFreePortsChanged(); + void showRemoteProcesses(); // For configuration testing. void testConfig(); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui index b2f03d3e763..c5f3ba88fd4 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui @@ -368,6 +368,13 @@ + + + + Remote Processes ... + + + @@ -438,7 +445,7 @@ userNameEditingFinished() - 425 + 384 302 @@ -454,7 +461,7 @@ passwordEditingFinished() - 297 + 256 334 @@ -534,7 +541,7 @@ keyFileEditingFinished() - 425 + 384 356 @@ -550,7 +557,7 @@ keyFileEditingFinished() - 425 + 384 356 @@ -710,7 +717,7 @@ showPassword(bool) - 424 + 383 332 @@ -735,6 +742,22 @@ + + remoteProcessesButton + clicked() + MaemoSettingsWidget + showRemoteProcesses() + + + 443 + 183 + + + 598 + 378 + + + configNameEditingFinished() @@ -756,5 +779,6 @@ showGenerateSshKeyDialog() showPassword(bool) handleFreePortsChanged() + showRemoteProcesses() diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri index d6869e1b08d..ddf9f5723c7 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri +++ b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri @@ -32,7 +32,9 @@ HEADERS += \ $$PWD/maemomountspecification.h \ $$PWD/maemoremotemounter.h \ $$PWD/maemoprofilesupdatedialog.h \ - $$PWD/maemousedportsgatherer.h + $$PWD/maemousedportsgatherer.h \ + $$PWD/maemoremoteprocesslist.h \ + $$PWD/maemoremoteprocessesdialog.h SOURCES += \ $$PWD/maemoconfigtestdialog.cpp \ @@ -66,7 +68,9 @@ SOURCES += \ $$PWD/maemomountspecification.cpp \ $$PWD/maemoremotemounter.cpp \ $$PWD/maemoprofilesupdatedialog.cpp \ - $$PWD/maemousedportsgatherer.cpp + $$PWD/maemousedportsgatherer.cpp \ + $$PWD/maemoremoteprocesslist.cpp \ + $$PWD/maemoremoteprocessesdialog.cpp FORMS += \ $$PWD/maemoconfigtestdialog.ui \ @@ -74,6 +78,7 @@ FORMS += \ $$PWD/maemosshconfigdialog.ui \ $$PWD/maemopackagecreationwidget.ui \ $$PWD/maemodeploystepwidget.ui \ - $$PWD/maemoprofilesupdatedialog.ui + $$PWD/maemoprofilesupdatedialog.ui \ + $$PWD/maemoremoteprocessesdialog.ui RESOURCES += $$PWD/qt-maemo.qrc