- return invokeSlot(receiver, methodId, params, ret);
-}
-
-
-void SignalProxy::dataAvailable()
-{
- // yet again. it's a private slot. no need for checks.
- QIODevice *ioDev = qobject_cast<QIODevice *>(sender());
- Q_ASSERT(_peers.contains(ioDev) && _peers[ioDev]->type() == AbstractPeer::IODevicePeer);
- IODevicePeer *peer = static_cast<IODevicePeer *>(_peers[ioDev]);
- QVariant var;
- while (peer->readData(var))
- receivePackedFunc(peer, var);
-}
-
-
-void SignalProxy::writeDataToDevice(QIODevice *dev, const QVariant &item, bool compressed)
-{
- QAbstractSocket *sock = qobject_cast<QAbstractSocket *>(dev);
- if (!dev->isOpen() || (sock && sock->state() != QAbstractSocket::ConnectedState)) {
- qWarning("SignalProxy: Can't call write on a closed device");
- return;
- }
-
- QByteArray block;
- QDataStream out(&block, QIODevice::WriteOnly);
- out.setVersion(QDataStream::Qt_4_2);
- out << (quint32)0;
-
- if (compressed) {
- QByteArray rawItem;
- QDataStream itemStream(&rawItem, QIODevice::WriteOnly);
-
- itemStream.setVersion(QDataStream::Qt_4_2);
- itemStream << item;
-
- rawItem = qCompress(rawItem);
-
- out << rawItem;
- }
- else {
- out << item;
- }
-
- out.device()->seek(0);
- out << (quint32)(block.size() - sizeof(quint32));
-
- dev->write(block);
-}
-
-
-bool SignalProxy::readDataFromDevice(QIODevice *dev, quint32 &blockSize, QVariant &item, bool compressed)
-{
- if (!dev)
- return false;
-
- QDataStream in(dev);
- in.setVersion(QDataStream::Qt_4_2);
-
- if (blockSize == 0) {
- if (dev->bytesAvailable() < (int)sizeof(quint32)) return false;
- in >> blockSize;
- }
-
- if (blockSize > 1 << 22) {
- disconnectDevice(dev, tr("Peer tried to send package larger than max package size!"));
- return false;
- }
-
- if (blockSize == 0) {
- disconnectDevice(dev, tr("Peer tried to send 0 byte package!"));
- return false;
- }
-
- if (dev->bytesAvailable() < blockSize)
- return false;
-
- blockSize = 0;
-
- if (compressed) {
- QByteArray rawItem;
- in >> 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)) {
- disconnectDevice(dev, tr("Peer sent corrupted compressed data!"));
- return false;
- }
- }
-
- rawItem = qUncompress(rawItem);
-
- QDataStream itemStream(&rawItem, QIODevice::ReadOnly);
- itemStream.setVersion(QDataStream::Qt_4_2);
- itemStream >> item;
- }
- else {
- in >> item;
- }
-
- if (!item.isValid()) {
- disconnectDevice(dev, tr("Peer sent corrupt data: unable to load QVariant!"));
- return false;
- }
-
- return true;