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

📄 serverlistctrl.cpp

📁 非常出名开源客户端下载的程序emule
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				break;
			}
			case MP_PRIOLOW:
			{
				POSITION pos = this->GetFirstSelectedItemPosition();
				while( pos != NULL ){
					CServer* change = (CServer*)this->GetItemData(this->GetNextSelectedItem(pos));
					change->SetPreference( SRV_PR_LOW);
//					if (change->IsStaticMember())
//						StaticServerFileAppend(change); //Why are you adding to static when changing prioity? If I want it static I set it static.. I set server to LOW because I HATE this server, not because I like it!!!
					theApp.emuledlg->serverwnd.serverlistctrl.RefreshServer(change);
					POSITION pos = this->GetFirstSelectedItemPosition();
				}
				break;
			}
			case MP_PRIONORMAL:
			{
				POSITION pos = this->GetFirstSelectedItemPosition();
				while( pos != NULL ){
					CServer* change = (CServer*)this->GetItemData(this->GetNextSelectedItem(pos));
					change->SetPreference( SRV_PR_NORMAL );
//					if (change->IsStaticMember())
//						StaticServerFileAppend(change);
					theApp.emuledlg->serverwnd.serverlistctrl.RefreshServer(change);
					POSITION pos = this->GetFirstSelectedItemPosition();
				}
				break;
			}
			case MP_PRIOHIGH:
			{
				POSITION pos = this->GetFirstSelectedItemPosition();
				while( pos != NULL ){
					CServer* change = (CServer*)this->GetItemData(this->GetNextSelectedItem(pos));
					change->SetPreference( SRV_PR_HIGH );
//					if (change->IsStaticMember())
//						StaticServerFileAppend(change);
					theApp.emuledlg->serverwnd.serverlistctrl.RefreshServer(change);
					POSITION pos = this->GetFirstSelectedItemPosition();
				}
				break;
			}
			case MP_GETED2KLINK: 
			{ 
				POSITION pos = this->GetFirstSelectedItemPosition(); 
				CString buffer, link; 
				while( pos != NULL ){ 
					CServer* change = (CServer*)this->GetItemData(this->GetNextSelectedItem(pos)); 
					buffer.Format("ed2k://|server|%s|%d|/", change->GetFullIP(), change->GetPort()); 
					if (link.GetLength()>0) buffer="\n"+buffer;
					link += buffer; 
					POSITION pos = this->GetFirstSelectedItemPosition(); 
				} 
				theApp.CopyTextToClipboard(link); 
				break; 
			}
			case Irc_SetSendLink:
			{
				POSITION pos = this->GetFirstSelectedItemPosition(); 
				CString buffer, link; 
				while( pos != NULL ){ 
					CServer* change = (CServer*)this->GetItemData(this->GetNextSelectedItem(pos)); 
					buffer.Format("ed2k://|server|%s|%d|/", change->GetFullIP(), change->GetPort()); 
					if (link.GetLength()>0) buffer="\n"+buffer;
					link += buffer; 
					POSITION pos = this->GetFirstSelectedItemPosition(); 
				} 
				theApp.emuledlg->ircwnd.SetSendFileString(link);
				break;
			}

         } 
      } 
   } 
   return true; 
}
void CServerListCtrl::OnNMLdblclk(NMHDR *pNMHDR, LRESULT *pResult){ // mod bb 27.09.02
	if (GetSelectionMark() != (-1)) {
		theApp.serverconnect->ConnectToServer((CServer*)GetItemData(GetSelectionMark())); 
	   theApp.emuledlg->ShowConnectionState(false);
	}
}

bool CServerListCtrl::AddServermetToList(CString strFile) 
{ 
   SetRedraw(false);
   bool flag=server_list->AddServermetToList(strFile);
   RemoveDeadServer();
   ShowFilesCount();
   SetRedraw(true);
   return flag;
}

void CServerListCtrl::OnColumnClick(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
   NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 

	// Barry - Store sort order in preferences
	// Determine ascending based on whether already sorted on this column
	int sortItem = theApp.glob_prefs->GetColumnSortItem(CPreferences::tableServer);
	bool m_oldSortAscending = theApp.glob_prefs->GetColumnSortAscending(CPreferences::tableServer);
	bool sortAscending = (sortItem != pNMListView->iSubItem) ? true : !m_oldSortAscending;

	// Item is column clicked
	sortItem = pNMListView->iSubItem;

	// Save new preferences
	theApp.glob_prefs->SetColumnSortItem(CPreferences::tableServer, sortItem);
	theApp.glob_prefs->SetColumnSortAscending(CPreferences::tableServer, sortAscending);

	// Sort table
	SetSortArrow(sortItem, sortAscending);
	SortItems(SortProc, sortItem + (sortAscending ? 0:100));

   this->Invalidate(); 
   *pResult = 0; 
} 


int CServerListCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort){ 
   CServer* item1 = (CServer*)lParam1; 
   CServer* item2 = (CServer*)lParam2; 
   if((item1 == NULL) || (item2 == NULL)) return 0; 
   int iTemp=0; 
   int counter1; 
   int counter2; 
    
   switch(lParamSort){ 
      case 0: //(List) Server-name asc
		  return CString(item1->GetListName()).CompareNoCase(item2->GetListName());
      case 100: //(List) Server-name desc 
		  return CString(item2->GetListName()).CompareNoCase(item1->GetListName());
      case 1:{ //IP asc
		  if( item1->HasDynIP() && item2->HasDynIP() )
			  return CString(item1->GetDynIP()).CompareNoCase(item2->GetDynIP());
		  else if( item1->HasDynIP() == true && item2->HasDynIP() == true )
			  return 0;
		  else if( item1->HasDynIP() )
			  return 1;
		  else if( item2->HasDynIP() )
			  return 0;
		  else{
			  CString sIP1, sIP2, sTemp1, sTemp2; 
			  counter1 = counter2 = iTemp = 0; 
			  sIP1 = item2->GetFullIP(); 
			  sIP2 = item1->GetFullIP(); 
			  for(int i=0; iTemp == 0 ; i++){ 
				  sTemp1 = sIP1.Tokenize(".",counter1); 
				  sTemp2 = sIP2.Tokenize(".",counter2); 
				  iTemp = atoi(sTemp2) - atoi(sTemp1); 
				  if(i>2){ 
					  return item1->GetPort() - item2->GetPort(); 
				  } 
			  } 
			  return iTemp; 
		  }
			 }
      case 101:{ //IP desc 
		  if( item1->HasDynIP() && item2->HasDynIP() )
			  return CString(item2->GetDynIP()).CompareNoCase(item1->GetDynIP());
		  else if( item1->HasDynIP() == true && item2->HasDynIP() == true )
			  return 0;
		  else if( item1->HasDynIP() )
			  return 0;
		  else if( item2->HasDynIP() )
			  return 1;
		  else{
			  CString s2IP1, s2IP2, s2Temp1, s2Temp2; 
			  counter1 = counter2 = iTemp = 0; 
			  s2IP1 = item2->GetFullIP(); 
			  s2IP2 = item1->GetFullIP(); 
			  for(int i=0; iTemp == 0 ; i++){ 
				  s2Temp1 = s2IP1.Tokenize(".",counter1);
				  s2Temp2 = s2IP2.Tokenize(".",counter2); 
				  iTemp = atoi(s2Temp1) - atoi(s2Temp2); 
				  if(i>2){
					  return item2->GetPort() - item1->GetPort(); 
				  } 
			  }
			  return iTemp; 
		  }
			  }
      case 2: //Description asc 
         if((item1->GetDescription() != NULL) && (item2->GetDescription() != NULL)) 
            //the 'if' is necessary, because the Description-String is not 
            //always initialisized in server.cpp 
			return CString(item2->GetDescription()).CompareNoCase(item1->GetDescription());
		 else if( item1->GetDescription() == item2->GetDescription() )
			 return 0;
		 else if( item1->GetDescription() == NULL )
			 return 1;
		 else
			 return 0;
      case 102: //Desciption desc 
         if((item1->GetDescription() != NULL) && (item2->GetDescription() != NULL))
			return CString(item1->GetDescription()).CompareNoCase(item2->GetDescription());
		 else if( item1->GetDescription() == item2->GetDescription() )
			 return 0;
		 else if( item1->GetDescription() == NULL )
			 return 1;
		 else
			 return 0;
      case 3: //Ping asc
		  if(item1->GetPing() == item2->GetPing())
			  return 0;
		  if(!item1->GetPing())
			  return 1;
		  if(!item2->GetPing())
			  return -1;
         return item1->GetPing() - item2->GetPing(); 
      case 103: //Ping desc 
		  if(item1->GetPing() == item2->GetPing())
			  return 0;
		  if(!item1->GetPing())
			  return 1;
		  if(!item2->GetPing())
			  return -1;
         return item2->GetPing() - item1->GetPing(); 
      case 4: //Users asc 
		  if(item1->GetUsers() == item2->GetUsers())
			  return 0;
		  if(!item1->GetUsers())
			  return 1;
		  if(!item2->GetUsers())
			  return -1;
         return item1->GetUsers() - item2->GetUsers(); 
      case 104: //Users desc 
		  if(item1->GetUsers() == item2->GetUsers())
			  return 0;
		  if(!item1->GetUsers())
			  return 1;
		  if(!item2->GetUsers())
			  return -1;
         return item2->GetUsers() - item1->GetUsers(); 
      case 5: //Users asc 
		  if(item1->GetMaxUsers() == item2->GetMaxUsers())
			  return 0;
		  if(!item1->GetMaxUsers())
			  return 1;
		  if(!item2->GetMaxUsers())
			  return -1;
         return item1->GetMaxUsers() - item2->GetMaxUsers(); 
      case 105: //Users desc 
		  if(item1->GetMaxUsers() == item2->GetMaxUsers())
			  return 0;
		  if(!item1->GetMaxUsers())
			  return 1;
		  if(!item2->GetMaxUsers())
			  return -1;
         return item2->GetMaxUsers() - item1->GetMaxUsers(); 
      case 6: //Files asc 
		  if(item1->GetFiles() == item2->GetFiles())
			  return 0;
		  if(!item1->GetFiles())
			  return 1;
		  if(!item2->GetFiles())
			  return -1;
         return item1->GetFiles() - item2->GetFiles(); 
      case 106: //Files desc 
		  if(item1->GetFiles() == item2->GetFiles())
			  return 0;
		  if(!item1->GetFiles())
			  return 1;
		  if(!item2->GetFiles())
			  return -1;
         return item2->GetFiles() - item1->GetFiles(); 
      case 7: //Preferences asc 
		  if( item2->GetPreferences() == item1->GetPreferences() )
			  return 0;
		  if( item2->GetPreferences() == SRV_PR_LOW )
			  return 1;
		  else if ( item1->GetPreferences() == SRV_PR_LOW )
			  return -1;
		  if( item2->GetPreferences() == SRV_PR_HIGH )
			  return -1;
		  else if ( item1->GetPreferences() == SRV_PR_HIGH )
			  return 1;
      case 107: //Preferences desc 
		  if( item2->GetPreferences() == item1->GetPreferences() )
			  return 0;
		  if( item2->GetPreferences() == SRV_PR_LOW )
			  return -1;
		  else if ( item1->GetPreferences() == SRV_PR_LOW )
			  return 1;
		  if( item2->GetPreferences() == SRV_PR_HIGH )
			  return 1;
		  else if ( item1->GetPreferences() == SRV_PR_HIGH )
			  return -1;
      case 8: //failed asc 
         return item1->GetFailedCount() - item2->GetFailedCount(); 
      case 108: //failed desc 
		  return item2->GetFailedCount() - item1->GetFailedCount(); 
      case 9: //staticservers 
		  return item2->IsStaticMember() - item1->IsStaticMember(); 
      case 109: //staticservers-
		  return item1->IsStaticMember() - item2->IsStaticMember(); 
      default: 
         return 0; 
   } 
}

bool CServerListCtrl::StaticServerFileAppend(CServer *server)
{
	try
	{
		// Remove any entry before writing to avoid duplicates
		StaticServerFileRemove(server);

		FILE* staticservers = fopen(theApp.glob_prefs->GetAppDir() + CString("staticservers.dat"), "a");
		if (staticservers==NULL) 
		{
			theApp.emuledlg->AddLogLine( false, GetResString(IDS_ERROR_SSF));
			return false;
		}
		
		if (fprintf(staticservers,
					"%s:%i,%i,%s\n",
					server->GetAddress(),
					server->GetPort(), 
					server->GetPreferences(),
					server->GetListName()) != EOF) 
		{
			theApp.emuledlg->AddLogLine(false, "'%s:%i,%s' %s", server->GetAddress(), server->GetPort(), server->GetListName(), GetResString(IDS_ADDED2SSF));
			server->SetIsStaticMember(true);
			theApp.emuledlg->serverwnd.serverlistctrl.RefreshServer(server);
		}

		fclose(staticservers);
	}
	catch (...)
	{
		return false;
	}
	return true;
}

bool CServerListCtrl::StaticServerFileRemove(CServer *server)
{
	try
	{
		if (!server->IsStaticMember())
			return true;

		CString strLine;
		CString strTest;
		char buffer[1024];
		int lenBuf = 1024;
		int pos;
		CString StaticFilePath = theApp.glob_prefs->GetAppDir() + CString("staticservers.dat");
		CString StaticTempPath = theApp.glob_prefs->GetAppDir() + CString("statictemp.dat");
		FILE* staticservers = fopen(StaticFilePath , "r");
		FILE* statictemp = fopen(StaticTempPath , "w");

		if ((staticservers == NULL) || (statictemp == NULL))
		{
			theApp.emuledlg->AddLogLine( false, GetResString(IDS_ERROR_SSF));
			return false;
		}

		while (!feof(staticservers))
		{
			if (fgets(buffer, lenBuf, staticservers) == 0)
				break;

			strLine = buffer;

			// ignore comments or invalid lines
			if (strLine.GetAt(0) == '#' || strLine.GetAt(0) == '/')
				continue;
			if (strLine.GetLength() < 5)
				continue;

			// Only interested in "host:port"
			pos = strLine.Find(',');
			if (pos == -1)
				continue;
			strLine = strLine.Left(pos);

			// Get host and port from given server
			strTest.Format("%s:%i", server->GetAddress(), server->GetPort());

			// Compare, if not the same server write original line to temp file
			if (strLine.Compare(strTest) != 0)
				fprintf(statictemp, buffer);
		}

		fclose(staticservers);
		fclose(statictemp);

		// All ok, remove the existing file and replace with the new one
		CFile::Remove( StaticFilePath );
		CFile::Rename( StaticTempPath, StaticFilePath );
	}
	catch (...)
	{
		return false;
	}
	return true;
}

void CServerListCtrl::ShowFilesCount() {
	CString counter;

	counter.Format(" (%i)", GetItemCount());
	theApp.emuledlg->serverwnd.GetDlgItem(IDC_SERVLIST_TEXT)->SetWindowText(GetResString(IDS_SV_SERVERLIST)+counter  );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -