📄 serverlistctrl.cpp
字号:
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 + -