/*
===========================================================================
Doom 3 GPL Source Code
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
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 .
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 __ASYNCCLIENT_H__
#define __ASYNCCLIENT_H__
#include "framework/async/MsgChannel.h"
#include "framework/async/ServerScan.h"
#include "framework/UsercmdGen.h"
#include "framework/FileSystem.h"
#include "framework/Session.h"
/*
===============================================================================
Network Client for asynchronous networking.
===============================================================================
*/
typedef enum {
CS_DISCONNECTED,
CS_PURERESTART,
CS_CHALLENGING,
CS_CONNECTING,
CS_CONNECTED,
CS_INGAME
} clientState_t;
typedef enum {
AUTHKEY_BADKEY,
AUTHKEY_GUID
} authKeyMsg_t;
typedef enum {
AUTHKEY_BAD_INVALID,
AUTHKEY_BAD_BANNED,
AUTHKEY_BAD_INUSE,
AUTHKEY_BAD_MSG
} authBadKeyStatus_t;
typedef enum {
UPDATE_NONE,
UPDATE_SENT,
UPDATE_READY,
UPDATE_DLING,
UPDATE_DONE
} clientUpdateState_t;
typedef struct {
idStr url;
idStr filename;
int size;
int checksum;
} pakDlEntry_t;
class idAsyncClient {
public:
idAsyncClient();
void Shutdown( void );
bool InitPort( void );
void ClosePort( void );
void ConnectToServer( const netadr_t adr );
void ConnectToServer( const char *address );
void Reconnect( void );
void DisconnectFromServer( void );
void GetServerInfo( const netadr_t adr );
void GetServerInfo( const char *address );
void GetLANServers( void );
void GetNETServers( void );
void ListServers( void );
void ClearServers( void );
void RemoteConsole( const char *command );
bool IsPortInitialized() { return clientPort.GetPort() != 0; }
bool IsActive( void ) const { return active; }
int GetLocalClientNum( void ) const { return clientNum; }
int GetPrediction( void ) const;
int GetTimeSinceLastPacket( void ) const;
int GetOutgoingRate( void ) const;
int GetIncomingRate( void ) const;
float GetOutgoingCompression( void ) const;
float GetIncomingCompression( void ) const;
float GetIncomingPacketLoss( void ) const;
int GetPredictedFrames( void ) const { return lastFrameDelta; }
void RunFrame( void );
void SendReliableGameMessage( const idBitMsg &msg );
void SendVersionCheck( bool fromMenu = false );
// pass NULL for the keys you don't care to auth for
// returns false if internet link doesn't appear to be available
bool SendAuthCheck( const char *cdkey, const char *xpkey );
void PacifierUpdate( void );
idServerScan serverList;
private:
bool active; // true if client is active
int realTime; // absolute time
int clientTime; // client local time
idPort clientPort; // UDP port
int clientId; // client identification
int clientDataChecksum; // checksum of the data used by the client
int clientNum; // client number on server
clientState_t clientState; // client state
int clientPrediction; // how far the client predicts ahead
int clientPredictTime; // prediction time used to send user commands
netadr_t serverAddress; // IP address of server
int serverId; // server identification
int serverChallenge; // challenge from server
int serverMessageSequence; // sequence number of last server message
netadr_t lastRconAddress; // last rcon address we emitted to
int lastRconTime; // when last rcon emitted
idMsgChannel channel; // message channel to server
int lastConnectTime; // last time a connect message was sent
int lastEmptyTime; // last time an empty message was sent
int lastPacketTime; // last time a packet was received from the server
int lastSnapshotTime; // last time a snapshot was received
int snapshotSequence; // sequence number of the last received snapshot
int snapshotGameFrame; // game frame number of the last received snapshot
int snapshotGameTime; // game time of the last received snapshot
int gameInitId; // game initialization identification
int gameFrame; // local game frame
int gameTime; // local game time
int gameTimeResidual; // left over time from previous frame
usercmd_t userCmds[MAX_USERCMD_BACKUP][MAX_ASYNC_CLIENTS];
idUserInterface * guiNetMenu;
clientUpdateState_t updateState;
int updateSentTime;
idStr updateMSG;
idStr updateURL;
bool updateDirectDownload;
idStr updateFile;
dlMime_t updateMime;
idStr updateFallback;
bool showUpdateMessage;
backgroundDownload_t backgroundDownload;
int dltotal;
int dlnow;
int lastFrameDelta;
int dlRequest; // randomized number to keep track of the requests
int dlChecksums[ MAX_PURE_PAKS ]; // 0-terminated, first element is the game pak checksum or 0
int dlCount; // total number of paks we request download for ( including the game pak )
idListdlList; // list of paks to download, with url and name
int currentDlSize;
int totalDlSize; // for partial progress stuff
void Clear( void );
void ClearPendingPackets( void );
void DuplicateUsercmds( int frame, int time );
void SendUserInfoToServer( void );
void SendEmptyToServer( bool force = false, bool mapLoad = false );
void SendPingResponseToServer( int time );
void SendUsercmdsToServer( void );
void InitGame( int serverGameInitId, int serverGameFrame, int serverGameTime, const idDict &serverSI );
void ProcessUnreliableServerMessage( const idBitMsg &msg );
void ProcessReliableServerMessages( void );
void ProcessChallengeResponseMessage( const netadr_t from, const idBitMsg &msg );
void ProcessConnectResponseMessage( const netadr_t from, const idBitMsg &msg );
void ProcessDisconnectMessage( const netadr_t from, const idBitMsg &msg );
void ProcessInfoResponseMessage( const netadr_t from, const idBitMsg &msg );
void ProcessPrintMessage( const netadr_t from, const idBitMsg &msg );
void ProcessServersListMessage( const netadr_t from, const idBitMsg &msg );
void ProcessAuthKeyMessage( const netadr_t from, const idBitMsg &msg );
void ProcessVersionMessage( const netadr_t from, const idBitMsg &msg );
void ConnectionlessMessage( const netadr_t from, const idBitMsg &msg );
void ProcessMessage( const netadr_t from, idBitMsg &msg );
void SetupConnection( void );
void ProcessPureMessage( const netadr_t from, const idBitMsg &msg );
bool ValidatePureServerChecksums( const netadr_t from, const idBitMsg &msg );
void ProcessReliableMessagePure( const idBitMsg &msg );
static const char* HandleGuiCommand( const char *cmd );
const char* HandleGuiCommandInternal( const char *cmd );
void SendVersionDLUpdate( int state );
void HandleDownloads( void );
void Idle( void );
int UpdateTime( int clamp );
void ReadLocalizedServerString( const idBitMsg &msg, char* out, int maxLen );
bool CheckTimeout( void );
void ProcessDownloadInfoMessage( const netadr_t from, const idBitMsg &msg );
int GetDownloadRequest( const int checksums[ MAX_PURE_PAKS ], int count );
};
#endif /* !__ASYNCCLIENT_H__ */