void CServerBrowser::RequestImpl(const NETADDR &Addr, CServerEntry *pEntry) { if(g_Config.m_Debug) { char aAddrStr[NETADDR_MAXSTRSIZE]; net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr), true); char aBuf[256]; str_format(aBuf, sizeof(aBuf),"requesting server info from %s", aAddrStr); m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", aBuf); } CPacker Packer; Packer.Reset(); Packer.AddRaw(SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); Packer.AddInt(pEntry ? pEntry->m_CurrentToken : m_CurrentLanToken); CNetChunk Packet; Packet.m_ClientID = -1; Packet.m_Address = Addr; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = Packer.Size(); Packet.m_pData = Packer.Data(); CSendCBData Data; Data.m_pfnCallback = CBFTrackPacket; Data.m_pCallbackUser = this; m_pNetClient->Send(&Packet, NET_TOKEN_NONE, &Data); pEntry->m_TrackID = Data.m_TrackID; if(pEntry) { pEntry->m_RequestTime = time_get(); pEntry->m_InfoState = CServerEntry::STATE_PENDING; } }
void CServerBrowser::Refresh(int RefreshFlags) { m_RefreshFlags = RefreshFlags; if(RefreshFlags&IServerBrowser::REFRESHFLAG_LAN) { // clear out everything m_aServerlist[IServerBrowser::TYPE_LAN].Clear(); if(m_ActServerlistType == IServerBrowser::TYPE_LAN) m_ServerBrowserFilter.Clear(); // next token m_CurrentLanToken = GetNewToken(); CPacker Packer; Packer.Reset(); Packer.AddRaw(SERVERBROWSE_GETINFO, sizeof(SERVERBROWSE_GETINFO)); Packer.AddInt(m_CurrentLanToken); /* do the broadcast version */ CNetChunk Packet; mem_zero(&Packet, sizeof(Packet)); Packet.m_Address.type = m_pNetClient->NetType()|NETTYPE_LINK_BROADCAST; Packet.m_ClientID = -1; Packet.m_Flags = NETSENDFLAG_CONNLESS; Packet.m_DataSize = Packer.Size(); Packet.m_pData = Packer.Data(); m_BroadcastTime = time_get(); for(int i = 8303; i <= 8310; i++) { Packet.m_Address.port = i; m_pNetClient->Send(&Packet); } if(g_Config.m_Debug) m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", "broadcasting for servers"); } if(RefreshFlags&IServerBrowser::REFRESHFLAG_INTERNET) { // clear out everything for(CServerEntry *pEntry = m_pFirstReqServer; pEntry; pEntry = pEntry->m_pNextReq) { m_pNetClient->PurgeStoredPacket(pEntry->m_TrackID); } m_aServerlist[IServerBrowser::TYPE_INTERNET].Clear(); if(m_ActServerlistType == IServerBrowser::TYPE_INTERNET) m_ServerBrowserFilter.Clear(); m_pFirstReqServer = 0; m_pLastReqServer = 0; m_NumRequests = 0; m_NeedRefresh = 1; for(int i = 0; i < m_ServerBrowserFavorites.m_NumFavoriteServers; i++) if(m_ServerBrowserFavorites.m_aFavoriteServers[i].m_State >= CServerBrowserFavorites::FAVSTATE_ADDR) Set(m_ServerBrowserFavorites.m_aFavoriteServers[i].m_Addr, SET_FAV_ADD, -1, 0); } }