Changeset - r9429:9bb0dfa4c67f
[Not reviewed]
master
0 2 0
rubidium - 16 years ago 2008-05-30 20:08:32
rubidium@openttd.org
(svn r13344) -Codechange: remove some code duplication.
2 files changed with 11 insertions and 24 deletions:
0 comments (0 inline, 0 general)
src/network/network.cpp
Show inline comments
 
@@ -856,54 +856,64 @@ static bool NetworkListen()
 
	if (listen(ls, 1) != 0) {
 
		ServerStartError("listen() failed");
 
		return false;
 
	}
 

	
 
	_listensocket = ls;
 

	
 
	return true;
 
}
 

	
 
// Close all current connections
 
static void NetworkClose()
 
{
 
	NetworkTCPSocketHandler *cs;
 

	
 
	FOR_ALL_CLIENTS(cs) {
 
		if (!_network_server) {
 
			SEND_COMMAND(PACKET_CLIENT_QUIT)("leaving");
 
			cs->Send_Packets();
 
		}
 
		NetworkCloseClient(cs);
 
	}
 

	
 
	if (_network_server) {
 
		// We are a server, also close the listensocket
 
		/* We are a server, also close the listensocket */
 
		closesocket(_listensocket);
 
		_listensocket = INVALID_SOCKET;
 
		DEBUG(net, 1, "Closed listener");
 
	}
 
		NetworkUDPCloseAll();
 

	
 
	/* Free all queued commands */
 
	while (_local_command_queue != NULL) {
 
		CommandPacket *p = _local_command_queue;
 
		_local_command_queue = _local_command_queue->next;
 
		free(p);
 
	}
 

	
 
	_networking = false;
 
	_network_server = false;
 
}
 

	
 
// Inits the network (cleans sockets and stuff)
 
static void NetworkInitialize()
 
{
 
	NetworkTCPSocketHandler *cs;
 

	
 
	_local_command_queue = NULL;
 

	
 
	// Clean all client-sockets
 
	for (cs = _clients; cs != &_clients[MAX_CLIENTS]; cs++) {
 
		cs->Initialize();
 
	}
 

	
 
	// Clean the client_info memory
 
	memset(&_network_client_info, 0, sizeof(_network_client_info));
 
	memset(&_network_player_info, 0, sizeof(_network_player_info));
 

	
 
	_sync_frame = 0;
 
	_network_first_time = true;
 

	
 
	_network_reconnect = 0;
 

	
 
	NetworkUDPInitialize();
 
@@ -967,49 +977,48 @@ void NetworkRebuildHostList()
 
		if (item->manually) {
 
			free(_network_host_list[i]);
 
			_network_host_list[i++] = str_fmt("%s:%i", item->info.hostname, item->port);
 
		}
 
		item = item->next;
 
	}
 

	
 
	for (; i < lengthof(_network_host_list); i++) {
 
		free(_network_host_list[i]);
 
		_network_host_list[i] = NULL;
 
	}
 
}
 

	
 
// Used by clients, to connect to a server
 
bool NetworkClientConnectGame(const char *host, uint16 port)
 
{
 
	if (!_network_available) return false;
 

	
 
	if (port == 0) return false;
 

	
 
	ttd_strlcpy(_settings_client.network.last_host, host, sizeof(_settings_client.network.last_host));
 
	_settings_client.network.last_port = port;
 

	
 
	NetworkDisconnect();
 
	NetworkUDPCloseAll();
 
	NetworkInitialize();
 

	
 
	// Try to connect
 
	_networking = NetworkConnect(host, port);
 

	
 
	// We are connected
 
	if (_networking) {
 
		IConsoleCmdExec("exec scripts/on_client.scr 0");
 
		NetworkClient_Connected();
 
	} else {
 
		// Connecting failed
 
		NetworkError(STR_NETWORK_ERR_NOCONNECTION);
 
	}
 

	
 
	return _networking;
 
}
 

	
 
static void NetworkInitGameInfo()
 
{
 
	NetworkClientInfo *ci;
 

	
 
	_network_game_info.clients_max    = _settings_client.network.max_clients;
 
	_network_game_info.companies_max  = _settings_client.network.max_companies;
 
	_network_game_info.spectators_max = _settings_client.network.max_spectators;
 
@@ -1093,86 +1102,66 @@ bool NetworkServerStart()
 

	
 
	_min_players_paused = false;
 
	CheckMinPlayers();
 

	
 
	/* Try to register us to the master server */
 
	_network_last_advertise_frame = 0;
 
	_network_need_advertise = true;
 
	NetworkUDPAdvertise();
 
	return true;
 
}
 

	
 
// The server is rebooting...
 
// The only difference with NetworkDisconnect, is the packets that is sent
 
void NetworkReboot()
 
{
 
	if (_network_server) {
 
		NetworkTCPSocketHandler *cs;
 
		FOR_ALL_CLIENTS(cs) {
 
			SEND_COMMAND(PACKET_SERVER_NEWGAME)(cs);
 
			cs->Send_Packets();
 
		}
 
	}
 

	
 
	NetworkClose();
 

	
 
	// Free all queued commands
 
	while (_local_command_queue != NULL) {
 
		CommandPacket *p = _local_command_queue;
 
		_local_command_queue = _local_command_queue->next;
 
		free(p);
 
	}
 

	
 
	_networking = false;
 
	_network_server = false;
 
}
 

	
 
// We want to disconnect from the host/clients
 
void NetworkDisconnect()
 
{
 
	if (_network_server) {
 
		NetworkTCPSocketHandler *cs;
 
		FOR_ALL_CLIENTS(cs) {
 
			SEND_COMMAND(PACKET_SERVER_SHUTDOWN)(cs);
 
			cs->Send_Packets();
 
		}
 
	}
 

	
 
	if (_network_advertise) NetworkUDPRemoveAdvertise();
 

	
 
	DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
 

	
 
	NetworkClose();
 

	
 
	// Free all queued commands
 
	while (_local_command_queue != NULL) {
 
		CommandPacket *p = _local_command_queue;
 
		_local_command_queue = _local_command_queue->next;
 
		free(p);
 
	}
 

	
 
	_networking = false;
 
	_network_server = false;
 
}
 

	
 
// Receives something from the network
 
static bool NetworkReceive()
 
{
 
	NetworkTCPSocketHandler *cs;
 
	int n;
 
	fd_set read_fd, write_fd;
 
	struct timeval tv;
 

	
 
	FD_ZERO(&read_fd);
 
	FD_ZERO(&write_fd);
 

	
 
	FOR_ALL_CLIENTS(cs) {
 
		FD_SET(cs->sock, &read_fd);
 
		FD_SET(cs->sock, &write_fd);
 
	}
 

	
 
	// take care of listener port
 
	if (_network_server) FD_SET(_listensocket, &read_fd);
 

	
 
	tv.tv_sec = tv.tv_usec = 0; // don't block at all.
 
#if !defined(__MORPHOS__) && !defined(__AMIGA__)
 
	n = select(FD_SETSIZE, &read_fd, &write_fd, NULL, &tv);
src/openttd.cpp
Show inline comments
 
@@ -789,52 +789,50 @@ bool SafeSaveOrLoad(const char *filename
 

	
 
		case SL_REINIT:
 
			switch (ogm) {
 
				default:
 
				case GM_MENU:   LoadIntroGame();      break;
 
				case GM_EDITOR: MakeNewEditorWorld(); break;
 
			}
 
			return false;
 

	
 
		default:
 
			_game_mode = ogm;
 
			return false;
 
	}
 
}
 

	
 
void SwitchMode(int new_mode)
 
{
 
#ifdef ENABLE_NETWORK
 
	/* If we are saving something, the network stays in his current state */
 
	if (new_mode != SM_SAVE) {
 
		/* If the network is active, make it not-active */
 
		if (_networking) {
 
			if (_network_server && (new_mode == SM_LOAD || new_mode == SM_NEWGAME)) {
 
				NetworkReboot();
 
				NetworkUDPCloseAll();
 
			} else {
 
				NetworkDisconnect();
 
				NetworkUDPCloseAll();
 
			}
 
		}
 

	
 
		/* If we are a server, we restart the server */
 
		if (_is_network_server) {
 
			/* But not if we are going to the menu */
 
			if (new_mode != SM_MENU) {
 
				/* check if we should reload the config */
 
				if (_settings_client.network.reload_cfg) {
 
					LoadFromConfig();
 
					_settings_game = _settings_newgame;
 
					ResetGRFConfig(false);
 
				}
 
				NetworkServerStart();
 
			} else {
 
				/* This client no longer wants to be a network-server */
 
				_is_network_server = false;
 
			}
 
		}
 
	}
 
#endif /* ENABLE_NETWORK */
 

	
 
	switch (new_mode) {
 
		case SM_EDITOR: /* Switch to scenario editor */
0 comments (0 inline, 0 general)