⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverlist.cpp

📁 非常出名开源客户端下载的程序emule
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -