...
#ifndef NETWORK_SESSION_HH
#define NETWORK_SESSION_HH
// 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"
#include <map>
class NetworkSession {
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);
private:
void on_tcp_client (NetworkTCPTransport *client);
void handle_disconnect (NetworkNode *node);
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 */