Fix warnings found by Clang
[quassel.git] / src / common / signalproxy.h
index 83b2f4a..9f31f6f 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2012 by the Quassel Project                        *
+ *   Copyright (C) 2005-2013 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
 #define SIGNALPROXY_H
 
 #include <QEvent>
-#include <QList>
-#include <QHash>
-#include <QVariant>
-#include <QVariantMap>
-#include <QPair>
-#include <QString>
-#include <QByteArray>
-#include <QTimer>
+#include <QSet>
+
+#include "protocol.h"
 
-class SyncableObject;
 struct QMetaObject;
 
+class Peer;
+class SyncableObject;
+
 class SignalProxy : public QObject
 {
     Q_OBJECT
 
-    class AbstractPeer;
-    class IODevicePeer;
-    class SignalProxyPeer;
-
     class SignalRelay;
 
 public:
@@ -50,28 +43,12 @@ public:
         Client
     };
 
-    enum RequestType {
-        Sync = 1,
-        RpcCall,
-        InitRequest,
-        InitData,
-        HeartBeat,
-        HeartBeatReply
-    };
-
-    enum ClientConnectionType {
-        SignalProxyConnection,
-        IODeviceConnection
-    };
-
-    enum CustomEvents {
-        PeerSignal = QEvent::User,
-        RemovePeer
+    enum EventType {
+        RemovePeerEvent = QEvent::User
     };
 
     SignalProxy(QObject *parent);
     SignalProxy(ProxyMode mode, QObject *parent);
-    SignalProxy(ProxyMode mode, QIODevice *device, QObject *parent);
     virtual ~SignalProxy();
 
     void setProxyMode(ProxyMode mode);
@@ -82,10 +59,7 @@ public:
     void setMaxHeartBeatCount(int max);
     inline int maxHeartBeatCount() const { return _maxHeartBeatCount; }
 
-    bool addPeer(QIODevice *iodev);
-    bool addPeer(SignalProxy *proxy);
-    void removePeer(QObject *peer);
-    void removeAllPeers();
+    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);
@@ -93,19 +67,6 @@ public:
     void synchronize(SyncableObject *obj);
     void stopSynchronize(SyncableObject *obj);
 
-    //! Writes a QVariant to a device.
-    /** The data item is prefixed with the resulting blocksize,
-     *  so the corresponding function readDataFromDevice() can check if enough data is available
-     *  at the device to reread the item.
-     */
-    static void writeDataToDevice(QIODevice *dev, const QVariant &item, bool compressed = false);
-
-    //! Reads a data item from a device that has been written by writeDataToDevice().
-    /** If not enough data bytes are available, the function returns false and the QVariant reference
-     *  remains untouched.
-     */
-    static bool readDataFromDevice(QIODevice *dev, quint32 &blockSize, QVariant &item, bool compressed = false);
-
     class ExtendedMetaObject;
     ExtendedMetaObject *extendedMetaObject(const QMetaObject *meta) const;
     ExtendedMetaObject *createExtendedMetaObject(const QMetaObject *meta, bool checkConflicts = false);
@@ -114,6 +75,8 @@ public:
 
     bool isSecure() const { return _secure; }
     void dumpProxyStats();
+    void dumpSyncMap(SyncableObject *object);
+    inline int peerCount() const { return _peers.size(); }
 
 public slots:
     void detachObject(QObject *obj);
@@ -126,41 +89,43 @@ protected:
     void renameObject(const SyncableObject *obj, const QString &newname, const QString &oldname);
 
 private slots:
-    void dataAvailable();
     void removePeerBySender();
     void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname);
-    void sendHeartBeat();
-    void receiveHeartBeat(AbstractPeer *peer, const QVariantList &params);
-    void receiveHeartBeatReply(AbstractPeer *peer, const QVariantList &params);
-
     void updateSecureState();
 
 signals:
-    void peerRemoved(QIODevice *dev);
+    void peerRemoved(Peer *peer);
     void connected();
     void disconnected();
     void objectInitialized(SyncableObject *);
+    void heartBeatIntervalChanged(int secs);
+    void maxHeartBeatCountChanged(int max);
     void lagUpdated(int lag);
-    void securityChanged(bool);
     void secureStateChanged(bool);
 
 private:
+    template<class T>
+    class PeerMessageEvent;
+
     void init();
     void initServer();
     void initClient();
 
     static const QMetaObject *metaObject(const QObject *obj);
 
-    void dispatchSignal(QIODevice *receiver, const RequestType &requestType, const QVariantList &params);
-    void dispatchSignal(const RequestType &requestType, const QVariantList &params);
+    void removePeer(Peer *peer);
+    void removeAllPeers();
+
+    template<class T>
+    void dispatch(const T &protoMessage);
+
+    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);
 
-    void receivePackedFunc(AbstractPeer *sender, const QVariant &packedFunc);
-    void receivePeerSignal(AbstractPeer *sender, const RequestType &requestType, const QVariantList &params);
-    void receivePeerSignal(SignalProxy *sender, const RequestType &requestType, const QVariantList &params);
-    void handleSync(AbstractPeer *sender, QVariantList params);
-    void handleInitRequest(AbstractPeer *sender, const QVariantList &params);
-    void handleInitData(AbstractPeer *sender, const QVariantList &params);
-    void handleSignal(const QVariantList &data);
+    template<class T>
+    void handle(Peer *peer, T) { Q_UNUSED(peer); Q_ASSERT(0); }
 
     bool invokeSlot(QObject *receiver, int methodId, const QVariantList &params, QVariant &returnValue);
     bool invokeSlot(QObject *receiver, int methodId, const QVariantList &params = QVariantList());
@@ -169,19 +134,9 @@ private:
     QVariantMap initData(SyncableObject *obj) const;
     void setInitData(SyncableObject *obj, const QVariantMap &properties);
 
-    void updateLag(IODevicePeer *peer, int lag);
-
-public:
-    void dumpSyncMap(SyncableObject *object);
-    inline int peerCount() const { return _peers.size(); }
-
-private:
     static void disconnectDevice(QIODevice *dev, const QString &reason = QString());
 
-    // a Hash of the actual used communication object to it's corresponding peer
-    // currently a communication object can either be an arbitrary QIODevice or another SignalProxy
-    typedef QHash<QObject *, AbstractPeer *> PeerHash;
-    PeerHash _peers;
+    QSet<Peer *> _peers;
 
     // containg a list of argtypes for fast access
     QHash<const QMetaObject *, ExtendedMetaObject *> _extendedMetaObjects;
@@ -199,7 +154,6 @@ private:
     QHash<QByteArray, ObjectId> _syncSlave;
 
     ProxyMode _proxyMode;
-    QTimer _heartBeatTimer;
     int _heartBeatInterval;
     int _maxHeartBeatCount;
 
@@ -207,6 +161,7 @@ private:
 
     friend class SignalRelay;
     friend class SyncableObject;
+    friend class Peer;
 };
 
 
@@ -217,7 +172,7 @@ class SignalProxy::ExtendedMetaObject
 {
     class MethodDescriptor
     {
-public:
+    public:
         MethodDescriptor(const QMetaMethod &method);
         MethodDescriptor() : _returnType(-1), _minArgCount(-1), _receiverMode(SignalProxy::Client) {}
 
@@ -227,7 +182,7 @@ public:
         inline int minArgCount() const { return _minArgCount; }
         inline SignalProxy::ProxyMode receiverMode() const { return _receiverMode; }
 
-private:
+    private:
         QByteArray _methodName;
         QList<int> _argTypes;
         int _returnType;
@@ -268,60 +223,4 @@ private:
     QHash<int, int> _receiveMap; // if slot x is called then hand over the result to slot y
 };
 
-
-// ==================================================
-//  Peers
-// ==================================================
-class SignalProxy::AbstractPeer
-{
-public:
-    enum PeerType {
-        NotAPeer = 0,
-        IODevicePeer = 1,
-        SignalProxyPeer = 2
-    };
-    AbstractPeer() : _type(NotAPeer) {}
-    AbstractPeer(PeerType type) : _type(type) {}
-    virtual ~AbstractPeer() {}
-    inline PeerType type() const { return _type; }
-    virtual void dispatchSignal(const RequestType &requestType, const QVariantList &params) = 0;
-    virtual bool isSecure() const = 0;
-private:
-    PeerType _type;
-};
-
-
-class SignalProxy::IODevicePeer : public SignalProxy::AbstractPeer
-{
-public:
-    IODevicePeer(QIODevice *device, bool compress) : AbstractPeer(AbstractPeer::IODevicePeer), _device(device), byteCount(0), usesCompression(compress), sentHeartBeats(0), lag(0) {}
-    virtual void dispatchSignal(const RequestType &requestType, const QVariantList &params);
-    virtual bool isSecure() const;
-    inline void dispatchPackedFunc(const QVariant &packedFunc) { SignalProxy::writeDataToDevice(_device, packedFunc, usesCompression); }
-    QString address() const;
-    inline bool isOpen() const { return _device->isOpen(); }
-    inline void close() const { _device->close(); }
-    inline bool readData(QVariant &item) { return SignalProxy::readDataFromDevice(_device, byteCount, item, usesCompression); }
-private:
-    QIODevice *_device;
-    quint32 byteCount;
-    bool usesCompression;
-public:
-    int sentHeartBeats;
-    int lag;
-};
-
-
-class SignalProxy::SignalProxyPeer : public SignalProxy::AbstractPeer
-{
-public:
-    SignalProxyPeer(SignalProxy *sender, SignalProxy *receiver) : AbstractPeer(AbstractPeer::SignalProxyPeer), sender(sender), receiver(receiver) {}
-    virtual void dispatchSignal(const RequestType &requestType, const QVariantList &params);
-    virtual inline bool isSecure() const { return true; }
-private:
-    SignalProxy *sender;
-    SignalProxy *receiver;
-};
-
-
 #endif