From 0d7b511c8510d7fd05d3a704114e34ff37f7a995 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Sat, 28 Dec 2013 22:26:27 +0100 Subject: [PATCH] Refactor the transfer stuff Well, sometimes refactorings come sooner than usual. While thinking about the next steps, I decided to handle the actual transfer logic inside Transfer rather than TransferManager - now that we can have selective (peer-based) sync calls as well, that makes more sense than outsourcing that to TransferManager. Thus, it now makes lots of sense to have ClientTransfer and CoreTransfer, as the logic will be quite different. I also took the opportunity to clean up the accessors and make them safer; you can now get a non-const CoreTransfer pointer, for example, but still only a const ClientTransfer pointer. Also, some useful signals have been added. --- src/client/CMakeLists.txt | 2 + src/client/clienttransfer.cpp | 51 ++++++++++++++++++++++++++ src/client/clienttransfer.h | 48 ++++++++++++++++++++++++ src/client/clienttransfermanager.cpp | 19 ++++++++-- src/client/clienttransfermanager.h | 6 ++- src/common/transfer.cpp | 34 ----------------- src/common/transfer.h | 16 +++----- src/common/transfermanager.cpp | 2 +- src/common/transfermanager.h | 8 ++-- src/core/CMakeLists.txt | 2 + src/core/coresessioneventprocessor.cpp | 4 +- src/core/coretransfer.cpp | 41 +++++++++++++++++++++ src/core/coretransfer.h | 41 +++++++++++++++++++++ src/core/coretransfermanager.cpp | 24 +++++++++++- src/core/coretransfermanager.h | 10 +++++ src/qtui/mainwin.cpp | 2 +- 16 files changed, 250 insertions(+), 60 deletions(-) create mode 100644 src/client/clienttransfer.cpp create mode 100644 src/client/clienttransfer.h create mode 100644 src/core/coretransfer.cpp create mode 100644 src/core/coretransfer.h diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index b5fef022..c7b3ee30 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -33,6 +33,7 @@ set(SOURCES clientignorelistmanager.cpp clientirclisthelper.cpp clientsettings.cpp + clienttransfer.cpp clienttransfermanager.cpp clientuserinputhandler.cpp coreaccount.cpp @@ -61,6 +62,7 @@ set(MOC_HDRS clientidentity.h clientignorelistmanager.h clientirclisthelper.h + clienttransfer.h clienttransfermanager.h clientuserinputhandler.h coreaccountmodel.h diff --git a/src/client/clienttransfer.cpp b/src/client/clienttransfer.cpp new file mode 100644 index 00000000..aab69b3b --- /dev/null +++ b/src/client/clienttransfer.cpp @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2005-2013 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "clienttransfer.h" + +INIT_SYNCABLE_OBJECT(ClientTransfer) +ClientTransfer::ClientTransfer(const QUuid &uuid, QObject *parent) + : Transfer(uuid, parent) +{ + +} + + +QString ClientTransfer::savePath() const +{ + return _savePath; +} + + +void ClientTransfer::accept(const QString &savePath) const +{ + _savePath = savePath; + PeerPtr ptr = 0; + REQUEST_OTHER(requestAccepted, ARG(ptr)); + emit accepted(); +} + + +void ClientTransfer::reject() const +{ + PeerPtr ptr = 0; + REQUEST_OTHER(requestRejected, ARG(ptr)); + emit rejected(); +} diff --git a/src/client/clienttransfer.h b/src/client/clienttransfer.h new file mode 100644 index 00000000..b1ca5df9 --- /dev/null +++ b/src/client/clienttransfer.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * Copyright (C) 2005-2013 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef CLIENTTRANSFER_H +#define CLIENTTRANSFER_H + +#include + +#include "transfer.h" + +class ClientTransfer : public Transfer +{ + Q_OBJECT + SYNCABLE_OBJECT + +public: + ClientTransfer(const QUuid &uuid, QObject *parent = 0); + + QString savePath() const; + +public slots: + // called on the client side + void accept(const QString &savePath) const; + void reject() const; + +private: + // non-synced attributes + mutable QString _savePath; +}; + +#endif diff --git a/src/client/clienttransfermanager.cpp b/src/client/clienttransfermanager.cpp index 7e89cca1..e79c84ea 100644 --- a/src/client/clienttransfermanager.cpp +++ b/src/client/clienttransfermanager.cpp @@ -21,7 +21,7 @@ #include "clienttransfermanager.h" #include "client.h" -#include "transfer.h" +#include "clienttransfer.h" INIT_SYNCABLE_OBJECT(ClientTransferManager) @@ -32,6 +32,12 @@ ClientTransferManager::ClientTransferManager(QObject *parent) } +const ClientTransfer *ClientTransferManager::transfer(const QUuid &uuid) const +{ + return qobject_cast(transfer_(uuid)); +} + + void ClientTransferManager::onCoreTransferAdded(const QUuid &uuid) { if (uuid.isNull()) { @@ -39,7 +45,7 @@ void ClientTransferManager::onCoreTransferAdded(const QUuid &uuid) return; } - Transfer *transfer = new Transfer(uuid, this); + ClientTransfer *transfer = new ClientTransfer(uuid, this); connect(transfer, SIGNAL(initDone()), SLOT(onTransferInitDone())); // we only want to add initialized transfers Client::signalProxy()->synchronize(transfer); } @@ -55,6 +61,11 @@ void ClientTransferManager::onTransferInitDone() void ClientTransferManager::onTransferAdded(const Transfer *transfer) { - // FIXME just a temporary solution - emit newTransfer(transfer); + const ClientTransfer *t = qobject_cast(transfer); + if (!t) { + qWarning() << "Invalid Transfer added to ClientTransferManager!"; + return; + } + + emit transferAdded(t); } diff --git a/src/client/clienttransfermanager.h b/src/client/clienttransfermanager.h index d2483cac..505ae1e2 100644 --- a/src/client/clienttransfermanager.h +++ b/src/client/clienttransfermanager.h @@ -25,7 +25,7 @@ #include -class Transfer; +class ClientTransfer; class ClientTransferManager : public TransferManager { @@ -35,12 +35,14 @@ class ClientTransferManager : public TransferManager public: ClientTransferManager(QObject *parent = 0); + const ClientTransfer *transfer(const QUuid &uuid) const; + public slots: void onCoreTransferAdded(const QUuid &uuid); void onTransferInitDone(); signals: - void newTransfer(const Transfer *transfer); + void transferAdded(const ClientTransfer *transfer); private slots: void onTransferAdded(const Transfer *transfer); diff --git a/src/common/transfer.cpp b/src/common/transfer.cpp index 25f1e205..e9c81f77 100644 --- a/src/common/transfer.cpp +++ b/src/common/transfer.cpp @@ -171,37 +171,3 @@ void Transfer::setNick(const QString &nick) emit nickChanged(nick); } } - - -QString Transfer::savePath() const -{ - return _savePath; -} - - -void Transfer::accept(const QString &savePath) const -{ - _savePath = savePath; - PeerPtr ptr = 0; - REQUEST_OTHER(requestAccepted, ARG(ptr)); - emit accepted(); -} - - -void Transfer::reject() const -{ - REQUEST_OTHER(requestRejected, NO_ARG); - emit rejected(); -} - - -void Transfer::requestAccepted(PeerPtr peer) -{ - emit accepted(peer); -} - - -void Transfer::requestRejected() -{ - emit rejected(); -} diff --git a/src/common/transfer.h b/src/common/transfer.h index e36ed15c..bdbad9fc 100644 --- a/src/common/transfer.h +++ b/src/common/transfer.h @@ -61,6 +61,7 @@ public: Transfer(const QUuid &uuid, QObject *parent = 0); // for creating a syncable object client-side Transfer(Direction direction, const QString &nick, const QString &fileName, const QHostAddress &address, quint16 port, quint64 size = 0, QObject *parent = 0); + inline virtual const QMetaObject *syncMetaObject() const { return &staticMetaObject; } QUuid uuid() const; State state() const; @@ -71,16 +72,14 @@ public: quint64 fileSize() const; QString nick() const; - QString savePath() const; - public slots: // called on the client side - void accept(const QString &savePath) const; - void reject() const; + virtual void accept(const QString &savePath) const { Q_UNUSED(savePath); } + virtual void reject() const {} // called on the core side through sync calls - void requestAccepted(PeerPtr peer = 0); - void requestRejected(); + virtual void requestAccepted(PeerPtr peer) { Q_UNUSED(peer); } + virtual void requestRejected(PeerPtr peer) { Q_UNUSED(peer); } signals: void stateChanged(State state); @@ -92,7 +91,7 @@ signals: void nickChanged(const QString &nick); void accepted(PeerPtr peer = 0) const; - void rejected() const; + void rejected(PeerPtr peer = 0) const; protected: void setState(State state); @@ -116,9 +115,6 @@ private: quint64 _fileSize; QString _nick; QUuid _uuid; - - // non-synced attributes - mutable QString _savePath; }; #endif diff --git a/src/common/transfermanager.cpp b/src/common/transfermanager.cpp index 92b3f6c8..2e6b9b1b 100644 --- a/src/common/transfermanager.cpp +++ b/src/common/transfermanager.cpp @@ -31,7 +31,7 @@ TransferManager::TransferManager(QObject *parent) } -const Transfer *TransferManager::transfer(const QUuid &uuid) const +Transfer *TransferManager::transfer_(const QUuid &uuid) const { return _transfers.value(uuid, 0); } diff --git a/src/common/transfermanager.h b/src/common/transfermanager.h index 77c864c1..6686b007 100644 --- a/src/common/transfermanager.h +++ b/src/common/transfermanager.h @@ -36,15 +36,15 @@ public: TransferManager(QObject *parent = 0); inline virtual const QMetaObject *syncMetaObject() const { return &staticMetaObject; } - const Transfer *transfer(const QUuid &uuid) const; QList transferIds() const; -public slots: - void addTransfer(Transfer *transfer); - signals: void transferAdded(const Transfer *transfer); +protected: + Transfer *transfer_(const QUuid &uuid) const; + void addTransfer(Transfer *transfer); + protected slots: virtual void onCoreTransferAdded(const QUuid &uuid) { Q_UNUSED(uuid) }; diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 265ac0d0..dfb02893 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -24,6 +24,7 @@ set(SOURCES coresession.cpp coresessioneventprocessor.cpp coresettings.cpp + coretransfer.cpp coretransfermanager.cpp coreuserinputhandler.cpp coreusersettings.cpp @@ -59,6 +60,7 @@ set(MOC_HDRS corenetworkconfig.h coresession.h coresessioneventprocessor.h + coretransfer.h coretransfermanager.h coreuserinputhandler.h ctcpparser.h diff --git a/src/core/coresessioneventprocessor.cpp b/src/core/coresessioneventprocessor.cpp index 844155b0..deca9880 100644 --- a/src/core/coresessioneventprocessor.cpp +++ b/src/core/coresessioneventprocessor.cpp @@ -23,6 +23,7 @@ #include "coreirclisthelper.h" #include "corenetwork.h" #include "coresession.h" +#include "coretransfer.h" #include "coretransfermanager.h" #include "ctcpevent.h" #include "ircevent.h" @@ -30,7 +31,6 @@ #include "messageevent.h" #include "netsplit.h" #include "quassel.h" -#include "transfer.h" #ifdef HAVE_QCA2 # include "keyevent.h" @@ -1059,7 +1059,7 @@ void CoreSessionEventProcessor::handleCtcpDcc(CtcpEvent *e) } // TODO: check if target is the right thing to use for the partner - Transfer *transfer = new Transfer(Transfer::Receive, e->target(), filename, address, port, size, this); + CoreTransfer *transfer = new CoreTransfer(Transfer::Receive, e->target(), filename, address, port, size, this); coreSession()->signalProxy()->synchronize(transfer); coreSession()->transferManager()->addTransfer(transfer); } diff --git a/src/core/coretransfer.cpp b/src/core/coretransfer.cpp new file mode 100644 index 00000000..10d609ba --- /dev/null +++ b/src/core/coretransfer.cpp @@ -0,0 +1,41 @@ +/*************************************************************************** + * Copyright (C) 2005-2013 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "coretransfer.h" + +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) +{ + +} + + +void CoreTransfer::requestAccepted(PeerPtr peer) +{ + emit accepted(peer); +} + + +void CoreTransfer::requestRejected(PeerPtr peer) +{ + emit rejected(peer); +} diff --git a/src/core/coretransfer.h b/src/core/coretransfer.h new file mode 100644 index 00000000..9d57db37 --- /dev/null +++ b/src/core/coretransfer.h @@ -0,0 +1,41 @@ +/*************************************************************************** + * Copyright (C) 2005-2013 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef CORETRANSFER_H +#define CORETRANSFER_H + +#include "transfer.h" + +class CoreTransfer : public Transfer +{ + Q_OBJECT + SYNCABLE_OBJECT + +public: + CoreTransfer(Direction direction, const QString &nick, const QString &fileName, const QHostAddress &address, quint16 port, quint64 size = 0, QObject *parent = 0); + +public slots: + // called through sync calls + void requestAccepted(PeerPtr peer); + void requestRejected(PeerPtr peer); + +}; + +#endif diff --git a/src/core/coretransfermanager.cpp b/src/core/coretransfermanager.cpp index a11927ab..7fb37e80 100644 --- a/src/core/coretransfermanager.cpp +++ b/src/core/coretransfermanager.cpp @@ -20,8 +20,7 @@ #include "coretransfermanager.h" -#include "transfer.h" - +#include "coretransfer.h" INIT_SYNCABLE_OBJECT(CoreTransferManager) CoreTransferManager::CoreTransferManager(QObject *parent) @@ -31,10 +30,31 @@ CoreTransferManager::CoreTransferManager(QObject *parent) } +CoreTransfer *CoreTransferManager::transfer(const QUuid &uuid) const +{ + return qobject_cast(transfer_(uuid)); +} + + +void CoreTransferManager::addTransfer(CoreTransfer *transfer) +{ + TransferManager::addTransfer(transfer); +} + + void CoreTransferManager::onTransferAdded(const Transfer *transfer) { + // for core-side use, publishing a non-const pointer is ok + CoreTransfer *t = const_cast(qobject_cast(transfer)); + if (!t) { + qWarning() << "Invalid Transfer added to CoreTransferManager!"; + return; + } + connect(transfer, SIGNAL(accepted(PeerPtr)), SLOT(onTransferAccepted(PeerPtr))); connect(transfer, SIGNAL(rejected(PeerPtr)), SLOT(onTransferRejected(PeerPtr))); + + emit transferAdded(t); } diff --git a/src/core/coretransfermanager.h b/src/core/coretransfermanager.h index f5f47c86..1a4ddb68 100644 --- a/src/core/coretransfermanager.h +++ b/src/core/coretransfermanager.h @@ -24,6 +24,8 @@ #include "transfermanager.h" #include "types.h" +class CoreTransfer; + class CoreTransferManager : public TransferManager { Q_OBJECT @@ -32,6 +34,14 @@ class CoreTransferManager : public TransferManager public: CoreTransferManager(QObject *parent = 0); + CoreTransfer *transfer(const QUuid &uuid) const; + +public slots: + void addTransfer(CoreTransfer *transfer); + +signals: + void transferAdded(CoreTransfer *transfer); + private slots: void onTransferAdded(const Transfer *transfer); void onTransferAccepted(PeerPtr peer); diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 573728e7..760f867a 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -1025,7 +1025,7 @@ void MainWin::connectedToCore() connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(removeBufferView(int))); connect(Client::bufferViewManager(), SIGNAL(initDone()), this, SLOT(loadLayout())); - connect(Client::transferManager(), SIGNAL(newTransfer(const Transfer*)), SLOT(showNewTransferDlg(const Transfer*))); + connect(Client::transferManager(), SIGNAL(transferAdded(const Transfer*)), SLOT(showNewTransferDlg(const Transfer*))); setConnectedState(); } -- 2.20.1