1 // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
2 // Copyright (C) 2010 Winch Gate Property Limited
4 // This source file has been modified by the following contributors:
5 // Copyright (C) 2013 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
6 // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
8 // This program is free software: you can redistribute it and/or modify
9 // it under the terms of the GNU Affero General Public License as
10 // published by the Free Software Foundation, either version 3 of the
11 // License, or (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU Affero General Public License for more details.
18 // You should have received a copy of the GNU Affero General Public License
19 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #ifndef CL_NET_MANAGER_H
24 #define CL_NET_MANAGER_H
26 //#define CLIENT_MULTI
32 #include "nel/misc/types_nl.h"
34 #include "network_connection.h"
36 #include "game_share/generic_xml_msg_mngr.h"
37 #include "game_share/chat_group.h"
44 void initializeNetwork();
58 * Class to manage the network.
59 * \author Guillaume PUZIN
60 * \author Nevrax France
63 class CNetManager
: public CNetworkConnection
70 * Updates the whole connection with the frontend.
71 * Call this method evently.
73 * Behaviour in login state when a firewall does not grant the sending:
74 * - When a sending is refused (error "Blocking operation interrupted")
75 * the exception EBlockedByFirewall in thrown. The first time, a time-out is armed.
76 * - In a later attempt, if the time-out expired, the function sets state to
77 * Disconnect, then throws EBlockedByFirewall.
79 * \return bool 'true' if data were sent/received.
83 bool getConnectionQuality();
86 * Buffers a bitmemstream, that will be converted into a generic action, to be sent later to the server (at next update).
88 void push (NLMISC::CBitMemStream
&msg
);
91 * Buffers a target action
93 void pushTarget(CLFECOMMON::TCLEntityId slot
);
96 * Buffers a pick-up action
98 void pushPickup(CLFECOMMON::TCLEntityId slot
, LHSTATE::TLHState lootOrHarvest
);
103 void send(NLMISC::TGameCycle
);
106 * Send last information without changes (only acknowedges frontend)
111 * Disconnects the current connection
116 * Reset data and reinit the socket
121 * Waits for server to answer
123 void waitForServer();
125 #ifdef ENABLE_INCOMING_MSG_RECORDER
126 /// Start/stop replaying the incoming messages (in offline mode)
127 void setReplayingMode( bool onOff
, const std::string
& filename
= "");
128 bool isReplayStarting() const {return _IsReplayStarting
;}
132 bool _IsReplayStarting
;
135 NLMISC::CRefPtr
<NLMISC::CCDBNodeLeaf
> m_PingLeaf
;
136 NLMISC::CRefPtr
<NLMISC::CCDBNodeLeaf
> m_UploadLeaf
;
137 NLMISC::CRefPtr
<NLMISC::CCDBNodeLeaf
> m_DownloadLeaf
;
138 NLMISC::CRefPtr
<NLMISC::CCDBNodeLeaf
> m_PacketLostLeaf
;
139 NLMISC::CRefPtr
<NLMISC::CCDBNodeLeaf
> m_ServerStateLeaf
;
140 NLMISC::CRefPtr
<NLMISC::CCDBNodeLeaf
> m_ConnectionQualityLeaf
;
147 // The impulse callback to receive all msg from the frontend.
148 void impulseCallBack(NLMISC::CBitMemStream
&, sint32 packet
, void *arg
);
150 #define ALL_MANAGERS std::vector<CNetManager*>::iterator inm; for( inm=_NetManagers.begin(); inm!=_NetManagers.end(); ++inm ) (*inm)
151 #define FIRST_MANAGER _NetManagers[0]
156 class CNetManagerMulti
160 CNetManagerMulti() {}
162 /// Create the net managers
163 void init( const std::string
& cookie
, const std::string
& addr
);
166 ~CNetManagerMulti() { std::vector
<CNetManager
*>::iterator inm
; for( inm
=_NetManagers
.begin(); inm
!=_NetManagers
.end(); ++inm
) delete (*inm
); }
169 * Updates the whole connection with the frontend.
170 * Call this method evently.
171 * \return bool : 'true' if data were sent/received.
173 bool update() { ALL_MANAGERS
->update(); return true; }
176 * Buffers a bitmemstream, that will be converted into a generic action, to be sent later to the server (at next update).
178 void push (NLMISC::CBitMemStream
&msg
) { ALL_MANAGERS
->push( msg
); }
181 * Buffers a target action
183 void pushTarget(CLFECOMMON::TCLEntityId slot
) { ALL_MANAGERS
->pushTarget( slot
); }
186 * Buffers a pick-up action
188 void pushPickup(CLFECOMMON::TCLEntityId slot
, LHSTATE::TLHState lootOrHarvest
) { ALL_MANAGERS
->pushPickup( slot
, lootOrHarvest
); }
193 void send(NLMISC::TGameCycle gc
) { ALL_MANAGERS
->send( gc
); }
198 void send() { ALL_MANAGERS
->send(); }
201 * Disconnects the current connection
203 void disconnect() { ALL_MANAGERS
->disconnect(); }
207 * Waits for server to answer
209 void waitForServer() { ALL_MANAGERS
->waitForServer(); }
211 #ifdef ENABLE_INCOMING_MSG_RECORDER
212 void setRecordingMode( bool onOff
, const std::string
& filename
= "") {}
213 void setReplayingMode( bool onOff
, const std::string
& filename
= "") {}
214 bool isReplayStarting() const {return false;}
215 void startReplay() {}
216 bool isRecording() const {return false;}
217 bool isReplaying() const {return false;}
221 NLMISC::TTime
getCurrentClientTime() { return FIRST_MANAGER
->getCurrentClientTime(); } // the time currently played at this frame (in the past)
222 NLMISC::TGameCycle
getCurrentClientTick() { return FIRST_MANAGER
->getCurrentClientTick(); } // the tick for the current frame (also in the past)
223 NLMISC::TGameCycle
getCurrentServerTick() { return FIRST_MANAGER
->getCurrentServerTick(); } // the last tick sent by the server.
224 NLMISC::TTime
getMachineTimeAtTick() { return FIRST_MANAGER
->getMachineTimeAtTick(); } // the machine time at the beginning of the current tick
225 NLMISC::TTicks
getMachineTicksAtTick() { return FIRST_MANAGER
->getMachineTicksAtTick(); }
226 sint32
getMsPerTick() { return FIRST_MANAGER
->getMsPerTick(); }
227 NLMISC::TGameCycle
getSynchronize() { return FIRST_MANAGER
->getSynchronize(); }
228 uint32
getBestPing() { return FIRST_MANAGER
->getBestPing(); }
229 uint32
getPing() const { return FIRST_MANAGER
->getPing(); }
230 NLMISC::TTime
getLCT() { return FIRST_MANAGER
->getLCT(); } // Lag compensation time
231 NLMISC::TTime
getUpdateTime() { return FIRST_MANAGER
->getUpdateTime(); }
232 NLMISC::TTicks
getUpdateTicks() { return FIRST_MANAGER
->getUpdateTicks(); }
233 uint32
getUserId() { return 0; }
234 const char* getConnectionStateCStr() { return ""; }
235 bool getConnectionQuality() { return true; }
237 // Return an estimated smooth server tick. Increment only and accelerate/decelerate according to network
238 sint64
getCurrentSmoothServerTick() const { return FIRST_MANAGER
->getCurrentSmoothServerTick(); }
239 // Convert a GameCycle to a SmoothServerTick
240 sint32
convertToSmoothServerTick(NLMISC::TGameCycle t
) const { return (sint32
)(FIRST_MANAGER
->convertToSmoothServerTick(t
)); }
243 void flushSendBuffer() { ALL_MANAGERS
->flushSendBuffer(); }
244 void quit() { ALL_MANAGERS
->quit(); }
246 /// Set the Lag Compensation Time in ms (default: 1000)
247 void setLCT( NLMISC::TTime lct
) { ALL_MANAGERS
->setLCT( lct
); }
249 const NLNET::CInetAddress
& getAddress() { return FIRST_MANAGER
->getAddress(); }
251 /// Set player's reference position
252 void setReferencePosition(const NLMISC::CVectorD
&position
) { ALL_MANAGERS
->setReferencePosition( position
); }
254 const std::vector
<CNetworkConnection::CChange
> &getChanges() { return FIRST_MANAGER
->getChanges(); }
256 //void clearChanges() { ALL_MANAGERS->clearChanges(); }
258 void setImpulseCallback(CNetworkConnection::TImpulseCallback callback
, void *argument
= NULL
) { FIRST_MANAGER
->setImpulseCallback( callback
, argument
); }
259 void setDataBase(NLMISC::CCDBNodeBranch
*database
) { ALL_MANAGERS
->setDataBase( database
); }
260 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
; }
261 CNetworkConnection::TConnectionState
getConnectionState() const { return FIRST_MANAGER
->getConnectionState(); }
263 float getMeanPacketLoss() { return FIRST_MANAGER
->getMeanPacketLoss(); }
264 uint32
getTotalLostPackets() { return FIRST_MANAGER
->getTotalLostPackets(); }
265 float getMeanUpload() { return FIRST_MANAGER
->getMeanUpload(); }
266 float getMeanDownload() { return FIRST_MANAGER
->getMeanDownload(); }
268 const NLNET::CLoginCookie
& getLoginCookie() const { return FIRST_MANAGER
->getLoginCookie(); }
271 std::vector
<CNetManager
*> _NetManagers
;
274 /* ----------------------------
275 * Access to web, for mail/forum
278 extern uint32 ShardId
;
279 extern TSessionId CharacterHomeSessionId
;
280 extern std::string WebServer
;
286 extern CNetManagerMulti NetMngr
;
288 extern CNetManager NetMngr
;
290 extern CGenericXmlMsgHeaderManager GenericMsgHeaderMngr
;
292 extern bool UseFemaleTitles
;
295 #endif // CL_NET_MANAGER_H
297 /* End of net_manager.h */