void CSbmfcsampleDlg::AddServer(SBServer server, BOOL checkForReplace) { // set the progress if(ServerBrowserCount(m_serverBrowser) > 0) m_progress.SetPos((ServerBrowserCount(m_serverBrowser) - ServerBrowserPendingQueryCount(m_serverBrowser)) * 100 / ServerBrowserCount(m_serverBrowser)); // check for the server in the list int index = FindServer(server); bool replace = (index != -1); // if we didn't find a server to replace, append if(!replace) index = m_serverList.GetItemCount(); // set or insert the hostname const char * hostname = SBServerGetStringValue(server, "hostname","(NO NAME)"); if(replace) { m_serverList.SetItem(index, COL_SERVERNAME, LVIF_TEXT, hostname, -1, 0, 0, NULL); } else { m_serverList.InsertItem(index, hostname); m_serverList.SetItem(index, COL_SERVERNAME, LVIF_PARAM, NULL, -1, 0, 0, (LPARAM)server); } // set the rest of the columns int numplayers = SBServerGetIntValue(server, "numplayers", 0); CString ping, players; if (SBServerHasValidPing(server)) ping.Format("%d%s", SBServerGetPing(server), SBServerDirectConnect(server) ? "" : "i"); else ping = "Unknown"; players.Format("%d/%d", numplayers, SBServerGetIntValue(server, "maxplayers", 0)); m_serverList.SetItem(index, COL_PING, LVIF_TEXT, ping, -1, 0, 0, 0); m_serverList.SetItem(index, COL_PLAYERS, LVIF_TEXT, players, -1, 0, 0, 0); m_serverList.SetItem(index, COL_MAPNAME, LVIF_TEXT, SBServerGetStringValue(server, "mapname", "(NO MAP)"), -1, 0, 0, 0); m_serverList.SetItem(index, COL_GAMETYPE, LVIF_TEXT, SBServerGetStringValue(server, "gametype", ""), -1, 0, 0, 0); // update server count if(!replace) { CString str; str.Format("%d", ++m_serverCount); m_servers.SetWindowText(str); } GSI_UNUSED(checkForReplace); }
/* SBServerGetConnectionInfo ---------------- Check if Nat Negotiation is requires, based off whether it is a lan game, public ip present and several other facts. Returns an IP string to use for NatNeg, or direct connect if possible Work for subsequent connection to this server, One of three results will occur i) Lan game, connect using ipstring 2) Internet game, connect using ipstring 3) nat traversal required, perform nat negotiation using Nat SDK and this ipstring before connecting. return sb_true if further processing is required... i.e. NAT. sb_false if not. fills an IP string */ SBBool SBServerGetConnectionInfo(ServerBrowser gSB, SBServer server, gsi_u16 PortToConnectTo, char *ipstring) { SBBool natneg = SBFalse; if (SBServerHasPrivateAddress(server) == SBTrue && (SBServerGetPublicInetAddress(server) == ServerBrowserGetMyPublicIPAddr(gSB))) { //directly connect to private IP (LAN) sprintf(ipstring,"%s:%d", SBServerGetPrivateAddress(server),PortToConnectTo ); } else if ((SBServerDirectConnect(server) == SBTrue )&& (SBServerHasPrivateAddress(server) == SBFalse)) { //can directly connect to public IP, no negotiation required sprintf(ipstring,"%s:%d", SBServerGetPrivateAddress(server), PortToConnectTo ); } else { //Nat Negotiation required natneg = SBTrue; sprintf(ipstring,"%s:%d", SBServerGetPublicAddress(server), SBServerGetPublicQueryPort (server) ); } return natneg; }