Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmlenginecontrolservice.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4
6#include <private/qqmldebugconnector_p.h>
7#include <private/qversionedpacket_p.h>
8#include <QJSEngine>
9
11
12using QQmlDebugPacket = QVersionedPacket<QQmlDebugConnector>;
13
14QQmlEngineControlServiceImpl::QQmlEngineControlServiceImpl(QObject *parent) :
15 QQmlEngineControlService(1, parent)
16{
17 blockingMode = QQmlDebugConnector::instance()->blockingMode();
18}
19
20void QQmlEngineControlServiceImpl::messageReceived(const QByteArray &message)
21{
22 QMutexLocker lock(&dataMutex);
23 QQmlDebugPacket d(message);
24 qint32 command;
25 qint32 engineId;
26 d >> command >> engineId;
27 QJSEngine *engine = qobject_cast<QJSEngine *>(objectForId(engineId));
28 if (command == StartWaitingEngine && startingEngines.contains(engine)) {
29 startingEngines.removeOne(engine);
30 emit attachedToEngine(engine);
31 } else if (command == StopWaitingEngine && stoppingEngines.contains(engine)) {
32 stoppingEngines.removeOne(engine);
33 emit detachedFromEngine(engine);
34 }
35}
36
37void QQmlEngineControlServiceImpl::engineAboutToBeAdded(QJSEngine *engine)
38{
39 QMutexLocker lock(&dataMutex);
40 if (blockingMode && state() == Enabled) {
41 Q_ASSERT(!stoppingEngines.contains(engine));
42 Q_ASSERT(!startingEngines.contains(engine));
43 startingEngines.append(engine);
44 sendMessage(EngineAboutToBeAdded, engine);
45 } else {
46 emit attachedToEngine(engine);
47 }
48}
49
50void QQmlEngineControlServiceImpl::engineAboutToBeRemoved(QJSEngine *engine)
51{
52 QMutexLocker lock(&dataMutex);
53 if (blockingMode && state() == Enabled) {
54 Q_ASSERT(!stoppingEngines.contains(engine));
55 Q_ASSERT(!startingEngines.contains(engine));
56 stoppingEngines.append(engine);
57 sendMessage(EngineAboutToBeRemoved, engine);
58 } else {
59 emit detachedFromEngine(engine);
60 }
61}
62
63void QQmlEngineControlServiceImpl::engineAdded(QJSEngine *engine)
64{
65 if (state() == Enabled) {
66 QMutexLocker lock(&dataMutex);
67 Q_ASSERT(!startingEngines.contains(engine));
68 Q_ASSERT(!stoppingEngines.contains(engine));
69 sendMessage(EngineAdded, engine);
70 }
71}
72
73void QQmlEngineControlServiceImpl::engineRemoved(QJSEngine *engine)
74{
75 if (state() == Enabled) {
76 QMutexLocker lock(&dataMutex);
77 Q_ASSERT(!startingEngines.contains(engine));
78 Q_ASSERT(!stoppingEngines.contains(engine));
79 sendMessage(EngineRemoved, engine);
80 }
81}
82
83void QQmlEngineControlServiceImpl::sendMessage(QQmlEngineControlServiceImpl::MessageType type,
84 QJSEngine *engine)
85{
86 QQmlDebugPacket d;
87 d << static_cast<qint32>(type) << idForObject(engine);
88 emit messageToClient(name(), d.data());
89}
90
91void QQmlEngineControlServiceImpl::stateChanged(State)
92{
93 // We flush everything for any kind of state change, to avoid complicated timing issues.
94 QMutexLocker lock(&dataMutex);
95 for (QJSEngine *engine : std::as_const(startingEngines))
96 emit attachedToEngine(engine);
97 startingEngines.clear();
98 for (QJSEngine *engine : std::as_const(stoppingEngines))
99 emit detachedFromEngine(engine);
100 stoppingEngines.clear();
101}
102
103QT_END_NAMESPACE
Combined button and popup list for selecting options.