diff options
author | Aurindam Jana <aurindam.jana@digia.com> | 2013-09-10 16:47:14 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 21:40:42 +0200 |
commit | 0b901ddda7936bb535125beaccc5fb9ee12617cb (patch) | |
tree | c8ac99dfc901f4d473ba957dcddc5665018d8b29 /src | |
parent | b529d33e5ac627341b4a01b2f13516057352f0ee (diff) |
QmlDebugging: Add v4DebugService
Initial checkin
Change-Id: Id38166bcc4a63e0543033d25515a135ad492ee2e
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/debugger/debugger.pri | 6 | ||||
-rw-r--r-- | src/qml/debugger/qv4debugservice.cpp | 162 | ||||
-rw-r--r-- | src/qml/debugger/qv4debugservice_p.h | 89 |
3 files changed, 255 insertions, 2 deletions
diff --git a/src/qml/debugger/debugger.pri b/src/qml/debugger/debugger.pri index f16e225cfd..09749b73da 100644 --- a/src/qml/debugger/debugger.pri +++ b/src/qml/debugger/debugger.pri @@ -6,7 +6,8 @@ SOURCES += \ $$PWD/qv8debugservice.cpp \ $$PWD/qv8profilerservice.cpp \ $$PWD/qqmlenginedebugservice.cpp \ - $$PWD/qdebugmessageservice.cpp + $$PWD/qdebugmessageservice.cpp \ + $$PWD/qv4debugservice.cpp HEADERS += \ $$PWD/qqmldebugservice_p.h \ @@ -21,4 +22,5 @@ HEADERS += \ $$PWD/qv8profilerservice_p.h \ $$PWD/qqmlenginedebugservice_p.h \ $$PWD/qqmldebug.h \ - $$PWD/qdebugmessageservice_p.h + $$PWD/qdebugmessageservice_p.h \ + $$PWD/qv4debugservice_p.h diff --git a/src/qml/debugger/qv4debugservice.cpp b/src/qml/debugger/qv4debugservice.cpp new file mode 100644 index 0000000000..9415cc4d31 --- /dev/null +++ b/src/qml/debugger/qv4debugservice.cpp @@ -0,0 +1,162 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qv4debugservice_p.h" +#include "qqmldebugservice_p_p.h" +#include "qqmlengine.h" +#include "qv4debugging_p.h" +#include "qv4engine_p.h" + +#include <private/qv8engine_p.h> + +const char *V4_DEBUGGER_KEY_CONNECT = "connect"; + +QT_BEGIN_NAMESPACE + +Q_GLOBAL_STATIC(QV4DebugService, v4ServiceInstance) + +class QV4DebuggerAgent : public QV4::Debugging::DebuggerAgent +{ +public slots: + virtual void debuggerPaused(QV4::Debugging::Debugger *debugger); +}; + +class QV4DebugServicePrivate : public QQmlDebugServicePrivate +{ + Q_DECLARE_PUBLIC(QV4DebugService) + +public: + QMutex initializeMutex; + QWaitCondition initializeCondition; + QV4DebuggerAgent debuggerAgent; +}; + +QV4DebugService::QV4DebugService(QObject *parent) + : QQmlDebugService(*(new QV4DebugServicePrivate()), + QStringLiteral("V4Debugger"), 1, parent) +{ + Q_D(QV4DebugService); + + // don't execute stateChanged, messageReceived in parallel + QMutexLocker lock(&d->initializeMutex); + + if (registerService() == Enabled + && QQmlDebugService::blockingMode()) { + // let's wait for first message ... + d->initializeCondition.wait(&d->initializeMutex); + } +} + +QV4DebugService::~QV4DebugService() +{ +} + +QV4DebugService *QV4DebugService::instance() +{ + return v4ServiceInstance(); +} + +void QV4DebugService::addEngine(const QQmlEngine *engine) +{ + // just make sure that the service is properly registered + if (engine) + v4ServiceInstance()->addEngine(QV8Engine::getV4(engine->handle())); +} + +void QV4DebugService::removeEngine(const QQmlEngine *engine) +{ + // just make sure that the service is properly registered + if (engine) + v4ServiceInstance()->removeEngine(QV8Engine::getV4(engine->handle())); +} + +void QV4DebugService::addEngine(const QV4::ExecutionEngine *engine) +{ + Q_D(QV4DebugService); + if (engine) + d->debuggerAgent.addDebugger(engine->debugger); +} + +void QV4DebugService::removeEngine(const QV4::ExecutionEngine *engine) +{ + Q_D(QV4DebugService); + if (engine) + d->debuggerAgent.removeDebugger(engine->debugger); +} + +void QV4DebugService::stateChanged(QQmlDebugService::State newState) +{ + Q_D(QV4DebugService); + QMutexLocker lock(&d->initializeMutex); + + if (newState != Enabled) { + // wake up constructor in blocking mode + // (we might got disabled before first message arrived) + d->initializeCondition.wakeAll(); + } +} + +void QV4DebugService::messageReceived(const QByteArray &message) +{ + Q_D(QV4DebugService); + QMutexLocker lock(&d->initializeMutex); + + QQmlDebugStream ds(message); + QByteArray header; + ds >> header; + + if (header == "V4DEBUG") { + QByteArray command; + QByteArray data; + ds >> command >> data; + + if (command == V4_DEBUGGER_KEY_CONNECT) { + // wake up constructor in blocking mode + d->initializeCondition.wakeAll(); + } + } +} + +void QV4DebuggerAgent::debuggerPaused(QV4::Debugging::Debugger *debugger) +{ +} + +QT_END_NAMESPACE diff --git a/src/qml/debugger/qv4debugservice_p.h b/src/qml/debugger/qv4debugservice_p.h new file mode 100644 index 0000000000..14164b1237 --- /dev/null +++ b/src/qml/debugger/qv4debugservice_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtQml module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QV4DEBUGSERVICE_P_H +#define QV4DEBUGSERVICE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qqmldebugservice_p.h" + +QT_BEGIN_NAMESPACE + +namespace QV4 { class ExecutionEngine; } +class QQmlEngine; +class QV4DebugServicePrivate; + +class QV4DebugService : public QQmlDebugService +{ + Q_OBJECT +public: + explicit QV4DebugService(QObject *parent = 0); + ~QV4DebugService(); + + static QV4DebugService *instance(); + static void addEngine(const QQmlEngine *engine); + static void removeEngine(const QQmlEngine *engine); + + void addEngine(const QV4::ExecutionEngine *engine); + void removeEngine(const QV4::ExecutionEngine *engine); + +protected: + void stateChanged(State newState); + void messageReceived(const QByteArray &); + +private: + Q_DISABLE_COPY(QV4DebugService) + Q_DECLARE_PRIVATE(QV4DebugService) +}; + +QT_END_NAMESPACE + +#endif // QV4DEBUGSERVICE_P_H |