src/proto2/NetworkSession.cc
branchno-netsession
changeset 33 e53f09b378f4
child 34 1ea6554d703e
equal deleted inserted replaced
32:2ff929186c90 33:e53f09b378f4
       
     1 
       
     2 #include "NetworkSession.hh"
       
     3 
       
     4 NetworkSession::NetworkSession (NetworkSessionMagic magic) :
       
     5     magic(magic), tcp_srv(NULL), udp_srv(NULL), udp_client(NULL) {
       
     6    
       
     7     // nothing
       
     8 }
       
     9         
       
    10 void NetworkSession::listen (const NetworkAddress &addr) {
       
    11     assert(tcp_srv == NULL && udp_srv == NULL);
       
    12     
       
    13     // create TCP/UDP servers
       
    14     tcp_srv = new NetworkTCPServer(addr);
       
    15     udp_srv = new NetworkUDP(addr);
       
    16     
       
    17     // connect signals
       
    18     slots.connect(tcp->sig_client, this, &NetworkSession::on_tcp_client);
       
    19 }
       
    20         
       
    21 NetworkNode* NetworkSession::connect (const NetworkAddress &addr) {
       
    22     // create new UDP client if needed
       
    23     if (udp_client == NULL)
       
    24         udp_client = new NetworkUDP();
       
    25 
       
    26     // connect
       
    27     NetworkTCPClient *tcp_client = new NetworkTCPClient(addr);
       
    28 
       
    29     // create node
       
    30     NetworkNode *client_node = new NetworkNode(*this, tcp_client, udp_client, addr);
       
    31 
       
    32     // add to nodes
       
    33     nodes[addr] = client_node;
       
    34 
       
    35     // bind signals
       
    36     slots.connect(tcp_client->sig_disconnected, this, &NetworkSession::on_disconnect, client_node);
       
    37 }
       
    38         
       
    39 void NetworkSession::on_tcp_client (const NetworkTCPTransport *tcp_client) {
       
    40     // get remote address manually, because NetworkTCPServer doesn't pass it in to us
       
    41     NetworkAddress addr = tcp_client->getRemoteAddress();
       
    42 
       
    43     // create node
       
    44     NetworkNode *client_node = new NetworkNode(*this, tcp_client, udp_server, addr);
       
    45 
       
    46     // add to nodes
       
    47     nodes[addr] = client_node;
       
    48 
       
    49     // bind signals
       
    50     slots.connect(tcp_client->sig_disconnected, this, &NetworkSession::on_disconnect, client_node);
       
    51 
       
    52     // fire signals
       
    53     sig_node_connected(node);
       
    54 }
       
    55         
       
    56 void NetworkSession::on_disconnect (NetworkNode *node) {
       
    57     // remove from nodes
       
    58     nodes.erase(node->getRemoteAddress());
       
    59 
       
    60     // fire signal
       
    61     sig_node_disconnected(node);
       
    62     
       
    63     // delete
       
    64     delete node;
       
    65 }
       
    66         
       
    67 void NetworkSession::send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable) {
       
    68     send_all_except(NULL, reliable);
       
    69 }
       
    70         
       
    71 void NetworkSession::send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable) {
       
    72     for (std::map<NetworkAddress, NetworkNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
       
    73         if (it->second == node)
       
    74             continue;
       
    75 
       
    76         it->second->send(channel_id, pkt, reliable);
       
    77     }
       
    78 }