(svn r20967) -Add: infrastructure to send information to remote admins at specific intervals (dihedral)

This commit is contained in:
rubidium
2010-10-17 17:36:23 +00:00
parent 7d42a44556
commit 72c85d1cdb
7 changed files with 123 additions and 0 deletions

View File

@@ -37,6 +37,12 @@ INSTANTIATE_POOL_METHODS(NetworkAdminSocket)
/** The timeout for authorisation of the client. */
static const int ADMIN_AUTHORISATION_TIMEOUT = 10000;
/** Frequencies, which may be registered for a certain update type. */
static const AdminUpdateFrequency _admin_update_type_frequencies[] = {
};
assert_compile(lengthof(_admin_update_type_frequencies) == ADMIN_UPDATE_END);
/**
* Create a new socket for the server side of the admin network.
* @param s The socket to connect with.
@@ -115,6 +121,12 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol()
/* announce the protocol version */
p->Send_uint8(NETWORK_GAME_ADMIN_VERSION);
for (int i = 0; i < ADMIN_UPDATE_END; i++) {
p->Send_bool (true);
p->Send_uint16(i);
p->Send_uint16(_admin_update_type_frequencies[i]);
}
p->Send_bool(false);
this->Send_Packet(p);
@@ -193,6 +205,41 @@ DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_QUIT)
return this->CloseConnection();
}
DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
AdminUpdateType type = (AdminUpdateType)p->Recv_uint16();
AdminUpdateFrequency freq = (AdminUpdateFrequency)p->Recv_uint16();
if (type >= ADMIN_UPDATE_END || (_admin_update_type_frequencies[type] & freq) != freq) {
/* The server does not know of this UpdateType. */
DEBUG(net, 3, "[admin] Not supported update frequency %d (%d) from '%s' (%s).", type, freq, this->admin_name, this->admin_version);
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
}
this->update_frequency[type] = freq;
return NETWORK_RECV_STATUS_OKAY;
}
DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_POLL)
{
if (this->status == ADMIN_STATUS_INACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
AdminUpdateType type = (AdminUpdateType)p->Recv_uint8();
uint32 d1 = p->Recv_uint32();
switch (type) {
default:
/* An unsupported "poll" update type. */
DEBUG(net, 3, "[admin] Not supported poll %d (%d) from '%s' (%s).", type, d1, this->admin_name, this->admin_version);
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
}
return NETWORK_RECV_STATUS_OKAY;
}
/*
* Useful wrapper functions
*/
@@ -208,4 +255,23 @@ void ServerNetworkAdminSocketHandler::WelcomeAll()
}
}
/**
* Send (push) updates to the admin network as they have registered for these updates.
* @param freq the frequency to be processd.
*/
void NetworkAdminUpdate(AdminUpdateFrequency freq)
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
for (int i = 0; i < ADMIN_UPDATE_END; i++) {
if (as->update_frequency[i] & freq) {
/* Update the admin for the required details */
switch (i) {
default: NOT_REACHED();
}
}
}
}
}
#endif /* ENABLE_NETWORK */