~ubuntu-branches/ubuntu/raring/simutrans/raring-proposed

« back to all changes in this revision

Viewing changes to gui/server_frame.cc

  • Committer: Package Import Robot
  • Author(s): Ansgar Burchardt
  • Date: 2011-11-03 19:59:02 UTC
  • mfrom: (1.2.7)
  • Revision ID: package-import@ubuntu.com-20111103195902-uopgwf488mfctb75
Tags: 111.0-1
* New upstream release.
* debian/rules: Update get-orig-source target for new upstream release.
* Use xz compression for source and binary packages.
* Use override_* targets to simplify debian/rules.

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
#include "../simcolor.h"
10
10
#include "../simgraph.h"
11
11
#include "../simwin.h"
12
 
#include "../simmesg.h"
13
12
#include "../utils/simstring.h"
 
13
#include "../simversion.h"
14
14
 
15
15
#include "components/list_button.h"
16
16
#include "../dataobj/translator.h"
27
27
 
28
28
 
29
29
server_frame_t::server_frame_t(karte_t* w) :
30
 
        gui_frame_t("Game info"),
 
30
        gui_frame_t( translator::translate("Game info") ),
31
31
        welt(w),
32
 
        gi(welt),
33
 
        buf(1024),
34
 
        time(32),
35
 
        revision_buf(64),
36
 
        pakset_checksum_buf(80)
 
32
        gi(welt)
37
33
{
38
34
        update_info();
39
35
 
93
89
 
94
90
                // only update serverlist, when not already in network mode
95
91
                // otherwise desync to current game may happen
96
 
                update_serverlist( gi.get_game_engine_revision()*show_all_rev.pressed, show_all_rev.pressed ? NULL : gi.get_pak_name() );
 
92
                if (  show_all_rev.pressed  ) {
 
93
                        update_serverlist( 0, NULL );
 
94
                }
 
95
                else {
 
96
                        update_serverlist( gi.get_game_engine_revision(), gi.get_pak_name() );
 
97
                }
97
98
 
98
99
                pos_y += 6+BUTTON_HEIGHT;
99
100
        }
198
199
}
199
200
 
200
201
 
 
202
/*
 
203
  Takes a pointer to a CSV formatted string to parse
 
204
  And a pointer to a char array to store the result in
 
205
  The pointer to the string will be moved to the end of the parsed field
 
206
*/
 
207
int server_frame_t::parse_csv_field( char **c, char *field, size_t maxlen )
 
208
{
 
209
        char *n;
 
210
        if (  c == NULL  ||  *c == NULL ) {
 
211
                return -1;
 
212
        }
 
213
        if (  **c == '"'  ) {
 
214
                n = strstr( *c, "\"," );
 
215
                if (  n == NULL  ) {
 
216
                        n = strstr( *c, "\"\n" );
 
217
                        if (  n == NULL  ) {
 
218
                                // Copy everything up to end of string into field buffer
 
219
                                tstrncpy( field, *c + 1, min(strlen(*c + 1), maxlen) );
 
220
                        }
 
221
                        else {
 
222
                                // Copy everything up to the EOL (\n) into field buffer
 
223
                                tstrncpy( field, *c + 1, min(n - *c, maxlen) );
 
224
                        }
 
225
                        // Move to end of string
 
226
                        *c += strlen( *c );
 
227
                }
 
228
                else {
 
229
                        tstrncpy(field, *c + 1, min(n - *c, maxlen));
 
230
                        // Move to start of next field
 
231
                        *c = n + 2;
 
232
                }
 
233
                dbg->warning( "server_frame_t::parse_csv_field", "Parsed field: '%s'", field );
 
234
        }
 
235
        else {
 
236
                n = strstr( *c, "," );
 
237
                // If n is NULL then this is the last field (no more field seperators)
 
238
                if (  n == NULL  ) {
 
239
                        dbg->warning( "server_frame_t::parse_csv_field", "last field" );
 
240
                        n = strstr( *c, "\n" );
 
241
                        if (  n==NULL  ) {
 
242
                                // Copy everything up to end of string into field buffer
 
243
                                tstrncpy( field, *c, min(strlen(*c + 1), maxlen) );
 
244
                        }
 
245
                        else {
 
246
                                // Copy everything up to the EOL (\n) into field buffer
 
247
                                tstrncpy( field, *c, min(n - *c + 1, maxlen) );
 
248
                        }
 
249
                        // Move to end of string
 
250
                        *c += strlen( *c );
 
251
                }
 
252
                else {
 
253
                        tstrncpy( field, *c, min(n - *c + 1, maxlen) );
 
254
                        // Move to start of next field
 
255
                        *c = n + 1;
 
256
                }
 
257
                dbg->warning( "server_frame_t::parse_csv_field", "Parsed field: '%s'", field );
 
258
        }
 
259
        return 0;
 
260
}
 
261
 
201
262
bool server_frame_t::update_serverlist( uint revision, const char *pakset )
202
263
{
 
264
        dbg->warning( "server_frame_t::update_serverlist", "called with revision: %i, pakset: %s", revision, pakset );
203
265
        // download list from main server
204
 
        if(  const char *err = network_download_http( "simutrans-germany.com:80", "/serverlist/data/serverlist.txt", "serverlist.txt" )  ) {
 
266
        if (  const char *err = network_download_http(ANNOUNCE_SERVER, ANNOUNCE_LIST_URL, SERVER_LIST_FILE)  ) {
205
267
                dbg->warning( "server_frame_t::update_serverlist", "could not download list: %s", err );
206
268
                return false;
207
269
        }
208
270
        // read the list
209
 
        FILE *fh = fopen( "serverlist.txt", "r" );
210
 
        if (fh) {
 
271
        // CSV format
 
272
        // name of server,dnsname.com:12345,4567,pak128 blah blah
 
273
        FILE *fh = fopen( SERVER_LIST_FILE, "r" );
 
274
        if (  fh  ) {
211
275
                serverlist.clear_elements();
212
 
                while( !feof(fh) ) {
 
276
                while (  !feof( fh )  ) {
213
277
                        char line[4096];
214
 
                        fgets( line, sizeof(line), fh );
215
 
 
216
 
                        // find servername
217
 
                        const char *c = strstr( line, " : " );
218
 
                        if(  c==NULL  ) {
219
 
                                continue;
220
 
                        }
221
 
 
222
 
                        // get servername (and remove default port)
 
278
                        line[0] = '\0';
 
279
                        char *d = line;
 
280
                        char **c = &d;
 
281
                        int ret;
 
282
 
 
283
                        fgets( line, sizeof( line ), fh );
 
284
                        dbg->warning( "server_frame_t::update_serverlist", "parsing line: '%s'", line );
 
285
//                      if (  feof( fh )  ) { continue; }
 
286
 
 
287
                        // First field is display name of server
223
288
                        char servername[4096];
224
 
                        tstrncpy( servername, line, c-line+1 );
225
 
                        if(  strcmp( servername+strlen(servername)-6, ":13353" )==0  ) {
226
 
                                servername[strlen(servername)-6] = 0;
227
 
                        }
228
 
 
229
 
                        // now program revision
230
 
                        const char *c2 = strstr( c+3, " : " );
231
 
                        if(  c2==NULL  ) {
232
 
                                continue;
233
 
                        }
234
 
                        uint32 serverrev = atol(c2);
235
 
                        if(  revision!=0  &&  serverrev!=0  &&  revision!=serverrev  ) {
 
289
                        ret = parse_csv_field( c, servername, 4096 );
 
290
                        if (  ret > 0  ||  servername[0] == '\0'  ) { continue; }
 
291
 
 
292
                        // Second field is dns name of server (for connection)
 
293
                        char serverdns[4096];
 
294
                        ret = parse_csv_field( c, serverdns, 4096 );
 
295
                        if (  ret > 0  ||  servername[0] == '\0'  ) { continue; }
 
296
                        // Strip default port
 
297
                        if (  strcmp(serverdns + strlen(serverdns) - 6, ":13353") == 0  ) {
 
298
                                dbg->warning( "server_frame_t::update_serverlist", "stripping default port from entry %s", serverdns );
 
299
                                serverdns[strlen(serverdns) - 6] = 0;
 
300
                        }
 
301
 
 
302
                        // Third field is server revision (use for filtering)
 
303
                        char serverrevision[100];
 
304
                        ret = parse_csv_field( c, serverrevision, 4096 );
 
305
                        if (  ret > 0  ||  servername[0] == '\0'  ) { continue; }
 
306
                        uint32 serverrev = atol( serverrevision );
 
307
                        if (  revision != 0  &&  revision != serverrev  ) {
236
308
                                // do not add mismatched servers
 
309
                                dbg->warning( "server_frame_t::update_serverlist", "revision %i does not match our revision (%i), skipping", serverrev, revision );
237
310
                                continue;
238
311
                        }
239
312
 
 
313
                        // Fourth field is server pakset (use for filtering)
 
314
                        char serverpakset[4096];
 
315
                        ret = parse_csv_field( c, serverpakset, 4096 );
 
316
                        if (  ret > 0  ||  servername[0] == '\0'  ) { continue; }
240
317
                        // now check pakset match
241
 
                        if(  pakset!=NULL  ) {
242
 
                                if(  strncmp( pakset, c2+3, strlen(pakset) )  ) {
 
318
                        if (  pakset != NULL  ) {
 
319
                                if (  strncmp( pakset, serverpakset, strlen( pakset ) )  ) {
 
320
                                        dbg->warning( "server_frame_t::update_serverlist", "pakset '%s' does not match our pakset ('%s'), skipping", serverpakset, pakset );
243
321
                                        continue;
244
322
                                }
245
323
                        }
246
324
 
 
325
                        char serverentry[4096];
 
326
                        // const char *format = "%s (%s)";
 
327
                        // sprintf(serverentry, format, servername, serverdns);
 
328
                        const char *format = "%s";
 
329
                        sprintf( serverentry, format, serverdns );
 
330
 
247
331
                        // now add entry
248
 
                        serverlist.append_element( new gui_scrolled_list_t::var_text_scrollitem_t( servername, COL_BLUE ) );
 
332
 
 
333
                        // TODO - Need to decouple the text which is displayed in the listing box from the actual DNS/IP entry which is used to connect to the server in question
 
334
 
 
335
                        serverlist.append_element( new gui_scrolled_list_t::var_text_scrollitem_t( serverentry, COL_BLUE ) );
 
336
                        dbg->warning( "server_frame_t::update_serverlist", "Appended %s to list", serverentry );
249
337
                }
 
338
                // Clean up, remove temp file used for recv. listings
250
339
                fclose( fh );
251
 
                remove( "serverlist.txt" );
 
340
                remove( SERVER_LIST_FILE );
252
341
                serverlist.set_selection( -1 );
253
342
        }
254
343
        else {
300
389
        }
301
390
        else if(  &show_all_rev == komp  ) {
302
391
                show_all_rev.pressed ^= 1;
303
 
                update_serverlist( gi.get_game_engine_revision()*show_all_rev.pressed, show_all_rev.pressed ? NULL : gi.get_pak_name() );
 
392
                if ( show_all_rev.pressed ) {
 
393
                        update_serverlist( 0, NULL );
 
394
                } else {
 
395
                        update_serverlist( gi.get_game_engine_revision(), gi.get_pak_name() );
 
396
                }
304
397
        }
305
398
        else if(  &join == komp  ) {
306
399
                if(  serverlist.get_selection()==-1  ) {