Files
deskflow/src/lib/gui/ipc/IpcReader.cpp
Nick Bolton 321418fcf8 Improve handling of Qt-related warnings and errors (#7431)
* Load .env from app dir

* Use `OutputDebugStringA` on Windows

* Improved string manipulation in logger and better use of OutputDebugStringA

* Use noquote for path

* Apply TLS setting after activation

* Restart after activation

* Move skip debug message to correct place

* Only print settings path on create, not shown

* Merge common and global libs

* Reduce code duplication around constants, version, etc

* Simplify sprintf code

* Use snprintf

* Add error test menu

* Coverage for dotenv

* Coverage for Logger

* Add missing include

* Add init when no Git SHA

* Update ChangeLog

* Add spellings

* Set debugging on for release build

* Remove unused variable

* Remove bad comment

* Fixed copyright date

* Remove import

* Move URL const back to GUI

* Remove dead code and duplication

* Fixed/ignored lint warnings
2024-08-09 14:03:48 +01:00

104 lines
2.7 KiB
C++

/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2012 Symless Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "IpcReader.h"
#include "Logger.h"
#include "byte_utils.h"
#include "common/ipc.h"
#include <QByteArray>
#include <QMutex>
#include <QTcpSocket>
using namespace synergy::gui;
IpcReader::IpcReader(QTcpSocket *socket) : m_Socket(socket) {}
void IpcReader::start() const {
connect(
m_Socket, &QTcpSocket::readyRead, this, &IpcReader::onSocketReadyRead);
}
void IpcReader::stop() const {
disconnect(
m_Socket, &QTcpSocket::readyRead, this, &IpcReader::onSocketReadyRead);
}
void IpcReader::onSocketReadyRead() {
QMutexLocker locker(&m_Mutex);
logVerbose("ready read");
while (m_Socket->bytesAvailable()) {
logVerbose("bytes available");
char codeBuf[5];
readStream(codeBuf, 4);
codeBuf[4] = 0;
logVerbose(QString("ipc read: %1").arg(codeBuf));
if (memcmp(codeBuf, kIpcMsgLogLine, 4) == 0) {
logVerbose("reading log line");
char lenBuf[4];
readStream(lenBuf, 4);
int len = bytesToInt(lenBuf, 4);
std::vector<char> dataBuf(len);
readStream(dataBuf.data(), len);
QString text = QString::fromUtf8(dataBuf.data(), len);
emit read(text);
} else if (memcmp(codeBuf, kIpcMsgHelloBack, 4) == 0) {
logVerbose("reading hello back");
emit helloBack();
} else {
qCritical("aborting ipc read, message invalid");
return;
}
}
logVerbose("read done");
}
bool IpcReader::readStream(char *buffer, int length) {
logVerbose("reading stream");
int read = 0;
while (read < length) {
int ask = length - read;
if (m_Socket->bytesAvailable() < ask) {
logVerbose("buffer too short, waiting");
m_Socket->waitForReadyRead(-1);
}
auto got = m_Socket->read(buffer, ask);
read += got;
logVerbose(QString("ask=%1 got=%2 read=%3").arg(ask).arg(got).arg(read));
if (got == -1) {
logVerbose("socket ended, aborting");
return false;
} else if (length - read > 0) {
logVerbose(QString("more remains, seek to %1").arg(got));
buffer += got;
}
}
return true;
}