--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto2/NetworkObject.cc Mon Nov 10 21:58:38 2008 +0000
@@ -0,0 +1,103 @@
+
+#include "NetworkObject.hh"
+
+NetworkObjectController::NetworkObjectController (NetworkSession &session, NetworkChannelID channel_id) :
+ session(session), channel_id(channel_id), id_pool(0) {
+
+ // setup signals
+ slot_message = session.sig_chan_message(channel_id).connect(this, &NetworkObjectController::on_message);
+}
+
+
+void NetworkObjectController::on_message (const 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->_map_sig_message[msg_id](node, pkt);
+
+ } else {
+ handle_create(obj_id, msg_id, pkt, node);
+ }
+}
+
+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, const NetworkPacket &pkt, NetworkNode *node) {
+ // XXX: fail
+ throw CL_Error("clients cannot create objects");
+}
+
+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, const NetworkPacket &pkt, NetworkNode *node) {
+ assert(node == server);
+
+ // create new object
+ NetworkObject_Client *obj = new NetworkObject_Client(*this, node, obj_id);
+
+ // signal
+ _sig_create(obj, msg_id, pkt);
+}
+
+NetworkObject::NetworkObject (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);
+}
+
+NetworkObject_Server::NetworkObject_Server (NetworkObject_ServerController &controller) :
+ NetworkObject(controller.getObjectID()), controller(controller) {
+
+}
+
+void NetworkObject_Server::send_to (NetworkNode *dst, NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
+ NetworkPacket pkt;
+
+ buildPacket(pkt, msg_id, pkt);
+
+ dst->send(controller.channel_id, pkt, 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;
+
+ buildPacket(pkt, msg_id, pkt);
+
+ controller.session.send_all_except(controller.channel_id, pkt, black_sheep, reliable);
+}
+
+void NetworkObject_Client::send (NetworkMessageID msg_id, const NetworkPacket &pkt, bool reliable) {
+ NetworkPacket pkt;
+
+ buildPacket(pkt, msg_id, pkt);
+
+ node->send(controller.channel_id, pkt, reliable);
+}
+