📄 servicesdlg.cpp
字号:
{
int packetID = buf.ReadByte();
if ( packetID == VMPI_PING_RESPONSE )
{
int iState = buf.ReadByte();
unsigned long liveTimeMS = (unsigned long)buf.ReadLong();
int iPort = buf.ReadLong();
char computerName[512];
buf.ReadString( computerName, sizeof( computerName ) );
char masterName[512];
if ( buf.GetNumBitsLeft() )
buf.ReadString( masterName, sizeof( masterName ) );
else
masterName[0] = 0;
CServiceInfo *pInfo = FindServiceByComputerName( computerName );
if ( !pInfo )
{
pInfo = new CServiceInfo;
m_Services.AddToTail( pInfo );
pInfo->m_ComputerName = computerName;
pInfo->m_pLastStatusText = NULL;
pInfo->m_Addr = ipFrom;
pInfo->m_Addr.port = iPort;
pInfo->m_LastPingTimeMS = Plat_MSTime();
pInfo->m_MasterName = "?";
int iItem = m_ServicesList.InsertItem( COLUMN_COMPUTER_NAME, pInfo->m_ComputerName, NULL );
m_ServicesList.SetItemData( iItem, (DWORD)pInfo );
// Update the display of # of services.
m_nServices++;
UpdateServiceCountDisplay();
}
pInfo->m_MasterName = masterName;
pInfo->m_LiveTimeMS = liveTimeMS;
pInfo->m_iState = iState;
pInfo->m_LastPingTimeMS = Plat_MSTime();
UpdateServiceInListbox( pInfo );
}
}
}
FOR_EACH_LL( m_Services, iService )
{
CServiceInfo *pInfo = m_Services[iService];
if ( Plat_MSTime() - pInfo->m_LastUpdateTime > SERVICE_MAX_UPDATE_INTERVAL )
{
UpdateServiceInListbox( pInfo );
}
}
if ( m_bListChanged )
{
ResortItems();
m_bListChanged = false;
}
}
CServiceInfo* CServicesDlg::FindServiceByComputerName( const char *pComputerName )
{
FOR_EACH_LL( m_Services, i )
{
if ( Q_stricmp( m_Services[i]->m_ComputerName, pComputerName ) == 0 )
return m_Services[i];
}
return NULL;
}
void CServicesDlg::SendToSelectedServices( const char *pData, int len )
{
POSITION pos = m_ServicesList.GetFirstSelectedItemPosition();
while ( pos )
{
int iItem = m_ServicesList.GetNextSelectedItem( pos );
CServiceInfo *pInfo = (CServiceInfo*)m_ServicesList.GetItemData( iItem );
m_pServicesPingSocket->SendTo( &pInfo->m_Addr, pData, len );
}
}
void CServicesDlg::UpdateServiceInListbox( CServiceInfo *pInfo )
{
// First, find this item in the listbox.
LVFINDINFO info;
info.flags = LVFI_PARAM;
info.lParam = (LPARAM)pInfo;
int iItem = m_ServicesList.FindItem( &info );
if ( iItem != -1 )
{
m_ServicesList.SetItemText( iItem, COLUMN_COMPUTER_NAME, pInfo->m_ComputerName );
const char *pText = GetStatusString( pInfo );
m_ServicesList.SetItemText( iItem, COLUMN_STATUS, pText );
char timeStr[512];
FormatTimeString( pInfo->m_LiveTimeMS / 1000, timeStr, sizeof( timeStr ) );
m_ServicesList.SetItemText( iItem, COLUMN_RUNNING_TIME, timeStr );
m_ServicesList.SetItemText( iItem, COLUMN_MASTER_NAME, pInfo->m_MasterName );
// Detect changes.
if ( pText != pInfo->m_pLastStatusText ||
pInfo->m_LiveTimeMS != pInfo->m_LastLiveTimeMS ||
pInfo->m_MasterName != pInfo->m_LastMasterName )
{
m_bListChanged = true;
}
pInfo->m_pLastStatusText = pText;
pInfo->m_LastLiveTimeMS = pInfo->m_LiveTimeMS;
pInfo->m_LastMasterName = pInfo->m_MasterName;
pInfo->m_LastUpdateTime = Plat_MSTime();
}
}
void CServicesDlg::ResortItems()
{
m_ServicesList.SortItems( g_ColumnInfos[g_iSortColumn].sortFn, (LPARAM)this );
}
void CServicesDlg::UpdateServiceCountDisplay()
{
CString str;
str.Format( "%d", m_nServices );
m_NumServicesControl.SetWindowText( str );
}
void CServicesDlg::OnPatchServices()
{
CUtlVector<char> data;
// Inquire about the timeout.
CPatchTimeout dlg;
dlg.m_Timeout = 30;
if ( dlg.DoModal() == IDOK )
{
BuildVMPIPingPacket( data, VMPI_SERVICE_PATCH );
data.AddMultipleToTail( sizeof( dlg.m_Timeout ), (char*)&dlg.m_Timeout );
SendToSelectedServices( data.Base(), data.Count() );
}
}
void CServicesDlg::OnStopServices()
{
if ( MessageBox( "Warning: if you stop these services, you won't be able to control them from this application, and must restart them manually. Contine?", "Warning", MB_YESNO ) == IDYES )
{
CUtlVector<char> data;
BuildVMPIPingPacket( data, VMPI_STOP_SERVICE );
SendToSelectedServices( data.Base(), data.Count() );
}
}
void CServicesDlg::OnStopJobs()
{
CUtlVector<char> data;
BuildVMPIPingPacket( data, VMPI_KILL_PROCESS );
SendToSelectedServices( data.Base(), data.Count() );
}
void CServicesDlg::OnChangePassword()
{
CSetPasswordDlg dlg;
dlg.m_Password = m_Password;
if ( dlg.DoModal() == IDOK )
{
m_Password = dlg.m_Password;
m_PasswordDisplay.SetWindowText( m_Password );
m_Services.PurgeAndDeleteElements();
m_ServicesList.DeleteAllItems();
m_nServices = 0;
UpdateServiceCountDisplay();
// Re-ping everyone immediately.
m_dwLastServicesPing = GetTickCount() - SERVICES_PING_INTERVAL;
}
}
void CServicesDlg::OnDblclkServicesList(NMHDR* pNMHDR, LRESULT* pResult)
{
POSITION pos = m_ServicesList.GetFirstSelectedItemPosition();
if ( pos )
{
int iItem = m_ServicesList.GetNextSelectedItem( pos );
if ( iItem != -1 )
{
CServiceInfo *pInfo = (CServiceInfo*)m_ServicesList.GetItemData( iItem );
if ( pInfo )
{
// Launch vmpi_browser_job_search and have it auto-select this worker.
CString cmdLine;
cmdLine.Format( "vmpi_browser_job_search -SelectWorker %s", pInfo->m_ComputerName );
STARTUPINFO si;
memset( &si, 0, sizeof( si ) );
si.cb = sizeof( si );
PROCESS_INFORMATION pi;
memset( &pi, 0, sizeof( pi ) );
if ( !CreateProcess(
NULL,
(char*)(const char*)cmdLine,
NULL, // security
NULL,
TRUE,
0, // flags
NULL, // environment
NULL, // current directory
&si,
&pi ) )
{
CString err;
err.Format( "Can't run '%s'", (LPCTSTR)cmdLine );
MessageBox( err, "Error", MB_OK );
}
}
}
}
*pResult = 0;
}
void CServicesDlg::OnSize(UINT nType, int cx, int cy)
{
CIdleDialog::OnSize(nType, cx, cy);
m_AnchorMgr.UpdateAnchors( this );
}
BOOL CServicesDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR *pHdr = (NMHDR*)lParam;
if ( pHdr->idFrom == IDC_SERVICES_LIST )
{
if ( pHdr->code == LVN_COLUMNCLICK )
{
LPNMLISTVIEW pListView = (LPNMLISTVIEW)lParam;
// Now sort by this column.
g_iSortColumn = max( 0, min( pListView->iSubItem, ARRAYSIZE( g_ColumnInfos ) - 1 ) );
ResortItems();
}
}
return CIdleDialog::OnNotify(wParam, lParam, pResult);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -