diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/debugger/debugger.pri | 6 | ||||
-rw-r--r-- | src/qml/debugger/qqmlenginecontrolservice.cpp | 145 | ||||
-rw-r--r-- | src/qml/debugger/qqmlenginecontrolservice_p.h | 98 | ||||
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 2 |
4 files changed, 249 insertions, 2 deletions
diff --git a/src/qml/debugger/debugger.pri b/src/qml/debugger/debugger.pri index 2116c7292b..e9f1d6f5fe 100644 --- a/src/qml/debugger/debugger.pri +++ b/src/qml/debugger/debugger.pri @@ -7,7 +7,8 @@ SOURCES += \ $$PWD/qqmlenginedebugservice.cpp \ $$PWD/qdebugmessageservice.cpp \ $$PWD/qv4debugservice.cpp \ - $$PWD/qqmlconfigurabledebugservice.cpp + $$PWD/qqmlconfigurabledebugservice.cpp \ + $$PWD/qqmlenginecontrolservice.cpp HEADERS += \ $$PWD/qqmldebugservice_p.h \ @@ -24,4 +25,5 @@ HEADERS += \ $$PWD/qdebugmessageservice_p.h \ $$PWD/qv4debugservice_p.h \ $$PWD/qqmlconfigurabledebugservice_p.h \ - $$PWD/qqmlconfigurabledebugservice_p_p.h + $$PWD/qqmlconfigurabledebugservice_p_p.h \ + $$PWD/qqmlenginecontrolservice_p.h diff --git a/src/qml/debugger/qqmlenginecontrolservice.cpp b/src/qml/debugger/qqmlenginecontrolservice.cpp new file mode 100644 index 0000000000..90815912ad --- /dev/null +++ b/src/qml/debugger/qqmlenginecontrolservice.cpp @@ -0,0 +1,145 @@ +/**************************************************************************** +** +** Copyright (C) 2014 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 <QQmlEngine> +#include "qqmldebug.h" +#include "qqmlenginecontrolservice_p.h" + +QT_BEGIN_NAMESPACE + +Q_GLOBAL_STATIC(QQmlEngineControlService, qmlEngineControlService) + +QQmlEngineControlService::QQmlEngineControlService() : + QQmlDebugService(QStringLiteral("EngineControl"), 1) +{ + QMutexLocker lock(&dataMutex); + registerService(); +} + +QQmlEngineControlService *QQmlEngineControlService::instance() +{ + return qmlEngineControlService(); +} + +void QQmlEngineControlService::messageReceived(const QByteArray &message) +{ + QMutexLocker lock(&dataMutex); + QQmlDebugStream d(message); + int command; + int engineId; + d >> command >> engineId; + QQmlEngine *engine = qobject_cast<QQmlEngine *>(objectForId(engineId)); + if (command == StartWaitingEngine && startingEngines.contains(engine)) { + startingEngines.removeOne(engine); + emit attachedToEngine(engine); + } else if (command == StopWaitingEngine && stoppingEngines.contains(engine)) { + stoppingEngines.removeOne(engine); + emit detachedFromEngine(engine); + } +} + +void QQmlEngineControlService::engineAboutToBeAdded(QQmlEngine *engine) +{ + QMutexLocker lock(&dataMutex); + if (state() == Enabled) { + Q_ASSERT(!stoppingEngines.contains(engine)); + Q_ASSERT(!startingEngines.contains(engine)); + startingEngines.append(engine); + sendMessage(EngineAboutToBeAdded, engine); + } else { + emit attachedToEngine(engine); + } +} + +void QQmlEngineControlService::engineAboutToBeRemoved(QQmlEngine *engine) +{ + QMutexLocker lock(&dataMutex); + if (state() == Enabled) { + Q_ASSERT(!stoppingEngines.contains(engine)); + Q_ASSERT(!startingEngines.contains(engine)); + stoppingEngines.append(engine); + sendMessage(EngineAboutToBeRemoved, engine); + } else { + emit detachedFromEngine(engine); + } +} + +void QQmlEngineControlService::engineAdded(QQmlEngine *engine) +{ + if (state() == Enabled) { + QMutexLocker lock(&dataMutex); + Q_ASSERT(!startingEngines.contains(engine)); + Q_ASSERT(!stoppingEngines.contains(engine)); + sendMessage(EngineAdded, engine); + } +} + +void QQmlEngineControlService::engineRemoved(QQmlEngine *engine) +{ + if (state() == Enabled) { + QMutexLocker lock(&dataMutex); + Q_ASSERT(!startingEngines.contains(engine)); + Q_ASSERT(!stoppingEngines.contains(engine)); + sendMessage(EngineRemoved, engine); + } +} + +void QQmlEngineControlService::sendMessage(QQmlEngineControlService::MessageType type, QQmlEngine *engine) +{ + QByteArray message; + QQmlDebugStream d(&message, QIODevice::WriteOnly); + d << type << idForObject(engine); + QQmlDebugService::sendMessage(message); +} + +void QQmlEngineControlService::stateChanged(State) +{ + // We flush everything for any kind of state change, to avoid complicated timing issues. + QMutexLocker lock(&dataMutex); + foreach (QQmlEngine *engine, startingEngines) + emit attachedToEngine(engine); + startingEngines.clear(); + foreach (QQmlEngine *engine, stoppingEngines) + emit detachedFromEngine(engine); + stoppingEngines.clear(); +} + +QT_END_NAMESPACE diff --git a/src/qml/debugger/qqmlenginecontrolservice_p.h b/src/qml/debugger/qqmlenginecontrolservice_p.h new file mode 100644 index 0000000000..150d36d9cf --- /dev/null +++ b/src/qml/debugger/qqmlenginecontrolservice_p.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2014 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 QQMLENGINECONTROLSERVICE_H +#define QQMLENGINECONTROLSERVICE_H + +#include <QMutex> +#include "qqmldebugservice_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. +// + +QT_BEGIN_NAMESPACE + +class QQmlEngineControlService : public QQmlDebugService +{ +public: + enum MessageType { + EngineAboutToBeAdded, + EngineAdded, + EngineAboutToBeRemoved, + EngineRemoved + }; + + enum CommandType { + StartWaitingEngine, + StopWaitingEngine + }; + + QQmlEngineControlService(); + + static QQmlEngineControlService *instance(); + +protected: + QMutex dataMutex; + QList<QQmlEngine *> startingEngines; + QList<QQmlEngine *> stoppingEngines; + + void messageReceived(const QByteArray &); + void engineAboutToBeAdded(QQmlEngine *); + void engineAboutToBeRemoved(QQmlEngine *); + void engineAdded(QQmlEngine *); + void engineRemoved(QQmlEngine *); + + void sendMessage(MessageType type, QQmlEngine *engine); + + void stateChanged(State); +}; + +QT_END_NAMESPACE + +#endif // QQMLENGINECONTROLSERVICE_H diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 0529e41007..8e61ba61cc 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -66,6 +66,7 @@ #include <private/qqmlprofilerservice_p.h> #include <private/qv4debugservice_p.h> #include <private/qdebugmessageservice_p.h> +#include <private/qqmlenginecontrolservice_p.h> #include "qqmlincubator.h" #include "qqmlabstracturlinterceptor.h" #include <private/qv4profilerservice_p.h> @@ -819,6 +820,7 @@ void QQmlEnginePrivate::init() QV4ProfilerService::instance(); QQmlProfilerService::instance(); QDebugMessageService::instance(); + QQmlEngineControlService::instance(); QQmlDebugServer::instance()->addEngine(q); } } |