#include "NetworkSession.hh"
NetworkSession::NetworkSession (NetworkSessionMagic magic) :
magic(magic), tcp_srv(NULL), udp_srv(NULL), udp_client(NULL) {
// nothing
}
void NetworkSession::listen (const NetworkAddress &addr) {
assert(tcp_srv == NULL && udp_srv == NULL);
// create TCP/UDP servers
tcp_srv = new NetworkTCPServer(addr);
udp_srv = new NetworkUDP(addr);
// connect signals
slots.connect(tcp->sig_client, this, &NetworkSession::on_tcp_client);
}
NetworkNode* NetworkSession::connect (const NetworkAddress &addr) {
// create new UDP client if needed
if (udp_client == NULL)
udp_client = new NetworkUDP();
// connect
NetworkTCPClient *tcp_client = new NetworkTCPClient(addr);
// create node
NetworkNode *client_node = new NetworkNode(*this, tcp_client, udp_client, addr);
// add to nodes
nodes[addr] = client_node;
// bind signals
slots.connect(tcp_client->sig_disconnected, this, &NetworkSession::on_disconnect, client_node);
}
void NetworkSession::on_tcp_client (const NetworkTCPTransport *tcp_client) {
// get remote address manually, because NetworkTCPServer doesn't pass it in to us
NetworkAddress addr = tcp_client->getRemoteAddress();
// create node
NetworkNode *client_node = new NetworkNode(*this, tcp_client, udp_server, addr);
// add to nodes
nodes[addr] = client_node;
// bind signals
slots.connect(tcp_client->sig_disconnected, this, &NetworkSession::on_disconnect, client_node);
// fire signals
sig_node_connected(node);
}
void NetworkSession::on_disconnect (NetworkNode *node) {
// remove from nodes
nodes.erase(node->getRemoteAddress());
// fire signal
sig_node_disconnected(node);
// delete
delete node;
}
void NetworkSession::send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable) {
send_all_except(NULL, reliable);
}
void NetworkSession::send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable) {
for (std::map<NetworkAddress, NetworkNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
if (it->second == node)
continue;
it->second->send(channel_id, pkt, reliable);
}
}