diff --git a/src/plugins/valgrind/memcheck/memcheckrunner.cpp b/src/plugins/valgrind/memcheck/memcheckrunner.cpp index 25dcf7785febafa37664ac6141200845204625b9..8920ec09af76e1c327925eff3d563177116fb445 100644 --- a/src/plugins/valgrind/memcheck/memcheckrunner.cpp +++ b/src/plugins/valgrind/memcheck/memcheckrunner.cpp @@ -105,18 +105,77 @@ bool MemcheckRunner::start() } if (startMode() == Analyzer::StartRemote) { - ip = connectionParameters().host; + + QList<QHostAddress> possibleHostAddresses; + //NOTE: ::allAddresses does not seem to work for usb interfaces... + foreach (const QNetworkInterface &iface, QNetworkInterface::allInterfaces()) { + foreach (const QNetworkAddressEntry &entry, iface.addressEntries()) { + const QHostAddress addr = entry.ip(); + if (addr.toString() != QLatin1String("127.0.0.1") + && addr.toString() != QLatin1String("0:0:0:0:0:0:0:1")) + { + possibleHostAddresses << addr; + break; + } + } + } + + if (possibleHostAddresses.isEmpty()) { + emit processErrorReceived(tr("No network interface found for remote analysis."), + QProcess::FailedToStart); + return false; + } else if (possibleHostAddresses.size() > 1) { + QDialog dlg; + dlg.setWindowTitle(tr("Select Network Interface")); + QVBoxLayout *layout = new QVBoxLayout; + QLabel *description = new QLabel; + description->setWordWrap(true); + description->setText(tr("More than one network interface was found on your machine. Please select which one you want to use for remote analysis.")); + layout->addWidget(description); + QListWidget *list = new QListWidget; + foreach (const QHostAddress &address, possibleHostAddresses) + list->addItem(address.toString()); + + list->setSelectionMode(QAbstractItemView::SingleSelection); + list->setCurrentRow(0); + layout->addWidget(list); + + QDialogButtonBox *buttons = new QDialogButtonBox; + buttons->addButton(QDialogButtonBox::Ok); + buttons->addButton(QDialogButtonBox::Cancel); + connect(buttons, SIGNAL(accepted()), + &dlg, SLOT(accept())); + connect(buttons, SIGNAL(rejected()), + &dlg, SLOT(reject())); + layout->addWidget(buttons); + + dlg.setLayout(layout); + if (dlg.exec() != QDialog::Accepted) { + emit processErrorReceived(tr("No Network Interface was chosen for remote analysis"), QProcess::FailedToStart); + return false; + } + + QTC_ASSERT(list->currentRow() >= 0, return false); + QTC_ASSERT(list->currentRow() < possibleHostAddresses.size(), return false); + hostAddr = possibleHostAddresses.at(list->currentRow()); + } else { + hostAddr = possibleHostAddresses.first(); + } + + ip = hostAddr.toString(); QTC_ASSERT(!ip.isEmpty(), return false); hostAddr = QHostAddress(ip); } bool check = d->xmlServer.listen(hostAddr); + if (!check) emit processErrorReceived( tr("XmlServer on %1: ").arg(ip) + d->xmlServer.errorString(), QProcess::FailedToStart ); QTC_ASSERT(check, return false); d->xmlServer.setMaxPendingConnections(1); const quint16 xmlPortNumber = d->xmlServer.serverPort(); connect(&d->xmlServer, SIGNAL(newConnection()), SLOT(xmlSocketConnected())); check = d->logServer.listen(hostAddr); + if (!check) emit processErrorReceived( tr("LogServer on %1: ").arg(ip) + d->logServer.errorString(), QProcess::FailedToStart ); QTC_ASSERT(check, return false); d->logServer.setMaxPendingConnections(1); const quint16 logPortNumber = d->logServer.serverPort();