HeartBeatReply
};
+ enum ClientConnectionType {
+ SignalProxyConnection,
+ IODeviceConnection
+ };
+
SignalProxy(QObject *parent);
SignalProxy(ProxyMode mode, QObject *parent);
SignalProxy(ProxyMode mode, QIODevice *device, QObject *parent);
inline ProxyMode proxyMode() const { return _proxyMode; }
bool addPeer(QIODevice *iodev);
- void removePeer(QIODevice *iodev);
bool addPeer(SignalProxy *proxy);
- void removePeer(SignalProxy *proxy);
+ void removePeer(QObject *peer);
void removeAllPeers();
bool attachSignal(QObject *sender, const char *signal, const QByteArray& sigName = QByteArray());
void dumpProxyStats();
+protected:
+ void customEvent(QEvent *event);
+
private slots:
void dataAvailable();
void detachSender();
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);
inline int peerCount() const { return _peers.size(); }
private:
+ static void disconnectDevice(QIODevice *dev, const QString &reason = QString());
+
class AbstractPeer {
public:
enum PeerType {
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 ¶ms);
inline void dispatchPackedFunc(const QVariant &packedFunc) { SignalProxy::writeDataToDevice(_device, packedFunc, usesCompression); }
- inline QIODevice *device() const { return _device; }
+ 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;
class SignalProxyPeer : public AbstractPeer {
public:
- SignalProxyPeer(SignalProxy *proxy) : AbstractPeer(AbstractPeer::SignalProxyPeer), proxy(proxy) {}
+ SignalProxyPeer(SignalProxy *sender, SignalProxy *receiver) : AbstractPeer(AbstractPeer::SignalProxyPeer), sender(sender), receiver(receiver) {}
virtual void dispatchSignal(const RequestType &requestType, const QVariantList ¶ms);
private:
- SignalProxy *proxy;
+ SignalProxy *sender;
+ SignalProxy *receiver;
};
// 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;
-
-// // Hash of used QIODevices
-// struct peerInfo {
-// quint32 byteCount;
-// bool usesCompression;
-// int sentHeartBeats;
-// int lag;
-// peerInfo() : byteCount(0), usesCompression(false), sentHeartBeats(0) {}
-// };
-// QHash<QIODevice*, peerInfo> _peers;
// containg a list of argtypes for fast access
QHash<const QMetaObject *, ClassInfo*> _classInfo;