about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-09-04 17:25:55 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-09-04 17:25:55 +0000
commit8d99a3d3c9c4142955bdc7ec994dce61b4eb8d15 (patch)
tree9cbd6a3d820aa3a6068b8e970ceafeaa9b4a2b71
parent171ca682d3edbe641ccc26cba7f5991206ae9041 (diff)
downloadzcatch-8d99a3d3c9c4142955bdc7ec994dce61b4eb8d15.tar.gz
zcatch-8d99a3d3c9c4142955bdc7ec994dce61b4eb8d15.zip
fixed so old request methods work aswell
-rw-r--r--src/engine/client/ec_client.c26
-rw-r--r--src/engine/client/ec_srvbrowse.c182
-rw-r--r--src/engine/e_if_client.h16
-rw-r--r--src/mastersrv/mastersrv.h3
4 files changed, 153 insertions, 74 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c
index 1d514d95..26846d73 100644
--- a/src/engine/client/ec_client.c
+++ b/src/engine/client/ec_client.c
@@ -719,7 +719,6 @@ static void client_process_packet(NETCHUNK *packet)
 			for(i = 0; i < num; i++)
 			{
 				NETADDR addr;
-				SERVER_INFO info = {0};
 				
 				/* convert address */
 				mem_zero(&addr, sizeof(addr));
@@ -729,21 +728,20 @@ static void client_process_packet(NETCHUNK *packet)
 				addr.ip[2] = addrs[i].ip[2];
 				addr.ip[3] = addrs[i].ip[3];
 				addr.port = (addrs[i].port[1]<<8) | addrs[i].port[0];
-
-				info.latency = 999;
-				str_format(info.address, sizeof(info.address), "%d.%d.%d.%d:%d",
-					addr.ip[0], addr.ip[1], addr.ip[2],
-					addr.ip[3], addr.port);
-				str_format(info.name, sizeof(info.name), "\255%d.%d.%d.%d:%d", /* the \255 is to make sure that it's sorted last */
-					addr.ip[0], addr.ip[1], addr.ip[2],
-					addr.ip[3], addr.port);
 				
-				client_serverbrowse_set(&addr, 1, -1, &info);
+				client_serverbrowse_set(&addr, BROWSESET_MASTER_ADD, -1, NULL);
 			}
 		}
 
 		{
+			int packet_type = 0;
 			if(packet->data_size >= (int)sizeof(SERVERBROWSE_INFO) && memcmp(packet->data, SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO)) == 0)
+				packet_type = 2;
+
+			if(packet->data_size >= (int)sizeof(SERVERBROWSE_OLD_INFO) && memcmp(packet->data, SERVERBROWSE_OLD_INFO, sizeof(SERVERBROWSE_OLD_INFO)) == 0)
+				packet_type = 1;
+			
+			if(packet_type)
 			{
 				/* we got ze info */
 				UNPACKER up;
@@ -752,7 +750,8 @@ static void client_process_packet(NETCHUNK *packet)
 				int token = -1;
 				
 				unpacker_reset(&up, (unsigned char*)packet->data+sizeof(SERVERBROWSE_INFO), packet->data_size-sizeof(SERVERBROWSE_INFO));
-				token = atol(unpacker_get_string(&up));
+				if(packet_type >= 2)
+					token = atol(unpacker_get_string(&up));
 				str_copy(info.version, unpacker_get_string(&up), sizeof(info.version));
 				str_copy(info.name, unpacker_get_string(&up), sizeof(info.name));
 				str_copy(info.map, unpacker_get_string(&up), sizeof(info.map));
@@ -775,7 +774,10 @@ static void client_process_packet(NETCHUNK *packet)
 				{
 					/* sort players */
 					qsort(info.players, info.num_players, sizeof(*info.players), player_score_comp);
-					client_serverbrowse_set(&packet->address, 0, token, &info);
+					if(packet_type == 2)
+						client_serverbrowse_set(&packet->address, BROWSESET_TOKEN, token, &info);
+					else
+						client_serverbrowse_set(&packet->address, BROWSESET_OLD_INTERNET, -1, &info);
 				}
 			}
 		}
diff --git a/src/engine/client/ec_srvbrowse.c b/src/engine/client/ec_srvbrowse.c
index ccf0ea87..98f60643 100644
--- a/src/engine/client/ec_srvbrowse.c
+++ b/src/engine/client/ec_srvbrowse.c
@@ -61,10 +61,10 @@ static char filtergametypestring[128] = {0};
 /* the token is to keep server refresh separated from each other */
 static int current_token = 1;
 
-static int serverlist_lan = 1;
+static int serverlist_type = 0;
 static int64 broadcast_time = 0;
 
-int client_serverbrowse_lan() { return serverlist_lan; }
+int client_serverbrowse_lan() { return serverlist_type == BROWSETYPE_LAN; }
 int client_serverbrowse_num() { return num_servers; }
 
 SERVER_INFO *client_serverbrowse_get(int index)
@@ -290,49 +290,60 @@ static SERVERENTRY *client_serverbrowse_find(NETADDR *addr)
 	return (SERVERENTRY*)0;
 }
 
-void client_serverbrowse_set(NETADDR *addr, int request, int token, SERVER_INFO *info)
+void client_serverbrowse_queuerequest(SERVERENTRY *entry)
 {
-	int hash = addr->ip[0];
-	SERVERENTRY *entry = 0;
-	int i;
-	
-	if(token != -1 && token != current_token)
-		return;
+	/* add it to the list of servers that we should request info from */
+	entry->prev_req = last_req_server;
+	if(last_req_server)
+		last_req_server->next_req = entry;
+	else
+		first_req_server = entry;
+	last_req_server = entry;
 	
-	entry = client_serverbrowse_find(addr);
-	if(entry)
+	num_requests++;
+}
+
+void client_serverbrowse_setinfo(SERVERENTRY *entry, SERVER_INFO *info)
+{
+	int fav = entry->info.favorite;
+	entry->info = *info;
+	entry->info.favorite = fav;
+	entry->info.netaddr = entry->addr;
+
+	/*if(!request)
 	{
-		/* update the server that we already have */
-		if(!serverlist_lan)
-		{
-			int fav = entry->info.favorite;
-			entry->info = *info;
-			entry->info.netaddr = *addr;
-			entry->info.favorite = fav;
+		entry->info.latency = (time_get()-entry->request_time)*1000/time_freq();
+		client_serverbrowse_remove_request(entry);
+	}*/
+	
+	entry->got_info = 1;
+	client_serverbrowse_sort();	
+}
 
-			if(!request)
-			{
-				entry->info.latency = (time_get()-entry->request_time)*1000/time_freq();
-				client_serverbrowse_remove_request(entry);
-			}
-			
-			entry->got_info = 1;
-			client_serverbrowse_sort();
-		}
-		return;
-	}
+SERVERENTRY *client_serverbrowse_add(NETADDR *addr)
+{
+	int hash = addr->ip[0];
+	SERVERENTRY *entry = 0;
+	int i;
 
-	/* create new entry */	
+	/* create new entry */
 	entry = (SERVERENTRY *)memheap_allocate(serverlist_heap, sizeof(SERVERENTRY));
 	mem_zero(entry, sizeof(SERVERENTRY));
 	
 	/* set the info */
 	entry->addr = *addr;
-	entry->info = *info;
 	entry->info.netaddr = *addr;
 	
-	if(serverlist_lan)
-		entry->info.latency = (time_get()-broadcast_time)*1000/time_freq();
+	entry->info.latency = 999;
+	str_format(entry->info.address, sizeof(entry->info.address), "%d.%d.%d.%d:%d",
+		addr->ip[0], addr->ip[1], addr->ip[2],
+		addr->ip[3], addr->port);
+	str_format(entry->info.name, sizeof(entry->info.name), "\255%d.%d.%d.%d:%d", /* the \255 is to make sure that it's sorted last */
+		addr->ip[0], addr->ip[1], addr->ip[2],
+		addr->ip[3], addr->port);	
+	
+	/*if(serverlist_type == BROWSETYPE_LAN)
+		entry->info.latency = (time_get()-broadcast_time)*1000/time_freq();*/
 
 	/* check if it's a favorite */
 	for(i = 0; i < num_favorite_servers; i++)
@@ -360,18 +371,74 @@ void client_serverbrowse_set(NETADDR *addr, int request, int token, SERVER_INFO
 	entry->info.server_index = num_servers;
 	num_servers++;
 	
-	/* */
-	if(request)
+	return entry;
+}
+
+void client_serverbrowse_set(NETADDR *addr, int type, int token, SERVER_INFO *info)
+{
+	SERVERENTRY *entry = 0;
+	if(type == BROWSESET_MASTER_ADD)
 	{
-		/* add it to the list of servers that we should request info from */
-		entry->prev_req = last_req_server;
-		if(last_req_server)
-			last_req_server->next_req = entry;
-		else
-			first_req_server = entry;
-		last_req_server = entry;
-		
-		num_requests++;
+		if(serverlist_type != BROWSETYPE_INTERNET)
+			return;
+			
+		if(!client_serverbrowse_find(addr))
+		{
+			entry = client_serverbrowse_add(addr);
+			client_serverbrowse_queuerequest(entry);
+		}
+	}
+	else if(type == BROWSESET_FAV_ADD)
+	{
+		if(serverlist_type != BROWSETYPE_FAVORITES)
+			return;
+			
+		if(!client_serverbrowse_find(addr))
+		{
+			entry = client_serverbrowse_add(addr);
+			client_serverbrowse_queuerequest(entry);
+		}
+	}
+	else if(type == BROWSESET_TOKEN)
+	{
+		if(token != current_token)
+			return;
+			
+		entry = client_serverbrowse_find(addr);
+		if(!entry)
+			entry = client_serverbrowse_add(addr);
+		if(entry)
+		{
+			client_serverbrowse_setinfo(entry, info);
+			if(serverlist_type == BROWSETYPE_LAN)
+				entry->info.latency = (time_get()-broadcast_time)*1000/time_freq();
+			else
+				entry->info.latency = (time_get()-entry->request_time)*1000/time_freq();
+			client_serverbrowse_remove_request(entry);				
+		}
+	}
+	else if(type == BROWSESET_OLD_INTERNET)
+	{
+		entry = client_serverbrowse_find(addr);
+		if(entry)
+		{
+			client_serverbrowse_setinfo(entry, info);
+			
+			if(serverlist_type == BROWSETYPE_LAN)
+				entry->info.latency = (time_get()-broadcast_time)*1000/time_freq();
+			else
+				entry->info.latency = (time_get()-entry->request_time)*1000/time_freq();
+			client_serverbrowse_remove_request(entry);				
+		}
+	}
+	else if(type == BROWSESET_OLD_LAN)
+	{
+		entry = client_serverbrowse_find(addr);
+		if(entry)
+		if(!entry)
+			entry = client_serverbrowse_add(addr);
+		if(entry)
+			client_serverbrowse_setinfo(entry, info);
 	}
 	
 	client_serverbrowse_sort();
@@ -394,9 +461,7 @@ void client_serverbrowse_refresh(int type)
 	current_token = (current_token+1)&0xff;
 	
 	/* */
-	serverlist_lan = 0;
-	if(type == BROWSETYPE_LAN)
-		serverlist_lan = 1;
+	serverlist_type = type;
 
 	if(type == BROWSETYPE_LAN)
 	{
@@ -452,22 +517,8 @@ void client_serverbrowse_refresh(int type)
 	else if(type == BROWSETYPE_FAVORITES)
 	{
 		int i;
-		
 		for(i = 0; i < num_favorite_servers; i++)
-		{
-			SERVER_INFO info = {0};
-			NETADDR addr = favorite_servers[i];
-			
-			info.latency = 999;
-			str_format(info.address, sizeof(info.address), "%d.%d.%d.%d:%d",
-				addr.ip[0], addr.ip[1], addr.ip[2],
-				addr.ip[3], addr.port);
-			str_format(info.name, sizeof(info.name), "\255%d.%d.%d.%d:%d", /* the \255 is to make sure that it's sorted last */
-				addr.ip[0], addr.ip[1], addr.ip[2],
-				addr.ip[3], addr.port);
-			
-			client_serverbrowse_set(&addr, 1, current_token, &info);
-		}
+			client_serverbrowse_set(&favorite_servers[i], BROWSESET_FAV_ADD, -1, 0);
 	}
 }
 
@@ -492,6 +543,12 @@ static void client_serverbrowse_request(SERVERENTRY *entry)
 	p.data_size = sizeof(buffer);
 	p.data = buffer;
 	netclient_send(net, &p);
+
+	/* send old requtest style aswell */	
+	p.data_size = sizeof(SERVERBROWSE_OLD_GETINFO);
+	p.data = SERVERBROWSE_OLD_GETINFO;
+	netclient_send(net, &p);
+	
 	entry->request_time = time_get();
 }
 
@@ -567,6 +624,7 @@ void client_serverbrowse_addfavorite(NETADDR addr)
 	entry = client_serverbrowse_find(&addr);
 	if(entry)
 		entry->info.favorite = 1;
+	dbg_msg("", "added fav, %p", entry);
 }
 
 void client_serverbrowse_removefavorite(NETADDR addr)
diff --git a/src/engine/e_if_client.h b/src/engine/e_if_client.h
index 98d92a64..b94aad29 100644
--- a/src/engine/e_if_client.h
+++ b/src/engine/e_if_client.h
@@ -505,4 +505,20 @@ int client_mapdownload_totalsize();
 */
 void client_save_line(const char *line);
 
+
+
+
+
+
+enum
+{
+	BROWSESET_MASTER_ADD=1,
+	BROWSESET_FAV_ADD,
+	BROWSESET_TOKEN,
+	BROWSESET_OLD_INTERNET,
+	BROWSESET_OLD_LAN
+};
+
+void client_serverbrowse_set(NETADDR *addr, int type, int token, SERVER_INFO *info);
+
 #endif
diff --git a/src/mastersrv/mastersrv.h b/src/mastersrv/mastersrv.h
index e9e756d4..3e94f9ed 100644
--- a/src/mastersrv/mastersrv.h
+++ b/src/mastersrv/mastersrv.h
@@ -22,6 +22,9 @@ static const unsigned char SERVERBROWSE_COUNT[] = {255, 255, 255, 255, 's', 'i',
 static const unsigned char SERVERBROWSE_GETINFO[] = {255, 255, 255, 255, 'g', 'i', 'e', '2'};
 static const unsigned char SERVERBROWSE_INFO[] = {255, 255, 255, 255, 'i', 'n', 'f', '2'};
 
+static const unsigned char SERVERBROWSE_OLD_GETINFO[] = {255, 255, 255, 255, 'g', 'i', 'e', 'f'};
+static const unsigned char SERVERBROWSE_OLD_INFO[] = {255, 255, 255, 255, 'i', 'n', 'f', 'o'};
+
 static const unsigned char SERVERBROWSE_FWCHECK[] = {255, 255, 255, 255, 'f', 'w', '?', '?'};
 static const unsigned char SERVERBROWSE_FWRESPONSE[] = {255, 255, 255, 255, 'f', 'w', '!', '!'};
 static const unsigned char SERVERBROWSE_FWOK[] = {255, 255, 255, 255, 'f', 'w', 'o', 'k'};