[telepathy-qt4/master] IncomingFileTransferChannel: Skip first N bytes if initialOffset smaller than what we asked for.

Andre Moreira Magalhaes (andrunko) andre.magalhaes at collabora.co.uk
Tue Sep 22 20:29:46 PDT 2009


---
 TelepathyQt4/incoming-file-transfer-channel.cpp |   33 ++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/TelepathyQt4/incoming-file-transfer-channel.cpp b/TelepathyQt4/incoming-file-transfer-channel.cpp
index f3dd6bb..be27c3e 100644
--- a/TelepathyQt4/incoming-file-transfer-channel.cpp
+++ b/TelepathyQt4/incoming-file-transfer-channel.cpp
@@ -49,12 +49,17 @@ struct IncomingFileTransferChannel::Private
     QTcpSocket *socket;
     SocketAccessControl accessControl;
     SocketAddressIPv4 addr;
+
+    qulonglong requestedOffset;
+    qint64 pos;
 };
 
 IncomingFileTransferChannel::Private::Private(IncomingFileTransferChannel *parent)
     : parent(parent),
       output(0),
-      socket(0)
+      socket(0),
+      requestedOffset(0),
+      pos(0)
 {
 }
 
@@ -192,6 +197,8 @@ PendingOperation *IncomingFileTransferChannel::acceptFile(qulonglong offset,
         accessControlParam = QDBusVariant(QVariant(QString()));
     }
 
+    mPriv->requestedOffset = offset;
+
     PendingVariant *pv = new PendingVariant(
             fileTransferInterface(BypassInterfaceCheck)->AcceptFile(SocketAddressTypeIPv4,
                 mPriv->accessControl, accessControlParam,
@@ -233,6 +240,19 @@ void IncomingFileTransferChannel::connectToHost()
         return;
     }
 
+    // we already have initialOffsetDefined, called before State became Open, so
+    // let's make sure everything is ok.
+    if (initialOffset() > mPriv->requestedOffset) {
+        // either the CM or the sender is doing something really wrong here,
+        // cancel the transfer.
+        warning() << "InitialOffset bigger than requested offset, "
+            "cancelling the transfer";
+        cancel();
+        return;
+    }
+
+    mPriv->pos = initialOffset();
+
     mPriv->socket = new QTcpSocket(this);
 
     connect(mPriv->socket, SIGNAL(connected()),
@@ -273,8 +293,19 @@ void IncomingFileTransferChannel::doTransfer()
     QByteArray data;
     while (mPriv->socket->bytesAvailable()) {
         data = mPriv->socket->readAll();
+
+        // skip until we reach requetedOffset and start writing from there
+        if ((qulonglong) mPriv->pos < mPriv->requestedOffset) {
+            if ((qulonglong) data.length() <= (mPriv->requestedOffset - mPriv->pos)) {
+                break;
+            }
+            data = data.mid(mPriv->requestedOffset - mPriv->pos);
+        }
+
         mPriv->output->write(data); // never fails
     }
+
+    mPriv->pos += data.length();
 }
 
 void IncomingFileTransferChannel::setFinished()
-- 
1.5.6.5




More information about the telepathy-commits mailing list