/[LeafOK_CVS]/pvpgn-1.7.4/src/bnetd/anongame_infos.c
ViewVC logotype

Annotation of /pvpgn-1.7.4/src/bnetd/anongame_infos.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Tue Jun 6 03:41:37 2006 UTC (19 years, 9 months ago) by sysadm
Branch point for: GNU, MAIN
Content type: text/x-csrc
Initial revision

1 sysadm 1.1 /*
2     * This program is free software; you can redistribute it and/or
3     * modify it under the terms of the GNU General Public License
4     * as published by the Free Software Foundation; either version 2
5     * of the License, or (at your option) any later version.
6     *
7     * This program is distributed in the hope that it will be useful,
8     * but WITHOUT ANY WARRANTY; without even the implied warranty of
9     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10     * GNU General Public License for more details.
11     *
12     * You should have received a copy of the GNU General Public License
13     * along with this program; if not, write to the Free Software
14     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15     */
16     #define TIMER_INTERNAL_ACCESS
17     #include "common/setup_before.h"
18     #ifdef STDC_HEADERS
19     # include <stdlib.h>
20     #else
21     # ifdef HAVE_MALLOC_H
22     # include <malloc.h>
23     # endif
24     #endif
25     #ifdef HAVE_STRING_H
26     # include <string.h>
27     #else
28     # ifdef HAVE_STRINGS_H
29     # include <strings.h>
30     # endif
31     #endif
32     #include "compat/strrchr.h"
33     #include <errno.h>
34     #include "compat/strerror.h"
35     #include "common/list.h"
36     #include "common/eventlog.h"
37     #include "common/util.h"
38     #include "common/packet.h"
39     #include "common/tag.h"
40     #include "common/bn_type.h"
41     #include "common/xalloc.h"
42     #include "zlib/pvpgn_zlib.h"
43     #include "tournament.h"
44     #include "anongame_maplists.h"
45     #include "anongame_infos.h"
46     #include "common/setup_after.h"
47    
48     static FILE *fp = NULL;
49    
50     static t_anongame_infos *anongame_infos;
51    
52     static int zlib_compress(void const *src, int srclen, char **dest, int *destlen);
53     static int anongame_infos_data_load(void);
54    
55     static int anongame_infos_URL_init(t_anongame_infos * anongame_infos)
56     {
57     char **anongame_infos_URL;
58     int i;
59    
60     if (!(anongame_infos))
61     {
62     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos");
63     return -1;
64     }
65    
66     anongame_infos_URL = xmalloc(sizeof(char*)*anongame_infos_URL_count);
67    
68     for (i=0; i<anongame_infos_URL_count; i++)
69     anongame_infos_URL[i] = NULL;
70    
71     anongame_infos->anongame_infos_URL = anongame_infos_URL;
72    
73     return 0;
74     }
75    
76     static int anongame_infos_URL_destroy(char ** anongame_infos_URL)
77     {
78     int i;
79    
80     if (!(anongame_infos_URL))
81     {
82     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos_URL");
83     return -1;
84     }
85    
86     for (i=0; i <anongame_infos_URL_count; i++)
87     {
88     if (anongame_infos_URL[i])
89     {
90     xfree((void *)anongame_infos_URL[i]);
91     }
92     }
93    
94     xfree((void *) anongame_infos_URL);
95    
96     return 0;
97     }
98    
99     static t_anongame_infos_DESC *anongame_infos_DESC_init(void)
100     {
101     int i;
102     char ** descs;
103     t_anongame_infos_DESC *anongame_infos_DESC;
104    
105     anongame_infos_DESC = xmalloc(sizeof(t_anongame_infos_DESC));
106    
107     anongame_infos_DESC->langID = NULL;
108     descs = xmalloc(sizeof(char *)*anongame_infos_DESC_count);
109    
110     for (i=0; i<anongame_infos_DESC_count; i++)
111     descs[i] = NULL;
112    
113     anongame_infos_DESC->descs = descs;
114    
115     return anongame_infos_DESC;
116     }
117    
118     static int anongame_infos_DESC_destroy(t_anongame_infos_DESC * anongame_infos_DESC)
119     {
120     int i;
121     char ** descs;
122    
123     if (!(anongame_infos_DESC))
124     {
125     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos_DESC");
126     return -1;
127     }
128    
129     if (anongame_infos_DESC->langID)
130     xfree((void *) anongame_infos_DESC->langID);
131     if ((descs = anongame_infos_DESC->descs))
132     {
133     for (i=0; i<anongame_infos_DESC_count; i++)
134     {
135     if ((descs[i]))
136     free((void *)descs[i]);
137     }
138     xfree((void *)descs);
139     }
140    
141     xfree((void *) anongame_infos_DESC);
142    
143     return 0;
144     }
145    
146     static int anongame_infos_THUMBSDOWN_init(t_anongame_infos * anongame_infos)
147     {
148     char * anongame_infos_THUMBSDOWN;
149     int i;
150    
151     if (!(anongame_infos))
152     {
153     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos");
154     return -1;
155     }
156    
157     anongame_infos_THUMBSDOWN = anongame_infos->anongame_infos_THUMBSDOWN;
158    
159     for (i=0; i<anongame_infos_THUMBSDOWN_count;i++)
160     anongame_infos_THUMBSDOWN[i] = 0;
161    
162     return 0;
163     }
164    
165     static int anongame_infos_ICON_REQ_init(t_anongame_infos * anongame_infos)
166     {
167     int *anongame_infos_ICON_REQ;
168    
169     if (!(anongame_infos))
170     {
171     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos");
172     return -1;
173     }
174    
175     anongame_infos_ICON_REQ = anongame_infos->anongame_infos_ICON_REQ;
176    
177     anongame_infos_ICON_REQ[ICON_REQ_WAR3_Level1] = 25;
178     anongame_infos_ICON_REQ[ICON_REQ_WAR3_Level2] = 250;
179     anongame_infos_ICON_REQ[ICON_REQ_WAR3_Level3] = 500;
180     anongame_infos_ICON_REQ[ICON_REQ_WAR3_Level4] = 1500;
181    
182     anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level1] = 25;
183     anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level2] = 150;
184     anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level3] = 350;
185     anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level4] = 750;
186     anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level5] = 1500;
187    
188     anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level1] = 10;
189     anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level2] = 75;
190     anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level3] = 150;
191     anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level4] = 250;
192     anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level5] = 500;
193    
194     return 0;
195     }
196    
197     static t_anongame_infos_data_lang *anongame_infos_data_lang_init(char *langID)
198     {
199     t_anongame_infos_data_lang *anongame_infos_data_lang;
200    
201     anongame_infos_data_lang = xmalloc(sizeof(t_anongame_infos_data_lang));
202    
203     anongame_infos_data_lang->langID = xstrdup(langID);
204    
205     anongame_infos_data_lang->desc_data = NULL;
206     anongame_infos_data_lang->ladr_data = NULL;
207    
208     anongame_infos_data_lang->desc_comp_data = NULL;
209     anongame_infos_data_lang->ladr_comp_data = NULL;
210    
211     anongame_infos_data_lang->desc_len = 0;
212     anongame_infos_data_lang->ladr_len = 0;
213    
214     anongame_infos_data_lang->desc_comp_len = 0;
215     anongame_infos_data_lang->ladr_comp_len = 0;
216    
217     return anongame_infos_data_lang;
218     }
219    
220     static int anongame_infos_data_lang_destroy(t_anongame_infos_data_lang * anongame_infos_data_lang)
221     {
222     if (!(anongame_infos_data_lang))
223     {
224     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos_data_lang");
225     return -1;
226     }
227    
228     if (anongame_infos_data_lang->langID)
229     xfree((void *) anongame_infos_data_lang->langID);
230    
231     if (anongame_infos_data_lang->desc_data)
232     xfree((void *) anongame_infos_data_lang->desc_data);
233     if (anongame_infos_data_lang->ladr_data)
234     xfree((void *) anongame_infos_data_lang->ladr_data);
235    
236     if (anongame_infos_data_lang->desc_comp_data)
237     xfree((void *) anongame_infos_data_lang->desc_comp_data);
238     if (anongame_infos_data_lang->ladr_comp_data)
239     xfree((void *) anongame_infos_data_lang->ladr_comp_data);
240    
241     xfree((void *) anongame_infos_data_lang);
242    
243     return 0;
244     }
245    
246     static int anongame_infos_data_init(t_anongame_infos * anongame_infos)
247     {
248     t_anongame_infos_data *anongame_infos_data;
249     t_list *anongame_infos_data_lang;
250    
251     if (!(anongame_infos))
252     {
253     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos");
254     return -1;
255     }
256    
257     anongame_infos_data = xmalloc(sizeof(t_anongame_infos_data));
258    
259     anongame_infos_data_lang = list_create();
260    
261     anongame_infos_data->url_comp_data = NULL;
262     anongame_infos_data->url_comp_data_115 = NULL;
263     anongame_infos_data->map_comp_data = NULL;
264     anongame_infos_data->type_comp_data = NULL;
265     anongame_infos_data->desc_comp_data = NULL;
266     anongame_infos_data->ladr_comp_data = NULL;
267    
268     anongame_infos_data->url_comp_len = 0;
269     anongame_infos_data->url_comp_len_115 = 0;
270     anongame_infos_data->map_comp_len = 0;
271     anongame_infos_data->type_comp_len = 0;
272     anongame_infos_data->desc_comp_len = 0;
273     anongame_infos_data->ladr_comp_len = 0;
274    
275     anongame_infos->anongame_infos_data_war3 = anongame_infos_data;
276     anongame_infos->anongame_infos_data_lang_war3 = anongame_infos_data_lang;
277    
278     anongame_infos_data = xmalloc(sizeof(t_anongame_infos_data));
279    
280     anongame_infos_data_lang = list_create();
281    
282     anongame_infos_data->url_comp_data = NULL;
283     anongame_infos_data->url_comp_data_115 = NULL;
284     anongame_infos_data->map_comp_data = NULL;
285     anongame_infos_data->type_comp_data = NULL;
286     anongame_infos_data->desc_comp_data = NULL;
287     anongame_infos_data->ladr_comp_data = NULL;
288    
289     anongame_infos_data->url_comp_len = 0;
290     anongame_infos_data->url_comp_len_115 = 0;
291     anongame_infos_data->map_comp_len = 0;
292     anongame_infos_data->type_comp_len = 0;
293     anongame_infos_data->desc_comp_len = 0;
294     anongame_infos_data->ladr_comp_len = 0;
295    
296     anongame_infos->anongame_infos_data_w3xp = anongame_infos_data;
297     anongame_infos->anongame_infos_data_lang_w3xp = anongame_infos_data_lang;
298    
299     return 0;
300     }
301    
302     static int anongame_infos_data_destroy(t_anongame_infos_data * anongame_infos_data, t_list * anongame_infos_data_lang)
303     {
304     t_elem *curr;
305     t_anongame_infos_data_lang *entry;
306    
307     if (anongame_infos_data->url_comp_data)
308     xfree((void *) anongame_infos_data->url_comp_data);
309     if (anongame_infos_data->url_comp_data_115)
310     xfree((void *) anongame_infos_data->url_comp_data_115);
311     if (anongame_infos_data->map_comp_data)
312     xfree((void *) anongame_infos_data->map_comp_data);
313     if (anongame_infos_data->type_comp_data)
314     xfree((void *) anongame_infos_data->type_comp_data);
315     if (anongame_infos_data->desc_comp_data)
316     xfree((void *) anongame_infos_data->desc_comp_data);
317     if (anongame_infos_data->ladr_comp_data)
318     xfree((void *) anongame_infos_data->ladr_comp_data);
319    
320     xfree((void *) anongame_infos_data);
321    
322     if (anongame_infos_data_lang)
323     {
324     LIST_TRAVERSE(anongame_infos_data_lang, curr)
325     {
326     if (!(entry = elem_get_data(curr)))
327     eventlog(eventlog_level_error, __FUNCTION__, "found NULL entry in list");
328     else
329     {
330     anongame_infos_data_lang_destroy(entry);
331     }
332     list_remove_elem(anongame_infos_data_lang, &curr);
333     }
334     list_destroy(anongame_infos_data_lang);
335     }
336     return 0;
337     }
338    
339     t_anongame_infos *anongame_infos_init(void)
340     {
341     t_anongame_infos *anongame_infos;
342    
343     anongame_infos = xmalloc(sizeof(t_anongame_infos));
344    
345     if (anongame_infos_URL_init(anongame_infos) != 0)
346     {
347     xfree((void *) anongame_infos);
348     return NULL;
349     }
350    
351     if (anongame_infos_THUMBSDOWN_init(anongame_infos) != 0)
352     {
353     anongame_infos_URL_destroy(anongame_infos->anongame_infos_URL);
354     xfree((void *) anongame_infos);
355     return NULL;
356     }
357    
358     if (anongame_infos_ICON_REQ_init(anongame_infos) != 0)
359     {
360     anongame_infos_URL_destroy(anongame_infos->anongame_infos_URL);
361     xfree((void *) anongame_infos);
362     return NULL;
363     }
364    
365     if (anongame_infos_data_init(anongame_infos) != 0)
366     {
367     anongame_infos_URL_destroy(anongame_infos->anongame_infos_URL);
368     xfree((void *) anongame_infos);
369     return NULL;
370     }
371    
372     anongame_infos->anongame_infos_DESC = NULL;
373    
374     anongame_infos->anongame_infos_DESC_list = list_create();
375    
376     return anongame_infos;
377     }
378    
379     static int anongame_infos_destroy(t_anongame_infos * anongame_infos)
380     {
381     t_elem *curr;
382     t_anongame_infos_DESC *entry;
383    
384     if (!(anongame_infos))
385     {
386     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos");
387     return -1;
388     }
389    
390     if (anongame_infos->anongame_infos_DESC_list)
391     {
392     LIST_TRAVERSE(anongame_infos->anongame_infos_DESC_list, curr)
393     {
394     if (!(entry = elem_get_data(curr)))
395     eventlog(eventlog_level_error, __FUNCTION__, "found NULL entry in list");
396     else
397     {
398     anongame_infos_DESC_destroy(entry);
399     }
400     list_remove_elem(anongame_infos->anongame_infos_DESC_list, &curr);
401     }
402     list_destroy(anongame_infos->anongame_infos_DESC_list);
403     anongame_infos->anongame_infos_DESC_list = NULL;
404     }
405    
406     anongame_infos_DESC_destroy(anongame_infos->anongame_infos_DESC);
407     anongame_infos_URL_destroy(anongame_infos->anongame_infos_URL);
408     anongame_infos_data_destroy(anongame_infos->anongame_infos_data_war3, anongame_infos->anongame_infos_data_lang_war3);
409     anongame_infos_data_destroy(anongame_infos->anongame_infos_data_w3xp, anongame_infos->anongame_infos_data_lang_w3xp);
410    
411     xfree((void *) anongame_infos);
412    
413     return 0;
414     }
415    
416     static int anongame_infos_set_str(char **dst, char *src, char *errstr)
417     {
418     char *temp;
419    
420     if (!(src))
421     {
422     eventlog(eventlog_level_error, __FUNCTION__, "got NULL %s", errstr);
423     return -1;
424     }
425    
426     temp = xstrdup(src);
427     if (*dst)
428     xfree((void *) *dst);
429     *dst = temp;
430    
431     return 0;
432     }
433    
434     static int anongame_infos_URL_set_URL(int member, char *URL)
435     {
436     char **anongame_infos_URLs;
437    
438     if (!(anongame_infos_URLs = anongame_infos->anongame_infos_URL))
439     {
440     eventlog(eventlog_level_error, __FUNCTION__, "detected NULL anongame_infos_URL");
441     return -1;
442     }
443    
444     return anongame_infos_set_str(&anongame_infos_URLs[member], URL, "URL");
445     }
446    
447     extern char *anongame_infos_URL_get_URL(int member)
448     {
449     char **anongame_infos_URLs;
450    
451     if (!(anongame_infos_URLs = anongame_infos->anongame_infos_URL))
452     return NULL;
453     else return anongame_infos_URLs[member];
454     }
455    
456    
457     static int anongame_infos_DESC_set_DESC(t_anongame_infos_DESC * anongame_infos_DESC, int member, char *DESC)
458     {
459     char ** descs;
460    
461     if (!(anongame_infos_DESC))
462     {
463     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos_DESC");
464     return -1;
465     }
466    
467     if (!(descs = anongame_infos_DESC->descs))
468     {
469     eventlog(eventlog_level_error, __FUNCTION__, "anongame_infos_DESC had NULL descs");
470     return -1;
471     }
472    
473     return anongame_infos_set_str(&descs[member], DESC, "DESC");
474     }
475    
476     static t_anongame_infos_DESC *anongame_infos_get_anongame_infos_DESC_by_langID(t_anongame_infos * anongame_infos, char *langID)
477     {
478     t_elem *curr;
479     t_anongame_infos_DESC *entry;
480    
481     if (!(anongame_infos))
482     {
483     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos");
484     return NULL;
485     }
486    
487     if (!(langID))
488     return anongame_infos->anongame_infos_DESC;
489    
490     if (!(anongame_infos->anongame_infos_DESC_list))
491     {
492     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos_DESC_list - default values");
493     return anongame_infos->anongame_infos_DESC;
494     }
495    
496     LIST_TRAVERSE(anongame_infos->anongame_infos_DESC_list, curr)
497     {
498     if (!(entry = (t_anongame_infos_DESC *) elem_get_data(curr)))
499     eventlog(eventlog_level_error, __FUNCTION__, "found NULL entry in list");
500     else
501     {
502     if ((entry->langID) && (strcmp(entry->langID, langID) == 0))
503     return entry;
504     }
505     }
506    
507     return anongame_infos->anongame_infos_DESC;
508     }
509    
510     extern char *anongame_infos_DESC_get_DESC(char *langID, int member)
511     {
512     char *result;
513     t_anongame_infos_DESC * DESC;
514    
515     if ((DESC = anongame_infos_get_anongame_infos_DESC_by_langID(anongame_infos, langID)))
516     if ((DESC->descs) && (result = DESC->descs[member]))
517     return result;
518    
519     if ((DESC = anongame_infos->anongame_infos_DESC))
520     if ((DESC->descs) && (result = DESC->descs[member]))
521     return result;
522    
523     return NULL;
524     }
525    
526    
527     /**********/
528     extern char *anongame_infos_get_short_desc(char *langID, int queue)
529     {
530     int member = 0;
531    
532     switch (queue)
533     {
534     case ANONGAME_TYPE_1V1:
535     member = gametype_1v1_short;
536     break;
537     case ANONGAME_TYPE_2V2:
538     member = gametype_2v2_short;
539     break;
540     case ANONGAME_TYPE_3V3:
541     member = gametype_3v3_short;
542     break;
543     case ANONGAME_TYPE_4V4:
544     member = gametype_4v4_short;
545     break;
546     case ANONGAME_TYPE_5V5:
547     member = gametype_5v5_short;
548     break;
549     case ANONGAME_TYPE_6V6:
550     member = gametype_6v6_short;
551     break;
552     case ANONGAME_TYPE_2V2V2:
553     member = gametype_2v2v2_short;
554     break;
555     case ANONGAME_TYPE_3V3V3:
556     member = gametype_3v3v3_short;
557     break;
558     case ANONGAME_TYPE_4V4V4:
559     member = gametype_4v4v4_short;
560     break;
561     case ANONGAME_TYPE_2V2V2V2:
562     member = gametype_2v2v2v2_short;
563     break;
564     case ANONGAME_TYPE_3V3V3V3:
565     member = gametype_3v3v3v3_short;
566     break;
567     case ANONGAME_TYPE_SMALL_FFA:
568     member = gametype_sffa_short;
569     break;
570     case ANONGAME_TYPE_TEAM_FFA:
571     member = gametype_tffa_short;
572     break;
573     case ANONGAME_TYPE_AT_2V2:
574     member = gametype_2v2_short;
575     break;
576     case ANONGAME_TYPE_AT_3V3:
577     member = gametype_3v3_short;
578     break;
579     case ANONGAME_TYPE_AT_4V4:
580     member = gametype_4v4_short;
581     break;
582     case ANONGAME_TYPE_AT_2V2V2:
583     member = gametype_2v2v2_short;
584     break;
585     case ANONGAME_TYPE_TY:
586     return tournament_get_format();
587     default:
588     eventlog(eventlog_level_error, __FUNCTION__, "invalid queue (%d)", queue);
589     return NULL;
590     }
591     return anongame_infos_DESC_get_DESC(langID,member);
592     }
593    
594     extern char *anongame_infos_get_long_desc(char *langID, int queue)
595     {
596     int member = 0;
597    
598     switch (queue)
599     {
600     case ANONGAME_TYPE_1V1:
601     member = gametype_1v1_long;
602     break;
603     case ANONGAME_TYPE_2V2:
604     member = gametype_2v2_long;
605     break;
606     case ANONGAME_TYPE_3V3:
607     member = gametype_3v3_long;
608     break;
609     case ANONGAME_TYPE_4V4:
610     member = gametype_4v4_long;
611     break;
612     case ANONGAME_TYPE_5V5:
613     member = gametype_5v5_long;
614     break;
615     case ANONGAME_TYPE_6V6:
616     member = gametype_6v6_long;
617     break;
618     case ANONGAME_TYPE_2V2V2:
619     member = gametype_2v2v2_long;
620     break;
621     case ANONGAME_TYPE_3V3V3:
622     member = gametype_3v3v3_long;
623     break;
624     case ANONGAME_TYPE_4V4V4:
625     member = gametype_4v4v4_long;
626     break;
627     case ANONGAME_TYPE_2V2V2V2:
628     member = gametype_2v2v2v2_long;
629     break;
630     case ANONGAME_TYPE_3V3V3V3:
631     member = gametype_3v3v3v3_long;
632     break;
633     case ANONGAME_TYPE_SMALL_FFA:
634     member = gametype_sffa_long;
635     break;
636     case ANONGAME_TYPE_TEAM_FFA:
637     member = gametype_tffa_long;
638     break;
639     case ANONGAME_TYPE_AT_2V2:
640     member = gametype_2v2_long;
641     break;
642     case ANONGAME_TYPE_AT_3V3:
643     member = gametype_3v3_long;
644     break;
645     case ANONGAME_TYPE_AT_4V4:
646     member = gametype_4v4_long;
647     break;
648     case ANONGAME_TYPE_AT_2V2V2:
649     member = gametype_2v2v2_long;
650     break;
651     case ANONGAME_TYPE_TY:
652     return tournament_get_sponsor();;
653     default:
654     eventlog(eventlog_level_error, __FUNCTION__, "invalid queue (%d)", queue);
655     return NULL;
656     }
657     return anongame_infos_DESC_get_DESC(langID,member);
658     }
659    
660     /**********/
661     static int anongame_infos_THUMBSDOWN_set_THUMBSDOWN(char * anongame_infos_THUMBSDOWN, int member, char value)
662     {
663     if (!anongame_infos_THUMBSDOWN)
664     {
665     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos_THUMBSDOWN");
666     return -1;
667     }
668    
669     anongame_infos_THUMBSDOWN[member] = value;
670    
671     return 0;
672     }
673    
674     /**********/
675     extern char anongame_infos_get_thumbsdown(int queue)
676     {
677     int member = 0;
678     switch (queue)
679     {
680     case ANONGAME_TYPE_1V1:
681     member = PG_1v1;
682     break;
683     case ANONGAME_TYPE_2V2:
684     member = PG_2v2;
685     break;
686     case ANONGAME_TYPE_3V3:
687     member = PG_3v3;
688     break;
689     case ANONGAME_TYPE_4V4:
690     member = PG_4v4;
691     break;
692     case ANONGAME_TYPE_5V5:
693     member = PG_5v5;
694     break;
695     case ANONGAME_TYPE_6V6:
696     member = PG_6v6;
697     break;
698     case ANONGAME_TYPE_2V2V2:
699     member = PG_2v2v2;
700     break;
701     case ANONGAME_TYPE_3V3V3:
702     member = PG_3v3v3;
703     break;
704     case ANONGAME_TYPE_4V4V4:
705     member = PG_4v4v4;
706     break;
707     case ANONGAME_TYPE_2V2V2V2:
708     member = PG_2v2v2v2;
709     break;
710     case ANONGAME_TYPE_3V3V3V3:
711     member = PG_3v3v3v3;
712     break;
713     case ANONGAME_TYPE_SMALL_FFA:
714     member = PG_ffa;
715     break;
716     case ANONGAME_TYPE_TEAM_FFA:
717     member = AT_ffa;
718     break;
719     case ANONGAME_TYPE_AT_2V2:
720     member = AT_2v2;
721     break;
722     case ANONGAME_TYPE_AT_3V3:
723     member = AT_3v3;
724     break;
725     case ANONGAME_TYPE_AT_4V4:
726     member = AT_4v4;
727     break;
728     case ANONGAME_TYPE_AT_2V2V2:
729     member = AT_2v2v2;
730     break;
731     case ANONGAME_TYPE_TY:
732     return tournament_get_thumbs_down();
733     default:
734     eventlog(eventlog_level_error, __FUNCTION__, "invalid queue (%d)", queue);
735     return 1;
736     }
737     return anongame_infos->anongame_infos_THUMBSDOWN[member];
738     }
739    
740     /**********/
741    
742     static int anongame_infos_ICON_REQ_set_REQ(t_anongame_infos * anongame_infos, int member, int value)
743     {
744     int * anongame_infos_ICON_REQ;
745    
746     if (!anongame_infos)
747     {
748     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos");
749     return -1;
750     }
751    
752     anongame_infos_ICON_REQ = anongame_infos->anongame_infos_ICON_REQ;
753    
754     anongame_infos_ICON_REQ[member] = value;
755    
756     return 0;
757     }
758    
759     extern short anongame_infos_get_ICON_REQ_WAR3(int Level)
760     {
761     switch (Level)
762     {
763     case 0:
764     return 0;
765     case 1:
766     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_WAR3_Level1];
767     case 2:
768     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_WAR3_Level2];
769     case 3:
770     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_WAR3_Level3];
771     case 4:
772     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_WAR3_Level4];
773     default:
774     eventlog(eventlog_level_error, __FUNCTION__, "invalid Level (%d)", Level);
775     return -1;
776     }
777     }
778    
779     extern short anongame_infos_get_ICON_REQ_W3XP(int Level)
780     {
781     switch (Level)
782     {
783     case 0:
784     return 0;
785     case 1:
786     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level1];
787     case 2:
788     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level2];
789     case 3:
790     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level3];
791     case 4:
792     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level4];
793     case 5:
794     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_W3XP_Level5];
795     default:
796     eventlog(eventlog_level_error, __FUNCTION__, "invalid Level (%d)", Level);
797     return -1;
798     }
799     }
800    
801     extern short anongame_infos_get_ICON_REQ_TOURNEY(int Level)
802     {
803     switch (Level)
804     {
805     case 0:
806     return 0;
807     case 1:
808     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level1];
809     case 2:
810     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level2];
811     case 3:
812     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level3];
813     case 4:
814     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level4];
815     case 5:
816     return anongame_infos->anongame_infos_ICON_REQ[ICON_REQ_TRNY_Level5];
817     default:
818     eventlog(eventlog_level_error, __FUNCTION__, "invalid Level (%d)", Level);
819     return -1;
820     }
821     }
822    
823     /**********/
824    
825     extern char *anongame_infos_data_get_url(t_clienttag clienttag, int versionid, int *len)
826     {
827     if (clienttag==CLIENTTAG_WARCRAFT3_UINT)
828     {
829     if (versionid <= 0x0000000E)
830     {
831     (*len) = anongame_infos->anongame_infos_data_war3->url_comp_len;
832     return anongame_infos->anongame_infos_data_war3->url_comp_data;
833     } else
834     {
835     (*len) = anongame_infos->anongame_infos_data_war3->url_comp_len_115;
836     return anongame_infos->anongame_infos_data_war3->url_comp_data_115;
837     }
838     } else
839     {
840     if (versionid <= 0x0000000E)
841     {
842     (*len) = anongame_infos->anongame_infos_data_w3xp->url_comp_len;
843     return anongame_infos->anongame_infos_data_w3xp->url_comp_data;
844     } else
845     {
846     (*len) = anongame_infos->anongame_infos_data_w3xp->url_comp_len_115;
847     return anongame_infos->anongame_infos_data_w3xp->url_comp_data_115;
848     }
849     }
850     }
851    
852     extern char *anongame_infos_data_get_map(t_clienttag clienttag, int versionid, int *len)
853     {
854     if (clienttag==CLIENTTAG_WARCRAFT3_UINT)
855     {
856     (*len) = anongame_infos->anongame_infos_data_war3->map_comp_len;
857     return anongame_infos->anongame_infos_data_war3->map_comp_data;
858     } else
859     {
860     (*len) = anongame_infos->anongame_infos_data_w3xp->map_comp_len;
861     return anongame_infos->anongame_infos_data_w3xp->map_comp_data;
862     }
863     }
864    
865     extern char *anongame_infos_data_get_type(t_clienttag clienttag, int versionid, int *len)
866     {
867     if (clienttag==CLIENTTAG_WARCRAFT3_UINT)
868     {
869     (*len) = anongame_infos->anongame_infos_data_war3->type_comp_len;
870     return anongame_infos->anongame_infos_data_war3->type_comp_data;
871     } else
872     {
873     (*len) = anongame_infos->anongame_infos_data_w3xp->type_comp_len;
874     return anongame_infos->anongame_infos_data_w3xp->type_comp_data;
875     }
876     }
877    
878     extern char *anongame_infos_data_get_desc(char const *langID, t_clienttag clienttag, int versionid, int *len)
879     {
880     t_elem *curr;
881     t_anongame_infos_data_lang *entry;
882     if (clienttag==CLIENTTAG_WARCRAFT3_UINT)
883     {
884     if (langID != NULL)
885     {
886     LIST_TRAVERSE(anongame_infos->anongame_infos_data_lang_war3, curr)
887     {
888     if ((entry = elem_get_data(curr)) && strcmp(entry->langID, langID) == 0)
889     {
890     (*len) = entry->desc_comp_len;
891     return entry->desc_comp_data;
892     }
893     }
894     }
895     (*len) = anongame_infos->anongame_infos_data_war3->desc_comp_len;
896     return anongame_infos->anongame_infos_data_war3->desc_comp_data;
897     } else
898     {
899     if (langID != NULL)
900     {
901     LIST_TRAVERSE(anongame_infos->anongame_infos_data_lang_w3xp, curr)
902     {
903     if ((entry = elem_get_data(curr)) && strcmp(entry->langID, langID) == 0)
904     {
905     (*len) = entry->desc_comp_len;
906     return entry->desc_comp_data;
907     }
908     }
909     }
910     (*len) = anongame_infos->anongame_infos_data_w3xp->desc_comp_len;
911     return anongame_infos->anongame_infos_data_w3xp->desc_comp_data;
912     }
913     }
914    
915     extern char *anongame_infos_data_get_ladr(char const *langID, t_clienttag clienttag, int versionid, int *len)
916     {
917     t_elem *curr;
918     t_anongame_infos_data_lang *entry;
919     if (clienttag==CLIENTTAG_WARCRAFT3_UINT)
920     {
921     if (langID != NULL)
922     {
923     LIST_TRAVERSE(anongame_infos->anongame_infos_data_lang_war3, curr)
924     {
925     if ((entry = elem_get_data(curr)) && strcmp(entry->langID, langID) == 0)
926     {
927     (*len) = entry->ladr_comp_len;
928     return entry->ladr_comp_data;
929     }
930     }
931     }
932     (*len) = anongame_infos->anongame_infos_data_war3->ladr_comp_len;
933     return anongame_infos->anongame_infos_data_war3->ladr_comp_data;
934     } else
935     {
936     if (langID != NULL)
937     {
938     LIST_TRAVERSE(anongame_infos->anongame_infos_data_lang_w3xp, curr)
939     {
940     if ((entry = elem_get_data(curr)) && strcmp(entry->langID, langID) == 0)
941     {
942     (*len) = entry->ladr_comp_len;
943     return entry->ladr_comp_data;
944     }
945     }
946     }
947     (*len) = anongame_infos->anongame_infos_data_w3xp->ladr_comp_len;
948     return anongame_infos->anongame_infos_data_w3xp->ladr_comp_data;
949     }
950     }
951    
952     /**********/
953    
954     static void anongame_infos_set_defaults(t_anongame_infos * anongame_infos)
955     {
956     char ** anongame_infos_URL;
957     t_anongame_infos_DESC *anongame_infos_DESC;
958     char ** anongame_infos_DESCs;
959    
960    
961     if (!(anongame_infos))
962     {
963     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos");
964     return;
965     }
966    
967     anongame_infos_URL = anongame_infos->anongame_infos_URL;
968     anongame_infos_DESC = anongame_infos->anongame_infos_DESC;
969    
970     if (!(anongame_infos_URL))
971     {
972     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos_URL, trying to init");
973     if (anongame_infos_URL_init(anongame_infos) != 0)
974     {
975     eventlog(eventlog_level_error, __FUNCTION__, "failed to init... PANIC!");
976     return;
977     }
978     }
979    
980     if (!(anongame_infos_DESC))
981     {
982     eventlog(eventlog_level_error, __FUNCTION__, "got NULL anongame_infos_DESC, trying to init");
983     if (!(anongame_infos_DESC = anongame_infos_DESC_init()))
984     {
985     eventlog(eventlog_level_error, __FUNCTION__, "failed to init... PANIC!");
986     return;
987     } else
988     anongame_infos->anongame_infos_DESC = anongame_infos_DESC;
989     }
990     // now set default values
991    
992     if (!(anongame_infos_URL[URL_server]))
993     anongame_infos_URL_set_URL(URL_server, PVPGN_DEFAULT_URL);
994     if (!(anongame_infos_URL[URL_player]))
995     anongame_infos_URL_set_URL(URL_player, PVPGN_DEFAULT_URL);
996     if (!(anongame_infos_URL[URL_tourney]))
997     anongame_infos_URL_set_URL(URL_tourney, PVPGN_DEFAULT_URL);
998     if (!(anongame_infos_URL[URL_clan]))
999     anongame_infos_URL_set_URL(URL_clan, PVPGN_DEFAULT_URL);
1000     if (!(anongame_infos_URL[URL_ladder_PG_1v1]))
1001     anongame_infos_URL_set_URL(URL_ladder_PG_1v1, PVPGN_DEFAULT_URL);
1002     if (!(anongame_infos_URL[URL_ladder_PG_ffa]))
1003     anongame_infos_URL_set_URL(URL_ladder_PG_ffa, PVPGN_DEFAULT_URL);
1004     if (!(anongame_infos_URL[URL_ladder_PG_team]))
1005     anongame_infos_URL_set_URL(URL_ladder_PG_team, PVPGN_DEFAULT_URL);
1006     if (!(anongame_infos_URL[URL_ladder_AT_2v2]))
1007     anongame_infos_URL_set_URL(URL_ladder_AT_2v2, PVPGN_DEFAULT_URL);
1008     if (!(anongame_infos_URL[URL_ladder_AT_3v3]))
1009     anongame_infos_URL_set_URL(URL_ladder_AT_3v3, PVPGN_DEFAULT_URL);
1010     if (!(anongame_infos_URL[URL_ladder_AT_4v4]))
1011     anongame_infos_URL_set_URL(URL_ladder_AT_4v4, PVPGN_DEFAULT_URL);
1012     if (!(anongame_infos_URL[URL_ladder_clan_1v1]))
1013     anongame_infos_URL_set_URL(URL_ladder_clan_1v1, PVPGN_DEFAULT_URL);
1014     if (!(anongame_infos_URL[URL_ladder_clan_2v2]))
1015     anongame_infos_URL_set_URL(URL_ladder_clan_2v2, PVPGN_DEFAULT_URL);
1016     if (!(anongame_infos_URL[URL_ladder_clan_3v3]))
1017     anongame_infos_URL_set_URL(URL_ladder_clan_3v3, PVPGN_DEFAULT_URL);
1018     if (!(anongame_infos_URL[URL_ladder_clan_4v4]))
1019     anongame_infos_URL_set_URL(URL_ladder_clan_4v4, PVPGN_DEFAULT_URL);
1020    
1021     if (!(anongame_infos_DESCs = anongame_infos_DESC->descs))
1022     return;
1023    
1024     if (!(anongame_infos_DESCs[ladder_PG_1v1_desc]))
1025     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_PG_1v1_desc, PVPGN_PG_1V1_DESC);
1026     if (!(anongame_infos_DESCs[ladder_PG_ffa_desc]))
1027     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_PG_ffa_desc, PVPGN_PG_FFA_DESC);
1028     if (!(anongame_infos_DESCs[ladder_PG_team_desc]))
1029     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_PG_team_desc, PVPGN_PG_TEAM_DESC);
1030     if (!(anongame_infos_DESCs[ladder_AT_2v2_desc]))
1031     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_AT_2v2_desc, PVPGN_AT_2V2_DESC);
1032     if (!(anongame_infos_DESCs[ladder_AT_3v3_desc]))
1033     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_AT_3v3_desc, PVPGN_AT_3V3_DESC);
1034     if (!(anongame_infos_DESCs[ladder_AT_4v4_desc]))
1035     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_AT_4v4_desc, PVPGN_AT_4V4_DESC);
1036     if (!(anongame_infos_DESCs[ladder_clan_1v1_desc]))
1037     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_clan_1v1_desc, PVPGN_CLAN_1V1_DESC);
1038     if (!(anongame_infos_DESCs[ladder_clan_2v2_desc]))
1039     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_clan_2v2_desc, PVPGN_CLAN_2V2_DESC);
1040     if (!(anongame_infos_DESCs[ladder_clan_3v3_desc]))
1041     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_clan_3v3_desc, PVPGN_CLAN_3V3_DESC);
1042     if (!(anongame_infos_DESCs[ladder_clan_4v4_desc]))
1043     anongame_infos_DESC_set_DESC(anongame_infos_DESC, ladder_clan_4v4_desc, PVPGN_CLAN_4V4_DESC);
1044    
1045     if (!(anongame_infos_DESCs[gametype_1v1_short]))
1046     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_1v1_short, PVPGN_1V1_GT_DESC);
1047     if (!(anongame_infos_DESCs[gametype_1v1_long]))
1048     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_1v1_long, PVPGN_1V1_GT_LONG);
1049     if (!(anongame_infos_DESCs[gametype_2v2_short]))
1050     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_2v2_short, PVPGN_2V2_GT_DESC);
1051     if (!(anongame_infos_DESCs[gametype_2v2_long]))
1052     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_2v2_long, PVPGN_2V2_GT_LONG);
1053     if (!(anongame_infos_DESCs[gametype_3v3_short]))
1054     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_3v3_short, PVPGN_3V3_GT_DESC);
1055     if (!(anongame_infos_DESCs[gametype_3v3_long]))
1056     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_3v3_long, PVPGN_3V3_GT_LONG);
1057     if (!(anongame_infos_DESCs[gametype_4v4_short]))
1058     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_4v4_short, PVPGN_4V4_GT_DESC);
1059     if (!(anongame_infos_DESCs[gametype_4v4_long]))
1060     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_4v4_long, PVPGN_4V4_GT_LONG);
1061     if (!(anongame_infos_DESCs[gametype_sffa_short]))
1062     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_sffa_short, PVPGN_SFFA_GT_DESC);
1063     if (!(anongame_infos_DESCs[gametype_sffa_long]))
1064     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_sffa_long, PVPGN_SFFA_GT_LONG);
1065     if (!(anongame_infos_DESCs[gametype_tffa_short]))
1066     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_tffa_short, PVPGN_TFFA_GT_DESC);
1067     if (!(anongame_infos_DESCs[gametype_tffa_long]))
1068     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_tffa_long, PVPGN_TFFA_GT_LONG);
1069     if (!(anongame_infos_DESCs[gametype_2v2v2_short]))
1070     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_2v2v2_short, PVPGN_2V2V2_GT_DESC);
1071     if (!(anongame_infos_DESCs[gametype_2v2v2_long]))
1072     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_2v2v2_long, PVPGN_2V2V2_GT_LONG);
1073     if (!(anongame_infos_DESCs[gametype_3v3v3_short]))
1074     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_3v3v3_short, PVPGN_3V3V3_GT_DESC);
1075     if (!(anongame_infos_DESCs[gametype_3v3v3_long]))
1076     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_3v3v3_long, PVPGN_3V3V3_GT_LONG);
1077     if (!(anongame_infos_DESCs[gametype_4v4v4_short]))
1078     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_4v4v4_short, PVPGN_4V4V4_GT_DESC);
1079     if (!(anongame_infos_DESCs[gametype_4v4v4_long]))
1080     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_4v4v4_long, PVPGN_4V4V4_GT_LONG);
1081     if (!(anongame_infos_DESCs[gametype_2v2v2v2_short]))
1082     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_2v2v2v2_short, PVPGN_2V2V2V2_GT_DESC);
1083     if (!(anongame_infos_DESCs[gametype_2v2v2v2_long]))
1084     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_2v2v2v2_long, PVPGN_2V2V2V2_GT_LONG);
1085     if (!(anongame_infos_DESCs[gametype_3v3v3v3_short]))
1086     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_3v3v3v3_short, PVPGN_3V3V3V3_GT_DESC);
1087     if (!(anongame_infos_DESCs[gametype_3v3v3v3_long]))
1088     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_3v3v3v3_long, PVPGN_3V3V3V3_GT_LONG);
1089     if (!(anongame_infos_DESCs[gametype_5v5_short]))
1090     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_5v5_short, PVPGN_5V5_GT_DESC);
1091     if (!(anongame_infos_DESCs[gametype_5v5_long]))
1092     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_5v5_long, PVPGN_5V5_GT_LONG);
1093     if (!(anongame_infos_DESCs[gametype_6v6_short]))
1094     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_6v6_short, PVPGN_6V6_GT_DESC);
1095     if (!(anongame_infos_DESCs[gametype_6v6_long]))
1096     anongame_infos_DESC_set_DESC(anongame_infos_DESC, gametype_6v6_long, PVPGN_6V6_GT_LONG);
1097    
1098    
1099     }
1100    
1101     typedef struct {
1102     const char *anongame_infos_URL_string;
1103     int member;
1104     } t_anongame_infos_URL_table_row;
1105    
1106     typedef struct {
1107     const char *anongame_infos_DESC_string;
1108     int member;
1109     } t_anongame_infos_DESC_table_row;
1110    
1111     typedef struct {
1112     const char *anongame_infos_THUMBSDOWN_string;
1113     int member;
1114     } t_anongame_infos_THUMBSDOWN_table_row;
1115    
1116     typedef struct {
1117     const char *anongame_infos_ICON_REQ_WAR3_string;
1118     int member;
1119     } t_anongame_infos_ICON_REQ_WAR3_table_row;
1120    
1121     typedef struct {
1122     const char *anongame_infos_ICON_REQ_W3XP_string;
1123     int member;
1124     } t_anongame_infos_ICON_REQ_W3XP_table_row;
1125    
1126     typedef struct {
1127     const char *anongame_infos_ICON_REQ_TOURNEY_string;
1128     int member;
1129     } t_anongame_infos_ICON_REQ_TOURNEY_table_row;
1130    
1131    
1132     static const t_anongame_infos_URL_table_row URL_handler_table[] = {
1133     {"server_URL", URL_server},
1134     {"player_URL", URL_player},
1135     {"tourney_URL", URL_tourney},
1136     {"clan_URL", URL_clan},
1137     {"ladder_PG_1v1_URL", URL_ladder_PG_1v1},
1138     {"ladder_PG_ffa_URL", URL_ladder_PG_ffa},
1139     {"ladder_PG_team_URL", URL_ladder_PG_team},
1140     {"ladder_AT_2v2_URL", URL_ladder_AT_2v2},
1141     {"ladder_AT_3v3_URL", URL_ladder_AT_3v3},
1142     {"ladder_AT_4v4_URL", URL_ladder_AT_4v4},
1143     {"ladder_clan_1v1_URL", URL_ladder_clan_1v1},
1144     {"ladder_clan_2v2_URL", URL_ladder_clan_2v2},
1145     {"ladder_clan_3v3_URL", URL_ladder_clan_3v3},
1146     {"ladder_clan_4v4_URL", URL_ladder_clan_4v4},
1147     {NULL, -1}
1148     };
1149    
1150     static const t_anongame_infos_DESC_table_row DESC_handler_table[] = {
1151     {"ladder_PG_1v1_desc", ladder_PG_1v1_desc},
1152     {"ladder_PG_ffa_desc", ladder_PG_ffa_desc},
1153     {"ladder_PG_team_desc", ladder_PG_team_desc},
1154     {"ladder_AT_2v2_desc", ladder_AT_2v2_desc},
1155     {"ladder_AT_3v3_desc", ladder_AT_3v3_desc},
1156     {"ladder_AT_4v4_desc", ladder_AT_4v4_desc},
1157     {"ladder_clan_1v1_desc", ladder_clan_1v1_desc},
1158     {"ladder_clan_2v2_desc", ladder_clan_2v2_desc},
1159     {"ladder_clan_3v3_desc", ladder_clan_3v3_desc},
1160     {"ladder_clan_4v4_desc", ladder_clan_4v4_desc},
1161    
1162     {"gametype_1v1_short", gametype_1v1_short},
1163     {"gametype_1v1_long", gametype_1v1_long},
1164     {"gametype_2v2_short", gametype_2v2_short},
1165     {"gametype_2v2_long", gametype_2v2_long},
1166     {"gametype_3v3_short", gametype_3v3_short},
1167     {"gametype_3v3_long", gametype_3v3_long},
1168     {"gametype_4v4_short", gametype_4v4_short},
1169     {"gametype_4v4_long", gametype_4v4_long},
1170     {"gametype_sffa_short", gametype_sffa_short},
1171     {"gametype_sffa_long", gametype_sffa_long},
1172     {"gametype_tffa_short", gametype_tffa_short},
1173     {"gametype_tffa_long", gametype_tffa_long},
1174     {"gametype_2v2v2_short", gametype_2v2v2_short},
1175     {"gametype_2v2v2_long", gametype_2v2v2_long},
1176     {"gametype_3v3v3_short", gametype_3v3v3_short},
1177     {"gametype_3v3v3_long", gametype_3v3v3_long},
1178     {"gametype_4v4v4_short", gametype_4v4v4_short},
1179     {"gametype_4v4v4_long", gametype_4v4v4_long},
1180     {"gametype_2v2v2v2_short", gametype_2v2v2v2_short},
1181     {"gametype_2v2v2v2_long", gametype_2v2v2v2_long},
1182     {"gametype_3v3v3v3_short", gametype_3v3v3v3_short},
1183     {"gametype_3v3v3v3_long", gametype_3v3v3v3_long},
1184     {"gametype_5v5_short", gametype_5v5_short},
1185     {"gametype_5v5_long", gametype_5v5_long},
1186     {"gametype_6v6_short", gametype_6v6_short},
1187     {"gametype_6v6_long", gametype_6v6_long},
1188    
1189     {NULL, -1}
1190     };
1191    
1192     static const t_anongame_infos_THUMBSDOWN_table_row THUMBSDOWN_handler_table[] = {
1193     {"PG_1v1", PG_1v1},
1194     {"PG_2v2", PG_2v2},
1195     {"PG_3v3", PG_3v3},
1196     {"PG_4v4", PG_4v4},
1197     {"PG_ffa", PG_ffa},
1198     {"AT_2v2", AT_2v2},
1199     {"AT_3v3", AT_3v3},
1200     {"AT_4v4", AT_4v4},
1201     {"AT_ffa", AT_ffa},
1202     {"PG_5v5", PG_5v5},
1203     {"PG_6v6", PG_6v6},
1204     {"PG_2v2v2", PG_2v2v2},
1205     {"PG_3v3v3", PG_3v3v3},
1206     {"PG_4v4v4", PG_4v4v4},
1207     {"PG_2v2v2v2", PG_2v2v2v2},
1208     {"PG_3v3v3v3", PG_3v3v3v3},
1209     {"AT_2v2v2", AT_2v2v2},
1210    
1211     {NULL, -1}
1212     };
1213    
1214     static const t_anongame_infos_ICON_REQ_WAR3_table_row ICON_REQ_WAR3_handler_table[] = {
1215     {"Level1", ICON_REQ_WAR3_Level1},
1216     {"Level2", ICON_REQ_WAR3_Level2},
1217     {"Level3", ICON_REQ_WAR3_Level3},
1218     {"Level4", ICON_REQ_WAR3_Level4},
1219     {NULL, -1}
1220     };
1221    
1222     static const t_anongame_infos_ICON_REQ_W3XP_table_row ICON_REQ_W3XP_handler_table[] = {
1223     {"Level1", ICON_REQ_W3XP_Level1},
1224     {"Level2", ICON_REQ_W3XP_Level2},
1225     {"Level3", ICON_REQ_W3XP_Level3},
1226     {"Level4", ICON_REQ_W3XP_Level4},
1227     {"Level5", ICON_REQ_W3XP_Level5},
1228     {NULL, -1}
1229     };
1230    
1231     static const t_anongame_infos_ICON_REQ_TOURNEY_table_row ICON_REQ_TOURNEY_handler_table[] = {
1232     {"Level1", ICON_REQ_TRNY_Level1},
1233     {"Level2", ICON_REQ_TRNY_Level2},
1234     {"Level3", ICON_REQ_TRNY_Level3},
1235     {"Level4", ICON_REQ_TRNY_Level4},
1236     {"Level5", ICON_REQ_TRNY_Level5},
1237     {NULL, -1}
1238     };
1239    
1240     typedef enum {
1241     parse_UNKNOWN,
1242     parse_URL,
1243     parse_DESC,
1244     parse_THUMBSDOWN,
1245     parse_ICON_REQ_WAR3,
1246     parse_ICON_REQ_W3XP,
1247     parse_ICON_REQ_TOURNEY
1248     } t_parse_mode;
1249    
1250     typedef enum {
1251     changed,
1252     unchanged
1253     } t_parse_state;
1254    
1255     static t_parse_mode switch_parse_mode(char *text, char *langID)
1256     {
1257     if (!(text))
1258     return parse_UNKNOWN;
1259     else if (strcmp(text, "[URL]") == 0)
1260     return parse_URL;
1261     else if (strcmp(text, "[THUMBS_DOWN_LIMIT]") == 0)
1262     return parse_THUMBSDOWN;
1263     else if (strcmp(text, "[ICON_REQUIRED_RACE_WINS_WAR3]") == 0)
1264     return parse_ICON_REQ_WAR3;
1265     else if (strcmp(text, "[ICON_REQUIRED_RACE_WINS_W3XP]") == 0)
1266     return parse_ICON_REQ_W3XP;
1267     else if (strcmp(text, "[ICON_REQUIRED_TOURNEY_WINS]") == 0)
1268     return parse_ICON_REQ_TOURNEY;
1269     else if (strcmp(text, "[DEFAULT_DESC]") == 0)
1270     {
1271     langID[0] = '\0';
1272     return parse_DESC;
1273     } else if (strlen(text) == 6)
1274     {
1275     strncpy(langID, &(text[1]), 4);
1276     langID[4] = '\0';
1277     return parse_DESC;
1278     } else
1279     eventlog(eventlog_level_error, __FUNCTION__, "got invalid section name: %s", text);
1280     return parse_UNKNOWN;
1281     }
1282    
1283     extern int anongame_infos_load(char const *filename)
1284     {
1285     unsigned int line;
1286     unsigned int pos;
1287     char *buff;
1288     char *temp;
1289     char langID[5];
1290     t_parse_mode parse_mode = parse_UNKNOWN;
1291     t_parse_state parse_state = unchanged;
1292     t_anongame_infos_DESC *anongame_infos_DESC = NULL;
1293     char *pointer;
1294     char *variable;
1295     char *value = NULL;
1296     t_anongame_infos_DESC_table_row const *DESC_table_row;
1297     t_anongame_infos_URL_table_row const *URL_table_row;
1298     t_anongame_infos_THUMBSDOWN_table_row const *THUMBSDOWN_table_row;
1299     t_anongame_infos_ICON_REQ_WAR3_table_row const *ICON_REQ_WAR3_table_row;
1300     t_anongame_infos_ICON_REQ_W3XP_table_row const *ICON_REQ_W3XP_table_row;
1301     t_anongame_infos_ICON_REQ_TOURNEY_table_row const *ICON_REQ_TOURNEY_table_row;
1302     int int_value;
1303     char char_value;
1304    
1305     langID[0] = '\0';
1306    
1307     if (!filename)
1308     {
1309     eventlog(eventlog_level_error, __FUNCTION__, "got NULL filename");
1310     return -1;
1311     }
1312    
1313     if (!(anongame_infos = anongame_infos_init()))
1314     {
1315     eventlog(eventlog_level_error, __FUNCTION__, "could not init anongame_infos");
1316     return -1;
1317     }
1318    
1319     if (!(fp = fopen(filename, "r")))
1320     {
1321     eventlog(eventlog_level_error, "anongameinfo_load", "could not open file \"%s\" for reading (fopen: %s)", filename, pstrerror(errno));
1322     anongame_infos_destroy(anongame_infos);
1323     return -1;
1324     }
1325    
1326     for (line = 1; (buff = file_get_line(fp)); line++)
1327     {
1328     for (pos = 0; buff[pos] == '\t' || buff[pos] == ' '; pos++);
1329     if (buff[pos] == '\0' || buff[pos] == '#')
1330     {
1331     continue;
1332     }
1333     if ((temp = strrchr(buff, '#')))
1334     {
1335     unsigned int len;
1336     unsigned int endpos;
1337    
1338     *temp = '\0';
1339     len = strlen(buff) + 1;
1340     for (endpos = len - 1; buff[endpos] == '\t' || buff[endpos] == ' '; endpos--);
1341     buff[endpos + 1] = '\0';
1342     }
1343    
1344     if ((buff[0] == '[') && (buff[strlen(buff) - 1] == ']'))
1345     {
1346     if ((parse_state == unchanged) && (anongame_infos_DESC != NULL))
1347     {
1348     if (langID[0] != '\0')
1349     list_append_data(anongame_infos->anongame_infos_DESC_list, anongame_infos_DESC);
1350     else
1351     {
1352     if (anongame_infos->anongame_infos_DESC == NULL)
1353     anongame_infos->anongame_infos_DESC = anongame_infos_DESC;
1354     else
1355     {
1356     eventlog(eventlog_level_error, __FUNCTION__, "found another default_DESC block, deleting previous");
1357     anongame_infos_DESC_destroy(anongame_infos->anongame_infos_DESC);
1358     anongame_infos->anongame_infos_DESC = anongame_infos_DESC;
1359     }
1360     }
1361     anongame_infos_DESC = NULL;
1362     }
1363     parse_mode = switch_parse_mode(buff, langID);
1364     parse_state = changed;
1365     } else if (buff[0] != '\0')
1366     switch (parse_mode)
1367     {
1368     case parse_UNKNOWN:
1369     {
1370     if ((buff[0] != '[') || (buff[strlen(buff) - 1] != ']'))
1371     {
1372     eventlog(eventlog_level_error, __FUNCTION__, "expected [] section start, but found %s on line %u", buff, line);
1373     } else
1374     {
1375     parse_mode = switch_parse_mode(buff, langID);
1376     parse_state = changed;
1377     }
1378     break;
1379     }
1380     case parse_URL:
1381     {
1382     parse_state = unchanged;
1383     variable = buff;
1384     pointer = strchr(variable, '=');
1385     for (pointer--; pointer[0] == ' '; pointer--);
1386     pointer[1] = '\0';
1387     pointer++;
1388     pointer++;
1389     pointer = strchr(pointer, '\"');
1390     pointer++;
1391     value = pointer;
1392     pointer = strchr(pointer, '\"');
1393     pointer[0] = '\0';
1394    
1395     for (URL_table_row = URL_handler_table; URL_table_row->anongame_infos_URL_string != NULL; URL_table_row++)
1396     if (strcmp(URL_table_row->anongame_infos_URL_string, variable) == 0)
1397     {
1398     if (URL_table_row->member != -1)
1399     anongame_infos_URL_set_URL(URL_table_row->member, value);
1400     }
1401    
1402     break;
1403     }
1404     case parse_DESC:
1405     {
1406     if (parse_state == changed)
1407     {
1408     anongame_infos_DESC = anongame_infos_DESC_init();
1409     parse_state = unchanged;
1410     eventlog(eventlog_level_info, __FUNCTION__, "got langID: [%s]", langID);
1411     if (langID[0] != '\0')
1412     anongame_infos_DESC->langID = xstrdup(langID);
1413     }
1414    
1415     variable = buff;
1416     pointer = strchr(variable, '=');
1417     for (pointer--; pointer[0] == ' '; pointer--);
1418     pointer[1] = '\0';
1419     pointer++;
1420     pointer++;
1421     pointer = strchr(pointer, '\"');
1422     pointer++;
1423     value = pointer;
1424     pointer = strchr(pointer, '\"');
1425     pointer[0] = '\0';
1426    
1427     for (DESC_table_row = DESC_handler_table; DESC_table_row->anongame_infos_DESC_string != NULL; DESC_table_row++)
1428     if (strcmp(DESC_table_row->anongame_infos_DESC_string, variable) == 0)
1429     {
1430     if (DESC_table_row->member != -1)
1431     anongame_infos_DESC_set_DESC(anongame_infos_DESC, DESC_table_row->member, value);
1432     }
1433     break;
1434     }
1435     case parse_THUMBSDOWN:
1436     {
1437     parse_state = unchanged;
1438     variable = buff;
1439     pointer = strchr(variable, '=');
1440     for (pointer--; pointer[0] == ' '; pointer--);
1441     pointer[1] = '\0';
1442     pointer++;
1443     pointer++;
1444     pointer = strchr(pointer, '=');
1445     pointer++;
1446     int_value = atoi(pointer);
1447     if (int_value < 0)
1448     int_value = 0;
1449     if (int_value > 127)
1450     int_value = 127;
1451     char_value = (char) int_value;
1452    
1453     for (THUMBSDOWN_table_row = THUMBSDOWN_handler_table; THUMBSDOWN_table_row->anongame_infos_THUMBSDOWN_string != NULL; THUMBSDOWN_table_row++)
1454     if (strcmp(THUMBSDOWN_table_row->anongame_infos_THUMBSDOWN_string, variable) == 0)
1455     {
1456     if (THUMBSDOWN_table_row->member != -1)
1457     anongame_infos_THUMBSDOWN_set_THUMBSDOWN(anongame_infos->anongame_infos_THUMBSDOWN,
1458     THUMBSDOWN_table_row->member,char_value);
1459     }
1460     break;
1461     }
1462     case parse_ICON_REQ_WAR3:
1463     {
1464     parse_state = unchanged;
1465     variable = buff;
1466     pointer = strchr(variable, '=');
1467     for (pointer--; pointer[0] == ' '; pointer--);
1468     pointer[1] = '\0';
1469     pointer++;
1470     pointer++;
1471     pointer = strchr(pointer, '=');
1472     pointer++;
1473     int_value = atoi(pointer);
1474     if (int_value < 0)
1475     int_value = 0;
1476    
1477     for (ICON_REQ_WAR3_table_row = ICON_REQ_WAR3_handler_table; ICON_REQ_WAR3_table_row->anongame_infos_ICON_REQ_WAR3_string != NULL; ICON_REQ_WAR3_table_row++)
1478     if (strcmp(ICON_REQ_WAR3_table_row->anongame_infos_ICON_REQ_WAR3_string, variable) == 0)
1479     {
1480     if (ICON_REQ_WAR3_table_row->member != -1)
1481     anongame_infos_ICON_REQ_set_REQ(anongame_infos,ICON_REQ_WAR3_table_row->member,int_value);
1482     }
1483     break;
1484     }
1485     case parse_ICON_REQ_W3XP:
1486     {
1487     parse_state = unchanged;
1488     variable = buff;
1489     pointer = strchr(variable, '=');
1490     for (pointer--; pointer[0] == ' '; pointer--);
1491     pointer[1] = '\0';
1492     pointer++;
1493     pointer++;
1494     pointer = strchr(pointer, '=');
1495     pointer++;
1496     int_value = atoi(pointer);
1497     if (int_value < 0)
1498     int_value = 0;
1499    
1500     for (ICON_REQ_W3XP_table_row = ICON_REQ_W3XP_handler_table; ICON_REQ_W3XP_table_row->anongame_infos_ICON_REQ_W3XP_string != NULL; ICON_REQ_W3XP_table_row++)
1501     if (strcmp(ICON_REQ_W3XP_table_row->anongame_infos_ICON_REQ_W3XP_string, variable) == 0)
1502     {
1503     if (ICON_REQ_W3XP_table_row->member != -1)
1504     anongame_infos_ICON_REQ_set_REQ(anongame_infos,ICON_REQ_W3XP_table_row->member,int_value);
1505     }
1506     break;
1507     }
1508     case parse_ICON_REQ_TOURNEY:
1509     {
1510     parse_state = unchanged;
1511     variable = buff;
1512     pointer = strchr(variable, '=');
1513     for (pointer--; pointer[0] == ' '; pointer--);
1514     pointer[1] = '\0';
1515     pointer++;
1516     pointer++;
1517     pointer = strchr(pointer, '=');
1518     pointer++;
1519     int_value = atoi(pointer);
1520     if (int_value < 0)
1521     int_value = 0;
1522    
1523     for (ICON_REQ_TOURNEY_table_row = ICON_REQ_TOURNEY_handler_table; ICON_REQ_TOURNEY_table_row->anongame_infos_ICON_REQ_TOURNEY_string != NULL; ICON_REQ_TOURNEY_table_row++)
1524     if (strcmp(ICON_REQ_TOURNEY_table_row->anongame_infos_ICON_REQ_TOURNEY_string, variable) == 0)
1525     {
1526     if (ICON_REQ_TOURNEY_table_row->member != -1)
1527     anongame_infos_ICON_REQ_set_REQ(anongame_infos,ICON_REQ_TOURNEY_table_row->member,int_value);
1528     }
1529     break;
1530     }
1531     }
1532     }
1533    
1534     if (anongame_infos_DESC)
1535     {
1536     if (langID[0] != '\0')
1537     {
1538     list_append_data(anongame_infos->anongame_infos_DESC_list, anongame_infos_DESC);
1539     } else
1540     {
1541     if (anongame_infos->anongame_infos_DESC == NULL)
1542     anongame_infos->anongame_infos_DESC = anongame_infos_DESC;
1543     else
1544     {
1545     eventlog(eventlog_level_error, __FUNCTION__, "found another default_DESC block, deleting previous");
1546     anongame_infos_DESC_destroy(anongame_infos->anongame_infos_DESC);
1547     anongame_infos->anongame_infos_DESC = anongame_infos_DESC;
1548     }
1549     }
1550     }
1551    
1552     file_get_line(NULL); // clear file_get_line buffer
1553     fclose(fp);
1554    
1555     anongame_infos_set_defaults(anongame_infos);
1556     anongame_infos_data_load();
1557     return 0;
1558     }
1559    
1560     static int anongame_infos_data_load(void)
1561     {
1562     t_elem *curr;
1563     t_packet *raw;
1564     int j, k, size;
1565     char ladr_count = 0;
1566     char desc_count;
1567     char mapscount_total;
1568     char value;
1569     char PG_gamestyles;
1570     char AT_gamestyles;
1571     char TY_gamestyles;
1572    
1573     char anongame_prefix[ANONGAME_TYPES][5] = { /* queue */
1574     /* PG 1v1 */ {0x00, 0x00, 0x03, 0x3F, 0x00}, /* 0 */
1575     /* PG 2v2 */ {0x01, 0x00, 0x02, 0x3F, 0x00}, /* 1 */
1576     /* PG 3v3 */ {0x02, 0x00, 0x01, 0x3F, 0x00}, /* 2 */
1577     /* PG 4v4 */ {0x03, 0x00, 0x01, 0x3F, 0x00}, /* 3 */
1578     /* PG sffa */ {0x04, 0x00, 0x02, 0x3F, 0x00}, /* 4 */
1579    
1580     /* AT 2v2 */ {0x00, 0x00, 0x02, 0x3F, 0x02}, /* 5 */
1581     /* AT tffa */ {0x01, 0x00, 0x02, 0x3F, 0x02}, /* 6 */
1582     /* AT 3v3 */ {0x02, 0x00, 0x02, 0x3F, 0x03}, /* 7 */
1583     /* AT 4v4 */ {0x03, 0x00, 0x02, 0x3F, 0x04}, /* 8 */
1584    
1585     /* TY */ {0x00, 0x01, 0x00, 0x3F, 0x00},
1586     /* 9 */
1587     /* PG 5v5 */ {0x05, 0x00, 0x01, 0x3F, 0x00}, /* 10 */
1588     /* PG 6v6 */ {0x06, 0x00, 0x01, 0x3F, 0x00}, /* 11 */
1589     /* PG 2v2v2 */ {0x07, 0x00, 0x01, 0x3F, 0x00}, /* 12 */
1590     /* PG 3v3v3 */ {0x08, 0x00, 0x01, 0x3F, 0x00}, /* 13 */
1591     /* PG 4v4v4 */ {0x09, 0x00, 0x01, 0x3F, 0x00}, /* 14 */
1592     /* PG 2v2v2v2 */ {0x0A, 0x00, 0x01, 0x3F, 0x00}, /* 15 */
1593     /* PG 3v3v3v3 */ {0x0B, 0x00, 0x01, 0x3F, 0x00}, /* 16 */
1594     /* AT 2v2v2 */ {0x04, 0x00, 0x02, 0x3F, 0x02} /* 17 */
1595     };
1596    
1597     /* hack to give names for new gametypes untill there added to anongame_infos.c */
1598     char *anongame_gametype_names[ANONGAME_TYPES] = {
1599     "One vs. One",
1600     "Two vs. Two",
1601     "Three vs. Three",
1602     "Four vs. Four",
1603     "Small Free for All",
1604     "Two vs. Two",
1605     "Team Free for All",
1606     "Three vs. Three",
1607     "Four vs. Four",
1608     "Tournament Game",
1609     "Five vs. Five",
1610     "Six Vs. Six",
1611     "Two vs. Two vs. Two",
1612     "3 vs. 3 vs. 3",
1613     "4 vs. 4 vs. 4",
1614     "2 vs. 2 vs. 2 vs. 2",
1615     "3 vs. 3 vs. 3 vs. 3",
1616     "Two vs. Two vs. Two"
1617     };
1618    
1619     t_clienttag game_clienttag[2] = { CLIENTTAG_WARCRAFT3_UINT, CLIENTTAG_WAR3XP_UINT };
1620    
1621     char anongame_PG_section = 0x00;
1622     char anongame_AT_section = 0x01;
1623     char anongame_TY_section = 0x02;
1624    
1625     /* set thumbsdown from the conf file */
1626     for (j = 0; j < ANONGAME_TYPES; j++)
1627     anongame_prefix[j][2] = anongame_infos_get_thumbsdown(j);
1628    
1629     if ((raw = packet_create(packet_class_raw)) != NULL)
1630     {
1631     // assemble URL part with 3 URLs ( <1.15 )
1632     packet_append_string(raw, anongame_infos_URL_get_URL(URL_server));
1633     packet_append_string(raw, anongame_infos_URL_get_URL(URL_player));
1634     packet_append_string(raw, anongame_infos_URL_get_URL(URL_tourney));
1635     size = packet_get_size(raw);
1636     // create compressed data
1637     zlib_compress(packet_get_data_const(raw, 0, size), size, &anongame_infos->anongame_infos_data_war3->url_comp_data, &anongame_infos->anongame_infos_data_war3->url_comp_len);
1638     zlib_compress(packet_get_data_const(raw, 0, size), size, &anongame_infos->anongame_infos_data_w3xp->url_comp_data, &anongame_infos->anongame_infos_data_w3xp->url_comp_len);
1639    
1640     // append 4th URL for >= 1.15 clients
1641     packet_append_string(raw, anongame_infos_URL_get_URL(URL_clan));
1642     size = packet_get_size(raw);
1643     zlib_compress(packet_get_data_const(raw, 0, size), size, &anongame_infos->anongame_infos_data_war3->url_comp_data_115, &anongame_infos->anongame_infos_data_war3->url_comp_len_115);
1644     zlib_compress(packet_get_data_const(raw, 0, size), size, &anongame_infos->anongame_infos_data_w3xp->url_comp_data_115, &anongame_infos->anongame_infos_data_w3xp->url_comp_len_115);
1645    
1646     for (k = 0; k < 2; k++)
1647     {
1648     packet_set_size(raw, 0);
1649     mapscount_total = maplists_get_totalmaps(game_clienttag[k]);
1650     packet_append_data(raw, &mapscount_total, 1);
1651     maplists_add_maps_to_packet(raw, game_clienttag[k]);
1652     size = packet_get_size(raw);
1653     if (k == 0)
1654     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos->anongame_infos_data_war3->map_comp_data, &anongame_infos->anongame_infos_data_war3->map_comp_len);
1655     else
1656     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos->anongame_infos_data_w3xp->map_comp_data, &anongame_infos->anongame_infos_data_w3xp->map_comp_len);
1657     }
1658    
1659    
1660     for (k = 0; k < 2; k++)
1661     {
1662     packet_set_size(raw, 0);
1663     value = 0;
1664     PG_gamestyles = 0;
1665     AT_gamestyles = 0;
1666     TY_gamestyles = 0;
1667     /* count of gametypes (PG, AT, TY) */
1668     for (j = 0; j < ANONGAME_TYPES; j++)
1669     if (maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1670     {
1671     if (!anongame_prefix[j][1] && !anongame_prefix[j][4])
1672     PG_gamestyles++;
1673     if (!anongame_prefix[j][1] && anongame_prefix[j][4])
1674     AT_gamestyles++;
1675     if (anongame_prefix[j][1])
1676     TY_gamestyles++;
1677     }
1678    
1679     if (PG_gamestyles)
1680     value++;
1681     if (AT_gamestyles)
1682     value++;
1683     if (TY_gamestyles)
1684     value++;
1685    
1686     packet_append_data(raw, &value, 1);
1687    
1688     /* PG */
1689     if (PG_gamestyles)
1690     {
1691     packet_append_data(raw, &anongame_PG_section, 1);
1692     packet_append_data(raw, &PG_gamestyles, 1);
1693     for (j = 0; j < ANONGAME_TYPES; j++)
1694     if (!anongame_prefix[j][1] && !anongame_prefix[j][4] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1695     {
1696     packet_append_data(raw, &anongame_prefix[j], 5);
1697     maplists_add_map_info_to_packet(raw, game_clienttag[k], j);
1698     }
1699     }
1700    
1701     /* AT */
1702     if (AT_gamestyles)
1703     {
1704     packet_append_data(raw, &anongame_AT_section, 1);
1705     packet_append_data(raw, &AT_gamestyles, 1);
1706     for (j = 0; j < ANONGAME_TYPES; j++)
1707     if (!anongame_prefix[j][1] && anongame_prefix[j][4] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1708     {
1709     packet_append_data(raw, &anongame_prefix[j], 5);
1710     maplists_add_map_info_to_packet(raw, game_clienttag[k], j);
1711     }
1712     }
1713    
1714     /* TY */
1715     if (TY_gamestyles)
1716     {
1717     packet_append_data(raw, &anongame_TY_section, 1);
1718     packet_append_data(raw, &TY_gamestyles, 1);
1719     for (j = 0; j < ANONGAME_TYPES; j++)
1720     if (anongame_prefix[j][1] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1721     {
1722     /* set tournament races available */
1723     anongame_prefix[j][3] = tournament_get_races();
1724     /* set tournament type (PG or AT)
1725     * PG = 0
1726     * AT = number players per team */
1727     if (tournament_is_arranged())
1728     anongame_prefix[j][4] = tournament_get_game_type();
1729     else
1730     anongame_prefix[j][4] = 0;
1731    
1732     packet_append_data(raw, &anongame_prefix[j], 5);
1733     maplists_add_map_info_to_packet(raw, game_clienttag[k], j);
1734     }
1735     }
1736    
1737     size = packet_get_size(raw);
1738     if (k == 0)
1739     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos->anongame_infos_data_war3->type_comp_data, &anongame_infos->anongame_infos_data_war3->type_comp_len);
1740     else
1741     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos->anongame_infos_data_w3xp->type_comp_data, &anongame_infos->anongame_infos_data_w3xp->type_comp_len);
1742     }
1743    
1744     for (k = 0; k < 2; k++)
1745     {
1746     desc_count = 0;
1747     packet_set_size(raw, 0);
1748     for (j = 0; j < ANONGAME_TYPES; j++)
1749     if (maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1750     desc_count++;
1751     packet_append_data(raw, &desc_count, 1);
1752     /* PG description section */
1753     for (j = 0; j < ANONGAME_TYPES; j++)
1754     if (!anongame_prefix[j][1] && !anongame_prefix[j][4] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1755     {
1756     packet_append_data(raw, &anongame_PG_section, 1);
1757     packet_append_data(raw, &anongame_prefix[j][0], 1);
1758    
1759     if (anongame_infos_get_short_desc(NULL, j) == NULL)
1760     packet_append_string(raw, anongame_gametype_names[j]);
1761     else
1762     packet_append_string(raw, anongame_infos_get_short_desc(NULL, j));
1763    
1764     if (anongame_infos_get_long_desc(NULL, j) == NULL)
1765     packet_append_string(raw, "No Descreption");
1766     else
1767     packet_append_string(raw, anongame_infos_get_long_desc(NULL, j));
1768     }
1769     /* AT description section */
1770     for (j = 0; j < ANONGAME_TYPES; j++)
1771     if (!anongame_prefix[j][1] && anongame_prefix[j][4] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1772     {
1773     packet_append_data(raw, &anongame_AT_section, 1);
1774     packet_append_data(raw, &anongame_prefix[j][0], 1);
1775     packet_append_string(raw, anongame_infos_get_short_desc(NULL, j));
1776     packet_append_string(raw, anongame_infos_get_long_desc(NULL, j));
1777     }
1778     /* TY description section */
1779     for (j = 0; j < ANONGAME_TYPES; j++)
1780     if (anongame_prefix[j][1] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1781     {
1782     packet_append_data(raw, &anongame_TY_section, 1);
1783     packet_append_data(raw, &anongame_prefix[j][0], 1);
1784     packet_append_string(raw, anongame_infos_get_short_desc(NULL, j));
1785     packet_append_string(raw, anongame_infos_get_long_desc(NULL, j));
1786     }
1787     size = packet_get_size(raw);
1788     if (k == 0)
1789     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos->anongame_infos_data_war3->desc_comp_data, &anongame_infos->anongame_infos_data_war3->desc_comp_len);
1790     else
1791     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos->anongame_infos_data_w3xp->desc_comp_data, &anongame_infos->anongame_infos_data_w3xp->desc_comp_len);
1792     }
1793    
1794     packet_set_size(raw, 0);
1795     /*FIXME: Still adding a static number (10)
1796     Also maybe need do do some checks to avoid prefs empty strings. */
1797     ladr_count = 10;
1798     packet_append_data(raw, &ladr_count, 1);
1799     packet_append_data(raw, "OLOS", 4);
1800     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_PG_1v1_desc));
1801     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_PG_1v1));
1802     packet_append_data(raw, "MAET", 4);
1803     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_PG_team_desc));
1804     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_PG_team));
1805     packet_append_data(raw, " AFF", 4);
1806     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_PG_ffa_desc));
1807     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_PG_ffa));
1808     packet_append_data(raw, "2SV2", 4);
1809     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_AT_2v2_desc));
1810     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_AT_2v2));
1811     packet_append_data(raw, "3SV3", 4);
1812     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_AT_3v3_desc));
1813     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_AT_3v3));
1814     packet_append_data(raw, "4SV4", 4);
1815     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_AT_4v4_desc));
1816     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_AT_4v4));
1817     packet_append_data(raw, "SNLC", 4);
1818     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_clan_1v1_desc));
1819     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_clan_1v1));
1820     packet_append_data(raw, "2NLC", 4);
1821     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_clan_2v2_desc));
1822     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_clan_2v2));
1823     packet_append_data(raw, "3NLC", 4);
1824     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_clan_3v3_desc));
1825     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_clan_3v3));
1826     packet_append_data(raw, "4NLC", 4);
1827     packet_append_string(raw, anongame_infos_DESC_get_DESC(NULL,ladder_clan_4v4_desc));
1828     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_clan_4v4));
1829    
1830     size = packet_get_size(raw);
1831     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos->anongame_infos_data_war3->ladr_comp_data, &anongame_infos->anongame_infos_data_war3->ladr_comp_len);
1832     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos->anongame_infos_data_w3xp->ladr_comp_data, &anongame_infos->anongame_infos_data_w3xp->ladr_comp_len);
1833    
1834     packet_destroy(raw);
1835     }
1836    
1837     if ((raw = packet_create(packet_class_raw)) != NULL)
1838     {
1839     t_anongame_infos_DESC *anongame_infos_DESC;
1840     t_anongame_infos_data_lang *anongame_infos_data_lang_war3;
1841     t_anongame_infos_data_lang *anongame_infos_data_lang_w3xp;
1842     char * langID;
1843    
1844     LIST_TRAVERSE(anongame_infos->anongame_infos_DESC_list, curr)
1845     {
1846     anongame_infos_DESC = elem_get_data(curr);
1847     langID = anongame_infos_DESC->langID;
1848     anongame_infos_data_lang_war3 = anongame_infos_data_lang_init(langID);
1849     anongame_infos_data_lang_w3xp = anongame_infos_data_lang_init(langID);
1850    
1851     for (k = 0; k < 2; k++)
1852     {
1853     desc_count = 0;
1854     packet_set_size(raw, 0);
1855     for (j = 0; j < ANONGAME_TYPES; j++)
1856     if (maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1857     desc_count++;
1858     packet_append_data(raw, &desc_count, 1);
1859     /* PG description section */
1860     for (j = 0; j < ANONGAME_TYPES; j++)
1861     if (!anongame_prefix[j][1] && !anongame_prefix[j][4] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1862     {
1863     packet_append_data(raw, &anongame_PG_section, 1);
1864     packet_append_data(raw, &anongame_prefix[j][0], 1);
1865    
1866     if (anongame_infos_get_short_desc(langID, j) == NULL)
1867     packet_append_string(raw, anongame_gametype_names[j]);
1868     else
1869     packet_append_string(raw, anongame_infos_get_short_desc(langID, j));
1870    
1871     if (anongame_infos_get_long_desc(langID, j) == NULL)
1872     packet_append_string(raw, "No Descreption");
1873     else
1874     packet_append_string(raw, anongame_infos_get_long_desc(langID, j));
1875     }
1876     /* AT description section */
1877     for (j = 0; j < ANONGAME_TYPES; j++)
1878     if (!anongame_prefix[j][1] && anongame_prefix[j][4] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1879     {
1880     packet_append_data(raw, &anongame_AT_section, 1);
1881     packet_append_data(raw, &anongame_prefix[j][0], 1);
1882     packet_append_string(raw, anongame_infos_get_short_desc(langID, j));
1883     packet_append_string(raw, anongame_infos_get_long_desc(langID, j));
1884     }
1885     /* TY description section */
1886     for (j = 0; j < ANONGAME_TYPES; j++)
1887     if (anongame_prefix[j][1] && maplists_get_totalmaps_by_queue(game_clienttag[k], j))
1888     {
1889     packet_append_data(raw, &anongame_TY_section, 1);
1890     packet_append_data(raw, &anongame_prefix[j][0], 1);
1891     packet_append_string(raw, anongame_infos_get_short_desc(langID, j));
1892     packet_append_string(raw, anongame_infos_get_long_desc(langID, j));
1893     }
1894     size = packet_get_size(raw);
1895     if (k == 0)
1896     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos_data_lang_war3->desc_comp_data, &anongame_infos_data_lang_war3->desc_comp_len);
1897     else
1898     zlib_compress(packet_get_data_const(raw,0,size), size, &anongame_infos_data_lang_w3xp->desc_comp_data, &anongame_infos_data_lang_w3xp->desc_comp_len);
1899     }
1900    
1901     packet_set_size(raw, 0);
1902     /*FIXME: Still adding a static number (10)
1903     Also maybe need do do some checks to avoid prefs empty strings. */
1904     ladr_count = 10;
1905     packet_append_data(raw, &ladr_count, 1);
1906     packet_append_data(raw, "OLOS", 4);
1907     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_PG_1v1_desc));
1908     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_PG_1v1));
1909     packet_append_data(raw, "MAET", 4);
1910     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_PG_team_desc));
1911     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_PG_team));
1912     packet_append_data(raw, " AFF", 4);
1913     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_PG_ffa_desc));
1914     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_PG_ffa));
1915     packet_append_data(raw, "2SV2", 4);
1916     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_AT_2v2_desc));
1917     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_AT_2v2));
1918     packet_append_data(raw, "3SV3", 4);
1919     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_AT_3v3_desc));
1920     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_AT_3v3));
1921     packet_append_data(raw, "4SV4", 4);
1922     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_AT_4v4_desc));
1923     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_AT_4v4));
1924     packet_append_data(raw, "SNLC", 4);
1925     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_clan_1v1_desc));
1926     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_clan_1v1));
1927     packet_append_data(raw, "2NLC", 4);
1928     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_clan_2v2_desc));
1929     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_clan_2v2));
1930     packet_append_data(raw, "3NLC", 4);
1931     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_clan_3v3_desc));
1932     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_clan_3v3));
1933     packet_append_data(raw, "4NLC", 4);
1934     packet_append_string(raw, anongame_infos_DESC_get_DESC(langID, ladder_clan_4v4_desc));
1935     packet_append_string(raw, anongame_infos_URL_get_URL(URL_ladder_clan_4v4));
1936     anongame_infos_data_lang_war3->ladr_len = packet_get_size(raw);
1937     anongame_infos_data_lang_war3->ladr_data = (char *) xmalloc(anongame_infos_data_lang_war3->ladr_len);
1938     memcpy(anongame_infos_data_lang_war3->ladr_data, packet_get_data_const(raw, 0, anongame_infos_data_lang_war3->ladr_len), anongame_infos_data_lang_war3->ladr_len);
1939     zlib_compress(anongame_infos_data_lang_war3->ladr_data, anongame_infos_data_lang_war3->ladr_len, &anongame_infos_data_lang_war3->ladr_comp_data, &anongame_infos_data_lang_war3->ladr_comp_len);
1940     list_append_data(anongame_infos->anongame_infos_data_lang_war3, anongame_infos_data_lang_war3);
1941     anongame_infos_data_lang_w3xp->ladr_len = packet_get_size(raw);
1942     anongame_infos_data_lang_w3xp->ladr_data = (char *) xmalloc(anongame_infos_data_lang_w3xp->ladr_len);
1943     memcpy(anongame_infos_data_lang_w3xp->ladr_data, packet_get_data_const(raw, 0, anongame_infos_data_lang_w3xp->ladr_len), anongame_infos_data_lang_w3xp->ladr_len);
1944     zlib_compress(anongame_infos_data_lang_w3xp->ladr_data, anongame_infos_data_lang_w3xp->ladr_len, &anongame_infos_data_lang_w3xp->ladr_comp_data, &anongame_infos_data_lang_w3xp->ladr_comp_len);
1945     list_append_data(anongame_infos->anongame_infos_data_lang_w3xp, anongame_infos_data_lang_w3xp);
1946     }
1947     packet_destroy(raw);
1948     }
1949     return 0;
1950     }
1951    
1952     extern int anongame_infos_unload(void)
1953     {
1954     return anongame_infos_destroy(anongame_infos);
1955     }
1956    
1957     static int zlib_compress(void const *src, int srclen, char **dest, int *destlen)
1958     {
1959     char *tmpdata;
1960     z_stream zcpr;
1961     int ret;
1962     int lorigtodo;
1963     int lorigdone;
1964     int all_read_before;
1965    
1966     ret = Z_OK;
1967     lorigtodo = srclen;
1968     lorigdone = 0;
1969     *dest = NULL;
1970    
1971     tmpdata = (unsigned char *) xmalloc(srclen + (srclen / 0x10) + 0x200 + 0x8000);
1972    
1973     memset(&zcpr, 0, sizeof(z_stream));
1974     pvpgn_deflateInit(&zcpr, 9);
1975     zcpr.next_in = (void *) src;
1976     zcpr.next_out = tmpdata;
1977     do
1978     {
1979     all_read_before = zcpr.total_in;
1980     zcpr.avail_in = (lorigtodo < 0x8000) ? lorigtodo : 0x8000;
1981     zcpr.avail_out = 0x8000;
1982     ret = pvpgn_deflate(&zcpr, (zcpr.avail_in == lorigtodo) ? Z_FINISH : Z_SYNC_FLUSH);
1983     lorigdone += (zcpr.total_in - all_read_before);
1984     lorigtodo -= (zcpr.total_in - all_read_before);
1985     }
1986     while (ret == Z_OK);
1987    
1988     (*destlen) = zcpr.total_out;
1989     if ((*destlen) > 0)
1990     {
1991     (*dest) = xmalloc((*destlen) + 4);
1992     bn_short_set((bn_short *) (*dest), lorigdone);
1993     bn_short_set((bn_short *) (*dest + 2), *destlen);
1994     memcpy((*dest) + 4, tmpdata, (*destlen));
1995     (*destlen) += 4;
1996     }
1997     pvpgn_deflateEnd(&zcpr);
1998    
1999     xfree((void *) tmpdata);
2000    
2001     return 0;
2002     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1