From 459514afe4f550a08d98958745d6cd8311c53fdd Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 17 Oct 2010 17:38:41 +0000 Subject: (svn r20972) -Add: company statistics updates at intervals to remote admins (dihedral) --- src/network/core/tcp_admin.cpp | 2 ++ src/network/core/tcp_admin.h | 18 ++++++++++++++++++ src/network/network_admin.cpp | 39 +++++++++++++++++++++++++++++++++++++++ src/network/network_admin.h | 1 + 4 files changed, 60 insertions(+) diff --git a/src/network/core/tcp_admin.cpp b/src/network/core/tcp_admin.cpp index 7d5b37c2d..0d2d09fdd 100644 --- a/src/network/core/tcp_admin.cpp +++ b/src/network/core/tcp_admin.cpp @@ -74,6 +74,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p) ADMIN_COMMAND(ADMIN_PACKET_SERVER_COMPANY_UPDATE) ADMIN_COMMAND(ADMIN_PACKET_SERVER_COMPANY_REMOVE) ADMIN_COMMAND(ADMIN_PACKET_SERVER_COMPANY_ECONOMY) + ADMIN_COMMAND(ADMIN_PACKET_SERVER_COMPANY_STATS) default: if (this->HasClientQuit()) { @@ -143,5 +144,6 @@ DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_INFO) DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_UPDATE) DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_REMOVE) DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_ECONOMY) +DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_STATS) #endif /* ENABLE_NETWORK */ diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index c13d37a1b..15f3ba0a7 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -50,6 +50,7 @@ enum PacketAdminType { ADMIN_PACKET_SERVER_COMPANY_UPDATE, ///< The server gives the admin an information update on a company. ADMIN_PACKET_SERVER_COMPANY_REMOVE, ///< The server tells the admin that a company was removed. ADMIN_PACKET_SERVER_COMPANY_ECONOMY, ///< The server gives the admin some economy related company information. + ADMIN_PACKET_SERVER_COMPANY_STATS, ///< The server gives the admin some statistics about a company. INVALID_ADMIN_PACKET = 0xFF, ///< An invalid marker for admin packets. }; @@ -67,6 +68,7 @@ enum AdminUpdateType { ADMIN_UPDATE_CLIENT_INFO, ///< Updates about the information of clients. ADMIN_UPDATE_COMPANY_INFO, ///< Updates about the generic information of companies. ADMIN_UPDATE_COMPANY_ECONOMY, ///< Updates about the economy of companies. + ADMIN_UPDATE_COMPANY_STATS, ///< Updates about the statistics of companies. ADMIN_UPDATE_END ///< Must ALWAYS be on the end of this list!! (period) }; @@ -276,6 +278,22 @@ protected: */ DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_ECONOMY); + /** + * Company statistics on stations and vehicles: + * uint8 ID of the company. + * uint16 Number of trains. + * uint16 Number of lorries. + * uint16 Number of busses. + * uint16 Number of planes. + * uint16 Number of ships. + * uint16 Number of train stations. + * uint16 Number of lorry stations. + * uint16 Number of bus stops. + * uint16 Number of airports and heliports. + * uint16 Number of harbours. + */ + DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_STATS); + NetworkRecvStatus HandlePacket(Packet *p); public: NetworkRecvStatus CloseConnection(bool error = true); diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index ac33be65a..7a86a4892 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -44,6 +44,7 @@ static const AdminUpdateFrequency _admin_update_type_frequencies[] = { ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_CLIENT_INFO ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_COMPANY_INFO ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_COMPANY_ECONOMY + ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_COMPANY_STATS }; assert_compile(lengthof(_admin_update_type_frequencies) == ADMIN_UPDATE_END); @@ -354,6 +355,35 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyEconomy() return NETWORK_RECV_STATUS_OKAY; } +NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyStats() +{ + /* Fetch the latest version of the stats. */ + NetworkCompanyStats company_stats[MAX_COMPANIES]; + NetworkPopulateCompanyStats(company_stats); + + const Company *company; + + /* Go through all the companies. */ + FOR_ALL_COMPANIES(company) { + Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_STATS); + + /* Send the information. */ + p->Send_uint8(company->index); + + for (uint i = 0; i < NETWORK_VEH_END; i++) { + p->Send_uint16(company_stats->num_vehicle[i]); + } + + for (uint i = 0; i < NETWORK_VEH_END; i++) { + p->Send_uint16(company_stats->num_station[i]); + } + + this->Send_Packet(p); + } + + return NETWORK_RECV_STATUS_OKAY; +} + /*********** * Receiving functions ************/ @@ -452,6 +482,11 @@ DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_POLL) this->SendCompanyEconomy(); break; + case ADMIN_UPDATE_COMPANY_STATS: + /* the admin is requesting company stats. */ + this->SendCompanyStats(); + 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); @@ -609,6 +644,10 @@ void NetworkAdminUpdate(AdminUpdateFrequency freq) as->SendCompanyEconomy(); break; + case ADMIN_UPDATE_COMPANY_STATS: + as->SendCompanyStats(); + break; + default: NOT_REACHED(); } } diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 4a3bd91d5..7f4f67de1 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -54,6 +54,7 @@ public: NetworkRecvStatus SendCompanyUpdate(const Company *c); NetworkRecvStatus SendCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bcrr); NetworkRecvStatus SendCompanyEconomy(); + NetworkRecvStatus SendCompanyStats(); static void Send(); static void AcceptConnection(SOCKET s, const NetworkAddress &address); -- cgit v1.2.3-54-g00ecf