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