about summary refs log tree commit diff
path: root/src/versionsrv/versionsrv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/versionsrv/versionsrv.cpp')
-rw-r--r--src/versionsrv/versionsrv.cpp71
1 files changed, 70 insertions, 1 deletions
diff --git a/src/versionsrv/versionsrv.cpp b/src/versionsrv/versionsrv.cpp
index 1ca3835f..d36fba3b 100644
--- a/src/versionsrv/versionsrv.cpp
+++ b/src/versionsrv/versionsrv.cpp
@@ -6,8 +6,54 @@
 
 #include "versionsrv.h"
 
+enum {
+	MAX_MAPS_PER_PACKET=48,
+	MAX_PACKETS=16,
+	MAX_MAPS=MAX_MAPS_PER_PACKET*MAX_PACKETS,
+};
+
+struct CPacketData
+{
+	int m_Size;
+	struct {
+		unsigned char m_aHeader[sizeof(VERSIONSRV_MAPLIST)];
+		CMapVersion m_aMaplist[MAX_MAPS_PER_PACKET];
+	} m_Data;
+};
+
+CPacketData m_aPackets[MAX_PACKETS];
+static int m_NumPackets = 0;
+
 static CNetClient g_NetOp; // main
 
+void BuildPackets()
+{
+	CMapVersion *pCurrent = &s_aMapVersionList[0];
+	int ServersLeft = s_NumMapVersionItems;
+	m_NumPackets = 0;
+	while(ServersLeft && m_NumPackets < MAX_PACKETS)
+	{
+		int Chunk = ServersLeft;
+		if(Chunk > MAX_MAPS_PER_PACKET)
+			Chunk = MAX_MAPS_PER_PACKET;
+		ServersLeft -= Chunk;
+		
+		// copy header	
+		mem_copy(m_aPackets[m_NumPackets].m_Data.m_aHeader, VERSIONSRV_MAPLIST, sizeof(VERSIONSRV_MAPLIST));
+		
+		// copy map versions
+		for(int i = 0; i < Chunk; i++)
+		{
+			m_aPackets[m_NumPackets].m_Data.m_aMaplist[i] = *pCurrent;
+			pCurrent++;
+		}
+		
+		m_aPackets[m_NumPackets].m_Size = sizeof(VERSIONSRV_MAPLIST) + sizeof(CMapVersion)*Chunk;
+		
+		m_NumPackets++;
+	}
+}
+
 void SendVer(NETADDR *pAddr)
 {
 	CNetChunk p;
@@ -33,8 +79,15 @@ int main(int argc, char **argv) // ignore_convention
 	net_init();
 
 	mem_zero(&BindAddr, sizeof(BindAddr));
+	BindAddr.type = NETTYPE_ALL;
 	BindAddr.port = VERSIONSRV_PORT;
-	g_NetOp.Open(BindAddr, 0);
+	if(!g_NetOp.Open(BindAddr, 0))
+	{
+		dbg_msg("mastersrv", "couldn't start network");
+		return -1;
+	}
+
+	BuildPackets();
 	
 	dbg_msg("versionsrv", "started");
 	
@@ -51,6 +104,22 @@ int main(int argc, char **argv) // ignore_convention
 			{
 				SendVer(&Packet.m_Address);
 			}
+
+			if(Packet.m_DataSize == sizeof(VERSIONSRV_GETMAPLIST) &&
+				mem_comp(Packet.m_pData, VERSIONSRV_GETMAPLIST, sizeof(VERSIONSRV_GETMAPLIST)) == 0)
+			{
+				CNetChunk p;
+				p.m_ClientID = -1;
+				p.m_Address = Packet.m_Address;
+				p.m_Flags = NETSENDFLAG_CONNLESS;
+				
+				for(int i = 0; i < m_NumPackets; i++)
+				{
+					p.m_DataSize = m_aPackets[i].m_Size;
+					p.m_pData = &m_aPackets[i].m_Data;
+					g_NetOp.Send(&p);
+				}
+			}
 		}
 		
 		// be nice to the CPU