src/proto2/NetworkObject.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--
...
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     1
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     2
#include "NetworkObject.hh"
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     3
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     4
NetworkObjectController::NetworkObjectController (NetworkSession &session, NetworkChannelID channel_id) :
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     5
    session(session), channel_id(channel_id), id_pool(0) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     6
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     7
    // setup signals
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     8
    slot_message = session.sig_chan_message(channel_id).connect(this, &NetworkObjectController::on_message);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     9
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    10
36
terom
parents: 34
diff changeset
    11
void NetworkObjectController::on_message (NetworkPacket &pkt, NetworkNode *node) {
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    12
    uint32_t obj_id = pkt.read_uint32();
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    13
    uint16_t msg_id = pkt.read_uint16();
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    14
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    15
    // lookup object
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    16
    NetworkObject *obj = objects[obj_id];
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    17
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    18
    if (obj) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    19
        obj->_map_sig_message[msg_id](node, pkt);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    20
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    21
    } else {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    22
        handle_create(obj_id, msg_id, pkt, node);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    23
    }
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    24
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    25
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    26
NetworkObject_ServerController::NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id) :
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    27
    NetworkObjectController(session, channel_id), id_pool(0) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    28
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    29
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    30
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    31
NetworkObjectID NetworkObject_ServerController::getObjectID (void) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    32
    return ++id_pool;
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    33
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    34
        
36
terom
parents: 34
diff changeset
    35
void NetworkObject_ServerController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) {
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    36
    // XXX: fail
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    37
    throw CL_Error("clients cannot create objects");
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    38
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    39
        
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    40
NetworkObject_ClientController::NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server) :
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    41
    NetworkObjectController(session, channel_id), server(server) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    42
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    43
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    44
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    45
        
36
terom
parents: 34
diff changeset
    46
void NetworkObject_ClientController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) {
terom
parents: 34
diff changeset
    47
    // we only communicate with the server
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    48
    assert(node == server);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    49
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    50
    // create new object
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    51
    NetworkObject_Client *obj = new NetworkObject_Client(*this, node, obj_id);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    52
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    53
    // signal
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    54
   _sig_create(obj, msg_id, pkt); 
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    55
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    56
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    57
NetworkObject::NetworkObject (NetworkObjectID obj_id) :
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    58
    obj_id(obj_id) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    59
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    60
    assert(obj_id);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    61
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    62
    controller.objects[obj_id] = this;
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    63
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    64
        
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    65
void NetworkObject::buildPacket (NetworkPacket &pkt, NetworkMessageID msg_id, const NetworkPacket &payload) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    66
    pkt.write_uint32(obj_id);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    67
    pkt.write_uint16(msg_id);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    68
    pkt.write_packet(payload);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    69
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    70
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    71
NetworkObject_Server::NetworkObject_Server (NetworkObject_ServerController &controller) :
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    72
    NetworkObject(controller.getObjectID()), controller(controller) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    73
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    74
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    75
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    76
void NetworkObject_Server::send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    77
    NetworkPacket pkt;
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    78
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    79
    buildPacket(pkt, msg_id, pkt);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    80
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    81
    dst->send(controller.channel_id, pkt, reliable);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    82
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    83
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    84
void NetworkObject_Server::send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    85
    send_all_except(msg_id, pkt, NULL, reliable);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    86
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    87
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    88
void NetworkObject_Server::send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    89
    NetworkPacket pkt;
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    90
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    91
    buildPacket(pkt, msg_id, pkt);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    92
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    93
    controller.session.send_all_except(controller.channel_id, pkt, black_sheep, reliable);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    94
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    95
        
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    96
void NetworkObject_Client::send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    97
    NetworkPacket pkt;
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    98
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    99
    buildPacket(pkt, msg_id, pkt);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   100
36
terom
parents: 34
diff changeset
   101
    controller.server->send(controller.channel_id, pkt, reliable);
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   102
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   103