src/proto2/NetworkSession.cc
branchno-netsession
changeset 33 e53f09b378f4
child 34 1ea6554d703e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto2/NetworkSession.cc	Mon Nov 10 19:57:57 2008 +0000
@@ -0,0 +1,78 @@
+
+#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);
+    }
+}