| 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 |
| 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", | ||
| }; |
| 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 |
| 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----- |
| 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----- |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -87,6 +87,7 @@ static const char *code_part_names[] = { | |
| "input", | ||
| "popup", | ||
| "console", | ||
| "lobby", | ||
| "last" | ||
| }; | ||
|
|
||
|
|
||
| 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 |