📄 serverlistctrl.cpp
字号:
try
{
// Remove any entry before writing to avoid duplicates
StaticServerFileRemove(server);
FILE* staticservers = _tfsopen(thePrefs.GetConfigDir() + _T("staticservers.dat"), _T("a"), _SH_DENYWR);
if (staticservers==NULL)
{
AddLogLine(false, GetResString(IDS_ERROR_SSF));
return false;
}
if (_ftprintf(staticservers,
_T("%s:%i,%i,%s\n"),
server->GetAddress(),
server->GetPort(),
server->GetPreferences(),
server->GetListName()) != EOF)
{
AddLogLine(false, _T("'%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 (...)
{
ASSERT(0);
return false;
}
return true;
}
bool CServerListCtrl::StaticServerFileRemove(const CServer *server)
{
try
{
if (!server->IsStaticMember())
return true;
CString strLine;
CString strTest;
TCHAR buffer[1024];
int lenBuf = 1024;
int pos;
CString StaticFilePath = thePrefs.GetConfigDir() + _T("staticservers.dat");
CString StaticTempPath = thePrefs.GetConfigDir() + _T("statictemp.dat");
FILE* staticservers = _tfsopen(StaticFilePath , _T("r"), _SH_DENYWR);
FILE* statictemp = _tfsopen(StaticTempPath , _T("w"), _SH_DENYWR);
if ((staticservers == NULL) || (statictemp == NULL))
{
if (staticservers)
fclose(staticservers);
if (statictemp)
fclose(statictemp);
AddLogLine( false, GetResString(IDS_ERROR_SSF));
return false;
}
while (!feof(staticservers))
{
if (_fgetts(buffer, lenBuf, staticservers) == 0)
break;
strLine = buffer;
// ignore comments or invalid lines
if (strLine.GetAt(0) == _T('#') || strLine.GetAt(0) == _T('/'))
continue;
if (strLine.GetLength() < 5)
continue;
// Only interested in "host:port"
pos = strLine.Find(_T(','));
if (pos == -1)
continue;
strLine = strLine.Left(pos);
// Get host and port from given server
strTest.Format(_T("%s:%i"), server->GetAddress(), server->GetPort());
// Compare, if not the same server write original line to temp file
if (strLine.Compare(strTest) != 0)
_ftprintf(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 (...)
{
ASSERT(0);
return false;
}
return true;
}
void CServerListCtrl::ShowServerCount()
{
CString counter;
counter.Format(_T(" (%i)"), GetItemCount());
theApp.emuledlg->serverwnd->GetDlgItem(IDC_SERVLIST_TEXT)->SetWindowText(GetResString(IDS_SV_SERVERLIST)+counter );
}
void CServerListCtrl::OnLvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMLVGETINFOTIP>(pNMHDR);
if (pGetInfoTip->iSubItem == 0)
{
LVHITTESTINFO hti = {0};
::GetCursorPos(&hti.pt);
ScreenToClient(&hti.pt);
bool bOverMainItem = (SubItemHitTest(&hti) != -1 && hti.iItem == pGetInfoTip->iItem && hti.iSubItem == 0);
// those tooltips are very nice for debugging/testing but pretty annoying for general usage
// enable tooltips only if Shift+Ctrl is currently pressed
bool bShowInfoTip = GetSelectedCount() > 1 || ((GetKeyState(VK_SHIFT) & 0x8000) && (GetKeyState(VK_CONTROL) & 0x8000));
if (!bShowInfoTip){
if (!bOverMainItem){
// don' show the default label tip for the main item, if the mouse is not over the main item
if ((pGetInfoTip->dwFlags & LVGIT_UNFOLDED) == 0 && pGetInfoTip->cchTextMax > 0 && pGetInfoTip->pszText[0] != '\0')
pGetInfoTip->pszText[0] = '\0';
}
return;
}
if (GetSelectedCount() == 1)
{
;
}
else
{
int iSelected = 0;
ULONGLONG ulTotalUsers = 0;
ULONGLONG ulTotalLowIdUsers = 0;
ULONGLONG ulTotalFiles = 0;
POSITION pos = GetFirstSelectedItemPosition();
while (pos)
{
const CServer* pServer = (CServer*)GetItemData(GetNextSelectedItem(pos));
if (pServer)
{
iSelected++;
ulTotalUsers += pServer->GetUsers();
ulTotalFiles += pServer->GetFiles();
ulTotalLowIdUsers += pServer->GetLowIDUsers();
}
}
if (iSelected > 0)
{
CString strInfo;
strInfo.Format(_T("%s: %u\r\n%s: %s\r\n%s: %s\r\n%s: %s"),
GetResString(IDS_FSTAT_SERVERS), iSelected,
GetResString(IDS_UUSERS), CastItoIShort(ulTotalUsers),
GetResString(IDS_IDLOW), CastItoIShort(ulTotalLowIdUsers),
GetResString(IDS_PW_FILES), CastItoIShort(ulTotalFiles));
_tcsncpy(pGetInfoTip->pszText, strInfo, pGetInfoTip->cchTextMax);
pGetInfoTip->pszText[pGetInfoTip->cchTextMax-1] = _T('\0');
}
}
}
*pResult = 0;
}
//SLAHAM: ADDED Advanced Serverfilter <=
//cyrex2001 ==>show flag on server window
#define DLC_DT_TEXT (DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX|DT_END_ELLIPSIS)
//KTS+ FlagServer
void CServerListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//theApp.AddDebugLogLine(false,"Drawitem");
if( !theApp.emuledlg->IsRunning() )
return;
if (!lpDrawItemStruct->itemData)
return;
CDC* odc = CDC::FromHandle(lpDrawItemStruct->hDC);
BOOL bCtrlFocused = ((GetFocus() == this ) || (GetStyle() & LVS_SHOWSELALWAYS));
if( (lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED )){
if(bCtrlFocused)
odc->SetBkColor(m_crHighlight);
else
odc->SetBkColor(m_crNoHighlight);
}
else
odc->SetBkColor(GetBkColor());
const CServer* server = (CServer*)lpDrawItemStruct->itemData;
CMemDC dc(CDC::FromHandle(lpDrawItemStruct->hDC), &lpDrawItemStruct->rcItem);
CFont* pOldFont = dc.SelectObject(GetFont());
RECT cur_rec = lpDrawItemStruct->rcItem;
COLORREF crOldTextColor = dc.SetTextColor(m_crWindowText);
int iOldBkMode;
if (m_crWindowTextBk == CLR_NONE){
DefWindowProc(WM_ERASEBKGND, (WPARAM)(HDC)dc, 0);
iOldBkMode = dc.SetBkMode(TRANSPARENT);
}
else
iOldBkMode = OPAQUE;
CString Sbuffer;
CHeaderCtrl *pHeaderCtrl = GetHeaderCtrl();
int iCount = pHeaderCtrl->GetItemCount();
cur_rec.right = cur_rec.left - 8;
cur_rec.left += 4;
for(int iCurrent = 0; iCurrent < iCount; iCurrent++){
int iColumn = pHeaderCtrl->OrderToIndex(iCurrent);
if( !IsColumnHidden(iColumn) ){
cur_rec.right += GetColumnWidth(iColumn);
switch(iColumn){
case 0:{
uint8 image;
image = 0;
POINT point = {cur_rec.left, cur_rec.top+1};//check
//imagelist.Draw(dc,image, point, ILD_NORMAL | ((client->Credits() && client->Credits()->GetCurrentIdentState(client->GetIP()) == IS_IDENTIFIED) ? INDEXTOOVERLAYMASK(1) : 0));
Sbuffer = server->GetListName();
//Iberica,, IP to Country
CString tempStr;
tempStr.Format("%s%s", server->GetCountryName(), Sbuffer);
Sbuffer = tempStr;
if(theApp.ip2country->ShowCountryFlag()){
POINT point2= {cur_rec.left,cur_rec.top+1};
theApp.ip2country->GetFlagImageList()->DrawIndirect(dc, server->GetCountryFlagIndex(), point2, CSize(18,16), CPoint(0,0), ILD_NORMAL);
}
//EastShare End - IP to Country
cur_rec.left +=20;
dc->DrawText(Sbuffer,Sbuffer.GetLength(),&cur_rec,DLC_DT_TEXT);
cur_rec.left -=20;
//Iberica,, IP to Country
//if(theApp.ip2country->ShowCountryFlag()){
// cur_rec.left-=20;
//}
//EastShare End - IP to Country
break;
}
case 1:{
//if (server->GetConnPort() != server->GetPort())
// Sbuffer.Format(_T("%s : %i/%i"), server->GetAddress(), server->GetPort(), server->GetConnPort());
//else
Sbuffer.Format(_T("%s : %i"), server->GetAddress(), server->GetPort());
break;
}
case 2:{
Sbuffer = server->GetDescription();
break;
}
case 3:{
if(server->GetPing())
Sbuffer.Format(_T("%i"), server->GetPing());
else
Sbuffer = "";
break;
}
case 4:{
if(server->GetUsers())
Sbuffer.Format(_T("%i"), server->GetUsers());
else
Sbuffer = "";
break;
}
case 5:{
if(server->GetMaxUsers())
Sbuffer.Format(_T("%i"), server->GetMaxUsers());
else
Sbuffer = "";
break;
}
case 6:{
if(server->GetFiles())
Sbuffer.Format(_T("%i"), server->GetFiles());
else
Sbuffer = "";
break;
}
case 7:{
switch(server->GetPreferences()){
case SRV_PR_LOW:
Sbuffer = GetResString(IDS_PRIOLOW);
break;
case SRV_PR_NORMAL:
Sbuffer = GetResString(IDS_PRIONORMAL);
break;
case SRV_PR_HIGH:
Sbuffer = GetResString(IDS_PRIOHIGH);
break;
default:
Sbuffer = GetResString(IDS_PRIONOPREF);
}
break;
}
case 8:{
Sbuffer.Format(_T("%i"), server->GetFailedCount());
break;
}
case 9:{
if (server->IsStaticMember())
Sbuffer = GetResString(IDS_YES);
else
Sbuffer = GetResString(IDS_NO);
break;
}
case 10:{
if(server->GetSoftFiles())
Sbuffer.Format(_T("%i"), server->GetSoftFiles());
else
Sbuffer = "";
break;
}
case 11:{
if(server->GetHardFiles())
Sbuffer.Format(_T("%i"), server->GetHardFiles());
else
Sbuffer = "";
break;
}
case 12:{
Sbuffer = server->GetVersion();
if (thePrefs.GetDebugServerUDPLevel() > 0){
if (server->GetUDPFlags() != 0){
if (!Sbuffer.IsEmpty())
Sbuffer += _T("; ");
Sbuffer.AppendFormat(_T("ExtUDP=%x"), server->GetUDPFlags());
}
}
if (thePrefs.GetDebugServerTCPLevel() > 0){
if (server->GetTCPFlags() != 0){
if (!Sbuffer.IsEmpty())
Sbuffer += _T("; ");
Sbuffer.AppendFormat(_T("ExtTCP=%x"), server->GetTCPFlags());
}
}
break;
}
case 13:{
//if(server->GetConnPort() != server->GetPort())
// Sbuffer.Format(_T("%i"), server->GetConnPort());
//else
Sbuffer = "";
break;
}
}
if(iColumn != 0 )
dc->DrawText(Sbuffer,Sbuffer.GetLength(),&cur_rec, DT_LEFT);
cur_rec.left += GetColumnWidth(iColumn);
}
}
//draw rectangle around selected item(s)
if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED))
{
RECT outline_rec = lpDrawItemStruct->rcItem;
outline_rec.top--;
outline_rec.bottom++;
dc->FrameRect(&outline_rec, &CBrush(GetBkColor()));
outline_rec.top++;
outline_rec.bottom--;
outline_rec.left++;
outline_rec.right--;
if(bCtrlFocused)
dc->FrameRect(&outline_rec, &CBrush(m_crFocusLine));
else
dc->FrameRect(&outline_rec, &CBrush(m_crNoFocusLine));
}
if (m_crWindowTextBk == CLR_NONE)
dc.SetBkMode(iOldBkMode);
dc.SelectObject(pOldFont);
dc.SetTextColor(crOldTextColor);
}
//KTS- FlagServer
//cyrex2001 <==show flag on server window
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -