src/proto2/NetworkObject.hh
author terom
Thu, 20 Nov 2008 22:10:28 +0000
branchno-netsession
changeset 38 4189b8bf3a5b
parent 37 ed2957490bbf
permissions -rw-r--r--
kind of works
#ifndef NETWORK_OBJECT_HH
#define NETWORK_OBJECT_HH

#include "NetworkSession.hh"
#include "NetworkNode.hh"
#include "Logger.hh"

#include <map>

typedef uint32_t NetworkObjectID;
typedef uint16_t NetworkMessageID;

// forward-declare
class NetworkObject;
class NetworkObject_Client;
class NetworkObject_Server;

class NetworkObjectController {
    friend class NetworkObject;
    friend class NetworkObject_Server;
    friend class NetworkObject_Client;

    private:
        NetworkSession &session;
        NetworkChannelID channel_id;

        std::map<NetworkObjectID, NetworkObject*> objects;

        CL_Slot slot_message;
    
    protected:
        NetworkObjectController (NetworkSession &session, NetworkChannelID channel_id);
    
    private:
        void on_message (NetworkPacket &pkt, NetworkNode *node);

    protected:
        virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) = 0; 
};

class NetworkObject_ServerController : public NetworkObjectController {
    friend class NetworkObject_Server;

    private:
        NetworkObjectID id_pool;
    
    public:
        NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id);

    protected:
        NetworkObjectID getObjectID (void);

        virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node);
};

class NetworkObject_ClientController : public NetworkObjectController {
    friend class NetworkObject_Client;

    private:
        NetworkNode *server;

        CL_Signal_v3<NetworkObject_Client*, NetworkMessageID, NetworkPacket&> _sig_create;
    
    public:
        NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server);

    protected:
        virtual void handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node);
    
    public:  
        CL_Signal_v3<NetworkObject_Client*, NetworkMessageID, NetworkPacket&>& sig_create (void) { return _sig_create; }
};

class NetworkObject {
    friend class NetworkObjectController;
    friend std::ostream& operator<< (std::ostream &s, const NetworkObject &obj);

    protected:
        NetworkObjectID obj_id;

    protected:
        NetworkObject (NetworkObjectController &controller, NetworkObjectID obj_id);
        
        virtual void handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) = 0;

        void buildPacket (NetworkPacket &pkt, NetworkMessageID msg_id, const NetworkPacket &payload);
};

std::ostream& operator<< (std::ostream &s, const NetworkObject &obj);

class NetworkObject_Server : public NetworkObject {
    friend class NetworkObject_ServerController;

    private:
        NetworkObject_ServerController &controller;

        std::map<NetworkMessageID, CL_Signal_v2<NetworkNode*, NetworkPacket&> > _map_sig_message;

    public:
        NetworkObject_Server (NetworkObject_ServerController &controller);
    
    protected:
        virtual void handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt);

    public:
        void send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true);
        void send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true);
        void send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable = true);
    
        CL_Signal_v2<NetworkNode*, NetworkPacket&>& sig_message (NetworkMessageID msg_id) { return _map_sig_message[msg_id]; }
};

class NetworkObject_Client : public NetworkObject {
    friend class NetworkObject_ClientController;

    private:
        NetworkObject_ClientController &controller;

        std::map<NetworkMessageID, CL_Signal_v1<NetworkPacket&> > _map_sig_message;

    protected:
        NetworkObject_Client (NetworkObject_ClientController &controller, NetworkObjectID id);
        
        virtual void handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt);

    public:
        void send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable = true);
        
        CL_Signal_v1<NetworkPacket&>& sig_message (NetworkMessageID msg_id) { return _map_sig_message[msg_id]; }
};

#endif /* NETWORK_OBJECT_HH */