summaryrefslogtreecommitdiff
path: root/src/network/network_admin.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-10-17 17:37:45 +0000
committerrubidium <rubidium@openttd.org>2010-10-17 17:37:45 +0000
commitae20cb4f3dff0f3a9478e918b90ef61279c8b33c (patch)
treecca6bae2b5da57805e9e050e463d835f34a406ef /src/network/network_admin.cpp
parentfe44944f326b08e6b005aef8bfcf546467b5b136 (diff)
downloadopenttd-ae20cb4f3dff0f3a9478e918b90ef61279c8b33c.tar.xz
(svn r20970) -Add: company change notification to remote admins (dihedral)
Diffstat (limited to 'src/network/network_admin.cpp')
-rw-r--r--src/network/network_admin.cpp143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp
index 9e6402310..b6341ed20 100644
--- a/src/network/network_admin.cpp
+++ b/src/network/network_admin.cpp
@@ -42,6 +42,7 @@ static const int ADMIN_AUTHORISATION_TIMEOUT = 10000;
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
ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_CLIENT_INFO
+ ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC, ///< ADMIN_UPDATE_COMPANY_INFO
};
assert_compile(lengthof(_admin_update_type_frequencies) == ADMIN_UPDATE_END);
@@ -241,6 +242,83 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendClientError(ClientID clie
return NETWORK_RECV_STATUS_OKAY;
}
+NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyNew(CompanyID company_id)
+{
+ Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_NEW);
+ p->Send_uint8(company_id);
+
+ this->Send_Packet(p);
+
+ return NETWORK_RECV_STATUS_OKAY;
+}
+
+NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyInfo(const Company *c)
+{
+ char company_name[NETWORK_COMPANY_NAME_LENGTH];
+ char manager_name[NETWORK_COMPANY_NAME_LENGTH];
+
+ SetDParam(0, c->index);
+ GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
+
+ SetDParam(0, c->index);
+ GetString(manager_name, STR_PRESIDENT_NAME, lastof(manager_name));
+
+ Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_INFO);
+
+ p->Send_uint8 (c->index);
+ p->Send_string(company_name);
+ p->Send_string(manager_name);
+ p->Send_uint8 (c->colour);
+ p->Send_bool (NetworkCompanyIsPassworded(c->index));
+ p->Send_uint32(c->inaugurated_year);
+ p->Send_bool (c->is_ai);
+
+ this->Send_Packet(p);
+
+ return NETWORK_RECV_STATUS_OKAY;
+}
+
+NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyUpdate(const Company *c)
+{
+ char company_name[NETWORK_COMPANY_NAME_LENGTH];
+ char manager_name[NETWORK_COMPANY_NAME_LENGTH];
+
+ SetDParam(0, c->index);
+ GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
+
+ SetDParam(0, c->index);
+ GetString(manager_name, STR_PRESIDENT_NAME, lastof(manager_name));
+
+ Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_UPDATE);
+
+ p->Send_uint8 (c->index);
+ p->Send_string(company_name);
+ p->Send_string(manager_name);
+ p->Send_uint8 (c->colour);
+ p->Send_bool (NetworkCompanyIsPassworded(c->index));
+ p->Send_uint8 (c->quarters_of_bankruptcy);
+
+ for (size_t i = 0; i < lengthof(c->share_owners); i++) {
+ p->Send_uint8(c->share_owners[i]);
+ }
+
+ this->Send_Packet(p);
+
+ return NETWORK_RECV_STATUS_OKAY;
+}
+
+NetworkRecvStatus ServerNetworkAdminSocketHandler::SendCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason acrr)
+{
+ Packet *p = new Packet(ADMIN_PACKET_SERVER_COMPANY_REMOVE);
+
+ p->Send_uint8(company_id);
+ p->Send_uint8(acrr);
+
+ this->Send_Packet(p);
+
+ return NETWORK_RECV_STATUS_OKAY;
+}
+
/***********
* Receiving functions
************/
@@ -321,6 +399,19 @@ DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_POLL)
}
break;
+ case ADMIN_UPDATE_COMPANY_INFO:
+ /* The admin is asking for company info. */
+ const Company *company;
+ if (d1 == UINT32_MAX) {
+ FOR_ALL_COMPANIES(company) {
+ this->SendCompanyInfo(company);
+ }
+ } else {
+ company = Company::GetIfValid(d1);
+ if (company != NULL) this->SendCompanyInfo(company);
+ }
+ 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);
@@ -396,6 +487,58 @@ void NetworkAdminClientError(ClientID client_id, NetworkErrorCode error_code)
}
/**
+ * Notify the admin network of company details.
+ * @param company the company of which details will be sent into the admin network.
+ * @param new_company whether this is a new company or not.
+ */
+void NetworkAdminCompanyInfo(const Company *company, bool new_company)
+{
+ if (company == NULL) {
+ DEBUG(net, 1, "[admin] Empty company given for update");
+ return;
+ }
+
+ ServerNetworkAdminSocketHandler *as;
+ FOR_ALL_ADMIN_SOCKETS(as) {
+ if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != ADMIN_FREQUENCY_AUTOMATIC) continue;
+
+ as->SendCompanyInfo(company);
+ if (new_company) {
+ as->SendCompanyNew(company->index);
+ }
+ }
+}
+
+/**
+ * Notify the admin network of company updates.
+ * @param company company of which updates are going to be sent into the admin network.
+ */
+void NetworkAdminCompanyUpdate(const Company *company)
+{
+ if (company == NULL) return;
+
+ ServerNetworkAdminSocketHandler *as;
+ FOR_ALL_ADMIN_SOCKETS(as) {
+ if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != ADMIN_FREQUENCY_AUTOMATIC) continue;
+
+ as->SendCompanyUpdate(company);
+ }
+}
+
+/**
+ * Notify the admin network of a company to be removed (including the reason why).
+ * @param company_id ID of the company that got removed.
+ * @param bcrr the reason why the company got removed (e.g. bankruptcy).
+ */
+void NetworkAdminCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bcrr)
+{
+ ServerNetworkAdminSocketHandler *as;
+ FOR_ALL_ADMIN_SOCKETS(as) {
+ as->SendCompanyRemove(company_id, bcrr);
+ }
+}
+
+/**
* Send a Welcome packet to all connected admins
*/
void ServerNetworkAdminSocketHandler::WelcomeAll()