+ void peerRemoved(QIODevice *dev);
+ void connected();
+ void disconnected();
+ void objectInitialized(SyncableObject *);
+ void lagUpdated(int lag);
+ void securityChanged(bool);
+ void secureStateChanged(bool);
+
+private:
+ void init();
+ void initServer();
+ void initClient();
+
+ static const QMetaObject *metaObject(const QObject *obj);
+
+ void dispatchSignal(QIODevice *receiver, const RequestType &requestType, const QVariantList ¶ms);
+ void dispatchSignal(const RequestType &requestType, const QVariantList ¶ms);
+
+ void receivePackedFunc(AbstractPeer *sender, const QVariant &packedFunc);
+ void receivePeerSignal(AbstractPeer *sender, const RequestType &requestType, const QVariantList ¶ms);
+ void receivePeerSignal(SignalProxy *sender, const RequestType &requestType, const QVariantList ¶ms);
+ void handleSync(AbstractPeer *sender, QVariantList params);
+ void handleInitRequest(AbstractPeer *sender, const QVariantList ¶ms);
+ void handleInitData(AbstractPeer *sender, const QVariantList ¶ms);
+ void handleSignal(const QVariantList &data);
+
+ bool invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms, QVariant &returnValue);
+ bool invokeSlot(QObject *receiver, int methodId, const QVariantList ¶ms = QVariantList());
+
+ void requestInit(SyncableObject *obj);
+ 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;
+
+ // containg a list of argtypes for fast access
+ QHash<const QMetaObject *, ExtendedMetaObject *> _extendedMetaObjects;
+
+ // SignalRelay for all manually attached signals
+ SignalRelay *_signalRelay;
+
+ // RPC function -> (object, slot ID)
+ typedef QPair<QObject *, int> MethodId;
+ typedef QMultiHash<QByteArray, MethodId> SlotHash;
+ SlotHash _attachedSlots;
+
+ // slaves for sync
+ typedef QHash<QString, SyncableObject *> ObjectId;
+ QHash<QByteArray, ObjectId> _syncSlave;
+
+ ProxyMode _proxyMode;
+ QTimer _heartBeatTimer;
+ int _heartBeatInterval;
+ int _maxHeartBeatCount;
+
+ bool _secure; // determines if all connections are in a secured state (using ssl or internal connections)
+
+ friend class SignalRelay;
+ friend class SyncableObject;
+};
+
+
+// ==================================================
+// ExtendedMetaObject
+// ==================================================
+class SignalProxy::ExtendedMetaObject
+{
+ class MethodDescriptor
+ {
+public:
+ MethodDescriptor(const QMetaMethod &method);
+ MethodDescriptor() : _returnType(-1), _minArgCount(-1), _receiverMode(SignalProxy::Client) {}
+
+ inline const QByteArray &methodName() const { return _methodName; }
+ inline const QList<int> &argTypes() const { return _argTypes; }
+ inline int returnType() const { return _returnType; }
+ inline int minArgCount() const { return _minArgCount; }
+ inline SignalProxy::ProxyMode receiverMode() const { return _receiverMode; }
+