Add accessors for the amount of transferred data to Transfer classes
[quassel.git] / src / client / clienttransfer.cpp
index aab69b3..2aac8cf 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2013 by the Quassel Project                        *
+ *   Copyright (C) 2005-2015 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
+#include <QFile>
+
 #include "clienttransfer.h"
 
 INIT_SYNCABLE_OBJECT(ClientTransfer)
 ClientTransfer::ClientTransfer(const QUuid &uuid, QObject *parent)
-    : Transfer(uuid, parent)
+    : Transfer(uuid, parent),
+    _file(0)
+{
+    connect(this, SIGNAL(statusChanged(Transfer::Status)), SLOT(onStatusChanged(Transfer::Status)));
+}
+
+
+quint64 ClientTransfer::transferred() const
 {
+    if (status() == Status::Completed)
+        return fileSize();
 
+    return _file ? _file->size() : 0;
+}
+
+
+void ClientTransfer::cleanUp()
+{
+    if (_file) {
+        _file->close();
+        _file->deleteLater();
+        _file = 0;
+    }
 }
 
 
@@ -49,3 +71,41 @@ void ClientTransfer::reject() const
     REQUEST_OTHER(requestRejected, ARG(ptr));
     emit rejected();
 }
+
+
+void ClientTransfer::dataReceived(PeerPtr, const QByteArray &data)
+{
+    // TODO: proper error handling (relay to core)
+    if (!_file) {
+        _file = new QFile(_savePath, this);
+        if (!_file->open(QFile::WriteOnly|QFile::Truncate)) {
+            qWarning() << Q_FUNC_INFO << "Could not open file:" << _file->errorString();
+            return;
+        }
+    }
+
+    if (!_file->isOpen())
+        return;
+
+    if (_file->write(data) < 0) {
+        qWarning() << Q_FUNC_INFO << "Could not write to file:" << _file->errorString();
+        return;
+    }
+}
+
+
+void ClientTransfer::onStatusChanged(Transfer::Status status)
+{
+    switch(status) {
+        case Status::Completed:
+            if (_file)
+                _file->close();
+            break;
+        case Status::Failed:
+            if (_file)
+                _file->remove();
+            break;
+        default:
+            ;
+    }
+}