699 changes: 699 additions & 0 deletions 3rdparty/bson/bson.c

Large diffs are not rendered by default.

229 changes: 229 additions & 0 deletions 3rdparty/bson/bson.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,229 @@
/* bson.h */

/* Copyright 2009, 2010 10gen Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef _BSON_H_
#define _BSON_H_

#include "platform_hacks.h"
#include <time.h>

MONGO_EXTERN_C_START

typedef enum {
bson_eoo=0 ,
bson_double=1,
bson_string=2,
bson_object=3,
bson_array=4,
bson_bindata=5,
bson_undefined=6,
bson_oid=7,
bson_bool=8,
bson_date=9,
bson_null=10,
bson_regex=11,
bson_dbref=12, /* deprecated */
bson_code=13,
bson_symbol=14,
bson_codewscope=15,
bson_int = 16,
bson_timestamp = 17,
bson_long = 18
} bson_type;

typedef int bson_bool_t;

typedef struct {
char * data;
bson_bool_t owned;
} bson;

typedef struct {
const char * cur;
bson_bool_t first;
} bson_iterator;

typedef struct {
char * buf;
char * cur;
int bufSize;
bson_bool_t finished;
int stack[32];
int stackPos;
} bson_buffer;

#pragma pack(1)
typedef union{
char bytes[12];
int ints[3];
} bson_oid_t;
#pragma pack()

typedef int64_t bson_date_t; /* milliseconds since epoch UTC */

typedef struct {
int i; /* increment */
int t; /* time in seconds */
} bson_timestamp_t;

/* ----------------------------
READING
------------------------------ */

bson * bson_empty(bson * obj); /* returns pointer to static empty bson object */
void bson_copy(bson* out, const bson* in); /* puts data in new buffer. NOOP if out==NULL */
bson * bson_from_buffer(bson * b, bson_buffer * buf);
bson * bson_init( bson * b , char * data , bson_bool_t mine );
int bson_size(const bson * b );
void bson_destroy( bson * b );

void bson_print( bson * b );
void bson_print_raw( const char * bson , int depth );

/* advances iterator to named field */
/* returns bson_eoo (which is false) if field not found */
bson_type bson_find(bson_iterator* it, const bson* obj, const char* name);

void bson_iterator_init( bson_iterator * i , const char * bson );

/* more returns true for eoo. best to loop with bson_iterator_next(&it) */
bson_bool_t bson_iterator_more( const bson_iterator * i );
bson_type bson_iterator_next( bson_iterator * i );

bson_type bson_iterator_type( const bson_iterator * i );
const char * bson_iterator_key( const bson_iterator * i );
const char * bson_iterator_value( const bson_iterator * i );

/* these convert to the right type (return 0 if non-numeric) */
double bson_iterator_double( const bson_iterator * i );
int bson_iterator_int( const bson_iterator * i );
int64_t bson_iterator_long( const bson_iterator * i );

/* return the bson timestamp as a whole or in parts */
bson_timestamp_t bson_iterator_timestamp( const bson_iterator * i );

/* false: boolean false, 0 in any type, or null */
/* true: anything else (even empty strings and objects) */
bson_bool_t bson_iterator_bool( const bson_iterator * i );

/* these assume you are using the right type */
double bson_iterator_double_raw( const bson_iterator * i );
int bson_iterator_int_raw( const bson_iterator * i );
int64_t bson_iterator_long_raw( const bson_iterator * i );
bson_bool_t bson_iterator_bool_raw( const bson_iterator * i );
bson_oid_t* bson_iterator_oid( const bson_iterator * i );

/* these can also be used with bson_code and bson_symbol*/
const char * bson_iterator_string( const bson_iterator * i );
int bson_iterator_string_len( const bson_iterator * i );

/* works with bson_code, bson_codewscope, and bson_string */
/* returns NULL for everything else */
const char * bson_iterator_code(const bson_iterator * i);

/* calls bson_empty on scope if not a bson_codewscope */
void bson_iterator_code_scope(const bson_iterator * i, bson * scope);

/* both of these only work with bson_date */
bson_date_t bson_iterator_date(const bson_iterator * i);
time_t bson_iterator_time_t(const bson_iterator * i);

int bson_iterator_bin_len( const bson_iterator * i );
char bson_iterator_bin_type( const bson_iterator * i );
const char * bson_iterator_bin_data( const bson_iterator * i );

const char * bson_iterator_regex( const bson_iterator * i );
const char * bson_iterator_regex_opts( const bson_iterator * i );

/* these work with bson_object and bson_array */
void bson_iterator_subobject(const bson_iterator * i, bson * sub);
void bson_iterator_subiterator(const bson_iterator * i, bson_iterator * sub);

/* str must be at least 24 hex chars + null byte */
void bson_oid_from_string(bson_oid_t* oid, const char* str);
void bson_oid_to_string(const bson_oid_t* oid, char* str);
void bson_oid_gen(bson_oid_t* oid);

time_t bson_oid_generated_time(bson_oid_t* oid); /* Gives the time the OID was created */

/* ----------------------------
BUILDING
------------------------------ */

bson_buffer * bson_buffer_init( bson_buffer * b );
bson_buffer * bson_ensure_space( bson_buffer * b , const int bytesNeeded );

/**
* @return the raw data. you either should free this OR call bson_destroy not both
*/
char * bson_buffer_finish( bson_buffer * b );
void bson_buffer_destroy( bson_buffer * b );

bson_buffer * bson_append_oid( bson_buffer * b , const char * name , const bson_oid_t* oid );
bson_buffer * bson_append_new_oid( bson_buffer * b , const char * name );
bson_buffer * bson_append_int( bson_buffer * b , const char * name , const int i );
bson_buffer * bson_append_long( bson_buffer * b , const char * name , const int64_t i );
bson_buffer * bson_append_double( bson_buffer * b , const char * name , const double d );
bson_buffer * bson_append_string( bson_buffer * b , const char * name , const char * str );
bson_buffer * bson_append_string_n( bson_buffer * b, const char * name, const char * str , int len);
bson_buffer * bson_append_symbol( bson_buffer * b , const char * name , const char * str );
bson_buffer * bson_append_symbol_n( bson_buffer * b , const char * name , const char * str , int len );
bson_buffer * bson_append_code( bson_buffer * b , const char * name , const char * str );
bson_buffer * bson_append_code_n( bson_buffer * b , const char * name , const char * str , int len );
bson_buffer * bson_append_code_w_scope( bson_buffer * b , const char * name , const char * code , const bson * scope);
bson_buffer * bson_append_code_w_scope_n( bson_buffer * b , const char * name , const char * code , int size , const bson * scope);
bson_buffer * bson_append_binary( bson_buffer * b, const char * name, char type, const char * str, int len );
bson_buffer * bson_append_bool( bson_buffer * b , const char * name , const bson_bool_t v );
bson_buffer * bson_append_null( bson_buffer * b , const char * name );
bson_buffer * bson_append_undefined( bson_buffer * b , const char * name );
bson_buffer * bson_append_regex( bson_buffer * b , const char * name , const char * pattern, const char * opts );
bson_buffer * bson_append_bson( bson_buffer * b , const char * name , const bson* bson);
bson_buffer * bson_append_element( bson_buffer * b, const char * name_or_null, const bson_iterator* elem);
bson_buffer * bson_append_timestamp( bson_buffer * b, const char * name, bson_timestamp_t * ts );

/* these both append a bson_date */
bson_buffer * bson_append_date(bson_buffer * b, const char * name, bson_date_t millis);
bson_buffer * bson_append_time_t(bson_buffer * b, const char * name, time_t secs);

bson_buffer * bson_append_start_object( bson_buffer * b , const char * name );
bson_buffer * bson_append_start_array( bson_buffer * b , const char * name );
bson_buffer * bson_append_finish_object( bson_buffer * b );

void bson_numstr(char* str, int i);
void bson_incnumstr(char* str);


/* ------------------------------
ERROR HANDLING - also used in mongo code
------------------------------ */

void * bson_malloc(int size); /* checks return value */
void * bson_realloc(void * ptr, int size); /* checks return value */

/* bson_err_handlers shouldn't return!!! */
typedef void(*bson_err_handler)(const char* errmsg);

/* returns old handler or NULL */
/* default handler prints error then exits with failure*/
bson_err_handler set_bson_err_handler(bson_err_handler func);

/* does nothing is ok != 0 */
void bson_fatal( int ok );
void bson_fatal_msg( int ok, const char* msg );

MONGO_EXTERN_C_END
#endif
127 changes: 127 additions & 0 deletions 3rdparty/bson/numbers.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
/* Copyright 2009 10gen Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/* all the numbers that fit in a 4 byte string */
const char bson_numstrs[1000][4] = {
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49",
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69",
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79",
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99",

"100", "101", "102", "103", "104", "105", "106", "107", "108", "109",
"110", "111", "112", "113", "114", "115", "116", "117", "118", "119",
"120", "121", "122", "123", "124", "125", "126", "127", "128", "129",
"130", "131", "132", "133", "134", "135", "136", "137", "138", "139",
"140", "141", "142", "143", "144", "145", "146", "147", "148", "149",
"150", "151", "152", "153", "154", "155", "156", "157", "158", "159",
"160", "161", "162", "163", "164", "165", "166", "167", "168", "169",
"170", "171", "172", "173", "174", "175", "176", "177", "178", "179",
"180", "181", "182", "183", "184", "185", "186", "187", "188", "189",
"190", "191", "192", "193", "194", "195", "196", "197", "198", "199",

"200", "201", "202", "203", "204", "205", "206", "207", "208", "209",
"210", "211", "212", "213", "214", "215", "216", "217", "218", "219",
"220", "221", "222", "223", "224", "225", "226", "227", "228", "229",
"230", "231", "232", "233", "234", "235", "236", "237", "238", "239",
"240", "241", "242", "243", "244", "245", "246", "247", "248", "249",
"250", "251", "252", "253", "254", "255", "256", "257", "258", "259",
"260", "261", "262", "263", "264", "265", "266", "267", "268", "269",
"270", "271", "272", "273", "274", "275", "276", "277", "278", "279",
"280", "281", "282", "283", "284", "285", "286", "287", "288", "289",
"290", "291", "292", "293", "294", "295", "296", "297", "298", "299",

"300", "301", "302", "303", "304", "305", "306", "307", "308", "309",
"310", "311", "312", "313", "314", "315", "316", "317", "318", "319",
"320", "321", "322", "323", "324", "325", "326", "327", "328", "329",
"330", "331", "332", "333", "334", "335", "336", "337", "338", "339",
"340", "341", "342", "343", "344", "345", "346", "347", "348", "349",
"350", "351", "352", "353", "354", "355", "356", "357", "358", "359",
"360", "361", "362", "363", "364", "365", "366", "367", "368", "369",
"370", "371", "372", "373", "374", "375", "376", "377", "378", "379",
"380", "381", "382", "383", "384", "385", "386", "387", "388", "389",
"390", "391", "392", "393", "394", "395", "396", "397", "398", "399",

"400", "401", "402", "403", "404", "405", "406", "407", "408", "409",
"410", "411", "412", "413", "414", "415", "416", "417", "418", "419",
"420", "421", "422", "423", "424", "425", "426", "427", "428", "429",
"430", "431", "432", "433", "434", "435", "436", "437", "438", "439",
"440", "441", "442", "443", "444", "445", "446", "447", "448", "449",
"450", "451", "452", "453", "454", "455", "456", "457", "458", "459",
"460", "461", "462", "463", "464", "465", "466", "467", "468", "469",
"470", "471", "472", "473", "474", "475", "476", "477", "478", "479",
"480", "481", "482", "483", "484", "485", "486", "487", "488", "489",
"490", "491", "492", "493", "494", "495", "496", "497", "498", "499",

"500", "501", "502", "503", "504", "505", "506", "507", "508", "509",
"510", "511", "512", "513", "514", "515", "516", "517", "518", "519",
"520", "521", "522", "523", "524", "525", "526", "527", "528", "529",
"530", "531", "532", "533", "534", "535", "536", "537", "538", "539",
"540", "541", "542", "543", "544", "545", "546", "547", "548", "549",
"550", "551", "552", "553", "554", "555", "556", "557", "558", "559",
"560", "561", "562", "563", "564", "565", "566", "567", "568", "569",
"570", "571", "572", "573", "574", "575", "576", "577", "578", "579",
"580", "581", "582", "583", "584", "585", "586", "587", "588", "589",
"590", "591", "592", "593", "594", "595", "596", "597", "598", "599",

"600", "601", "602", "603", "604", "605", "606", "607", "608", "609",
"610", "611", "612", "613", "614", "615", "616", "617", "618", "619",
"620", "621", "622", "623", "624", "625", "626", "627", "628", "629",
"630", "631", "632", "633", "634", "635", "636", "637", "638", "639",
"640", "641", "642", "643", "644", "645", "646", "647", "648", "649",
"650", "651", "652", "653", "654", "655", "656", "657", "658", "659",
"660", "661", "662", "663", "664", "665", "666", "667", "668", "669",
"670", "671", "672", "673", "674", "675", "676", "677", "678", "679",
"680", "681", "682", "683", "684", "685", "686", "687", "688", "689",
"690", "691", "692", "693", "694", "695", "696", "697", "698", "699",

"700", "701", "702", "703", "704", "705", "706", "707", "708", "709",
"710", "711", "712", "713", "714", "715", "716", "717", "718", "719",
"720", "721", "722", "723", "724", "725", "726", "727", "728", "729",
"730", "731", "732", "733", "734", "735", "736", "737", "738", "739",
"740", "741", "742", "743", "744", "745", "746", "747", "748", "749",
"750", "751", "752", "753", "754", "755", "756", "757", "758", "759",
"760", "761", "762", "763", "764", "765", "766", "767", "768", "769",
"770", "771", "772", "773", "774", "775", "776", "777", "778", "779",
"780", "781", "782", "783", "784", "785", "786", "787", "788", "789",
"790", "791", "792", "793", "794", "795", "796", "797", "798", "799",

"800", "801", "802", "803", "804", "805", "806", "807", "808", "809",
"810", "811", "812", "813", "814", "815", "816", "817", "818", "819",
"820", "821", "822", "823", "824", "825", "826", "827", "828", "829",
"830", "831", "832", "833", "834", "835", "836", "837", "838", "839",
"840", "841", "842", "843", "844", "845", "846", "847", "848", "849",
"850", "851", "852", "853", "854", "855", "856", "857", "858", "859",
"860", "861", "862", "863", "864", "865", "866", "867", "868", "869",
"870", "871", "872", "873", "874", "875", "876", "877", "878", "879",
"880", "881", "882", "883", "884", "885", "886", "887", "888", "889",
"890", "891", "892", "893", "894", "895", "896", "897", "898", "899",

"900", "901", "902", "903", "904", "905", "906", "907", "908", "909",
"910", "911", "912", "913", "914", "915", "916", "917", "918", "919",
"920", "921", "922", "923", "924", "925", "926", "927", "928", "929",
"930", "931", "932", "933", "934", "935", "936", "937", "938", "939",
"940", "941", "942", "943", "944", "945", "946", "947", "948", "949",
"950", "951", "952", "953", "954", "955", "956", "957", "958", "959",
"960", "961", "962", "963", "964", "965", "966", "967", "968", "969",
"970", "971", "972", "973", "974", "975", "976", "977", "978", "979",
"980", "981", "982", "983", "984", "985", "986", "987", "988", "989",
"990", "991", "992", "993", "994", "995", "996", "997", "998", "999",
};
81 changes: 81 additions & 0 deletions 3rdparty/bson/platform_hacks.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/* platform_hacks.h */
/* Copyright 2009, 2010 10gen Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/


/* all platform-specific ifdefs should go here */

#ifndef _PLATFORM_HACKS_H_
#define _PLATFORM_HACKS_H_

#ifdef __GNUC__
#define MONGO_INLINE static __inline__
#else
#define MONGO_INLINE static
#endif

#ifdef __cplusplus
#define MONGO_EXTERN_C_START extern "C" {
#define MONGO_EXTERN_C_END }
#else
#define MONGO_EXTERN_C_START
#define MONGO_EXTERN_C_END
#endif


#include <stdint.h>

/* big endian is only used for OID generation. little is used everywhere else */
#ifdef MONGO_BIG_ENDIAN
#define bson_little_endian64(out, in) ( bson_swap_endian64(out, in) )
#define bson_little_endian32(out, in) ( bson_swap_endian32(out, in) )
#define bson_big_endian64(out, in) ( memcpy(out, in, 8) )
#define bson_big_endian32(out, in) ( memcpy(out, in, 4) )
#else
#define bson_little_endian64(out, in) ( memcpy(out, in, 8) )
#define bson_little_endian32(out, in) ( memcpy(out, in, 4) )
#define bson_big_endian64(out, in) ( bson_swap_endian64(out, in) )
#define bson_big_endian32(out, in) ( bson_swap_endian32(out, in) )
#endif

MONGO_EXTERN_C_START

MONGO_INLINE void bson_swap_endian64(void* outp, const void* inp){
const char *in = (const char*)inp;
char *out = (char*)outp;

out[0] = in[7];
out[1] = in[6];
out[2] = in[5];
out[3] = in[4];
out[4] = in[3];
out[5] = in[2];
out[6] = in[1];
out[7] = in[0];

}
MONGO_INLINE void bson_swap_endian32(void* outp, const void* inp){
const char *in = (const char*)inp;
char *out = (char*)outp;

out[0] = in[3];
out[1] = in[2];
out[2] = in[1];
out[3] = in[0];
}

MONGO_EXTERN_C_END

#endif
3 changes: 2 additions & 1 deletion AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ Bruce V. Edwards <cathuria> : 2D/3D Graphics
-- <Cyp> : Programming
-- <dak180> : MacOSX Packaging
Elio Gubser <elio, ohyeh> : 2D Graphics
Rene Jochum <fastdeath / pcdummy> : Programming and Webmaster
Steven Koenig <kreuvf> : Documentation, translation
Gerard Krol <gerard_> : Programming, Textures
Guangcong Luo <Zarel> : Programming, Balancing, and Documentation
Per I. Mathisen <per / sendai> : Programming
Kim Metcalfe <lav-coyote25> : Documentation, Maps and Support
Christian Ohm <cybersphinx> : Programming
Tim P. <kamaze> : Webmaster
Giel van Schijndel <Giel> : Programming and Debian Linux and Windows Packaging
Dennis Schridde <devurandom> : Programming and general Linux and Windows Packaging
Freddie Witherden <EvilGuru> : Programming and MacOSX Packaging
Expand Down Expand Up @@ -45,6 +45,7 @@ Hylke van der Schaaf <TheNoid> : Programming
Dmitri Shuralyov <shurcool> : Programming
Rodolphe Suescun <rodzilla> : Programming
-- <vs2k5> : Programming
Tim P. <kamaze> : Webmaster


Non-project members whose content has been used in Warzone, in alphabetical order:
Expand Down
9 changes: 9 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,14 @@ AS_IF([test "x$enable_sound" != "xyes"],[
AC_DEFINE([WZ_NOSOUND], [], [Causes sound to be disabled])
])

# Disables SSL for the Lobby
AC_ARG_ENABLE([ssl],
AS_HELP_STRING([--disable-ssl], [Disable SSL [no]]),
[ enable_ssl="${enableval}" ], [ enable_ssl="yes" ])
AS_IF([test "x$enable_ssl" != "xyes"],[
AC_DEFINE([NO_SSL], [], [Causes SSL to be disabled])
])

# -O0 turns off all optimizations; this is necessary for accurate debugging
# -Wno-unused-label is necessary because flex produces unused labels that we cannot fix
# Add later for stricter checking: -Wextra -Wmissing-declarations -Wstrict-prototypes
Expand Down Expand Up @@ -435,6 +443,7 @@ AC_CONFIG_FILES([Makefile
win32/Makefile
tests/Makefile
3rdparty/miniupnpc/Makefile
3rdparty/bson/Makefile
lib/framework/Makefile
lib/exceptionhandler/Makefile
lib/gamelib/Makefile
Expand Down
2 changes: 2 additions & 0 deletions data/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ BASELIST = \
palette.txt \
anims \
audio \
cacert.org-root.pem \
cacert.org-class3.pem \
challenges \
components \
effects \
Expand Down
35 changes: 35 additions & 0 deletions data/base/cacert.org-class3.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
-----BEGIN CERTIFICATE-----
MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS
BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v
cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9
4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB
Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J
0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ
FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx
bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q
SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb
6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV
m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g
eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG
kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7
6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG
CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc
aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB
gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w
aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6
tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0
nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M
77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV
Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L
ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM
zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU
rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF
YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT
oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu
FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB
0m6lG5kngOcLqagA
-----END CERTIFICATE-----
76 changes: 76 additions & 0 deletions data/base/cacert.org-root.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
-----BEGIN CERTIFICATE-----
MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO
BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi
MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ
ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ
8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6
zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y
fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7
w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc
G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k
epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q
laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ
QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU
fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826
YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w
ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY
gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe
MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0
IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy
dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw
czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0
dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl
aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC
AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg
b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB
ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc
nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg
18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c
gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl
Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY
sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T
SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF
CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum
GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk
zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW
omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290
IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB
IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA
Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS
BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v
cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9
4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB
Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J
0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ
FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx
bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q
SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb
6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV
m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g
eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG
kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7
6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG
CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc
aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB
gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w
aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6
tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0
nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M
77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV
Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L
ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM
zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU
rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF
YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT
oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu
FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB
0m6lG5kngOcLqagA
-----END CERTIFICATE-----
2 changes: 2 additions & 0 deletions data/makefile.win32
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ SUBDIRS=mods
BASELIST= \
anims \
audio \
cacert.org-root.pem \
cacert.org-class3.pem \
challenges \
components \
effects \
Expand Down
1 change: 1 addition & 0 deletions lib/framework/debug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ static const char *code_part_names[] = {
"input",
"popup",
"console",
"lobby",
"last"
};

Expand Down
1 change: 1 addition & 0 deletions lib/framework/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ enum code_part
LOG_INPUT, // mouse / keyboard events
LOG_POPUP, // special, on by default, for both debug & release builds (used for OS dependent popup code)
LOG_CONSOLE, // send console messages to file
LOG_LOBBY,
LOG_LAST /**< _must_ be last! */
};

Expand Down
5 changes: 3 additions & 2 deletions lib/netplay/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,17 @@ endif

noinst_LIBRARIES = libnetplay.a
noinst_HEADERS = \
netlobby.h \
netlog.h \
netplay.h \
netqueue.h \
netsocket.h \
nettypes.h

libnetplay_a_SOURCES = \
netjoin_stub.cpp \
netsocket.cpp \
netlobby.cpp \
netlog.cpp \
netplay.cpp \
netqueue.cpp \
netsocket.cpp \
nettypes.cpp
34 changes: 0 additions & 34 deletions lib/netplay/netjoin_stub.cpp

This file was deleted.

717 changes: 717 additions & 0 deletions lib/netplay/netlobby.cpp

Large diffs are not rendered by default.

213 changes: 213 additions & 0 deletions lib/netplay/netlobby.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
/*
This file is part of Warzone 2100.
Copyright (C) 1999-2004 Eidos Interactive
Copyright (C) 2005-2011 Warzone 2100 Project
Warzone 2100 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Warzone 2100 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Warzone 2100; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

#ifndef _netlobby_h
#define _netlobby_h

#if defined(NO_SSL)
#include <QtNetwork/QTcpSocket>
#else
#include <QtNetwork/QSslSocket>
#endif

#include "lib/framework/frame.h"
#include "bson/bson.h"

namespace Lobby
{
const qint32 PROTOCOL = 4;

/* NOTE: You also need to change this value in the
* masterservers settings - session_size!
*/
const int SESSION_SIZE = 16+1;

/* We limit usernames here to 40 chars,
* while the forums allows usernames with up to 255 characters.
*/
const int USERNAME_SIZE = 40+1;

enum RETURN_CODES
{
NO_ERROR = 0,

// Copied from XMLRPC for socketrpc
PARSE_ERROR = -32700,
SERVER_ERROR = -32600,
APPLICATION_ERROR = -32500,
TRANSPORT_ERROR = -32300,
// Specific errors.
UNSUPPORTED_ENCODING = -32701,
METHOD_NOT_FOUND = -32601,

// Custom error codes.
INVALID_DATA = -500,
LOGIN_REQUIRED = -405,
WRONG_LOGIN = -404,
NOT_ACCEPTABLE = -403,
NO_GAME = -402,
};

// FIXME: Not sure if std::string is a good idea here,
// as multiint is passing them to iV_DrawText.
struct GAME
{
uint32_t port; ///< Port hosting on.
std::string host; ///< IPv4, IPv6 or DNS Name of the host.
std::string description; ///< Game Description.
uint32_t currentPlayers; ///< Number of joined players.
uint32_t maxPlayers; ///< Maximum number of players.
std::string versionstring; ///< Version string.
uint32_t game_version_major; ///< Minor NETCODE version.
uint32_t game_version_minor; ///< Major NETCODE version.
bool isPrivate; ///< Password protected?
std::string modlist; ///< display string for mods.
std::string mapname; ///< name of map hosted.
std::string hostplayer; ///< hosts playername.
};

struct ERROR
{
RETURN_CODES code;
QString message;
};

struct CALL_RESULT
{
RETURN_CODES code;
char* buffer;
const char* result;
};

class Client {
public:
QList<GAME> games;

Client();
void stop();

RETURN_CODES connect();
bool disconnect();
bool isConnected();
RETURN_CODES login(const QString& password);
RETURN_CODES logout();

RETURN_CODES addGame(char** result, const uint32_t port, const uint32_t maxPlayers,
const char* description, const char* versionstring,
const uint32_t game_version_major, const uint32_t game_version_minor,
const bool isPrivate, const char* modlist,
const char* mapname, const char* hostplayer);

RETURN_CODES delGame();
RETURN_CODES addPlayer(const unsigned int index, const char* name, const char* username, const char* session);
RETURN_CODES delPlayer(const unsigned int index);
RETURN_CODES updatePlayer(const unsigned int index, const char* name);
RETURN_CODES listGames(const int maxGames);

Client& addCACertificate(const QString& path);

bool useSSL() { return useSSL_; }
bool useSSL(bool useSSL)
{
#if defined(NO_SSL)
if (useSSL == true)
{
debug(LOG_ERROR, "Cannot use SSL as its not compiled in.");

}
return false;
#else
useSSL_ = useSSL;
useAuth_ = useSSL;
return useSSL_;
#endif
}

bool useAuth() { return useAuth_; }

Client& setHost(const QString& host) { host_ = host; return *this; }
QString getHost() const { return host_; }

Client& setPort(const quint16& port) { port_ = port; return *this; }
quint16 getPort() { return port_; }

bool isAuthenticated() { return isAuthenticated_; }
bool hasAuthData() { return (!user_.isEmpty() && !token_.isEmpty()); }

Client& setUser(const QString& user) { user_ = user; return *this; }
QString getUser() const { return user_; }

Client& setToken(const QString& token) { token_ = token; return *this; }
QString getToken() { return token_; }

QString getSession() const { return session_; }

ERROR* getError() { return &lastError_; }

void freeError()
{
lastError_.code = NO_ERROR;
lastError_.message.clear();
}

private:
int64_t gameId_;

uint32_t callId_;

bool useSSL_;
#if !defined(NO_SSL)
QList<QSslCertificate> cacerts_;
#endif

bool useAuth_;
QString host_;
quint16 port_;

QString user_;
QString token_;
QString session_;

#if defined(NO_SSL)
QTcpSocket *socket_;
#else
QSslSocket *socket_;
#endif

bool isAuthenticated_;

ERROR lastError_;
CALL_RESULT callResult_;

RETURN_CODES call_(const char* command, const bson* args, const bson* kwargs);

void freeCallResult_()
{
callResult_.code = NO_ERROR;
callResult_.result = NULL;
delete callResult_.buffer;
}

RETURN_CODES setError_(const RETURN_CODES code, const char * message, ...);
}; // class Client

} // namespace Lobby

#endif // #ifndef _netlobby_h
799 changes: 122 additions & 677 deletions lib/netplay/netplay.cpp

Large diffs are not rendered by default.

66 changes: 9 additions & 57 deletions lib/netplay/netplay.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#define _netplay_h

#include "nettypes.h"
#include "netlobby.h"
#include <physfs.h>

// Lobby Connection errors
Expand All @@ -42,7 +43,9 @@ enum LOBBY_ERROR_TYPES
ERROR_WRONGPASSWORD,
ERROR_HOSTDROPPED,
ERROR_WRONGDATA,
ERROR_UNKNOWNFILEISSUE
ERROR_UNKNOWNFILEISSUE,
ERROR_AUTHENTICATION,
ERROR_LOBBY_REJECTED
};

enum CONNECTION_STATUS
Expand Down Expand Up @@ -126,61 +129,15 @@ enum MESSAGE_TYPES
// @NOTE / FIXME: We need a way to detect what should happen if the msg buffer exceeds this.
#define MaxMsgSize 16384 // max size of a message in bytes.
#define StringSize 64 // size of strings used.
#define MaxGames 18 // max number of concurrently playable games to allow.
#define extra_string_size 159 // extra 199 char for future use
#define map_string_size 40
#define hostname_string_size 40
#define modlist_string_size 255 // For a concatenated list of mods
#define password_string_size 64 // longer passwords slow down the join code

#define SESSION_JOINDISABLED 1

#define MAX_CONNECTED_PLAYERS MAX_PLAYERS
#define MAX_TMP_SOCKETS 16

struct SESSIONDESC //Available game storage... JUST FOR REFERENCE!
{
int32_t dwSize;
int32_t dwFlags;
char host[40]; // host's ip address (can fit a full IPv4 and IPv6 address + terminating NUL)
int32_t dwMaxPlayers;
int32_t dwCurrentPlayers;
int32_t dwUserFlags[4];
};

/**
* @note when changing this structure, NETsendGAMESTRUCT, NETrecvGAMESTRUCT and
* the lobby server should be changed accordingly.
*/
struct GAMESTRUCT
{
/* Version of this structure and thus the binary lobby protocol.
* @NOTE: <em>MUST</em> be the first item of this struct.
*/
uint32_t GAMESTRUCT_VERSION;

char name[StringSize];
SESSIONDESC desc;
// END of old GAMESTRUCT format
// NOTE: do NOT save the following items in game.c--it will break savegames.
char secondaryHosts[2][40];
char extra[extra_string_size]; // extra string (future use)
char mapname[map_string_size]; // map server is hosting
char hostname[hostname_string_size]; // ...
char versionstring[StringSize]; //
char modlist[modlist_string_size]; // ???
uint32_t game_version_major; //
uint32_t game_version_minor; //
uint32_t privateGame; // if true, it is a private game
uint32_t pureGame; // NO mods allowed if true
uint32_t Mods; // number of concatenated mods?
// Game ID, used on the lobby server to link games with multiple address families to eachother
uint32_t gameId;
uint32_t future2; // for future use
uint32_t future3; // for future use
uint32_t future4; // for future use
};

// ////////////////////////////////////////////////////////////////////////
// Message information. ie. the packets sent between machines.

Expand Down Expand Up @@ -263,8 +220,8 @@ struct PLAYER
// all the luvly Netplay info....
struct NETPLAY
{
GAMESTRUCT games[MaxGames]; ///< The collection of games
PLAYER players[MAX_PLAYERS]; ///< The array of players.
uint32_t maxPlayers; ///< Maximum number of players.
uint32_t playercount; ///< Number of players in game.
uint32_t hostPlayer; ///< Index of host in player array
uint32_t bComms; ///< Actually do the comms?
Expand All @@ -274,9 +231,6 @@ struct NETPLAY
PHYSFS_file *pMapFileHandle;
char gamePassword[password_string_size]; //
bool GamePassworded; // if we have a password or not.
bool ShowedMOTD; // only want to show this once
char MOTDbuffer[255]; // buffer for MOTD
char* MOTD;
};

struct PLAYER_IP
Expand All @@ -296,6 +250,8 @@ extern bool netPlayersUpdated;
extern int mapDownloadProgress;
extern char iptoconnect[PATH_MAX]; // holds IP/hostname from command line

extern Lobby::Client lobbyclient;

// ////////////////////////////////////////////////////////////////////////
// functions available to you.
extern int NETinit(bool bFirstCall); // init
Expand Down Expand Up @@ -329,19 +285,15 @@ extern SDWORD NETgetGameFlags(UDWORD flag); // return one of the four flags(dw
extern int32_t NETgetGameFlagsUnjoined(unsigned int gameid, unsigned int flag); // return one of the four flags(dword) about the game.
extern bool NETsetGameFlags(UDWORD flag, SDWORD value); // set game flag(1-4) to value.
extern bool NEThaltJoining(void); // stop new players joining this game
extern bool NETfindGame(void); // find games being played(uses GAME_GUID);
extern bool NETjoinGame(const char* host, uint32_t port, const char* playername); // join game given with playername
extern bool NETfindGame(const int maxGames); // find games being played(uses GAME_GUID);
extern bool NETjoinGame(const char* host, uint32_t port, const char* playername); // join game given with playername
extern bool NEThostGame(const char* SessionName, const char* PlayerName,// host a game
SDWORD one, SDWORD two, SDWORD three, SDWORD four, UDWORD plyrs);
extern bool NETchangePlayerName(UDWORD player, char *newName);// change a players name.
void NETfixDuplicatePlayerNames(void); // Change a player's name automatically, if there are duplicates.

#include "netlog.h"

extern void NETsetMasterserverName(const char* hostname);
extern const char* NETgetMasterserverName(void);
extern void NETsetMasterserverPort(unsigned int port);
extern unsigned int NETgetMasterserverPort(void);
extern void NETsetGameserverPort(unsigned int port);
extern unsigned int NETgetGameserverPort(void);

Expand Down
75 changes: 59 additions & 16 deletions lib/widget/label.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,42 @@ W_LABEL::W_LABEL(W_LABINIT const *init)
if (init->pText)
{
sstrcpy(aText, init->pText);

iV_SetFont(FontID);
QStringList words = QString(init->pText).split(" ");
QStringList line;
unsigned int wsize, lsize = 0;
foreach(const QString &word, words)
{
wsize = iV_GetTextWidth(word.toUtf8().constData());
if (lsize + wsize >= width)
{
if (line.isEmpty())
{
// Let iv_DrawText handle to long lines.
lines << word;
}
else
{
// Append current line and create a new one with that word.
lines << line.join(" ");
line.clear();
line << word;
lsize = wsize;
}
}
else
{
line << word;
lsize += wsize;
}
}
if (!line.isEmpty())
{
lines << line.join(" ");
}

lines = lines;
}
}

Expand Down Expand Up @@ -87,11 +123,10 @@ void labelFree(W_LABEL *psWidget)
delete psWidget;
}


/* label display function */
void labelDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours)
{
SDWORD fx,fy, fw;
unsigned int fx,fy, fw;
W_LABEL *psLabel;
enum iV_fonts FontID;

Expand All @@ -100,22 +135,30 @@ void labelDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pC

iV_SetFont(FontID);
iV_SetTextColour(pColours[WCOL_TEXT]);
if (psLabel->style & WLAB_ALIGNCENTRE)
{
fw = iV_GetTextWidth(psLabel->aText);
fx = xOffset + psLabel->x + (psLabel->width - fw) / 2;
}
else if (psLabel->style & WLAB_ALIGNRIGHT)
{
fw = iV_GetTextWidth(psLabel->aText);
fx = xOffset + psLabel->x + psLabel->width - fw;
}
else

// Draw each line.
int i = 0;
foreach(const QString &line, psLabel->lines)
{
fx = xOffset + psLabel->x;
if (psLabel->style & WLAB_ALIGNCENTRE)
{
fx = xOffset + psLabel->x + (psLabel->width - iV_GetTextWidth(line.toUtf8().constData())) / 2;
}
else if (psLabel->style & WLAB_ALIGNRIGHT)
{
fw = iV_GetTextWidth(line.toUtf8().constData());
fx = xOffset + psLabel->x + psLabel->width - fw;
}
else
{
fx = xOffset + psLabel->x;
}

fy = yOffset + psLabel->y + (psLabel->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase() + (iV_GetTextLineSize() * i);
iV_DrawText(line.toUtf8().constData(),fx,fy);

i++;
}
fy = yOffset + psLabel->y + (psLabel->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase();
iV_DrawText(psLabel->aText,fx,fy);
}

/* Respond to a mouse moving over a label */
Expand Down
3 changes: 3 additions & 0 deletions lib/widget/label.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
#ifndef __INCLUDED_LIB_WIDGET_LABEL_H__
#define __INCLUDED_LIB_WIDGET_LABEL_H__

#include <QtCore/QStringList>

#include "widget.h"
#include "widgbase.h"
#include "lib/ivis_opengl/textdraw.h"
Expand All @@ -33,6 +35,7 @@ struct W_LABEL : public WIDGET
W_LABEL(W_LABINIT const *init);

char aText[WIDG_MAXSTR]; // Text on the label
QStringList lines; // Text parsed to list on init.
enum iV_fonts FontID;
const char *pTip; // The tool tip for the button
};
Expand Down
36 changes: 31 additions & 5 deletions macosx/Warzone.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,6 @@
43B8FF6D127CD9E4006F5A13 /* DejaVuSans.ttf in Copy Fonts */ = {isa = PBXBuildFile; fileRef = 43B8FF3E127CD99A006F5A13 /* DejaVuSans.ttf */; };
43B9DE3913846038004C7351 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 43B9DE3813846038004C7351 /* libiconv.dylib */; };
43BE75EA11124BB5007DF934 /* wavecast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BE75E811124BB4007DF934 /* wavecast.cpp */; };
43C18FCF114FF38B0028741B /* netjoin_stub.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43C18FA7114FF38B0028741B /* netjoin_stub.cpp */; };
43C18FD0114FF38B0028741B /* netlog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43C18FA8114FF38B0028741B /* netlog.cpp */; };
43C18FD1114FF38B0028741B /* netplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43C18FAA114FF38B0028741B /* netplay.cpp */; };
43C18FD2114FF38B0028741B /* netsocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43C18FAC114FF38B0028741B /* netsocket.cpp */; };
Expand All @@ -461,6 +460,9 @@
43D180B01336B99C001906EB /* physfs_casefolding.h in Headers */ = {isa = PBXBuildFile; fileRef = 43D180AF1336B99C001906EB /* physfs_casefolding.h */; };
43D338581364F5A8005F6725 /* connecthostport.c in Sources */ = {isa = PBXBuildFile; fileRef = 43D338561364F5A8005F6725 /* connecthostport.c */; };
43D338591364F5A8005F6725 /* connecthostport.h in Headers */ = {isa = PBXBuildFile; fileRef = 43D338571364F5A8005F6725 /* connecthostport.h */; };
43DD1BCA13661FD5003AA9EC /* bson.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DD1BC613661FD5003AA9EC /* bson.c */; };
43DD1BCB13661FD5003AA9EC /* numbers.c in Sources */ = {isa = PBXBuildFile; fileRef = 43DD1BC813661FD5003AA9EC /* numbers.c */; };
43DD1BCE13662006003AA9EC /* netlobby.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43DD1BCC13662006003AA9EC /* netlobby.cpp */; };
43DF5A8A12BEE01B00DD5A37 /* cocoa_wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 43DF5A8912BEE01B00DD5A37 /* cocoa_wrapper.mm */; };
43E1890411440D8C000870EB /* eval-plural.h in Headers */ = {isa = PBXBuildFile; fileRef = 022B2F850BD55B4F002E64E3 /* eval-plural.h */; };
43E1890511440D8D000870EB /* gettextP.h in Headers */ = {isa = PBXBuildFile; fileRef = 022B2F860BD55B4F002E64E3 /* gettextP.h */; };
Expand Down Expand Up @@ -573,6 +575,8 @@
43F300C210D344B000707B6E /* x86int.h in Headers */ = {isa = PBXBuildFile; fileRef = 43F3008B10D344B000707B6E /* x86int.h */; };
43F300C310D344B000707B6E /* x86state.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F3008C10D344B000707B6E /* x86state.c */; };
43F300D710D3496D00707B6E /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 43F3006710D344AF00707B6E /* encode.c */; };
43F30910136BAED700AFD307 /* QtNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4333612011A07FB900380F5E /* QtNetwork.framework */; };
43F30913136BAEE900AFD307 /* QtNetwork.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = 4333612011A07FB900380F5E /* QtNetwork.framework */; };
647D9C571039289A006D37CF /* challenge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 647D9C551039289A006D37CF /* challenge.cpp */; };
9742E5730DF9975E000A5D41 /* lexer_input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9742E5710DF9975E000A5D41 /* lexer_input.cpp */; };
9742E5770DF9979C000A5D41 /* parsetest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9742E5750DF9979C000A5D41 /* parsetest.cpp */; };
Expand Down Expand Up @@ -812,6 +816,7 @@
43F1D99A1343F1DE001478EC /* QtScript.framework in Copy frameworks */,
4333661C11A07FFF00380F5E /* QtGui.framework in Copy frameworks */,
4333661D11A07FFF00380F5E /* QtOpenGL.framework in Copy frameworks */,
43F30913136BAEE900AFD307 /* QtNetwork.framework in Copy frameworks */,
43502D77134764B000A02A1F /* GLExtensionWrangler.framework in Copy frameworks */,
431843B71363958E00BA2BC5 /* MiniUPnPc.framework in Copy frameworks */,
02581C880BD5AD1100957CBC /* Zlib.framework in Copy frameworks */,
Expand Down Expand Up @@ -1514,7 +1519,6 @@
43C18FA4114FF38B0028741B /* upnperrors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upnperrors.h; sourceTree = "<group>"; };
43C18FA5114FF38B0028741B /* upnpreplyparse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = upnpreplyparse.c; sourceTree = "<group>"; };
43C18FA6114FF38B0028741B /* upnpreplyparse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upnpreplyparse.h; sourceTree = "<group>"; };
43C18FA7114FF38B0028741B /* netjoin_stub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = netjoin_stub.cpp; path = ../lib/netplay/netjoin_stub.cpp; sourceTree = SOURCE_ROOT; };
43C18FA8114FF38B0028741B /* netlog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = netlog.cpp; path = ../lib/netplay/netlog.cpp; sourceTree = SOURCE_ROOT; };
43C18FA9114FF38B0028741B /* netlog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = netlog.h; path = ../lib/netplay/netlog.h; sourceTree = SOURCE_ROOT; };
43C18FAA114FF38B0028741B /* netplay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = netplay.cpp; path = ../lib/netplay/netplay.cpp; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -1545,6 +1549,12 @@
43D338561364F5A8005F6725 /* connecthostport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = connecthostport.c; sourceTree = "<group>"; };
43D338571364F5A8005F6725 /* connecthostport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = connecthostport.h; sourceTree = "<group>"; };
43D6167F12048D2D004B9630 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/InfoPlist.strings; sourceTree = "<group>"; };
43DD1BC613661FD5003AA9EC /* bson.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bson.c; path = ../3rdparty/bson/bson.c; sourceTree = SOURCE_ROOT; };
43DD1BC713661FD5003AA9EC /* bson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bson.h; path = ../3rdparty/bson/bson.h; sourceTree = SOURCE_ROOT; };
43DD1BC813661FD5003AA9EC /* numbers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = numbers.c; path = ../3rdparty/bson/numbers.c; sourceTree = SOURCE_ROOT; };
43DD1BC913661FD5003AA9EC /* platform_hacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = platform_hacks.h; path = ../3rdparty/bson/platform_hacks.h; sourceTree = SOURCE_ROOT; };
43DD1BCC13662006003AA9EC /* netlobby.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = netlobby.cpp; path = ../lib/netplay/netlobby.cpp; sourceTree = SOURCE_ROOT; };
43DD1BCD13662006003AA9EC /* netlobby.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = netlobby.h; path = ../lib/netplay/netlobby.h; sourceTree = SOURCE_ROOT; };
43DF5A8812BEE01B00DD5A37 /* cocoa_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cocoa_wrapper.h; path = ../lib/framework/cocoa_wrapper.h; sourceTree = SOURCE_ROOT; };
43DF5A8912BEE01B00DD5A37 /* cocoa_wrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = cocoa_wrapper.mm; path = ../lib/framework/cocoa_wrapper.mm; sourceTree = SOURCE_ROOT; };
43DF5AE812BEED8200DD5A37 /* actiondef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = actiondef.h; path = ../src/actiondef.h; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -1675,6 +1685,7 @@
43F1D9801343F1C5001478EC /* QtScript.framework in Frameworks */,
4333612311A07FB900380F5E /* QtGui.framework in Frameworks */,
4333612511A07FBA00380F5E /* QtOpenGL.framework in Frameworks */,
43F30910136BAED700AFD307 /* QtNetwork.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -1997,9 +2008,10 @@
0246A12B0BD3CC47004D1C70 /* Netplay */ = {
isa = PBXGroup;
children = (
43DD1BCC13662006003AA9EC /* netlobby.cpp */,
43DD1BCD13662006003AA9EC /* netlobby.h */,
43B8F286127C8FDD006F5A13 /* netqueue.cpp */,
43B8F287127C8FDD006F5A13 /* netqueue.h */,
43C18FA7114FF38B0028741B /* netjoin_stub.cpp */,
43C18FA8114FF38B0028741B /* netlog.cpp */,
43C18FA9114FF38B0028741B /* netlog.h */,
43C18FAA114FF38B0028741B /* netplay.cpp */,
Expand Down Expand Up @@ -2528,6 +2540,7 @@
02DDA8620BD3C1BB0049AB60 /* Vorbis sources */,
02DDA8DE0BD3C3930049AB60 /* PhysFS sources */,
9730E8000E8CEB3B009C9481 /* Theora sources */,
43DD1BC213661F84003AA9EC /* Mongo-C-Driver sources */,
);
name = "Third Party";
sourceTree = "<group>";
Expand Down Expand Up @@ -2871,6 +2884,17 @@
name = coupled;
sourceTree = "<group>";
};
43DD1BC213661F84003AA9EC /* Mongo-C-Driver sources */ = {
isa = PBXGroup;
children = (
43DD1BC613661FD5003AA9EC /* bson.c */,
43DD1BC713661FD5003AA9EC /* bson.h */,
43DD1BC813661FD5003AA9EC /* numbers.c */,
43DD1BC913661FD5003AA9EC /* platform_hacks.h */,
);
name = "Mongo-C-Driver sources";
sourceTree = "<group>";
};
43F3008010D344B000707B6E /* x86 */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -3640,7 +3664,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "DirectorY=\"libpng-1.5.4\"\nOutDir=\"libpng\"\nFileName=\"libpng-1.5.4.tar.gz\"\nSourceDLP=\"http://downloads.sourceforge.net/project/libpng/libpng15/1.5.4/libpng-1.5.4.tar.gz\"\nMD5Sum=\"dea4d1fd671160424923e92ff0cdda78\"\n\nconfigs/FetchSource.sh \"${DirectorY}\" \"${OutDir}\" \"${FileName}\" \"${SourceDLP}\" \"${MD5Sum}\"\nexit ${?}\n";
shellScript = "DirectorY=\"libpng-1.5.2\"\nOutDir=\"libpng\"\nFileName=\"libpng-1.5.2.tar.gz\"\nSourceDLP=\"http://downloads.sourceforge.net/project/libpng/libpng15/1.5.2/libpng-1.5.2.tar.gz\"\nMD5Sum=\"31d448eb93a1646359a23f1b23434ab3\"\n\nconfigs/FetchSource.sh \"${DirectorY}\" \"${OutDir}\" \"${FileName}\" \"${SourceDLP}\" \"${MD5Sum}\"\nexit ${?}";
};
438B0C26137732A5008184FC /* Ogg - Fetch source */ = {
isa = PBXShellScriptBuildPhase;
Expand Down Expand Up @@ -3969,7 +3993,6 @@
43A8417811028EDD00733CCB /* pointtree.cpp in Sources */,
43BE75EA11124BB5007DF934 /* wavecast.cpp in Sources */,
4336D8AA111DDF0F0012E8E4 /* random.cpp in Sources */,
43C18FCF114FF38B0028741B /* netjoin_stub.cpp in Sources */,
43C18FD0114FF38B0028741B /* netlog.cpp in Sources */,
43C18FD1114FF38B0028741B /* netplay.cpp in Sources */,
43C18FD2114FF38B0028741B /* netsocket.cpp in Sources */,
Expand All @@ -3983,6 +4006,9 @@
43F1D9D31343F542001478EC /* qtscriptfuncs.cpp in Sources */,
43A6285B13A6C4A400C6B786 /* geometry.cpp in Sources */,
4313231A13BE866B0023280C /* qtgame.cpp in Sources */,
43DD1BCA13661FD5003AA9EC /* bson.c in Sources */,
43DD1BCB13661FD5003AA9EC /* numbers.c in Sources */,
43DD1BCE13662006003AA9EC /* netlobby.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
5 changes: 3 additions & 2 deletions macosx/configs/Warzone-All.xcconfig
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@ HEADER_SEARCH_PATHS = $(inherited) $(HEADER_SEARCH_PATHS_QUOTED_1)

LIBRARY_SEARCH_PATHS = $(inherited) $(LIBRARY_SEARCH_PATHS_QUOTED_1) $(LIBRARY_SEARCH_PATHS_QUOTED_3)

USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/.."
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/.." "$(SRCROOT)/../3rdparty"
GCC_ENABLE_SSE3_EXTENSIONS = YES // -msse3
GCC_MODEL_TUNING = G5
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(BUILD_PREPROCESSOR_DEFINITIONS)
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(BUILD_PREPROCESSOR_DEFINITIONS) MONGO_HAVE_STDINT
GCC_PREPROCESSOR_DEFINITIONS[arch=ppc] = $(inherited) MONGO_BIG_ENDIAN

OTHER_CFLAGS = $(FlagsForCandCpp) $(WarnForC) $(inherited)
OTHER_CFLAGS[arch=i386] = $(inherited) // intel 32 bit only
Expand Down
2 changes: 1 addition & 1 deletion pkg/nsis/warzone2100.nsi
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ Section $(TEXT_SecBase) SecBase
; Data files
File "${TOP_BUILDDIR}\data\mp.wz"
File "${TOP_BUILDDIR}\data\base.wz"

; Information/documentation files (convert eols for text files)
File "${TOP_SRCDIR}\ChangeLog"
Push "ChangeLog"
Expand Down
2 changes: 1 addition & 1 deletion po/POTFILES.in
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,8 @@ lib/ivis_opengl/rendmode.cpp
lib/ivis_opengl/screen.cpp
lib/ivis_opengl/tex.cpp
lib/ivis_opengl/textdraw.cpp
lib/netplay/netjoin_stub.cpp
lib/netplay/netlog.cpp
lib/netplay/netlobby.cpp
lib/netplay/netplay.cpp
lib/netplay/netqueue.cpp
lib/netplay/netsocket.cpp
Expand Down
1 change: 1 addition & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ warzone2100_LIBS = \
$(top_builddir)/lib/gamelib/libgamelib.a \
$(top_builddir)/lib/framework/libframework.a \
$(top_builddir)/lib/exceptionhandler/libexceptionhandler.a \
$(top_builddir)/3rdparty/bson/libbson.a \
$(top_builddir)/3rdparty/miniupnpc/libminiupnpc.a

warzone2100_LDADD = $(warzone2100_LIBS) $(LTLIBINTL) $(PHYSFS_LIBS) $(PNG_LIBS) $(OGGVORBIS_LIBS) \
Expand Down
40 changes: 35 additions & 5 deletions src/configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
// ////////////////////////////////////////////////////////////////////////////

#define DEFAULTSCROLL 1000
#define MASTERSERVERPORT 9990
#define GAMESERVERPORT 2100

static const char *fileName = "config";
Expand Down Expand Up @@ -77,11 +76,9 @@ bool loadConfig()
setMiddleClickRotate(ini.value("MiddleClickRotate", false).toBool());
rotateRadar = ini.value("rotateRadar", true).toBool();
war_SetPauseOnFocusLoss(ini.value("PauseOnFocusLoss", false).toBool());
NETsetMasterserverName(ini.value("masterserver_name", "lobby.wz2100.net").toString().toUtf8().constData());
iV_font(ini.value("fontname", "DejaVu Sans").toString().toUtf8().constData(),
ini.value("fontface", "Book").toString().toUtf8().constData(),
ini.value("fontfacebold", "Bold").toString().toUtf8().constData());
NETsetMasterserverPort(ini.value("masterserver_port", MASTERSERVERPORT).toInt());
NETsetGameserverPort(ini.value("gameserver_port", GAMESERVERPORT).toInt());
war_SetFMVmode((FMV_MODE)ini.value("FMVmode", FMV_FULLSCREEN).toInt());
war_setScanlineMode((SCANLINE_MODE)ini.value("scanlines", SCANLINES_OFF).toInt());
Expand Down Expand Up @@ -134,6 +131,31 @@ bool loadConfig()

if (ini.contains("bpp")) pie_SetVideoBufferDepth(ini.value("bpp").toInt());
setFramerateLimit(ini.value("framerate", 60).toInt());

/**
* Lobby
*/
lobbyclient.setHost(ini.value("lobby_host", "lobby.wz2100.net").toString());
if ((lobbyclient.getHost() == "lobby.wz2100.net" || lobbyclient.getHost() == "localhost")
&& ini.contains("lobby_ssl")
&& ini.value("lobby_ssl", true).toBool() == true)
{
lobbyclient.useSSL(true);
lobbyclient.setPort(ini.value("lobby_port", 9994).toInt());
lobbyclient.setUser(ini.value("lobby_user", "").toString());
lobbyclient.setToken(ini.value("lobby_token", "").toString());
}
else if (ini.value("lobby_ssl", true).toBool() == true)
{
lobbyclient.useSSL(true);
lobbyclient.setPort(ini.value("lobby_port", 9994).toInt());
}
else
{
lobbyclient.useSSL(false);
lobbyclient.setPort(ini.value("lobby_port", 9990).toInt());
}

return true;
}

Expand Down Expand Up @@ -188,8 +210,6 @@ bool saveConfig()
ini.setValue("UPnP", (SDWORD)NetPlay.isUPNP);
ini.setValue("rotateRadar", rotateRadar);
ini.setValue("PauseOnFocusLoss", war_GetPauseOnFocusLoss());
ini.setValue("masterserver_name", NETgetMasterserverName());
ini.setValue("masterserver_port", NETgetMasterserverPort());
ini.setValue("gameserver_port", NETgetGameserverPort());
if (!bMultiPlayer)
{
Expand All @@ -212,6 +232,16 @@ bool saveConfig()
}
ini.setValue("playerName", (char*)sPlayer); // player name
}

/**
* Lobby
*/
ini.setValue("lobby_host", lobbyclient.getHost());
ini.setValue("lobby_ssl", lobbyclient.useSSL());
ini.setValue("lobby_port", lobbyclient.getPort());
ini.setValue("lobby_user", lobbyclient.getUser());
ini.setValue("lobby_token", lobbyclient.getToken());

ini.sync();
return true;
}
Expand Down
79 changes: 5 additions & 74 deletions src/frontend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -350,70 +350,6 @@ bool runSinglePlayerMenu(void)
return true;
}


// ////////////////////////////////////////////////////////////////////////////
// Multi Player Menu
static bool startMultiPlayerMenu(void)
{
addBackdrop();
addTopForm();
addBottomForm();

addSideText (FRONTEND_SIDETEXT , FRONTEND_SIDEX,FRONTEND_SIDEY,_("MULTI PLAYER"));

addTextButton(FRONTEND_HOST, FRONTEND_POS2X,FRONTEND_POS2Y, _("Host Game"), WBUT_TXTCENTRE);
addTextButton(FRONTEND_JOIN, FRONTEND_POS3X,FRONTEND_POS3Y, _("Join Game"), WBUT_TXTCENTRE);

addMultiBut(psWScreen, FRONTEND_BOTFORM, FRONTEND_QUIT, 10, 10, 30, 29, P_("menu", "Return"), IMAGE_RETURN, IMAGE_RETURN_HI, IMAGE_RETURN_HI);

return true;
}

bool runMultiPlayerMenu(void)
{
UDWORD id;

id = widgRunScreen(psWScreen); // Run the current set of widgets
switch(id)
{
case FRONTEND_HOST:
// don't pretend we are running a network game. Really do it!
NetPlay.bComms = true; // use network = true
NETdiscoverUPnPDevices();
ingame.bHostSetup = true;
bMultiPlayer = true;
bMultiMessages = true;
game.type = SKIRMISH; // needed?
lastTitleMode = MULTI;
changeTitleMode(MULTIOPTION);
break;
case FRONTEND_JOIN:
ingame.bHostSetup = false;
if (getLobbyError() != ERROR_CHEAT && getLobbyError() != ERROR_KICKED)
{
setLobbyError(ERROR_NOERROR);
}
changeTitleMode(PROTOCOL);
break;

case FRONTEND_QUIT:
changeTitleMode(TITLE);
break;
default:
break;
}

widgDisplayScreen(psWScreen); // show the widgets currently running

if (CancelPressed())
{
changeTitleMode(TITLE);
}

return true;
}


// ////////////////////////////////////////////////////////////////////////////
// Options Menu
static bool startOptionsMenu(void)
Expand Down Expand Up @@ -1700,6 +1636,7 @@ void addTextButton(UDWORD id, UDWORD PosX, UDWORD PosY, const char *txt, unsign
// Align
if ( !(style & WBUT_TXTCENTRE) )
{
iV_SetFont(font_large);
sButInit.width = (short)(iV_GetTextWidth(txt)+10);
sButInit.x+=35;
}
Expand Down Expand Up @@ -1810,12 +1747,9 @@ void changeTitleMode(tMode mode)
startCreditsScreen();
break;
case MULTI:
startMultiPlayerMenu(); // goto multiplayer menu
break;
case PROTOCOL:
startConnectionScreen();
startGameFind();
break;
case MULTIOPTION:
case MULTIOPTION:
if(oldMode == MULTILIMIT)
{
startMultiOptions(true);
Expand All @@ -1824,10 +1758,7 @@ void changeTitleMode(tMode mode)
{
startMultiOptions(false);
}
break;
case GAMEFIND:
startGameFind();
break;
break;
case MULTILIMIT:
startLimitScreen();
break;
Expand All @@ -1841,7 +1772,7 @@ void changeTitleMode(tMode mode)
case SHOWINTRO:
break;
default:
debug( LOG_FATAL, "Unknown title mode requested" );
debug( LOG_FATAL, "Unknown title mode requested (%d)", mode);
abort();
break;
}
Expand Down
47 changes: 21 additions & 26 deletions src/frontend.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,27 +26,24 @@
// determines which option screen to use. when in GS_TITLE_SCREEN mode.
enum tMode
{
TITLE, // 0 intro mode
SINGLE, // 1 single player menu
MULTI, // 2 multiplayer menu
OPTIONS, // 3 options menu
GAME, // 4
TUTORIAL, // 5 tutorial/fastplay
CREDITS, // 6 credits
PROTOCOL, // 7 MULTIPLAYER, select proto
MULTIOPTION, // 8 MULTIPLAYER, select game options
FORCESELECT, // 9 MULTIPLAYER, Force design screen
GAMEFIND, // 10 MULTIPLAYER, gamefinder.
MULTILIMIT, // 11 MULTIPLAYER, Limit the multistuff.
STARTGAME, // 12 Fire up the game
SHOWINTRO, // 13 reshow the intro
QUIT, // 14 leaving game
LOADSAVEGAME, // 15 loading a save game
KEYMAP, // 16 keymap editor
GRAPHICS_OPTIONS, // 17 graphics options menu
AUDIO_OPTIONS, // 18 audio options menu
VIDEO_OPTIONS, // 19 video options menu
MOUSE_OPTIONS, // 20 mouse options menu
TITLE, ///< intro mode
SINGLE, ///< single player menu
MULTI, ///< multiplayer menu
OPTIONS, ///< options menu
GAME, ///<
TUTORIAL, ///< tutorial/fastplay
CREDITS, ///< credits
MULTIOPTION, ///< Host Screen
MULTILIMIT, ///< MULTIPLAYER, Limit the multistuff.
STARTGAME, ///< Fire up the game
SHOWINTRO, ///< reshow the intro
QUIT, ///< leaving game
LOADSAVEGAME, ///< loading a save game
KEYMAP, ///< keymap editor
GRAPHICS_OPTIONS, ///< graphics options menu
AUDIO_OPTIONS, ///< audio options menu
VIDEO_OPTIONS, ///< video options menu
MOUSE_OPTIONS, ///< mouse options menu
};

extern tMode titleMode; // the global case
Expand All @@ -62,7 +59,6 @@ extern bool bLimiterLoaded;
void changeTitleMode(tMode mode);
bool runTitleMenu(void);
bool runSinglePlayerMenu(void);
bool runMultiPlayerMenu(void);
bool runGameOptionsMenu(void);
bool runOptionsMenu(void);
bool runGraphicsOptionsMenu(void);
Expand Down Expand Up @@ -157,6 +153,7 @@ enum
FRONTEND_LOADCAM2, // loading via --GAME CAM_2A
FRONTEND_LOADCAM3, // loading via --GAME CAM_3A
FRONTEND_PASSWORDFORM,
FRONTEND_LOGINFORM,
// begin menu
FRONTEND_SINGLEPLAYER = 20100, // title screen
FRONTEND_MULTIPLAYER,
Expand All @@ -169,9 +166,7 @@ enum
FRONTEND_LOADGAME,
FRONTEND_SKIRMISH,
FRONTEND_CHALLENGES,
FRONTEND_HOST = 20300, //multiplayer menu options
FRONTEND_JOIN,
FE_P0, // player 0 buton
FE_P0 = 20300, // player 0 buton
FE_P1, // player 1 buton
FE_P2, // player 2 buton
FE_P3, // player 3 buton
Expand Down Expand Up @@ -237,7 +232,7 @@ enum
FRONTEND_MMROTATE_R,

FRONTEND_KEYMAP = 26000, // Keymap menu
FRONTEND_NOGAMESAVAILABLE = 31666 // Used when no games are available in lobby
FRONTEND_LOBBYERROR = 31666 // Shows an lobby error

};

Expand Down
60 changes: 0 additions & 60 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -383,44 +383,6 @@ static bool deserializeMultiplayerGame(PHYSFS_file* fileHandle, MULTIPLAYERGAME*
return true;
}

static bool serializeSessionDesc(PHYSFS_file* fileHandle, const SESSIONDESC* serializeDesc)
{
return (PHYSFS_writeSBE32(fileHandle, serializeDesc->dwSize)
&& PHYSFS_writeSBE32(fileHandle, serializeDesc->dwFlags)
&& PHYSFS_write(fileHandle, serializeDesc->host, 1, 16) == 16
&& PHYSFS_writeSBE32(fileHandle, serializeDesc->dwMaxPlayers)
&& PHYSFS_writeSBE32(fileHandle, serializeDesc->dwCurrentPlayers)
&& PHYSFS_writeSBE32(fileHandle, serializeDesc->dwUserFlags[0])
&& PHYSFS_writeSBE32(fileHandle, serializeDesc->dwUserFlags[1])
&& PHYSFS_writeSBE32(fileHandle, serializeDesc->dwUserFlags[2])
&& PHYSFS_writeSBE32(fileHandle, serializeDesc->dwUserFlags[3]));
}

static bool deserializeSessionDesc(PHYSFS_file* fileHandle, SESSIONDESC* serializeDesc)
{
return (PHYSFS_readSBE32(fileHandle, &serializeDesc->dwSize)
&& PHYSFS_readSBE32(fileHandle, &serializeDesc->dwFlags)
&& PHYSFS_read(fileHandle, serializeDesc->host, 1, 16) == 16
&& PHYSFS_readSBE32(fileHandle, &serializeDesc->dwMaxPlayers)
&& PHYSFS_readSBE32(fileHandle, &serializeDesc->dwCurrentPlayers)
&& PHYSFS_readSBE32(fileHandle, &serializeDesc->dwUserFlags[0])
&& PHYSFS_readSBE32(fileHandle, &serializeDesc->dwUserFlags[1])
&& PHYSFS_readSBE32(fileHandle, &serializeDesc->dwUserFlags[2])
&& PHYSFS_readSBE32(fileHandle, &serializeDesc->dwUserFlags[3]));
}

static bool serializeGameStruct(PHYSFS_file* fileHandle, const GAMESTRUCT* serializeGame)
{
return (PHYSFS_write(fileHandle, serializeGame->name, StringSize, 1) == 1
&& serializeSessionDesc(fileHandle, &serializeGame->desc));
}

static bool deserializeGameStruct(PHYSFS_file* fileHandle, GAMESTRUCT* serializeGame)
{
return (PHYSFS_read(fileHandle, serializeGame->name, StringSize, 1) == 1
&& deserializeSessionDesc(fileHandle, &serializeGame->desc));
}

static bool serializePlayer(PHYSFS_file* fileHandle, const PLAYER* serializePlayer, int player)
{
return (PHYSFS_writeUBE32(fileHandle, serializePlayer->position)
Expand Down Expand Up @@ -466,12 +428,6 @@ static bool serializeNetPlay(PHYSFS_file* fileHandle, const NETPLAY* serializeNe
{
unsigned int i;

for (i = 0; i < MaxGames; ++i)
{
if (!serializeGameStruct(fileHandle, &serializeNetPlay->games[i]))
return false;
}

for (i = 0; i < MAX_PLAYERS; ++i)
{
if (!serializePlayer(fileHandle, &serializeNetPlay->players[i], i))
Expand All @@ -493,12 +449,6 @@ static bool deserializeNetPlay(PHYSFS_file* fileHandle, NETPLAY* serializeNetPla
uint32_t dummy, scavs = game.scavengers;
bool retv;

for (i = 0; i < MaxGames; ++i)
{
if (!deserializeGameStruct(fileHandle, &serializeNetPlay->games[i]))
return false;
}

for (i = 0; i < MAX_PLAYERS; ++i)
{
if (!deserializePlayer(fileHandle, &serializeNetPlay->players[i], i))
Expand Down Expand Up @@ -2914,16 +2864,6 @@ static void endian_SaveGameV(SAVE_GAME* psSaveGame, UDWORD version)
if(version >= VERSION_33)
{
endian_udword(&psSaveGame->sGame.power);
for(i = 0; i < MaxGames; i++) {
endian_sdword(&psSaveGame->sNetPlay.games[i].desc.dwSize);
endian_sdword(&psSaveGame->sNetPlay.games[i].desc.dwFlags);
endian_sdword(&psSaveGame->sNetPlay.games[i].desc.dwMaxPlayers);
endian_sdword(&psSaveGame->sNetPlay.games[i].desc.dwCurrentPlayers);
endian_sdword(&psSaveGame->sNetPlay.games[i].desc.dwUserFlags[0]);
endian_sdword(&psSaveGame->sNetPlay.games[i].desc.dwUserFlags[1]);
endian_sdword(&psSaveGame->sNetPlay.games[i].desc.dwUserFlags[2]);
endian_sdword(&psSaveGame->sNetPlay.games[i].desc.dwUserFlags[3]);
}
endian_udword(&psSaveGame->sNetPlay.playercount);
endian_udword(&psSaveGame->savePlayer);
for(i = 0; i < MAX_PLAYERS; i++)
Expand Down
6 changes: 4 additions & 2 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1156,8 +1156,6 @@ int main(int argc, char *argv[])

loadConfig();

NETinit(true);

// parse the command line
if (!ParseCommandLine(utfargc, utfargv))
{
Expand All @@ -1170,6 +1168,10 @@ int main(int argc, char *argv[])
// Find out where to find the data
scanDataDirs();

// This needs to be done after "scanDataDirs"
// for the root cert from cacert.
NETinit(true);

// Must be run before OpenGL driver is properly initialized due to
// strange conflicts - Per
if (selfTest)
Expand Down
646 changes: 402 additions & 244 deletions src/multiint.cpp

Large diffs are not rendered by default.

39 changes: 17 additions & 22 deletions src/multiint.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
#define AI_CLOSED -1
#define AI_NOT_FOUND -99

#define MaxGames 14 // max number of concurrently playable games to allow.

void readAIs(); ///< step 1, load AI definition files
void loadMultiScripts(); ///< step 2, load the actual AI scripts
const char *getAIName(int player); ///< only run this -after- readAIs() is called
Expand All @@ -41,10 +43,6 @@ int getNextAIAssignment(const char *name);
extern LOBBY_ERROR_TYPES getLobbyError(void);
extern void setLobbyError(LOBBY_ERROR_TYPES error_type);

extern void runConnectionScreen (void);
extern bool startConnectionScreen (void);
extern void intProcessConnection (UDWORD id);

extern void runGameFind (void);
extern void startGameFind (void);

Expand All @@ -66,9 +64,6 @@ void loadMapPreview(bool hideInterface);
// ////////////////////////////////////////////////////////////////
// CONNECTION SCREEN

#define CON_CONTYPES 10103
#define CON_CONTYPESWIDTH 290
#define CON_CONTYPES_FORM 10104
#define CON_TYPESID_START 10105
#define CON_TYPESID_END 10128

Expand All @@ -86,16 +81,17 @@ void loadMapPreview(bool hideInterface);
#define CON_OKY CON_SETTINGSHEIGHT-MULTIOP_OKH-3

#define CON_CANCEL 10102

#define CON_PHONE 10132
#define CON_PHONEX 20
#define CON_PHONEY 45
#define CON_HOST_GAME 10103
#define CON_JOIN_IP 10104
#define CON_LOGOUT 10105
#define CON_LOGIN 10106

#define CON_IP 10133
#define CON_IPX 20
#define CON_IPY 45

#define CON_IP_CANCEL 10134
#define CON_IP_OK 10135

//for clients
#define CON_PASSWORD 10139
Expand All @@ -108,6 +104,15 @@ void loadMapPreview(bool hideInterface);
#define CON_H_PASSWORDX MCOL2
#define CON_H_PASSWORDY MROW10 +31

// Login form
#define CON_LOGIN_USER 10150
#define CON_LOGIN_PASS 10151
#define CON_LOGIN_YES 10152
#define CON_LOGIN_NO 10153
#define CON_LOGIN_USER_LABEL 10154
#define CON_LOGIN_PASS_LABEL 10155
#define CON_LOGIN_SIDETEXT 10156
#define CON_LOGIN_INFOTEXT 10157


// ////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -297,19 +302,9 @@ void loadMapPreview(bool hideInterface);

// ///////////////////////////////
// Many Button Variations..

#define CON_BUTWIDTH 60
#define CON_BUTHEIGHT 46

#define CON_CONBUTW CON_CONTYPESWIDTH-15
#define CON_CONBUTH 46

#define CON_NAMEBOXWIDTH CON_SETTINGSWIDTH-CON_PHONEX
#define CON_NAMEBOXWIDTH CON_SETTINGSWIDTH-20
#define CON_NAMEBOXHEIGHT 15

#define CON_COMBUTWIDTH 37
#define CON_COMBUTHEIGHT 24

#define MULTIOP_OKW 37
#define MULTIOP_OKH 24

Expand Down
4 changes: 2 additions & 2 deletions src/multijoin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -416,9 +416,9 @@ void setupNewPlayer(UDWORD player)

// While not the perfect place for this, it has to do when a HOST joins (hosts) game
// unfortunatly, we don't get the message until after the setup is done.
void ShowMOTD(void)
void showMOTD(const char* motd)
{
// when HOST joins the game, show server MOTD message first
addConsoleMessage(_("System message:"), DEFAULT_JUSTIFY, NOTIFY_MESSAGE);
addConsoleMessage(NetPlay.MOTD, DEFAULT_JUSTIFY, NOTIFY_MESSAGE);
addConsoleMessage(motd, DEFAULT_JUSTIFY, NOTIFY_MESSAGE);
}
2 changes: 1 addition & 1 deletion src/multijoin.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ extern void clearPlayer (UDWORD player, bool quietly);// wipe a player off t
//extern bool ProcessDroidOrders (void);
//extern UDWORD arenaPlayersReceived;

extern void ShowMOTD(void);
extern void showMOTD(const char* motd);
extern bool recvDataCheck(NETQUEUE queue);
extern bool sendDataCheck(void);

Expand Down
8 changes: 1 addition & 7 deletions src/wrappers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,17 +161,11 @@ TITLECODE titleLoop(void)
switch(titleMode) // run relevant title screen code.
{
// MULTIPLAYER screens
case PROTOCOL:
runConnectionScreen(); // multiplayer connection screen.
break;
case MULTIOPTION:
runMultiOptions();
break;
case GAMEFIND:
runGameFind();
break;
case MULTI:
runMultiPlayerMenu();
runGameFind();
break;
case MULTILIMIT:
runLimitScreen();
Expand Down