mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
359 lines
10 KiB
359 lines
10 KiB
|
|
//==========================================================================//
|
|
// Includes //
|
|
//==========================================================================//
|
|
|
|
#include "perfmon.h"
|
|
#include "datasrc.h" // External declarations for this file
|
|
|
|
#include "fileutil.h" // for FileErrorMessageBox (whatever)
|
|
#include "grafdata.h" // for ResetGraph
|
|
#include "alert.h" // for ResetAlert
|
|
#include "log.h" // for ResetLog
|
|
#include "report.h" // for ResetReport
|
|
#include "playback.h"
|
|
#include "status.h"
|
|
#include "utils.h"
|
|
#include "pmhelpid.h" // Help IDs
|
|
#include "fileopen.h" // FileOpneHookProc
|
|
#include "pmemory.h" // for MemoryAllocate & MemoryFree
|
|
#include "perfmops.h" // for ShowPerfmonWindowText
|
|
|
|
//==========================================================================//
|
|
// Local Data //
|
|
//==========================================================================//
|
|
|
|
|
|
BOOL bIgnoreFirstChange ;
|
|
BOOL bDataSourceNow ;
|
|
BOOL bDataSourcePrevious ;
|
|
BOOL bLogFileNameChanged ;
|
|
|
|
LPTSTR pszLogFilePath ;
|
|
LPTSTR pszLogFileTitle ;
|
|
//TCHAR szLogFilePath [FilePathLen + 1] ;
|
|
//TCHAR szLogFileTitle [FilePathLen + 1] ;
|
|
|
|
|
|
//==========================================================================//
|
|
// Local Functions //
|
|
//==========================================================================//
|
|
|
|
|
|
|
|
void static UpdateLogName (HDLG hDlg)
|
|
{
|
|
DialogSetString (hDlg, IDD_DATASOURCEFILENAME, pszLogFilePath) ;
|
|
// DialogSetString (hDlg, IDD_DATASOURCEFILENAME, pszLogFileTitle) ;
|
|
}
|
|
|
|
|
|
|
|
void OnChangeLog (HWND hWndParent)
|
|
{ // OnChangeLog
|
|
OPENFILENAME ofn ;
|
|
TCHAR szOpenLog [WindowCaptionLen + 1] ;
|
|
TCHAR aszOpenFilter[LongTextLen] ;
|
|
TCHAR szMyLogFilePath [FilePathLen + 1] ;
|
|
int StringLength ;
|
|
DWORD SaveCurrentDlgID = dwCurrentDlgID ;
|
|
|
|
//=============================//
|
|
// Get Log File //
|
|
//=============================//
|
|
|
|
aszOpenFilter[0] = 0;
|
|
StringLoad (IDS_OPENLOG, szOpenLog) ;
|
|
StringLoad (IDS_SAVELOGFILEEXT, szMyLogFilePath) ;
|
|
|
|
// load the log file extension
|
|
LoadString (hInstance, IDS_SAVELOGFILE, aszOpenFilter,
|
|
sizeof(aszOpenFilter) / sizeof(TCHAR)) ;
|
|
StringLength = lstrlen (aszOpenFilter) + 1 ;
|
|
LoadString (hInstance, IDS_SAVELOGFILEEXT,
|
|
&aszOpenFilter[StringLength],
|
|
sizeof(aszOpenFilter) / sizeof(TCHAR) - StringLength) ;
|
|
StringLength += lstrlen (&aszOpenFilter[StringLength]) ;
|
|
|
|
// setup the end strings
|
|
aszOpenFilter[StringLength+1] = aszOpenFilter[StringLength+2] = TEXT('\0') ;
|
|
|
|
|
|
ofn.lStructSize = sizeof (OPENFILENAME) ;
|
|
ofn.hwndOwner = hWndParent ;
|
|
ofn.hInstance = hInstance ;
|
|
ofn.lpstrFilter = aszOpenFilter ;
|
|
ofn.lpstrCustomFilter = NULL ;
|
|
ofn.nMaxCustFilter = 0 ;
|
|
ofn.nFilterIndex = 1;
|
|
ofn.lpstrFile = szMyLogFilePath ;
|
|
ofn.nMaxFile = FilePathLen * sizeof (TCHAR) ;
|
|
ofn.lpstrFileTitle = pszLogFileTitle ;
|
|
ofn.nMaxFileTitle = FilePathLen * sizeof (TCHAR) ;
|
|
ofn.lpstrInitialDir = NULL ;
|
|
ofn.lpstrTitle = szOpenLog ;
|
|
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY |
|
|
// OFN_PATHMUSTEXIST | OFN_SHOWHELP | OFN_ENABLEHOOK ;
|
|
OFN_PATHMUSTEXIST | OFN_ENABLEHOOK | OFN_EXPLORER;
|
|
ofn.lCustData = 0L ;
|
|
ofn.lpfnHook = (LPOFNHOOKPROC) FileOpenHookProc ;
|
|
ofn.lpstrDefExt = (LPTSTR)NULL;
|
|
|
|
dwCurrentDlgID = HC_PM_idDlgOptionOpenLogFile ;
|
|
if (GetOpenFileName (&ofn))
|
|
{
|
|
if (!strsame(pszLogFilePath, szMyLogFilePath))
|
|
{
|
|
INT_PTR FileNameOffset ;
|
|
LPTSTR pFileName ;
|
|
|
|
bLogFileNameChanged |= TRUE ;
|
|
lstrcpy (pszLogFilePath, szMyLogFilePath) ;
|
|
lstrcpy (pszLogFileTitle, ofn.lpstrFileTitle) ;
|
|
|
|
pFileName = ExtractFileName (szMyLogFilePath) ;
|
|
if (pFileName != szMyLogFilePath)
|
|
{
|
|
FileNameOffset = pFileName - szMyLogFilePath ;
|
|
szMyLogFilePath[FileNameOffset] = TEXT('\0') ;
|
|
SetCurrentDirectory (szMyLogFilePath) ;
|
|
}
|
|
UpdateLogName (hWndParent) ;
|
|
}
|
|
}
|
|
|
|
// restore the global before exit
|
|
dwCurrentDlgID = SaveCurrentDlgID ;
|
|
} // OnChangeLog
|
|
|
|
|
|
//==========================================================================//
|
|
// Message Handlers //
|
|
//==========================================================================//
|
|
|
|
|
|
void static OnInitDialog (HDLG hDlg)
|
|
{
|
|
bLogFileNameChanged = FALSE ;
|
|
|
|
bIgnoreFirstChange = TRUE ;
|
|
|
|
bDataSourcePrevious = bDataSourceNow = !PlayingBackLog () ;
|
|
|
|
CheckRadioButton (hDlg, IDD_DATASOURCENOW, IDD_DATASOURCEFILE,
|
|
bDataSourceNow ? IDD_DATASOURCENOW : IDD_DATASOURCEFILE) ;
|
|
UpdateLogName (hDlg) ;
|
|
|
|
EditSetLimit (GetDlgItem(hDlg, IDD_DATASOURCEFILENAME),
|
|
FilePathLen - 1) ;
|
|
|
|
WindowCenter (hDlg) ;
|
|
|
|
dwCurrentDlgID = HC_PM_idDlgOptionDataFrom ;
|
|
}
|
|
|
|
|
|
void /*static*/ OnDataSourceOK (HDLG hDlg)
|
|
{ // OnOK
|
|
BOOL bHaveResetPerfmon ;
|
|
INT RetCode = 0 ;
|
|
|
|
bHaveResetPerfmon = FALSE;
|
|
if (!BoolEqual (bDataSourceNow, bDataSourcePrevious) ||
|
|
(bLogFileNameChanged && !bDataSourceNow) )
|
|
{
|
|
if (PlayingBackLog () && bDataSourceNow | bLogFileNameChanged)
|
|
{
|
|
CloseInputLog (hWndMain) ;
|
|
bHaveResetPerfmon = TRUE ;
|
|
}
|
|
|
|
if (!bDataSourceNow)
|
|
{
|
|
if (!bHaveResetPerfmon)
|
|
{
|
|
ResetGraphView (hWndGraph) ;
|
|
ResetAlertView (hWndAlert) ;
|
|
ResetLogView (hWndLog) ;
|
|
ResetReportView (hWndReport) ;
|
|
|
|
if (pWorkSpaceFullFileName)
|
|
{
|
|
MemoryFree (pWorkSpaceFullFileName) ;
|
|
pWorkSpaceFileName = NULL ;
|
|
pWorkSpaceFullFileName = NULL ;
|
|
}
|
|
ShowPerfmonWindowText () ;
|
|
}
|
|
|
|
GetDlgItemText (hDlg, IDD_DATASOURCEFILENAME,
|
|
pszLogFilePath, FilePathLen - 1) ;
|
|
lstrcpy (pszLogFileTitle, pszLogFilePath);
|
|
|
|
if (RetCode = OpenPlayback (pszLogFilePath, pszLogFileTitle))
|
|
{
|
|
DlgErrorBox (hDlg, RetCode, pszLogFileTitle) ;
|
|
}
|
|
}
|
|
|
|
StatusLineReady (hWndStatus) ;
|
|
}
|
|
|
|
if (!BoolEqual (bDataSourceNow, bDataSourcePrevious))
|
|
{
|
|
if (bDataSourceNow)
|
|
{
|
|
// Set Priority high
|
|
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS) ;
|
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) ;
|
|
}
|
|
else
|
|
{
|
|
// Use a lower priority for Playing back log
|
|
SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS) ;
|
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL) ;
|
|
}
|
|
}
|
|
|
|
if (RetCode == 0)
|
|
{
|
|
EndDialog (hDlg, 1) ;
|
|
}
|
|
} // OnOK
|
|
|
|
|
|
|
|
//==========================================================================//
|
|
// Exported Functions //
|
|
//==========================================================================//
|
|
|
|
|
|
INT_PTR
|
|
FAR
|
|
WINAPI
|
|
DataSourceDlgProc (
|
|
HWND hDlg,
|
|
unsigned iMessage,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
BOOL bHandled ;
|
|
|
|
bHandled = TRUE ;
|
|
switch (iMessage)
|
|
{
|
|
case WM_INITDIALOG:
|
|
OnInitDialog (hDlg) ;
|
|
return (TRUE) ;
|
|
|
|
case WM_CLOSE:
|
|
EndDialog (hDlg, 0) ;
|
|
break ;
|
|
|
|
case WM_DESTROY:
|
|
dwCurrentDlgID = 0 ;
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDD_DATASOURCEFILENAME:
|
|
if (bIgnoreFirstChange)
|
|
{
|
|
bIgnoreFirstChange = FALSE;
|
|
}
|
|
|
|
else if (HIWORD(wParam) == EN_UPDATE && !bLogFileNameChanged)
|
|
{
|
|
bLogFileNameChanged = TRUE;
|
|
CheckRadioButton (hDlg,
|
|
IDD_DATASOURCENOW,
|
|
IDD_DATASOURCEFILE,
|
|
IDD_DATASOURCEFILE) ;
|
|
bDataSourceNow = FALSE ;
|
|
}
|
|
break ;
|
|
|
|
case IDD_DATASOURCECHANGEFILE:
|
|
OnChangeLog (hDlg) ;
|
|
if (bLogFileNameChanged)
|
|
{
|
|
CheckRadioButton (hDlg,
|
|
IDD_DATASOURCENOW,
|
|
IDD_DATASOURCEFILE,
|
|
IDD_DATASOURCEFILE) ;
|
|
bDataSourceNow = FALSE ;
|
|
}
|
|
break ;
|
|
|
|
case IDD_DATASOURCEFILE:
|
|
bDataSourceNow = FALSE ;
|
|
break ;
|
|
|
|
case IDD_DATASOURCENOW:
|
|
bDataSourceNow = TRUE ;
|
|
break ;
|
|
|
|
case IDD_OK:
|
|
OnDataSourceOK (hDlg) ;
|
|
break ;
|
|
|
|
case IDD_CANCEL:
|
|
EndDialog (hDlg, 0) ;
|
|
break ;
|
|
|
|
case IDD_DATASOURCEHELP:
|
|
CallWinHelp (dwCurrentDlgID, hDlg) ;
|
|
break ;
|
|
|
|
default:
|
|
bHandled = FALSE ;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
|
|
default:
|
|
bHandled = FALSE ;
|
|
break ;
|
|
} // switch
|
|
|
|
return (bHandled) ;
|
|
} // DataSourceDlgProc
|
|
|
|
|
|
|
|
BOOL
|
|
DisplayDataSourceOptions (
|
|
HWND hWndParent
|
|
)
|
|
/*
|
|
Effect: Put up Perfmon's Data Source Options Display dialog,
|
|
which allows
|
|
the user to select the source of data input: real
|
|
time or log file.
|
|
*/
|
|
{ // DisplayDisplayOptions
|
|
BOOL retCode ;
|
|
|
|
pszLogFilePath = (LPTSTR) MemoryAllocate (FilePathLen * sizeof(TCHAR)) ;
|
|
if (pszLogFilePath == NULL)
|
|
return FALSE;
|
|
pszLogFileTitle = (LPTSTR) MemoryAllocate (FilePathLen * sizeof(TCHAR)) ;
|
|
if (pszLogFileTitle == NULL) {
|
|
MemoryFree(pszLogFilePath);
|
|
return FALSE;
|
|
}
|
|
|
|
lstrcpy (pszLogFilePath, PlaybackLog.szFilePath) ;
|
|
lstrcpy (pszLogFileTitle, PlaybackLog.szFileTitle) ;
|
|
|
|
retCode = DialogBox (hInstance, idDlgDataSource, hWndParent, DataSourceDlgProc) ? TRUE : FALSE;
|
|
|
|
MemoryFree (pszLogFilePath) ;
|
|
MemoryFree (pszLogFileTitle) ;
|
|
|
|
return (retCode) ;
|
|
|
|
} // DisplayDisplayOptions
|