mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r14719) -Codechange: replace DEREF_CLIENT with an instance function and replace looping socket structs with info structs when the loop is only interested in the info structs (i.e. not derefing the info from sockets when one can loop info directly and the socket isn't used)
This commit is contained in:
parent
94e7f41a9d
commit
b4734ee9a4
|
@ -110,6 +110,13 @@ public:
|
|||
bool IsPacketQueueEmpty();
|
||||
|
||||
Packet *Recv_Packet(NetworkRecvStatus *status);
|
||||
|
||||
inline NetworkClientInfo *GetInfo() const
|
||||
{
|
||||
extern NetworkClientInfo _network_client_info[MAX_CLIENT_INFO];
|
||||
extern NetworkTCPSocketHandler _clients[MAX_CLIENTS];
|
||||
return &_network_client_info[this - _clients];
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
|
|
@ -163,9 +163,9 @@ NetworkTCPSocketHandler *NetworkFindClientStateFromClientID(ClientID client_id)
|
|||
// if the user did not send it yet, Client #<no> is used.
|
||||
void NetworkGetClientName(char *client_name, size_t size, const NetworkTCPSocketHandler *cs)
|
||||
{
|
||||
const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
const NetworkClientInfo *ci = cs->GetInfo();
|
||||
|
||||
if (ci->client_name[0] == '\0') {
|
||||
if (StrEmpty(ci->client_name)) {
|
||||
snprintf(client_name, size, "Client #%4d", cs->client_id);
|
||||
} else {
|
||||
ttd_strlcpy(client_name, ci->client_name, size);
|
||||
|
@ -174,11 +174,11 @@ void NetworkGetClientName(char *client_name, size_t size, const NetworkTCPSocket
|
|||
|
||||
byte NetworkSpectatorCount()
|
||||
{
|
||||
NetworkTCPSocketHandler *cs;
|
||||
const NetworkClientInfo *ci;
|
||||
byte count = 0;
|
||||
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
if (DEREF_CLIENT_INFO(cs)->client_playas == COMPANY_SPECTATOR) count++;
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
if (ci->client_playas == COMPANY_SPECTATOR) count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
|
@ -360,11 +360,10 @@ char* GetNetworkErrorMsg(char* buf, NetworkErrorCode err, const char* last)
|
|||
/* Count the number of active clients connected */
|
||||
static uint NetworkCountActiveClients()
|
||||
{
|
||||
NetworkTCPSocketHandler *cs;
|
||||
const NetworkClientInfo *ci;
|
||||
uint count = 0;
|
||||
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
if (IsValidCompanyID(ci->client_playas)) count++;
|
||||
}
|
||||
|
||||
|
@ -439,7 +438,7 @@ static NetworkTCPSocketHandler *NetworkAllocClient(SOCKET s)
|
|||
cs->last_frame_server = _frame_counter;
|
||||
|
||||
if (_network_server) {
|
||||
NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
NetworkClientInfo *ci = cs->GetInfo();
|
||||
memset(ci, 0, sizeof(*ci));
|
||||
|
||||
cs->client_id = _network_client_id++;
|
||||
|
@ -495,7 +494,7 @@ void NetworkCloseClient(NetworkTCPSocketHandler *cs)
|
|||
cs->Destroy();
|
||||
|
||||
// Close the gap in the client-list
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
ci = cs->GetInfo();
|
||||
|
||||
if (_network_server) {
|
||||
// We just lost one client :(
|
||||
|
@ -617,7 +616,7 @@ static void NetworkAcceptClients()
|
|||
// the client stays inactive
|
||||
cs->status = STATUS_INACTIVE;
|
||||
|
||||
DEREF_CLIENT_INFO(cs)->client_ip = sin.sin_addr.s_addr; // Save the IP of the client
|
||||
cs->GetInfo()->client_ip = sin.sin_addr.s_addr; // Save the IP of the client
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -967,7 +967,7 @@ bool NetworkClientPreferTeamChat(const NetworkClientInfo *cio)
|
|||
if (!_settings_client.gui.prefer_teamchat || !IsValidCompanyID(cio->client_playas)) return false;
|
||||
|
||||
const NetworkClientInfo *ci;
|
||||
FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
if (ci->client_playas == cio->client_playas && ci != cio) return true;
|
||||
}
|
||||
|
||||
|
@ -979,8 +979,8 @@ bool NetworkClientPreferTeamChat(const NetworkClientInfo *cio)
|
|||
*/
|
||||
void NetworkPrintClients()
|
||||
{
|
||||
NetworkClientInfo *ci;
|
||||
FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
|
||||
const NetworkClientInfo *ci;
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
IConsolePrintF(CC_INFO, "Client #%1d name: '%s' company: %1d IP: %s",
|
||||
ci->client_id,
|
||||
ci->client_name,
|
||||
|
|
|
@ -64,7 +64,7 @@ void CDECL NetworkAddChatMessage(uint16 color, uint8 duration, const char *messa
|
|||
void NetworkUndrawChatMessage();
|
||||
void NetworkChatMessageDailyLoop();
|
||||
|
||||
#define FOR_ALL_ACTIVE_CLIENT_INFOS(ci) for (ci = _network_client_info; ci != endof(_network_client_info); ci++) if (ci->client_id != INVALID_CLIENT_ID)
|
||||
#define FOR_ALL_CLIENT_INFOS(ci) for (ci = _network_client_info; ci != endof(_network_client_info); ci++) if (ci->client_id != INVALID_CLIENT_ID)
|
||||
|
||||
#endif /* ENABLE_NETWORK */
|
||||
#endif /* NETWORK_FUNC_H */
|
||||
|
|
|
@ -1419,7 +1419,7 @@ static const NetworkClientInfo *NetworkFindClientInfo(byte client_no)
|
|||
{
|
||||
const NetworkClientInfo *ci;
|
||||
|
||||
FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
if (client_no == 0) return ci;
|
||||
client_no--;
|
||||
}
|
||||
|
@ -1659,7 +1659,7 @@ struct NetworkClientListWindow : Window
|
|||
const NetworkClientInfo *ci;
|
||||
|
||||
/* Should be replaced with a loop through all clients */
|
||||
FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
num++;
|
||||
}
|
||||
|
||||
|
@ -1689,7 +1689,7 @@ struct NetworkClientListWindow : Window
|
|||
|
||||
int y = CLNWND_OFFSET;
|
||||
|
||||
FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
TextColour colour;
|
||||
if (this->selected_item == i++) { // Selected item, highlight it
|
||||
GfxFillRect(1, y, 248, y + CLNWND_ROWSIZE - 1, 0);
|
||||
|
|
|
@ -149,8 +149,6 @@ char* GetNetworkErrorMsg(char* buf, NetworkErrorCode err, const char* last);
|
|||
bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH]);
|
||||
|
||||
#define DEREF_CLIENT(i) (&_clients[i])
|
||||
// This returns the NetworkClientInfo from a NetworkClientState
|
||||
#define DEREF_CLIENT_INFO(cs) (&_network_client_info[cs - _clients])
|
||||
|
||||
// Macros to make life a bit more easier
|
||||
#define DEF_CLIENT_RECEIVE_COMMAND(type) NetworkRecvStatus NetworkPacketReceive_ ## type ## _command(Packet *p)
|
||||
|
|
|
@ -89,7 +89,7 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_COMPANY_INFO)
|
|||
|
||||
NetworkGetClientName(client_name, sizeof(client_name), csi);
|
||||
|
||||
ci = DEREF_CLIENT_INFO(csi);
|
||||
ci = csi->GetInfo();
|
||||
if (ci != NULL && IsValidCompanyID(ci->client_playas)) {
|
||||
if (!StrEmpty(clients[ci->client_playas])) {
|
||||
strecat(clients[ci->client_playas], ", ", lastof(clients[ci->client_playas]));
|
||||
|
@ -255,7 +255,7 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WELCOME)
|
|||
// Transmit info about all the active clients
|
||||
FOR_ALL_CLIENTS(new_cs) {
|
||||
if (new_cs != cs && new_cs->status > STATUS_AUTH)
|
||||
SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(cs, DEREF_CLIENT_INFO(new_cs));
|
||||
SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(cs, new_cs->GetInfo());
|
||||
}
|
||||
// Also send the info of the server
|
||||
SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(cs, NetworkFindClientInfoFromClientID(CLIENT_ID_SERVER));
|
||||
|
@ -609,7 +609,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_NEWGRFS_CHECKED)
|
|||
return;
|
||||
}
|
||||
|
||||
NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
NetworkClientInfo *ci = cs->GetInfo();
|
||||
|
||||
/* We now want a password from the client else we do not allow him in! */
|
||||
if (!StrEmpty(_settings_client.network.server_password)) {
|
||||
|
@ -685,7 +685,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
|
|||
return;
|
||||
}
|
||||
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
ci = cs->GetInfo();
|
||||
|
||||
strecpy(ci->client_name, name, lastof(ci->client_name));
|
||||
strecpy(ci->unique_id, unique_id, lastof(ci->unique_id));
|
||||
|
@ -719,7 +719,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD)
|
|||
return;
|
||||
}
|
||||
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
ci = cs->GetInfo();
|
||||
|
||||
if (IsValidCompanyID(ci->client_playas) && !StrEmpty(_network_company_states[ci->client_playas].password)) {
|
||||
SEND_COMMAND(PACKET_SERVER_NEED_PASSWORD)(cs, NETWORK_COMPANY_PASSWORD);
|
||||
|
@ -730,7 +730,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD)
|
|||
SEND_COMMAND(PACKET_SERVER_WELCOME)(cs);
|
||||
return;
|
||||
} else if (cs->status == STATUS_AUTHORIZING && type == NETWORK_COMPANY_PASSWORD) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
ci = cs->GetInfo();
|
||||
|
||||
if (strcmp(password, _network_company_states[ci->client_playas].password) != 0) {
|
||||
// Password is invalid
|
||||
|
@ -797,7 +797,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_MAP_OK)
|
|||
|
||||
FOR_ALL_CLIENTS(new_cs) {
|
||||
if (new_cs->status > STATUS_AUTH) {
|
||||
SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(new_cs, DEREF_CLIENT_INFO(cs));
|
||||
SEND_COMMAND(PACKET_SERVER_CLIENT_INFO)(new_cs, cs->GetInfo());
|
||||
SEND_COMMAND(PACKET_SERVER_JOIN)(new_cs, cs->client_id);
|
||||
}
|
||||
}
|
||||
|
@ -873,7 +873,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
|
|||
return;
|
||||
}
|
||||
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
ci = cs->GetInfo();
|
||||
|
||||
/* Check if cp->cmd is valid */
|
||||
if (!IsValidCommand(cp->cmd)) {
|
||||
|
@ -1094,7 +1094,7 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
|
|||
/* Find all clients that belong to this company */
|
||||
ci_to = NULL;
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
ci = cs->GetInfo();
|
||||
if (ci->client_playas == (CompanyID)dest) {
|
||||
SEND_COMMAND(PACKET_SERVER_CHAT)(cs, action, from_id, false, msg);
|
||||
if (cs->client_id == from_id) show_local = false;
|
||||
|
@ -1160,7 +1160,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
|
|||
|
||||
p->Recv_string(msg, NETWORK_CHAT_LENGTH);
|
||||
|
||||
const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
const NetworkClientInfo *ci = cs->GetInfo();
|
||||
switch (action) {
|
||||
case NETWORK_ACTION_GIVE_MONEY:
|
||||
if (!IsValidCompanyID(ci->client_playas)) break;
|
||||
|
@ -1189,7 +1189,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD)
|
|||
const NetworkClientInfo *ci;
|
||||
|
||||
p->Recv_string(password, sizeof(password));
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
ci = cs->GetInfo();
|
||||
|
||||
if (IsValidCompanyID(ci->client_playas)) {
|
||||
strecpy(_network_company_states[ci->client_playas].password, password, lastof(_network_company_states[ci->client_playas].password));
|
||||
|
@ -1208,7 +1208,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME)
|
|||
NetworkClientInfo *ci;
|
||||
|
||||
p->Recv_string(client_name, sizeof(client_name));
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
ci = cs->GetInfo();
|
||||
|
||||
if (cs->has_quit) return;
|
||||
|
||||
|
@ -1362,7 +1362,6 @@ static void NetworkCheckRestartMap()
|
|||
(and item 1. happens a year later) */
|
||||
static void NetworkAutoCleanCompanies()
|
||||
{
|
||||
NetworkTCPSocketHandler *cs;
|
||||
const NetworkClientInfo *ci;
|
||||
const Company *c;
|
||||
bool clients_in_company[MAX_COMPANIES];
|
||||
|
@ -1372,8 +1371,7 @@ static void NetworkAutoCleanCompanies()
|
|||
memset(clients_in_company, 0, sizeof(clients_in_company));
|
||||
|
||||
/* Detect the active companies */
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
if (IsValidCompanyID(ci->client_playas)) clients_in_company[ci->client_playas] = true;
|
||||
}
|
||||
|
||||
|
@ -1415,7 +1413,6 @@ static void NetworkAutoCleanCompanies()
|
|||
// and it returns true if that succeeded.
|
||||
bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH])
|
||||
{
|
||||
NetworkTCPSocketHandler *new_cs;
|
||||
bool found_name = false;
|
||||
byte number = 0;
|
||||
char original_name[NETWORK_CLIENT_NAME_LENGTH];
|
||||
|
@ -1427,8 +1424,7 @@ bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH])
|
|||
const NetworkClientInfo *ci;
|
||||
|
||||
found_name = true;
|
||||
FOR_ALL_CLIENTS(new_cs) {
|
||||
ci = DEREF_CLIENT_INFO(new_cs);
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
if (strcmp(ci->client_name, new_name) == 0) {
|
||||
// Name already in use
|
||||
found_name = false;
|
||||
|
@ -1569,7 +1565,6 @@ void NetworkServerChangeOwner(Owner current_owner, Owner new_owner)
|
|||
{
|
||||
/* The server has to handle all administrative issues, for example
|
||||
* updating and notifying all clients of what has happened */
|
||||
NetworkTCPSocketHandler *cs;
|
||||
NetworkClientInfo *ci = NetworkFindClientInfoFromClientID(CLIENT_ID_SERVER);
|
||||
|
||||
/* The server has just changed from owner */
|
||||
|
@ -1579,8 +1574,7 @@ void NetworkServerChangeOwner(Owner current_owner, Owner new_owner)
|
|||
}
|
||||
|
||||
/* Find all clients that were in control of this company, and mark them as new_owner */
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
if (current_owner == ci->client_playas) {
|
||||
ci->client_playas = new_owner;
|
||||
NetworkUpdateClientInfo(ci->client_id);
|
||||
|
@ -1612,7 +1606,7 @@ void NetworkServerShowStatusToConsole()
|
|||
NetworkTCPSocketHandler *cs;
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
int lag = NetworkCalculateLag(cs);
|
||||
const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
const NetworkClientInfo *ci = cs->GetInfo();
|
||||
const char* status;
|
||||
|
||||
status = (cs->status < (ptrdiff_t)lengthof(stat_str) ? stat_str[cs->status] : "unknown");
|
||||
|
@ -1635,10 +1629,8 @@ void NetworkServerSendError(ClientID client_id, NetworkErrorCode error)
|
|||
|
||||
bool NetworkCompanyHasClients(CompanyID company)
|
||||
{
|
||||
const NetworkTCPSocketHandler *cs;
|
||||
const NetworkClientInfo *ci;
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
ci = DEREF_CLIENT_INFO(cs);
|
||||
FOR_ALL_CLIENT_INFOS(ci) {
|
||||
if (ci->client_playas == company) return true;
|
||||
}
|
||||
return false;
|
||||
|
|
Loading…
Reference in New Issue