mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-26 22:31:10 +00:00
406 lines
6.1 KiB
C++
406 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;
|
||
|
}
|
||
|
}
|