src/proto2/NetworkObject.cc
author saiam
Fri, 28 Nov 2008 22:26:23 +0000
changeset 128 890ac82cdcc0
parent 89 825c4613e087
permissions -rw-r--r--
Documenting more, cleaning variables. This code needs some serious
rewriting. (And we havent too many features either)
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 <cassert>
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     3
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     4
#include "NetworkObject.hh"
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     5
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
 * NetworkObject_Controller 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     8
 */
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     9
NetworkObjectController::NetworkObjectController (NetworkSession &session, NetworkChannelID channel_id) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    10
    session(session), channel_id(channel_id) {
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
    // setup signals
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    13
    slot_message = session.sig_chan_message(channel_id).connect(this, &NetworkObjectController::on_message);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    14
}
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
void NetworkObjectController::on_message (NetworkPacket &pkt, NetworkNode *node) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    17
    uint32_t obj_id = pkt.read_uint32();
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    18
    uint16_t msg_id = pkt.read_uint16();
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
    // lookup object
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    21
    NetworkObject *obj = objects[obj_id];
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    22
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    23
    if (obj) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    24
        obj->handle_packet(node, msg_id, pkt);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    25
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    26
    } else {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    27
        handle_create(obj_id, msg_id, pkt, node);
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
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    30
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
 * NetworkObject_ServerController 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    33
 */
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    34
NetworkObject_ServerController::NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    35
    NetworkObjectController(session, channel_id), id_pool(0) {
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
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    38
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    39
NetworkObjectID NetworkObject_ServerController::getObjectID (void) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    40
    return ++id_pool;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    41
}
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
void NetworkObject_ServerController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    44
    (void) obj_id;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    45
    (void) msg_id;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    46
    (void) pkt;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    47
    (void) 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
    // XXX: fail
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    50
    throw CL_Error("clients cannot create objects");
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
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    53
/* 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    54
 * NetworkObject_ClientController *
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
NetworkObject_ClientController::NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    57
    NetworkObjectController(session, channel_id), server(server) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    58
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
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    62
void NetworkObject_ClientController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    63
    // we only communicate with the server
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    64
    assert(node == server);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    65
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    66
    // create new object
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    67
    NetworkObject_Client *obj = new NetworkObject_Client(*this, obj_id);
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
    // signal
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    70
   _sig_create(obj, msg_id, pkt); 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    71
}
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
/* 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    74
 * NetworkObject 
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
NetworkObject::NetworkObject (NetworkObjectController &controller, NetworkObjectID obj_id) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    77
    obj_id(obj_id) {
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
    assert(obj_id);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    80
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    81
    controller.objects[obj_id] = this;
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
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    84
void NetworkObject::buildPacket (NetworkPacket &pkt, NetworkMessageID msg_id, const NetworkPacket &payload) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    85
    pkt.write_uint32(obj_id);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    86
    pkt.write_uint16(msg_id);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    87
    pkt.write_packet(payload);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    88
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    90
std::ostream& operator<< (std::ostream &s, const NetworkObject &obj) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    91
    return s << "<NetworkObject #" << obj.obj_id << ">";
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    92
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    93
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
 * NetworkObject_Server 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    96
 */
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    97
NetworkObject_Server::NetworkObject_Server (NetworkObject_ServerController &controller) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    98
    NetworkObject(controller, controller.getObjectID()), controller(controller) {
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
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   101
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   102
void NetworkObject_Server::handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   103
    _map_sig_message[msg_id](node, pkt);
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
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   106
void NetworkObject_Server::send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   107
    NetworkPacket pkt_out;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   108
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   109
    buildPacket(pkt_out, msg_id, pkt);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   110
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   111
    dst->send(controller.channel_id, pkt_out, reliable);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   112
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   113
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   114
void NetworkObject_Server::send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   115
    send_all_except(msg_id, pkt, NULL, reliable);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   116
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   117
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   118
void NetworkObject_Server::send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   119
    NetworkPacket pkt_out;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   120
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   121
    buildPacket(pkt_out, msg_id, pkt);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   122
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   123
    controller.session.send_all_except(controller.channel_id, pkt_out, black_sheep, reliable);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   124
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   125
 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   126
/* 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   127
 * NetworkObject_Client 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   128
 */
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   129
NetworkObject_Client::NetworkObject_Client (NetworkObject_ClientController &controller, NetworkObjectID id) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   130
    NetworkObject(controller, id), controller(controller) { 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   131
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   132
    // nothing
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   133
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   134
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   135
void NetworkObject_Client::handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   136
    assert(node == controller.server);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   137
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   138
    _map_sig_message[msg_id](pkt);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   139
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   140
       
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   141
void NetworkObject_Client::send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   142
    NetworkPacket pkt_out;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   143
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   144
    buildPacket(pkt_out, msg_id, pkt);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   145
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   146
    controller.server->send(controller.channel_id, pkt_out, reliable);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   147
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
   148