mirror of
				https://github.com/KartKrewDev/RingRacers.git
				synced 2025-10-30 08:01:28 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			405 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			405 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Emacs style mode select   -*- C++ -*-
 | 
						|
//-----------------------------------------------------------------------------
 | 
						|
//
 | 
						|
// Copyright (C) 2000 by DooM Legacy Team.
 | 
						|
//
 | 
						|
// This program is free software; you can redistribute it and/or
 | 
						|
// modify it under the terms of the GNU General Public License
 | 
						|
// as published by the Free Software Foundation; either version 2
 | 
						|
// of the License, or (at your option) any later version.
 | 
						|
//
 | 
						|
// This program is distributed in the hope that it will be useful,
 | 
						|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
// GNU General Public License for more details.
 | 
						|
//
 | 
						|
//-----------------------------------------------------------------------------
 | 
						|
 | 
						|
#ifdef __GNUC__
 | 
						|
#include <unistd.h>
 | 
						|
#endif
 | 
						|
#include <typeinfo>
 | 
						|
#include "common.h"
 | 
						|
#include "srvlist.h"
 | 
						|
 | 
						|
//=============================================================================
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
CList::CList()
 | 
						|
{
 | 
						|
	list = NULL;
 | 
						|
	current = NULL;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
CList::~CList()
 | 
						|
{
 | 
						|
	CItem *p;
 | 
						|
 | 
						|
	while (list)
 | 
						|
	{
 | 
						|
		p = list;
 | 
						|
		list = list->next;
 | 
						|
		delete(p);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
int CList::insert(CItem *item)
 | 
						|
{
 | 
						|
	item->next = list;
 | 
						|
	list = item;
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
int CList::remove(CItem *item)
 | 
						|
{
 | 
						|
	CItem *position, *q;
 | 
						|
 | 
						|
	q = NULL;
 | 
						|
	position = list;
 | 
						|
 | 
						|
	while (position && (position != item))
 | 
						|
	{
 | 
						|
		q = position;
 | 
						|
		position = position->next;
 | 
						|
	}
 | 
						|
	if (position)
 | 
						|
	{
 | 
						|
		if (q)
 | 
						|
			q->next = position->next;
 | 
						|
		else
 | 
						|
			list = position->next;
 | 
						|
		delete position;
 | 
						|
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
CItem *CList::getFirst()
 | 
						|
{
 | 
						|
	current = list;
 | 
						|
	return current;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
CItem *CList::getNext()
 | 
						|
{
 | 
						|
	if (current)
 | 
						|
		current = current->next;
 | 
						|
	return current;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
void CList::show()
 | 
						|
{
 | 
						|
	CItem *p;
 | 
						|
 | 
						|
	p = list;
 | 
						|
	while (p)
 | 
						|
	{
 | 
						|
		p->print();
 | 
						|
		p = p->next;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
//=============================================================================
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
CItem::CItem()
 | 
						|
{
 | 
						|
	next = NULL;
 | 
						|
}
 | 
						|
 | 
						|
//=============================================================================
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
CInetAddr::CInetAddr(const char *ip, const char *port)
 | 
						|
{
 | 
						|
	strcpy(this->ip, ip);
 | 
						|
	strcpy(this->port, port);
 | 
						|
	PortNotChanged = true;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
const char *CInetAddr::getIP()
 | 
						|
{
 | 
						|
	return ip;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
const char *CInetAddr::getPort()
 | 
						|
{
 | 
						|
	return port;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
bool CInetAddr::setPort(const char *port)
 | 
						|
{
 | 
						|
	if (PortNotChanged)
 | 
						|
	{
 | 
						|
		strcpy(this->port, port);
 | 
						|
		PortNotChanged = false;
 | 
						|
	}
 | 
						|
	return !PortNotChanged;
 | 
						|
}
 | 
						|
 | 
						|
//=============================================================================
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
CPlayerItem::CPlayerItem(const char *ip, const char *port,
 | 
						|
	const char *nickname) : CInetAddr(ip, port)
 | 
						|
{
 | 
						|
	strcpy(this->nickname, nickname);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
void CPlayerItem::print()
 | 
						|
{
 | 
						|
	dbgPrintf(GREEN, "\tIP\t\t: %s\n\tPort\t\t: %s\n\tNickname\t: %s\n",
 | 
						|
		ip, port, nickname);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
char *CPlayerItem::getString()
 | 
						|
{
 | 
						|
	static char tmpbuf[1024];
 | 
						|
 | 
						|
	snprintf(tmpbuf, sizeof tmpbuf,
 | 
						|
		"\tIP\t\t: %s\n\tPort\t\t: %s\n\tNickname\t: %s\n",
 | 
						|
		ip, port, nickname);
 | 
						|
	return tmpbuf;
 | 
						|
}
 | 
						|
 | 
						|
//=============================================================================
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
CServerItem::CServerItem(const char *ip, const char *port, const char *hostname, const char *version, ServerType type) : CInetAddr(ip, port)
 | 
						|
{
 | 
						|
	time_t timenow = time(NULL);
 | 
						|
	const tm *timeGMT = gmtime(&timenow);
 | 
						|
	// check name of server here
 | 
						|
	strcpy(this->hostname, hostname);
 | 
						|
	strcpy(this->version, version);
 | 
						|
	this->type = type;
 | 
						|
	strftime(reg_time, REG_TIME_SIZE+1, "%Y-%m-%dT%H:%MZ",timeGMT);
 | 
						|
	{
 | 
						|
		int i;
 | 
						|
		memset(guid,'\0',GUID_SIZE);
 | 
						|
		strcpy(&guid[0], ip);
 | 
						|
		strcpy(&guid[15], port); // GenUID
 | 
						|
		for (i = 0; i <= GUID_SIZE-1; i++)
 | 
						|
		{
 | 
						|
			if (guid[i] == '\0' || guid[i] == '.')
 | 
						|
				guid[i] = '0' + (rand()/(RAND_MAX/15));
 | 
						|
			if (guid[i] > '9')
 | 
						|
				guid[i] += 'A'-'9';
 | 
						|
		}
 | 
						|
		guid[GUID_SIZE] = '\0';
 | 
						|
	}
 | 
						|
 | 
						|
	HeartBeat = time(NULL);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
void CServerItem::print()
 | 
						|
{
 | 
						|
	dbgPrintf(GREEN, "IP\t\t: %s\nPort\t\t: %s\nHostname\t: %s\nVersion\t: %s\nPermanent\t: %s\n",
 | 
						|
		ip, port, hostname, version, (type == ST_PERMANENT) ? "Yes" : "No");
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
const char *CServerItem::getString()
 | 
						|
{
 | 
						|
	static char tmpbuf[1024];
 | 
						|
 | 
						|
	snprintf(tmpbuf, sizeof tmpbuf,
 | 
						|
		"IP\t\t: %s\nPort\t\t: %s\nHostname\t: %s\nVersion\t\t: %s\nPermanent\t: %s\n",
 | 
						|
		ip, port, hostname, version, (type==ST_PERMANENT) ? "Yes" : "No");
 | 
						|
	return tmpbuf;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
const char *CServerItem::getName()
 | 
						|
{
 | 
						|
	return hostname;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
const char *CServerItem::getVersion()
 | 
						|
{
 | 
						|
	return version;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
const char *CServerItem::getGuid()
 | 
						|
{
 | 
						|
	return guid;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
const char *CServerItem::getRegtime()
 | 
						|
{
 | 
						|
	return reg_time;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
//=============================================================================
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
void CServerList::insertPlayer(CServerItem *server, CPlayerItem *player)
 | 
						|
{
 | 
						|
	server->players_list.insert(player);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
void CServerList::removePlayer(CServerItem *server, CPlayerItem *player)
 | 
						|
{
 | 
						|
	server->players_list.remove(player);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
int CServerList::insert(CServerItem *server)
 | 
						|
{
 | 
						|
	CList::insert((CItem *)server);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
int CServerList::insert(const char *ip, const char *port,
 | 
						|
	const char *hostname, const char *version, ServerType type)
 | 
						|
{
 | 
						|
	CServerItem *server;
 | 
						|
 | 
						|
	server = new CServerItem(ip, port, hostname, version, type);
 | 
						|
	CList::insert(server);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
int CServerList::remove(CServerItem *server)
 | 
						|
{
 | 
						|
	return CList::remove((CItem *)server);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
int CServerList::remove(const char *ip, const char *port,
 | 
						|
	const char *hostname, const char *version, ServerType type)
 | 
						|
{
 | 
						|
	// TODO
 | 
						|
	CServerItem *position, *q;
 | 
						|
	bool match;
 | 
						|
 | 
						|
	(void)hostname;
 | 
						|
	(void)port;
 | 
						|
 | 
						|
	match = false;
 | 
						|
	position = (CServerItem *)list;
 | 
						|
	q = NULL;
 | 
						|
 | 
						|
	while (position && !match)
 | 
						|
	{
 | 
						|
		if (strcmp(position->ip, ip) == 0
 | 
						|
			&& strcmp(position->version, version) == 0
 | 
						|
			&& strcmp(position->port, port) == 0
 | 
						|
			&& position->type == type)
 | 
						|
		{
 | 
						|
			match = true;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			q = position;
 | 
						|
			position = (CServerItem *)position->next;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if (position && match)
 | 
						|
	{
 | 
						|
		if (q)
 | 
						|
			q->next = position->next;
 | 
						|
		else
 | 
						|
			list = position->next;
 | 
						|
		delete position;
 | 
						|
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
**
 | 
						|
*/
 | 
						|
void CServerList::show()
 | 
						|
{
 | 
						|
	CServerItem *p;
 | 
						|
 | 
						|
	p = (CServerItem *)list;
 | 
						|
	while (p)
 | 
						|
	{
 | 
						|
		p->print();
 | 
						|
		p->players_list.show();
 | 
						|
		p = (CServerItem *)p->next;
 | 
						|
	}
 | 
						|
}
 |