summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Hansen <khansen@trolltech.com>2009-06-12 19:37:42 +0200
committerKent Hansen <khansen@trolltech.com>2009-06-12 19:37:42 +0200
commit9a041e28ec478791240f2cbe8c19a9f3f8bc7a1a (patch)
tree9f9556753fb1c6f3080b9df8aecceeb2e4e039f3
parentcd02187bf2fa3edf8c29fe73c244ff853a51f6ec (diff)
progress
-rw-r--r--examples/debuggee/main.cpp16
-rw-r--r--examples/debugger/main.cpp47
-rw-r--r--src/qscriptdebuggerconnector.cpp5
-rw-r--r--src/qscriptremotetargetdebugger.cpp85
-rw-r--r--src/qscriptremotetargetdebugger.h16
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();