+void RemotePeer::onReadyRead()
+{
+ QByteArray msg;
+ while (readMessage(msg))
+ processMessage(msg);
+}
+
+
+bool RemotePeer::readMessage(QByteArray &msg)
+{
+ if (_msgSize == 0) {
+ if (_compressor->bytesAvailable() < 4)
+ return false;
+ _compressor->read((char*)&_msgSize, 4);
+ _msgSize = qFromBigEndian<quint32>(_msgSize);
+
+ if (_msgSize > maxMessageSize) {
+ close("Peer tried to send package larger than max package size!");
+ return false;
+ }
+
+ if (_msgSize == 0) {
+ close("Peer tried to send an empty message!");
+ return false;
+ }
+ }
+
+ if (_compressor->bytesAvailable() < _msgSize) {
+ emit transferProgress(socket()->bytesAvailable(), _msgSize);
+ return false;
+ }
+
+ emit transferProgress(_msgSize, _msgSize);
+
+ msg.resize(_msgSize);
+ qint64 bytesRead = _compressor->read(msg.data(), _msgSize);
+ if (bytesRead != _msgSize) {
+ close("Premature end of data stream!");
+ return false;
+ }
+
+ _msgSize = 0;
+ return true;
+}
+
+
+void RemotePeer::writeMessage(const QByteArray &msg)
+{
+ quint32 size = qToBigEndian<quint32>(msg.size());
+ _compressor->write((const char*)&size, 4, Compressor::NoFlush);
+ _compressor->write(msg.constData(), msg.size());
+}
+
+