src/proto2/NetworkSession.cc
branchno-netsession
changeset 37 ed2957490bbf
parent 36 785d220fc6b7
child 39 cfb8b6e2a35f
equal deleted inserted replaced
36:785d220fc6b7 37:ed2957490bbf
     1 
     1 
     2 #include "NetworkSession.hh"
     2 #include "NetworkSession.hh"
     3 
     3 
     4 NetworkSession::NetworkSession (NetworkSessionMagic magic) :
     4 #include <cassert>
       
     5 
       
     6 NetworkSession::NetworkSession (uint64_t magic) :
     5     magic(magic), tcp_srv(NULL), udp_srv(NULL), udp_client(NULL) {
     7     magic(magic), tcp_srv(NULL), udp_srv(NULL), udp_client(NULL) {
     6    
     8    
     7     // nothing
     9     // nothing
     8 }
    10 }
     9         
    11         
    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)