X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcommon%2Fprotocols%2Flegacy%2Flegacypeer.cpp;h=67e513003e968849ba5bf240431667adff12a00c;hb=ce26c3770b254362c7bd1e094ba8f8bf22133653;hp=b292223e34dff3051b81959a0c6db7f036460511;hpb=208ccb6d91ebb3c26a67c35c11411ba3ab27708a;p=quassel.git diff --git a/src/common/protocols/legacy/legacypeer.cpp b/src/common/protocols/legacy/legacypeer.cpp index b292223e..67e51300 100644 --- a/src/common/protocols/legacy/legacypeer.cpp +++ b/src/common/protocols/legacy/legacypeer.cpp @@ -31,13 +31,11 @@ const uint clientNeedsProtocol = protocolVersion; using namespace Protocol; -LegacyPeer::LegacyPeer(::AuthHandler *authHandler, QTcpSocket *socket, QObject *parent) - : RemotePeer(authHandler, socket, parent), - _blockSize(0), +LegacyPeer::LegacyPeer(::AuthHandler *authHandler, QTcpSocket *socket, Compressor::CompressionLevel level, QObject *parent) + : RemotePeer(authHandler, socket, level, parent), _useCompression(false) { - _stream.setDevice(socket); - _stream.setVersion(QDataStream::Qt_4_2); + } @@ -56,56 +54,22 @@ void LegacyPeer::setSignalProxy(::SignalProxy *proxy) } -void LegacyPeer::onSocketDataAvailable() -{ - QVariant item; - while (readSocketData(item)) { - // if no sigproxy is set, we're in handshake mode and let the data be handled elsewhere - if (!signalProxy()) - handleHandshakeMessage(item); - else - handlePackedFunc(item); - } -} - - -bool LegacyPeer::readSocketData(QVariant &item) +void LegacyPeer::processMessage(const QByteArray &msg) { - if (_blockSize == 0) { - if (socket()->bytesAvailable() < 4) - return false; - _stream >> _blockSize; - } - - if (_blockSize > 1 << 22) { - close("Peer tried to send package larger than max package size!"); - return false; - } - - if (_blockSize == 0) { - close("Peer tried to send 0 byte package!"); - return false; - } - - if (socket()->bytesAvailable() < _blockSize) { - emit transferProgress(socket()->bytesAvailable(), _blockSize); - return false; - } - - emit transferProgress(_blockSize, _blockSize); - - _blockSize = 0; + QDataStream stream(msg); + stream.setVersion(QDataStream::Qt_4_2); + QVariant item; if (_useCompression) { QByteArray rawItem; - _stream >> rawItem; + stream >> rawItem; int nbytes = rawItem.size(); if (nbytes <= 4) { const char *data = rawItem.constData(); if (nbytes < 4 || (data[0] != 0 || data[1] != 0 || data[2] != 0 || data[3] != 0)) { close("Peer sent corrupted compressed data!"); - return false; + return; } } @@ -116,25 +80,24 @@ bool LegacyPeer::readSocketData(QVariant &item) itemStream >> item; } else { - _stream >> item; + stream >> item; } - if (!item.isValid()) { + if (stream.status() != QDataStream::Ok || !item.isValid()) { close("Peer sent corrupt data: unable to load QVariant!"); - return false; + return; } - return true; + // if no sigproxy is set, we're in handshake mode and let the data be handled elsewhere + if (!signalProxy()) + handleHandshakeMessage(item); + else + handlePackedFunc(item); } -void LegacyPeer::writeSocketData(const QVariant &item) +void LegacyPeer::writeMessage(const QVariant &item) { - if (!socket()->isOpen()) { - qWarning() << Q_FUNC_INFO << "Can't write to a closed socket!"; - return; - } - QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_2); @@ -153,7 +116,7 @@ void LegacyPeer::writeSocketData(const QVariant &item) out << item; } - _stream << block; // also writes the length as part of the serialization format + writeMessage(block); } @@ -261,7 +224,7 @@ void LegacyPeer::dispatch(const RegisterClient &msg) { m["UseCompression"] = false; #endif - writeSocketData(m); + writeMessage(m); } @@ -270,7 +233,7 @@ void LegacyPeer::dispatch(const ClientDenied &msg) { m["MsgType"] = "ClientInitReject"; m["Error"] = msg.errorString; - writeSocketData(m); + writeMessage(m); } @@ -298,7 +261,7 @@ void LegacyPeer::dispatch(const ClientRegistered &msg) { m["LoginEnabled"] = m["Configured"] = msg.coreConfigured; - writeSocketData(m); + writeMessage(m); } @@ -313,7 +276,7 @@ void LegacyPeer::dispatch(const SetupData &msg) QVariantMap m; m["MsgType"] = "CoreSetupData"; m["SetupData"] = map; - writeSocketData(m); + writeMessage(m); } @@ -323,7 +286,7 @@ void LegacyPeer::dispatch(const SetupFailed &msg) m["MsgType"] = "CoreSetupReject"; m["Error"] = msg.errorString; - writeSocketData(m); + writeMessage(m); } @@ -334,7 +297,7 @@ void LegacyPeer::dispatch(const SetupDone &msg) QVariantMap m; m["MsgType"] = "CoreSetupAck"; - writeSocketData(m); + writeMessage(m); } @@ -345,7 +308,7 @@ void LegacyPeer::dispatch(const Login &msg) m["User"] = msg.user; m["Password"] = msg.password; - writeSocketData(m); + writeMessage(m); } @@ -355,7 +318,7 @@ void LegacyPeer::dispatch(const LoginFailed &msg) m["MsgType"] = "ClientLoginReject"; m["Error"] = msg.errorString; - writeSocketData(m); + writeMessage(m); } @@ -366,7 +329,7 @@ void LegacyPeer::dispatch(const LoginSuccess &msg) QVariantMap m; m["MsgType"] = "ClientLoginAck"; - writeSocketData(m); + writeMessage(m); } @@ -381,7 +344,7 @@ void LegacyPeer::dispatch(const SessionState &msg) map["Identities"] = msg.identities; m["SessionState"] = map; - writeSocketData(m); + writeMessage(m); } @@ -518,7 +481,7 @@ void LegacyPeer::dispatch(const Protocol::HeartBeatReply &msg) void LegacyPeer::dispatchPackedFunc(const QVariantList &packedFunc) { - writeSocketData(QVariant(packedFunc)); + writeMessage(QVariant(packedFunc)); }