X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoretransfer.cpp;h=46a30a549ca845a382c4864756819b64dec67bac;hp=766136e0d17bb2145f5fdefedac408c5cad7cd80;hb=cc6e7c08709c4e761e2fd9c2e322751015497003;hpb=324ae188301d46e2268462bc0d8411baed8f00b8 diff --git a/src/core/coretransfer.cpp b/src/core/coretransfer.cpp index 766136e0..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,67 +18,71 @@ * 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 (state() == State::Connecting || state() == State::Transferring) { + if (status() == Status::Connecting || status() == Status::Transferring) { setError(tr("Socket closed while still transferring!")); } else cleanUp(); } - void CoreTransfer::onSocketError(QAbstractSocket::SocketError error) { Q_UNUSED(error) - if (state() == State::Connecting || state() == State::Transferring) { + if (status() == Status::Connecting || status() == Status::Transferring) { setError(tr("DCC connection error: %1").arg(_socket->errorString())); } } - void CoreTransfer::requestAccepted(PeerPtr peer) { - if (_peer || !peer || state() != State::New) - return; // transfer was already accepted + if (_peer || !peer || status() != Status::New) + return; // transfer was already accepted _peer = peer; - setState(State::Pending); + setStatus(Status::Pending); emit accepted(peer); @@ -86,28 +90,25 @@ void CoreTransfer::requestAccepted(PeerPtr peer) start(); } - void CoreTransfer::requestRejected(PeerPtr peer) { - if (_peer || state() != State::New) + if (_peer || status() != Status::New) return; _peer = peer; - setState(State::Rejected); + setStatus(Status::Rejected); emit rejected(peer); } - void CoreTransfer::start() { - if (!_peer || state() != State::Pending || direction() != Direction::Receive) + if (!_peer || status() != Status::Pending || direction() != Direction::Receive) return; setupConnectionForReceive(); } - void CoreTransfer::setupConnectionForReceive() { if (port() == 0) { @@ -115,45 +116,44 @@ void CoreTransfer::setupConnectionForReceive() return; } - setState(State::Connecting); + 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() { - setState(State::Transferring); + 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!"; @@ -161,15 +161,14 @@ void CoreTransfer::onDataReceived() } else if (_pos == fileSize()) { qDebug() << "DCC Receive: Transfer finished"; - if (relayData(QByteArray(), false)) // empty buffer - setState(State::Completed); + 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) { @@ -180,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(); }