/***************************************************************************
- * Copyright (C) 2005-2013 by the Quassel Project *
+ * Copyright (C) 2005-2018 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;
+ }
}
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;
+ }
+
+ emit transferredChanged(transferred());
+}
+
+
+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:
+ ;
+ }
+}