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
4#include <private/qqmldebugserverconnection_p.h>
5
6#include <QtCore/qplugin.h>
7#include <QtNetwork/qlocalsocket.h>
8#include <private/qqmldebugserver_p.h>
9
10Q_DECLARE_METATYPE(QLocalSocket::LocalSocketError)
11
12QT_BEGIN_NAMESPACE
13
14
15class QLocalClientConnection : public QQmlDebugServerConnection
16{
17 Q_OBJECT
18 Q_DISABLE_COPY(QLocalClientConnection)
19
20public:
21 QLocalClientConnection();
22 ~QLocalClientConnection() override;
23
24 void setServer(QQmlDebugServer *server) override;
25 bool setPortRange(int portFrom, int portTo, bool block, const QString &hostaddress) override;
26 bool setFileName(const QString &filename, bool block) override;
27
28 bool isConnected() const override;
29 void disconnect() override;
30
31 void waitForConnection() override;
32 void flush() override;
33
34private:
35 void connectionEstablished();
36 bool connectToServer();
37
38 bool m_block = false;
39 QString m_filename;
40 QLocalSocket *m_socket = nullptr;
41 QQmlDebugServer *m_debugServer = nullptr;
42};
43
44QLocalClientConnection::QLocalClientConnection() { }
45
46QLocalClientConnection::~QLocalClientConnection()
47{
48 if (isConnected())
49 disconnect();
50}
51
52void QLocalClientConnection::setServer(QQmlDebugServer *server)
53{
54 m_debugServer = server;
55}
56
57bool QLocalClientConnection::isConnected() const
58{
59 return m_socket && m_socket->state() == QLocalSocket::ConnectedState;
60}
61
62void QLocalClientConnection::disconnect()
63{
64 while (m_socket && m_socket->bytesToWrite() > 0)
65 m_socket->waitForBytesWritten();
66
67 m_socket->deleteLater();
68 m_socket = nullptr;
69}
70
71bool QLocalClientConnection::setPortRange(int portFrom, int portTo, bool block,
72 const QString &hostaddress)
73{
74 Q_UNUSED(portFrom);
75 Q_UNUSED(portTo);
76 Q_UNUSED(block);
77 Q_UNUSED(hostaddress);
78 return false;
79}
80
81bool QLocalClientConnection::setFileName(const QString &filename, bool block)
82{
83 m_filename = filename;
84 m_block = block;
85 return connectToServer();
86}
87
88void QLocalClientConnection::waitForConnection()
89{
90 m_socket->waitForConnected(msecs: -1);
91}
92
93bool QLocalClientConnection::connectToServer()
94{
95 m_socket = new QLocalSocket;
96 m_socket->setParent(this);
97 connect(sender: m_socket, signal: &QLocalSocket::connected,
98 context: this, slot: &QLocalClientConnection::connectionEstablished);
99 connect(sender: m_socket, signal: static_cast<void(QLocalSocket::*)(QLocalSocket::LocalSocketError)>(
100 &QLocalSocket::errorOccurred), context: m_socket, slot: [this](QLocalSocket::LocalSocketError) {
101 m_socket->disconnectFromServer();
102 m_socket->connectToServer(name: m_filename);
103 }, type: Qt::QueuedConnection);
104
105 m_socket->connectToServer(name: m_filename);
106 qDebug(msg: "QML Debugger: Connecting to socket %s...", m_filename.toLatin1().constData());
107 return true;
108}
109
110void QLocalClientConnection::flush()
111{
112 if (m_socket)
113 m_socket->flush();
114}
115
116void QLocalClientConnection::connectionEstablished()
117{
118 m_debugServer->setDevice(m_socket);
119}
120
121class QLocalClientConnectionFactory : public QQmlDebugServerConnectionFactory
122{
123 Q_OBJECT
124 Q_PLUGIN_METADATA(IID QQmlDebugServerConnectionFactory_iid FILE "qlocalclientconnection.json")
125 Q_INTERFACES(QQmlDebugServerConnectionFactory)
126public:
127 QQmlDebugServerConnection *create(const QString &key) override;
128};
129
130QQmlDebugServerConnection *QLocalClientConnectionFactory::create(const QString &key)
131{
132 return (key == QLatin1String("QLocalClientConnection") ? new QLocalClientConnection : nullptr);
133}
134
135QT_END_NAMESPACE
136
137#include "qlocalclientconnection.moc"
138

source code of qtdeclarative/src/plugins/qmltooling/qmldbg_local/qlocalclientconnection.cpp