/** Send statistics about the companies. */ 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[company->index].num_vehicle[i]); } for (uint i = 0; i < NETWORK_VEH_END; i++) { p->Send_uint16(company_stats[company->index].num_station[i]); } this->SendPacket(p); } return NETWORK_RECV_STATUS_OKAY; }
void ServerNetworkUDPSocketHandler::Receive_CLIENT_DETAIL_INFO(Packet *p, NetworkAddress *client_addr) { /* Just a fail-safe.. should never happen */ if (!_network_udp_server) return; Packet packet(PACKET_UDP_SERVER_DETAIL_INFO); /* Send the amount of active companies */ packet.Send_uint8 (NETWORK_COMPANY_INFO_VERSION); packet.Send_uint8 ((uint8)Company::GetNumItems()); /* Fetch the latest version of the stats */ NetworkCompanyStats company_stats[MAX_COMPANIES]; NetworkPopulateCompanyStats(company_stats); /* The minimum company information "blob" size. */ static const uint MIN_CI_SIZE = 54; uint max_cname_length = NETWORK_COMPANY_NAME_LENGTH; if (Company::GetNumItems() * (MIN_CI_SIZE + NETWORK_COMPANY_NAME_LENGTH) >= (uint)SEND_MTU - packet.size) { /* Assume we can at least put the company information in the packets. */ assert(Company::GetNumItems() * MIN_CI_SIZE < (uint)SEND_MTU - packet.size); /* At this moment the company names might not fit in the * packet. Check whether that is really the case. */ for (;;) { int free = SEND_MTU - packet.size; Company *company; FOR_ALL_COMPANIES(company) { char company_name[NETWORK_COMPANY_NAME_LENGTH]; SetDParam(0, company->index); GetString(company_name, STR_COMPANY_NAME, company_name + max_cname_length - 1); free -= MIN_CI_SIZE; free -= (int)strlen(company_name); } if (free >= 0) break; /* Try again, with slightly shorter strings. */ assert(max_cname_length > 0); max_cname_length--; } }
DEF_UDP_RECEIVE_COMMAND(Server, PACKET_UDP_CLIENT_DETAIL_INFO) { /* Just a fail-safe.. should never happen */ if (!_network_udp_server) return; Packet packet(PACKET_UDP_SERVER_DETAIL_INFO); /* Send the amount of active companies */ packet.Send_uint8 (NETWORK_COMPANY_INFO_VERSION); packet.Send_uint8 ((uint8)Company::GetNumItems()); /* Fetch the latest version of the stats */ NetworkCompanyStats company_stats[MAX_COMPANIES]; NetworkPopulateCompanyStats(company_stats); Company *company; /* Go through all the companies */ FOR_ALL_COMPANIES(company) { /* Send the information */ this->Send_CompanyInformation(&packet, company, &company_stats[company->index]); } this->SendPacket(&packet, client_addr); }