336 lines
9.1 KiB
C
336 lines
9.1 KiB
C
|
|
||
|
//==========================================================================//
|
||
|
// Includes //
|
||
|
//==========================================================================//
|
||
|
|
||
|
#include "perfmon.h"
|
||
|
#include "utils.h"
|
||
|
#include "log.h"
|
||
|
#include "pmemory.h" // for MemoryXXX (malloc-like) routines
|
||
|
#include "perfdata.h"
|
||
|
#include "perfmops.h"
|
||
|
#include "system.h" // for SystemGet
|
||
|
#include "playback.h" // for PlayingBackLog & DataFromIndexPosition
|
||
|
#include "pmhelpid.h" // Help IDs
|
||
|
|
||
|
//==========================================================================//
|
||
|
// External Data //
|
||
|
//==========================================================================//
|
||
|
|
||
|
extern HWND hWndLogEntries ;
|
||
|
|
||
|
BOOL ComputerChange ;
|
||
|
static PPERFDATA pPerfData ;
|
||
|
|
||
|
|
||
|
//==========================================================================//
|
||
|
// Local Functions //
|
||
|
//==========================================================================//
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
/* static */
|
||
|
LogComputerChanged (
|
||
|
HDLG hDlg
|
||
|
)
|
||
|
{
|
||
|
PLOG pLog ;
|
||
|
HWND hWndObjects ;
|
||
|
PPERFSYSTEM pSysInfo;
|
||
|
DWORD iObjectType ;
|
||
|
DWORD iObjectNum ;
|
||
|
|
||
|
pLog = LogData (hDlg) ;
|
||
|
hWndObjects = DialogControl (hDlg, IDD_ADDLOGOBJECT) ;
|
||
|
|
||
|
if (!pPerfData) {
|
||
|
LBReset (hWndObjects) ;
|
||
|
return FALSE ;
|
||
|
}
|
||
|
|
||
|
SetHourglassCursor() ;
|
||
|
|
||
|
pSysInfo = GetComputer (hDlg,
|
||
|
IDD_ADDLOGCOMPUTER,
|
||
|
TRUE,
|
||
|
&pPerfData,
|
||
|
&pLog->pSystemFirst) ;
|
||
|
|
||
|
if (!pPerfData || !pSysInfo) {
|
||
|
LBReset (hWndObjects) ;
|
||
|
SetArrowCursor() ;
|
||
|
return FALSE ;
|
||
|
} else {
|
||
|
LBLoadObjects (hWndObjects,
|
||
|
pPerfData,
|
||
|
pSysInfo,
|
||
|
pLog->dwDetailLevel,
|
||
|
NULL,
|
||
|
FALSE) ;
|
||
|
|
||
|
iObjectNum = (DWORD) LBNumItems (hWndObjects) ;
|
||
|
for (iObjectType = 0 ;
|
||
|
iObjectType < iObjectNum ;
|
||
|
iObjectType++) { // for
|
||
|
LBSetSelection (hWndObjects, iObjectType) ;
|
||
|
} // for
|
||
|
|
||
|
}
|
||
|
|
||
|
ComputerChange = FALSE ;
|
||
|
|
||
|
SetArrowCursor() ;
|
||
|
|
||
|
return TRUE ;
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
/*static*/
|
||
|
OnLogDestroy (
|
||
|
HDLG hDlg
|
||
|
)
|
||
|
{
|
||
|
|
||
|
dwCurrentDlgID = 0 ;
|
||
|
|
||
|
if (!PlayingBackLog ())
|
||
|
MemoryFree ((LPMEMORY)pPerfData) ;
|
||
|
|
||
|
bAddLineInProgress = FALSE ;
|
||
|
}
|
||
|
|
||
|
|
||
|
//==========================================================================//
|
||
|
// Message Handlers //
|
||
|
//==========================================================================//
|
||
|
|
||
|
|
||
|
void
|
||
|
/* static */
|
||
|
OnInitAddLogDialog (
|
||
|
HDLG hDlg
|
||
|
)
|
||
|
{
|
||
|
TCHAR szRemoteComputerName[MAX_PATH + 3] ;
|
||
|
INT_PTR iIndex ;
|
||
|
PLOGENTRY pLogEntry ;
|
||
|
LPTSTR pComputerName ;
|
||
|
|
||
|
bAddLineInProgress = TRUE ;
|
||
|
if (PlayingBackLog()) {
|
||
|
pPerfData = DataFromIndexPosition (&(PlaybackLog.StartIndexPos), NULL) ;
|
||
|
GetPerfComputerName(pPerfData, szRemoteComputerName);
|
||
|
DialogSetString (hDlg, IDD_ADDLOGCOMPUTER, szRemoteComputerName);
|
||
|
} else {
|
||
|
pPerfData = MemoryAllocate (STARTING_SYSINFO_SIZE) ;
|
||
|
|
||
|
//Try to use computer specified on command line (if any), otherwise local computer
|
||
|
pComputerName = CmdLineComputerName[0] ?
|
||
|
CmdLineComputerName :
|
||
|
LocalComputerName ;
|
||
|
|
||
|
iIndex = LBSelection (hWndLogEntries) ;
|
||
|
if (iIndex != LB_ERR) {
|
||
|
pLogEntry = (PLOGENTRY) LBData(hWndLogEntries, iIndex) ;
|
||
|
|
||
|
if (pLogEntry && pLogEntry != (PLOGENTRY)LB_ERR) {
|
||
|
pComputerName = pLogEntry->szComputer ;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DialogSetString (hDlg, IDD_ADDLOGCOMPUTER, pComputerName) ;
|
||
|
}
|
||
|
|
||
|
LogComputerChanged (hDlg) ;
|
||
|
|
||
|
DialogEnable (hDlg, IDD_ADDLOGOBJECTTEXT, TRUE) ;
|
||
|
DialogEnable (hDlg, IDD_ADDLOGOBJECT, TRUE) ;
|
||
|
|
||
|
WindowCenter (hDlg) ;
|
||
|
|
||
|
dwCurrentDlgID = HC_PM_idDlgEditAddToLog ;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
/* static */
|
||
|
OnLogComputer (
|
||
|
HDLG hDlg
|
||
|
)
|
||
|
/*
|
||
|
Effect: Put up the select Domain/Computer dialog. Allow the user
|
||
|
to select the computer. Check for user entering a domain
|
||
|
instead. Place the selected computer in the readonly
|
||
|
edit box.
|
||
|
*/
|
||
|
{
|
||
|
TCHAR szComputer [MAX_SYSTEM_NAME_LENGTH + 1] ;
|
||
|
|
||
|
if (ChooseComputer (hDlg, szComputer)) {
|
||
|
DialogSetString (hDlg, IDD_ADDLOGCOMPUTER, szComputer) ;
|
||
|
LogComputerChanged (hDlg) ;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
/* static */
|
||
|
OnAddToLog (
|
||
|
HDLG hDlg
|
||
|
)
|
||
|
/*
|
||
|
Effect: Perform all actions needed when the user clicks on
|
||
|
the add button. In particular, determine if the required
|
||
|
fields of the dialog have valid values. If so, go ahead
|
||
|
and add a LOGENTRY record in the log. If the computer
|
||
|
being logged is not already logged, add a LOGSYSTEMENTRY
|
||
|
as well.
|
||
|
|
||
|
Assert: We have valid values for computer and object, since we
|
||
|
always control these fields.
|
||
|
*/
|
||
|
{
|
||
|
TCHAR szComputer [MAX_SYSTEM_NAME_LENGTH + 1] ;
|
||
|
TCHAR szObjectType [PerfObjectLen + 1] ;
|
||
|
DWORD iObjectType ;
|
||
|
DWORD iObjectNum ;
|
||
|
HWND hWndObjectTypes ;
|
||
|
PPERFOBJECT pObject ;
|
||
|
PLOG pLog ;
|
||
|
|
||
|
pLog = LogData (hWndLog) ;
|
||
|
|
||
|
DialogText (hDlg, IDD_ADDLOGCOMPUTER, szComputer) ;
|
||
|
|
||
|
hWndObjectTypes = DialogControl(hDlg, IDD_ADDLOGOBJECT) ;
|
||
|
|
||
|
iObjectNum = (DWORD) LBNumItems (hWndObjectTypes) ;
|
||
|
|
||
|
LBSetRedraw (hWndLogEntries, FALSE) ;
|
||
|
|
||
|
for (iObjectType = 0; iObjectType < iObjectNum; iObjectType++) {
|
||
|
// NOTE: for now, we don't check for duplicate lines
|
||
|
if (LBSelected (hWndObjectTypes, iObjectType)) { // if
|
||
|
LBString (hWndObjectTypes, iObjectType, szObjectType) ;
|
||
|
pObject = (PPERFOBJECT) LBData (hWndObjectTypes, iObjectType) ;
|
||
|
|
||
|
// eliminate duplicates here
|
||
|
if (LogFindEntry(szComputer, pObject->ObjectNameTitleIndex) ==
|
||
|
LOG_ENTRY_NOT_FOUND) {
|
||
|
LogAddEntry (hWndLogEntries,
|
||
|
szComputer,
|
||
|
szObjectType,
|
||
|
pObject->ObjectNameTitleIndex,
|
||
|
FALSE) ;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LBSetRedraw (hWndLogEntries, TRUE) ;
|
||
|
|
||
|
DialogSetText (hDlg, IDD_ADDLOGDONE, IDS_DONE) ;
|
||
|
|
||
|
if (pLog->iStatus == iPMStatusCollecting) {
|
||
|
LogWriteSystemCounterNames (hWndLog, pLog) ;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
INT_PTR
|
||
|
FAR
|
||
|
WINAPI
|
||
|
AddLogDlgProc (
|
||
|
HWND hDlg,
|
||
|
UINT msg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
switch (msg) {
|
||
|
case WM_INITDIALOG:
|
||
|
OnInitAddLogDialog (hDlg) ;
|
||
|
SetFocus (DialogControl (hDlg, IDD_ADDLOGADD)) ;
|
||
|
return(FALSE);
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
|
||
|
switch (LOWORD(wParam)) {
|
||
|
case IDD_CANCEL:
|
||
|
EndDialog(hDlg,0);
|
||
|
return(TRUE);
|
||
|
|
||
|
case IDD_OK:
|
||
|
case IDD_ADDLOGADD:
|
||
|
|
||
|
if (ComputerChange) {
|
||
|
TCHAR szComputer [MAX_SYSTEM_NAME_LENGTH + 3] ;
|
||
|
|
||
|
DialogText (hDlg, IDD_ADDLOGCOMPUTER, szComputer) ;
|
||
|
LogComputerChanged (hDlg) ;
|
||
|
} else {
|
||
|
SetHourglassCursor() ;
|
||
|
OnAddToLog (hDlg) ;
|
||
|
SetArrowCursor() ;
|
||
|
}
|
||
|
break ;
|
||
|
|
||
|
case IDD_ADDLOGDONE:
|
||
|
EndDialog (hDlg, 0) ;
|
||
|
break ;
|
||
|
|
||
|
case IDD_ADDLOGELLIPSES:
|
||
|
SetHourglassCursor() ;
|
||
|
OnLogComputer (hDlg) ;
|
||
|
SetArrowCursor() ;
|
||
|
break ;
|
||
|
|
||
|
|
||
|
case IDD_ADDLOGCOMPUTER:
|
||
|
if (HIWORD (wParam) == EN_UPDATE) {
|
||
|
ComputerChange = TRUE ;
|
||
|
}
|
||
|
break ;
|
||
|
|
||
|
case IDD_ADDLOGHELP:
|
||
|
CallWinHelp (dwCurrentDlgID, hDlg) ;
|
||
|
break ;
|
||
|
|
||
|
case IDD_ADDLOGOBJECT:
|
||
|
if (ComputerChange) {
|
||
|
TCHAR szComputer [MAX_SYSTEM_NAME_LENGTH + 3] ;
|
||
|
|
||
|
DialogText (hDlg, IDD_ADDLOGCOMPUTER, szComputer) ;
|
||
|
LogComputerChanged (hDlg) ;
|
||
|
}
|
||
|
break ;
|
||
|
|
||
|
default:
|
||
|
break ;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
OnLogDestroy (hDlg) ;
|
||
|
break ;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
BOOL AddLog (HWND hWndParent)
|
||
|
{
|
||
|
if (DialogBox (hInstance, idDlgAddLog, hWndParent, AddLogDlgProc)) {
|
||
|
return (TRUE) ;
|
||
|
}
|
||
|
return (FALSE) ;
|
||
|
}
|