src/proto2/NetworkObject.cc
author terom
Thu, 20 Nov 2008 22:10:28 +0000
branchno-netsession
changeset 38 4189b8bf3a5b
parent 37 ed2957490bbf
permissions -rw-r--r--
kind of works
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
     1
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
     2
#include <cassert>
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     3
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     4
#include "NetworkObject.hh"
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     5
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
     6
/* 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
     7
 * NetworkObject_Controller 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
     8
 */
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
     9
NetworkObjectController::NetworkObjectController (NetworkSession &session, NetworkChannelID channel_id) :
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    10
    session(session), channel_id(channel_id) {
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    11
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    12
    // setup signals
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    13
    slot_message = session.sig_chan_message(channel_id).connect(this, &NetworkObjectController::on_message);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    14
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    15
36
terom
parents: 34
diff changeset
    16
void NetworkObjectController::on_message (NetworkPacket &pkt, NetworkNode *node) {
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    17
    uint32_t obj_id = pkt.read_uint32();
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    18
    uint16_t msg_id = pkt.read_uint16();
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    19
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    20
    // lookup object
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    21
    NetworkObject *obj = objects[obj_id];
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    22
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    23
    if (obj) {
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    24
        obj->handle_packet(node, msg_id, pkt);
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    25
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    26
    } else {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    27
        handle_create(obj_id, msg_id, pkt, node);
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
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    31
/* 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    32
 * NetworkObject_ServerController 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    33
 */
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    34
NetworkObject_ServerController::NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id) :
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    35
    NetworkObjectController(session, channel_id), id_pool(0) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    36
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    37
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    38
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    39
NetworkObjectID NetworkObject_ServerController::getObjectID (void) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    40
    return ++id_pool;
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    41
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    42
        
36
terom
parents: 34
diff changeset
    43
void NetworkObject_ServerController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) {
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    44
    (void) obj_id;
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    45
    (void) msg_id;
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    46
    (void) pkt;
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    47
    (void) node;
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    48
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    49
    // XXX: fail
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    50
    throw CL_Error("clients cannot create objects");
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    51
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    52
        
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    53
/* 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    54
 * NetworkObject_ClientController *
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    55
 */
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    56
NetworkObject_ClientController::NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server) :
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    57
    NetworkObjectController(session, channel_id), server(server) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    58
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    59
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    60
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    61
        
36
terom
parents: 34
diff changeset
    62
void NetworkObject_ClientController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) {
terom
parents: 34
diff changeset
    63
    // we only communicate with the server
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    64
    assert(node == server);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    65
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    66
    // create new object
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    67
    NetworkObject_Client *obj = new NetworkObject_Client(*this, obj_id);
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    68
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    69
    // signal
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    70
   _sig_create(obj, msg_id, pkt); 
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    71
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    72
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    73
/* 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    74
 * NetworkObject 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    75
 */
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    76
NetworkObject::NetworkObject (NetworkObjectController &controller, NetworkObjectID obj_id) :
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    77
    obj_id(obj_id) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    78
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    79
    assert(obj_id);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    80
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    81
    controller.objects[obj_id] = this;
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::buildPacket (NetworkPacket &pkt, NetworkMessageID msg_id, const NetworkPacket &payload) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    85
    pkt.write_uint32(obj_id);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    86
    pkt.write_uint16(msg_id);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    87
    pkt.write_packet(payload);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    88
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    89
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    90
std::ostream& operator<< (std::ostream &s, const NetworkObject &obj) {
38
4189b8bf3a5b kind of works
terom
parents: 37
diff changeset
    91
    return s << "<NetworkObject #" << obj.obj_id << ">";
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    92
}
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    93
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    94
/* 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    95
 * NetworkObject_Server 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    96
 */
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    97
NetworkObject_Server::NetworkObject_Server (NetworkObject_ServerController &controller) :
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
    98
    NetworkObject(controller, controller.getObjectID()), controller(controller) {
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
    99
    
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   100
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   101
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   102
void NetworkObject_Server::handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) {
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   103
    _map_sig_message[msg_id](node, pkt);
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   104
}
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   105
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   106
void NetworkObject_Server::send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   107
    NetworkPacket pkt_out;
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   108
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   109
    buildPacket(pkt_out, msg_id, pkt);
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   110
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   111
    dst->send(controller.channel_id, pkt_out, reliable);
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   112
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   113
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   114
void NetworkObject_Server::send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   115
    send_all_except(msg_id, pkt, NULL, reliable);
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   116
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   117
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   118
void NetworkObject_Server::send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable) {
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   119
    NetworkPacket pkt_out;
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   120
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   121
    buildPacket(pkt_out, msg_id, pkt);
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   122
    
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   123
    controller.session.send_all_except(controller.channel_id, pkt_out, black_sheep, reliable);
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   124
}
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   125
 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   126
/* 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   127
 * NetworkObject_Client 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   128
 */
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   129
NetworkObject_Client::NetworkObject_Client (NetworkObject_ClientController &controller, NetworkObjectID id) :
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   130
    NetworkObject(controller, id), controller(controller) { 
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   131
    
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   132
    // nothing
34
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   133
}
1ea6554d703e add even more uncompiled code
terom
parents:
diff changeset
   134
37
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   135
void NetworkObject_Client::handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) {
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   136
    assert(node == controller.server);
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   137
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   138
    _map_sig_message[msg_id](pkt);
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   139
}
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   140
       
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   141
void NetworkObject_Client::send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   142
    NetworkPacket pkt_out;
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   143
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   144
    buildPacket(pkt_out, msg_id, pkt);
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   145
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   146
    controller.server->send(controller.channel_id, pkt_out, reliable);
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   147
}
ed2957490bbf compile step complete
terom
parents: 36
diff changeset
   148