From 5a029ccf0ff5f64a02789a1f4d4586bb6f7f446f Mon Sep 17 00:00:00 2001 From: Pieter Hijma Date: Mon, 15 Jul 2024 20:26:51 +0200 Subject: [PATCH] Core: Improve communication single-instance --- src/Gui/Application.cpp | 7 ++--- src/Gui/GuiApplication.cpp | 64 ++++++++++++++++++++++++-------------- src/Gui/GuiApplication.h | 5 +-- src/Gui/MainWindow.cpp | 6 ++-- src/Gui/MainWindow.h | 2 +- src/Gui/StartupProcess.cpp | 4 +-- 6 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index 6929af9792..3031951c82 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -2001,10 +2001,9 @@ bool onlySingleInstance(GUISingleApplication& mainApp) fn = QDir::cleanPath(fn); } - QByteArray msg = fn.toUtf8(); - msg.prepend("OpenFile:"); - if (!mainApp.sendMessage(msg)) { - qWarning("Failed to send message to server"); + fn.prepend(QLatin1String("OpenFile:")); + if (!mainApp.sendMessage(fn)) { + qWarning("Failed to send OpenFile message to server"); break; } } diff --git a/src/Gui/GuiApplication.cpp b/src/Gui/GuiApplication.cpp index a334766af4..a437fc3870 100644 --- a/src/Gui/GuiApplication.cpp +++ b/src/Gui/GuiApplication.cpp @@ -28,7 +28,7 @@ # include # include # include -# include +# include # include # include # include @@ -218,7 +218,7 @@ public: QTimer *timer; QLocalServer *server{nullptr}; QString serverName; - QList messages; + QList messages; bool running{false}; }; @@ -237,15 +237,16 @@ bool GUISingleApplication::isRunning() const return d_ptr->running; } -bool GUISingleApplication::sendMessage(const QByteArray &message, int timeout) +bool GUISingleApplication::sendMessage(const QString &message, int timeout) { QLocalSocket socket; bool connected = false; for(int i = 0; i < 2; i++) { socket.connectToServer(d_ptr->serverName); connected = socket.waitForConnected(timeout/2); - if (connected || i > 0) + if (connected || i > 0) { break; + } int ms = 250; #if defined(Q_OS_WIN) Sleep(DWORD(ms)); @@ -253,41 +254,56 @@ bool GUISingleApplication::sendMessage(const QByteArray &message, int timeout) usleep(ms*1000); #endif } - if (!connected) + if (!connected) { return false; + } - QDataStream ds(&socket); - ds << message; - socket.waitForBytesWritten(timeout); - return true; + QTextStream ts(&socket); +#if QT_VERSION <= QT_VERSION_CHECK(6, 0, 0) + ts.setCodec("UTF-8"); +#else + ts.setEncoding(QStringConverter::Utf8); +#endif + ts << message << Qt::endl; + + return socket.waitForBytesWritten(timeout); +} + +void GUISingleApplication::readFromSocket() +{ + auto socket = qobject_cast(sender()); + if (socket) { + QTextStream in(socket); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + in.setCodec("UTF-8"); +#else + in.setEncoding(QStringConverter::Utf8); +#endif + while (socket->canReadLine()) { + d_ptr->timer->stop(); + QString message = in.readLine(); + Base::Console().Log("Received message: %s\n", message.toStdString()); + d_ptr->messages.push_back(message); + d_ptr->timer->start(1000); + } + } } void GUISingleApplication::receiveConnection() { QLocalSocket *socket = d_ptr->server->nextPendingConnection(); - if (!socket) + if (!socket) { return; + } connect(socket, &QLocalSocket::disconnected, socket, &QLocalSocket::deleteLater); - if (socket->waitForReadyRead()) { - QDataStream in(socket); - if (!in.atEnd()) { - d_ptr->timer->stop(); - QByteArray message; - in >> message; - Base::Console().Log("Received message: %s\n", message.constData()); - d_ptr->messages.push_back(message); - d_ptr->timer->start(1000); - } - } - - socket->disconnectFromServer(); + connect(socket, &QLocalSocket::readyRead, this, &GUISingleApplication::readFromSocket); } void GUISingleApplication::processMessages() { - QList msg = d_ptr->messages; + QList msg = d_ptr->messages; d_ptr->messages.clear(); Q_EMIT messageReceived(msg); } diff --git a/src/Gui/GuiApplication.h b/src/Gui/GuiApplication.h index 5fbc265485..6e7894e903 100644 --- a/src/Gui/GuiApplication.h +++ b/src/Gui/GuiApplication.h @@ -69,14 +69,15 @@ public: ~GUISingleApplication() override; bool isRunning() const; - bool sendMessage(const QByteArray &message, int timeout = 5000); + bool sendMessage(const QString &message, int timeout = 5000); private Q_SLOTS: void receiveConnection(); void processMessages(); + void readFromSocket(); Q_SIGNALS: - void messageReceived(const QList &); + void messageReceived(const QList &); private: class Private; diff --git a/src/Gui/MainWindow.cpp b/src/Gui/MainWindow.cpp index cab7f03451..196fbd02cb 100644 --- a/src/Gui/MainWindow.cpp +++ b/src/Gui/MainWindow.cpp @@ -1556,16 +1556,16 @@ void MainWindow::hideEvent(QHideEvent* e) QMainWindow::hideEvent(e); } -void MainWindow::processMessages(const QList & msg) +void MainWindow::processMessages(const QList & msg) { // handle all the messages to open files try { WaitCursor wc; std::list files; - QByteArray action("OpenFile:"); + QString action = QString::fromStdString("OpenFile:"); for (const auto & it : msg) { if (it.startsWith(action)) - files.emplace_back(it.mid(action.size()).constData()); + files.emplace_back(it.mid(action.size()).toStdString()); } files = App::Application::processFiles(files); for (const auto & file : files) { diff --git a/src/Gui/MainWindow.h b/src/Gui/MainWindow.h index 5f4ba6ede7..769086cddb 100644 --- a/src/Gui/MainWindow.h +++ b/src/Gui/MainWindow.h @@ -350,7 +350,7 @@ private Q_SLOTS: /** * \internal */ - void processMessages(const QList &); + void processMessages(const QList &); /** * \internal */ diff --git a/src/Gui/StartupProcess.cpp b/src/Gui/StartupProcess.cpp index 8406d9cf5e..0cf62764de 100644 --- a/src/Gui/StartupProcess.cpp +++ b/src/Gui/StartupProcess.cpp @@ -247,8 +247,8 @@ void StartupPostProcess::setWindowTitle() void StartupPostProcess::setProcessMessages() { if (!loadFromPythonModule) { - QObject::connect(qtApp, SIGNAL(messageReceived(const QList &)), - mainWindow, SLOT(processMessages(const QList &))); + QObject::connect(qtApp, SIGNAL(messageReceived(const QList &)), + mainWindow, SLOT(processMessages(const QList &))); } }