src/proto2/NetworkSession.hh
author terom
Thu, 20 Nov 2008 22:55:28 +0000
branchno-netsession
changeset 39 cfb8b6e2a35f
parent 37 ed2957490bbf
permissions -rw-r--r--
almost playable
#ifndef NETWORK_SESSION_HH
#define NETWORK_SESSION_HH

#include <map>

// forward-declare
class NetworkSession;

/*
 * Used to separate packets, ID zero is reserved for NetworkSession use
 */
typedef uint16_t NetworkChannelID;

#include "NetworkTCP.hh"
#include "NetworkUDP.hh"
#include "NetworkNode.hh"

class NetworkSession {
    friend class NetworkNode;

    private:
        uint64_t magic;
        NetworkTCPServer *tcp_srv;
        NetworkUDP *udp_srv, *udp_client;

        CL_SlotContainer slots;

        std::map<NetworkAddress, NetworkNode*> nodes;
        std::map<NetworkChannelID, CL_Signal_v2<NetworkPacket&, NetworkNode *> > _map_sig_chan_message;
    
    public:
        NetworkSession (uint64_t magic);

        void listen (const NetworkAddress &addr);
        NetworkNode* connect (const NetworkAddress &addr);
    
    protected:
        virtual NetworkNode *build_node (NetworkTCPTransport *tcp, NetworkUDP *udp, const NetworkAddress &addr, enum NetworkNodeType type);
        
        void handle_disconnect (NetworkNode *node);
        void handle_message (NetworkPacket &pkt, NetworkNode *node);

    private:
        void on_tcp_client (NetworkTCPTransport *client);
        void on_udp_packet (NetworkPacket &pkt, const NetworkAddress &addr);

        CL_Signal_v1<NetworkNode*> _sig_node_connected;

    public:
        void send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable = true);
        void send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable = true);

        CL_Signal_v1<NetworkNode*>& sig_node_connected (void) { return _sig_node_connected; }
        CL_Signal_v2<NetworkPacket&, NetworkNode *>& sig_chan_message (NetworkChannelID cid) { return _map_sig_chan_message[cid]; }
};

#endif /* NETWORK_SESSION_HH */