Code:qxrpcpeer.h

From qtnode

Jump to: navigation, search
#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
Personal tools