summaryrefslogtreecommitdiff
path: root/src/network/network_server.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-10-15 13:47:37 +0000
committerrubidium <rubidium@openttd.org>2010-10-15 13:47:37 +0000
commit0ca7e4e82e3657b6e935bc618403192b82b5dcc0 (patch)
treea373b6dd186d9b726d891855dd57301c0194661b /src/network/network_server.cpp
parent8eb07d097e2ab53f0b41a6b7af541c4937732e0b (diff)
downloadopenttd-0ca7e4e82e3657b6e935bc618403192b82b5dcc0.tar.xz
(svn r20924) -Codechange: make the game connection packet handling look more like UDP/content packet handling
Diffstat (limited to 'src/network/network_server.cpp')
-rw-r--r--src/network/network_server.cpp305
1 files changed, 115 insertions, 190 deletions
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp
index d11051ea5..5f7601fb7 100644
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -682,37 +682,37 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_CONFIG_UPDATE)
* DEF_SERVER_RECEIVE_COMMAND has parameter: NetworkClientSocket *cs, Packet *p
************/
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_INFO)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_COMPANY_INFO)
{
- return SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)(cs);
+ return SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)(this);
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_NEWGRFS_CHECKED)
{
- if (cs->status != STATUS_NEWGRFS_CHECK) {
+ if (this->status != STATUS_NEWGRFS_CHECK) {
/* Illegal call, return error and ignore the packet */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
- NetworkClientInfo *ci = cs->GetInfo();
+ NetworkClientInfo *ci = this->GetInfo();
/* We now want a password from the client else we do not allow him in! */
if (!StrEmpty(_settings_client.network.server_password)) {
- return SEND_COMMAND(PACKET_SERVER_NEED_GAME_PASSWORD)(cs);
+ return SEND_COMMAND(PACKET_SERVER_NEED_GAME_PASSWORD)(this);
}
if (Company::IsValidID(ci->client_playas) && !StrEmpty(_network_company_states[ci->client_playas].password)) {
- return SEND_COMMAND(PACKET_SERVER_NEED_COMPANY_PASSWORD)(cs);
+ return SEND_COMMAND(PACKET_SERVER_NEED_COMPANY_PASSWORD)(this);
}
- return SEND_COMMAND(PACKET_SERVER_WELCOME)(cs);
+ return SEND_COMMAND(PACKET_SERVER_WELCOME)(this);
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_JOIN)
{
- if (cs->status != STATUS_INACTIVE) {
+ if (this->status != STATUS_INACTIVE) {
/* Illegal call, return error and ignore the packet */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
char name[NETWORK_CLIENT_NAME_LENGTH];
@@ -726,30 +726,30 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
/* Check if the client has revision control enabled */
if (!IsNetworkCompatibleVersion(client_revision)) {
/* Different revisions!! */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_REVISION);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_WRONG_REVISION);
}
p->Recv_string(name, sizeof(name));
playas = (Owner)p->Recv_uint8();
client_lang = (NetworkLanguage)p->Recv_uint8();
- if (cs->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
+ if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
/* join another company does not affect these values */
switch (playas) {
case COMPANY_NEW_COMPANY: // New company
if (Company::GetNumItems() >= _settings_client.network.max_companies) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_FULL);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_FULL);
}
break;
case COMPANY_SPECTATOR: // Spectator
if (NetworkSpectatorCount() >= _settings_client.network.max_spectators) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_FULL);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_FULL);
}
break;
default: // Join another company (companies 1-8 (index 0-7))
if (!Company::IsValidHumanID(playas)) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_COMPANY_MISMATCH);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_COMPANY_MISMATCH);
}
break;
}
@@ -759,10 +759,10 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
if (!NetworkFindName(name)) { // Change name if duplicate
/* We could not create a name for this client */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NAME_IN_USE);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NAME_IN_USE);
}
- ci = cs->GetInfo();
+ ci = this->GetInfo();
strecpy(ci->client_name, name, lastof(ci->client_name));
ci->client_playas = playas;
@@ -772,20 +772,20 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
/* Make sure companies to which people try to join are not autocleaned */
if (Company::IsValidID(playas)) _network_company_states[playas].months_empty = 0;
- cs->status = STATUS_NEWGRFS_CHECK;
+ this->status = STATUS_NEWGRFS_CHECK;
if (_grfconfig == NULL) {
/* Behave as if we received PACKET_CLIENT_NEWGRFS_CHECKED */
- return RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED)(cs, NULL);
+ return this->RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED)(NULL);
}
- return SEND_COMMAND(PACKET_SERVER_CHECK_NEWGRFS)(cs);
+ return SEND_COMMAND(PACKET_SERVER_CHECK_NEWGRFS)(this);
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GAME_PASSWORD)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_GAME_PASSWORD)
{
- if (cs->status != STATUS_AUTH_GAME) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ if (this->status != STATUS_AUTH_GAME) {
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
char password[NETWORK_PASSWORD_LENGTH];
@@ -795,22 +795,22 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GAME_PASSWORD)
if (!StrEmpty(_settings_client.network.server_password) &&
strcmp(password, _settings_client.network.server_password) != 0) {
/* Password is invalid */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_WRONG_PASSWORD);
}
- const NetworkClientInfo *ci = cs->GetInfo();
+ const NetworkClientInfo *ci = this->GetInfo();
if (Company::IsValidID(ci->client_playas) && !StrEmpty(_network_company_states[ci->client_playas].password)) {
- return SEND_COMMAND(PACKET_SERVER_NEED_COMPANY_PASSWORD)(cs);
+ return SEND_COMMAND(PACKET_SERVER_NEED_COMPANY_PASSWORD)(this);
}
/* Valid password, allow user */
- return SEND_COMMAND(PACKET_SERVER_WELCOME)(cs);
+ return SEND_COMMAND(PACKET_SERVER_WELCOME)(this);
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_PASSWORD)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_COMPANY_PASSWORD)
{
- if (cs->status != STATUS_AUTH_COMPANY) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ if (this->status != STATUS_AUTH_COMPANY) {
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
char password[NETWORK_PASSWORD_LENGTH];
@@ -819,17 +819,17 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_PASSWORD)
/* Check company password. Allow joining if we cleared the password meanwhile.
* Also, check the company is still valid - client could be moved to spectators
* in the middle of the authorization process */
- CompanyID playas = cs->GetInfo()->client_playas;
+ CompanyID playas = this->GetInfo()->client_playas;
if (Company::IsValidID(playas) && !StrEmpty(_network_company_states[playas].password) &&
strcmp(password, _network_company_states[playas].password) != 0) {
/* Password is invalid */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_WRONG_PASSWORD);
}
- return SEND_COMMAND(PACKET_SERVER_WELCOME)(cs);
+ return SEND_COMMAND(PACKET_SERVER_WELCOME)(this);
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GETMAP)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_GETMAP)
{
NetworkClientSocket *new_cs;
@@ -844,112 +844,111 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GETMAP)
if (_openttd_newgrf_version != p->Recv_uint32()) {
/* The version we get from the client differs, it must have the
* wrong version. The client must be wrong. */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
} else if (p->size != 3) {
/* We received a packet from a version that claims to be stable.
* That shouldn't happen. The client must be wrong. */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
/* The client was never joined.. so this is impossible, right?
* Ignore the packet, give the client a warning, and close his connection */
- if (cs->status < STATUS_AUTHORIZED || cs->HasClientQuit()) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_AUTHORIZED);
+ if (this->status < STATUS_AUTHORIZED || this->HasClientQuit()) {
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_AUTHORIZED);
}
/* Check if someone else is receiving the map */
FOR_ALL_CLIENT_SOCKETS(new_cs) {
if (new_cs->status == STATUS_MAP) {
/* Tell the new client to wait */
- cs->status = STATUS_MAP_WAIT;
- return SEND_COMMAND(PACKET_SERVER_WAIT)(cs);
+ this->status = STATUS_MAP_WAIT;
+ return SEND_COMMAND(PACKET_SERVER_WAIT)(this);
}
}
/* We receive a request to upload the map.. give it to the client! */
- return SEND_COMMAND(PACKET_SERVER_MAP)(cs);
+ return SEND_COMMAND(PACKET_SERVER_MAP)(this);
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_MAP_OK)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_MAP_OK)
{
/* Client has the map, now start syncing */
- if (cs->status == STATUS_DONE_MAP && !cs->HasClientQuit()) {
+ if (this->status == STATUS_DONE_MAP && !this->HasClientQuit()) {
char client_name[NETWORK_CLIENT_NAME_LENGTH];
NetworkClientSocket *new_cs;
- NetworkGetClientName(client_name, sizeof(client_name), cs);
+ NetworkGetClientName(client_name, sizeof(client_name), this);
- NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, client_name, NULL, cs->client_id);
+ NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, client_name, NULL, this->client_id);
/* Mark the client as pre-active, and wait for an ACK
* so we know he is done loading and in sync with us */
- cs->status = STATUS_PRE_ACTIVE;
- NetworkHandleCommandQueue(cs);
- SEND_COMMAND(PACKET_SERVER_FRAME)(cs);
- SEND_COMMAND(PACKET_SERVER_SYNC)(cs);
+ this->status = STATUS_PRE_ACTIVE;
+ NetworkHandleCommandQueue(this);
+ SEND_COMMAND(PACKET_SERVER_FRAME)(this);
+ SEND_COMMAND(PACKET_SERVER_SYNC)(this);
/* This is the frame the client receives
* we need it later on to make sure the client is not too slow */
- cs->last_frame = _frame_counter;
- cs->last_frame_server = _frame_counter;
+ this->last_frame = _frame_counter;
+ this->last_frame_server = _frame_counter;
FOR_ALL_CLIENT_SOCKETS(new_cs) {
if (new_cs->status > STATUS_AUTHORIZED) {
- SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(new_cs, cs->GetInfo());
- SEND_COMMAND(PACKET_SERVER_JOIN)(new_cs, cs->client_id);
+ SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(new_cs, this->GetInfo());
+ SEND_COMMAND(PACKET_SERVER_JOIN)(new_cs, this->client_id);
}
}
/* also update the new client with our max values */
- SEND_COMMAND(PACKET_SERVER_CONFIG_UPDATE)(cs);
+ SEND_COMMAND(PACKET_SERVER_CONFIG_UPDATE)(this);
/* quickly update the syncing client with company details */
- return SEND_COMMAND(PACKET_SERVER_COMPANY_UPDATE)(cs);
+ return SEND_COMMAND(PACKET_SERVER_COMPANY_UPDATE)(this);
}
/* Wrong status for this packet, give a warning to client, and close connection */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
/**
* The client has done a command and wants us to handle it
- * @param *cs the connected client that has sent the command
- * @param *p the packet in which the command was sent
+ * @param p the packet in which the command was sent
*/
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_COMMAND)
{
/* The client was never joined.. so this is impossible, right?
* Ignore the packet, give the client a warning, and close his connection */
- if (cs->status < STATUS_DONE_MAP || cs->HasClientQuit()) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
- if (cs->incoming_queue.Count() >= _settings_client.network.max_commands_in_queue) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_TOO_MANY_COMMANDS);
+ if (this->incoming_queue.Count() >= _settings_client.network.max_commands_in_queue) {
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_TOO_MANY_COMMANDS);
}
CommandPacket cp;
- const char *err = cs->Recv_Command(p, &cp);
+ const char *err = this->Recv_Command(p, &cp);
- if (cs->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
+ if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
- NetworkClientInfo *ci = cs->GetInfo();
+ NetworkClientInfo *ci = this->GetInfo();
if (err != NULL) {
IConsolePrintF(CC_ERROR, "WARNING: %s from client %d (IP: %s).", err, ci->client_id, GetClientIP(ci));
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
if ((GetCommandFlags(cp.cmd) & CMD_SERVER) && ci->client_id != CLIENT_ID_SERVER) {
IConsolePrintF(CC_ERROR, "WARNING: server only command from: client %d (IP: %s), kicking...", ci->client_id, GetClientIP(ci));
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_KICKED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_KICKED);
}
if ((GetCommandFlags(cp.cmd) & CMD_SPECTATOR) == 0 && !Company::IsValidID(cp.company) && ci->client_id != CLIENT_ID_SERVER) {
IConsolePrintF(CC_ERROR, "WARNING: spectator issueing command from client %d (IP: %s), kicking...", ci->client_id, GetClientIP(ci));
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_KICKED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_KICKED);
}
/**
@@ -960,12 +959,12 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
if (!(cp.cmd == CMD_COMPANY_CTRL && cp.p1 == 0 && ci->client_playas == COMPANY_NEW_COMPANY) && ci->client_playas != cp.company) {
IConsolePrintF(CC_ERROR, "WARNING: client %d (IP: %s) tried to execute a command as company %d, kicking...",
ci->client_playas + 1, GetClientIP(ci), cp.company + 1);
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_COMPANY_MISMATCH);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_COMPANY_MISMATCH);
}
if (cp.cmd == CMD_COMPANY_CTRL) {
if (cp.p1 != 0 || cp.company != COMPANY_SPECTATOR) {
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_CHEATER);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_CHEATER);
}
/* Check if we are full - else it's possible for spectators to send a CMD_COMPANY_CTRL and the company is created regardless of max_companies! */
@@ -975,13 +974,13 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
}
}
- if (GetCommandFlags(cp.cmd) & CMD_CLIENT_ID) cp.p2 = cs->client_id;
+ if (GetCommandFlags(cp.cmd) & CMD_CLIENT_ID) cp.p2 = this->client_id;
- cs->incoming_queue.Append(&cp);
+ this->incoming_queue.Append(&cp);
return NETWORK_RECV_STATUS_OKAY;
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_ERROR)
{
/* This packets means a client noticed an error and is reporting this
* to us. Display the error and report it to the other clients */
@@ -991,12 +990,12 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)
NetworkErrorCode errorno = (NetworkErrorCode)p->Recv_uint8();
/* The client was never joined.. thank the client for the packet, but ignore it */
- if (cs->status < STATUS_DONE_MAP || cs->HasClientQuit()) {
- cs->CloseConnection();
+ if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
+ this->CloseConnection();
return NETWORK_RECV_STATUS_CONN_LOST;
}
- NetworkGetClientName(client_name, sizeof(client_name), cs);
+ NetworkGetClientName(client_name, sizeof(client_name), this);
StringID strid = GetNetworkErrorMsg(errorno);
GetString(str, strid, lastof(str));
@@ -1007,15 +1006,15 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)
FOR_ALL_CLIENT_SOCKETS(new_cs) {
if (new_cs->status > STATUS_AUTHORIZED) {
- SEND_COMMAND(PACKET_SERVER_ERROR_QUIT)(new_cs, cs->client_id, errorno);
+ SEND_COMMAND(PACKET_SERVER_ERROR_QUIT)(new_cs, this->client_id, errorno);
}
}
- cs->CloseConnection(false);
+ this->CloseConnection(false);
return NETWORK_RECV_STATUS_CONN_LOST;
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_QUIT)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_QUIT)
{
/* The client wants to leave. Display this and report it to the other
* clients. */
@@ -1023,50 +1022,50 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_QUIT)
char client_name[NETWORK_CLIENT_NAME_LENGTH];
/* The client was never joined.. thank the client for the packet, but ignore it */
- if (cs->status < STATUS_DONE_MAP || cs->HasClientQuit()) {
- cs->CloseConnection();
+ if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
+ this->CloseConnection();
return NETWORK_RECV_STATUS_CONN_LOST;
}
- NetworkGetClientName(client_name, sizeof(client_name), cs);
+ NetworkGetClientName(client_name, sizeof(client_name), this);
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, NULL, STR_NETWORK_MESSAGE_CLIENT_LEAVING);
FOR_ALL_CLIENT_SOCKETS(new_cs) {
if (new_cs->status > STATUS_AUTHORIZED) {
- SEND_COMMAND(PACKET_SERVER_QUIT)(new_cs, cs->client_id);
+ SEND_COMMAND(PACKET_SERVER_QUIT)(new_cs, this->client_id);
}
}
- cs->CloseConnection(false);
+ this->CloseConnection(false);
return NETWORK_RECV_STATUS_CONN_LOST;
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_ACK)
{
- if (cs->status < STATUS_AUTHORIZED) {
+ if (this->status < STATUS_AUTHORIZED) {
/* Illegal call, return error and ignore the packet */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_AUTHORIZED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_AUTHORIZED);
}
uint32 frame = p->Recv_uint32();
/* The client is trying to catch up with the server */
- if (cs->status == STATUS_PRE_ACTIVE) {
+ if (this->status == STATUS_PRE_ACTIVE) {
/* The client is not yet catched up? */
if (frame + DAY_TICKS < _frame_counter) return NETWORK_RECV_STATUS_OKAY;
/* Now he is! Unpause the game */
- cs->status = STATUS_ACTIVE;
+ this->status = STATUS_ACTIVE;
/* Execute script for, e.g. MOTD */
IConsoleCmdExec("exec scripts/on_server_connect.scr 0");
}
/* The client received the frame, make note of it */
- cs->last_frame = frame;
+ this->last_frame = frame;
/* With those 2 values we can calculate the lag realtime */
- cs->last_frame_server = _frame_counter;
+ this->last_frame_server = _frame_counter;
return NETWORK_RECV_STATUS_OKAY;
}
@@ -1172,11 +1171,11 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
}
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_CHAT)
{
- if (cs->status < STATUS_AUTHORIZED) {
+ if (this->status < STATUS_AUTHORIZED) {
/* Illegal call, return error and ignore the packet */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_AUTHORIZED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_AUTHORIZED);
}
NetworkAction action = (NetworkAction)p->Recv_uint8();
@@ -1187,7 +1186,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
p->Recv_string(msg, NETWORK_CHAT_LENGTH);
int64 data = p->Recv_uint64();
- NetworkClientInfo *ci = cs->GetInfo();
+ NetworkClientInfo *ci = this->GetInfo();
switch (action) {
case NETWORK_ACTION_GIVE_MONEY:
if (!Company::IsValidID(ci->client_playas)) break;
@@ -1195,28 +1194,28 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
case NETWORK_ACTION_CHAT:
case NETWORK_ACTION_CHAT_CLIENT:
case NETWORK_ACTION_CHAT_COMPANY:
- NetworkServerSendChat(action, desttype, dest, msg, cs->client_id, data);
+ NetworkServerSendChat(action, desttype, dest, msg, this->client_id, data);
break;
default:
IConsolePrintF(CC_ERROR, "WARNING: invalid chat action from client %d (IP: %s).", ci->client_id, GetClientIP(ci));
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
break;
}
return NETWORK_RECV_STATUS_OKAY;
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_SET_PASSWORD)
{
- if (cs->status != STATUS_ACTIVE) {
+ if (this->status != STATUS_ACTIVE) {
/* Illegal call, return error and ignore the packet */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
char password[NETWORK_PASSWORD_LENGTH];
const NetworkClientInfo *ci;
p->Recv_string(password, sizeof(password));
- ci = cs->GetInfo();
+ ci = this->GetInfo();
if (Company::IsValidID(ci->client_playas)) {
strecpy(_network_company_states[ci->client_playas].password, password, lastof(_network_company_states[ci->client_playas].password));
@@ -1225,20 +1224,20 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD)
return NETWORK_RECV_STATUS_OKAY;
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_SET_NAME)
{
- if (cs->status != STATUS_ACTIVE) {
+ if (this->status != STATUS_ACTIVE) {
/* Illegal call, return error and ignore the packet */
- return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
+ return SEND_COMMAND(PACKET_SERVER_ERROR)(this, NETWORK_ERROR_NOT_EXPECTED);
}
char client_name[NETWORK_CLIENT_NAME_LENGTH];
NetworkClientInfo *ci;
p->Recv_string(client_name, sizeof(client_name));
- ci = cs->GetInfo();
+ ci = this->GetInfo();
- if (cs->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
+ if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
if (ci != NULL) {
/* Display change */
@@ -1251,7 +1250,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME)
return NETWORK_RECV_STATUS_OKAY;
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_RCON)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_RCON)
{
char pass[NETWORK_PASSWORD_LENGTH];
char command[NETWORK_RCONCOMMAND_LENGTH];
@@ -1262,19 +1261,19 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_RCON)
p->Recv_string(command, sizeof(command));
if (strcmp(pass, _settings_client.network.rcon_password) != 0) {
- DEBUG(net, 0, "[rcon] wrong password from client-id %d", cs->client_id);
+ DEBUG(net, 0, "[rcon] wrong password from client-id %d", this->client_id);
return NETWORK_RECV_STATUS_OKAY;
}
- DEBUG(net, 0, "[rcon] client-id %d executed: '%s'", cs->client_id, command);
+ DEBUG(net, 0, "[rcon] client-id %d executed: '%s'", this->client_id, command);
- _redirect_console_to_client = cs->client_id;
+ _redirect_console_to_client = this->client_id;
IConsoleCmdExec(command);
_redirect_console_to_client = INVALID_CLIENT_ID;
return NETWORK_RECV_STATUS_OKAY;
}
-DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_MOVE)
+DEF_GAME_RECEIVE_COMMAND(Server, PACKET_CLIENT_MOVE)
{
CompanyID company_id = (Owner)p->Recv_uint8();
@@ -1289,70 +1288,16 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_MOVE)
/* Incorrect password sent, return! */
if (strcmp(password, _network_company_states[company_id].password) != 0) {
- DEBUG(net, 2, "[move] wrong password from client-id #%d for company #%d", cs->client_id, company_id + 1);
+ DEBUG(net, 2, "[move] wrong password from client-id #%d for company #%d", this->client_id, company_id + 1);
return NETWORK_RECV_STATUS_OKAY;
}
}
/* if we get here we can move the client */
- NetworkServerDoMove(cs->client_id, company_id);
+ NetworkServerDoMove(this->client_id, company_id);
return NETWORK_RECV_STATUS_OKAY;
}
-/* The layout for the receive-functions by the server */
-typedef NetworkRecvStatus NetworkServerPacket(NetworkClientSocket *cs, Packet *p);
-
-
-/* This array matches PacketType. At an incoming
- * packet it is matches against this array
- * and that way the right function to handle that
- * packet is found. */
-static NetworkServerPacket * const _network_server_packet[] = {
- NULL, // PACKET_SERVER_FULL,
- NULL, // PACKET_SERVER_BANNED,
- RECEIVE_COMMAND(PACKET_CLIENT_JOIN),
- NULL, // PACKET_SERVER_ERROR,
- RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_INFO),
- NULL, // PACKET_SERVER_COMPANY_INFO,
- NULL, // PACKET_SERVER_CLIENT_INFO,
- NULL, // PACKET_SERVER_NEED_GAME_PASSWORD,
- NULL, // PACKET_SERVER_NEED_COMPANY_PASSWORD,
- RECEIVE_COMMAND(PACKET_CLIENT_GAME_PASSWORD),
- RECEIVE_COMMAND(PACKET_CLIENT_COMPANY_PASSWORD),
- NULL, // PACKET_SERVER_WELCOME,
- RECEIVE_COMMAND(PACKET_CLIENT_GETMAP),
- NULL, // PACKET_SERVER_WAIT,
- NULL, // PACKET_SERVER_MAP,
- RECEIVE_COMMAND(PACKET_CLIENT_MAP_OK),
- NULL, // PACKET_SERVER_JOIN,
- NULL, // PACKET_SERVER_FRAME,
- NULL, // PACKET_SERVER_SYNC,
- RECEIVE_COMMAND(PACKET_CLIENT_ACK),
- RECEIVE_COMMAND(PACKET_CLIENT_COMMAND),
- NULL, // PACKET_SERVER_COMMAND,
- RECEIVE_COMMAND(PACKET_CLIENT_CHAT),
- NULL, // PACKET_SERVER_CHAT,
- RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD),
- RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME),
- RECEIVE_COMMAND(PACKET_CLIENT_QUIT),
- RECEIVE_COMMAND(PACKET_CLIENT_ERROR),
- NULL, // PACKET_SERVER_QUIT,
- NULL, // PACKET_SERVER_ERROR_QUIT,
- NULL, // PACKET_SERVER_SHUTDOWN,
- NULL, // PACKET_SERVER_NEWGAME,
- NULL, // PACKET_SERVER_RCON,
- RECEIVE_COMMAND(PACKET_CLIENT_RCON),
- NULL, // PACKET_CLIENT_CHECK_NEWGRFS,
- RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED),
- NULL, // PACKET_SERVER_MOVE,
- RECEIVE_COMMAND(PACKET_CLIENT_MOVE),
- NULL, // PACKET_SERVER_COMPANY_UPDATE,
- NULL, // PACKET_SERVER_CONFIG_UPDATE,
-};
-
-/* If this fails, check the array above with network_data.h */
-assert_compile(lengthof(_network_server_packet) == PACKET_END);
-
void NetworkSocketHandler::Send_CompanyInformation(Packet *p, const Company *c, const NetworkCompanyStats *stats)
{
/* Grab the company name */
@@ -1597,26 +1542,6 @@ bool NetworkServerChangeClientName(ClientID client_id, const char *new_name)
return true;
}
-/* Reads a packet from the stream */
-void NetworkServer_ReadPackets(NetworkClientSocket *cs)
-{
- Packet *p;
- NetworkRecvStatus res = NETWORK_RECV_STATUS_OKAY;
-
- while (res == NETWORK_RECV_STATUS_OKAY && (p = cs->Recv_Packet()) != NULL) {
- byte type = p->Recv_uint8();
- if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->HasClientQuit()) {
- res = _network_server_packet[type](cs, p);
- } else {
- cs->CloseConnection();
- res = NETWORK_RECV_STATUS_MALFORMED_PACKET;
- DEBUG(net, 0, "[server] received invalid packet type %d", type);
- }
-
- delete p;
- }
-}
-
/* Handle the local command-queue */
static void NetworkHandleCommandQueue(NetworkClientSocket *cs)
{