summaryrefslogtreecommitdiff
path: root/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp')
-rw-r--r--src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp b/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp
new file mode 100644
index 0000000000..0d4540b37f
--- /dev/null
+++ b/src/plugins/qmldesigner/designercore/instances/baseconnectionmanager.cpp
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "baseconnectionmanager.h"
+#include "endpuppetcommand.h"
+#include "nodeinstanceserverproxy.h"
+#include "nodeinstanceview.h"
+
+#include <QLocalSocket>
+
+namespace QmlDesigner {
+
+void BaseConnectionManager::setUp(NodeInstanceServerProxy *nodeInstanceServerProxy,
+ const QString &,
+ ProjectExplorer::Target *)
+{
+ m_nodeInstanceServerProxy = nodeInstanceServerProxy;
+ m_isActive = true;
+}
+
+void BaseConnectionManager::shutDown()
+{
+ m_isActive = false;
+
+ writeCommand(QVariant::fromValue(EndPuppetCommand()));
+
+ m_nodeInstanceServerProxy = nullptr;
+}
+
+bool BaseConnectionManager::isActive() const
+{
+ return m_isActive;
+}
+
+void BaseConnectionManager::showCannotConnectToPuppetWarningAndSwitchToEditMode() {}
+
+void BaseConnectionManager::processFinished()
+{
+ processFinished(-1, QProcess::CrashExit);
+}
+
+void BaseConnectionManager::writeCommandToIODevice(const QVariant &command,
+ QIODevice *ioDevice,
+ unsigned int commandCounter)
+{
+ if (ioDevice) {
+ QByteArray block;
+ QDataStream out(&block, QIODevice::WriteOnly);
+ out.setVersion(QDataStream::Qt_4_8);
+ out << quint32(0);
+ out << quint32(commandCounter);
+ out << command;
+ out.device()->seek(0);
+ out << quint32(static_cast<unsigned long long>(block.size()) - sizeof(quint32));
+
+ ioDevice->write(block);
+ }
+}
+
+void BaseConnectionManager::dispatchCommand(const QVariant &command, Connection &)
+{
+ if (!isActive())
+ return;
+
+ m_nodeInstanceServerProxy->dispatchCommand(command);
+}
+
+void BaseConnectionManager::readDataStream(Connection &connection)
+{
+ QList<QVariant> commandList;
+
+ while (!connection.socket->atEnd()) {
+ if (connection.socket->bytesAvailable() < int(sizeof(quint32)))
+ break;
+
+ QDataStream in(connection.socket.get());
+ in.setVersion(QDataStream::Qt_4_8);
+
+ if (connection.blockSize == 0)
+ in >> connection.blockSize;
+
+ if (connection.socket->bytesAvailable() < connection.blockSize)
+ break;
+
+ quint32 commandCounter = 0;
+ in >> commandCounter;
+ bool commandLost = !((connection.lastReadCommandCounter == 0 && commandCounter == 0)
+ || (connection.lastReadCommandCounter + 1 == commandCounter));
+ if (commandLost)
+ qDebug() << "server command lost: " << connection.lastReadCommandCounter << commandCounter;
+ connection.lastReadCommandCounter = commandCounter;
+
+ QVariant command;
+ in >> command;
+ connection.blockSize = 0;
+
+ commandList.append(command);
+ }
+
+ for (const QVariant &command : commandList)
+ dispatchCommand(command, connection);
+}
+} // namespace QmlDesigner
+