Explorar o código

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 hai 1 ano
pai
achega
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;
 		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())
 	{

+ 34 - 81
client/CServerHandler.cpp

@@ -67,8 +67,6 @@
 
 template<typename T> class CApplyOnLobby;
 
-const std::string CServerHandler::localhostAddress{"127.0.0.1"};
-
 #if defined(VCMI_ANDROID) && !defined(SINGLE_PROCESS_APP)
 extern std::atomic_bool androidTestServerReadyFlag;
 #endif
@@ -200,7 +198,7 @@ void CServerHandler::startLocalServerAndConnect()
 	
 #if defined(SINGLE_PROCESS_APP)
 	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())
 	{
 		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
 
-	justConnectToServer(localhostAddress, 0);
+	connectToServer(getLocalHostname(), getLocalPort());
 
 	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;
+	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;
-	}
-	if(port && port != getHostPort())
-	{
-		Settings serverPort = settings.write["server"]["port"];
+
+		Settings serverPort = settings.write["server"]["remotePort"];
 		serverPort->Integer() = port;
 	}
 
-	networkClient->start(addr.size() ? addr : getHostAddress(), port ? port : getHostPort());
+	networkClient->start(addr, port);
 }
 
 void CServerHandler::onConnectionFailed(const std::string & errorMessage)
@@ -289,7 +287,7 @@ void CServerHandler::onConnectionFailed(const std::string & errorMessage)
 	if (isServerLocal())
 	{
 		// 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));
 	}
 	else
@@ -308,8 +306,8 @@ void CServerHandler::onTimer()
 		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)
@@ -367,36 +365,34 @@ bool CServerHandler::isGuest() const
 	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
@@ -667,23 +663,6 @@ void CServerHandler::startGameplay(VCMI_LIB_WRAP_NAMESPACE(CGameState) * gameSta
 	// After everything initialized we can accept CPackToClient netpacks
 	c->enterGameplayConnectionMode(client->gameState());
 	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)
@@ -714,10 +693,6 @@ void CServerHandler::endGameplay(bool closeConnection, bool restart)
 	
 	if(c)
 		c->enterLobbyConnectionMode();
-	
-	//reset settings
-	Settings saveSession = settings.write["server"]["reconnect"];
-	saveSession->Bool() = false;
 }
 
 void CServerHandler::startCampaignScenario(HighScoreParameter param, std::shared_ptr<CampaignState> cs)
@@ -812,28 +787,6 @@ ui8 CServerHandler::getLoadMode()
 	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)
 {
 	logGlobal->info("Starting debug test with file: %s", filename);
@@ -851,7 +804,7 @@ void CServerHandler::debugStartTest(std::string filename, bool save)
 		screenType = ESelectionScreen::newGame;
 	}
 	if(settings["session"]["donotstartserver"].Bool())
-		justConnectToServer(localhostAddress, 3030);
+		connectToServer(getLocalHostname(), getLocalPort());
 	else
 		startLocalServerAndConnect();
 
@@ -975,7 +928,7 @@ void CServerHandler::threadRunServer()
 	setThreadName("runServer");
 	const std::string logName = (VCMIDirs::get().userLogsPath() / "server_log.txt").string();
 	std::string comm = VCMIDirs::get().serverPath().string()
-		+ " --port=" + std::to_string(getHostPort())
+		+ " --port=" + std::to_string(getLocalPort())
 		+ " --run-by-client"
 		+ " --uuid=" + uuid;
 	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 applyPackOnLobbyScreen(CPackForLobby & pack);
+
+	std::string serverHostname;
+	ui16 serverPort;
+
+	bool isServerLocal() const;
+
 public:
 	std::shared_ptr<CConnection> c;
 
@@ -125,17 +131,12 @@ public:
 
 	CondSh<bool> campaignServerRestartLock;
 
-	static const std::string localhostAddress;
-
 	CServerHandler();
 	~CServerHandler();
 	
-	std::string getHostAddress() const;
-	ui16 getHostPort() const;
-
 	void resetStateForLobby(const StartInfo::EMode mode, const std::vector<std::string> * names = nullptr);
 	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
 	std::set<PlayerColor> getHumanColors();
@@ -143,12 +144,16 @@ public:
 	bool isMyColor(PlayerColor color) const;
 	ui8 myFirstId() const; // Used by chat only!
 
-	bool isServerLocal() const;
 	bool isHost() 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
 	void sendClientConnecting() const override;
@@ -182,8 +187,6 @@ public:
 	int howManyPlayerInterfaces();
 	ui8 getLoadMode();
 
-	void restoreLastSession();
-
 	void visitForLobby(CPackForLobby & lobbyPack);
 	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);
 		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);
 	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())
 		CSH->startLocalServerAndConnect();
 	else
-		CSH->justConnectToServer(addr, port);
+		CSH->connectToServer(addr, port);
 }
 
 CLoadingScreen::CLoadingScreen()

+ 9 - 22
config/schemas/settings.json

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