diff -r 7431cd0cf900 -r 825c4613e087 src/proto2/NetworkObject.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/proto2/NetworkObject.cc Thu Nov 20 23:51:46 2008 +0000 @@ -0,0 +1,148 @@ + +#include + +#include "NetworkObject.hh" + +/* + * NetworkObject_Controller + */ +NetworkObjectController::NetworkObjectController (NetworkSession &session, NetworkChannelID channel_id) : + session(session), channel_id(channel_id) { + + // setup signals + slot_message = session.sig_chan_message(channel_id).connect(this, &NetworkObjectController::on_message); +} + +void NetworkObjectController::on_message (NetworkPacket &pkt, NetworkNode *node) { + uint32_t obj_id = pkt.read_uint32(); + uint16_t msg_id = pkt.read_uint16(); + + // lookup object + NetworkObject *obj = objects[obj_id]; + + if (obj) { + obj->handle_packet(node, msg_id, pkt); + + } else { + handle_create(obj_id, msg_id, pkt, node); + } +} + +/* + * NetworkObject_ServerController + */ +NetworkObject_ServerController::NetworkObject_ServerController (NetworkSession &session, NetworkChannelID channel_id) : + NetworkObjectController(session, channel_id), id_pool(0) { + +} + +NetworkObjectID NetworkObject_ServerController::getObjectID (void) { + return ++id_pool; +} + +void NetworkObject_ServerController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) { + (void) obj_id; + (void) msg_id; + (void) pkt; + (void) node; + + // XXX: fail + throw CL_Error("clients cannot create objects"); +} + +/* + * NetworkObject_ClientController * + */ +NetworkObject_ClientController::NetworkObject_ClientController (NetworkSession &session, NetworkChannelID channel_id, NetworkNode *server) : + NetworkObjectController(session, channel_id), server(server) { + + +} + +void NetworkObject_ClientController::handle_create (NetworkObjectID obj_id, NetworkMessageID msg_id, NetworkPacket &pkt, NetworkNode *node) { + // we only communicate with the server + assert(node == server); + + // create new object + NetworkObject_Client *obj = new NetworkObject_Client(*this, obj_id); + + // signal + _sig_create(obj, msg_id, pkt); +} + +/* + * NetworkObject + */ +NetworkObject::NetworkObject (NetworkObjectController &controller, NetworkObjectID obj_id) : + obj_id(obj_id) { + + assert(obj_id); + + controller.objects[obj_id] = this; +} + +void NetworkObject::buildPacket (NetworkPacket &pkt, NetworkMessageID msg_id, const NetworkPacket &payload) { + pkt.write_uint32(obj_id); + pkt.write_uint16(msg_id); + pkt.write_packet(payload); +} + +std::ostream& operator<< (std::ostream &s, const NetworkObject &obj) { + return s << ""; +} + +/* + * NetworkObject_Server + */ +NetworkObject_Server::NetworkObject_Server (NetworkObject_ServerController &controller) : + NetworkObject(controller, controller.getObjectID()), controller(controller) { + +} + +void NetworkObject_Server::handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) { + _map_sig_message[msg_id](node, pkt); +} + +void NetworkObject_Server::send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { + NetworkPacket pkt_out; + + buildPacket(pkt_out, msg_id, pkt); + + dst->send(controller.channel_id, pkt_out, reliable); +} + +void NetworkObject_Server::send_all (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { + send_all_except(msg_id, pkt, NULL, reliable); +} + +void NetworkObject_Server::send_all_except (NetworkMessageID msg_id, const NetworkPacket &pkt, NetworkNode *black_sheep, bool reliable) { + NetworkPacket pkt_out; + + buildPacket(pkt_out, msg_id, pkt); + + controller.session.send_all_except(controller.channel_id, pkt_out, black_sheep, reliable); +} + +/* + * NetworkObject_Client + */ +NetworkObject_Client::NetworkObject_Client (NetworkObject_ClientController &controller, NetworkObjectID id) : + NetworkObject(controller, id), controller(controller) { + + // nothing +} + +void NetworkObject_Client::handle_packet (NetworkNode *node, NetworkMessageID msg_id, NetworkPacket &pkt) { + assert(node == controller.server); + + _map_sig_message[msg_id](pkt); +} + +void NetworkObject_Client::send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) { + NetworkPacket pkt_out; + + buildPacket(pkt_out, msg_id, pkt); + + controller.server->send(controller.channel_id, pkt_out, reliable); +} +