X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoretransfer.cpp;h=46a30a549ca845a382c4864756819b64dec67bac;hp=0d454ae3850bf10107c1b1a40a3029d01c2f8d2b;hb=cc6e7c08709c4e761e2fd9c2e322751015497003;hpb=22754c6f9444b0cd004c12984cf6eb183c2f6ae5 diff --git a/src/core/coretransfer.cpp b/src/core/coretransfer.cpp index 0d454ae3..46a30a54 100644 --- a/src/core/coretransfer.cpp +++ b/src/core/coretransfer.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2019 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,46 +18,46 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#include +#include "coretransfer.h" #include #include +#include -#include "coretransfer.h" +#include "util.h" const qint64 chunkSize = 16 * 1024; -INIT_SYNCABLE_OBJECT(CoreTransfer) - -CoreTransfer::CoreTransfer(Direction direction, const QString &nick, const QString &fileName, const QHostAddress &address, quint16 port, quint64 fileSize, QObject *parent) - : Transfer(direction, nick, fileName, address, port, fileSize, parent), - _socket(0), - _pos(0), - _reading(false) -{ - -} - +CoreTransfer::CoreTransfer(Direction direction, + const QString& nick, + const QString& fileName, + const QHostAddress& address, + quint16 port, + quint64 fileSize, + QObject* parent) + : Transfer(direction, nick, fileName, address, port, fileSize, parent) + , _socket(nullptr) + , _pos(0) + , _reading(false) +{} quint64 CoreTransfer::transferred() const { return _pos; } - void CoreTransfer::cleanUp() { if (_socket) { _socket->close(); _socket->deleteLater(); - _socket = 0; + _socket = nullptr; } _buffer.clear(); _reading = false; } - void CoreTransfer::onSocketDisconnected() { if (status() == Status::Connecting || status() == Status::Transferring) { @@ -67,7 +67,6 @@ void CoreTransfer::onSocketDisconnected() cleanUp(); } - void CoreTransfer::onSocketError(QAbstractSocket::SocketError error) { Q_UNUSED(error) @@ -77,11 +76,10 @@ void CoreTransfer::onSocketError(QAbstractSocket::SocketError error) } } - void CoreTransfer::requestAccepted(PeerPtr peer) { if (_peer || !peer || status() != Status::New) - return; // transfer was already accepted + return; // transfer was already accepted _peer = peer; setStatus(Status::Pending); @@ -92,7 +90,6 @@ void CoreTransfer::requestAccepted(PeerPtr peer) start(); } - void CoreTransfer::requestRejected(PeerPtr peer) { if (_peer || status() != Status::New) @@ -104,7 +101,6 @@ void CoreTransfer::requestRejected(PeerPtr peer) emit rejected(peer); } - void CoreTransfer::start() { if (!_peer || status() != Status::Pending || direction() != Direction::Receive) @@ -113,7 +109,6 @@ void CoreTransfer::start() setupConnectionForReceive(); } - void CoreTransfer::setupConnectionForReceive() { if (port() == 0) { @@ -124,42 +119,41 @@ void CoreTransfer::setupConnectionForReceive() setStatus(Status::Connecting); _socket = new QTcpSocket(this); - connect(_socket, SIGNAL(connected()), SLOT(startReceiving())); - connect(_socket, SIGNAL(disconnected()), SLOT(onSocketDisconnected())); - connect(_socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(onSocketError(QAbstractSocket::SocketError))); - connect(_socket, SIGNAL(readyRead()), SLOT(onDataReceived())); + connect(_socket, &QAbstractSocket::connected, this, &CoreTransfer::startReceiving); + connect(_socket, &QAbstractSocket::disconnected, this, &CoreTransfer::onSocketDisconnected); + connect(_socket, selectOverload(&QAbstractSocket::error), this, &CoreTransfer::onSocketError); + connect(_socket, &QIODevice::readyRead, this, &CoreTransfer::onDataReceived); _socket->connectToHost(address(), port()); } - void CoreTransfer::startReceiving() { setStatus(Status::Transferring); } - void CoreTransfer::onDataReceived() { - if (_reading) // since we're spinning the event loop, we may get another readyRead() and thus reentrancy + if (_reading) // since we're spinning the event loop, we may get another readyRead() and thus reentrancy return; _reading = true; while (_socket->bytesAvailable()) { QByteArray data = _socket->read(chunkSize); _pos += data.size(); + emit transferredChanged(transferred()); if (!relayData(data, true)) return; QCoreApplication::processEvents(); // don't block the rest of the core/client communication - if (!_socket) // just in case something happened during spinning the event loop that killed our socket + if (!_socket) // just in case something happened during spinning the event loop that killed our socket return; } // Send ack to sender. The DCC protocol only specifies 32 bit values, but modern clients (i.e. those who can send files // larger than 4 GB) will ignore this anyway... - quint32 ack = qToBigEndian((quint32)_pos);// qDebug() << Q_FUNC_INFO << _pos; - _socket->write((char *)&ack, 4); + quint32 ack = qToBigEndian((quint32)_pos); // qDebug() << Q_FUNC_INFO << _pos; + _socket->write((char*)&ack, 4); if (_pos > fileSize()) { qWarning() << "DCC Receive: Got more data than expected!"; @@ -167,15 +161,14 @@ void CoreTransfer::onDataReceived() } else if (_pos == fileSize()) { qDebug() << "DCC Receive: Transfer finished"; - if (relayData(QByteArray(), false)) // empty buffer + if (relayData(QByteArray(), false)) // empty buffer setStatus(Status::Completed); } _reading = false; } - -bool CoreTransfer::relayData(const QByteArray &data, bool requireChunkSize) +bool CoreTransfer::relayData(const QByteArray& data, bool requireChunkSize) { // safeguard against a disconnecting quasselclient if (!_peer) { @@ -186,7 +179,7 @@ bool CoreTransfer::relayData(const QByteArray &data, bool requireChunkSize) // we only want to send data to the client once we have reached the chunksize if (_buffer.size() > 0 && (_buffer.size() >= chunkSize || !requireChunkSize)) { - Peer *p = _peer.data(); + Peer* p = _peer.data(); SYNC_OTHER(dataReceived, ARG(p), ARG(_buffer)); _buffer.clear(); }