Leaked source code of windows server 2003
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.

2358 lines
65 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) 2002 Microsoft Corporation. All rights reserved.
  3. // Copyright (c) 2002 OSR Open Systems Resources, Inc.
  4. //
  5. // MainFrm.cpp : implementation of the CMainFrame class
  6. //////////////////////////////////////////////////////////////////////////////
  7. #include "stdafx.h"
  8. #include <tchar.h>
  9. #include <wmistr.h>
  10. #include <initguid.h>
  11. extern "C" {
  12. #include <evntrace.h>
  13. }
  14. #include <traceprt.h>
  15. #include "TraceView.h"
  16. #include "LogSession.h"
  17. #include "DisplayDlg.h"
  18. #include "ProviderFormatInfo.h"
  19. #include "ProviderFormatSelectionDlg.h"
  20. #include "ListCtrlEx.h"
  21. #include "LogSessionDlg.h"
  22. #include "LogDisplayOptionDlg.h"
  23. #include "LogSessionInformationDlg.h"
  24. #include "ProviderSetupDlg.h"
  25. #include "LogSessionPropSht.h"
  26. #include "LogSessionOutputOptionDlg.h"
  27. #include "DockDialogBar.h"
  28. #include "LogFileDlg.h"
  29. #include "Utils.h"
  30. #include "MainFrm.h"
  31. #include "ProviderControlGUIDDlg.h"
  32. #include "MaxTraceDlg.h"
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #endif
  36. extern LONG MaxTraceEntries;
  37. typedef struct _GROUP_SESSION_PARAMS {
  38. CPtrArray *pGroupArray;
  39. CPtrArray *pSessionArray;
  40. HANDLE SessionDoneEventArray[MAX_LOG_SESSIONS];
  41. } GROUP_SESSION_PARAMS, *PGROUP_SESSION_PARAMS;
  42. // CGroupSession
  43. IMPLEMENT_DYNCREATE(CGroupSession, CWinThread)
  44. BEGIN_MESSAGE_MAP(CGroupSession, CWinThread)
  45. ON_MESSAGE(WM_USER_START_GROUP, OnGroupSession)
  46. ON_MESSAGE(WM_USER_START_UNGROUP, OnUnGroupSession)
  47. END_MESSAGE_MAP()
  48. BOOL CGroupSession::InitInstance()
  49. {
  50. //
  51. // Create the event handles
  52. //
  53. for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) {
  54. m_hEventArray[ii] = CreateEvent(NULL, FALSE, FALSE, NULL);
  55. }
  56. return TRUE;
  57. }
  58. int CGroupSession::ExitInstance()
  59. {
  60. //
  61. // Release the handles
  62. //
  63. for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) {
  64. CloseHandle(m_hEventArray[ii]);
  65. }
  66. return 0;
  67. }
  68. void CGroupSession::OnGroupSession(WPARAM wParam, LPARAM lParam)
  69. {
  70. PGROUP_SESSION_PARAMS pSessionParams = (PGROUP_SESSION_PARAMS)wParam;
  71. CDisplayDlg *pDisplayDlg = NULL;
  72. CString str;
  73. LONG numberOfEvents = (LONG)pSessionParams->pGroupArray->GetSize();
  74. //
  75. // Wait on all sessions to end
  76. //
  77. DWORD status = WaitForMultipleObjects(numberOfEvents,
  78. pSessionParams->SessionDoneEventArray,
  79. TRUE,
  80. INFINITE);
  81. for(LONG ii = (LONG)pSessionParams->pGroupArray->GetSize() - 1; ii >= 0 ; ii--) {
  82. pDisplayDlg = (CDisplayDlg *)pSessionParams->pGroupArray->GetAt(ii);
  83. if(pDisplayDlg == NULL) {
  84. continue;
  85. }
  86. //
  87. // If the group has only one member, we don't need to save it, it
  88. // won't get restarted
  89. //
  90. if(pDisplayDlg->m_sessionArray.GetSize() <= 1) {
  91. pSessionParams->pGroupArray->RemoveAt(ii);
  92. }
  93. }
  94. ::PostMessage(m_hMainWnd, WM_USER_COMPLETE_GROUP, (WPARAM)pSessionParams, 0);
  95. }
  96. void CGroupSession::OnUnGroupSession(WPARAM wParam, LPARAM lParam)
  97. {
  98. PGROUP_SESSION_PARAMS pSessionParams = (PGROUP_SESSION_PARAMS)wParam;
  99. CLogSession *pLogSession;
  100. BOOL bWasActive = FALSE;
  101. CString str;
  102. CDisplayDlg *pDisplayDlg;
  103. LONG numberOfEvents = (LONG)pSessionParams->pGroupArray->GetSize();
  104. //
  105. // Wait on all sessions to end
  106. //
  107. DWORD status = WaitForMultipleObjects(numberOfEvents,
  108. pSessionParams->SessionDoneEventArray,
  109. TRUE,
  110. INFINITE);
  111. ::PostMessage(m_hMainWnd, WM_USER_COMPLETE_UNGROUP, (WPARAM)pSessionParams, 0);
  112. }
  113. // CMainFrame
  114. IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
  115. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  116. ON_MESSAGE(WM_USER_UPDATE_LOGSESSION_LIST, OnUpdateLogSessionList)
  117. ON_MESSAGE(WM_USER_COMPLETE_GROUP, OnCompleteGroup)
  118. ON_MESSAGE(WM_USER_COMPLETE_UNGROUP, OnCompleteUnGroup)
  119. ON_WM_CREATE()
  120. ON_WM_SETFOCUS()
  121. ON_COMMAND(ID_FILE_NEWLOGSESSION, OnFileNewLogSession)
  122. ON_COMMAND(ID_CREATENEWLOGSESSION, OnCreateNewLogSession)
  123. ON_COMMAND(ID_SET_TMAX, OnSetTmax)
  124. ON_COMMAND(ID_PROPERTIES, OnProperties)
  125. ON_UPDATE_COMMAND_UI(ID_PROPERTIES, OnUpdateProperties)
  126. ON_COMMAND(ID_START_TRACE_BUTTON, OnStartTrace)
  127. ON_COMMAND(ID__STARTTRACE, OnStartTrace)
  128. ON_COMMAND(ID_STOP_TRACE_BUTTON, OnStopTrace)
  129. ON_COMMAND(ID__STOPTRACE, OnStopTrace)
  130. #if 0
  131. ON_UPDATE_COMMAND_UI(ID_START_TRACE_BUTTON, OnUpdateStartTraceButton)
  132. ON_UPDATE_COMMAND_UI(ID_STOP_TRACE_BUTTON, OnUpdateStopTraceButton)
  133. ON_UPDATE_COMMAND_UI(ID_VIEW_TRACETOOLBAR, OnUpdateViewTraceToolBar)
  134. ON_COMMAND(ID_VIEW_TRACETOOLBAR, OnViewTraceToolBar)
  135. #endif
  136. ON_COMMAND(ID_GROUPSESSIONS, OnGroupSessions)
  137. ON_COMMAND(ID_UNGROUPSESSIONS, OnUngroupSessions)
  138. ON_COMMAND(ID_REMOVETRACE, OnRemoveLogSession)
  139. ON_UPDATE_COMMAND_UI(ID_GROUPSESSIONS, OnUpdateUIGroupSessions)
  140. ON_UPDATE_COMMAND_UI(ID_UNGROUPSESSIONS, OnUpdateUngroupSessions)
  141. ON_UPDATE_COMMAND_UI(ID__STARTTRACE, OnUpdateUIStartTrace)
  142. ON_UPDATE_COMMAND_UI(ID__STOPTRACE, OnUpdateUIStopTrace)
  143. ON_UPDATE_COMMAND_UI(147, OnUpdateUIOpenExisting)
  144. ON_COMMAND(ID__OPENEXISTINGLOGFILE, OnOpenExisting)
  145. ON_COMMAND(ID_FILE_OPENEXISTINGLOGFILE, OnOpenExisting)
  146. ON_COMMAND(ID__FLAGS, OnFlagsColumnDisplayCheck)
  147. ON_UPDATE_COMMAND_UI(ID__FLAGS, OnUpdateFlagsColumnDisplay)
  148. ON_COMMAND(ID__FLUSHTIME, OnFlushTimeColumnDisplayCheck)
  149. ON_UPDATE_COMMAND_UI(ID__FLUSHTIME, OnUpdateFlushTimeColumnDisplayCheck)
  150. ON_COMMAND(ID__MAXBUFFERS, OnMaxBuffersColumnDisplayCheck)
  151. ON_UPDATE_COMMAND_UI(ID__MAXBUFFERS, OnUpdateMaxBuffersColumnDisplayCheck)
  152. ON_COMMAND(ID__MINBUFFERS, OnMinBuffersColumnDisplayCheck)
  153. ON_UPDATE_COMMAND_UI(ID__MINBUFFERS, OnUpdateMinBuffersColumnDisplayCheck)
  154. ON_COMMAND(ID__BUFFERSIZE, OnBufferSizeColumnDisplayCheck)
  155. ON_UPDATE_COMMAND_UI(ID__BUFFERSIZE, OnUpdateBufferSizeColumnDisplayCheck)
  156. ON_COMMAND(ID__AGE, OnDecayTimeColumnDisplayCheck)
  157. ON_UPDATE_COMMAND_UI(ID__AGE, OnUpdateDecayTimeColumnDisplayCheck)
  158. ON_COMMAND(ID__CIRCULAR, OnCircularColumnDisplayCheck)
  159. ON_UPDATE_COMMAND_UI(ID__CIRCULAR, OnUpdateCircularColumnDisplayCheck)
  160. ON_COMMAND(ID__SEQUENTIAL, OnSequentialColumnDisplayCheck)
  161. ON_UPDATE_COMMAND_UI(ID__SEQUENTIAL, OnUpdateSequentialColumnDisplayCheck)
  162. ON_COMMAND(ID__NEWFILE, OnNewFileColumnDisplayCheck)
  163. ON_UPDATE_COMMAND_UI(ID__NEWFILE, OnUpdateNewFileColumnDisplayCheck)
  164. ON_COMMAND(ID__GLOBALSEQUENCE, OnGlobalSeqColumnDisplayCheck)
  165. ON_UPDATE_COMMAND_UI(ID__GLOBALSEQUENCE, OnUpdateGlobalSeqColumnDisplayCheck)
  166. ON_COMMAND(ID__LOCALSEQUENCE, OnLocalSeqColumnDisplayCheck)
  167. ON_UPDATE_COMMAND_UI(ID__LOCALSEQUENCE, OnUpdateLocalSeqColumnDisplayCheck)
  168. ON_COMMAND(ID__LEVEL, OnLevelColumnDisplayCheck)
  169. ON_UPDATE_COMMAND_UI(ID__LEVEL, OnUpdateLevelColumnDisplayCheck)
  170. ON_UPDATE_COMMAND_UI(ID_REMOVETRACE, OnUpdateRemoveTrace)
  171. ON_COMMAND(ID__STATE, OnStateColumnDisplayCheck)
  172. ON_COMMAND(ID__EVENTCOUNT, OnEventCountColumnDisplayCheck)
  173. ON_COMMAND(ID__LOSTEVENTS, OnLostEventsColumnDisplayCheck)
  174. ON_COMMAND(ID__BUFFERSREAD, OnBuffersReadColumnDisplayCheck)
  175. ON_UPDATE_COMMAND_UI(ID__STATE, OnUpdateStateColumnDisplayCheck)
  176. ON_UPDATE_COMMAND_UI(ID__EVENTCOUNT, OnUpdateEventCountColumnDisplayCheck)
  177. ON_UPDATE_COMMAND_UI(ID__LOSTEVENTS, OnUpdateLostEventsColumnDisplayCheck)
  178. ON_UPDATE_COMMAND_UI(ID__BUFFERSREAD, OnUpdateBuffersReadColumnDisplayCheck)
  179. ON_COMMAND(ID__LOGSESSIONDISPLAYOPTIONS, OnLogSessionDisplayOptions)
  180. ON_COMMAND(ID__CHANGETEXTCOLOR, OnChangeTextColor)
  181. ON_COMMAND(ID__CHANGEBACKGROUNDCOLOR, OnChangeBackgroundColor)
  182. ON_UPDATE_COMMAND_UI(ID__CHANGETEXTCOLOR, OnUpdateChangeTextColor)
  183. ON_UPDATE_COMMAND_UI(ID__CHANGEBACKGROUNDCOLOR, OnUpdateChangeBackgroundColor)
  184. ON_UPDATE_COMMAND_UI(ID_SET_TMAX, OnUpdateSetTmax)
  185. END_MESSAGE_MAP()
  186. static UINT indicators[] =
  187. {
  188. ID_SEPARATOR, // status line indicator
  189. ID_INDICATOR_CAPS,
  190. ID_INDICATOR_NUM,
  191. ID_INDICATOR_SCRL,
  192. };
  193. // CMainFrame construction/destruction
  194. CMainFrame::CMainFrame()
  195. {
  196. m_hEndTraceEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  197. }
  198. CMainFrame::~CMainFrame()
  199. {
  200. delete []m_pGroupSessionsThread;
  201. }
  202. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  203. {
  204. DWORD extendedStyles;
  205. CString str;
  206. RECT rc;
  207. int height;
  208. HMODULE hTestHandle;
  209. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  210. return -1;
  211. //
  212. // Make sure that the msvcr70.dll is available, and if not error out
  213. //
  214. hTestHandle = LoadLibraryEx(_T("msvcr70.dll"), NULL, 0);
  215. if(hTestHandle == NULL) {
  216. AfxMessageBox(_T("MISSING NECESSARY DLL: MSVCR70.DLL"));
  217. return -1;
  218. }
  219. FreeLibrary(hTestHandle);
  220. //
  221. // Make sure that the msvcr70.dll is available, and if not error out
  222. //
  223. hTestHandle = LoadLibraryEx(_T("mspdb70.dll"), NULL, 0);
  224. if(hTestHandle == NULL) {
  225. AfxMessageBox(_T("MISSING NECESSARY DLL: MSPDB70.DLL"));
  226. return -1;
  227. }
  228. FreeLibrary(hTestHandle);
  229. //
  230. // Spawn a thread to handle grouping and ungrouping sessions
  231. //
  232. m_pGroupSessionsThread = (CGroupSession *)AfxBeginThread(RUNTIME_CLASS(CGroupSession));
  233. m_pGroupSessionsThread->m_hMainWnd = GetSafeHwnd();
  234. //
  235. // create a view to occupy the client area of the frame
  236. //
  237. if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
  238. CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
  239. {
  240. TRACE(_T("Failed to create view window\n"));
  241. return -1;
  242. }
  243. #if 0
  244. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  245. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  246. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  247. {
  248. TRACE(_T("Failed to create toolbar\n"));
  249. //
  250. // fail to create
  251. //
  252. return -1;
  253. }
  254. if (!m_wndTraceToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  255. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  256. !m_wndTraceToolBar.LoadToolBar(IDR_TRACE_TOOLBAR))
  257. {
  258. TRACE(_T("Failed to create toolbar\n"));
  259. //
  260. // fail to create
  261. //
  262. return -1;
  263. }
  264. #endif
  265. if (!m_wndStatusBar.Create(this) ||
  266. !m_wndStatusBar.SetIndicators(indicators,
  267. sizeof(indicators)/sizeof(UINT)))
  268. {
  269. TRACE(_T("Failed to create status bar\n"));
  270. //
  271. // fail to create
  272. //
  273. return -1;
  274. }
  275. #if 0
  276. //
  277. // toolbars are dockable
  278. //
  279. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  280. EnableDocking(CBRS_ALIGN_ANY);
  281. DockControlBar(&m_wndToolBar);
  282. m_wndTraceToolBar.EnableDocking(CBRS_ALIGN_ANY);
  283. EnableDocking(CBRS_ALIGN_ANY);
  284. DockControlBarLeftOf(&m_wndTraceToolBar, &m_wndToolBar);
  285. #endif
  286. EnableDocking(CBRS_ALIGN_ANY);
  287. str.Format(_T("Log Session List"));
  288. //
  289. // create our dockable dialog bar with list control
  290. // We always create one, which is our log session list display
  291. //
  292. if (!m_wndLogSessionListBar.Create(this, &m_logSessionDlg, str, IDD_DISPLAY_DIALOG,
  293. WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC))
  294. {
  295. TRACE(_T("Failed to create log session list DockDialogBar\n"));
  296. return -1;
  297. }
  298. //
  299. // make the dialog dockable and dock it to the bottom originally.
  300. //
  301. m_wndLogSessionListBar.EnableDocking(CBRS_ALIGN_TOP);
  302. //
  303. //EnableDocking(CBRS_ALIGN_ANY);
  304. //
  305. DockControlBar(&m_wndLogSessionListBar, AFX_IDW_DOCKBAR_TOP);
  306. //
  307. // Go ahead and create the first column header
  308. //
  309. str.Format(_T("Group ID / Session Name"));
  310. m_logSessionDlg.m_displayCtrl.InsertColumn(0,
  311. str,
  312. LVCFMT_LEFT,
  313. 180);
  314. //
  315. // set our preferred extended styles
  316. //
  317. extendedStyles = LVS_EX_GRIDLINES |
  318. LVS_EX_HEADERDRAGDROP |
  319. LVS_EX_FULLROWSELECT;
  320. //
  321. // Set the extended styles for the list control
  322. //
  323. m_logSessionDlg.m_displayCtrl.SetExtendedStyle(extendedStyles);
  324. //
  325. // resize our main window
  326. //
  327. GetWindowRect(&rc);
  328. height = rc.bottom - rc.top;
  329. GetClientRect(&rc);
  330. height -= rc.bottom - rc.top;
  331. #if 0
  332. m_wndToolBar.GetWindowRect(&rc);
  333. height += rc.bottom - rc.top;
  334. #endif
  335. m_logSessionDlg.m_displayCtrl.GetWindowRect(&rc);
  336. height += rc.bottom - rc.top + 432;
  337. GetWindowRect(&rc);
  338. SetWindowPos(&wndBottom, 0, 0, rc.right - rc.left + 76, height, SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_SHOWWINDOW);
  339. return 0;
  340. }
  341. void CMainFrame::DockControlBarLeftOf(CToolBar* Bar, CToolBar* LeftOf)
  342. {
  343. CRect rect;
  344. DWORD dw;
  345. UINT n;
  346. //
  347. // get MFC to adjust the dimensions of all docked ToolBars
  348. // so that GetWindowRect will be accurate
  349. //
  350. RecalcLayout(TRUE);
  351. LeftOf->GetWindowRect(&rect);
  352. rect.OffsetRect(1,0);
  353. dw=LeftOf->GetBarStyle();
  354. n = 0;
  355. n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;
  356. n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
  357. n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
  358. n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;
  359. //
  360. // When we take the default parameters on rect, DockControlBar will dock
  361. // each Toolbar on a seperate line. By calculating a rectangle, we
  362. // are simulating a Toolbar being dragged to that location and docked.
  363. //
  364. DockControlBar(Bar,n,&rect);
  365. RecalcLayout(TRUE);
  366. }
  367. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  368. {
  369. if( !CFrameWnd::PreCreateWindow(cs) )
  370. return FALSE;
  371. cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
  372. cs.lpszClass = AfxRegisterWndClass(0);
  373. return TRUE;
  374. }
  375. // CMainFrame diagnostics
  376. #ifdef _DEBUG
  377. void CMainFrame::AssertValid() const
  378. {
  379. CFrameWnd::AssertValid();
  380. }
  381. void CMainFrame::Dump(CDumpContext& dc) const
  382. {
  383. CFrameWnd::Dump(dc);
  384. }
  385. #endif //_DEBUG
  386. // CMainFrame message handlers
  387. void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)
  388. {
  389. // forward focus to the view window
  390. //m_wndView.SetFocus();
  391. }
  392. BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
  393. {
  394. //
  395. //
  396. //
  397. return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  398. }
  399. void CMainFrame::OnFileNewLogSession()
  400. {
  401. AddModifyLogSession();
  402. }
  403. void CMainFrame::OnCreateNewLogSession()
  404. {
  405. AddModifyLogSession();
  406. }
  407. void CMainFrame::AddModifyLogSession(CLogSession *pLogSession)
  408. {
  409. BOOL bAddingSession = FALSE;
  410. CString str;
  411. DWORD extendedStyles;
  412. INT_PTR retVal;
  413. CLogSession *pLog;
  414. BOOL bNoID = FALSE;
  415. LONG logSessionID = 0;
  416. CDisplayDlg *pDisplayDlg;
  417. //
  418. // if this is a new session, create the instance
  419. //
  420. if(NULL == pLogSession) {
  421. //
  422. // Get a unique log session ID
  423. //
  424. logSessionID = m_logSessionDlg.GetLogSessionID();
  425. pLogSession = new CLogSession(logSessionID, &m_logSessionDlg);
  426. if(NULL == pLogSession) {
  427. AfxMessageBox(_T("Unable To Create Log Session"));
  428. return;
  429. }
  430. bAddingSession = TRUE;
  431. }
  432. //
  433. // pop-up our wizard/tab dialog to show/get properties
  434. //
  435. CLogSessionPropSht *pLogSessionPropertySheet =
  436. new CLogSessionPropSht(this, pLogSession);
  437. if(NULL == pLogSessionPropertySheet) {
  438. if(bAddingSession) {
  439. AfxMessageBox(_T("Failed To Create Log Session, Resource Error"));
  440. m_logSessionDlg.ReleaseLogSessionID(pLogSession);
  441. delete pLogSession;
  442. }
  443. return;
  444. }
  445. if(bAddingSession) {
  446. pLogSessionPropertySheet->SetWizardMode();
  447. }
  448. retVal = pLogSessionPropertySheet->DoModal();
  449. if(IDOK != retVal) {
  450. if(bAddingSession) {
  451. if(IDCANCEL != retVal) {
  452. AfxMessageBox(_T("Failed To Get Log Session Properties"));
  453. }
  454. m_logSessionDlg.ReleaseLogSessionID(pLogSession);
  455. delete pLogSession;
  456. }
  457. delete pLogSessionPropertySheet;
  458. return;
  459. }
  460. if(!pLogSession->m_bTraceActive) {
  461. if(bAddingSession) {
  462. //
  463. // Check that we have at least one provider
  464. //
  465. if(0 == pLogSession->m_traceSessionArray.GetSize()) {
  466. AfxMessageBox(_T("No Providers Registered\nLog Session Initialization Failed"));
  467. m_logSessionDlg.ReleaseLogSessionID(pLogSession);
  468. delete pLogSession;
  469. delete pLogSessionPropertySheet;
  470. return;
  471. }
  472. //
  473. // Add the session to the list of log sessions
  474. //
  475. m_logSessionDlg.AddSession(pLogSession);
  476. //
  477. // Get the display window for the log session
  478. //
  479. pDisplayDlg = pLogSession->GetDisplayWnd();
  480. ASSERT(pDisplayDlg != NULL);
  481. //
  482. // Set the output file info for the display dialog
  483. //
  484. pDisplayDlg->m_bWriteListingFile =
  485. pLogSessionPropertySheet->m_bWriteListingFile;
  486. if(pDisplayDlg->m_bWriteListingFile) {
  487. pDisplayDlg->m_listingFileName =
  488. pLogSessionPropertySheet->m_listingFileName;
  489. }
  490. pDisplayDlg->m_bWriteSummaryFile =
  491. pLogSessionPropertySheet->m_bWriteSummaryFile;
  492. if(pDisplayDlg->m_bWriteSummaryFile) {
  493. pDisplayDlg->m_summaryFileName =
  494. pLogSessionPropertySheet->m_summaryFileName;
  495. }
  496. //
  497. // Start the log session tracing
  498. //
  499. pDisplayDlg->BeginTrace();
  500. //
  501. // Force a redraw of the list control
  502. //
  503. m_logSessionDlg.m_displayCtrl.RedrawItems(
  504. m_logSessionDlg.m_displayCtrl.GetTopIndex(),
  505. m_logSessionDlg.m_displayCtrl.GetTopIndex() +
  506. m_logSessionDlg.m_displayCtrl.GetCountPerPage());
  507. m_logSessionDlg.m_displayCtrl.UpdateWindow();
  508. } else {
  509. m_logSessionDlg.UpdateSession(pLogSession);
  510. }
  511. } else {
  512. m_logSessionDlg.UpdateSession(pLogSession);
  513. }
  514. delete pLogSessionPropertySheet;
  515. }
  516. void CMainFrame::OnProperties()
  517. {
  518. POSITION pos;
  519. LONG index;
  520. CLogSession *pLogSession;
  521. INT_PTR retVal;
  522. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  523. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  524. //
  525. // Get the log session array protection
  526. //
  527. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  528. if((index < 0) || (index >= m_logSessionDlg.m_logSessionArray.GetSize())) {
  529. AfxMessageBox(_T("Error Log Session Not Found!"));
  530. //
  531. // Release the log session array protection
  532. //
  533. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  534. return;
  535. }
  536. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  537. //
  538. // Release the log session array protection
  539. //
  540. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  541. if(NULL == pLogSession) {
  542. return;
  543. }
  544. if(pLogSession->m_bDisplayExistingLogFileOnly) {
  545. //
  546. // pop-up our wizard/tab dialog to show/get properties
  547. //
  548. CLogFileDlg *pDialog = new CLogFileDlg(this, pLogSession);
  549. if(NULL == pDialog) {
  550. return;
  551. }
  552. retVal = pDialog->DoModal();
  553. delete pDialog;
  554. if(IDOK != retVal) {
  555. if(IDCANCEL != retVal) {
  556. AfxMessageBox(_T("Failed To Get Log File Properties"));
  557. }
  558. return;
  559. }
  560. //
  561. // Now update the session
  562. //
  563. m_logSessionDlg.UpdateSession(pLogSession);
  564. return;
  565. }
  566. AddModifyLogSession(pLogSession);
  567. }
  568. void CMainFrame::OnUpdateProperties(CCmdUI *pCmdUI)
  569. {
  570. POSITION pos;
  571. int index;
  572. CLogSession *pLogSession;
  573. //
  574. // Taking this out altogether for now, but leaving it in
  575. // the code in case it needs to be put back
  576. //
  577. pCmdUI->Enable(FALSE);
  578. return;
  579. //
  580. // disable the properties option if there is more
  581. // than one selected log session
  582. //
  583. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 1) {
  584. pCmdUI->Enable(FALSE);
  585. }
  586. //
  587. // Get the log session array protection
  588. //
  589. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  590. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  591. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  592. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  593. //
  594. // Release the log session array protection
  595. //
  596. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  597. //
  598. // If the session is in process of stopping, don't allow the
  599. // properties dialog to be viewed
  600. //
  601. if((NULL == pLogSession) ||
  602. (pLogSession->m_bStoppingTrace)) {
  603. pCmdUI->Enable(FALSE);
  604. }
  605. }
  606. void CMainFrame::OnStartTrace()
  607. {
  608. POSITION pos;
  609. LONG index;
  610. CLogSession *pLogSession;
  611. CDisplayDlg *pDisplayDlg;
  612. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  613. while(pos != NULL) {
  614. //
  615. // Get the log session array protection
  616. //
  617. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  618. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  619. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  620. //
  621. // Release the log session array protection
  622. //
  623. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  624. if(NULL == pLogSession) {
  625. continue;
  626. }
  627. pDisplayDlg = pLogSession->GetDisplayWnd();
  628. ASSERT(pDisplayDlg != NULL);
  629. pDisplayDlg->BeginTrace();
  630. }
  631. //
  632. // Force a redraw of the list control
  633. //
  634. m_logSessionDlg.m_displayCtrl.RedrawItems(
  635. m_logSessionDlg.m_displayCtrl.GetTopIndex(),
  636. m_logSessionDlg.m_displayCtrl.GetTopIndex() +
  637. m_logSessionDlg.m_displayCtrl.GetCountPerPage());
  638. m_logSessionDlg.m_displayCtrl.UpdateWindow();
  639. }
  640. #if 0
  641. void CMainFrame::OnUpdateStartTraceButton(CCmdUI *pCmdUI)
  642. {
  643. POSITION pos;
  644. int index;
  645. CLogSession *pLogSession;
  646. BOOL bFound = FALSE;
  647. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() == 0) {
  648. pCmdUI->Enable(FALSE);
  649. return;
  650. }
  651. pCmdUI->Enable(TRUE);
  652. //
  653. // Get the log session array protection
  654. //
  655. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  656. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  657. while(pos != NULL) {
  658. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  659. if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) {
  660. break;
  661. }
  662. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  663. if(pLogSession != NULL) {
  664. bFound = TRUE;
  665. if(pLogSession->m_bTraceActive) {
  666. pCmdUI->Enable(FALSE);
  667. break;
  668. }
  669. }
  670. }
  671. //
  672. // Release the log session array protection
  673. //
  674. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  675. if(!bFound) {
  676. pCmdUI->Enable(FALSE);
  677. }
  678. }
  679. void CMainFrame::OnUpdateStopTraceButton(CCmdUI *pCmdUI)
  680. {
  681. POSITION pos;
  682. int index;
  683. CLogSession *pLogSession;
  684. pCmdUI->Enable(FALSE);
  685. //
  686. // Get the log session array protection
  687. //
  688. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  689. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) {
  690. pCmdUI->Enable(TRUE);
  691. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  692. while(pos != NULL) {
  693. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  694. if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) {
  695. pCmdUI->Enable(FALSE);
  696. break;
  697. }
  698. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  699. if((pLogSession == NULL) ||
  700. (!pLogSession->m_bTraceActive) ||
  701. (pLogSession->m_bStoppingTrace)) {
  702. pCmdUI->Enable(FALSE);
  703. break;
  704. }
  705. }
  706. }
  707. //
  708. // Release the log session array protection
  709. //
  710. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  711. }
  712. void CMainFrame::OnUpdateViewTraceToolBar(CCmdUI *pCmdUI)
  713. {
  714. pCmdUI->SetCheck((m_wndTraceToolBar.IsWindowVisible()) != 0);
  715. }
  716. void CMainFrame::OnViewTraceToolBar()
  717. {
  718. //
  719. // toggle visible state
  720. //
  721. m_wndTraceToolBar.ShowWindow((m_wndTraceToolBar.IsWindowVisible()) == 0);
  722. RecalcLayout();
  723. }
  724. #endif
  725. void CMainFrame::OnStopTrace()
  726. {
  727. POSITION pos;
  728. LONG index;
  729. CLogSession *pLogSession;
  730. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  731. while(pos != NULL) {
  732. //
  733. // Get the log session array protection
  734. //
  735. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  736. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  737. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  738. //
  739. // Release the log session array protection
  740. //
  741. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  742. if((pLogSession != NULL) &&
  743. (pLogSession->m_bTraceActive)) {
  744. //
  745. // Stop tracing
  746. //
  747. pLogSession->GetDisplayWnd()->EndTrace();
  748. }
  749. }
  750. }
  751. void CMainFrame::OnGroupSessions()
  752. {
  753. POSITION pos;
  754. int index;
  755. CLogSession *pLogSession;
  756. BOOL bFound = FALSE;
  757. CLogSession *pLog = NULL;
  758. BOOL bWasActive = FALSE;
  759. COLORREF textColor;
  760. COLORREF backgroundColor;
  761. CString str;
  762. CDisplayDlg *pDisplayDlg;
  763. CPtrArray *pLogSessionArray;
  764. CPtrArray *pGroupArray;
  765. PGROUP_SESSION_PARAMS pSessionParams;
  766. //
  767. // Can't group one session
  768. //
  769. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() == 1) {
  770. return;
  771. }
  772. //
  773. // Allocate arrays
  774. //
  775. pLogSessionArray = new CPtrArray();
  776. //
  777. // Make sure allocation succeeded
  778. //
  779. if(NULL == pLogSessionArray) {
  780. AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure"));
  781. return;
  782. }
  783. pGroupArray = new CPtrArray();
  784. //
  785. // Make sure allocation succeeded
  786. //
  787. if(NULL == pGroupArray) {
  788. AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure"));
  789. delete pLogSessionArray;
  790. return;
  791. }
  792. //
  793. // Allocate our structure
  794. //
  795. pSessionParams = (PGROUP_SESSION_PARAMS)new CHAR[sizeof(GROUP_SESSION_PARAMS)];
  796. //
  797. // Make sure allocation succeeded
  798. //
  799. if(NULL == pSessionParams) {
  800. AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure"));
  801. delete pLogSessionArray;
  802. delete pGroupArray;
  803. return;
  804. }
  805. //
  806. // Setup the params struct
  807. //
  808. pSessionParams->pGroupArray = pGroupArray;
  809. pSessionParams->pSessionArray = pLogSessionArray;
  810. for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) {
  811. pSessionParams->SessionDoneEventArray[ii] =
  812. CreateEvent(NULL, FALSE, FALSE, NULL);
  813. }
  814. //
  815. // Now walk through the selected sessions and put them in an array
  816. //
  817. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  818. while(pos != NULL) {
  819. //
  820. // Get the log session array protection
  821. //
  822. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  823. //
  824. // Get the index of the next selected item
  825. //
  826. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  827. //
  828. // Get the next log session
  829. //
  830. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  831. //
  832. // Release the log session array protection
  833. //
  834. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  835. if(pLogSession == NULL) {
  836. continue;
  837. }
  838. //
  839. // Add the session to the array
  840. //
  841. pLogSessionArray->Add(pLogSession);
  842. //
  843. // Get the group display dialog for the session
  844. //
  845. pDisplayDlg = pLogSession->GetDisplayWnd();
  846. //
  847. // Set the state of the groups
  848. //
  849. pDisplayDlg->SetState(Grouping);
  850. //
  851. // Attempt to Stop the group
  852. //
  853. if(pDisplayDlg->EndTrace(pSessionParams->SessionDoneEventArray[pGroupArray->GetSize()])) {
  854. //
  855. // If stopped save the pointer to possibly start later
  856. //
  857. pGroupArray->Add(pDisplayDlg);
  858. }
  859. }
  860. if(pLogSessionArray->GetSize() > 1) {
  861. m_pGroupSessionsThread->PostThreadMessage(WM_USER_START_GROUP, (WPARAM)pSessionParams, 0);
  862. return;
  863. }
  864. //
  865. // Cleanup our allocations
  866. //
  867. delete pLogSessionArray;
  868. delete pGroupArray;
  869. for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) {
  870. CloseHandle(pSessionParams->SessionDoneEventArray[ii]);
  871. }
  872. delete [] pSessionParams;
  873. }
  874. void CMainFrame::OnCompleteGroup(WPARAM wParam, LPARAM lParam)
  875. {
  876. PGROUP_SESSION_PARAMS pSessionParams = (PGROUP_SESSION_PARAMS)wParam;
  877. CPtrArray *pGroupArray = pSessionParams->pGroupArray;
  878. CPtrArray *pLogSessionArray = pSessionParams->pSessionArray;
  879. CDisplayDlg *pDisplayDlg = NULL;
  880. //
  881. // Group the log sessions in a new group
  882. //
  883. m_logSessionDlg.GroupSessions(pLogSessionArray);
  884. //
  885. // Now restart any of the groups that we stopped previously
  886. // that are still around
  887. //
  888. while(pGroupArray->GetSize()) {
  889. //
  890. // Get the first entry in the array
  891. //
  892. pDisplayDlg = (CDisplayDlg *)pGroupArray->GetAt(0);
  893. pGroupArray->RemoveAt(0);
  894. //
  895. // Get the trace display window array protection
  896. //
  897. WaitForSingleObject(m_logSessionDlg.m_traceDisplayWndMutex, INFINITE);
  898. //
  899. // See if the group still exists and start it back up if so
  900. //
  901. for(LONG ii = 0; ii < m_logSessionDlg.m_traceDisplayWndArray.GetSize(); ii++) {
  902. if(pDisplayDlg == m_logSessionDlg.m_traceDisplayWndArray[ii]) {
  903. pDisplayDlg->BeginTrace();
  904. }
  905. }
  906. //
  907. // Release the trace display window array protection
  908. //
  909. ReleaseMutex(m_logSessionDlg.m_traceDisplayWndMutex);
  910. }
  911. //
  912. // Cleanup our allocations
  913. //
  914. delete pLogSessionArray;
  915. delete pGroupArray;
  916. for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) {
  917. CloseHandle(pSessionParams->SessionDoneEventArray[ii]);
  918. }
  919. delete [] pSessionParams;
  920. }
  921. void CMainFrame::OnUngroupSessions()
  922. {
  923. POSITION pos;
  924. int index;
  925. CLogSession *pLogSession;
  926. CString str;
  927. CDisplayDlg *pDisplayDlg;
  928. BOOL bWasActive = FALSE;
  929. CPtrArray *pLogSessionArray;
  930. CPtrArray *pGroupArray;
  931. PGROUP_SESSION_PARAMS pSessionParams;
  932. //
  933. // Allocate arrays
  934. //
  935. pLogSessionArray = new CPtrArray();
  936. //
  937. // Make sure allocation succeeded
  938. //
  939. if(NULL == pLogSessionArray) {
  940. AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure"));
  941. return;
  942. }
  943. pGroupArray = new CPtrArray();
  944. //
  945. // Make sure allocation succeeded
  946. //
  947. if(NULL == pGroupArray) {
  948. AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure"));
  949. delete pLogSessionArray;
  950. return;
  951. }
  952. //
  953. // Allocate our structure
  954. //
  955. pSessionParams = (PGROUP_SESSION_PARAMS)new CHAR[sizeof(GROUP_SESSION_PARAMS)];
  956. //
  957. // Make sure allocation succeeded
  958. //
  959. if(NULL == pSessionParams) {
  960. AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure"));
  961. delete pLogSessionArray;
  962. delete pGroupArray;
  963. return;
  964. }
  965. //
  966. // Setup the params struct
  967. //
  968. pSessionParams->pGroupArray = pGroupArray;
  969. pSessionParams->pSessionArray = pLogSessionArray;
  970. for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) {
  971. pSessionParams->SessionDoneEventArray[ii] =
  972. CreateEvent(NULL, FALSE, FALSE, NULL);
  973. }
  974. //
  975. // Walk selected sessions and check if they are grouped
  976. //
  977. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  978. while(pos != NULL) {
  979. //
  980. // Get the log session array protection
  981. //
  982. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  983. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  984. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  985. //
  986. // Release the log session array protection
  987. //
  988. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  989. if(pLogSession == NULL) {
  990. continue;
  991. }
  992. //
  993. // Get the display wnd for the session
  994. //
  995. pDisplayDlg = pLogSession->GetDisplayWnd();
  996. if(NULL == pDisplayDlg) {
  997. continue;
  998. }
  999. //
  1000. // Set the state of the groups
  1001. //
  1002. pDisplayDlg->SetState(UnGrouping);
  1003. //
  1004. // Store each log session in the array
  1005. //
  1006. pLogSessionArray->Add(pLogSession);
  1007. //
  1008. // Stop the group, and if stopped store it to possibly be
  1009. // started again later
  1010. //
  1011. if(pDisplayDlg->EndTrace(pSessionParams->SessionDoneEventArray[pGroupArray->GetSize()])) {
  1012. pGroupArray->Add(pDisplayDlg);
  1013. }
  1014. }
  1015. m_pGroupSessionsThread->PostThreadMessage(WM_USER_START_UNGROUP, (WPARAM)pSessionParams, 0);
  1016. return;
  1017. }
  1018. void CMainFrame::OnCompleteUnGroup(WPARAM wParam, LPARAM lParam)
  1019. {
  1020. PGROUP_SESSION_PARAMS pSessionParams = (PGROUP_SESSION_PARAMS)wParam;
  1021. CPtrArray *pGroupArray = pSessionParams->pGroupArray;
  1022. CPtrArray *pLogSessionArray = pSessionParams->pSessionArray;
  1023. CDisplayDlg *pDisplayDlg = NULL;
  1024. //
  1025. // Group the log sessions in a new group
  1026. //
  1027. m_logSessionDlg.UnGroupSessions(pLogSessionArray);
  1028. //
  1029. // Now restart any of the groups that we stopped previously
  1030. // that are still around
  1031. //
  1032. while(pGroupArray->GetSize()) {
  1033. //
  1034. // Get the first entry in the array
  1035. //
  1036. pDisplayDlg = (CDisplayDlg *)pGroupArray->GetAt(0);
  1037. pGroupArray->RemoveAt(0);
  1038. //
  1039. // Get the trace display window array protection
  1040. //
  1041. WaitForSingleObject(m_logSessionDlg.m_traceDisplayWndMutex, INFINITE);
  1042. //
  1043. // See if the group still exists and start it back up if so
  1044. //
  1045. for(LONG ii = 0; ii < m_logSessionDlg.m_traceDisplayWndArray.GetSize(); ii++) {
  1046. if(pDisplayDlg == m_logSessionDlg.m_traceDisplayWndArray[ii]) {
  1047. pDisplayDlg->BeginTrace();
  1048. }
  1049. }
  1050. //
  1051. // Release the trace display window array protection
  1052. //
  1053. ReleaseMutex(m_logSessionDlg.m_traceDisplayWndMutex);
  1054. }
  1055. //
  1056. // Cleanup our allocations
  1057. //
  1058. delete pLogSessionArray;
  1059. delete pGroupArray;
  1060. for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) {
  1061. CloseHandle(pSessionParams->SessionDoneEventArray[ii]);
  1062. }
  1063. delete [] pSessionParams;
  1064. }
  1065. void CMainFrame::OnRemoveLogSession()
  1066. {
  1067. m_logSessionDlg.RemoveSelectedLogSessions();
  1068. }
  1069. void CMainFrame::OnUpdateUIGroupSessions(CCmdUI *pCmdUI)
  1070. {
  1071. POSITION pos;
  1072. int index;
  1073. CLogSession *pLogSession;
  1074. CString str;
  1075. OSVERSIONINFO osVersion;
  1076. BOOL bOpenExisting = FALSE;
  1077. BOOL bActiveTracing = FALSE;
  1078. BOOL bDifferentGroups = FALSE;
  1079. LONG groupNumber = -1;
  1080. //
  1081. // Default to enabled
  1082. //
  1083. pCmdUI->Enable(TRUE);
  1084. //
  1085. // disable the group option if there are not multiple groups
  1086. //
  1087. if(m_logSessionDlg.m_traceDisplayWndArray.GetSize() == 1) {
  1088. pCmdUI->Enable(FALSE);
  1089. return;
  1090. }
  1091. //
  1092. // disable the group option if multiple sessions are not
  1093. // selected
  1094. //
  1095. if(0 == m_logSessionDlg.m_displayCtrl.GetSelectedCount()) {
  1096. pCmdUI->Enable(FALSE);
  1097. return;
  1098. }
  1099. //
  1100. // Make sure all selected sessions are of the same
  1101. // type, that is active tracing or open exisiting logfile.
  1102. //
  1103. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  1104. while(pos != NULL) {
  1105. //
  1106. // Get the log session array protection
  1107. //
  1108. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  1109. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  1110. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  1111. //
  1112. // Release the log session array protection
  1113. //
  1114. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1115. if(pLogSession != NULL) {
  1116. //
  1117. // If any session is not grouped, in the process of stopping,
  1118. // or in the process of grouping or ungrouping already,
  1119. // don't allow ungrouping
  1120. //
  1121. if((pLogSession->m_bStoppingTrace) ||
  1122. (pLogSession->m_bGroupingTrace)) {
  1123. pCmdUI->Enable(FALSE);
  1124. return;
  1125. }
  1126. //
  1127. // Check the group numbers
  1128. //
  1129. if(groupNumber == -1) {
  1130. groupNumber = pLogSession->GetGroupID();
  1131. }
  1132. if(groupNumber != pLogSession->GetGroupID()) {
  1133. bDifferentGroups = TRUE;
  1134. }
  1135. if(pLogSession->m_bDisplayExistingLogFileOnly) {
  1136. //
  1137. // Opened an existing log file
  1138. //
  1139. bOpenExisting = TRUE;
  1140. } else {
  1141. //
  1142. // Active tracing sessions can only be
  1143. // grouped on .Net and later, so we need to check
  1144. // the OS version. .Net: Major = 5 Minor = 2.
  1145. //
  1146. //
  1147. // call GetVersionEx using the OSVERSIONINFO structure,
  1148. //
  1149. ZeroMemory(&osVersion, sizeof(OSVERSIONINFO));
  1150. osVersion.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
  1151. if(GetVersionEx((OSVERSIONINFO *)&osVersion)) {
  1152. //
  1153. // Make sure we are on .NET or later to group
  1154. // real-time sessions
  1155. //
  1156. if(osVersion.dwMajorVersion < 5) {
  1157. pCmdUI->Enable(FALSE);
  1158. return;
  1159. }
  1160. if(osVersion.dwMinorVersion < 2) {
  1161. pCmdUI->Enable(FALSE);
  1162. return;
  1163. }
  1164. }
  1165. bActiveTracing = TRUE;
  1166. }
  1167. }
  1168. }
  1169. //
  1170. // Make sure there are multiple groups represented
  1171. //
  1172. if(!bDifferentGroups) {
  1173. pCmdUI->Enable(FALSE);
  1174. return;
  1175. }
  1176. //
  1177. // Make sure that the log session types aren't mixed
  1178. //
  1179. if(bActiveTracing && bOpenExisting) {
  1180. pCmdUI->Enable(FALSE);
  1181. return;
  1182. }
  1183. }
  1184. void CMainFrame::OnUpdateUngroupSessions(CCmdUI *pCmdUI)
  1185. {
  1186. POSITION pos;
  1187. int index;
  1188. CLogSession *pLogSession;
  1189. CString str;
  1190. //
  1191. // Default to enabled
  1192. //
  1193. pCmdUI->Enable(TRUE);
  1194. //
  1195. // Walk selected sessions and check if they are grouped
  1196. //
  1197. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  1198. while(pos != NULL) {
  1199. //
  1200. // Get the log session array protection
  1201. //
  1202. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  1203. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  1204. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  1205. //
  1206. // Release the log session array protection
  1207. //
  1208. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1209. if(pLogSession == NULL) {
  1210. continue;
  1211. }
  1212. //
  1213. // If any session is not grouped, in the process of stopping,
  1214. // or in the process of grouping or ungrouping already,
  1215. // don't allow ungrouping
  1216. //
  1217. if((pLogSession->GetDisplayWnd()->m_sessionArray.GetSize() == 1) ||
  1218. (pLogSession->m_bStoppingTrace) ||
  1219. (pLogSession->m_bGroupingTrace)) {
  1220. pCmdUI->Enable(FALSE);
  1221. return;
  1222. }
  1223. }
  1224. }
  1225. void CMainFrame::OnUpdateUIStartTrace(CCmdUI *pCmdUI)
  1226. {
  1227. POSITION pos;
  1228. int index;
  1229. CLogSession *pLogSession;
  1230. BOOL bFound = FALSE;
  1231. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() != 1) {
  1232. pCmdUI->Enable(FALSE);
  1233. return;
  1234. }
  1235. pCmdUI->Enable(TRUE);
  1236. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  1237. while(pos != NULL) {
  1238. //
  1239. // Get the log session array protection
  1240. //
  1241. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  1242. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  1243. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  1244. //
  1245. // Release the log session array protection
  1246. //
  1247. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1248. if(pLogSession != NULL) {
  1249. bFound = TRUE;
  1250. if((pLogSession->m_bTraceActive) || (pLogSession->m_bDisplayExistingLogFileOnly)) {
  1251. pCmdUI->Enable(FALSE);
  1252. break;
  1253. }
  1254. }
  1255. }
  1256. if(!bFound) {
  1257. pCmdUI->Enable(FALSE);
  1258. }
  1259. }
  1260. void CMainFrame::OnUpdateUIStopTrace(CCmdUI *pCmdUI)
  1261. {
  1262. POSITION pos;
  1263. int index;
  1264. CLogSession *pLogSession;
  1265. pCmdUI->Enable(FALSE);
  1266. //
  1267. // Get the log session array protection
  1268. //
  1269. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  1270. //
  1271. // Don't allow stop if more than one session is selected
  1272. //
  1273. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 1) {
  1274. pCmdUI->Enable(FALSE);
  1275. //
  1276. // Release the log session array protection
  1277. //
  1278. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1279. return;
  1280. }
  1281. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) {
  1282. //
  1283. // Default to enabling the stop option
  1284. //
  1285. pCmdUI->Enable(TRUE);
  1286. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  1287. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  1288. if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) {
  1289. //
  1290. // Release the log session array protection
  1291. //
  1292. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1293. pCmdUI->Enable(FALSE);
  1294. return;
  1295. }
  1296. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  1297. //
  1298. // Release the log session array protection
  1299. //
  1300. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1301. //
  1302. // If no session is found, disable the stop option
  1303. //
  1304. // If the session is not active, is already being stopped,
  1305. // or is for an existing logfile then disable the
  1306. // stop option.
  1307. //
  1308. // Don't allow stop if the session was started outside of
  1309. // traceview. We determine this by whether a valid handle
  1310. // was obtained for the session.
  1311. //
  1312. if((pLogSession == NULL) ||
  1313. (!pLogSession->m_bTraceActive) ||
  1314. (pLogSession->m_bStoppingTrace) ||
  1315. (pLogSession->m_bDisplayExistingLogFileOnly) ||
  1316. (pLogSession->GetSessionHandle() == (TRACEHANDLE)INVALID_HANDLE_VALUE)) {
  1317. pCmdUI->Enable(FALSE);
  1318. }
  1319. }
  1320. }
  1321. void CMainFrame::OnUpdateUIOpenExisting(CCmdUI *pCmdUI)
  1322. {
  1323. //
  1324. // placeholder
  1325. //
  1326. }
  1327. void CMainFrame::OnOpenExisting()
  1328. {
  1329. CLogSession *pLogSession = NULL;
  1330. CString str;
  1331. LONG newDisplayFlags = 0;
  1332. LONG newColumnDisplayFlags;
  1333. LONG logSessionDisplayFlags;
  1334. CDisplayDlg *pDisplayDlg;
  1335. DWORD extendedStyles;
  1336. INT_PTR retVal;
  1337. CLogSession *pLog;
  1338. BOOL bNoID;
  1339. LONG logSessionID = 0;
  1340. CString extension;
  1341. CString traceDirectory;
  1342. LONG traceSessionID = 0;
  1343. //
  1344. // Get a unique ID for the session
  1345. //
  1346. logSessionID = m_logSessionDlg.GetLogSessionID();
  1347. //
  1348. // Create an instance of the logsession class
  1349. //
  1350. pLogSession = new CLogSession(logSessionID, &m_logSessionDlg);
  1351. if(NULL == pLogSession) {
  1352. AfxMessageBox(_T("Unable To Create Log Session"));
  1353. return;
  1354. }
  1355. //
  1356. // Indicate the log session is not tracing real time
  1357. //
  1358. pLogSession->m_bRealTime = FALSE;
  1359. //
  1360. // Indicate the log session is only displaying an existing log session
  1361. //
  1362. pLogSession->m_bDisplayExistingLogFileOnly = TRUE;
  1363. //
  1364. // Clear the log file name so the user has to select
  1365. //
  1366. pLogSession->m_logFileName.Empty();
  1367. //
  1368. // pop-up our wizard/tab dialog to show/get properties
  1369. //
  1370. CLogFileDlg *pDialog = new CLogFileDlg(this, pLogSession);
  1371. if(NULL == pDialog) {
  1372. AfxMessageBox(_T("Failed To Create Log File Session, Resource Error"));
  1373. m_logSessionDlg.RemoveSession(pLogSession);
  1374. delete pLogSession;
  1375. return;
  1376. }
  1377. retVal = pDialog->DoModal();
  1378. if(IDOK != retVal) {
  1379. if(IDCANCEL != retVal) {
  1380. AfxMessageBox(_T("Failed To Get Log File Properties"));
  1381. }
  1382. m_logSessionDlg.RemoveSession(pLogSession);
  1383. delete pDialog;
  1384. delete pLogSession;
  1385. return;
  1386. }
  1387. CTraceSession *pTraceSession = new CTraceSession(0);
  1388. if(NULL == pTraceSession) {
  1389. AfxMessageBox(_T("Failed To Process Log File"));
  1390. m_logSessionDlg.RemoveSession(pLogSession);
  1391. delete pDialog;
  1392. delete pLogSession;
  1393. return;
  1394. }
  1395. //
  1396. // put the default trace session in the list
  1397. //
  1398. pLogSession->m_traceSessionArray.Add(pTraceSession);
  1399. //
  1400. // Now get the format info, prompt user for PDB or TMF
  1401. //
  1402. CProviderFormatSelectionDlg *pFormatDialog = new CProviderFormatSelectionDlg(this, pTraceSession);
  1403. if(NULL == pFormatDialog) {
  1404. AfxMessageBox(_T("Failed To Process Log File"));
  1405. m_logSessionDlg.RemoveSession(pLogSession);
  1406. delete pDialog;
  1407. delete pLogSession;
  1408. return;
  1409. }
  1410. if(IDOK != pFormatDialog->DoModal()) {
  1411. delete pFormatDialog;
  1412. m_logSessionDlg.RemoveSession(pLogSession);
  1413. delete pDialog;
  1414. delete pLogSession;
  1415. return;
  1416. }
  1417. delete pFormatDialog;
  1418. //
  1419. // Now add the log session to the log session list
  1420. //
  1421. m_logSessionDlg.AddSession(pLogSession);
  1422. //
  1423. // Get the display dialog
  1424. //
  1425. pDisplayDlg = pLogSession->GetDisplayWnd();
  1426. //
  1427. // Get the listing file name if selected from dialog
  1428. //
  1429. if(pDisplayDlg->m_bWriteListingFile = pDialog->m_bWriteListingFile) {
  1430. pDisplayDlg->m_listingFileName = pDialog->m_listingFileName;
  1431. }
  1432. //
  1433. // Get the summary file name if selected from dialog
  1434. //
  1435. if(pDisplayDlg->m_bWriteSummaryFile = pDialog->m_bWriteSummaryFile) {
  1436. pDisplayDlg->m_summaryFileName = pDialog->m_summaryFileName;
  1437. }
  1438. delete pDialog;
  1439. //
  1440. // Now trace the contents of the logfile
  1441. //
  1442. pDisplayDlg->BeginTrace();
  1443. //
  1444. // Force a redraw of the list control
  1445. //
  1446. m_logSessionDlg.m_displayCtrl.RedrawItems(
  1447. m_logSessionDlg.m_displayCtrl.GetTopIndex(),
  1448. m_logSessionDlg.m_displayCtrl.GetTopIndex() +
  1449. m_logSessionDlg.m_displayCtrl.GetCountPerPage());
  1450. m_logSessionDlg.m_displayCtrl.UpdateWindow();
  1451. }
  1452. void CMainFrame::OnStateColumnDisplayCheck()
  1453. {
  1454. LONG flags;
  1455. flags = m_logSessionDlg.GetDisplayFlags();
  1456. if(flags & LOGSESSION_DISPLAY_STATE) {
  1457. flags &= ~LOGSESSION_DISPLAY_STATE;
  1458. } else {
  1459. flags |= LOGSESSION_DISPLAY_STATE;
  1460. }
  1461. m_logSessionDlg.SetDisplayFlags(flags);
  1462. }
  1463. void CMainFrame::OnEventCountColumnDisplayCheck()
  1464. {
  1465. LONG flags;
  1466. flags = m_logSessionDlg.GetDisplayFlags();
  1467. if(flags & LOGSESSION_DISPLAY_EVENTCOUNT) {
  1468. flags &= ~LOGSESSION_DISPLAY_EVENTCOUNT;
  1469. } else {
  1470. flags |= LOGSESSION_DISPLAY_EVENTCOUNT;
  1471. }
  1472. m_logSessionDlg.SetDisplayFlags(flags);
  1473. }
  1474. void CMainFrame::OnLostEventsColumnDisplayCheck()
  1475. {
  1476. LONG flags;
  1477. flags = m_logSessionDlg.GetDisplayFlags();
  1478. if(flags & LOGSESSION_DISPLAY_LOSTEVENTS) {
  1479. flags &= ~LOGSESSION_DISPLAY_LOSTEVENTS;
  1480. } else {
  1481. flags |= LOGSESSION_DISPLAY_LOSTEVENTS;
  1482. }
  1483. m_logSessionDlg.SetDisplayFlags(flags);
  1484. }
  1485. void CMainFrame::OnBuffersReadColumnDisplayCheck()
  1486. {
  1487. LONG flags;
  1488. flags = m_logSessionDlg.GetDisplayFlags();
  1489. if(flags & LOGSESSION_DISPLAY_BUFFERSREAD) {
  1490. flags &= ~LOGSESSION_DISPLAY_BUFFERSREAD;
  1491. } else {
  1492. flags |= LOGSESSION_DISPLAY_BUFFERSREAD;
  1493. }
  1494. m_logSessionDlg.SetDisplayFlags(flags);
  1495. }
  1496. void CMainFrame::OnUpdateStateColumnDisplayCheck(CCmdUI *pCmdUI)
  1497. {
  1498. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_STATE) {
  1499. pCmdUI->SetCheck(TRUE);
  1500. } else {
  1501. pCmdUI->SetCheck(FALSE);
  1502. }
  1503. }
  1504. void CMainFrame::OnUpdateEventCountColumnDisplayCheck(CCmdUI *pCmdUI)
  1505. {
  1506. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_EVENTCOUNT) {
  1507. pCmdUI->SetCheck(TRUE);
  1508. } else {
  1509. pCmdUI->SetCheck(FALSE);
  1510. }
  1511. }
  1512. void CMainFrame::OnUpdateLostEventsColumnDisplayCheck(CCmdUI *pCmdUI)
  1513. {
  1514. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_LOSTEVENTS) {
  1515. pCmdUI->SetCheck(TRUE);
  1516. } else {
  1517. pCmdUI->SetCheck(FALSE);
  1518. }
  1519. }
  1520. void CMainFrame::OnUpdateBuffersReadColumnDisplayCheck(CCmdUI *pCmdUI)
  1521. {
  1522. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_BUFFERSREAD) {
  1523. pCmdUI->SetCheck(TRUE);
  1524. } else {
  1525. pCmdUI->SetCheck(FALSE);
  1526. }
  1527. }
  1528. void CMainFrame::OnFlagsColumnDisplayCheck()
  1529. {
  1530. LONG flags;
  1531. flags = m_logSessionDlg.GetDisplayFlags();
  1532. if(flags & LOGSESSION_DISPLAY_FLAGS) {
  1533. flags &= ~LOGSESSION_DISPLAY_FLAGS;
  1534. } else {
  1535. flags |= LOGSESSION_DISPLAY_FLAGS;
  1536. }
  1537. m_logSessionDlg.SetDisplayFlags(flags);
  1538. }
  1539. void CMainFrame::OnUpdateFlagsColumnDisplay(CCmdUI *pCmdUI)
  1540. {
  1541. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_FLAGS) {
  1542. pCmdUI->SetCheck(TRUE);
  1543. } else {
  1544. pCmdUI->SetCheck(FALSE);
  1545. }
  1546. }
  1547. void CMainFrame::OnFlushTimeColumnDisplayCheck()
  1548. {
  1549. LONG flags;
  1550. flags = m_logSessionDlg.GetDisplayFlags();
  1551. if(flags & LOGSESSION_DISPLAY_FLUSHTIME) {
  1552. flags &= ~LOGSESSION_DISPLAY_FLUSHTIME;
  1553. } else {
  1554. flags |= LOGSESSION_DISPLAY_FLUSHTIME;
  1555. }
  1556. m_logSessionDlg.SetDisplayFlags(flags);
  1557. }
  1558. void CMainFrame::OnUpdateFlushTimeColumnDisplayCheck(CCmdUI *pCmdUI)
  1559. {
  1560. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_FLUSHTIME) {
  1561. pCmdUI->SetCheck(TRUE);
  1562. } else {
  1563. pCmdUI->SetCheck(FALSE);
  1564. }
  1565. }
  1566. void CMainFrame::OnMaxBuffersColumnDisplayCheck()
  1567. {
  1568. LONG flags;
  1569. flags = m_logSessionDlg.GetDisplayFlags();
  1570. if(flags & LOGSESSION_DISPLAY_MAXBUF) {
  1571. flags &= ~LOGSESSION_DISPLAY_MAXBUF;
  1572. } else {
  1573. flags |= LOGSESSION_DISPLAY_MAXBUF;
  1574. }
  1575. m_logSessionDlg.SetDisplayFlags(flags);
  1576. }
  1577. void CMainFrame::OnUpdateMaxBuffersColumnDisplayCheck(CCmdUI *pCmdUI)
  1578. {
  1579. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_MAXBUF) {
  1580. pCmdUI->SetCheck(TRUE);
  1581. } else {
  1582. pCmdUI->SetCheck(FALSE);
  1583. }
  1584. }
  1585. void CMainFrame::OnMinBuffersColumnDisplayCheck()
  1586. {
  1587. LONG flags;
  1588. flags = m_logSessionDlg.GetDisplayFlags();
  1589. if(flags & LOGSESSION_DISPLAY_MINBUF) {
  1590. flags &= ~LOGSESSION_DISPLAY_MINBUF;
  1591. } else {
  1592. flags |= LOGSESSION_DISPLAY_MINBUF;
  1593. }
  1594. m_logSessionDlg.SetDisplayFlags(flags);
  1595. }
  1596. void CMainFrame::OnUpdateMinBuffersColumnDisplayCheck(CCmdUI *pCmdUI)
  1597. {
  1598. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_MINBUF) {
  1599. pCmdUI->SetCheck(TRUE);
  1600. } else {
  1601. pCmdUI->SetCheck(FALSE);
  1602. }
  1603. }
  1604. void CMainFrame::OnBufferSizeColumnDisplayCheck()
  1605. {
  1606. LONG flags;
  1607. flags = m_logSessionDlg.GetDisplayFlags();
  1608. if(flags & LOGSESSION_DISPLAY_BUFFERSIZE) {
  1609. flags &= ~LOGSESSION_DISPLAY_BUFFERSIZE;
  1610. } else {
  1611. flags |= LOGSESSION_DISPLAY_BUFFERSIZE;
  1612. }
  1613. m_logSessionDlg.SetDisplayFlags(flags);
  1614. }
  1615. void CMainFrame::OnUpdateBufferSizeColumnDisplayCheck(CCmdUI *pCmdUI)
  1616. {
  1617. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_BUFFERSIZE) {
  1618. pCmdUI->SetCheck(TRUE);
  1619. } else {
  1620. pCmdUI->SetCheck(FALSE);
  1621. }
  1622. }
  1623. void CMainFrame::OnDecayTimeColumnDisplayCheck()
  1624. {
  1625. LONG flags;
  1626. flags = m_logSessionDlg.GetDisplayFlags();
  1627. if(flags & LOGSESSION_DISPLAY_DECAYTIME) {
  1628. flags &= ~LOGSESSION_DISPLAY_DECAYTIME;
  1629. } else {
  1630. flags |= LOGSESSION_DISPLAY_DECAYTIME;
  1631. }
  1632. m_logSessionDlg.SetDisplayFlags(flags);
  1633. }
  1634. void CMainFrame::OnUpdateDecayTimeColumnDisplayCheck(CCmdUI *pCmdUI)
  1635. {
  1636. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_DECAYTIME) {
  1637. pCmdUI->SetCheck(TRUE);
  1638. } else {
  1639. pCmdUI->SetCheck(FALSE);
  1640. }
  1641. }
  1642. void CMainFrame::OnCircularColumnDisplayCheck()
  1643. {
  1644. LONG flags;
  1645. flags = m_logSessionDlg.GetDisplayFlags();
  1646. if(flags & LOGSESSION_DISPLAY_CIR) {
  1647. flags &= ~LOGSESSION_DISPLAY_CIR;
  1648. } else {
  1649. flags |= LOGSESSION_DISPLAY_CIR;
  1650. }
  1651. m_logSessionDlg.SetDisplayFlags(flags);
  1652. }
  1653. void CMainFrame::OnUpdateCircularColumnDisplayCheck(CCmdUI *pCmdUI)
  1654. {
  1655. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_CIR) {
  1656. pCmdUI->SetCheck(TRUE);
  1657. } else {
  1658. pCmdUI->SetCheck(FALSE);
  1659. }
  1660. }
  1661. void CMainFrame::OnSequentialColumnDisplayCheck()
  1662. {
  1663. LONG flags;
  1664. flags = m_logSessionDlg.GetDisplayFlags();
  1665. if(flags & LOGSESSION_DISPLAY_SEQ) {
  1666. flags &= ~LOGSESSION_DISPLAY_SEQ;
  1667. } else {
  1668. flags |= LOGSESSION_DISPLAY_SEQ;
  1669. }
  1670. m_logSessionDlg.SetDisplayFlags(flags);
  1671. }
  1672. void CMainFrame::OnUpdateSequentialColumnDisplayCheck(CCmdUI *pCmdUI)
  1673. {
  1674. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_SEQ) {
  1675. pCmdUI->SetCheck(TRUE);
  1676. } else {
  1677. pCmdUI->SetCheck(FALSE);
  1678. }
  1679. }
  1680. void CMainFrame::OnNewFileColumnDisplayCheck()
  1681. {
  1682. LONG flags;
  1683. flags = m_logSessionDlg.GetDisplayFlags();
  1684. if(flags & LOGSESSION_DISPLAY_NEWFILE) {
  1685. flags &= ~LOGSESSION_DISPLAY_NEWFILE;
  1686. } else {
  1687. flags |= LOGSESSION_DISPLAY_NEWFILE;
  1688. }
  1689. m_logSessionDlg.SetDisplayFlags(flags);
  1690. }
  1691. void CMainFrame::OnUpdateNewFileColumnDisplayCheck(CCmdUI *pCmdUI)
  1692. {
  1693. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_NEWFILE) {
  1694. pCmdUI->SetCheck(TRUE);
  1695. } else {
  1696. pCmdUI->SetCheck(FALSE);
  1697. }
  1698. }
  1699. void CMainFrame::OnGlobalSeqColumnDisplayCheck()
  1700. {
  1701. LONG flags;
  1702. flags = m_logSessionDlg.GetDisplayFlags();
  1703. if(flags & LOGSESSION_DISPLAY_GLOBALSEQ) {
  1704. flags &= ~LOGSESSION_DISPLAY_GLOBALSEQ;
  1705. } else {
  1706. flags |= LOGSESSION_DISPLAY_GLOBALSEQ;
  1707. }
  1708. m_logSessionDlg.SetDisplayFlags(flags);
  1709. }
  1710. void CMainFrame::OnUpdateGlobalSeqColumnDisplayCheck(CCmdUI *pCmdUI)
  1711. {
  1712. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_GLOBALSEQ) {
  1713. pCmdUI->SetCheck(TRUE);
  1714. } else {
  1715. pCmdUI->SetCheck(FALSE);
  1716. }
  1717. }
  1718. void CMainFrame::OnLocalSeqColumnDisplayCheck()
  1719. {
  1720. LONG flags;
  1721. flags = m_logSessionDlg.GetDisplayFlags();
  1722. if(flags & LOGSESSION_DISPLAY_LOCALSEQ) {
  1723. flags &= ~LOGSESSION_DISPLAY_LOCALSEQ;
  1724. } else {
  1725. flags |= LOGSESSION_DISPLAY_LOCALSEQ;
  1726. }
  1727. m_logSessionDlg.SetDisplayFlags(flags);
  1728. }
  1729. void CMainFrame::OnUpdateLocalSeqColumnDisplayCheck(CCmdUI *pCmdUI)
  1730. {
  1731. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_LOCALSEQ) {
  1732. pCmdUI->SetCheck(TRUE);
  1733. } else {
  1734. pCmdUI->SetCheck(FALSE);
  1735. }
  1736. }
  1737. void CMainFrame::OnLevelColumnDisplayCheck()
  1738. {
  1739. LONG flags;
  1740. flags = m_logSessionDlg.GetDisplayFlags();
  1741. if(flags & LOGSESSION_DISPLAY_LEVEL) {
  1742. flags &= ~LOGSESSION_DISPLAY_LEVEL;
  1743. } else {
  1744. flags |= LOGSESSION_DISPLAY_LEVEL;
  1745. }
  1746. m_logSessionDlg.SetDisplayFlags(flags);
  1747. }
  1748. void CMainFrame::OnUpdateLevelColumnDisplayCheck(CCmdUI *pCmdUI)
  1749. {
  1750. if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_LEVEL) {
  1751. pCmdUI->SetCheck(TRUE);
  1752. } else {
  1753. pCmdUI->SetCheck(FALSE);
  1754. }
  1755. }
  1756. void CMainFrame::OnUpdateRemoveTrace(CCmdUI *pCmdUI)
  1757. {
  1758. POSITION pos;
  1759. int index;
  1760. CLogSession *pLogSession;
  1761. pCmdUI->Enable(FALSE);
  1762. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 1) {
  1763. return;
  1764. }
  1765. //
  1766. // Get the log session array protection
  1767. //
  1768. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  1769. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) {
  1770. pCmdUI->Enable(TRUE);
  1771. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  1772. while(pos != NULL) {
  1773. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  1774. if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) {
  1775. pCmdUI->Enable(FALSE);
  1776. break;
  1777. }
  1778. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  1779. if((pLogSession == NULL) ||
  1780. pLogSession->m_bTraceActive ||
  1781. pLogSession->m_bStoppingTrace ||
  1782. pLogSession->m_bGroupingTrace ||
  1783. (pLogSession->GetDisplayWnd()->m_sessionArray.GetSize() > 1)) {
  1784. pCmdUI->Enable(FALSE);
  1785. break;
  1786. }
  1787. }
  1788. }
  1789. //
  1790. // Release the log session array protection
  1791. //
  1792. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1793. }
  1794. void CMainFrame::OnLogSessionDisplayOptions()
  1795. {
  1796. //
  1797. // Just here to enable the menu item, nothing to do
  1798. //
  1799. }
  1800. void CMainFrame::OnChangeTextColor()
  1801. {
  1802. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) {
  1803. CColorDialog colorDlg(0, 0, this);
  1804. COLORREF color;
  1805. POSITION pos;
  1806. int index;
  1807. CLogSession *pLogSession;
  1808. if(IDOK == colorDlg.DoModal()) {
  1809. color = colorDlg.GetColor();
  1810. }
  1811. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  1812. //
  1813. // Get the log session array protection
  1814. //
  1815. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  1816. while(pos != NULL) {
  1817. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  1818. if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) {
  1819. break;
  1820. }
  1821. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  1822. if(pLogSession != NULL) {
  1823. pLogSession->m_titleTextColor = color;
  1824. m_logSessionDlg.m_displayCtrl.RedrawItems(
  1825. m_logSessionDlg.m_displayCtrl.GetTopIndex(),
  1826. m_logSessionDlg.m_displayCtrl.GetTopIndex() +
  1827. m_logSessionDlg.m_displayCtrl.GetCountPerPage());
  1828. m_logSessionDlg.m_displayCtrl.UpdateWindow();
  1829. }
  1830. }
  1831. //
  1832. // Release the log session array protection
  1833. //
  1834. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1835. }
  1836. }
  1837. void CMainFrame::OnChangeBackgroundColor()
  1838. {
  1839. if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) {
  1840. CColorDialog colorDlg(0, 0, this);
  1841. COLORREF color;
  1842. POSITION pos;
  1843. int index;
  1844. CLogSession *pLogSession;
  1845. if(IDOK == colorDlg.DoModal()) {
  1846. color = colorDlg.GetColor();
  1847. }
  1848. pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition();
  1849. //
  1850. // Get the log session array protection
  1851. //
  1852. WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE);
  1853. while(pos != NULL) {
  1854. index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos);
  1855. if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) {
  1856. break;
  1857. }
  1858. pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index];
  1859. if(pLogSession != NULL) {
  1860. pLogSession->m_titleBackgroundColor = color;
  1861. m_logSessionDlg.m_displayCtrl.RedrawItems(
  1862. m_logSessionDlg.m_displayCtrl.GetTopIndex(),
  1863. m_logSessionDlg.m_displayCtrl.GetTopIndex() +
  1864. m_logSessionDlg.m_displayCtrl.GetCountPerPage());
  1865. m_logSessionDlg.m_displayCtrl.UpdateWindow();
  1866. }
  1867. }
  1868. //
  1869. // Release the log session array protection
  1870. //
  1871. ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex);
  1872. }
  1873. }
  1874. void CMainFrame::OnUpdateChangeTextColor(CCmdUI *pCmdUI)
  1875. {
  1876. pCmdUI->Enable(FALSE);
  1877. }
  1878. void CMainFrame::OnUpdateChangeBackgroundColor(CCmdUI *pCmdUI)
  1879. {
  1880. pCmdUI->Enable(FALSE);
  1881. }
  1882. void CMainFrame::OnUpdateLogSessionList(WPARAM wParam, LPARAM lParam)
  1883. {
  1884. m_logSessionDlg.m_displayCtrl.RedrawItems(
  1885. m_logSessionDlg.m_displayCtrl.GetTopIndex(),
  1886. m_logSessionDlg.m_displayCtrl.GetTopIndex() +
  1887. m_logSessionDlg.m_displayCtrl.GetCountPerPage());
  1888. m_logSessionDlg.m_displayCtrl.UpdateWindow();
  1889. }
  1890. void CMainFrame::OnSetTmax()
  1891. {
  1892. // TODO: Add your command handler code here
  1893. CMaxTraceDlg dlg;
  1894. dlg.DoModal();
  1895. MaxTraceEntries = dlg.m_MaxTraceEntries;
  1896. }
  1897. void CMainFrame::OnUpdateSetTmax(CCmdUI *pCmdUI)
  1898. {
  1899. // TODO: Add your command update UI handler code here
  1900. pCmdUI->Enable();
  1901. if( m_logSessionDlg.m_logSessionArray.GetSize() ) {
  1902. pCmdUI->Enable(FALSE);
  1903. }
  1904. }