📄 serverlist.cpp
字号:
if (udp_timer)
KillTimer(0,udp_timer);
}
void CServerList::MoveServerDown(CServer* aServer){
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==aServer){
list.AddTail(cur_server);
list.RemoveAt(pos2);
return;
}
i++;
if (i == list.GetCount())
break;
}
}
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(){
CServer* nextserver = 0;
uint32 i = 0;
if (serverpos>=((uint32)list.GetCount()) ) return 0;
while (!nextserver && i != 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; //<<--9/27/02 zg
}
nextserver = list.GetAt(posIndex);
serverpos++;
i++;
// TODO: Add more option to filter bad server like min ping, min users etc
//if (nextserver->preferences = ?)
// nextserver = 0;
//if (serverpos == list.GetCount()) return 0;// serverpos = 0;
}
return nextserver;
}
CServer* CServerList::GetNextSearchServer(){
CServer* nextserver = 0;
uint32 i = 0;
while (!nextserver && i != 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 = 0;
uint32 i = 0;
while (!nextserver && i != 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;
}
bool CServerList::BroadCastPacket(Packet* packet){ // unused atm . but might be useful later
if (udp_timer)
return false;
udp_timer = SetTimer(0,4322,UDPSEARCHSPEED,CServerList::UDPTimerProc);
broadcastpos = list.GetHeadPosition();
broadcastpacket = packet;
return true;
}
void CServerList::SendNextPacket(){
if (theApp.listensocket->TooManySockets()){
KillTimer(0,udp_timer);
udp_timer = 0;
delete broadcastpacket;
return;
}
if (broadcastpos != 0){
CServer* cur_server = list.GetAt(broadcastpos);
if (cur_server != theApp.serverconnect->GetCurrentServer())
theApp.serverconnect->SendUDPPacket(broadcastpacket,cur_server,false);
list.GetNext(broadcastpos);
}
else{
KillTimer(0,udp_timer);
udp_timer = 0;
delete broadcastpacket;
}
}
void CServerList::CancelUDPBroadcast(){
if (udp_timer){
KillTimer(0,udp_timer);
udp_timer = 0;
delete broadcastpacket;
}
}
void CALLBACK CServerList::UDPTimerProc(HWND hwnd, UINT uMsg,UINT_PTR idEvent,DWORD dwTime){
theApp.serverlist->SendNextPacket();
}
CServer* CServerList::GetNextServer(CServer* lastserver){
if (list.IsEmpty())
return 0;
if (!lastserver) return list.GetHead();
POSITION pos = list.Find(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(char* address, uint16 port){
for (POSITION pos = list.GetHeadPosition();pos != 0;list.GetNext(pos)){
CServer *s = list.GetAt(pos); // i_a: small speed optimization
if (( port == s->GetPort() || port==0) && !strcmp(s->GetAddress(),address))
return s;
}
return NULL;
}
bool CServerList::SaveServermetToFile(){
m_nLastSaved = ::GetTickCount();
char* newservermet = new char[strlen(app_prefs->GetAppDir())+MAX_PATH];
sprintf(newservermet,"%sserver.met.new",app_prefs->GetAppDir());
// theApp.emuledlg->AddLogLine( false, "%s", newservermet );
try{
FILE* servermet = fopen(newservermet, "wb");
if (!servermet){
theApp.emuledlg->AddLogLine(false,GetResString(IDS_ERR_SAVESERVERMET));
delete[] newservermet; //mf
return false;
}
version = 0xE0;
fwrite( &version, 1, 1, servermet);
uint32 fservercount = list.GetCount();
fwrite(&fservercount,4,1,servermet);
ServerMet_Struct sbuffer;
CServer* nextserver;
for (uint32 j = 0;j != fservercount;j++){
nextserver = this->GetServerAt(j);
sbuffer.ip = nextserver->GetIP();
sbuffer.port = nextserver->GetPort();
uint16 tagcount = 7;
if (nextserver->GetListName())
tagcount++;
if (nextserver->GetDynIP())
tagcount++;
if (nextserver->GetDescription())
tagcount++;
sbuffer.tagcount = tagcount;
fwrite( &sbuffer, 1, sizeof(ServerMet_Struct),servermet);
if( nextserver->GetListName() ){
CTag servername( ST_SERVERNAME, nextserver->GetListName() );
servername.WriteTagToFile(servermet);
}
if( nextserver->GetDynIP() ){
CTag serverdynip( ST_DYNIP, nextserver->GetDynIP() );
serverdynip.WriteTagToFile(servermet);
}
if( nextserver->GetDescription() ){
CTag serverdesc( ST_DESCRIPTION, nextserver->GetDescription() );
serverdesc.WriteTagToFile(servermet);
}
CTag serverfail(ST_FAIL, nextserver->GetFailedCount() );
serverfail.WriteTagToFile(servermet);
CTag serverpref( ST_PREFERENCE, nextserver->GetPreferences() );
serverpref.WriteTagToFile(servermet);
CTag serveruser("users", nextserver->GetUsers() );
serveruser.WriteTagToFile(servermet);
CTag serverfiles("files", nextserver->GetFiles() );
serverfiles.WriteTagToFile(servermet);
CTag serverping(ST_PING, nextserver->GetPing() );
serverping.WriteTagToFile(servermet);
CTag serverlastp(ST_LASTPING, nextserver->GetLastPinged() );
serverlastp.WriteTagToFile(servermet);
CTag servermaxusers(ST_MAXUSERS, nextserver->GetMaxUsers() );
servermaxusers.WriteTagToFile(servermet);
}
fclose(servermet);
char* curservermet = new char[strlen(app_prefs->GetAppDir())+20];
char* oldservermet = new char[strlen(app_prefs->GetAppDir())+20];
sprintf(curservermet,"%sserver.met",app_prefs->GetAppDir());
sprintf(oldservermet,"%sserver_met.old",app_prefs->GetAppDir());
remove(oldservermet);
rename(curservermet,oldservermet);
rename(newservermet,curservermet);
delete[] oldservermet;
delete[] curservermet;
}
catch(CFileException* error) {
OUTPUT_DEBUG_TRACE();
theApp.emuledlg->AddLogLine(false,GetResString(IDS_ERR_SAVESERVERMET2));
delete[] newservermet; //mf
error->Delete();
return false;
}
delete[] newservermet;
return true;
}
void CServerList::AddServersFromTextFile(CString strFilename) {
CString strLine;
CStdioFile f;
if (!f.Open(strFilename, CFile::modeRead | CFile::typeText))
return;
while(f.ReadString(strLine)) {
// format is host:port,priority,Name
if (strLine.GetLength() < 5)
continue;
if (strLine.GetAt(0) == '#' || strLine.GetAt(0) == '/')
continue;
// fetch host
int pos = strLine.Find(':');
if (pos == -1){
pos = strLine.Find(',');
if (pos == -1)
continue;
}
CString strHost = strLine.Left(pos);
strLine = strLine.Mid(pos+1);
// fetch port
pos = strLine.Find(',');
if (pos == -1)
continue;
CString strPort = strLine.Left(pos);
strLine = strLine.Mid(pos+1);
// Barry - fetch priority
pos = strLine.Find(',');
int priority = SRV_PR_HIGH;
if (pos == 1)
{
CString strPriority = strLine.Left(pos);
try
{
priority = atoi(strPriority.GetBuffer(0));
if ((priority < 0) || (priority > 2))
priority = SRV_PR_HIGH;
} catch (...) {}
strLine = strLine.Mid(pos+1);
}
// fetch name
CString strName = strLine;
strName.Replace("\r", "");
strName.Replace("\n", "");
// create server object and add it to the list
CServer* nsrv = new CServer(atoi(strPort), strHost.GetBuffer());
nsrv->SetListName(strName.GetBuffer());
nsrv->SetIsStaticMember(true);
// Barry - Was always high
nsrv->SetPreference(priority);
if (!theApp.emuledlg->serverwnd.serverlistctrl.AddServer(nsrv, true))
{
delete nsrv;
CServer* srvexisting = GetServerByAddress(strHost.GetBuffer(), atoi(strPort));
if (srvexisting) {
srvexisting->SetListName(strName.GetBuffer());
srvexisting->SetIsStaticMember(true);
// Barry - Was always high
srvexisting->SetPreference(priority);
if (theApp.emuledlg->serverwnd) theApp.emuledlg->serverwnd.serverlistctrl.RefreshServer(srvexisting);
}
}
}
f.Close();
}
void CServerList::Process()
{
if (::GetTickCount() - m_nLastSaved > 180000)
this->SaveServermetToFile();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -