src/proto2/NetworkSession.cc
author terom
Mon, 10 Nov 2008 21:58:38 +0000
branchno-netsession
changeset 34 1ea6554d703e
parent 33 e53f09b378f4
child 36 785d220fc6b7
permissions -rw-r--r--
add even more uncompiled code

#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_disconnect(), 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_disconnect(), 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);
    }
}