1 /* XQF - Quake server browser and launcher
2  * Copyright (C) 1998-2000 Roman Pozlevich <roma@botik.ru>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
17  */
18 
19 #ifndef __XQF_H__
20 #define __XQF_H__
21 
22 #include "gnuconfig.h"      /* GNU autoconf */
23 
24 #include <sys/types.h>
25 #include <netinet/in.h>     /* struct in_addr */
26 #include <arpa/inet.h>      /* struct in_addr */
27 #include <time.h>           /* time_t */
28 
29 #include <gtk/gtk.h>
30 #include <glib.h>
31 
32 #define RC_DIR          ".qf"               /* legacy config dir, before 1.0.6 */
33 #define XDG_RC_DIR      "xqf"                /* new config dir, since 1.0.6 */
34 #define RC_FILE         "qfrc"
35 #define CONFIG_FILE     "config"
36 #define SERVERS_FILE    "servers"
37 #define PLAYERS_FILE    "players"
38 #define HOSTCACHE_FILE  "hostcache"
39 #define EXEC_CFG        "frontend.cfg"
40 #define PASSWORD_CFG    "__passwd.cfg"
41 #define LAUNCHINFO_FILE "LaunchInfo.txt"
42 
43 #define MAX_PING        9999
44 #define MAX_RETRIES     10
45 
46 #define Q1_DEFAULT_PORT         26000   /* Quake */
47 #define QW_DEFAULT_PORT         27500   /* QuakeWorld */
48 #define Q2_DEFAULT_PORT         27910   /* Quake2 */
49 #define Q3_DEFAULT_PORT         27960   /* Quake3 Arena */
50 #define WO_DEFAULT_PORT         27960   /* Wolfenstein */
51 #define EF_DEFAULT_PORT         27960   /* Voyager Elite Force */
52 #define H2_DEFAULT_PORT         26900   /* Hexen2 */
53 #define HW_DEFAULT_PORT         26950   /* HexenWorld */
54 #define SN_DEFAULT_PORT         22450   /* Sin */
55 #define HL_DEFAULT_PORT         27015   /* Half-Life */
56 #define KP_DEFAULT_PORT         31510   /* Kingpin */
57 #define SFS_DEFAULT_PORT        28910   /* Soldier of Fortune */
58 #define SOF2S_DEFAULT_PORT      20100   /* Soldier of Fortune 2 */
59 #define T2_DEFAULT_PORT         28000   /* Tribes 2 */
60 #define HR_DEFAULT_PORT         28910   /* Heretic2 */
61 #define UN_DEFAULT_PORT         7777    /* Unreal */
62 #define AAO_DEFAULT_PORT        1716    /* AAO */
63 #define UT2_DEFAULT_PORT        7777    /* Unreal Tournament 2003 */
64 #define GPS_DEFAULT_PORT        27888   /* Gamespy Generic */
65 #define DESCENT3_DEFAULT_PORT   2092    /* Descent 3 */
66 
67 #define QWM_DEFAULT_PORT        27000   /* QuakeWorld */
68 #define Q2M_DEFAULT_PORT        27900   /* Quake2 master */
69 #define Q3M_DEFAULT_PORT        27950   /* Quake3 master */
70 #define WOM_DEFAULT_PORT        27950   /* Wolfenstein master */
71 #define HLM_DEFAULT_PORT        27010   /* Half-Life master */
72 #define D3M_DEFAULT_PORT        3445    /* Descent 3 master */
73 #define EFM_DEFAULT_PORT        27953   /* Elite Force master */
74 #define T2M_DEFAULT_PORT        28000   /* Tribes 2 */
75 #define SOF2M_DEFAULT_PORT      20110   /* Soldier of Fortune 2 */
76 
77 /* max 0x8000, server->flags is unsigned */
78 enum server_flags {
79 	PLAYER_GROUP_RED =      0x001,
80 	PLAYER_GROUP_GREEN =    0x002,
81 	PLAYER_GROUP_BLUE =     0x004,
82 	PLAYER_GROUP_MASK =     0x007,
83 
84 	SERVER_CHEATS =         0x008,
85 	SERVER_PASSWORD =       0x010,
86 	SERVER_SP_PASSWORD =    0x020,
87 	SERVER_SPECTATE =       0x040,
88 	SERVER_PUNKBUSTER =     0x080,
89 	SERVER_INCOMPATIBLE =   0x100
90 };
91 
92 enum launch_mode {
93 	LAUNCH_NORMAL,
94 	LAUNCH_SPECTATE,
95 	LAUNCH_RECORD
96 };
97 
98 
99 // note: there is a limit of 256 servers, see get_server_pixmap in srv-list.c
100 enum server_type {
101 	Q1_SERVER = 0,
102 	QW_SERVER,
103 	Q2_SERVER,
104 	Q3_SERVER,
105 	Q4_SERVER,
106 	WO_SERVER,
107 	WOET_SERVER,
108 	ETL_SERVER,
109 	DOOM3_SERVER,
110 	ETQW_SERVER,
111 	EF_SERVER,
112 	H2_SERVER,
113 	HW_SERVER,
114 	SN_SERVER,
115 	HL_SERVER_OLD,
116 	HL_SERVER,
117 	HL2_SERVER,
118 	KP_SERVER,
119 	SFS_SERVER,
120 	SOF2S_SERVER,
121 	T2_SERVER,
122 	HR_SERVER,
123 	UN_SERVER,
124 	UT2_SERVER,
125 	UT2004_SERVER,
126 	RUNE_SERVER,
127 	POSTAL2_SERVER,
128 	AAO_SERVER,
129 	DESCENT3_SERVER,
130 	SSAM_SERVER,
131 	SSAMSE_SERVER,
132 	MOHAA_SERVER,
133 	COD_SERVER,
134 	SAS_SERVER,
135 	BF1942_SERVER,
136 	JK2_SERVER,
137 	JK3_SERVER,
138 	NETP_SERVER,
139 	NEXUIZ_SERVER,
140 	XONOTIC_SERVER,
141 	WARSOW_SERVER,
142 	TREMULOUS_SERVER,
143 	TREMULOUSGPP_SERVER,
144 	TREMFUSION_SERVER,
145 	UNVANQUISHED_SERVER,
146 	OPENARENA_SERVER,
147 	OTTD_SERVER,
148 	Q3RALLY_SERVER,
149 	WOP_SERVER,
150 	IOURT_SERVER,
151 	REACTION_SERVER,
152 	SMOKINGUNS_SERVER,
153 	ZEQ2LITE_SERVER,
154 	TURTLEARENA_SERVER,
155 	ALIENARENA_SERVER,
156 	GPS_SERVER,
157 	UNKNOWN_SERVER
158 };
159 
160 #define  GAMES_TOTAL UNKNOWN_SERVER
161 
162 enum master_state {
163 	SOURCE_NA = 0,
164 	SOURCE_UP,
165 	SOURCE_DOWN,
166 	SOURCE_TIMEOUT,
167 	SOURCE_ERROR
168 };
169 
170 enum master_query_type {
171 	MASTER_NATIVE=0,
172 	MASTER_GAMESPY,
173 	MASTER_HTTP,
174 	MASTER_LAN,
175 	MASTER_FILE,
176 	MASTER_GSLIST,
177 	MASTER_NUM_QUERY_TYPES,
178 	MASTER_INVALID_TYPE
179 };
180 
181 
182 /**
183  * A player. There is no destructor for this struct. Alloc as many data as you
184  * need at once and have the pointers point inside.
185  */
186 struct player {
187 	char *name;
188 	char *skin;
189 	char *model;
190 	int time;
191 	short frags;
192 	short ping;
193 	unsigned char shirt;
194 	unsigned char pants;
195 	unsigned char flags;
196 };
197 
198 struct host {
199 	char *name;
200 	struct in_addr ip;
201 	time_t refreshed;
202 	int ref_count;
203 };
204 
205 
206 /** server_new, server_free_info, server_move_info must be adapted for
207  * changes to this structure
208  */
209 struct server {
210 	struct host *host;
211 
212 	gchar *name;
213 	char *map;
214 	char **info;
215 	char *game;         /** pointer into info, do not free */
216 	char *gametype;     /** pointer into info, do not free */
217 	GSList *players;    /** GSList<struct player *>  */
218 
219 #ifdef USE_GEOIP
220 	int country_id;
221 #endif
222 
223 	unsigned flags;
224 
225 	unsigned flt_last;  /** time of the last filtering */
226 
227 	time_t refreshed;
228 	time_t last_answer; /** time of last reply from server */
229 
230 	int ref_count;
231 
232 	enum server_type type;
233 	unsigned short port;
234 
235 	unsigned short maxplayers;
236 	unsigned short curplayers;
237 	unsigned short curbots;
238 	unsigned short private_client;  /** number of private clients */
239 	short ping;
240 	short retries;
241 
242 	char sv_os;             /** L = Linux, W = windows, M = Mac */
243 
244 	unsigned char filters;
245 	unsigned char flt_mask;
246 };
247 
248 struct userver {
249 	char *hostname;
250 	struct server *s;
251 	int ref_count;
252 	unsigned short port;
253 	unsigned char type;     /* enum server_type type; */
254 };
255 
256 typedef struct {
257 	int portadjust;         /* value added to port */
258 	char* gsmtype;          /* type for gslist master */
259 } QFMasterOptions;
260 
261 typedef struct master {
262 	char *name;
263 	enum server_type type;
264 	int isgroup;            /* is it a real master or master group? */
265 	int user;               /* is it added or edited by user? */
266 	QFMasterOptions options;
267 
268 	struct host *host;
269 	unsigned short port;
270 	char *hostname;         /* unresolved hostname */
271 
272 	char *url;
273 
274 	GSList *servers;
275 	GSList *uservers;
276 	enum master_state state;
277 
278 	GSList *masters;
279 
280 	enum master_query_type master_type;
281 
282 	/** private */
283 	char* _qstat_master_option; // optional override from games[type].qstat_master_option
284 } QFMaster;
285 
286 char* master_qstat_option(struct master* m);
287 void master_set_qstat_option(struct master* m, const char* opt);
288 
289 char* master_to_url(QFMaster* m);
290 
291 extern time_t xqf_start_time;
292 extern char* xqf_PACKAGE_DATA_DIR;
293 extern char* xqf_LOCALEDIR;
294 extern char* xqf_PIXMAPSDIR;
295 
296 extern char* qstat_configfile;
297 
298 extern GSList *cur_source;          /*  GSList <struct master *>  */
299 extern GSList *cur_server_list;     /*  GSList <struct server *>  */
300 extern GSList *cur_userver_list;    /*  GSList <struct server *>  */
301 
302 extern struct server *cur_server;
303 
304 extern struct stat_job *stat_process;
305 
306 
307 int compare_qstat_version (const char* have, const char* expected);
308 int start_prog_and_return_fd(char *const argv[], pid_t *pid);
309 int check_qstat_version(void);
310 
311 void play_sound (const char *sound, gboolean override);
312 void play_sound_with (const char* player, const char *sound, gboolean override);
313 
314 extern void reset_main_status_bar(void);
315 
316 //extern int filter_start_index;
317 
318 extern int event_type;
319 
320 extern int dontlaunch;
321 
322 extern void refresh_source_list (void);
323 extern void update_source_callback (GtkWidget *widget, gpointer data);
324 extern void refresh_n_server(GtkWidget * button, gpointer *data);
325 extern void stop_callback (GtkWidget *widget, gpointer data);
326 
327 #endif /* __XQF_H__ */
328