diff options
author | Kent Hansen <khansen@trolltech.com> | 2009-06-12 19:37:42 +0200 |
---|---|---|
committer | Kent Hansen <khansen@trolltech.com> | 2009-06-12 19:37:42 +0200 |
commit | 9a041e28ec478791240f2cbe8c19a9f3f8bc7a1a (patch) | |
tree | 9f9556753fb1c6f3080b9df8aecceeb2e4e039f3 | |
parent | cd02187bf2fa3edf8c29fe73c244ff853a51f6ec (diff) |
progress
-rw-r--r-- | examples/debuggee/main.cpp | 16 | ||||
-rw-r--r-- | examples/debugger/main.cpp | 47 | ||||
-rw-r--r-- | src/qscriptdebuggerconnector.cpp | 5 | ||||
-rw-r--r-- | src/qscriptremotetargetdebugger.cpp | 85 | ||||
-rw-r--r-- | src/qscriptremotetargetdebugger.h | 16 |
5 files changed, 100 insertions, 69 deletions
diff --git a/examples/debuggee/main.cpp b/examples/debuggee/main.cpp index fb9875a..ee024ef 100644 --- a/examples/debuggee/main.cpp +++ b/examples/debuggee/main.cpp @@ -22,14 +22,16 @@ #include <QtScript> #include <qscriptdebuggerconnector.h> +void qScriptDebugRegisterMetaTypes(); + class MyObject : public QObject { Q_OBJECT public: MyObject(const QHostAddress &addr, quint16 port, bool connect, QObject *parent = 0); private slots: - void connected(); - void disconnected(); + void onConnected(); + void onDisconnected(); private: QScriptEngine *m_engine; QScriptDebuggerConnector *m_connector; @@ -40,8 +42,8 @@ MyObject::MyObject(const QHostAddress &addr, quint16 port, bool connect, QObject { m_engine = new QScriptEngine(this); m_connector = new QScriptDebuggerConnector(this); - QObject::connect(m_connector, SIGNAL(connected()), this, SLOT(connected()), Qt::QueuedConnection); - QObject::connect(m_connector, SIGNAL(disconnected()), this, SLOT(disconnected()), Qt::QueuedConnection); + QObject::connect(m_connector, SIGNAL(connected()), this, SLOT(onConnected()), Qt::QueuedConnection); + QObject::connect(m_connector, SIGNAL(disconnected()), this, SLOT(onDisconnected()), Qt::QueuedConnection); m_connector->setEngine(m_engine); if (connect) { qDebug("attempting to connect to debugger at %s:%d", qPrintable(addr.toString()), port); @@ -56,7 +58,7 @@ MyObject::MyObject(const QHostAddress &addr, quint16 port, bool connect, QObject } } -void MyObject::connected() +void MyObject::onConnected() { qDebug("connected!!"); QStringList fileNames; @@ -75,7 +77,7 @@ void MyObject::connected() m_connector->disconnectFromDebugger(); } -void MyObject::disconnected() +void MyObject::onDisconnected() { qDebug("disconnected"); QCoreApplication::quit(); @@ -112,6 +114,8 @@ int main(int argc, char **argv) } } } + + qScriptDebugRegisterMetaTypes(); MyObject obj(addr, port, connect); return app.exec(); } diff --git a/examples/debugger/main.cpp b/examples/debugger/main.cpp index 3c19ada..74f0e9e 100644 --- a/examples/debugger/main.cpp +++ b/examples/debugger/main.cpp @@ -26,6 +26,46 @@ void qScriptDebugRegisterMetaTypes(); +class MyObject : public QObject +{ + Q_OBJECT +public: + MyObject(const QHostAddress &addr, quint16 port, bool listen, QObject *parent = 0); +private slots: + void onAttached(); + void onDetached(); +private: + QScriptRemoteTargetDebugger *m_debugger; +}; + +MyObject::MyObject(const QHostAddress &addr, quint16 port, bool listen, QObject *parent) + : QObject(parent) +{ + m_debugger = new QScriptRemoteTargetDebugger(this); + QObject::connect(m_debugger, SIGNAL(attached()), this, SLOT(onAttached())); + QObject::connect(m_debugger, SIGNAL(detached()), this, SLOT(onDetached())); + if (listen) { + if (m_debugger->listen(addr, port)) + qDebug("listening for debuggee connection at %s:%d", qPrintable(addr.toString()), port); + else { + qWarning("Failed to listen!"); + QCoreApplication::quit(); + } + } else { + qDebug("attaching to %s:%d", qPrintable(addr.toString()), port); + m_debugger->attachTo(addr, port); + } +} + +void MyObject::onAttached() +{ +} + +void MyObject::onDetached() +{ + QApplication::quit(); +} + int main(int argc, char **argv) { QApplication app(argc, argv); @@ -60,9 +100,8 @@ int main(int argc, char **argv) } qScriptDebugRegisterMetaTypes(); - QScriptRemoteTargetDebugger debugger; - qDebug("attaching to %s:%d", qPrintable(addr.toString()), port); - debugger.attachTo(addr, port); - + MyObject object(addr, port, listen); return app.exec(); } + +#include "main.moc" diff --git a/src/qscriptdebuggerconnector.cpp b/src/qscriptdebuggerconnector.cpp index db603d2..b677d27 100644 --- a/src/qscriptdebuggerconnector.cpp +++ b/src/qscriptdebuggerconnector.cpp @@ -34,8 +34,6 @@ // #define DEBUGGERCONNECTOR_DEBUG -void qScriptDebugRegisterMetaTypes(); - class QScriptRemoteTargetDebuggerBackend : public QObject, public QScriptDebuggerBackend { @@ -95,7 +93,6 @@ private: QScriptRemoteTargetDebuggerBackend::QScriptRemoteTargetDebuggerBackend() : m_state(UnconnectedState), m_socket(0), m_blockSize(0), m_server(0) { - qScriptDebugRegisterMetaTypes(); } QScriptRemoteTargetDebuggerBackend::~QScriptRemoteTargetDebuggerBackend() @@ -148,7 +145,7 @@ void QScriptRemoteTargetDebuggerBackend::onSocketStateChanged(QAbstractSocket::S void QScriptRemoteTargetDebuggerBackend::onSocketError(QAbstractSocket::SocketError err) { - Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); + qDebug("%s", qPrintable(m_socket->errorString())); } void QScriptRemoteTargetDebuggerBackend::onNewConnection() diff --git a/src/qscriptremotetargetdebugger.cpp b/src/qscriptremotetargetdebugger.cpp index e22e810..9e5152e 100644 --- a/src/qscriptremotetargetdebugger.cpp +++ b/src/qscriptremotetargetdebugger.cpp @@ -41,50 +41,11 @@ // #define DEBUG_DEBUGGER -namespace { - -class WidgetClosedNotifier : public QObject -{ - Q_OBJECT -public: - WidgetClosedNotifier(QWidget *w, QObject *parent = 0) - : QObject(parent), widget(w) - { - w->installEventFilter(this); - } - - bool eventFilter(QObject *watched, QEvent *e) - { - if (watched != widget) - return false; - if (e->type() != QEvent::Close) - return false; - emit widgetClosed(); - return true; - } - -Q_SIGNALS: - void widgetClosed(); - -private: - QWidget *widget; -}; - -} // namespace - class QScriptRemoteTargetDebuggerFrontend : public QObject, public QScriptDebuggerFrontend { Q_OBJECT public: - enum Error { - NoError, - HostNotFoundError, - ConnectionRefusedError, - HandshakeError, - SocketError - }; - enum State { UnattachedState, ConnectingState, @@ -102,7 +63,7 @@ public: Q_SIGNALS: void attached(); void detached(); - void error(Error error); + void error(QScriptRemoteTargetDebugger::Error error); protected: void processCommand(int id, const QScriptDebuggerCommand &command); @@ -169,16 +130,20 @@ void QScriptRemoteTargetDebuggerFrontend::onSocketStateChanged(QAbstractSocket:: case QAbstractSocket::BoundState: break; case QAbstractSocket::ClosingState: - Q_ASSERT(0); + emit detached(); break; case QAbstractSocket::ListeningState: break; } } -void QScriptRemoteTargetDebuggerFrontend::onSocketError(QAbstractSocket::SocketError error) +void QScriptRemoteTargetDebuggerFrontend::onSocketError(QAbstractSocket::SocketError err) { - Q_ASSERT_X(false, Q_FUNC_INFO, qPrintable(m_socket->errorString())); + if (err != QAbstractSocket::RemoteHostClosedError) { + qDebug("%s", qPrintable(m_socket->errorString())); + emit error(QScriptRemoteTargetDebugger::SocketError); + } + } void QScriptRemoteTargetDebuggerFrontend::onReadyRead() @@ -199,14 +164,14 @@ void QScriptRemoteTargetDebuggerFrontend::onReadyRead() qDebug("handshake ok!"); #endif m_state = AttachedState; - QMetaObject::invokeMethod(this, "emitAttachedSignal", Qt::QueuedConnection); + emit attached(); if (m_socket->bytesAvailable() > 0) QMetaObject::invokeMethod(this, "onReadyRead", Qt::QueuedConnection); } else { // d->error = HandshakeError; // d->errorString = QString::fromLatin1("Incorrect handshake data received"); m_state = DetachingState; - emit error(HandshakeError); + emit error(QScriptRemoteTargetDebugger::HandshakeError); m_socket->close(); } } @@ -246,7 +211,11 @@ void QScriptRemoteTargetDebuggerFrontend::onReadyRead() #ifdef DEBUG_DEBUGGER qDebug("notifying event of type %d", event.type()); #endif - notifyEvent(event); + bool handled = notifyEvent(event); + if (handled) { + scheduleCommand(QScriptDebuggerCommand::resumeCommand(), + /*responseHandler=*/0); + } } else { // command response #ifdef DEBUG_DEBUGGER @@ -306,13 +275,29 @@ void QScriptRemoteTargetDebugger::attachTo(const QHostAddress &address, quint16 createDebugger(); if (!m_frontend) { m_frontend = new QScriptRemoteTargetDebuggerFrontend(); - QObject::connect(m_frontend, SIGNAL(attached()), this, SIGNAL(attached())); - QObject::connect(m_frontend, SIGNAL(detached()), this, SIGNAL(detached())); + QObject::connect(m_frontend, SIGNAL(attached()), + this, SIGNAL(attached()), Qt::QueuedConnection); + QObject::connect(m_frontend, SIGNAL(detached()), + this, SIGNAL(detached()), Qt::QueuedConnection); + QObject::connect(m_frontend, SIGNAL(error(QScriptRemoteTargetDebugger::Error)), + this, SIGNAL(error(QScriptRemoteTargetDebugger::Error))); } m_frontend->attachTo(address, port); m_debugger->setFrontend(m_frontend); } +void QScriptRemoteTargetDebugger::detach() +{ + if (m_frontend) + m_frontend->detach(); +} + +bool QScriptRemoteTargetDebugger::listen(const QHostAddress &address, quint16 port) +{ + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); + return false; +} + void QScriptRemoteTargetDebugger::createDebugger() { if (!m_debugger) { @@ -422,10 +407,6 @@ QMainWindow *QScriptRemoteTargetDebugger::standardWindow() const if (state.isValid()) win->restoreState(state.toByteArray()); - WidgetClosedNotifier *closedNotifier = new WidgetClosedNotifier(win, that); - QObject::connect(closedNotifier, SIGNAL(widgetClosed()), - action(ContinueAction), SLOT(trigger())); - const_cast<QScriptRemoteTargetDebugger*>(this)->m_standardWindow = win; return win; } diff --git a/src/qscriptremotetargetdebugger.h b/src/qscriptremotetargetdebugger.h index df39702..32f430c 100644 --- a/src/qscriptremotetargetdebugger.h +++ b/src/qscriptremotetargetdebugger.h @@ -23,10 +23,10 @@ #define QSCRIPTREMOTETARGETDEBUGGER_H #include <QtCore/qobject.h> - +#include <QtNetwork/qabstractsocket.h> +#include <QtNetwork/qhostaddress.h> #include <private/qscriptdebuggerwidgetfactoryinterface_p.h> -class QHostAddress; class QScriptDebugger; class QScriptRemoteTargetDebuggerFrontend; class QAction; @@ -40,6 +40,14 @@ class QScriptRemoteTargetDebugger { Q_OBJECT public: + enum Error { + NoError, + HostNotFoundError, + ConnectionRefusedError, + HandshakeError, + SocketError + }; + enum DebuggerWidget { ConsoleWidget, StackWidget, @@ -76,6 +84,8 @@ public: void attachTo(const QHostAddress &address, quint16 port); void detach(); + bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0); + bool autoShowStandardWindow() const; void setAutoShowStandardWindow(bool autoShow); @@ -89,7 +99,7 @@ public: Q_SIGNALS: void attached(); void detached(); -// void error(Error error); + void error(QScriptRemoteTargetDebugger::Error error); void evaluationSuspended(); void evaluationResumed(); |