diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-09-04 17:25:55 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-09-04 17:25:55 +0000 |
| commit | 8d99a3d3c9c4142955bdc7ec994dce61b4eb8d15 (patch) | |
| tree | 9cbd6a3d820aa3a6068b8e970ceafeaa9b4a2b71 | |
| parent | 171ca682d3edbe641ccc26cba7f5991206ae9041 (diff) | |
| download | zcatch-8d99a3d3c9c4142955bdc7ec994dce61b4eb8d15.tar.gz zcatch-8d99a3d3c9c4142955bdc7ec994dce61b4eb8d15.zip | |
fixed so old request methods work aswell
| -rw-r--r-- | src/engine/client/ec_client.c | 26 | ||||
| -rw-r--r-- | src/engine/client/ec_srvbrowse.c | 182 | ||||
| -rw-r--r-- | src/engine/e_if_client.h | 16 | ||||
| -rw-r--r-- | src/mastersrv/mastersrv.h | 3 |
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'}; |