2011-11-22 21:28:15 +00:00
|
|
|
/*
|
|
|
|
===========================================================================
|
|
|
|
|
|
|
|
Doom 3 GPL Source Code
|
2011-12-06 18:20:15 +00:00
|
|
|
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
|
2011-11-22 21:28:15 +00:00
|
|
|
|
2011-12-06 16:14:59 +00:00
|
|
|
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
|
2011-11-22 21:28:15 +00:00
|
|
|
|
|
|
|
Doom 3 Source Code 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 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Doom 3 Source Code 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 Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
|
|
|
|
|
|
|
|
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
|
|
|
|
|
|
|
===========================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __SERVERSCAN_H__
|
|
|
|
#define __SERVERSCAN_H__
|
|
|
|
|
2011-12-16 22:28:29 +00:00
|
|
|
#include "ui/UserInterface.h"
|
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
/*
|
|
|
|
===============================================================================
|
|
|
|
|
|
|
|
Scan for servers, on the LAN or from a list
|
|
|
|
Update a listDef GUI through usage of idListGUI class
|
|
|
|
When updating large lists of servers, sends out getInfo in small batches to avoid congestion
|
|
|
|
|
|
|
|
===============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
// storage for incoming servers / server scan
|
|
|
|
typedef struct {
|
|
|
|
netadr_t adr;
|
|
|
|
int id;
|
|
|
|
int time;
|
|
|
|
} inServer_t;
|
|
|
|
|
|
|
|
// the menu gui uses a hard-coded control type to display a list of network games
|
|
|
|
typedef struct {
|
|
|
|
netadr_t adr;
|
|
|
|
idDict serverInfo;
|
|
|
|
int ping;
|
|
|
|
int id; // idnet mode sends an id for each server in list
|
|
|
|
int clients;
|
|
|
|
char nickname[ MAX_NICKLEN ][ MAX_ASYNC_CLIENTS ];
|
|
|
|
short pings[ MAX_ASYNC_CLIENTS ];
|
|
|
|
int rate[ MAX_ASYNC_CLIENTS ];
|
|
|
|
int OSMask;
|
2011-12-06 18:20:15 +00:00
|
|
|
int challenge;
|
2011-11-22 21:28:15 +00:00
|
|
|
} networkServer_t;
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
SORT_PING,
|
|
|
|
SORT_SERVERNAME,
|
|
|
|
SORT_PLAYERS,
|
|
|
|
SORT_GAMETYPE,
|
|
|
|
SORT_MAP,
|
|
|
|
SORT_GAME
|
|
|
|
} serverSort_t;
|
|
|
|
|
|
|
|
class idServerScan : public idList<networkServer_t> {
|
2011-12-06 18:20:15 +00:00
|
|
|
public:
|
2011-11-22 21:28:15 +00:00
|
|
|
idServerScan( );
|
2011-12-06 18:20:15 +00:00
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
int InfoResponse( networkServer_t &server );
|
|
|
|
|
|
|
|
// add an internet server - ( store a numeric id along with it )
|
|
|
|
void AddServer( int id, const char *srv );
|
|
|
|
|
|
|
|
// we are going to feed server entries to be pinged
|
|
|
|
// if timeout is true, use a timeout once we start AddServer to trigger EndServers and decide the scan is done
|
|
|
|
void StartServers( bool timeout );
|
|
|
|
// we are done filling up the list of server entries
|
|
|
|
void EndServers( );
|
|
|
|
|
|
|
|
// scan the current list of servers - used for refreshes and while receiving a fresh list
|
|
|
|
void NetScan( );
|
|
|
|
|
|
|
|
// clear
|
|
|
|
void Clear( );
|
|
|
|
|
|
|
|
// called each game frame. Updates the scanner state, takes care of ongoing scans
|
|
|
|
void RunFrame( );
|
2011-12-06 18:20:15 +00:00
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
typedef enum {
|
|
|
|
IDLE = 0,
|
|
|
|
WAIT_ON_INIT,
|
|
|
|
LAN_SCAN,
|
|
|
|
NET_SCAN
|
|
|
|
} scan_state_t;
|
|
|
|
|
|
|
|
scan_state_t GetState() { return scan_state; }
|
|
|
|
void SetState( scan_state_t );
|
2011-12-06 18:20:15 +00:00
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
bool GetBestPing( networkServer_t &serv );
|
|
|
|
|
|
|
|
// prepare for a LAN scan. idAsyncClient does the network job (UDP broadcast), we do the storage
|
|
|
|
void SetupLANScan( );
|
|
|
|
|
|
|
|
void GUIConfig( idUserInterface *pGUI, const char *name );
|
|
|
|
// update the GUI fields with information about the currently selected server
|
|
|
|
void GUIUpdateSelected( void );
|
|
|
|
|
|
|
|
void Shutdown( );
|
|
|
|
|
|
|
|
void ApplyFilter( );
|
|
|
|
|
|
|
|
// there is an internal toggle, call twice with same sort to switch
|
|
|
|
void SetSorting( serverSort_t sort );
|
|
|
|
|
|
|
|
int GetChallenge( );
|
|
|
|
|
|
|
|
private:
|
2011-12-06 18:20:15 +00:00
|
|
|
static const int MAX_PINGREQUESTS = 32; // how many servers to query at once
|
|
|
|
static const int REPLY_TIMEOUT = 999; // how long should we wait for a reply from a game server
|
2011-11-22 21:28:15 +00:00
|
|
|
static const int INCOMING_TIMEOUT = 1500; // when we got an incoming server list, how long till we decide the list is done
|
|
|
|
static const int REFRESH_START = 10000; // how long to wait when sending the initial refresh request
|
|
|
|
|
|
|
|
scan_state_t scan_state;
|
2011-12-06 18:20:15 +00:00
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
bool incoming_net; // set to true while new servers are fed through AddServer
|
|
|
|
bool incoming_useTimeout;
|
|
|
|
int incoming_lastTime;
|
2011-12-06 18:20:15 +00:00
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
int lan_pingtime; // holds the time of LAN scan
|
2011-12-06 18:20:15 +00:00
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
// servers we're waiting for a reply from
|
|
|
|
// won't exceed MAX_PINGREQUESTS elements
|
|
|
|
// holds index of net_servers elements, indexed by 'from' string
|
2011-12-06 18:20:15 +00:00
|
|
|
idDict net_info;
|
2011-11-22 21:28:15 +00:00
|
|
|
|
|
|
|
idList<inServer_t> net_servers;
|
|
|
|
// where we are in net_servers list for getInfo emissions ( NET_SCAN only )
|
|
|
|
// we may either be waiting on MAX_PINGREQUESTS, or for net_servers to grow some more ( through AddServer )
|
|
|
|
int cur_info;
|
|
|
|
|
|
|
|
idUserInterface *m_pGUI;
|
|
|
|
idListGUI * listGUI;
|
|
|
|
|
|
|
|
serverSort_t m_sort;
|
|
|
|
bool m_sortAscending;
|
|
|
|
idList<int> m_sortedServers; // use ascending for the walking order
|
|
|
|
|
|
|
|
idStr screenshot;
|
|
|
|
int challenge; // challenge for current scan
|
2011-12-06 18:20:15 +00:00
|
|
|
|
2011-11-22 21:28:15 +00:00
|
|
|
int endWaitTime; // when to stop waiting on a port init
|
|
|
|
|
|
|
|
private:
|
|
|
|
void LocalClear( ); // we need to clear some internal data as well
|
|
|
|
|
|
|
|
void EmitGetInfo( netadr_t &serv );
|
|
|
|
void GUIAdd( int id, const networkServer_t server );
|
|
|
|
bool IsFiltered( const networkServer_t server );
|
|
|
|
|
|
|
|
static int Cmp( const int *a, const int *b );
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* !__SERVERSCAN_H__ */
|