Hook the Compressor into RemotePeer
[quassel.git] / src / common / protocols / legacy / legacypeer.cpp
index b292223..49c77fd 100644 (file)
@@ -32,12 +32,10 @@ const uint clientNeedsProtocol = protocolVersion;
 using namespace Protocol;
 
 LegacyPeer::LegacyPeer(::AuthHandler *authHandler, QTcpSocket *socket, QObject *parent)
-    : RemotePeer(authHandler, socket, parent),
-    _blockSize(0),
+    : RemotePeer(authHandler, socket, Compressor::NoCompression, 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));
 }