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