294 lines
9.1 KiB
C
294 lines
9.1 KiB
C
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||
|
//
|
||
|
// This program is free software: you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU Affero General Public License as
|
||
|
// published by the Free Software Foundation, either version 3 of the
|
||
|
// License, or (at your option) any later version.
|
||
|
//
|
||
|
// This program 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 Affero General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU Affero General Public License
|
||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
|
||
|
|
||
|
#ifndef CL_NET_MANAGER_H
|
||
|
#define CL_NET_MANAGER_H
|
||
|
|
||
|
//#define CLIENT_MULTI
|
||
|
|
||
|
/////////////
|
||
|
// INCLUDE //
|
||
|
/////////////
|
||
|
// Misc.
|
||
|
#include "nel/misc/types_nl.h"
|
||
|
// Client.
|
||
|
#include "network_connection.h"
|
||
|
// Game Share
|
||
|
#include "game_share/generic_xml_msg_mngr.h"
|
||
|
#include "game_share/chat_group.h"
|
||
|
|
||
|
|
||
|
|
||
|
//////////////
|
||
|
// FUNCTION //
|
||
|
//////////////
|
||
|
void initializeNetwork();
|
||
|
|
||
|
|
||
|
namespace NLMISC
|
||
|
{
|
||
|
class CBitMemStream;
|
||
|
class CCDBNodeLeaf;
|
||
|
};
|
||
|
|
||
|
|
||
|
///////////
|
||
|
// CLASS //
|
||
|
///////////
|
||
|
/**
|
||
|
* Class to manage the network.
|
||
|
* \author Guillaume PUZIN
|
||
|
* \author Nevrax France
|
||
|
* \date 2001
|
||
|
*/
|
||
|
class CNetManager : public CNetworkConnection
|
||
|
{
|
||
|
public:
|
||
|
/// Constructor.
|
||
|
CNetManager();
|
||
|
|
||
|
/**
|
||
|
* Updates the whole connection with the frontend.
|
||
|
* Call this method evently.
|
||
|
*
|
||
|
* Behaviour in login state when a firewall does not grant the sending:
|
||
|
* - When a sending is refused (error "Blocking operation interrupted")
|
||
|
* the exception EBlockedByFirewall in thrown. The first time, a time-out is armed.
|
||
|
* - In a later attempt, if the time-out expired, the function sets state to
|
||
|
* Disconnect, then throws EBlockedByFirewall.
|
||
|
*
|
||
|
* \return bool 'true' if data were sent/received.
|
||
|
*/
|
||
|
bool update();
|
||
|
|
||
|
bool getConnectionQuality();
|
||
|
|
||
|
/**
|
||
|
* Buffers a bitmemstream, that will be converted into a generic action, to be sent later to the server (at next update).
|
||
|
*/
|
||
|
void push (NLMISC::CBitMemStream &msg);
|
||
|
|
||
|
/**
|
||
|
* Buffers a target action
|
||
|
*/
|
||
|
void pushTarget(CLFECOMMON::TCLEntityId slot);
|
||
|
|
||
|
/**
|
||
|
* Buffers a pick-up action
|
||
|
*/
|
||
|
void pushPickup(CLFECOMMON::TCLEntityId slot, LHSTATE::TLHState lootOrHarvest);
|
||
|
|
||
|
/**
|
||
|
* Send
|
||
|
*/
|
||
|
void send(NLMISC::TGameCycle);
|
||
|
|
||
|
/**
|
||
|
* Send last information without changes (only acknowedges frontend)
|
||
|
*/
|
||
|
void send();
|
||
|
|
||
|
/**
|
||
|
* Disconnects the current connection
|
||
|
*/
|
||
|
void disconnect();
|
||
|
|
||
|
/**
|
||
|
* Reset data and reinit the socket
|
||
|
*/
|
||
|
void reinit();
|
||
|
|
||
|
/**
|
||
|
* Waits for server to answer
|
||
|
*/
|
||
|
void waitForServer();
|
||
|
|
||
|
#ifdef ENABLE_INCOMING_MSG_RECORDER
|
||
|
/// Start/stop replaying the incoming messages (in offline mode)
|
||
|
void setReplayingMode( bool onOff, const std::string& filename = "");
|
||
|
bool isReplayStarting() const {return _IsReplayStarting;}
|
||
|
void startReplay();
|
||
|
|
||
|
protected:
|
||
|
bool _IsReplayStarting;
|
||
|
#endif
|
||
|
|
||
|
NLMISC::CRefPtr<NLMISC::CCDBNodeLeaf> m_PingLeaf;
|
||
|
NLMISC::CRefPtr<NLMISC::CCDBNodeLeaf> m_UploadLeaf;
|
||
|
NLMISC::CRefPtr<NLMISC::CCDBNodeLeaf> m_DownloadLeaf;
|
||
|
NLMISC::CRefPtr<NLMISC::CCDBNodeLeaf> m_PacketLostLeaf;
|
||
|
NLMISC::CRefPtr<NLMISC::CCDBNodeLeaf> m_ServerStateLeaf;
|
||
|
NLMISC::CRefPtr<NLMISC::CCDBNodeLeaf> m_ConnectionQualityLeaf;
|
||
|
};
|
||
|
|
||
|
|
||
|
//////////////
|
||
|
// FUNCTION //
|
||
|
//////////////
|
||
|
// The impulse callback to receive all msg from the frontend.
|
||
|
void impulseCallBack(NLMISC::CBitMemStream &, sint32 packet, void *arg);
|
||
|
|
||
|
#define ALL_MANAGERS std::vector<CNetManager*>::iterator inm; for( inm=_NetManagers.begin(); inm!=_NetManagers.end(); ++inm ) (*inm)
|
||
|
#define FIRST_MANAGER _NetManagers[0]
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
*/
|
||
|
class CNetManagerMulti
|
||
|
{
|
||
|
public:
|
||
|
/// Constructor.
|
||
|
CNetManagerMulti() {}
|
||
|
|
||
|
/// Create the net managers
|
||
|
void init( const std::string& cookie, const std::string& addr );
|
||
|
|
||
|
/// Destructor
|
||
|
~CNetManagerMulti() { std::vector<CNetManager*>::iterator inm; for( inm=_NetManagers.begin(); inm!=_NetManagers.end(); ++inm ) delete (*inm); }
|
||
|
|
||
|
/**
|
||
|
* Updates the whole connection with the frontend.
|
||
|
* Call this method evently.
|
||
|
* \return bool : 'true' if data were sent/received.
|
||
|
*/
|
||
|
bool update() { ALL_MANAGERS->update(); return true; }
|
||
|
|
||
|
/**
|
||
|
* Buffers a bitmemstream, that will be converted into a generic action, to be sent later to the server (at next update).
|
||
|
*/
|
||
|
void push (NLMISC::CBitMemStream &msg) { ALL_MANAGERS->push( msg ); }
|
||
|
|
||
|
/**
|
||
|
* Buffers a target action
|
||
|
*/
|
||
|
void pushTarget(CLFECOMMON::TCLEntityId slot) { ALL_MANAGERS->pushTarget( slot ); }
|
||
|
|
||
|
/**
|
||
|
* Buffers a pick-up action
|
||
|
*/
|
||
|
void pushPickup(CLFECOMMON::TCLEntityId slot, LHSTATE::TLHState lootOrHarvest) { ALL_MANAGERS->pushPickup( slot, lootOrHarvest ); }
|
||
|
|
||
|
/**
|
||
|
* Send
|
||
|
*/
|
||
|
void send(NLMISC::TGameCycle gc) { ALL_MANAGERS->send( gc ); }
|
||
|
|
||
|
/**
|
||
|
* Send
|
||
|
*/
|
||
|
void send() { ALL_MANAGERS->send(); }
|
||
|
|
||
|
/**
|
||
|
* Disconnects the current connection
|
||
|
*/
|
||
|
void disconnect() { ALL_MANAGERS->disconnect(); }
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Waits for server to answer
|
||
|
*/
|
||
|
void waitForServer() { ALL_MANAGERS->waitForServer(); }
|
||
|
|
||
|
#ifdef ENABLE_INCOMING_MSG_RECORDER
|
||
|
void setRecordingMode( bool onOff, const std::string& filename = "") {}
|
||
|
void setReplayingMode( bool onOff, const std::string& filename = "") {}
|
||
|
bool isReplayStarting() const {return false;}
|
||
|
void startReplay() {}
|
||
|
bool isRecording() const {return false;}
|
||
|
bool isReplaying() const {return false;}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
NLMISC::TTime getCurrentClientTime() { return FIRST_MANAGER->getCurrentClientTime(); } // the time currently played at this frame (in the past)
|
||
|
NLMISC::TGameCycle getCurrentClientTick() { return FIRST_MANAGER->getCurrentClientTick(); } // the tick for the current frame (also in the past)
|
||
|
NLMISC::TGameCycle getCurrentServerTick() { return FIRST_MANAGER->getCurrentServerTick(); } // the last tick sent by the server.
|
||
|
NLMISC::TTime getMachineTimeAtTick() { return FIRST_MANAGER->getMachineTimeAtTick(); } // the machine time at the beginning of the current tick
|
||
|
NLMISC::TTicks getMachineTicksAtTick() { return FIRST_MANAGER->getMachineTicksAtTick(); }
|
||
|
sint32 getMsPerTick() { return FIRST_MANAGER->getMsPerTick(); }
|
||
|
NLMISC::TGameCycle getSynchronize() { return FIRST_MANAGER->getSynchronize(); }
|
||
|
uint32 getBestPing() { return FIRST_MANAGER->getBestPing(); }
|
||
|
uint32 getPing() const { return FIRST_MANAGER->getPing(); }
|
||
|
NLMISC::TTime getLCT() { return FIRST_MANAGER->getLCT(); } // Lag compensation time
|
||
|
NLMISC::TTime getUpdateTime() { return FIRST_MANAGER->getUpdateTime(); }
|
||
|
NLMISC::TTicks getUpdateTicks() { return FIRST_MANAGER->getUpdateTicks(); }
|
||
|
uint32 getUserId() { return 0; }
|
||
|
const char* getConnectionStateCStr() { return ""; }
|
||
|
bool getConnectionQuality() { return true; }
|
||
|
|
||
|
// Return an estimated smooth server tick. Increment only and accelerate/decelerate according to network
|
||
|
sint64 getCurrentSmoothServerTick() const { return FIRST_MANAGER->getCurrentSmoothServerTick(); }
|
||
|
// Convert a GameCycle to a SmoothServerTick
|
||
|
sint32 convertToSmoothServerTick(NLMISC::TGameCycle t) const { return (sint32)(FIRST_MANAGER->convertToSmoothServerTick(t)); }
|
||
|
// @}
|
||
|
|
||
|
void flushSendBuffer() { ALL_MANAGERS->flushSendBuffer(); }
|
||
|
void quit() { ALL_MANAGERS->quit(); }
|
||
|
|
||
|
/// Set the Lag Compensation Time in ms (default: 1000)
|
||
|
void setLCT( NLMISC::TTime lct ) { ALL_MANAGERS->setLCT( lct ); }
|
||
|
|
||
|
const NLNET::CInetAddress& getAddress() { return FIRST_MANAGER->getAddress(); }
|
||
|
|
||
|
/// Set player's reference position
|
||
|
void setReferencePosition(const NLMISC::CVectorD &position) { ALL_MANAGERS->setReferencePosition( position ); }
|
||
|
|
||
|
const std::vector<CNetworkConnection::CChange> &getChanges() { return FIRST_MANAGER->getChanges(); }
|
||
|
|
||
|
//void clearChanges() { ALL_MANAGERS->clearChanges(); }
|
||
|
|
||
|
void setImpulseCallback(CNetworkConnection::TImpulseCallback callback, void *argument = NULL) { FIRST_MANAGER->setImpulseCallback( callback, argument ); }
|
||
|
void setDataBase(NLMISC::CCDBNodeBranch *database) { ALL_MANAGERS->setDataBase( database ); }
|
||
|
bool connect(std::string &result) { bool res = false; std::vector<CNetManager*>::iterator inm; for( inm=_NetManagers.begin(); inm!=_NetManagers.end(); ++inm ) if ( (*inm)->connect( result ) ) res = true; return res; }
|
||
|
CNetworkConnection::TConnectionState getConnectionState() const { return FIRST_MANAGER->getConnectionState(); }
|
||
|
|
||
|
float getMeanPacketLoss() { return FIRST_MANAGER->getMeanPacketLoss(); }
|
||
|
uint32 getTotalLostPackets() { return FIRST_MANAGER->getTotalLostPackets(); }
|
||
|
float getMeanUpload() { return FIRST_MANAGER->getMeanUpload(); }
|
||
|
float getMeanDownload() { return FIRST_MANAGER->getMeanDownload(); }
|
||
|
|
||
|
const NLNET::CLoginCookie& getLoginCookie() const { return FIRST_MANAGER->getLoginCookie(); }
|
||
|
private:
|
||
|
|
||
|
std::vector<CNetManager*> _NetManagers;
|
||
|
};
|
||
|
|
||
|
/* ----------------------------
|
||
|
* Access to web, for mail/forum
|
||
|
*/
|
||
|
|
||
|
extern uint32 ShardId;
|
||
|
extern TSessionId CharacterHomeSessionId;
|
||
|
extern std::string WebServer;
|
||
|
|
||
|
////////////
|
||
|
// GLOBAL //
|
||
|
////////////
|
||
|
#ifdef CLIENT_MULTI
|
||
|
extern CNetManagerMulti NetMngr;
|
||
|
#else
|
||
|
extern CNetManager NetMngr;
|
||
|
#endif
|
||
|
extern CGenericXmlMsgHeaderManager GenericMsgHeaderMngr;
|
||
|
|
||
|
extern bool UseFemaleTitles;
|
||
|
|
||
|
|
||
|
#endif // CL_NET_MANAGER_H
|
||
|
|
||
|
/* End of net_manager.h */
|