Переглянути джерело

Fixed logic for reconnection attempts to local server. Cleanup.

Added distinct fields in config for local and remote connection.
Removed code for restoring last session since it does not works as
intended and often triggers after crash
Ivan Savenko 1 рік тому
батько
коміт
2396c14114

+ 0 - 6
client/CMT.cpp

@@ -405,12 +405,6 @@ int main(int argc, char * argv[])
 		ESelectionScreen sscreen = session["gamemode"].Integer() == 0 ? ESelectionScreen::newGame : ESelectionScreen::loadGame;
 		ESelectionScreen sscreen = session["gamemode"].Integer() == 0 ? ESelectionScreen::newGame : ESelectionScreen::loadGame;
 		CMM->openLobby(sscreen, session["host"].Bool(), &names, ELoadMode::MULTI);
 		CMM->openLobby(sscreen, session["host"].Bool(), &names, ELoadMode::MULTI);
 	}
 	}
-	
-	// Restore remote session - start game immediately
-	if(settings["server"]["reconnect"].Bool())
-	{
-		CSH->restoreLastSession();
-	}
 
 
 	if(!settings["session"]["headless"].Bool())
 	if(!settings["session"]["headless"].Bool())
 	{
 	{

+ 34 - 81
client/CServerHandler.cpp

@@ -67,8 +67,6 @@
 
 
 template<typename T> class CApplyOnLobby;
 template<typename T> class CApplyOnLobby;
 
 
-const std::string CServerHandler::localhostAddress{"127.0.0.1"};
-
 #if defined(VCMI_ANDROID) && !defined(SINGLE_PROCESS_APP)
 #if defined(VCMI_ANDROID) && !defined(SINGLE_PROCESS_APP)
 extern std::atomic_bool androidTestServerReadyFlag;
 extern std::atomic_bool androidTestServerReadyFlag;
 #endif
 #endif
@@ -200,7 +198,7 @@ void CServerHandler::startLocalServerAndConnect()
 	
 	
 #if defined(SINGLE_PROCESS_APP)
 #if defined(SINGLE_PROCESS_APP)
 	boost::condition_variable cond;
 	boost::condition_variable cond;
-	std::vector<std::string> args{"--uuid=" + uuid, "--port=" + std::to_string(getHostPort())};
+	std::vector<std::string> args{"--uuid=" + uuid, "--port=" + std::to_string(getLocalPort())};
 	if(settings["session"]["lobby"].Bool() && settings["session"]["host"].Bool())
 	if(settings["session"]["lobby"].Bool() && settings["session"]["host"].Bool())
 	{
 	{
 		args.push_back("--lobby=" + settings["session"]["address"].String());
 		args.push_back("--lobby=" + settings["session"]["address"].String());
@@ -260,28 +258,28 @@ void CServerHandler::startLocalServerAndConnect()
 
 
 	th->update(); //put breakpoint here to attach to server before it does something stupid
 	th->update(); //put breakpoint here to attach to server before it does something stupid
 
 
-	justConnectToServer(localhostAddress, 0);
+	connectToServer(getLocalHostname(), getLocalPort());
 
 
 	logNetwork->trace("\tConnecting to the server: %d ms", th->getDiff());
 	logNetwork->trace("\tConnecting to the server: %d ms", th->getDiff());
 }
 }
 
 
-void CServerHandler::justConnectToServer(const std::string & addr, const ui16 port)
+void CServerHandler::connectToServer(const std::string & addr, const ui16 port)
 {
 {
-	logNetwork->info("Establishing connection...");
+	logNetwork->info("Establishing connection to %s:%d...", addr, port);
 	state = EClientState::CONNECTING;
 	state = EClientState::CONNECTING;
+	serverHostname = addr;
+	serverPort = port;
 
 
-	if(!addr.empty() && addr != getHostAddress())
+	if (!isServerLocal())
 	{
 	{
-		Settings serverAddress = settings.write["server"]["server"];
+		Settings serverAddress = settings.write["server"]["remoteHostname"];
 		serverAddress->String() = addr;
 		serverAddress->String() = addr;
-	}
-	if(port && port != getHostPort())
-	{
-		Settings serverPort = settings.write["server"]["port"];
+
+		Settings serverPort = settings.write["server"]["remotePort"];
 		serverPort->Integer() = port;
 		serverPort->Integer() = port;
 	}
 	}
 
 
-	networkClient->start(addr.size() ? addr : getHostAddress(), port ? port : getHostPort());
+	networkClient->start(addr, port);
 }
 }
 
 
 void CServerHandler::onConnectionFailed(const std::string & errorMessage)
 void CServerHandler::onConnectionFailed(const std::string & errorMessage)
@@ -289,7 +287,7 @@ void CServerHandler::onConnectionFailed(const std::string & errorMessage)
 	if (isServerLocal())
 	if (isServerLocal())
 	{
 	{
 		// retry - local server might be still starting up
 		// retry - local server might be still starting up
-		logNetwork->debug("\nCannot establish connection. %s Retrying...", errorMessage);
+		logNetwork->debug("\nCannot establish connection. %s. Retrying...", errorMessage);
 		networkClient->setTimer(std::chrono::milliseconds(100));
 		networkClient->setTimer(std::chrono::milliseconds(100));
 	}
 	}
 	else
 	else
@@ -308,8 +306,8 @@ void CServerHandler::onTimer()
 		return;
 		return;
 	}
 	}
 
 
-	//FIXME: pass parameters from initial attempt
-	networkClient->start(getHostAddress(), getHostPort());
+	assert(isServerLocal());
+	networkClient->start(getLocalHostname(), getLocalPort());
 }
 }
 
 
 void CServerHandler::onConnectionEstablished(const std::shared_ptr<NetworkConnection> & netConnection)
 void CServerHandler::onConnectionEstablished(const std::shared_ptr<NetworkConnection> & netConnection)
@@ -367,36 +365,34 @@ bool CServerHandler::isGuest() const
 	return !c || hostClientId != c->connectionID;
 	return !c || hostClientId != c->connectionID;
 }
 }
 
 
-ui16 CServerHandler::getDefaultPort()
+const std::string & CServerHandler::getLocalHostname() const
 {
 {
-	return static_cast<ui16>(settings["server"]["port"].Integer());
+	return settings["server"]["localHostname"].String();
 }
 }
 
 
-std::string CServerHandler::getDefaultPortStr()
+ui16 CServerHandler::getLocalPort() const
 {
 {
-	return std::to_string(getDefaultPort());
+	return settings["server"]["localPort"].Integer();
 }
 }
 
 
-std::string CServerHandler::getHostAddress() const
+const std::string & CServerHandler::getRemoteHostname() const
 {
 {
-	if(settings["session"]["lobby"].isNull() || !settings["session"]["lobby"].Bool())
-		return settings["server"]["server"].String();
-	
-	if(settings["session"]["host"].Bool())
-		return localhostAddress;
-	
-	return settings["session"]["address"].String();
+	return settings["server"]["remoteHostname"].String();
 }
 }
 
 
-ui16 CServerHandler::getHostPort() const
+ui16 CServerHandler::getRemotePort() const
 {
 {
-	if(settings["session"]["lobby"].isNull() || !settings["session"]["lobby"].Bool())
-		return getDefaultPort();
-	
-	if(settings["session"]["host"].Bool())
-		return getDefaultPort();
-	
-	return settings["session"]["port"].Integer();
+	return settings["server"]["remotePort"].Integer();
+}
+
+const std::string & CServerHandler::getCurrentHostname() const
+{
+	return serverHostname;
+}
+
+ui16 CServerHandler::getCurrentPort() const
+{
+	return serverPort;
 }
 }
 
 
 void CServerHandler::sendClientConnecting() const
 void CServerHandler::sendClientConnecting() const
@@ -667,23 +663,6 @@ void CServerHandler::startGameplay(VCMI_LIB_WRAP_NAMESPACE(CGameState) * gameSta
 	// After everything initialized we can accept CPackToClient netpacks
 	// After everything initialized we can accept CPackToClient netpacks
 	c->enterGameplayConnectionMode(client->gameState());
 	c->enterGameplayConnectionMode(client->gameState());
 	state = EClientState::GAMEPLAY;
 	state = EClientState::GAMEPLAY;
-	
-	//store settings to continue game
-	if(!isServerLocal() && isGuest())
-	{
-		Settings saveSession = settings.write["server"]["reconnect"];
-		saveSession->Bool() = true;
-		Settings saveUuid = settings.write["server"]["uuid"];
-		saveUuid->String() = uuid;
-		Settings saveNames = settings.write["server"]["names"];
-		saveNames->Vector().clear();
-		for(auto & name : myNames)
-		{
-			JsonNode jsonName;
-			jsonName.String() = name;
-			saveNames->Vector().push_back(jsonName);
-		}
-	}
 }
 }
 
 
 void CServerHandler::endGameplay(bool closeConnection, bool restart)
 void CServerHandler::endGameplay(bool closeConnection, bool restart)
@@ -714,10 +693,6 @@ void CServerHandler::endGameplay(bool closeConnection, bool restart)
 	
 	
 	if(c)
 	if(c)
 		c->enterLobbyConnectionMode();
 		c->enterLobbyConnectionMode();
-	
-	//reset settings
-	Settings saveSession = settings.write["server"]["reconnect"];
-	saveSession->Bool() = false;
 }
 }
 
 
 void CServerHandler::startCampaignScenario(HighScoreParameter param, std::shared_ptr<CampaignState> cs)
 void CServerHandler::startCampaignScenario(HighScoreParameter param, std::shared_ptr<CampaignState> cs)
@@ -812,28 +787,6 @@ ui8 CServerHandler::getLoadMode()
 	return loadMode;
 	return loadMode;
 }
 }
 
 
-void CServerHandler::restoreLastSession()
-{
-	auto loadSession = [this]()
-	{
-		uuid = settings["server"]["uuid"].String();
-		for(auto & name : settings["server"]["names"].Vector())
-			myNames.push_back(name.String());
-		resetStateForLobby(StartInfo::LOAD_GAME, &myNames);
-		screenType = ESelectionScreen::loadGame;
-		justConnectToServer(settings["server"]["server"].String(), settings["server"]["port"].Integer());
-	};
-	
-	auto cleanUpSession = []()
-	{
-		//reset settings
-		Settings saveSession = settings.write["server"]["reconnect"];
-		saveSession->Bool() = false;
-	};
-	
-	CInfoWindow::showYesNoDialog(VLC->generaltexth->translate("vcmi.server.confirmReconnect"), {}, loadSession, cleanUpSession);
-}
-
 void CServerHandler::debugStartTest(std::string filename, bool save)
 void CServerHandler::debugStartTest(std::string filename, bool save)
 {
 {
 	logGlobal->info("Starting debug test with file: %s", filename);
 	logGlobal->info("Starting debug test with file: %s", filename);
@@ -851,7 +804,7 @@ void CServerHandler::debugStartTest(std::string filename, bool save)
 		screenType = ESelectionScreen::newGame;
 		screenType = ESelectionScreen::newGame;
 	}
 	}
 	if(settings["session"]["donotstartserver"].Bool())
 	if(settings["session"]["donotstartserver"].Bool())
-		justConnectToServer(localhostAddress, 3030);
+		connectToServer(getLocalHostname(), getLocalPort());
 	else
 	else
 		startLocalServerAndConnect();
 		startLocalServerAndConnect();
 
 
@@ -975,7 +928,7 @@ void CServerHandler::threadRunServer()
 	setThreadName("runServer");
 	setThreadName("runServer");
 	const std::string logName = (VCMIDirs::get().userLogsPath() / "server_log.txt").string();
 	const std::string logName = (VCMIDirs::get().userLogsPath() / "server_log.txt").string();
 	std::string comm = VCMIDirs::get().serverPath().string()
 	std::string comm = VCMIDirs::get().serverPath().string()
-		+ " --port=" + std::to_string(getHostPort())
+		+ " --port=" + std::to_string(getLocalPort())
 		+ " --run-by-client"
 		+ " --run-by-client"
 		+ " --uuid=" + uuid;
 		+ " --uuid=" + uuid;
 	if(settings["session"]["lobby"].Bool() && settings["session"]["host"].Bool())
 	if(settings["session"]["lobby"].Bool() && settings["session"]["host"].Bool())

+ 14 - 11
client/CServerHandler.h

@@ -103,6 +103,12 @@ class CServerHandler : public IServerAPI, public LobbyInfo, public INetworkClien
 	void onTimer() override;
 	void onTimer() override;
 
 
 	void applyPackOnLobbyScreen(CPackForLobby & pack);
 	void applyPackOnLobbyScreen(CPackForLobby & pack);
+
+	std::string serverHostname;
+	ui16 serverPort;
+
+	bool isServerLocal() const;
+
 public:
 public:
 	std::shared_ptr<CConnection> c;
 	std::shared_ptr<CConnection> c;
 
 
@@ -125,17 +131,12 @@ public:
 
 
 	CondSh<bool> campaignServerRestartLock;
 	CondSh<bool> campaignServerRestartLock;
 
 
-	static const std::string localhostAddress;
-
 	CServerHandler();
 	CServerHandler();
 	~CServerHandler();
 	~CServerHandler();
 	
 	
-	std::string getHostAddress() const;
-	ui16 getHostPort() const;
-
 	void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr);
 	void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr);
 	void startLocalServerAndConnect();
 	void startLocalServerAndConnect();
-	void justConnectToServer(const std::string & addr, const ui16 port);
+	void connectToServer(const std::string & addr, const ui16 port);
 
 
 	// Helpers for lobby state access
 	// Helpers for lobby state access
 	std::set<PlayerColor> getHumanColors();
 	std::set<PlayerColor> getHumanColors();
@@ -143,12 +144,16 @@ public:
 	bool isMyColor(PlayerColor color) const;
 	bool isMyColor(PlayerColor color) const;
 	ui8 myFirstId() const; // Used by chat only!
 	ui8 myFirstId() const; // Used by chat only!
 
 
-	bool isServerLocal() const;
 	bool isHost() const;
 	bool isHost() const;
 	bool isGuest() const;
 	bool isGuest() const;
 
 
-	static ui16 getDefaultPort();
-	static std::string getDefaultPortStr();
+	const std::string & getCurrentHostname() const;
+	const std::string & getLocalHostname() const;
+	const std::string & getRemoteHostname() const;
+
+	ui16 getCurrentPort() const;
+	ui16 getLocalPort() const;
+	ui16 getRemotePort() const;
 
 
 	// Lobby server API for UI
 	// Lobby server API for UI
 	void sendClientConnecting() const override;
 	void sendClientConnecting() const override;
@@ -182,8 +187,6 @@ public:
 	int howManyPlayerInterfaces();
 	int howManyPlayerInterfaces();
 	ui8 getLoadMode();
 	ui8 getLoadMode();
 
 
-	void restoreLastSession();
-
 	void visitForLobby(CPackForLobby & lobbyPack);
 	void visitForLobby(CPackForLobby & lobbyPack);
 	void visitForClient(CPackForClient & clientPack);
 	void visitForClient(CPackForClient & clientPack);
 };
 };

+ 3 - 3
client/mainmenu/CMainMenu.cpp

@@ -568,8 +568,8 @@ CSimpleJoinScreen::CSimpleJoinScreen(bool host)
 		inputPort->filters += std::bind(&CTextInput::numberFilter, _1, _2, 0, 65535);
 		inputPort->filters += std::bind(&CTextInput::numberFilter, _1, _2, 0, 65535);
 		inputAddress->giveFocus();
 		inputAddress->giveFocus();
 	}
 	}
-	inputAddress->setText(host ? CServerHandler::localhostAddress : CSH->getHostAddress(), true);
-	inputPort->setText(std::to_string(CSH->getHostPort()), true);
+	inputAddress->setText(host ? CSH->getLocalHostname() : CSH->getRemoteHostname(), true);
+	inputPort->setText(std::to_string(host ? CSH->getLocalPort() : CSH->getRemotePort()), true);
 
 
 	buttonCancel = std::make_shared<CButton>(Point(142, 142), AnimationPath::builtin("MUBCANC.DEF"), CGI->generaltexth->zelp[561], std::bind(&CSimpleJoinScreen::leaveScreen, this), EShortcut::GLOBAL_CANCEL);
 	buttonCancel = std::make_shared<CButton>(Point(142, 142), AnimationPath::builtin("MUBCANC.DEF"), CGI->generaltexth->zelp[561], std::bind(&CSimpleJoinScreen::leaveScreen, this), EShortcut::GLOBAL_CANCEL);
 	statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 186, 218, 18), 7, 186));
 	statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 186, 218, 18), 7, 186));
@@ -614,7 +614,7 @@ void CSimpleJoinScreen::startConnection(const std::string & addr, ui16 port)
 	if(addr.empty())
 	if(addr.empty())
 		CSH->startLocalServerAndConnect();
 		CSH->startLocalServerAndConnect();
 	else
 	else
-		CSH->justConnectToServer(addr, port);
+		CSH->connectToServer(addr, port);
 }
 }
 
 
 CLoadingScreen::CLoadingScreen()
 CLoadingScreen::CLoadingScreen()

+ 9 - 22
config/schemas/settings.json

@@ -357,19 +357,23 @@
 			"type" : "object",
 			"type" : "object",
 			"additionalProperties" : false,
 			"additionalProperties" : false,
 			"default" : {},
 			"default" : {},
-			"required" : [ "server", "port", "localInformation", "playerAI", "alliedAI", "friendlyAI", "neutralAI", "enemyAI", "reconnect", "uuid", "names" ],
+			"required" : [ "localHostname", "localPort", "remoteHostname", "remotePort", "playerAI", "alliedAI", "friendlyAI", "neutralAI", "enemyAI" ],
 			"properties" : {
 			"properties" : {
-				"server" : {
+				"localHostname" : {
 					"type" : "string",
 					"type" : "string",
 					"default" : "127.0.0.1"
 					"default" : "127.0.0.1"
 				},
 				},
-				"port" : {
+				"localPort" : {
 					"type" : "number",
 					"type" : "number",
 					"default" : 3030
 					"default" : 3030
 				},
 				},
-				"localInformation" : {
+				"remoteHostname" : {
+					"type" : "string",
+					"default" : ""
+				},
+				"remotePort" : {
 					"type" : "number",
 					"type" : "number",
-					"default" : 2
+					"default" : 3030
 				},
 				},
 				"playerAI" : {
 				"playerAI" : {
 					"type" : "string",
 					"type" : "string",
@@ -390,23 +394,6 @@
 				"enemyAI" : {
 				"enemyAI" : {
 					"type" : "string",
 					"type" : "string",
 					"default" : "BattleAI"
 					"default" : "BattleAI"
-				},
-				"reconnect" : {
-					"type" : "boolean",
-					"default" : false
-				},
-				"uuid" : {
-					"type" : "string",
-					"default" : ""
-				},
-				"names" : {
-					"type" : "array",
-					"default" : [],
-					"items" :
-					{
-						"type" : "string",
-						"default" : ""
-					}
 				}
 				}
 			}
 			}
 		},
 		},