Debugger: Add optional 'host' argument to -qmljsdebugger
authorSimjees Abraham <simjees.abraham@nokia.com>
Wed, 14 Mar 2012 12:35:17 +0000 (13:35 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 19 Mar 2012 11:05:03 +0000 (12:05 +0100)
Change-Id: I5bb2e48e2ad2019b8a92f6f8842b88027fcd2d28
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
src/plugins/qmltooling/qmldbg_ost/qmlostplugin.cpp
src/plugins/qmltooling/qmldbg_ost/qmlostplugin.h
src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp
src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h
src/qml/debugger/qqmldebugserver.cpp
src/qml/debugger/qqmldebugserverconnection_p.h
tests/auto/qml/debugger/qqmldebugservice/tst_qqmldebugservice.cpp

index 7d120ca..4dfed6c 100644 (file)
@@ -115,10 +115,11 @@ bool QmlOstPlugin::waitForMessage()
     return d->protocol->waitForReadyRead(-1);
 }
 
-void QmlOstPlugin::setPort(int port, bool block)
+void QmlOstPlugin::setPort(int port, bool block, const QString &hostaddress)
 {
     Q_UNUSED(port);
     Q_UNUSED(block);
+    Q_UNUSED(hostaddress);
 
     Q_D(QmlOstPlugin);
 
index 41c3a07..2579625 100644 (file)
@@ -63,7 +63,7 @@ public:
     ~QmlOstPlugin();
 
     void setServer(QQmlDebugServer *server);
-    void setPort(int port, bool bock);
+    void setPort(int port, bool bock, const QString &hostaddress);
 
     bool isConnected() const;
     void send(const QByteArray &message);
index e5f31b6..724155a 100644 (file)
@@ -56,6 +56,7 @@ public:
 
     int port;
     bool block;
+    QString hostaddress;
     QTcpSocket *socket;
     QPacketProtocol *protocol;
     QTcpServer *tcpServer;
@@ -129,11 +130,12 @@ bool QTcpServerConnection::waitForMessage()
     return d->protocol->waitForReadyRead(-1);
 }
 
-void QTcpServerConnection::setPort(int port, bool block)
+void QTcpServerConnection::setPort(int port, bool block, const QString &hostaddress)
 {
     Q_D(QTcpServerConnection);
     d->port = port;
     d->block = block;
+    d->hostaddress = hostaddress;
 
     listen();
     if (block)
@@ -146,7 +148,17 @@ void QTcpServerConnection::listen()
 
     d->tcpServer = new QTcpServer(this);
     QObject::connect(d->tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection()));
-    if (d->tcpServer->listen(QHostAddress::Any, d->port))
+    QHostAddress hostaddress;
+    if (!d->hostaddress.isEmpty()) {
+        if (!hostaddress.setAddress(d->hostaddress)) {
+            hostaddress = QHostAddress::Any;
+            qDebug("QML Debugger: Incorrect host address provided. So accepting connections "
+                     "from any host.");
+        }
+    } else {
+        hostaddress = QHostAddress::Any;
+    }
+    if (d->tcpServer->listen(hostaddress, d->port))
         qDebug("QML Debugger: Waiting for connection on port %d...", d->port);
     else
         qWarning("QML Debugger: Unable to listen to port %d.", d->port);
@@ -194,4 +206,3 @@ void QTcpServerConnection::invalidPacket()
 }
 
 QT_END_NAMESPACE
-
index e81c9f7..e2b32b0 100644 (file)
@@ -62,7 +62,7 @@ public:
     ~QTcpServerConnection();
 
     void setServer(QQmlDebugServer *server);
-    void setPort(int port, bool bock);
+    void setPort(int port, bool bock, const QString &hostaddress);
 
     bool isConnected() const;
     void send(const QList<QByteArray> &messages);
index ec3f9da..dcf93b4 100644 (file)
@@ -117,9 +117,10 @@ public:
         m_pluginName = pluginName;
     }
 
-    void setPort(int port, bool block) {
+    void setPort(int port, bool block, QString &hostAddress) {
         m_port = port;
         m_block = block;
+        m_hostAddress = hostAddress;
     }
 
     void run();
@@ -128,6 +129,7 @@ private:
     QString m_pluginName;
     int m_port;
     bool m_block;
+    QString m_hostAddress;
 };
 
 QQmlDebugServerPrivate::QQmlDebugServerPrivate() :
@@ -214,7 +216,7 @@ void QQmlDebugServerThread::run()
             = server->d_func()->loadConnectionPlugin(m_pluginName);
     if (connection) {
         connection->setServer(QQmlDebugServer::instance());
-        connection->setPort(m_port, m_block);
+        connection->setPort(m_port, m_block, m_hostAddress);
     } else {
         QCoreApplicationPrivate *appD = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(qApp));
         qWarning() << QString(QLatin1String("QML Debugger: Ignoring \"-qmljsdebugger=%1\". "
@@ -258,8 +260,9 @@ QQmlDebugServer *QQmlDebugServer::instance()
         int port = 0;
         bool block = false;
         bool ok = false;
+        QString hostAddress;
 
-        // format: qmljsdebugger=port:3768[,block] OR qmljsdebugger=ost[,block]
+        // format: qmljsdebugger=port:3768[,host:<ip address>][,block] OR qmljsdebugger=ost[,block]
         if (!appD->qmljsDebugArgumentsString().isEmpty()) {
             if (!QQmlEnginePrivate::qml_debugging_enabled) {
                 qWarning() << QString(QLatin1String(
@@ -270,24 +273,30 @@ QQmlDebugServer *QQmlDebugServer::instance()
             }
 
             QString pluginName;
-            if (appD->qmljsDebugArgumentsString().indexOf(QLatin1String("port:")) == 0) {
-                int separatorIndex = appD->qmljsDebugArgumentsString().indexOf(QLatin1Char(','));
-                port = appD->qmljsDebugArgumentsString().mid(5, separatorIndex - 5).toInt(&ok);
-                pluginName = QStringLiteral("qmldbg_tcp");
-            } else if (appD->qmljsDebugArgumentsString().contains(QLatin1String("ost"))) {
-                pluginName = QStringLiteral("qmldbg_ost");
-                ok = true;
+            QStringList lstjsDebugArguments = appD->qmljsDebugArgumentsString()
+                                                                    .split(QLatin1Char(','));
+            foreach (const QString &strArgument, lstjsDebugArguments) {
+                if (strArgument.startsWith(QLatin1String("port:"))) {
+                    port = strArgument.mid(5).toInt(&ok);
+                    pluginName = QLatin1String("qmldbg_tcp");
+                } else if (strArgument.startsWith(QLatin1String("host:"))) {
+                    hostAddress = strArgument.mid(5);
+                } else if (strArgument == QLatin1String("block")) {
+                    block = true;
+                } else {
+                    qWarning() << QString::fromLatin1("QML Debugger: Invalid argument '%1' "
+                                                      "detected. Ignoring the same.")
+                                                       .arg(strArgument);
+                }
             }
 
-            block = appD->qmljsDebugArgumentsString().contains(QLatin1String("block"));
-
             if (ok) {
                 qQmlDebugServer = new QQmlDebugServer();
                 QQmlDebugServerThread *thread = new QQmlDebugServerThread;
                 qQmlDebugServer->d_func()->thread = thread;
                 qQmlDebugServer->moveToThread(thread);
                 thread->setPluginName(pluginName);
-                thread->setPort(port, block);
+                thread->setPort(port, block, hostAddress);
                 thread->start();
 
                 if (block) {
index ab9e7bd..920e82e 100644 (file)
@@ -69,7 +69,7 @@ public:
     virtual ~QQmlDebugServerConnection() {}
 
     virtual void setServer(QQmlDebugServer *server) = 0;
-    virtual void setPort(int port, bool bock) = 0;
+    virtual void setPort(int port, bool bock, const QString &hostaddress) = 0;
     virtual bool isConnected() const = 0;
     virtual void send(const QList<QByteArray> &messages) = 0;
     virtual void disconnect() = 0;
index a75a122..8eb1523 100644 (file)
@@ -203,7 +203,7 @@ int main(int argc, char *argv[])
     char **_argv = new char*[_argc];
     for (int i = 0; i < argc; ++i)
         _argv[i] = argv[i];
-    char arg[] = "-qmljsdebugger=port:" STR_PORT;
+    char arg[] = "-qmljsdebugger=port:" STR_PORT ",host:127.0.0.1";
     _argv[_argc - 1] = arg;
 
     QGuiApplication app(_argc, _argv);