📄 serverlist.cpp
字号:
uint16 i = 0;
for( pos1 = list.GetHeadPosition(); ( pos2 = pos1 ) != NULL; ){
list.GetNext(pos1);
CServer* cur_server = list.GetAt(pos2);
if (cur_server==aServer){
list.AddTail(cur_server);
list.RemoveAt(pos2);
return;
}
i++;
if (i == list.GetCount())
break;
}
}
void CServerList::SetServerPosition(uint32 newPosition)
{
if (newPosition < (uint32)list.GetCount())
serverpos = newPosition;
else
serverpos = 0;
}
void CServerList::Sort()
{
POSITION pos1, pos2;
uint16 i = 0;
for( pos1 = list.GetHeadPosition(); ( pos2 = pos1 ) != NULL; ){
list.GetNext(pos1);
CServer* cur_server = list.GetAt(pos2);
if (cur_server->GetPreferences()== SRV_PR_HIGH){
list.AddHead(cur_server);
list.RemoveAt(pos2);
}
else if (cur_server->GetPreferences() == SRV_PR_LOW){
list.AddTail(cur_server);
list.RemoveAt(pos2);
}
i++;
if (i == list.GetCount())
break;
}
}
CServer* CServerList::GetNextServer()
{
if (serverpos >= (uint32)list.GetCount())
return 0;
CServer* nextserver = NULL;
uint32 i = 0;
while (!nextserver && i < (uint32)list.GetCount()){
POSITION posIndex = list.FindIndex(serverpos);
if (posIndex == NULL) { // check if search position is still valid (could be corrupted by server delete operation)
posIndex = list.GetHeadPosition();
serverpos = 0;
}
nextserver = list.GetAt(posIndex);
serverpos++;
i++;
// TODO: Add more option to filter bad server like min ping, min users etc
}
return nextserver;
}
CServer* CServerList::GetNextSearchServer()
{
CServer* nextserver = NULL;
uint32 i = 0;
while (!nextserver && i < (uint32)list.GetCount()){
POSITION posIndex = list.FindIndex(searchserverpos);
if (posIndex == NULL) { // check if search position is still valid (could be corrupted by server delete operation)
posIndex = list.GetHeadPosition();
searchserverpos=0;
}
nextserver = list.GetAt(posIndex);
searchserverpos++;
i++;
if (searchserverpos == list.GetCount())
searchserverpos = 0;
}
return nextserver;
}
CServer* CServerList::GetNextStatServer()
{
CServer* nextserver = NULL;
uint32 i = 0;
while (!nextserver && i < (uint32)list.GetCount()){
POSITION posIndex = list.FindIndex(statserverpos);
if (posIndex == NULL) { // check if search position is still valid (could be corrupted by server delete operation)
posIndex = list.GetHeadPosition();
statserverpos=0;
}
nextserver = list.GetAt(posIndex);
statserverpos++;
i++;
if (statserverpos == list.GetCount())
statserverpos = 0;
}
return nextserver;
}
CServer* CServerList::GetNextServer(const CServer* lastserver) const
{
if (list.IsEmpty())
return 0;
if (!lastserver)
return list.GetHead();
POSITION pos = list.Find(const_cast<CServer*>(lastserver));
if (!pos){
TRACE("Error: CServerList::GetNextServer");
return list.GetHead();
}
list.GetNext(pos);
if (!pos)
return NULL;
else
return list.GetAt(pos);
}
CServer* CServerList::GetServerByAddress(LPCTSTR address, uint16 port) const
{
for (POSITION pos = list.GetHeadPosition();pos != 0;){
CServer* s = list.GetNext(pos);
if (( port == s->GetPort() || port==0) && !_tcscmp(s->GetAddress(),address))
return s;
}
return NULL;
}
CServer* CServerList::GetServerByIP(uint32 nIP) const
{
for (POSITION pos = list.GetHeadPosition();pos != 0;){
CServer* s = list.GetNext(pos);
if (s->GetIP() == nIP)
return s;
}
return NULL;
}
CServer* CServerList::GetServerByIP(uint32 nIP, uint16 nPort) const
{
for (POSITION pos = list.GetHeadPosition();pos != 0;){
CServer* s = list.GetNext(pos);
if (s->GetIP() == nIP && s->GetPort() == nPort)
return s;
}
return NULL;
}
bool CServerList::SaveServermetToFile()
{
if (thePrefs.GetLogFileSaving())
AddDebugLogLine(false, _T("Saving servers list file \"%s\""), SERVER_MET_FILENAME);
m_nLastSaved = ::GetTickCount();
CString newservermet(thePrefs.GetConfigDir());
newservermet += SERVER_MET_FILENAME _T(".new");
CSafeBufferedFile servermet;
CFileException fexp;
if (!servermet.Open(newservermet, CFile::modeWrite|CFile::modeCreate|CFile::typeBinary|CFile::shareDenyWrite, &fexp)){
CString strError(GetResString(IDS_ERR_SAVESERVERMET));
TCHAR szError[MAX_CFEXP_ERRORMSG];
if (fexp.GetErrorMessage(szError, ARRSIZE(szError))){
strError += _T(" - ");
strError += szError;
}
AddLogLine(true, _T("%s"), strError);
return false;
}
setvbuf(servermet.m_pStream, NULL, _IOFBF, 16384);
try{
servermet.WriteUInt8(0xE0);
UINT fservercount = list.GetCount();
servermet.WriteUInt32(fservercount);
for (UINT j = 0; j < fservercount; j++)
{
const CServer* nextserver = GetServerAt(j);
servermet.WriteUInt32(nextserver->GetIP());
servermet.WriteUInt16(nextserver->GetPort());
uint32 uTagCount = 0;
ULONG uTagCountFilePos = (ULONG)servermet.GetPosition();
servermet.WriteUInt32(uTagCount);
if (!nextserver->GetListName().IsEmpty()){
#ifdef _UNICODE
if (WriteOptED2KUTF8Tag(&servermet, nextserver->GetListName(), ST_SERVERNAME))
uTagCount++;
#endif
CTag servername(ST_SERVERNAME, nextserver->GetListName());
servername.WriteTagToFile(&servermet);
uTagCount++;
}
if (!nextserver->GetDynIP().IsEmpty()){
#ifdef _UNICODE
if (WriteOptED2KUTF8Tag(&servermet, nextserver->GetDynIP(), ST_DYNIP))
uTagCount++;
#endif
CTag serverdynip(ST_DYNIP, nextserver->GetDynIP());
serverdynip.WriteTagToFile(&servermet);
uTagCount++;
}
if (!nextserver->GetDescription().IsEmpty()){
#ifdef _UNICODE
if (WriteOptED2KUTF8Tag(&servermet, nextserver->GetDescription(), ST_DESCRIPTION))
uTagCount++;
#endif
CTag serverdesc(ST_DESCRIPTION, nextserver->GetDescription());
serverdesc.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetFailedCount()){
CTag serverfail(ST_FAIL, nextserver->GetFailedCount());
serverfail.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetPreferences() != SRV_PR_NORMAL){
CTag serverpref(ST_PREFERENCE, nextserver->GetPreferences());
serverpref.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetUsers()){
CTag serveruser("users", nextserver->GetUsers());
serveruser.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetFiles()){
CTag serverfiles("files", nextserver->GetFiles());
serverfiles.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetPing()){
CTag serverping(ST_PING, nextserver->GetPing());
serverping.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetLastPingedTime()){
CTag serverlastp(ST_LASTPING, nextserver->GetLastPingedTime());
serverlastp.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetMaxUsers()){
CTag servermaxusers(ST_MAXUSERS, nextserver->GetMaxUsers());
servermaxusers.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetSoftFiles()){
CTag softfiles(ST_SOFTFILES, nextserver->GetSoftFiles());
softfiles.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetHardFiles()){
CTag hardfiles(ST_HARDFILES, nextserver->GetHardFiles());
hardfiles.WriteTagToFile(&servermet);
uTagCount++;
}
if (!nextserver->GetVersion().IsEmpty()){
// as long as we don't receive an integer version tag from the local server (TCP) we store it as string
CTag version(ST_VERSION, nextserver->GetVersion());
version.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetUDPFlags()){
CTag tagUDPFlags(ST_UDPFLAGS, nextserver->GetUDPFlags());
tagUDPFlags.WriteTagToFile(&servermet);
uTagCount++;
}
if (nextserver->GetLowIDUsers()){
CTag tagLowIDUsers(ST_LOWIDUSERS, nextserver->GetLowIDUsers());
tagLowIDUsers.WriteTagToFile(&servermet);
uTagCount++;
}
servermet.Seek(uTagCountFilePos, CFile::begin);
servermet.WriteUInt32(uTagCount);
servermet.SeekToEnd();
}
if (thePrefs.GetCommitFiles() >= 2 || (thePrefs.GetCommitFiles() >= 1 && !theApp.emuledlg->IsRunning())){
servermet.Flush(); // flush file stream buffers to disk buffers
if (_commit(_fileno(servermet.m_pStream)) != 0) // commit disk buffers to disk
AfxThrowFileException(CFileException::hardIO, GetLastError(), servermet.GetFileName());
}
servermet.Close();
CString curservermet(thePrefs.GetConfigDir());
CString oldservermet(thePrefs.GetConfigDir());
curservermet += SERVER_MET_FILENAME;
oldservermet += _T("server_met.old");
if (_taccess(oldservermet, 0) == 0)
CFile::Remove(oldservermet);
if (_taccess(curservermet, 0) == 0)
CFile::Rename(curservermet,oldservermet);
CFile::Rename(newservermet,curservermet);
}
catch(CFileException* error) {
CString strError(GetResString(IDS_ERR_SAVESERVERMET2));
TCHAR szError[MAX_CFEXP_ERRORMSG];
if (error->GetErrorMessage(szError, ARRSIZE(szError))){
strError += _T(" - ");
strError += szError;
}
AddLogLine(false, _T("%s"), strError);
error->Delete();
return false;
}
return true;
}
void CServerList::AddServersFromTextFile(const CString& strFilename)
{
CStdioFile f;
if (!f.Open(strFilename, CFile::modeRead | CFile::typeText | CFile::shareDenyWrite))
return;
CString strLine;
while (f.ReadString(strLine))
{
// format is host:port,priority,Name
if (strLine.GetLength() < 5)
continue;
if (strLine.GetAt(0) == _T('#') || strLine.GetAt(0) == _T('/'))
continue;
// fetch host
int pos = strLine.Find(_T(':'));
if (pos == -1){
pos = strLine.Find(_T(','));
if (pos == -1)
continue;
}
CString strHost = strLine.Left(pos);
strLine = strLine.Mid(pos+1);
// fetch port
pos = strLine.Find(_T(','));
if (pos == -1)
continue;
CString strPort = strLine.Left(pos);
strLine = strLine.Mid(pos+1);
// Barry - fetch priority
pos = strLine.Find(_T(','));
int priority = SRV_PR_HIGH;
if (pos == 1)
{
CString strPriority = strLine.Left(pos);
try
{
priority = _tstoi(strPriority.GetBuffer(0));
if (priority < 0 || priority > 2)
priority = SRV_PR_HIGH;
}
catch (...){
ASSERT(0);
}
strLine = strLine.Mid(pos+1);
}
// fetch name
CString strName = strLine;
strName.Replace(_T("\r"), _T(""));
strName.Replace(_T("\n"), _T(""));
// create server object and add it to the list
CServer* nsrv = new CServer(_tstoi(strPort), strHost.GetBuffer());
nsrv->SetListName(strName.GetBuffer());
nsrv->SetIsStaticMember(true);
nsrv->SetPreference(priority);
if (!theApp.emuledlg->serverwnd->serverlistctrl.AddServer(nsrv, true))
{
delete nsrv;
CServer* srvexisting = GetServerByAddress(strHost.GetBuffer(), _tstoi(strPort));
if (srvexisting) {
srvexisting->SetListName(strName.GetBuffer());
srvexisting->SetIsStaticMember(true);
srvexisting->SetPreference(priority);
if (theApp.emuledlg->serverwnd)
theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(srvexisting);
}
}
}
f.Close();
}
void CServerList::Process()
{
if (::GetTickCount() - m_nLastSaved > MIN2MS(17))
SaveServermetToFile();
}
//EastShare Start - added by AndCycle, IP to Country
void CServerList::ResetIP2Country(){
CServer *cur_server;
for(POSITION pos = list.GetHeadPosition(); pos != NULL; list.GetNext(pos)){
cur_server = list.GetAt(pos);
cur_server->ResetIP2Country();
}
}
//EastShare End - added by AndCycle, IP to Country
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -