bool
NetClientDlg::PingComplete()
{
    if (hnet != 0) {
        DWORD result = 0;
        GetExitCodeThread(hnet, &result);

        if (result != STILL_ACTIVE) {
            CloseHandle(hnet);
            hnet = 0;

            NetClientConfig* config = NetClientConfig::GetInstance();
            if (config) {
                NetServerInfo* info = config->GetServerInfo(ping_index);
                if (info) {
                    // copy result back into server list
                    info->machine_info = ping_info.machine_info;
                    info->gameport     = ping_info.gameport;
                    info->status       = ping_info.status;
                    info->nplayers     = ping_info.nplayers;
                    info->hosted       = ping_info.hosted;
                    info->ping_time    = ping_info.ping_time;
                }
            }

            if (lst_servers && ping_index >= lst_servers->NumItems()-1)
            ping_index = 0;
            else
            ping_index++;
        }
    }

    return !hnet;
}
NetGameClient::NetGameClient()
: server_id(0), join_req_time(0)
{
	Print("Constructing NetGameClient\n");

	NetHost me;
	Text    server_name;
	WORD    port = 11101;

	NetClientConfig* ncc = NetClientConfig::GetInstance();
	if (ncc) {
		NetServerInfo* info = ncc->GetSelectedServer();

		if (info) {
			server_name = info->hostname;
			port        = info->gameport;
		}
	}

	if (server_name.length() && port > 0) {
		Print("  '%s' is a client of '%s'\n", me.Name(), server_name);
		link = new(__FILE__,__LINE__) NetLink;
		server_id = link->AddPeer(NetAddr(server_name, port));
		SendJoinRequest();
	}
	else if (port == 0) {
		Print("  '%s' invalid game port number %d\n", me.Name(), port);
	}
	else {
		Print("  '%s' is a client without a server\n", me.Name());
	}
}
void
NetClientDlg::PingServer(int n)
{
    if (hnet == 0) {
        NetClientConfig* config = NetClientConfig::GetInstance();
        if (!config) return;

        NetServerInfo* info = config->GetServerInfo(n);
        if (!info) return;

        // copy info from server list
        ping_info = *info;

        DWORD thread_id = 0;
        hnet = CreateThread(0, 4096, NetClientPingProc, (LPVOID) &ping_info, 0, &thread_id);

        if (hnet == 0) {
            static int report = 10;
            if (report > 0) {
                ::Print("WARNING: NetClientDlg() failed to create PING thread for server '%s' (err=%08x)\n", info->name.data(), GetLastError());
                report--;

                if (report == 0)
                ::Print("         Further warnings of this type will be supressed.\n");
            }
        }
    }
}
NetLobbyClient::NetLobbyClient()
: NetLobby(false), server_id(0), host(false), exit_code(0), temporary(false)
{
    NetHost me;
    Text    server_name;
    WORD    port = 11101;

    ping_req_time = 0;
    chat_req_time = 0;
    user_req_time = 0;
    camp_req_time = 0;
    unit_req_time = 0;
    mods_req_time = 0;

    NetClientConfig* ncc = NetClientConfig::GetInstance();
    if (ncc) {
        NetServerInfo* info = ncc->GetSelectedServer();

        if (info) {
            server_name = info->hostname;
            addr        = info->addr;
            port        = info->port;
            gamepass    = info->password;
        }
    }

    if (server_name.length() && port > 0) {
        Print("  '%s' is a client of '%s'\n", me.Name(), server_name.data());
        link = new(__FILE__,__LINE__) NetLink;
        server_id = link->AddPeer(NetAddr(server_name, port));
    }
    else if (port == 0) {
        Print("  '%s' invalid lobby port number %d\n", me.Name(), port);
    }
    else {
        Print("  '%s' is a client without a server\n", me.Name());
    }
}