From qtnode
#ifndef QXRPCPEER
#define QXRPCPEER
#include <QObject>
#include <QList>
#include <QVariant>
#include <QMultiHash>
#include <QPair>
#include <QString>
#include <QHostAddress>
class QxIntrospector;
class QTcpServer;
class QTcpSocket;
struct QxRPCConnection;
class QxRPCPeer : public QObject {
Q_OBJECT
public:
QxRPCPeer(QObject* parent = 0);
enum RPCTypes { Server, Client, Peer };
void setRPCType(RPCTypes type);
RPCTypes rpcType();
void connect(QHostAddress addr, int port = 80);
bool listen(QHostAddress iface = QHostAddress::Any, int port = 80);
void disconnectPeer(int id = -1);
void disconnectAll();
void stopListening();
void attachSignal(QObject* sender, const char* signal, QString rpcFunction = QString());
void attachSlot(QString rpcFunction, QObject* recv, const char* slot);
void detachObject(QObject* obj);
public slots:
void call(QString fn, QVariant p1 = QVariant(), QVariant p2 = QVariant(), QVariant p3 = QVariant(), QVariant p4 = QVariant(),
QVariant p5 = QVariant(), QVariant p6 = QVariant(), QVariant p7 = QVariant(), QVariant p8 = QVariant(), QVariant p9 = QVariant());
void callClient(int id, QString fn, QVariant p1 = QVariant(), QVariant p2 = QVariant(), QVariant p3 = QVariant(), QVariant p4 = QVariant(),
QVariant p5 = QVariant(), QVariant p6 = QVariant(), QVariant p7 = QVariant(), QVariant p8 = QVariant());
void detachSender();
signals:
void peerConnected();
void clientConnected(int id);
void peerDisconnected();
void clientDisconnected(int id);
void peerError(QAbstractSocket::SocketError);
protected:
void receivePeerSignal(QString fn, QVariant p0 = QVariant(), QVariant p1 = QVariant(), QVariant p2 = QVariant(), QVariant p3 = QVariant(),
QVariant p4 = QVariant(), QVariant p5 = QVariant(), QVariant p6 = QVariant(), QVariant p7 = QVariant(), QVariant p8 = QVariant());
void receiveClientSignal(int id, QString fn, QVariant p0 = QVariant(), QVariant p1 = QVariant(), QVariant p2 = QVariant(), QVariant p3 = QVariant(),
QVariant p4 = QVariant(), QVariant p5 = QVariant(), QVariant p6 = QVariant(), QVariant p7 = QVariant());
QByteArray serialize(QString fn, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8, QVariant p9);
private slots:
void newConnection();
void dataAvailable();
void disconnectSender();
private:
void processInput(QTcpSocket* socket, QByteArray& buffer);
// Object -> introspector for each signal
QMultiHash<QObject*, QxIntrospector*> attachedSignals;
// RPC function -> (object, slot ID)
typedef QPair<QObject*, int> MethodID;
QHash<QString, QList<MethodID> > attachedSlots;
typedef QHash<QObject*, QxRPCConnection*> ConnHash;
QHash<QObject*, QxRPCConnection*> m_clients;
QTcpServer* m_server;
QTcpSocket* m_peer;
QByteArray m_buffer;
RPCTypes m_rpctype;
};
#endif