Пример #1
0
/**
 * @brief LAN_AddServer
 * @param[in] source
 * @param[in] name
 * @param[in] address
 * @return
 */
static int LAN_AddServer(int source, const char *name, const char *address)
{
    int          max = MAX_OTHER_SERVERS, *count = 0;
    netadr_t     adr;
    serverInfo_t *servers = NULL;

    switch (source)
    {
    case AS_LOCAL:
        count   = &cls.numlocalservers;
        servers = &cls.localServers[0];
        break;
    case AS_GLOBAL:
        max     = MAX_GLOBAL_SERVERS;
        count   = &cls.numglobalservers;
        servers = &cls.globalServers[0];
        break;
    case AS_FAVORITES:
        count   = &cls.numfavoriteservers;
        servers = &cls.favoriteServers[0];
        break;
    }

    if (servers && *count < max)
    {
        int i;

        NET_StringToAdr(address, &adr, NA_UNSPEC);
        for (i = 0; i < *count; i++)
        {
            if (NET_CompareAdr(servers[i].adr, adr))
            {
                break;
            }
        }
        if (i >= *count)
        {
            servers[*count].adr = adr;
            Q_strncpyz(servers[*count].hostName, name, sizeof(servers[*count].hostName));
            servers[*count].visible = qtrue;
            (*count)++;

            if (source == AS_FAVORITES)
            {
                LAN_SaveServersToFile();
            }

            return 1;
        }
        return 0;
    }
    return -1;
}
Пример #2
0
/*
====================
LAN_RemoveServer
====================
*/
static void LAN_RemoveServer(int source, const char *addr)
{
	int          *count   = 0;
	serverInfo_t *servers = NULL;

	switch (source)
	{
	case AS_LOCAL:
		count   = &cls.numlocalservers;
		servers = &cls.localServers[0];
		break;
	case AS_GLOBAL:
		count   = &cls.numglobalservers;
		servers = &cls.globalServers[0];
		break;
	case AS_FAVORITES:
		count   = &cls.numfavoriteservers;
		servers = &cls.favoriteServers[0];
		break;
	}
	if (servers)
	{
		netadr_t comp;
		int      i, j;

		NET_StringToAdr(addr, &comp, NA_UNSPEC);
		for (i = 0; i < *count; i++)
		{
			if (NET_CompareAdr(comp, servers[i].adr))
			{
				j = i;

				while (j < *count - 1)
				{
					Com_Memcpy(&servers[j], &servers[j + 1], sizeof(servers[j]));
					j++;
				}
				(*count)--;
				break;
			}
		}

		if (source == AS_FAVORITES)
		{
			LAN_SaveServersToFile();
		}
	}
}
Пример #3
0
/**
 * @brief Removes server(s) from the 'cache'
 * @param source Positive values AS_LOCAL, AS_GLOBAL, AS_FAVORITES
 *               or negative values AS_LOCAL_ALL, AS_GLOBAL_ALL, AS_FAVORITES_ALL to remove all
 * @param addr   Server address - in case of negative source param addr is not required
 *
 */
static void LAN_RemoveServer(int source, const char *addr)
{
    int          *count   = 0;
    serverInfo_t *servers = NULL;

    switch (source)
    {
    case AS_LOCAL:
    case AS_LOCAL_ALL:
        count   = &cls.numlocalservers;
        servers = &cls.localServers[0];
        break;
    case AS_GLOBAL:
    case AS_GLOBAL_ALL:
        count   = &cls.numglobalservers;
        servers = &cls.globalServers[0];
        break;
    case AS_FAVORITES:
    case AS_FAVORITES_ALL:
        count   = &cls.numfavoriteservers;
        servers = &cls.favoriteServers[0];
        break;
    }

    if (servers && count > 0)
    {
        if (source >= AS_LOCAL) // single server removal
        {
            netadr_t comp;
            int      i, j;

            NET_StringToAdr(addr, &comp, NA_UNSPEC);
            for (i = 0; i < *count; i++)
            {
                if (NET_CompareAdr(comp, servers[i].adr))
                {
                    j = i;

                    while (j < *count - 1)
                    {
                        Com_Memcpy(&servers[j], &servers[j + 1], sizeof(servers[j]));
                        j++;
                    }
                    (*count)--;
                    break;
                }
            }

            if (source == AS_FAVORITES)
            {
                LAN_SaveServersToFile();
            }
        }
        else // remove all
        {
            switch (source)
            {
            case AS_LOCAL_ALL:
                Com_Printf("Removing %i local servers\n", cls.numlocalservers);
                cls.numlocalservers = 0;
                Com_Memset(&cls.localServers, 0, sizeof(cls.localServers));
                break;
            case AS_GLOBAL_ALL:
                Com_Printf("Removing %i global servers\n", cls.numglobalservers);
                cls.numglobalservers = 0;
                Com_Memset(&cls.globalServers, 0, sizeof(cls.globalServers));
                break;
            case AS_FAVORITES_ALL:
                Com_Printf("Removing %i favourite servers\n", cls.numfavoriteservers);
                cls.numfavoriteservers = 0;
                Com_Memset(&cls.favoriteServers, 0, sizeof(cls.favoriteServers));
                LAN_SaveServersToFile();
                break;
            default:
                Com_Printf("LAN_RemoveServer: Invalid source\n");
                break;
            }
        }
    }
    else
    {
        Com_Printf("No server found - nothing to remove\n");
    }
}