Ticket #3700: 3700.2.txt

File 3700.2.txt, 22.7 KB (added by Andy Alt, 7 years ago)

does not build yet

Line 
1Index: source/gui/scripting/ScriptFunctions.cpp
2===================================================================
3--- source/gui/scripting/ScriptFunctions.cpp (revision 19356)
4+++ source/gui/scripting/ScriptFunctions.cpp (working copy)
5@@ -349,7 +349,7 @@
6 }
7
8 g_Game = new CGame();
9- g_NetClient = new CNetClient(g_Game, true);
10+ g_NetClient = new CNetClientWorker(g_Game, true);
11 g_NetClient->SetUserName(playerName);
12
13 if (!g_NetClient->SetupConnection("127.0.0.1", serverPort))
14@@ -367,7 +367,7 @@
15 ENSURE(!g_Game);
16
17 g_Game = new CGame();
18- g_NetClient = new CNetClient(g_Game, false);
19+ g_NetClient = new CNetClientWorker(g_Game, false);
20 g_NetClient->SetUserName(playerName);
21 if (!g_NetClient->SetupConnection(serverAddress, serverPort))
22 {
23Index: source/network/NetClient.cpp
24===================================================================
25--- source/network/NetClient.cpp (revision 19356)
26+++ source/network/NetClient.cpp (working copy)
27@@ -45,7 +45,7 @@
28 {
29 NONCOPYABLE(CNetFileReceiveTask_ClientRejoin);
30 public:
31- CNetFileReceiveTask_ClientRejoin(CNetClient& client)
32+ CNetFileReceiveTask_ClientRejoin(CNetClientWorker& client)
33 : m_Client(client)
34 {
35 }
36@@ -63,10 +63,10 @@
37 }
38
39 private:
40- CNetClient& m_Client;
41+ CNetClientWorker& m_Client;
42 };
43
44-CNetClient::CNetClient(CGame* game, bool isLocalClient) :
45+CNetClientWorker::CNetClientWorker(CGame* game, bool isLocalClient) :
46 m_Session(NULL),
47 m_UserName(L"anonymous"),
48 m_GUID(ps_generate_guid()), m_HostID((u32)-1), m_ClientTurnManager(NULL), m_Game(game),
49@@ -79,7 +79,7 @@
50
51 void* context = this;
52
53- JS_AddExtraGCRootsTracer(GetScriptInterface().GetJSRuntime(), CNetClient::Trace, this);
54+ JS_AddExtraGCRootsTracer(GetScriptInterface().GetJSRuntime(), CNetClientWorker::Trace, this);
55
56 // Set up transitions for session
57 AddTransition(NCS_UNCONNECTED, (uint)NMT_CONNECT_COMPLETE, NCS_CONNECT, (void*)&OnConnect, context);
58@@ -139,13 +139,13 @@
59 SetFirstState(NCS_UNCONNECTED);
60 }
61
62-CNetClient::~CNetClient()
63+CNetClientWorker::~CNetClientWorker()
64 {
65 DestroyConnection();
66- JS_RemoveExtraGCRootsTracer(GetScriptInterface().GetJSRuntime(), CNetClient::Trace, this);
67+ JS_RemoveExtraGCRootsTracer(GetScriptInterface().GetJSRuntime(), CNetClientWorker::Trace, this);
68 }
69
70-void CNetClient::TraceMember(JSTracer *trc)
71+void CNetClientWorker::TraceMember(JSTracer *trc)
72 {
73 for (JS::Heap<JS::Value>& guiMessage : m_GuiMessageQueue)
74 JS_CallValueTracer(trc, &guiMessage, "m_GuiMessageQueue");
75@@ -158,7 +158,7 @@
76 m_UserName = username;
77 }
78
79-bool CNetClient::SetupConnection(const CStr& server, const u16 port)
80+bool CNetClientWorker::SetupConnection(const CStr& server, const u16 port)
81 {
82 CNetClientSession* session = new CNetClientSession(*this);
83 bool ok = session->Connect(server, port, m_IsLocalClient);
84@@ -166,13 +166,13 @@
85 return ok;
86 }
87
88-void CNetClient::SetAndOwnSession(CNetClientSession* session)
89+void CNetClientWorker::SetAndOwnSession(CNetClientSession* session)
90 {
91 delete m_Session;
92 m_Session = session;
93 }
94
95-void CNetClient::DestroyConnection()
96+void CNetClientWorker::DestroyConnection()
97 {
98 // Send network messages from the current frame before connection is destroyed.
99 if (m_ClientTurnManager)
100@@ -183,7 +183,7 @@
101 SAFE_DELETE(m_Session);
102 }
103
104-void CNetClient::Poll()
105+void CNetClientWorker::Poll()
106 {
107 if (!m_Session)
108 return;
109@@ -192,7 +192,7 @@
110 m_Session->Poll();
111 }
112
113-void CNetClient::CheckServerConnection()
114+void CNetClientWorker::CheckServerConnection()
115 {
116 // Trigger local warnings if the connection to the server is bad.
117 // At most once per second.
118@@ -227,13 +227,13 @@
119 }
120 }
121
122-void CNetClient::Flush()
123+void CNetClientWorker::Flush()
124 {
125 if (m_Session)
126 m_Session->Flush();
127 }
128
129-void CNetClient::GuiPoll(JS::MutableHandleValue ret)
130+void CNetClientWorker::GuiPoll(JS::MutableHandleValue ret)
131 {
132 if (m_GuiMessageQueue.empty())
133 {
134@@ -245,7 +245,7 @@
135 m_GuiMessageQueue.pop_front();
136 }
137
138-void CNetClient::PushGuiMessage(const JS::HandleValue message)
139+void CNetClientWorker::PushGuiMessage(const JS::HandleValue message)
140 {
141 ENSURE(!message.isUndefined());
142
143@@ -252,7 +252,7 @@
144 m_GuiMessageQueue.push_back(JS::Heap<JS::Value>(message));
145 }
146
147-std::string CNetClient::TestReadGuiMessages()
148+std::string CNetClientWorker::TestReadGuiMessages()
149 {
150 JSContext* cx = GetScriptInterface().GetContext();
151 JSAutoRequest rq(cx);
152@@ -269,12 +269,12 @@
153 return r;
154 }
155
156-ScriptInterface& CNetClient::GetScriptInterface()
157+ScriptInterface& CNetClientWorker::GetScriptInterface()
158 {
159 return m_Game->GetSimulation2()->GetScriptInterface();
160 }
161
162-void CNetClient::PostPlayerAssignmentsToScript()
163+void CNetClientWorker::PostPlayerAssignmentsToScript()
164 {
165 JSContext* cx = GetScriptInterface().GetContext();
166 JSAutoRequest rq(cx);
167@@ -298,7 +298,7 @@
168 PushGuiMessage(msg);
169 }
170
171-bool CNetClient::SendMessage(const CNetMessage* message)
172+bool CNetClientWorker::SendMessage(const CNetMessage* message)
173 {
174 if (!m_Session)
175 return false;
176@@ -306,12 +306,12 @@
177 return m_Session->SendMessage(message);
178 }
179
180-void CNetClient::HandleConnect()
181+void CNetClientWorker::HandleConnect()
182 {
183 Update((uint)NMT_CONNECT_COMPLETE, NULL);
184 }
185
186-void CNetClient::HandleDisconnect(u32 reason)
187+void CNetClientWorker::HandleDisconnect(u32 reason)
188 {
189 JSContext* cx = GetScriptInterface().GetContext();
190 JSAutoRequest rq(cx);
191@@ -328,7 +328,7 @@
192 SetCurrState(NCS_UNCONNECTED);
193 }
194
195-void CNetClient::SendGameSetupMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface)
196+void CNetClientWorker::SendGameSetupMessage(JS::MutableHandleValue attrs, ScriptInterface& scriptInterface)
197 {
198 CGameSetupMessage gameSetup(scriptInterface);
199 gameSetup.m_Data = attrs;
200@@ -335,7 +335,7 @@
201 SendMessage(&gameSetup);
202 }
203
204-void CNetClient::SendAssignPlayerMessage(const int playerID, const CStr& guid)
205+void CNetClientWorker::SendAssignPlayerMessage(const int playerID, const CStr& guid)
206 {
207 CAssignPlayerMessage assignPlayer;
208 assignPlayer.m_PlayerID = playerID;
209@@ -343,7 +343,7 @@
210 SendMessage(&assignPlayer);
211 }
212
213-void CNetClient::SendChatMessage(const std::wstring& text)
214+void CNetClientWorker::SendChatMessage(const std::wstring& text)
215 {
216 CChatMessage chat;
217 chat.m_Message = text;
218@@ -350,7 +350,7 @@
219 SendMessage(&chat);
220 }
221
222-void CNetClient::SendReadyMessage(const int status)
223+void CNetClientWorker::SendReadyMessage(const int status)
224 {
225 CReadyMessage readyStatus;
226 readyStatus.m_Status = status;
227@@ -357,25 +357,25 @@
228 SendMessage(&readyStatus);
229 }
230
231-void CNetClient::SendClearAllReadyMessage()
232+void CNetClientWorker::SendClearAllReadyMessage()
233 {
234 CClearAllReadyMessage clearAllReady;
235 SendMessage(&clearAllReady);
236 }
237
238-void CNetClient::SendStartGameMessage()
239+void CNetClientWorker::SendStartGameMessage()
240 {
241 CGameStartMessage gameStart;
242 SendMessage(&gameStart);
243 }
244
245-void CNetClient::SendRejoinedMessage()
246+void CNetClientWorker::SendRejoinedMessage()
247 {
248 CRejoinedMessage rejoinedMessage;
249 SendMessage(&rejoinedMessage);
250 }
251
252-void CNetClient::SendKickPlayerMessage(const CStrW& playerName, bool ban)
253+void CNetClientWorker::SendKickPlayerMessage(const CStrW& playerName, bool ban)
254 {
255 CKickedMessage kickPlayer;
256 kickPlayer.m_Name = playerName;
257@@ -383,7 +383,7 @@
258 SendMessage(&kickPlayer);
259 }
260
261-void CNetClient::SendPausedMessage(bool pause)
262+void CNetClientWorker::SendPausedMessage(bool pause)
263 {
264 CClientPausedMessage pausedMessage;
265 pausedMessage.m_Pause = pause;
266@@ -390,7 +390,7 @@
267 SendMessage(&pausedMessage);
268 }
269
270-bool CNetClient::HandleMessage(CNetMessage* message)
271+bool CNetClientWorker::HandleMessage(CNetMessage* message)
272 {
273 // Handle non-FSM messages first
274
275@@ -433,7 +433,7 @@
276 return ok;
277 }
278
279-void CNetClient::LoadFinished()
280+void CNetClientWorker::LoadFinished()
281 {
282 JSContext* cx = GetScriptInterface().GetContext();
283 JSAutoRequest rq(cx);
284@@ -476,11 +476,11 @@
285 SendMessage(&loaded);
286 }
287
288-bool CNetClient::OnConnect(void* context, CFsmEvent* event)
289+bool CNetClientWorker::OnConnect(void* context, CFsmEvent* event)
290 {
291 ENSURE(event->GetType() == (uint)NMT_CONNECT_COMPLETE);
292
293- CNetClient* client = (CNetClient*)context;
294+ CNetClientWorker* client = (CNetClientWorker*)context;
295
296 JSContext* cx = client->GetScriptInterface().GetContext();
297 JSAutoRequest rq(cx);
298@@ -492,11 +492,11 @@
299 return true;
300 }
301
302-bool CNetClient::OnHandshake(void* context, CFsmEvent* event)
303+bool CNetClientWorker::OnHandshake(void* context, CFsmEvent* event)
304 {
305 ENSURE(event->GetType() == (uint)NMT_SERVER_HANDSHAKE);
306
307- CNetClient* client = (CNetClient*)context;
308+ CNetClientWorker* client = (CNetClientWorker*)context;
309
310 CCliHandshakeMessage handshake;
311 handshake.m_MagicResponse = PS_PROTOCOL_MAGIC_RESPONSE;
312@@ -507,11 +507,11 @@
313 return true;
314 }
315
316-bool CNetClient::OnHandshakeResponse(void* context, CFsmEvent* event)
317+bool CNetClientWorker::OnHandshakeResponse(void* context, CFsmEvent* event)
318 {
319 ENSURE(event->GetType() == (uint)NMT_SERVER_HANDSHAKE_RESPONSE);
320
321- CNetClient* client = (CNetClient*)context;
322+ CNetClientWorker* client = (CNetClientWorker*)context;
323
324 CAuthenticateMessage authenticate;
325 authenticate.m_GUID = client->m_GUID;
326@@ -523,11 +523,11 @@
327 return true;
328 }
329
330-bool CNetClient::OnAuthenticate(void* context, CFsmEvent* event)
331+bool CNetClientWorker::OnAuthenticate(void* context, CFsmEvent* event)
332 {
333 ENSURE(event->GetType() == (uint)NMT_AUTHENTICATE_RESULT);
334
335- CNetClient* client = (CNetClient*)context;
336+ CNetClientWorker* client = (CNetClientWorker*)context;
337
338 JSContext* cx = client->GetScriptInterface().GetContext();
339 JSAutoRequest rq(cx);
340@@ -547,11 +547,11 @@
341 return true;
342 }
343
344-bool CNetClient::OnChat(void* context, CFsmEvent* event)
345+bool CNetClientWorker::OnChat(void* context, CFsmEvent* event)
346 {
347 ENSURE(event->GetType() == (uint)NMT_CHAT);
348
349- CNetClient* client = (CNetClient*)context;
350+ CNetClientWorker* client = (CNetClientWorker*)context;
351 JSContext* cx = client->GetScriptInterface().GetContext();
352 JSAutoRequest rq(cx);
353
354@@ -566,11 +566,11 @@
355 return true;
356 }
357
358-bool CNetClient::OnReady(void* context, CFsmEvent* event)
359+bool CNetClientWorker::OnReady(void* context, CFsmEvent* event)
360 {
361 ENSURE(event->GetType() == (uint)NMT_READY);
362
363- CNetClient* client = (CNetClient*)context;
364+ CNetClientWorker* client = (CNetClientWorker*)context;
365 JSContext* cx = client->GetScriptInterface().GetContext();
366 JSAutoRequest rq(cx);
367
368@@ -585,11 +585,11 @@
369 return true;
370 }
371
372-bool CNetClient::OnGameSetup(void* context, CFsmEvent* event)
373+bool CNetClientWorker::OnGameSetup(void* context, CFsmEvent* event)
374 {
375 ENSURE(event->GetType() == (uint)NMT_GAME_SETUP);
376
377- CNetClient* client = (CNetClient*)context;
378+ CNetClientWorker* client = (CNetClientWorker*)context;
379 JSContext* cx = client->GetScriptInterface().GetContext();
380 JSAutoRequest rq(cx);
381
382@@ -605,11 +605,11 @@
383 return true;
384 }
385
386-bool CNetClient::OnPlayerAssignment(void* context, CFsmEvent* event)
387+bool CNetClientWorker::OnPlayerAssignment(void* context, CFsmEvent* event)
388 {
389 ENSURE(event->GetType() == (uint)NMT_PLAYER_ASSIGNMENT);
390
391- CNetClient* client = (CNetClient*)context;
392+ CNetClientWorker* client = (CNetClientWorker*)context;
393
394 CPlayerAssignmentMessage* message = (CPlayerAssignmentMessage*)event->GetParamRef();
395
396@@ -632,11 +632,11 @@
397 return true;
398 }
399
400-bool CNetClient::OnGameStart(void* context, CFsmEvent* event)
401+bool CNetClientWorker::OnGameStart(void* context, CFsmEvent* event)
402 {
403 ENSURE(event->GetType() == (uint)NMT_GAME_START);
404
405- CNetClient* client = (CNetClient*)context;
406+ CNetClientWorker* client = (CNetClientWorker*)context;
407 JSContext* cx = client->GetScriptInterface().GetContext();
408 JSAutoRequest rq(cx);
409
410@@ -658,11 +658,11 @@
411 return true;
412 }
413
414-bool CNetClient::OnJoinSyncStart(void* context, CFsmEvent* event)
415+bool CNetClientWorker::OnJoinSyncStart(void* context, CFsmEvent* event)
416 {
417 ENSURE(event->GetType() == (uint)NMT_JOIN_SYNC_START);
418
419- CNetClient* client = (CNetClient*)context;
420+ CNetClientWorker* client = (CNetClientWorker*)context;
421
422 // The server wants us to start downloading the game state from it, so do so
423 client->m_Session->GetFileTransferer().StartTask(
424@@ -672,11 +672,11 @@
425 return true;
426 }
427
428-bool CNetClient::OnJoinSyncEndCommandBatch(void* context, CFsmEvent* event)
429+bool CNetClientWorker::OnJoinSyncEndCommandBatch(void* context, CFsmEvent* event)
430 {
431 ENSURE(event->GetType() == (uint)NMT_END_COMMAND_BATCH);
432
433- CNetClient* client = (CNetClient*)context;
434+ CNetClientWorker* client = (CNetClientWorker*)context;
435
436 CEndCommandBatchMessage* endMessage = (CEndCommandBatchMessage*)event->GetParamRef();
437
438@@ -688,11 +688,11 @@
439 return true;
440 }
441
442-bool CNetClient::OnRejoined(void* context, CFsmEvent* event)
443+bool CNetClientWorker::OnRejoined(void* context, CFsmEvent* event)
444 {
445 ENSURE(event->GetType() == (uint)NMT_REJOINED);
446
447- CNetClient* client = (CNetClient*)context;
448+ CNetClientWorker* client = (CNetClientWorker*)context;
449 JSContext* cx = client->GetScriptInterface().GetContext();
450 JSAutoRequest rq(cx);
451
452@@ -705,11 +705,11 @@
453 return true;
454 }
455
456-bool CNetClient::OnKicked(void *context, CFsmEvent* event)
457+bool CNetClientWorker::OnKicked(void *context, CFsmEvent* event)
458 {
459 ENSURE(event->GetType() == (uint)NMT_KICKED);
460
461- CNetClient* client = (CNetClient*)context;
462+ CNetClientWorker* client = (CNetClientWorker*)context;
463 JSContext* cx = client->GetScriptInterface().GetContext();
464 JSAutoRequest rq(cx);
465
466@@ -725,13 +725,13 @@
467 return true;
468 }
469
470-bool CNetClient::OnClientTimeout(void *context, CFsmEvent* event)
471+bool CNetClientWorker::OnClientTimeout(void *context, CFsmEvent* event)
472 {
473 // Report the timeout of some other client
474
475 ENSURE(event->GetType() == (uint)NMT_CLIENT_TIMEOUT);
476
477- CNetClient* client = (CNetClient*)context;
478+ CNetClientWorker* client = (CNetClientWorker*)context;
479 JSContext* cx = client->GetScriptInterface().GetContext();
480 JSAutoRequest rq(cx);
481
482@@ -749,13 +749,13 @@
483 return true;
484 }
485
486-bool CNetClient::OnClientPerformance(void *context, CFsmEvent* event)
487+bool CNetClientWorker::OnClientPerformance(void *context, CFsmEvent* event)
488 {
489 // Performance statistics for one or multiple clients
490
491 ENSURE(event->GetType() == (uint)NMT_CLIENT_PERFORMANCE);
492
493- CNetClient* client = (CNetClient*)context;
494+ CNetClientWorker* client = (CNetClientWorker*)context;
495 JSContext* cx = client->GetScriptInterface().GetContext();
496 JSAutoRequest rq(cx);
497
498@@ -780,7 +780,7 @@
499 return true;
500 }
501
502-bool CNetClient::OnClientsLoading(void *context, CFsmEvent *event)
503+bool CNetClientWorker::OnClientsLoading(void *context, CFsmEvent *event)
504 {
505 ENSURE(event->GetType() == (uint)NMT_CLIENTS_LOADING);
506
507@@ -791,7 +791,7 @@
508 for (const CClientsLoadingMessage::S_m_Clients& client : message->m_Clients)
509 guids.push_back(client.m_GUID);
510
511- CNetClient* client = (CNetClient*)context;
512+ CNetClientWorker* client = (CNetClientWorker*)context;
513 JSContext* cx = client->GetScriptInterface().GetContext();
514 JSAutoRequest rq(cx);
515
516@@ -802,11 +802,11 @@
517 return true;
518 }
519
520-bool CNetClient::OnClientPaused(void *context, CFsmEvent *event)
521+bool CNetClientWorker::OnClientPaused(void *context, CFsmEvent *event)
522 {
523 ENSURE(event->GetType() == (uint)NMT_CLIENT_PAUSED);
524
525- CNetClient* client = (CNetClient*)context;
526+ CNetClientWorker* client = (CNetClientWorker*)context;
527 JSContext* cx = client->GetScriptInterface().GetContext();
528 JSAutoRequest rq(cx);
529
530@@ -821,11 +821,11 @@
531 return true;
532 }
533
534-bool CNetClient::OnLoadedGame(void* context, CFsmEvent* event)
535+bool CNetClientWorker::OnLoadedGame(void* context, CFsmEvent* event)
536 {
537 ENSURE(event->GetType() == (uint)NMT_LOADED_GAME);
538
539- CNetClient* client = (CNetClient*)context;
540+ CNetClientWorker* client = (CNetClientWorker*)context;
541 JSContext* cx = client->GetScriptInterface().GetContext();
542 JSAutoRequest rq(cx);
543
544@@ -844,11 +844,11 @@
545 return true;
546 }
547
548-bool CNetClient::OnInGame(void *context, CFsmEvent* event)
549+bool CNetClientWorker::OnInGame(void *context, CFsmEvent* event)
550 {
551 // TODO: should split each of these cases into a separate method
552
553- CNetClient* client = (CNetClient*)context;
554+ CNetClientWorker* client = (CNetClientWorker*)context;
555
556 CNetMessage* message = (CNetMessage*)event->GetParamRef();
557 if (message)
558Index: source/network/NetClient.h
559===================================================================
560--- source/network/NetClient.h (revision 19356)
561+++ source/network/NetClient.h (working copy)
562@@ -23,6 +23,7 @@
563 #include "network/NetHost.h"
564 #include "scriptinterface/ScriptVal.h"
565
566+#include "ps/ThreadUtil.h"
567 #include "ps/CStr.h"
568
569 #include <deque>
570@@ -33,6 +34,8 @@
571 class CNetServer;
572 class ScriptInterface;
573
574+class CNetClientWorker;
575+
576 // NetClient session FSM states
577 enum
578 {
579@@ -54,14 +57,12 @@
580 * It provides an interface between the GUI, the network (via CNetClientSession),
581 * and the game (via CGame and CNetClientTurnManager).
582 */
583-class CNetClient : public CFsm
584+class CNetClient
585 {
586 NONCOPYABLE(CNetClient);
587
588- friend class CNetFileReceiveTask_ClientRejoin;
589-
590 public:
591- /**
592+ /**
593 * Construct a client associated with the given game object.
594 * The game must exist for the lifetime of this object.
595 */
596@@ -70,6 +71,35 @@
597 virtual ~CNetClient();
598
599 /**
600+ * Set the user's name that will be displayed to all players.
601+ * This must not be called after the connection setup.
602+ */
603+ void SetUserName(const CStrW& username);
604+
605+ /**
606+ * Set up a connection to the remote networked server.
607+ * @param server IP address or host name to connect to
608+ * @return true on success, false on connection failure
609+ */
610+ bool SetupConnection(const CStr& server, const u16 port);
611+
612+ private:
613+ CNetClientWorker* m_Worker;
614+};
615+
616+/**
617+ * Network server worker thread.
618+ *
619+ * Thread-safety:
620+ *
621+ *
622+ */
623+class CNetClientWorker
624+{
625+ NONCOPYABLE(CNetClientWorker);
626+
627+public:
628+ /**
629 * We assume that adding a tracing function that's only called
630 * during GC is better for performance than using a
631 * PersistentRooted<T> where each value needs to be added to
632@@ -77,18 +107,12 @@
633 */
634 static void Trace(JSTracer *trc, void *data)
635 {
636- reinterpret_cast<CNetClient*>(data)->TraceMember(trc);
637+ reinterpret_cast<CNetClientWorker*>(data)->TraceMember(trc);
638 }
639
640 void TraceMember(JSTracer *trc);
641
642 /**
643- * Set the user's name that will be displayed to all players.
644- * This must not be called after the connection setup.
645- */
646- void SetUserName(const CStrW& username);
647-
648- /**
649 * Returns the GUID of the local client.
650 * Used for distinguishing observers.
651 */
652@@ -95,13 +119,6 @@
653 CStr GetGUID() const { return m_GUID; }
654
655 /**
656- * Set up a connection to the remote networked server.
657- * @param server IP address or host name to connect to
658- * @return true on success, false on connection failure
659- */
660- bool SetupConnection(const CStr& server, const u16 port);
661-
662- /**
663 * Destroy the connection to the server.
664 * This client probably cannot be used again.
665 */
666@@ -216,6 +233,19 @@
667 void SendPausedMessage(bool pause);
668
669 private:
670+ friend class CNetClient;
671+ friend class CNetFileReceiveTask_ClientRejoin;
672+
673+ CNetClientWorker(CGame* game, bool isLocalClient);
674+ ~CNetClientWorker();
675+
676+ /**
677+ * Set up a connection to the remote networked server.
678+ * @param server IP address or host name to connect to
679+ * @return true on success, false on connection failure
680+ */
681+ bool SetupConnection(const CStr& server, const u16 port);
682+
683 // Net message / FSM transition handlers
684 static bool OnConnect(void* context, CFsmEvent* event);
685 static bool OnHandshake(void* context, CFsmEvent* event);
686Index: source/network/NetClientTurnManager.cpp
687===================================================================
688--- source/network/NetClientTurnManager.cpp (revision 19356)
689+++ source/network/NetClientTurnManager.cpp (working copy)
690@@ -33,7 +33,7 @@
691 #define NETCLIENTTURN_LOG(...)
692 #endif
693
694-CNetClientTurnManager::CNetClientTurnManager(CSimulation2& simulation, CNetClient& client, int clientId, IReplayLogger& replay)
695+CNetClientTurnManager::CNetClientTurnManager(CSimulation2& simulation, CNetClientWorker& client, int clientId, IReplayLogger& replay)
696 : CTurnManager(simulation, DEFAULT_TURN_LENGTH_MP, clientId, replay), m_NetClient(client)
697 {
698 }
699Index: source/network/NetClientTurnManager.h
700===================================================================
701--- source/network/NetClientTurnManager.h (revision 19356)
702+++ source/network/NetClientTurnManager.h (working copy)
703@@ -21,7 +21,7 @@
704 #include "simulation2/system/TurnManager.h"
705 #include "NetMessage.h"
706
707-class CNetClient;
708+class CNetClientWorker;
709
710 /**
711 * Implementation of CTurnManager for network clients.
712@@ -30,7 +30,7 @@
713 {
714 NONCOPYABLE(CNetClientTurnManager);
715 public:
716- CNetClientTurnManager(CSimulation2& simulation, CNetClient& client, int clientId, IReplayLogger& replay);
717+ CNetClientTurnManager(CSimulation2& simulation, CNetClientWorker& client, int clientId, IReplayLogger& replay);
718
719 void OnSimulationMessage(CSimulationMessage* msg) override;
720
721@@ -48,7 +48,7 @@
722
723 void NotifyFinishedUpdate(u32 turn) override;
724
725- CNetClient& m_NetClient;
726+ CNetClientWorker& m_NetClient;
727 };
728
729 #endif // INCLUDED_NETCLIENTTURNMANAGER
730Index: source/network/NetSession.cpp
731===================================================================
732--- source/network/NetSession.cpp (revision 19356)
733+++ source/network/NetSession.cpp (working copy)
734@@ -32,7 +32,7 @@
735
736 static const int CHANNEL_COUNT = 1;
737
738-CNetClientSession::CNetClientSession(CNetClient& client) :
739+CNetClientSession::CNetClientSession(CNetClientWorker& client) :
740 m_Client(client), m_FileTransferer(this), m_Host(NULL), m_Server(NULL), m_Stats(NULL)
741 {
742 }
743Index: source/network/NetSession.h
744===================================================================
745--- source/network/NetSession.h (revision 19356)
746+++ source/network/NetSession.h (working copy)
747@@ -34,7 +34,7 @@
748 */
749 extern const u32 MAXIMUM_HOST_TIMEOUT;
750
751-class CNetClient;
752+class CNetClientWorker;
753 class CNetServerWorker;
754
755 class CNetStatsTable;
756@@ -67,7 +67,7 @@
757 NONCOPYABLE(CNetClientSession);
758
759 public:
760- CNetClientSession(CNetClient& client);
761+ CNetClientSession(CNetClientWorker& client);
762 ~CNetClientSession();
763
764 bool Connect(const CStr& server, const u16 port, const bool isLocalClient);
765@@ -106,7 +106,7 @@
766 CNetFileTransferer& GetFileTransferer() { return m_FileTransferer; }
767
768 private:
769- CNetClient& m_Client;
770+ CNetClientWorker& m_Client;
771
772 CNetFileTransferer m_FileTransferer;
773
774Index: source/ps/GameSetup/GameSetup.cpp
775===================================================================
776--- source/ps/GameSetup/GameSetup.cpp (revision 19356)
777+++ source/ps/GameSetup/GameSetup.cpp (working copy)
778@@ -1498,7 +1498,7 @@
779 bool ok = g_NetServer->SetupConnection(PS_DEFAULT_PORT);
780 ENSURE(ok);
781
782- g_NetClient = new CNetClient(g_Game, true);
783+ g_NetClient = new CNetClientWorker(g_Game, true);
784 g_NetClient->SetUserName(userName);
785 g_NetClient->SetupConnection("127.0.0.1", PS_DEFAULT_PORT);
786 }
787@@ -1506,7 +1506,7 @@
788 {
789 InitPs(true, L"page_loading.xml", &scriptInterface, mpInitData);
790
791- g_NetClient = new CNetClient(g_Game, false);
792+ g_NetClient = new CNetClientWorker(g_Game, false);
793 g_NetClient->SetUserName(userName);
794
795 CStr ip = args.Get("autostart-client");