//==========================================================================// // 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) { // LogComputerChanged 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 ; } // LogComputerChanged void /*static*/ OnLogDestroy (HDLG hDlg) { // OnLogDestroy dwCurrentDlgID = 0 ; if (!PlayingBackLog ()) MemoryFree ((LPMEMORY)pPerfData) ; bAddLineInProgress = FALSE ; } // OnLogDestroy //==========================================================================// // Message Handlers // //==========================================================================// void /* static */ OnInitAddLogDialog (HDLG hDlg) { // OnInitAddLogDialog TCHAR szRemoteComputerName[MAX_PATH + 3] ; int 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 ; } // OnInitAddLogDialog 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. */ { // OnLogComputer TCHAR szComputer [MAX_SYSTEM_NAME_LENGTH + 1] ; if (ChooseComputer (hDlg, szComputer)) { DialogSetString (hDlg, IDD_ADDLOGCOMPUTER, szComputer) ; LogComputerChanged (hDlg) ; } // if } // OnLogComputer 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. */ { // OnAddToLog 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++) { // for // 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) ; } } // if } // for LBSetRedraw (hWndLogEntries, TRUE) ; DialogSetText (hDlg, IDD_ADDLOGDONE, IDS_DONE) ; if (pLog->iStatus == iPMStatusCollecting) { LogWriteSystemCounterNames (hWndLog, pLog) ; } } // OnAddToLog int FAR WINAPI AddLogDlgProc (HWND hDlg, WORD msg, WPARAM wParam, LONG lParam) { // AddLogDlg 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) ; 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); } // AddLogDlgProc BOOL AddLog (HWND hWndParent) { // AddLog if (DialogBox (hInstance, idDlgAddLog, hWndParent, (DLGPROC) AddLogDlgProc)) { // if return (TRUE) ; } // if return (FALSE) ; } // AddLog