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
qdesigner_server.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include <QtCore/qfileinfo.h>
5#include <QtCore/qstringlist.h>
6
7#include <QtNetwork/qhostaddress.h>
8#include <QtNetwork/qtcpserver.h>
9#include <QtNetwork/qtcpsocket.h>
10
11#include "qdesigner.h"
13
14#include <qevent.h>
15
17
18using namespace Qt::StringLiterals;
19
20// ### review
21
22QDesignerServer::QDesignerServer(QObject *parent)
23 : QObject(parent)
24{
25 m_server = new QTcpServer(this);
26 if (m_server->listen(QHostAddress::LocalHost, 0)) {
27 connect(m_server, &QTcpServer::newConnection,
28 this, &QDesignerServer::handleNewConnection);
29 }
30}
31
33
35{
36 return m_server ? m_server->serverPort() : 0;
37}
38
39void QDesignerServer::sendOpenRequest(int port, const QStringList &files)
40{
41 QTcpSocket *sSocket = new QTcpSocket();
42 sSocket->connectToHost(QHostAddress::LocalHost, port);
43 if(sSocket->waitForConnected(3000))
44 {
45 for (const QString &file : files) {
46 QFileInfo fi(file);
47 sSocket->write(fi.absoluteFilePath().toUtf8() + '\n');
48 }
49 sSocket->waitForBytesWritten(3000);
50 sSocket->close();
51 }
52 delete sSocket;
53}
54
55void QDesignerServer::readFromClient()
56{
57 while (m_socket->canReadLine()) {
58 QString file = QString::fromUtf8(m_socket->readLine());
59 if (!file.isNull()) {
60 file.remove(u'\n');
61 file.remove(u'\r');
62 qDesigner->postEvent(qDesigner, new QFileOpenEvent(file));
63 }
64 }
65}
66
67void QDesignerServer::socketClosed()
68{
69 m_socket = nullptr;
70}
71
72void QDesignerServer::handleNewConnection()
73{
74 // no need for more than one connection
75 if (m_socket == nullptr) {
76 m_socket = m_server->nextPendingConnection();
77 connect(m_socket, &QTcpSocket::readyRead,
78 this, &QDesignerServer::readFromClient);
79 connect(m_socket, &QTcpSocket::disconnected,
80 this, &QDesignerServer::socketClosed);
81 }
82}
83
84
85QDesignerClient::QDesignerClient(quint16 port, QObject *parent)
86: QObject(parent)
87{
88 m_socket = new QTcpSocket(this);
89 m_socket->connectToHost(QHostAddress::LocalHost, port);
90 connect(m_socket, &QTcpSocket::readyRead,
91 this, &QDesignerClient::readFromSocket);
92
93}
94
96{
97 m_socket->close();
98 m_socket->flush();
99}
100
101void QDesignerClient::readFromSocket()
102{
103 while (m_socket->canReadLine()) {
104 QString file = QString::fromUtf8(m_socket->readLine());
105 if (!file.isNull()) {
106 file.remove(u'\n');
107 file.remove(u'\r');
108 if (QFile::exists(file))
109 qDesigner->postEvent(qDesigner, new QFileOpenEvent(file));
110 }
111 }
112}
113
114QT_END_NAMESPACE
~QDesignerClient() override
quint16 serverPort() const
~QDesignerServer() override
Combined button and popup list for selecting options.
#define qDesigner
Definition qdesigner.h:12