From fd25e92f19d6afd4eb02844bcbf20ba132868303 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Wed, 20 Feb 2013 23:52:15 +0100 Subject: [PATCH] Mutate SignalProxy::AbstractPeer into a separate class Peer It makes no sense anymore to have this a nested class inside SignalProxy anymore. Also, this streamlines the template handling a bit; we don't need to duplicate the handle() message between RemotePeer and InternalPeer. --- src/client/coreconnection.h | 3 +- src/common/CMakeLists.txt | 2 + src/common/internalpeer.cpp | 20 ++--- src/common/internalpeer.h | 13 +--- src/common/peer.cpp | 19 +++++ src/common/peer.h | 86 ++++++++++++++++++++++ src/common/protocol.h | 13 ++++ src/common/protocols/legacy/legacypeer.cpp | 2 + src/common/remotepeer.cpp | 2 +- src/common/remotepeer.h | 19 ++--- src/common/signalproxy.cpp | 27 +++---- src/common/signalproxy.h | 65 ++++------------ src/core/coresession.cpp | 4 +- src/core/coresession.h | 5 +- 14 files changed, 173 insertions(+), 107 deletions(-) create mode 100644 src/common/peer.cpp create mode 100644 src/common/peer.h diff --git a/src/client/coreconnection.h b/src/client/coreconnection.h index 836d8cc2..9ba9d6a3 100644 --- a/src/client/coreconnection.h +++ b/src/client/coreconnection.h @@ -43,6 +43,7 @@ class CoreAccountModel; class InternalPeer; class Network; +class Peer; class SignalProxy; class CoreConnection : public QObject @@ -176,7 +177,7 @@ private: QVariantMap _coreMsgBuffer; QPointer _socket; - QPointer _peer; + QPointer _peer; ConnectionState _state; QTimer _reconnectTimer; diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index c247eb34..18e6fcf4 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -28,6 +28,7 @@ set(SOURCES network.cpp networkconfig.cpp networkevent.cpp + peer.cpp quassel.cpp remotepeer.cpp settings.cpp @@ -55,6 +56,7 @@ set(MOC_HDRS ircuser.h network.h networkconfig.h + peer.h remotepeer.h settings.h signalproxy.h diff --git a/src/common/internalpeer.cpp b/src/common/internalpeer.cpp index 15e67ed3..20ab2e92 100644 --- a/src/common/internalpeer.cpp +++ b/src/common/internalpeer.cpp @@ -37,7 +37,7 @@ public: InternalPeer::InternalPeer(QObject *parent) - : SignalProxy::AbstractPeer(parent), + : Peer(parent), _proxy(0), _peer(0), _isOpen(true) @@ -91,6 +91,12 @@ int InternalPeer::lag() const } +::SignalProxy *InternalPeer::signalProxy() const +{ + return _proxy; +} + + void InternalPeer::setSignalProxy(::SignalProxy *proxy) { if (!proxy && _proxy) { @@ -172,18 +178,6 @@ void InternalPeer::dispatch(EventType eventType, const T &msg) } -template -void InternalPeer::handle(const T &msg) -{ - if (!_proxy) { - qWarning() << Q_FUNC_INFO << "Cannot handle a message without having a signal proxy set!"; - return; - } - - _proxy->handle(this, msg); -} - - void InternalPeer::customEvent(QEvent *event) { switch ((int)event->type()) { diff --git a/src/common/internalpeer.h b/src/common/internalpeer.h index 4c82ceb3..ada5f099 100644 --- a/src/common/internalpeer.h +++ b/src/common/internalpeer.h @@ -21,14 +21,13 @@ #ifndef INTERNALPEER_H #define INTERNALPEER_H -#include - +#include "peer.h" #include "protocol.h" #include "signalproxy.h" class QEvent; -class InternalPeer : public SignalProxy::AbstractPeer +class InternalPeer : public Peer { Q_OBJECT @@ -65,11 +64,6 @@ public: public slots: void close(const QString &reason = QString()); -signals: - - void disconnected(); - void error(QAbstractSocket::SocketError); - protected: void customEvent(QEvent *event); @@ -80,9 +74,6 @@ private: template void dispatch(EventType eventType, const T &msg); - template - void handle(const T &msg); - private: SignalProxy *_proxy; InternalPeer *_peer; diff --git a/src/common/peer.cpp b/src/common/peer.cpp new file mode 100644 index 00000000..62b5f790 --- /dev/null +++ b/src/common/peer.cpp @@ -0,0 +1,19 @@ +/*************************************************************************** + * 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. * + ***************************************************************************/ diff --git a/src/common/peer.h b/src/common/peer.h new file mode 100644 index 00000000..41c82cfa --- /dev/null +++ b/src/common/peer.h @@ -0,0 +1,86 @@ +/*************************************************************************** + * 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 PEER_H +#define PEER_H + +#include + +#include "protocol.h" +#include "signalproxy.h" + +class Peer : public QObject +{ + Q_OBJECT + +public: + Peer(QObject *parent = 0) : QObject(parent) {} + + virtual QString description() const = 0; + + virtual SignalProxy *signalProxy() const = 0; + virtual void setSignalProxy(SignalProxy *proxy) = 0; + + virtual bool isOpen() const = 0; + virtual bool isSecure() const = 0; + virtual bool isLocal() const = 0; + + virtual int lag() const = 0; + +public slots: + virtual void dispatch(const Protocol::SyncMessage &msg) = 0; + virtual void dispatch(const Protocol::RpcCall &msg) = 0; + virtual void dispatch(const Protocol::InitRequest &msg) = 0; + virtual void dispatch(const Protocol::InitData &msg) = 0; + + virtual void close(const QString &reason = QString()) = 0; + +signals: + void disconnected(); + void error(QAbstractSocket::SocketError); + void secureStateChanged(bool secure = true); + void lagUpdated(int msecs); + +protected: + template + void handle(const T &protoMessage); +}; + + +// Template method needed in the header +template inline +void Peer::handle(const T &protoMessage) +{ + switch(protoMessage.handler()) { + case Protocol::SignalProxy: + if (!signalProxy()) { + qWarning() << Q_FUNC_INFO << "Cannot handle message without a SignalProxy!"; + return; + } + signalProxy()->handle(this, protoMessage); + break; + + default: + qWarning() << Q_FUNC_INFO << "Unknown handler for protocol message!"; + return; + } +} + +#endif diff --git a/src/common/protocol.h b/src/common/protocol.h index af98b8b7..121f4e45 100644 --- a/src/common/protocol.h +++ b/src/common/protocol.h @@ -27,6 +27,11 @@ namespace Protocol { +enum Handler { + SignalProxy +}; + + /*** handled by SignalProxy ***/ class SyncMessage @@ -35,6 +40,8 @@ public: inline SyncMessage(const QByteArray &className, const QString &objectName, const QByteArray &slotName, const QVariantList ¶ms) : _className(className), _objectName(objectName), _slotName(slotName), _params(params) {} + inline Handler handler() const { return SignalProxy; } + inline QByteArray className() const { return _className; } inline QString objectName() const { return _objectName; } inline QByteArray slotName() const { return _slotName; } @@ -55,6 +62,8 @@ public: inline RpcCall(const QByteArray &slotName, const QVariantList ¶ms) : _slotName(slotName), _params(params) {} + inline Handler handler() const { return SignalProxy; } + inline QByteArray slotName() const { return _slotName; } inline QVariantList params() const { return _params; } @@ -70,6 +79,8 @@ public: inline InitRequest(const QByteArray &className, const QString &objectName) : _className(className), _objectName(objectName) {} + inline Handler handler() const { return SignalProxy; } + inline QByteArray className() const { return _className; } inline QString objectName() const { return _objectName; } @@ -85,6 +96,8 @@ public: inline InitData(const QByteArray &className, const QString &objectName, const QVariantMap &initData) : _className(className), _objectName(objectName), _initData(initData) {} + inline Handler handler() const { return SignalProxy; } + inline QByteArray className() const { return _className; } inline QString objectName() const { return _objectName; } diff --git a/src/common/protocols/legacy/legacypeer.cpp b/src/common/protocols/legacy/legacypeer.cpp index 709291f5..d0000473 100644 --- a/src/common/protocols/legacy/legacypeer.cpp +++ b/src/common/protocols/legacy/legacypeer.cpp @@ -18,6 +18,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include + #include "legacypeer.h" using namespace Protocol; diff --git a/src/common/remotepeer.cpp b/src/common/remotepeer.cpp index e33f56a9..f8deabfa 100644 --- a/src/common/remotepeer.cpp +++ b/src/common/remotepeer.cpp @@ -30,7 +30,7 @@ using namespace Protocol; RemotePeer::RemotePeer(QTcpSocket *socket, QObject *parent) - : SignalProxy::AbstractPeer(parent), + : Peer(parent), _socket(socket), _signalProxy(0), _heartBeatTimer(new QTimer(this)), diff --git a/src/common/remotepeer.h b/src/common/remotepeer.h index e41a6a3b..5751dfb8 100644 --- a/src/common/remotepeer.h +++ b/src/common/remotepeer.h @@ -22,14 +22,15 @@ #define REMOTEPEER_H #include -#include +#include "peer.h" #include "protocol.h" #include "signalproxy.h" +class QTcpSocket; class QTimer; -class RemotePeer : public SignalProxy::AbstractPeer +class RemotePeer : public Peer { Q_OBJECT @@ -62,9 +63,6 @@ signals: // this is only used for the auth phase and should be replaced by something more generic void dataReceived(const QVariant &item); - void disconnected(); - void error(QAbstractSocket::SocketError); - void transferProgress(int current, int max); protected: @@ -91,18 +89,11 @@ private: int _lag; }; -// Template methods we need in the header + template inline void RemotePeer::handle(const T &protoMessage) { - if (!signalProxy()) { - qWarning() << Q_FUNC_INFO << "Cannot handle messages without a SignalProxy!"; - return; - } - - // _heartBeatCount = 0; - - signalProxy()->handle(this, protoMessage); + Peer::handle(protoMessage); } diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index f05a509f..62fc8181 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -40,6 +40,7 @@ #include #include +#include "peer.h" #include "protocol.h" #include "syncableobject.h" #include "util.h" @@ -49,8 +50,8 @@ using namespace Protocol; class RemovePeerEvent : public QEvent { public: - RemovePeerEvent(SignalProxy::AbstractPeer *peer) : QEvent(QEvent::Type(SignalProxy::RemovePeerEvent)), peer(peer) {} - SignalProxy::AbstractPeer *peer; + RemovePeerEvent(Peer *peer) : QEvent(QEvent::Type(SignalProxy::RemovePeerEvent)), peer(peer) {} + Peer *peer; }; @@ -257,7 +258,7 @@ void SignalProxy::setMaxHeartBeatCount(int max) } -bool SignalProxy::addPeer(AbstractPeer *peer) +bool SignalProxy::addPeer(Peer *peer) { if (!peer) return false; @@ -300,14 +301,14 @@ void SignalProxy::removeAllPeers() { Q_ASSERT(proxyMode() == Server || _peers.count() <= 1); // wee need to copy that list since we modify it in the loop - QSet peers = _peers; - foreach(AbstractPeer *peer, peers) { + QSet peers = _peers; + foreach(Peer *peer, peers) { removePeer(peer); } } -void SignalProxy::removePeer(AbstractPeer *peer) +void SignalProxy::removePeer(Peer *peer) { if (!peer) { qWarning() << Q_FUNC_INFO << "Trying to remove a null peer!"; @@ -342,7 +343,7 @@ void SignalProxy::removePeer(AbstractPeer *peer) void SignalProxy::removePeerBySender() { - removePeer(qobject_cast(sender())); + removePeer(qobject_cast(sender())); } @@ -502,7 +503,7 @@ void SignalProxy::stopSynchronize(SyncableObject *obj) template void SignalProxy::dispatch(const T &protoMessage) { - foreach (AbstractPeer *peer, _peers) { + foreach (Peer *peer, _peers) { if (peer->isOpen()) peer->dispatch(protoMessage); else @@ -511,7 +512,7 @@ void SignalProxy::dispatch(const T &protoMessage) } -void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const SyncMessage &syncMessage) +void SignalProxy::handle(Peer *peer, const SyncMessage &syncMessage) { if (!_syncSlave.contains(syncMessage.className()) || !_syncSlave[syncMessage.className()].contains(syncMessage.objectName())) { qWarning() << QString("no registered receiver for sync call: %1::%2 (objectName=\"%3\"). Params are:").arg(syncMessage.className(), syncMessage.slotName(), syncMessage.objectName()) @@ -553,7 +554,7 @@ void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const SyncMessage &syn } -void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const InitRequest &initRequest) +void SignalProxy::handle(Peer *peer, const InitRequest &initRequest) { if (!_syncSlave.contains(initRequest.className())) { qWarning() << "SignalProxy::handleInitRequest() received initRequest for unregistered Class:" @@ -572,7 +573,7 @@ void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const InitRequest &ini } -void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const InitData &initData) +void SignalProxy::handle(Peer *peer, const InitData &initData) { Q_UNUSED(peer) @@ -593,7 +594,7 @@ void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const InitData &initDa } -void SignalProxy::handle(SignalProxy::AbstractPeer *peer, const RpcCall &rpcCall) +void SignalProxy::handle(Peer *peer, const RpcCall &rpcCall) { Q_UNUSED(peer) @@ -772,7 +773,7 @@ void SignalProxy::updateSecureState() bool wasSecure = _secure; _secure = !_peers.isEmpty(); - foreach (const AbstractPeer *peer, _peers) { + foreach (const Peer *peer, _peers) { _secure &= peer->isSecure(); } diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index a9667005..a1f9e714 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -35,9 +35,10 @@ #include "protocol.h" -class SyncableObject; -struct QMetaObject; +class QMetaObject; +class Peer; +class SyncableObject; class SignalProxy : public QObject { @@ -46,8 +47,6 @@ class SignalProxy : public QObject class SignalRelay; public: - class AbstractPeer; - enum ProxyMode { Server, Client @@ -69,7 +68,7 @@ public: void setMaxHeartBeatCount(int max); inline int maxHeartBeatCount() const { return _maxHeartBeatCount; } - bool addPeer(AbstractPeer *peer); + bool addPeer(Peer *peer); bool attachSignal(QObject *sender, const char *signal, const QByteArray &sigName = QByteArray()); bool attachSlot(const QByteArray &sigName, QObject *recv, const char *slot); @@ -104,7 +103,7 @@ private slots: void updateSecureState(); signals: - void peerRemoved(SignalProxy::AbstractPeer *peer); + void peerRemoved(Peer *peer); void connected(); void disconnected(); void objectInitialized(SyncableObject *); @@ -123,16 +122,19 @@ private: static const QMetaObject *metaObject(const QObject *obj); - void removePeer(AbstractPeer *peer); + void removePeer(Peer *peer); void removeAllPeers(); template void dispatch(const T &protoMessage); - void handle(AbstractPeer *peer, const Protocol::SyncMessage &syncMessage); - void handle(AbstractPeer *peer, const Protocol::RpcCall &rpcCall); - void handle(AbstractPeer *peer, const Protocol::InitRequest &initRequest); - void handle(AbstractPeer *peer, const Protocol::InitData &initData); + void handle(Peer *peer, const Protocol::SyncMessage &syncMessage); + void handle(Peer *peer, const Protocol::RpcCall &rpcCall); + void handle(Peer *peer, const Protocol::InitRequest &initRequest); + void handle(Peer *peer, const Protocol::InitData &initData); + + template + void handle(Peer *peer, T) { Q_ASSERT(0); } bool invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue); bool invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms = QVariantList()); @@ -143,7 +145,7 @@ private: static void disconnectDevice(QIODevice *dev, const QString &reason = QString()); - QSet _peers; + QSet _peers; // containg a list of argtypes for fast access QHash _extendedMetaObjects; @@ -168,8 +170,7 @@ private: friend class SignalRelay; friend class SyncableObject; - friend class InternalPeer; - friend class RemotePeer; + friend class Peer; }; @@ -231,40 +232,4 @@ private: QHash _receiveMap; // if slot x is called then hand over the result to slot y }; - -// ================================================== -// AbstractPeer -// ================================================== -class SignalProxy::AbstractPeer : public QObject -{ - Q_OBJECT - -public: - AbstractPeer(QObject *parent = 0) : QObject(parent) {} - - virtual QString description() const = 0; - - virtual void setSignalProxy(SignalProxy *proxy) = 0; - - virtual bool isOpen() const = 0; - virtual bool isSecure() const = 0; - virtual bool isLocal() const = 0; - - virtual int lag() const = 0; - -public slots: - virtual void dispatch(const Protocol::SyncMessage &msg) = 0; - virtual void dispatch(const Protocol::RpcCall &msg) = 0; - virtual void dispatch(const Protocol::InitRequest &msg) = 0; - virtual void dispatch(const Protocol::InitData &msg) = 0; - - virtual void close(const QString &reason = QString()) = 0; - -signals: - void disconnected(); - void error(QAbstractSocket::SocketError); - void secureStateChanged(bool secure = true); - void lagUpdated(int msecs); -}; - #endif diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index d44cf2b5..9b1395bb 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -79,7 +79,7 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) p->setHeartBeatInterval(30); p->setMaxHeartBeatCount(60); // 30 mins until we throw a dead socket out - connect(p, SIGNAL(peerRemoved(SignalProxy::AbstractPeer*)), SLOT(removeClient(SignalProxy::AbstractPeer*))); + connect(p, SIGNAL(peerRemoved(Peer*)), SLOT(removeClient(Peer*))); connect(p, SIGNAL(connected()), SLOT(clientsConnected())); connect(p, SIGNAL(disconnected()), SLOT(clientsDisconnected())); @@ -223,7 +223,7 @@ void CoreSession::addClient(InternalPeer *peer) } -void CoreSession::removeClient(SignalProxy::AbstractPeer *peer) +void CoreSession::removeClient(Peer *peer) { RemotePeer *p = qobject_cast(peer); if (p) diff --git a/src/core/coresession.h b/src/core/coresession.h index fdb952f7..019d5b33 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -28,7 +28,6 @@ #include "corealiasmanager.h" #include "coreignorelistmanager.h" #include "message.h" -#include "signalproxy.h" #include "storage.h" class CoreBacklogManager; @@ -44,9 +43,11 @@ class EventManager; class EventStringifier; class InternalPeer; class IrcParser; +class Peer; class MessageEvent; class NetworkConnection; class RemotePeer; +class SignalProxy; struct NetworkInfo; @@ -157,7 +158,7 @@ protected: virtual void customEvent(QEvent *event); private slots: - void removeClient(SignalProxy::AbstractPeer *peer); + void removeClient(Peer *peer); void recvStatusMsgFromServer(QString msg); void recvMessageFromServer(NetworkId networkId, Message::Type, BufferInfo::Type, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None); -- 2.20.1