13 // create TCP/UDP servers |
15 // create TCP/UDP servers |
14 tcp_srv = new NetworkTCPServer(addr); |
16 tcp_srv = new NetworkTCPServer(addr); |
15 udp_srv = new NetworkUDP(addr); |
17 udp_srv = new NetworkUDP(addr); |
16 |
18 |
17 // connect signals |
19 // connect signals |
18 slots.connect(tcp->sig_client(), this, &NetworkSession::on_tcp_client); |
20 slots.connect(tcp_srv->sig_client(), this, &NetworkSession::on_tcp_client); |
19 } |
21 } |
20 |
22 |
21 NetworkNode *NetworkSession::build_node (NetworkTCPTransport *tcp_client, NetworkUDP *udp, const NetworkAddress &addr, , enum NetworkNodeType type) { |
23 NetworkNode *NetworkSession::build_node (NetworkTCPTransport *tcp, NetworkUDP *udp, const NetworkAddress &addr, enum NetworkNodeType type) { |
22 // XXX: unused |
24 // XXX: unused |
23 (void) type; |
25 (void) type; |
24 |
26 |
25 // create node |
27 // create node |
26 return new NetworkNode(*this, tcp_client, addr); |
28 return new NetworkNode(*this, tcp, udp, addr); |
27 } |
29 } |
28 |
30 |
29 NetworkNode* NetworkSession::connect (const NetworkAddress &addr) { |
31 NetworkNode* NetworkSession::connect (const NetworkAddress &addr) { |
30 // create new UDP client if needed |
32 // create new UDP client if needed |
31 if (udp_client == NULL) |
33 if (udp_client == NULL) |
37 // build client |
39 // build client |
38 NetworkNode *client_node = build_node(tcp_client, udp_client, addr, NETWORK_NODE_CLIENT_SERVER); |
40 NetworkNode *client_node = build_node(tcp_client, udp_client, addr, NETWORK_NODE_CLIENT_SERVER); |
39 |
41 |
40 // add to nodes |
42 // add to nodes |
41 nodes[addr] = client_node; |
43 nodes[addr] = client_node; |
42 |
44 |
43 // bind signals |
45 // return the "server" node |
44 slots.connect(tcp_client->sig_disconnect(), this, &NetworkSession::on_disconnect, client_node); |
46 return client_node; |
45 } |
47 } |
46 |
48 |
47 void NetworkSession::on_tcp_client (NetworkTCPTransport *tcp_client) { |
49 void NetworkSession::on_tcp_client (NetworkTCPTransport *tcp_client) { |
48 // get remote address manually, because NetworkTCPServer doesn't pass it in to us |
50 // get remote address manually, because NetworkTCPServer doesn't pass it in to us |
49 NetworkAddress addr = tcp_client->getRemoteAddress(); |
51 NetworkAddress addr = tcp_client->getRemoteAddress(); |
50 |
52 |
51 // build client |
53 // build client |
52 NetworkNode *client_node = build_node(tcp_client, udp_server, addr, NETWORK_NODE_SERVER_CLIENT); |
54 NetworkNode *client_node = build_node(tcp_client, udp_srv, addr, NETWORK_NODE_SERVER_CLIENT); |
53 |
55 |
54 // add to nodes |
56 // add to nodes |
55 nodes[addr] = client_node; |
57 nodes[addr] = client_node; |
56 |
58 |
57 // fire signals |
59 // fire signals |
58 _sig_node_connected(node); |
60 _sig_node_connected(client_node); |
59 } |
61 } |
60 |
62 |
61 void NetworkSession::handle_disconnect (NetworkNode *node) { |
63 void NetworkSession::handle_disconnect (NetworkNode *node) { |
62 // remove from nodes |
64 // remove from nodes |
63 nodes.erase(node->getRemoteAddress()); |
65 nodes.erase(node->getRemoteAddress()); |
64 } |
66 } |
65 |
67 |
66 void NetworkSession::send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable) { |
68 void NetworkSession::send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable) { |
67 send_all_except(NULL, reliable); |
69 send_all_except(channel_id, pkt, NULL, reliable); |
68 } |
70 } |
69 |
71 |
70 void NetworkSession::send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable) { |
72 void NetworkSession::send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable) { |
71 for (std::map<NetworkAddress, NetworkNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) { |
73 for (std::map<NetworkAddress, NetworkNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) { |
72 if (it->second == node) |
74 if (it->second == node) |