Commit 742019e3 authored by Kai Koehne's avatar Kai Koehne

Debugger: Fix QML-only debugging on Harmattan

Actually wait for the 'Waiting for debugger on port ' ... message
to appear in the application output before connecting, and also
use the port specified there.

Change-Id: Ib498e5306bc49f2f3d468353b1c5d1ea38a809e6
Reviewed-by: default avatarChristian Kandeler <christian.kandeler@nokia.com>
parent 08786b09
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "qdeclarativeoutputparser.h" #include "qdeclarativeoutputparser.h"
#include "qmljsdebugclientconstants.h" #include "qmljsdebugclientconstants.h"
#include <QRegExp>
namespace QmlJsDebugClient { namespace QmlJsDebugClient {
...@@ -70,7 +71,22 @@ void QDeclarativeOutputParser::processOutput(const QString &output) ...@@ -70,7 +71,22 @@ void QDeclarativeOutputParser::processOutput(const QString &output)
static QString connectionEstablished = QLatin1String(Constants::STR_CONNECTION_ESTABLISHED); static QString connectionEstablished = QLatin1String(Constants::STR_CONNECTION_ESTABLISHED);
if (status.startsWith(waitingForConnection)) { if (status.startsWith(waitingForConnection)) {
emit waitingForConnectionMessage(); status.remove(0, waitingForConnection.size()); // chop of 'Waiting for connection '
static QRegExp waitingTcp(
QString::fromLatin1(Constants::STR_ON_PORT_PATTERN));
if (waitingTcp.indexIn(status) > -1) {
bool canConvert;
quint16 port = waitingTcp.cap(1).toUShort(&canConvert);
if (canConvert)
emit waitingForConnectionOnPort(port);
continue;
}
static QString waitingOst
= QLatin1String(Constants::STR_VIA_OST);
if (status.startsWith(waitingOst))
emit waitingForConnectionViaOst();
} else if (status.startsWith(unableToListen)) { } else if (status.startsWith(unableToListen)) {
//: Error message shown after 'Could not connect ... debugger:" //: Error message shown after 'Could not connect ... debugger:"
emit errorMessage(tr("The port seems to be in use.")); emit errorMessage(tr("The port seems to be in use."));
......
...@@ -48,7 +48,8 @@ public: ...@@ -48,7 +48,8 @@ public:
void processOutput(const QString &output); void processOutput(const QString &output);
signals: signals:
void waitingForConnectionMessage(); void waitingForConnectionOnPort(quint16 port);
void waitingForConnectionViaOst();
void connectionEstablishedMessage(); void connectionEstablishedMessage();
void errorMessage(const QString &detailedError); void errorMessage(const QString &detailedError);
void unknownMessage(const QString &unknownMessage); void unknownMessage(const QString &unknownMessage);
......
...@@ -5,6 +5,8 @@ namespace QmlJsDebugClient { ...@@ -5,6 +5,8 @@ namespace QmlJsDebugClient {
namespace Constants { namespace Constants {
const char STR_WAITING_FOR_CONNECTION[] = "Waiting for connection "; const char STR_WAITING_FOR_CONNECTION[] = "Waiting for connection ";
const char STR_ON_PORT_PATTERN[] = "on port (\\d+)";
const char STR_VIA_OST[] = "via OST";
const char STR_UNABLE_TO_LISTEN[] = "Unable to listen "; const char STR_UNABLE_TO_LISTEN[] = "Unable to listen ";
const char STR_IGNORING_DEBUGGER[] = "Ignoring \"-qmljsdebugger="; const char STR_IGNORING_DEBUGGER[] = "Ignoring \"-qmljsdebugger=";
const char STR_IGNORING_DEBUGGER2[] = "Ignoring\"-qmljsdebugger="; // There is (was?) a bug in one of the error strings - safest to handle both const char STR_IGNORING_DEBUGGER2[] = "Ignoring\"-qmljsdebugger="; // There is (was?) a bug in one of the error strings - safest to handle both
......
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
#include "qmladapter.h" #include "qmladapter.h"
#include "debuggerstartparameters.h"
#include "qscriptdebuggerclient.h" #include "qscriptdebuggerclient.h"
#include "qmlv8debuggerclient.h" #include "qmlv8debuggerclient.h"
#include "qmljsprivateapi.h" #include "qmljsprivateapi.h"
...@@ -46,6 +45,7 @@ ...@@ -46,6 +45,7 @@
#include <QTimer> #include <QTimer>
#include <QDebug> #include <QDebug>
#include <QWeakPointer>
namespace Debugger { namespace Debugger {
namespace Internal { namespace Internal {
...@@ -108,23 +108,28 @@ QmlAdapter::~QmlAdapter() ...@@ -108,23 +108,28 @@ QmlAdapter::~QmlAdapter()
delete d; delete d;
} }
void QmlAdapter::beginConnection() void QmlAdapter::beginConnectionTcp(const QString &address, quint16 port)
{ {
if (d->m_engine.isNull() if (d->m_engine.isNull()
|| (d->m_conn && d->m_conn->state() != QAbstractSocket::UnconnectedState)) || (d->m_conn && d->m_conn->state() != QAbstractSocket::UnconnectedState))
return; return;
const DebuggerStartParameters &parameters = d->m_engine.data()->startParameters(); showConnectionStatusMessage(tr("Connecting to debug server %1:%2").arg(address).arg(
if (parameters.communicationChannel == DebuggerStartParameters::CommunicationChannelUsb) { QString::number(port)));
const QString &port = parameters.remoteChannel; d->m_conn->connectToHost(address, port);
showConnectionStatusMessage(tr("Connecting to debug server on %1").arg(port));
d->m_conn->connectToOst(port); //A timeout to check the connection state
} else { d->m_connectionTimer.start();
const QString &address = parameters.qmlServerAddress; }
quint16 port = parameters.qmlServerPort;
showConnectionStatusMessage(tr("Connecting to debug server %1:%2").arg(address).arg(QString::number(port))); void QmlAdapter::beginConnectionOst(const QString &channel)
d->m_conn->connectToHost(address, port); {
} if (d->m_engine.isNull()
|| (d->m_conn && d->m_conn->state() != QAbstractSocket::UnconnectedState))
return;
showConnectionStatusMessage(tr("Connecting to debug server on %1").arg(channel));
d->m_conn->connectToOst(channel);
//A timeout to check the connection state //A timeout to check the connection state
d->m_connectionTimer.start(); d->m_connectionTimer.start();
......
...@@ -62,7 +62,8 @@ public: ...@@ -62,7 +62,8 @@ public:
explicit QmlAdapter(DebuggerEngine *engine, QObject *parent = 0); explicit QmlAdapter(DebuggerEngine *engine, QObject *parent = 0);
virtual ~QmlAdapter(); virtual ~QmlAdapter();
void beginConnection(); void beginConnectionTcp(const QString &address, quint16 port);
void beginConnectionOst(const QString &port);
void closeConnection(); void closeConnection();
bool isConnected() const; bool isConnected() const;
......
...@@ -172,7 +172,9 @@ QmlEngine::QmlEngine(const DebuggerStartParameters &startParameters, ...@@ -172,7 +172,9 @@ QmlEngine::QmlEngine(const DebuggerStartParameters &startParameters,
SLOT(start())); SLOT(start()));
d->m_outputParser.setNoOutputText(ApplicationLauncher::msgWinCannotRetrieveDebuggingOutput()); d->m_outputParser.setNoOutputText(ApplicationLauncher::msgWinCannotRetrieveDebuggingOutput());
connect(&d->m_outputParser, SIGNAL(waitingForConnectionMessage()), connect(&d->m_outputParser, SIGNAL(waitingForConnectionOnPort(quint16)),
this, SLOT(beginConnection(quint16)));
connect(&d->m_outputParser, SIGNAL(waitingForConnectionViaOst()),
this, SLOT(beginConnection())); this, SLOT(beginConnection()));
connect(&d->m_outputParser, SIGNAL(noOutputMessage()), connect(&d->m_outputParser, SIGNAL(noOutputMessage()),
this, SLOT(beginConnection())); this, SLOT(beginConnection()));
...@@ -235,10 +237,29 @@ void QmlEngine::connectionEstablished() ...@@ -235,10 +237,29 @@ void QmlEngine::connectionEstablished()
notifyEngineRunAndInferiorRunOk(); notifyEngineRunAndInferiorRunOk();
} }
void QmlEngine::beginConnection() void QmlEngine::beginConnection(quint16 port)
{ {
d->m_noDebugOutputTimer.stop(); d->m_noDebugOutputTimer.stop();
d->m_adapter.beginConnection(); if (port > 0) {
QTC_CHECK(startParameters().communicationChannel
== DebuggerStartParameters::CommunicationChannelTcpIp);
QTC_ASSERT(startParameters().connParams.port == 0
|| startParameters().connParams.port == port,
qWarning() << "Port " << port << "from application output does not match"
<< startParameters().connParams.port << "from start parameters.")
d->m_adapter.beginConnectionTcp(startParameters().qmlServerAddress, port);
return;
}
if (startParameters().communicationChannel
== DebuggerStartParameters::CommunicationChannelTcpIp) {
// no port from application output, use the one from start parameters ...
d->m_adapter.beginConnectionTcp(startParameters().qmlServerAddress,
startParameters().qmlServerPort);
} else {
QTC_CHECK(startParameters().communicationChannel
== DebuggerStartParameters::CommunicationChannelUsb);
d->m_adapter.beginConnectionOst(startParameters().remoteChannel);
}
} }
void QmlEngine::connectionStartupFailed() void QmlEngine::connectionStartupFailed()
...@@ -393,8 +414,6 @@ void QmlEngine::runEngine() ...@@ -393,8 +414,6 @@ void QmlEngine::runEngine()
if (!isSlaveEngine()) { if (!isSlaveEngine()) {
if (startParameters().startMode != AttachToRemoteServer) if (startParameters().startMode != AttachToRemoteServer)
startApplicationLauncher(); startApplicationLauncher();
else
beginConnection();
} }
} }
......
...@@ -159,7 +159,7 @@ signals: ...@@ -159,7 +159,7 @@ signals:
TextEditor::ITextEditor *editor, int cursorPos); TextEditor::ITextEditor *editor, int cursorPos);
private slots: private slots:
void beginConnection(); void beginConnection(quint16 port = 0);
void connectionEstablished(); void connectionEstablished();
void connectionStartupFailed(); void connectionStartupFailed();
void connectionError(QAbstractSocket::SocketError error); void connectionError(QAbstractSocket::SocketError error);
......
...@@ -149,7 +149,9 @@ QmlProfilerEngine::QmlProfilerEngine(IAnalyzerTool *tool, ...@@ -149,7 +149,9 @@ QmlProfilerEngine::QmlProfilerEngine(IAnalyzerTool *tool,
connect(&d->m_noDebugOutputTimer, SIGNAL(timeout()), this, SLOT(processIsRunning())); connect(&d->m_noDebugOutputTimer, SIGNAL(timeout()), this, SLOT(processIsRunning()));
d->m_outputParser.setNoOutputText(ApplicationLauncher::msgWinCannotRetrieveDebuggingOutput()); d->m_outputParser.setNoOutputText(ApplicationLauncher::msgWinCannotRetrieveDebuggingOutput());
connect(&d->m_outputParser, SIGNAL(waitingForConnectionMessage()), connect(&d->m_outputParser, SIGNAL(waitingForConnectionOnPort(quint16)),
this, SLOT(processIsRunning(quint16)));
connect(&d->m_outputParser, SIGNAL(waitingForConnectionViaOst()),
this, SLOT(processIsRunning())); this, SLOT(processIsRunning()));
connect(&d->m_outputParser, SIGNAL(noOutputMessage()), connect(&d->m_outputParser, SIGNAL(noOutputMessage()),
this, SLOT(processIsRunning())); this, SLOT(processIsRunning()));
...@@ -331,10 +333,19 @@ void QmlProfilerEngine::showNonmodalWarning(const QString &warningMsg) ...@@ -331,10 +333,19 @@ void QmlProfilerEngine::showNonmodalWarning(const QString &warningMsg)
noExecWarning->show(); noExecWarning->show();
} }
void QmlProfilerEngine::processIsRunning() void QmlProfilerEngine::processIsRunning(quint16 port)
{ {
d->m_noDebugOutputTimer.stop(); d->m_noDebugOutputTimer.stop();
emit processRunning(d->m_runner->debugPort());
QTC_ASSERT(port == 0
|| port == d->m_runner->debugPort(),
qWarning() << "Port " << port << "from application output does not match"
<< startParameters().connParams.port << "from start parameters.");
if (port > 0)
emit processRunning(port);
else
emit processRunning(d->m_runner->debugPort());
} }
} // namespace Internal } // namespace Internal
......
...@@ -70,7 +70,7 @@ private slots: ...@@ -70,7 +70,7 @@ private slots:
void logApplicationMessage(const QString &msg, Utils::OutputFormat format); void logApplicationMessage(const QString &msg, Utils::OutputFormat format);
void wrongSetupMessageBox(const QString &errorMessage); void wrongSetupMessageBox(const QString &errorMessage);
void wrongSetupMessageBoxFinished(int); void wrongSetupMessageBoxFinished(int);
void processIsRunning(); void processIsRunning(quint16 port = 0);
private: private:
class QmlProfilerEnginePrivate; class QmlProfilerEnginePrivate;
......
...@@ -99,7 +99,7 @@ DebuggerStartParameters AbstractRemoteLinuxDebugSupport::startParameters(const R ...@@ -99,7 +99,7 @@ DebuggerStartParameters AbstractRemoteLinuxDebugSupport::startParameters(const R
if (runConfig->useQmlDebugger()) { if (runConfig->useQmlDebugger()) {
params.languages |= QmlLanguage; params.languages |= QmlLanguage;
params.qmlServerAddress = runConfig->deviceConfig()->sshParameters().host; params.qmlServerAddress = runConfig->deviceConfig()->sshParameters().host;
params.qmlServerPort = -1; params.qmlServerPort = 0; // port is selected later on
} }
if (runConfig->debuggerAspect()->useCppDebugger()) { if (runConfig->debuggerAspect()->useCppDebugger()) {
params.languages |= CppLanguage; params.languages |= CppLanguage;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment