+void RemotePeer::onReadyRead()
+{
+ // don't try to read more data if we're already closing
+ if (socket()->state() != QAbstractSocket::ConnectedState)
+ return;
+
+ QByteArray msg;
+ while (readMessage(msg))
+ processMessage(msg);
+}
+
+
+bool RemotePeer::readMessage(QByteArray &msg)
+{
+ if (_msgSize == 0) {
+ if (socket()->bytesAvailable() < 4)
+ return false;
+ socket()->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 (socket()->bytesAvailable() < _msgSize) {
+ emit transferProgress(socket()->bytesAvailable(), _msgSize);
+ return false;
+ }
+
+ emit transferProgress(_msgSize, _msgSize);
+
+ msg.resize(_msgSize);
+ qint64 bytesRead = socket()->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());
+ socket()->write((const char*)&size, 4);
+ socket()->write(msg.constData(), msg.size());
+}
+
+