(svn r20968) -Add: date notification of remote admins (dihedral)

This commit is contained in:
rubidium 2010-10-17 17:36:59 +00:00
parent b4ce7fad7f
commit 901c4a56bd
4 changed files with 34 additions and 0 deletions

View File

@ -63,6 +63,8 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p)
ADMIN_COMMAND(ADMIN_PACKET_SERVER_NEWGAME)
ADMIN_COMMAND(ADMIN_PACKET_SERVER_SHUTDOWN)
ADMIN_COMMAND(ADMIN_PACKET_SERVER_DATE)
default:
if (this->HasClientQuit()) {
DEBUG(net, 0, "[tcp/admin] received invalid packet type %d from '%s' (%s)", type, this->admin_name, this->admin_version);
@ -120,4 +122,6 @@ DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_WELCOME)
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_NEWGAME)
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_SHUTDOWN)
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_DATE)
#endif /* ENABLE_NETWORK */

View File

@ -39,6 +39,8 @@ enum PacketAdminType {
ADMIN_PACKET_SERVER_NEWGAME, ///< The server tells the admin its going to start a new game.
ADMIN_PACKET_SERVER_SHUTDOWN, ///< The server tells the admin its shutting down.
ADMIN_PACKET_SERVER_DATE, ///< The server tells the admin what the current game date is.
INVALID_ADMIN_PACKET = 0xFF, ///< An invalid marker for admin packets.
};
@ -51,6 +53,7 @@ enum AdminStatus {
/** Update types an admin can register a frequency for */
enum AdminUpdateType {
ADMIN_UPDATE_DATE, ///< Updates about the date of the game.
ADMIN_UPDATE_END ///< Must ALWAYS be on the end of this list!! (period)
};
@ -152,6 +155,12 @@ protected:
*/
DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_SHUTDOWN);
/**
* Send the current date of the game:
* uint32 Current game date.
*/
DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_DATE);
NetworkRecvStatus HandlePacket(Packet *p);
public:
NetworkRecvStatus CloseConnection(bool error = true);

View File

@ -40,6 +40,7 @@ static const int ADMIN_AUTHORISATION_TIMEOUT = 10000;
/** Frequencies, which may be registered for a certain update type. */
static const AdminUpdateFrequency _admin_update_type_frequencies[] = {
ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_DAILY | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_DATE
};
assert_compile(lengthof(_admin_update_type_frequencies) == ADMIN_UPDATE_END);
@ -169,6 +170,16 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendShutdown()
return NETWORK_RECV_STATUS_OKAY;
}
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendDate()
{
Packet *p = new Packet(ADMIN_PACKET_SERVER_DATE);
p->Send_uint32(_date);
this->Send_Packet(p);
return NETWORK_RECV_STATUS_OKAY;
}
/***********
* Receiving functions
************/
@ -231,6 +242,11 @@ DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_POLL)
uint32 d1 = p->Recv_uint32();
switch (type) {
case ADMIN_UPDATE_DATE:
/* The admin is requesting the current date. */
this->SendDate();
break;
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);
@ -267,6 +283,10 @@ void NetworkAdminUpdate(AdminUpdateFrequency freq)
if (as->update_frequency[i] & freq) {
/* Update the admin for the required details */
switch (i) {
case ADMIN_UPDATE_DATE:
as->SendDate();
break;
default: NOT_REACHED();
}
}

View File

@ -43,6 +43,7 @@ public:
NetworkRecvStatus SendWelcome();
NetworkRecvStatus SendNewGame();
NetworkRecvStatus SendShutdown();
NetworkRecvStatus SendDate();
static void Send();
static void AcceptConnection(SOCKET s, const NetworkAddress &address);