src/proto2/NetworkSession.cc
author nireco
Fri, 28 Nov 2008 13:11:51 +0000
changeset 116 0d36aade845e
parent 89 825c4613e087
permissions -rw-r--r--
some stuff, don't remember what
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     1
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     2
#include "NetworkSession.hh"
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     3
#include "Engine.hh"
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     4
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     5
#include <cassert>
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     6
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     7
NetworkSession::NetworkSession (uint64_t magic) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     8
    magic(magic), tcp_srv(NULL), udp_srv(NULL), udp_client(NULL) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     9
   
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    10
    // nothing
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    11
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    12
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    13
void NetworkSession::listen (const NetworkAddress &addr) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    14
    assert(tcp_srv == NULL && udp_srv == NULL);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    15
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    16
    // create TCP/UDP servers
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    17
    tcp_srv = new NetworkTCPServer(addr);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    18
    udp_srv = new NetworkUDP(addr);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    19
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    20
    // connect signals
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    21
    slots.connect(tcp_srv->sig_client(), this, &NetworkSession::on_tcp_client);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    22
    slots.connect(udp_srv->sig_packet(), this, &NetworkSession::on_udp_packet);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    23
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    24
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    25
NetworkNode *NetworkSession::build_node (NetworkTCPTransport *tcp, NetworkUDP *udp, const NetworkAddress &addr, enum NetworkNodeType type) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    26
    // XXX: unused
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    27
    (void) type;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    28
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    29
    // create node
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    30
    return new NetworkNode(*this, tcp, udp, addr);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    31
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    32
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    33
NetworkNode* NetworkSession::connect (const NetworkAddress &addr) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    34
    // XXX: only one connect
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    35
    assert(!udp_client);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    36
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    37
    // connect TCP
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    38
    NetworkTCPClient *tcp_client = new NetworkTCPClient(addr);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    39
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    40
    // create UDP socket on same address
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    41
    udp_client = new NetworkUDP(tcp_client->getLocalAddress());
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    42
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    43
    // build client
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    44
    NetworkNode *client_node = build_node(tcp_client, udp_client, addr, NETWORK_NODE_CLIENT_SERVER);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    45
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    46
    // add to nodes
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    47
    nodes[addr] = client_node;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    48
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    49
    // connect signals
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    50
    slots.connect(udp_client->sig_packet(), this, &NetworkSession::on_udp_packet);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    51
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    52
    // return the "server" node
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    53
    return client_node;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    54
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    55
                
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    56
void NetworkSession::handle_disconnect (NetworkNode *node) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    57
    // remove from nodes
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    58
    nodes.erase(node->getRemoteAddress());
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    59
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    60
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    61
void NetworkSession::handle_message (NetworkPacket &pkt, NetworkNode *node) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    62
    // read the channel id
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    63
    NetworkChannelID channel_id = pkt.read_uint16();
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    64
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    65
    // fire signal
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    66
    _map_sig_chan_message[channel_id](pkt, node);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    67
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    68
 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    69
void NetworkSession::on_tcp_client (NetworkTCPTransport *tcp_client) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    70
    // get remote address manually, because NetworkTCPServer doesn't pass it in to us
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    71
    NetworkAddress addr = tcp_client->getRemoteAddress();
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    72
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    73
    // build client
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    74
    NetworkNode *client_node = build_node(tcp_client, udp_srv, addr, NETWORK_NODE_SERVER_CLIENT);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    75
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    76
    // add to nodes
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    77
    nodes[addr] = client_node;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    78
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    79
    // fire signals
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    80
    _sig_node_connected(client_node);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    81
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    82
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    83
void NetworkSession::on_udp_packet (NetworkPacket &pkt, const NetworkAddress &addr) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    84
    NetworkNode *node = nodes[addr];
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    85
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    86
    // drop from unknown sources
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    87
    if (!node) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    88
        Engine::log(WARN, "net_session.on_udp_packet") << "dropping unsolicted UDP packet from " << addr;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    89
        return;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    90
    }
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    91
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    92
    // handle
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    93
    handle_message(pkt, node);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    94
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    95
       
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    96
void NetworkSession::send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    97
    send_all_except(channel_id, pkt, NULL, reliable);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    98
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    99
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   100
void NetworkSession::send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   101
    for (std::map<NetworkAddress, NetworkNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   102
        if (it->second == node)
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   103
            continue;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   104
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   105
        it->second->send(channel_id, pkt, reliable);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   106
    }
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   107
}