fixed more network code, there's actually a high probability of it working now
authorterom
Sat, 08 Nov 2008 21:25:56 +0000
changeset 23 8d802b573cf0
parent 22 b70d30e1b0fe
child 24 b81cb670e6b2
fixed more network code, there's actually a high probability of it working now
src/proto2/Dimension.cc
src/proto2/Dimension.hh
src/proto2/Engine.cc
src/proto2/Engine.hh
src/proto2/Logger.cc
src/proto2/Logger.hh
src/proto2/NetworkClient.cc
src/proto2/NetworkClient.hh
src/proto2/NetworkServer.cc
src/proto2/NetworkServer.hh
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto2/Dimension.cc	Sat Nov 08 21:25:56 2008 +0000
@@ -0,0 +1,14 @@
+#include "Dimension.hh"
+
+std::ostream& operator<< (std::ostream &s, const Coordinate &c) {
+	s << "(" << c.x << ", " << c.y << ")";
+
+	return s;
+}
+
+std::ostream& operator<< (std::ostream &s, const PositionDelta &c) {
+	s << "(" << c.dx << ", " << c.dy << ")";
+
+	return s;
+}
+
--- a/src/proto2/Dimension.hh	Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/Dimension.hh	Sat Nov 08 21:25:56 2008 +0000
@@ -1,6 +1,7 @@
 #ifndef DIMENSION_HH
 #define DIMENSION_HH
 
+#include <iostream>
 
 class Dimension {
 	public:
@@ -43,4 +44,7 @@
 		}
 };
 
+std::ostream& operator<< (std::ostream &s, const Coordinate &c);
+std::ostream& operator<< (std::ostream &s, const PositionDelta &c);
+
 #endif
--- a/src/proto2/Engine.cc	Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/Engine.cc	Sat Nov 08 21:25:56 2008 +0000
@@ -69,7 +69,7 @@
 	}
 }
 
-void Engine::log (const std::string &level, const std::string &type, const std::string &message) {
-	std::cout << level << " [" << type << "] " << message << std::endl;
+Logger Engine::log (enum LogLevel level, const char *type) {
+	return Logger(level <= WARN ? std::cerr : std::cout, level, type);
 }
 
--- a/src/proto2/Engine.hh	Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/Engine.hh	Sat Nov 08 21:25:56 2008 +0000
@@ -2,6 +2,8 @@
 #include "NetworkServer.hh"
 #include "NetworkClient.hh"
 
+#include "Logger.hh"
+
 class Engine {
 	private:
 		// game state
@@ -21,9 +23,10 @@
 		static void runNetworkServer (const std::string &listen_port);
 		static void runNetworkClient (const std::string &connect_host, const std::string &connect_port);
 		
-		static void log (const std::string &level, const std::string &type, const std::string &message);
+		static Logger log (enum LogLevel level, const char *type);
 
 	private:
 		void main_loop (void);
 
 };
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto2/Logger.cc	Sat Nov 08 21:25:56 2008 +0000
@@ -0,0 +1,40 @@
+
+#include "Logger.hh"
+
+Logger::Logger (std::ostream &stream, enum LogLevel level, const char *module) : stream(stream), level(level), module(module) {
+	const char *l;
+
+	switch (level) {
+		case FATAL: l = "FATAL"; break;
+		case ERROR: l = "ERROR"; break;
+		case WARN: l = "WARN"; break;
+		case INFO: l = "INFO"; break;
+		case DEBUG: l = "DEBUG"; break;
+		default: l = "???"; break;
+	};
+
+	stream << l << " [" << module << "] ";
+}
+
+Logger::~Logger (void) {
+	stream << std::endl;
+}
+
+std::ostream& operator<< (std::ostream &s, CL_NetComputer &c) {
+	s << "[" << c.get_address().get_address() << ":" << c.get_address().get_port() << "]";
+
+	return s;
+}
+
+std::ostream& operator<< (std::ostream &s, CL_NetObject_Server &obj) {
+	s << "%" << obj.get_obj_id();
+
+	return s;
+}
+
+std::ostream& operator<< (std::ostream &s, CL_NetObject_Client &obj) {
+	s << "%" << obj.get_obj_id();
+
+	return s;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proto2/Logger.hh	Sat Nov 08 21:25:56 2008 +0000
@@ -0,0 +1,39 @@
+#ifndef LOGGER_HH
+#define LOGGER_HH
+
+#include <ClanLib/network.h>
+
+#include <iostream>
+
+enum LogLevel {
+	FATAL,
+	ERROR,
+	WARN,
+	INFO,
+	DEBUG,
+};
+
+class Logger {
+	private:
+		std::ostream &stream;
+		enum LogLevel level;
+		const char *module;
+
+	public:
+		Logger (std::ostream &stream, enum LogLevel level, const char *module);
+
+		template <typename T> Logger& operator<< (T &val) {
+			stream << val;
+
+			return *this;
+		}
+
+
+		~Logger (void);
+};
+
+std::ostream& operator<< (std::ostream &s, CL_NetComputer &c);
+std::ostream& operator<< (std::ostream &s, CL_NetObject_Server &obj);
+std::ostream& operator<< (std::ostream &s, CL_NetObject_Client &obj);
+
+#endif /* LOGGER_HH */
--- a/src/proto2/NetworkClient.cc	Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/NetworkClient.cc	Sat Nov 08 21:25:56 2008 +0000
@@ -1,8 +1,7 @@
 
 #include "NetworkClient.hh"
-
-// XXX: replace logging
-#include <iostream>
+#include "Engine.hh"
+#include "Logger.hh"
 
 NetworkClient::NetworkClient (GameState &state, const CL_IPAddress &connect_to) : 
 	NetworkCore(state), server(netsession.connect(connect_to)) {
@@ -16,28 +15,22 @@
 void NetworkClient::on_create_object (CL_NetObject_Client &obj, int msg_type, CL_NetPacket &pkt) {
 	switch (msg_type) {
 		case NETMSG_SERVER_HELLO:
-			std::cout << "INFO [client.on_create_object] NETMSG_SERVER_HELLO" << std::endl;
-
 			on_server_hello(obj, pkt);
 
 			break;
 		
 		case NETMSG_PLAYER_INFO:
-			std::cout << "INFO [client.on_create_object] NETMSG_PLAYER_INFO" << std::endl;
-
 			on_player_info(obj, pkt);
 
 			break;
 		
 		case NETMSG_PLAYER_JOIN:
-			std::cout << "INFO [client.on_create_object] NETMSG_PLAYER_JOIN" << std::endl;
-
 			on_player_join(obj, pkt);
 
 			break;
 
 		default:
-			std::cerr << "WARN [client.on_create_object] unknown msg_type=" << msg_type << std::endl; 
+			Engine::log(WARN, "client.on_create_object") << "unknown msg_type=" << msg_type << " for obj=" << obj;
 	}
 }
 		
@@ -45,8 +38,10 @@
 	// read the packet
 	uint32_t x = pkt.input.read_uint32();
 	uint32_t y = pkt.input.read_uint32();
+
+	Coordinate initial_position(x, y);
 	
-	Coordinate initial_position(x, y);
+	Engine::log(INFO, "client.on_server_hello") << "obj=" << obj << ", pos=" << initial_position;
 
 	// create the LocalPlayer object
 	NetworkClientLocalPlayer *player = new NetworkClientLocalPlayer(*this, obj, initial_position);
@@ -59,8 +54,10 @@
 	// read the packet
 	uint32_t x = pkt.input.read_uint32();
 	uint32_t y = pkt.input.read_uint32();
-
+	
 	Coordinate initial_position(x, y);
+	
+	Engine::log(INFO, "client.on_player_info") << "obj=" << obj << ", pos=" << initial_position;
 
 	// create the LocalPlayer object
 	NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, initial_position);
@@ -77,6 +74,8 @@
 	
 	Coordinate initial_position(x, y);
 	
+	Engine::log(INFO, "client.on_player_join") << "obj=" << obj << ", pos=" << initial_position;
+	
 	// create the RemotePlayer object
 	NetworkClientRemotePlayer *player = new NetworkClientRemotePlayer(*this, obj, initial_position);
 
@@ -89,7 +88,8 @@
 	state.removePlayer(player);
 
 	// delete
-	delete player;
+	// XXX: leak because deleting the slot while it's being called breaks ClanLib
+	//	delete player;
 }
 
 NetworkClientLocalPlayer::NetworkClientLocalPlayer (NetworkClient &client, CL_NetObject_Client &obj, Coordinate initial_position) :
@@ -97,7 +97,6 @@
 	
 	// receive messages
 	slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientLocalPlayer::on_position);
-
 }
 		
 void NetworkClientLocalPlayer::move (PositionDelta d) {
@@ -111,8 +110,12 @@
 void NetworkClientLocalPlayer::on_position (CL_NetPacket &pkt) {
 	uint32_t x = pkt.input.read_uint32();
 	uint32_t y = pkt.input.read_uint32();
+
+	Coordinate pos (x, y);
+
+	Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", pos=" << pos;
 	
-	updatePosition(Coordinate(x, y));
+	updatePosition(pos);
 }
 		
 NetworkClientRemotePlayer::NetworkClientRemotePlayer (NetworkClient &client, CL_NetObject_Client &obj, Coordinate initial_position) :
@@ -120,18 +123,25 @@
 	
 	// receive messages
 	slots.connect(obj.sig_received_message(NETMSG_PLAYER_POSITION), this, &NetworkClientRemotePlayer::on_position);
+	slots.connect(obj.sig_received_message(NETMSG_PLAYER_QUIT), this, &NetworkClientRemotePlayer::on_quit);
 }
 
 void NetworkClientRemotePlayer::on_position (CL_NetPacket &pkt) {
 	uint32_t x = pkt.input.read_uint32();
 	uint32_t y = pkt.input.read_uint32();
 	
-	updatePosition(Coordinate(x, y));
+	Coordinate pos (x, y);
+
+	Engine::log(INFO, "client_player.on_position") << "obj=" << obj << ", pos=" << pos;
+	
+	updatePosition(pos);
 }
 
 void NetworkClientRemotePlayer::on_quit (CL_NetPacket &pkt) {
 	// pkt is empty
 	(void) pkt;
 
+	Engine::log(INFO, "client_player.on_quit") << "obj=" << obj;
+
 	client.player_quit(this);
 }
--- a/src/proto2/NetworkClient.hh	Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/NetworkClient.hh	Sat Nov 08 21:25:56 2008 +0000
@@ -31,7 +31,7 @@
 
 		CL_SlotContainer slots;
 
-		CL_NetObject_Client &obj;
+		CL_NetObject_Client obj;
 
 	public:
 		NetworkClientLocalPlayer (NetworkClient &client, CL_NetObject_Client &obj, Coordinate initial_position);
@@ -48,7 +48,7 @@
 		
 		CL_SlotContainer slots;
 
-		CL_NetObject_Client &obj;
+		CL_NetObject_Client obj;
 
 	public:
 		NetworkClientRemotePlayer (NetworkClient &client, CL_NetObject_Client &obj, Coordinate initial_position);
--- a/src/proto2/NetworkServer.cc	Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/NetworkServer.cc	Sat Nov 08 21:25:56 2008 +0000
@@ -1,7 +1,7 @@
 #include "NetworkServer.hh"
 #include "Engine.hh"
+#include "Logger.hh"
 
-#include <iostream>
 #include <cassert>
 
 NetworkServer::NetworkServer (GameState &state, const std::string &listen_port) : 
@@ -13,16 +13,15 @@
 	
 	// and then we listen
 	netsession.start_listen(listen_port);
+
+	Engine::log(INFO, "server") << "running, listen_port=" << listen_port;
 }
 
 void NetworkServer::on_connect (CL_NetComputer &computer) {
 	// assign a pid
 	uint16_t pid = ++pid_pool;
 	
-	// log
-	std::cout << "[server.on_connect] INFO: " << computer.get_address().get_address() << " -> #" << pid << std::endl;
-
-	// create the player object
+	// create the player object (it logs it)
 	NetworkServerPlayer *player = new NetworkServerPlayer(*this, computer, pid);
 	
 	// map computer to it
@@ -33,9 +32,6 @@
 }
 
 void NetworkServer::on_disconnect (CL_NetComputer &computer) {
-	std::cout << "NetworkServer.on_disconnect: " << computer.get_address().get_address() << std::endl;
-
-	// XXX: remove the player
 	NetworkServerPlayer *player = players[computer];
 	
 	// remove from players
@@ -52,17 +48,20 @@
 }
 		
 NetworkServerPlayer::NetworkServerPlayer (NetworkServer &server, CL_NetComputer &computer, uint16_t pid) : 
-	RemotePlayer(Coordinate(0, 0), true), server(server), computer(computer), netobj(&server.netobjs), pid(pid) {
+	RemotePlayer(Coordinate(0, 0), true), server(server), computer(computer), obj(&server.netobjs), pid(pid) {
 	
+	// log
+	Engine::log(INFO, "server_player.connected") << "computer=" << computer << ", obj=" << obj;
+
 	// messages
-	slots.connect(netobj.sig_received_message(NETMSG_CLIENT_MOVE), this, &NetworkServerPlayer::on_move);	
+	slots.connect(obj.sig_received_message(NETMSG_CLIENT_MOVE), this, &NetworkServerPlayer::on_move);	
 
 	// the initial NETMSG_PLAYER_HELLO
 	CL_NetPacket hello_pkt;
 	hello_pkt.output.write_uint32(position.x);
 	hello_pkt.output.write_uint32(position.y);
 
-	netobj.send(computer, NETMSG_SERVER_HELLO, hello_pkt, true);
+	obj.send(computer, NETMSG_SERVER_HELLO, hello_pkt, true);
 
 	// send other player objects
 	for (std::map<CL_NetComputer, NetworkServerPlayer*>::iterator it = server.players.begin(); it != server.players.end(); it++) {
@@ -75,18 +74,20 @@
 		player_pkt.output.write_uint32(player->position.x);
 		player_pkt.output.write_uint32(player->position.y);
 
-		player->netobj.send(computer, NETMSG_PLAYER_INFO, player_pkt, true);
+		player->obj.send(computer, NETMSG_PLAYER_INFO, player_pkt, true);
 	}
 
 
 	// broadcast NETMSG_PLAYER_JOIN to all clients
-	netobj.send(server.netsession.get_all(), NETMSG_PLAYER_JOIN, hello_pkt, true);
+	obj.send(server.netsession.get_all(), NETMSG_PLAYER_JOIN, hello_pkt, true);
 }
 
 void NetworkServerPlayer::disconnected (void) {
 	CL_NetPacket pkt;
+	
+	Engine::log(INFO, "server_player.disconnected") << "computer=" << computer << ", obj=" << obj;
 
-	netobj.send(server.netsession.get_all(), NETMSG_PLAYER_QUIT, pkt, true);
+	obj.send(server.netsession.get_all(), NETMSG_PLAYER_QUIT, pkt, true);
 }
 
 void NetworkServerPlayer::on_move (CL_NetComputer &from, CL_NetPacket &pkt) {
@@ -101,6 +102,8 @@
 	// movement delta
 	PositionDelta delta(dx, dy);
 
+	Engine::log(INFO, "server_player.on_move") << "obj=" << obj << ", old_pos=" << position << ", delta=" << delta;
+
 	// apply movement
 	position += delta;
 
@@ -113,6 +116,8 @@
 	pkt.output.write_uint32(position.x);
 	pkt.output.write_uint32(position.y);
 
-	netobj.send(server.netsession.get_all(), NETMSG_PLAYER_POSITION, pkt, false);
+	Engine::log(INFO, "server_player.send_position_update") << "obj=" << obj << " -> " << position;
+
+	obj.send(server.netsession.get_all(), NETMSG_PLAYER_POSITION, pkt, false);
 }
 
--- a/src/proto2/NetworkServer.hh	Sat Nov 08 20:34:14 2008 +0000
+++ b/src/proto2/NetworkServer.hh	Sat Nov 08 21:25:56 2008 +0000
@@ -34,7 +34,7 @@
 	private:
 		NetworkServer &server;
 		CL_NetComputer &computer;
-		CL_NetObject_Server netobj;
+		CL_NetObject_Server obj;
 
 		CL_SlotContainer slots;