////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2002 Microsoft Corporation. All rights reserved. // Copyright (c) 2002 OSR Open Systems Resources, Inc. // // MainFrm.cpp : implementation of the CMainFrame class ////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #include #include extern "C" { #include } #include #include "TraceView.h" #include "LogSession.h" #include "DisplayDlg.h" #include "ProviderFormatInfo.h" #include "ProviderFormatSelectionDlg.h" #include "ListCtrlEx.h" #include "LogSessionDlg.h" #include "LogDisplayOptionDlg.h" #include "LogSessionInformationDlg.h" #include "ProviderSetupDlg.h" #include "LogSessionPropSht.h" #include "LogSessionOutputOptionDlg.h" #include "DockDialogBar.h" #include "LogFileDlg.h" #include "Utils.h" #include "MainFrm.h" #include "ProviderControlGUIDDlg.h" #include "MaxTraceDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif extern LONG MaxTraceEntries; typedef struct _GROUP_SESSION_PARAMS { CPtrArray *pGroupArray; CPtrArray *pSessionArray; HANDLE SessionDoneEventArray[MAX_LOG_SESSIONS]; } GROUP_SESSION_PARAMS, *PGROUP_SESSION_PARAMS; // CGroupSession IMPLEMENT_DYNCREATE(CGroupSession, CWinThread) BEGIN_MESSAGE_MAP(CGroupSession, CWinThread) ON_MESSAGE(WM_USER_START_GROUP, OnGroupSession) ON_MESSAGE(WM_USER_START_UNGROUP, OnUnGroupSession) END_MESSAGE_MAP() BOOL CGroupSession::InitInstance() { // // Create the event handles // for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) { m_hEventArray[ii] = CreateEvent(NULL, FALSE, FALSE, NULL); } return TRUE; } int CGroupSession::ExitInstance() { // // Release the handles // for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) { CloseHandle(m_hEventArray[ii]); } return 0; } void CGroupSession::OnGroupSession(WPARAM wParam, LPARAM lParam) { PGROUP_SESSION_PARAMS pSessionParams = (PGROUP_SESSION_PARAMS)wParam; CDisplayDlg *pDisplayDlg = NULL; CString str; LONG numberOfEvents = (LONG)pSessionParams->pGroupArray->GetSize(); // // Wait on all sessions to end // DWORD status = WaitForMultipleObjects(numberOfEvents, pSessionParams->SessionDoneEventArray, TRUE, INFINITE); for(LONG ii = (LONG)pSessionParams->pGroupArray->GetSize() - 1; ii >= 0 ; ii--) { pDisplayDlg = (CDisplayDlg *)pSessionParams->pGroupArray->GetAt(ii); if(pDisplayDlg == NULL) { continue; } // // If the group has only one member, we don't need to save it, it // won't get restarted // if(pDisplayDlg->m_sessionArray.GetSize() <= 1) { pSessionParams->pGroupArray->RemoveAt(ii); } } ::PostMessage(m_hMainWnd, WM_USER_COMPLETE_GROUP, (WPARAM)pSessionParams, 0); } void CGroupSession::OnUnGroupSession(WPARAM wParam, LPARAM lParam) { PGROUP_SESSION_PARAMS pSessionParams = (PGROUP_SESSION_PARAMS)wParam; CLogSession *pLogSession; BOOL bWasActive = FALSE; CString str; CDisplayDlg *pDisplayDlg; LONG numberOfEvents = (LONG)pSessionParams->pGroupArray->GetSize(); // // Wait on all sessions to end // DWORD status = WaitForMultipleObjects(numberOfEvents, pSessionParams->SessionDoneEventArray, TRUE, INFINITE); ::PostMessage(m_hMainWnd, WM_USER_COMPLETE_UNGROUP, (WPARAM)pSessionParams, 0); } // CMainFrame IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_MESSAGE(WM_USER_UPDATE_LOGSESSION_LIST, OnUpdateLogSessionList) ON_MESSAGE(WM_USER_COMPLETE_GROUP, OnCompleteGroup) ON_MESSAGE(WM_USER_COMPLETE_UNGROUP, OnCompleteUnGroup) ON_WM_CREATE() ON_WM_SETFOCUS() ON_COMMAND(ID_FILE_NEWLOGSESSION, OnFileNewLogSession) ON_COMMAND(ID_CREATENEWLOGSESSION, OnCreateNewLogSession) ON_COMMAND(ID_SET_TMAX, OnSetTmax) ON_COMMAND(ID_PROPERTIES, OnProperties) ON_UPDATE_COMMAND_UI(ID_PROPERTIES, OnUpdateProperties) ON_COMMAND(ID_START_TRACE_BUTTON, OnStartTrace) ON_COMMAND(ID__STARTTRACE, OnStartTrace) ON_COMMAND(ID_STOP_TRACE_BUTTON, OnStopTrace) ON_COMMAND(ID__STOPTRACE, OnStopTrace) #if 0 ON_UPDATE_COMMAND_UI(ID_START_TRACE_BUTTON, OnUpdateStartTraceButton) ON_UPDATE_COMMAND_UI(ID_STOP_TRACE_BUTTON, OnUpdateStopTraceButton) ON_UPDATE_COMMAND_UI(ID_VIEW_TRACETOOLBAR, OnUpdateViewTraceToolBar) ON_COMMAND(ID_VIEW_TRACETOOLBAR, OnViewTraceToolBar) #endif ON_COMMAND(ID_GROUPSESSIONS, OnGroupSessions) ON_COMMAND(ID_UNGROUPSESSIONS, OnUngroupSessions) ON_COMMAND(ID_REMOVETRACE, OnRemoveLogSession) ON_UPDATE_COMMAND_UI(ID_GROUPSESSIONS, OnUpdateUIGroupSessions) ON_UPDATE_COMMAND_UI(ID_UNGROUPSESSIONS, OnUpdateUngroupSessions) ON_UPDATE_COMMAND_UI(ID__STARTTRACE, OnUpdateUIStartTrace) ON_UPDATE_COMMAND_UI(ID__STOPTRACE, OnUpdateUIStopTrace) ON_UPDATE_COMMAND_UI(147, OnUpdateUIOpenExisting) ON_COMMAND(ID__OPENEXISTINGLOGFILE, OnOpenExisting) ON_COMMAND(ID_FILE_OPENEXISTINGLOGFILE, OnOpenExisting) ON_COMMAND(ID__FLAGS, OnFlagsColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__FLAGS, OnUpdateFlagsColumnDisplay) ON_COMMAND(ID__FLUSHTIME, OnFlushTimeColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__FLUSHTIME, OnUpdateFlushTimeColumnDisplayCheck) ON_COMMAND(ID__MAXBUFFERS, OnMaxBuffersColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__MAXBUFFERS, OnUpdateMaxBuffersColumnDisplayCheck) ON_COMMAND(ID__MINBUFFERS, OnMinBuffersColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__MINBUFFERS, OnUpdateMinBuffersColumnDisplayCheck) ON_COMMAND(ID__BUFFERSIZE, OnBufferSizeColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__BUFFERSIZE, OnUpdateBufferSizeColumnDisplayCheck) ON_COMMAND(ID__AGE, OnDecayTimeColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__AGE, OnUpdateDecayTimeColumnDisplayCheck) ON_COMMAND(ID__CIRCULAR, OnCircularColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__CIRCULAR, OnUpdateCircularColumnDisplayCheck) ON_COMMAND(ID__SEQUENTIAL, OnSequentialColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__SEQUENTIAL, OnUpdateSequentialColumnDisplayCheck) ON_COMMAND(ID__NEWFILE, OnNewFileColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__NEWFILE, OnUpdateNewFileColumnDisplayCheck) ON_COMMAND(ID__GLOBALSEQUENCE, OnGlobalSeqColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__GLOBALSEQUENCE, OnUpdateGlobalSeqColumnDisplayCheck) ON_COMMAND(ID__LOCALSEQUENCE, OnLocalSeqColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__LOCALSEQUENCE, OnUpdateLocalSeqColumnDisplayCheck) ON_COMMAND(ID__LEVEL, OnLevelColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__LEVEL, OnUpdateLevelColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID_REMOVETRACE, OnUpdateRemoveTrace) ON_COMMAND(ID__STATE, OnStateColumnDisplayCheck) ON_COMMAND(ID__EVENTCOUNT, OnEventCountColumnDisplayCheck) ON_COMMAND(ID__LOSTEVENTS, OnLostEventsColumnDisplayCheck) ON_COMMAND(ID__BUFFERSREAD, OnBuffersReadColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__STATE, OnUpdateStateColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__EVENTCOUNT, OnUpdateEventCountColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__LOSTEVENTS, OnUpdateLostEventsColumnDisplayCheck) ON_UPDATE_COMMAND_UI(ID__BUFFERSREAD, OnUpdateBuffersReadColumnDisplayCheck) ON_COMMAND(ID__LOGSESSIONDISPLAYOPTIONS, OnLogSessionDisplayOptions) ON_COMMAND(ID__CHANGETEXTCOLOR, OnChangeTextColor) ON_COMMAND(ID__CHANGEBACKGROUNDCOLOR, OnChangeBackgroundColor) ON_UPDATE_COMMAND_UI(ID__CHANGETEXTCOLOR, OnUpdateChangeTextColor) ON_UPDATE_COMMAND_UI(ID__CHANGEBACKGROUNDCOLOR, OnUpdateChangeBackgroundColor) ON_UPDATE_COMMAND_UI(ID_SET_TMAX, OnUpdateSetTmax) END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; // CMainFrame construction/destruction CMainFrame::CMainFrame() { m_hEndTraceEvent = CreateEvent(NULL, FALSE, FALSE, NULL); } CMainFrame::~CMainFrame() { delete []m_pGroupSessionsThread; } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { DWORD extendedStyles; CString str; RECT rc; int height; HMODULE hTestHandle; if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // // Make sure that the msvcr70.dll is available, and if not error out // hTestHandle = LoadLibraryEx(_T("msvcr70.dll"), NULL, 0); if(hTestHandle == NULL) { AfxMessageBox(_T("MISSING NECESSARY DLL: MSVCR70.DLL")); return -1; } FreeLibrary(hTestHandle); // // Make sure that the msvcr70.dll is available, and if not error out // hTestHandle = LoadLibraryEx(_T("mspdb70.dll"), NULL, 0); if(hTestHandle == NULL) { AfxMessageBox(_T("MISSING NECESSARY DLL: MSPDB70.DLL")); return -1; } FreeLibrary(hTestHandle); // // Spawn a thread to handle grouping and ungrouping sessions // m_pGroupSessionsThread = (CGroupSession *)AfxBeginThread(RUNTIME_CLASS(CGroupSession)); m_pGroupSessionsThread->m_hMainWnd = GetSafeHwnd(); // // create a view to occupy the client area of the frame // if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL)) { TRACE(_T("Failed to create view window\n")); return -1; } #if 0 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE(_T("Failed to create toolbar\n")); // // fail to create // return -1; } if (!m_wndTraceToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndTraceToolBar.LoadToolBar(IDR_TRACE_TOOLBAR)) { TRACE(_T("Failed to create toolbar\n")); // // fail to create // return -1; } #endif if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE(_T("Failed to create status bar\n")); // // fail to create // return -1; } #if 0 // // toolbars are dockable // m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); m_wndTraceToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBarLeftOf(&m_wndTraceToolBar, &m_wndToolBar); #endif EnableDocking(CBRS_ALIGN_ANY); str.Format(_T("Log Session List")); // // create our dockable dialog bar with list control // We always create one, which is our log session list display // if (!m_wndLogSessionListBar.Create(this, &m_logSessionDlg, str, IDD_DISPLAY_DIALOG, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC)) { TRACE(_T("Failed to create log session list DockDialogBar\n")); return -1; } // // make the dialog dockable and dock it to the bottom originally. // m_wndLogSessionListBar.EnableDocking(CBRS_ALIGN_TOP); // //EnableDocking(CBRS_ALIGN_ANY); // DockControlBar(&m_wndLogSessionListBar, AFX_IDW_DOCKBAR_TOP); // // Go ahead and create the first column header // str.Format(_T("Group ID / Session Name")); m_logSessionDlg.m_displayCtrl.InsertColumn(0, str, LVCFMT_LEFT, 180); // // set our preferred extended styles // extendedStyles = LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT; // // Set the extended styles for the list control // m_logSessionDlg.m_displayCtrl.SetExtendedStyle(extendedStyles); // // resize our main window // GetWindowRect(&rc); height = rc.bottom - rc.top; GetClientRect(&rc); height -= rc.bottom - rc.top; #if 0 m_wndToolBar.GetWindowRect(&rc); height += rc.bottom - rc.top; #endif m_logSessionDlg.m_displayCtrl.GetWindowRect(&rc); height += rc.bottom - rc.top + 432; GetWindowRect(&rc); SetWindowPos(&wndBottom, 0, 0, rc.right - rc.left + 76, height, SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_SHOWWINDOW); return 0; } void CMainFrame::DockControlBarLeftOf(CToolBar* Bar, CToolBar* LeftOf) { CRect rect; DWORD dw; UINT n; // // get MFC to adjust the dimensions of all docked ToolBars // so that GetWindowRect will be accurate // RecalcLayout(TRUE); LeftOf->GetWindowRect(&rect); rect.OffsetRect(1,0); dw=LeftOf->GetBarStyle(); n = 0; n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n; n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n; n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n; n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n; // // When we take the default parameters on rect, DockControlBar will dock // each Toolbar on a seperate line. By calculating a rectangle, we // are simulating a Toolbar being dragged to that location and docked. // DockControlBar(Bar,n,&rect); RecalcLayout(TRUE); } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.dwExStyle &= ~WS_EX_CLIENTEDGE; cs.lpszClass = AfxRegisterWndClass(0); return TRUE; } // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG // CMainFrame message handlers void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/) { // forward focus to the view window //m_wndView.SetFocus(); } BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { // // // return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } void CMainFrame::OnFileNewLogSession() { AddModifyLogSession(); } void CMainFrame::OnCreateNewLogSession() { AddModifyLogSession(); } void CMainFrame::AddModifyLogSession(CLogSession *pLogSession) { BOOL bAddingSession = FALSE; CString str; DWORD extendedStyles; INT_PTR retVal; CLogSession *pLog; BOOL bNoID = FALSE; LONG logSessionID = 0; CDisplayDlg *pDisplayDlg; // // if this is a new session, create the instance // if(NULL == pLogSession) { // // Get a unique log session ID // logSessionID = m_logSessionDlg.GetLogSessionID(); pLogSession = new CLogSession(logSessionID, &m_logSessionDlg); if(NULL == pLogSession) { AfxMessageBox(_T("Unable To Create Log Session")); return; } bAddingSession = TRUE; } // // pop-up our wizard/tab dialog to show/get properties // CLogSessionPropSht *pLogSessionPropertySheet = new CLogSessionPropSht(this, pLogSession); if(NULL == pLogSessionPropertySheet) { if(bAddingSession) { AfxMessageBox(_T("Failed To Create Log Session, Resource Error")); m_logSessionDlg.ReleaseLogSessionID(pLogSession); delete pLogSession; } return; } if(bAddingSession) { pLogSessionPropertySheet->SetWizardMode(); } retVal = pLogSessionPropertySheet->DoModal(); if(IDOK != retVal) { if(bAddingSession) { if(IDCANCEL != retVal) { AfxMessageBox(_T("Failed To Get Log Session Properties")); } m_logSessionDlg.ReleaseLogSessionID(pLogSession); delete pLogSession; } delete pLogSessionPropertySheet; return; } if(!pLogSession->m_bTraceActive) { if(bAddingSession) { // // Check that we have at least one provider // if(0 == pLogSession->m_traceSessionArray.GetSize()) { AfxMessageBox(_T("No Providers Registered\nLog Session Initialization Failed")); m_logSessionDlg.ReleaseLogSessionID(pLogSession); delete pLogSession; delete pLogSessionPropertySheet; return; } // // Add the session to the list of log sessions // m_logSessionDlg.AddSession(pLogSession); // // Get the display window for the log session // pDisplayDlg = pLogSession->GetDisplayWnd(); ASSERT(pDisplayDlg != NULL); // // Set the output file info for the display dialog // pDisplayDlg->m_bWriteListingFile = pLogSessionPropertySheet->m_bWriteListingFile; if(pDisplayDlg->m_bWriteListingFile) { pDisplayDlg->m_listingFileName = pLogSessionPropertySheet->m_listingFileName; } pDisplayDlg->m_bWriteSummaryFile = pLogSessionPropertySheet->m_bWriteSummaryFile; if(pDisplayDlg->m_bWriteSummaryFile) { pDisplayDlg->m_summaryFileName = pLogSessionPropertySheet->m_summaryFileName; } // // Start the log session tracing // pDisplayDlg->BeginTrace(); // // Force a redraw of the list control // m_logSessionDlg.m_displayCtrl.RedrawItems( m_logSessionDlg.m_displayCtrl.GetTopIndex(), m_logSessionDlg.m_displayCtrl.GetTopIndex() + m_logSessionDlg.m_displayCtrl.GetCountPerPage()); m_logSessionDlg.m_displayCtrl.UpdateWindow(); } else { m_logSessionDlg.UpdateSession(pLogSession); } } else { m_logSessionDlg.UpdateSession(pLogSession); } delete pLogSessionPropertySheet; } void CMainFrame::OnProperties() { POSITION pos; LONG index; CLogSession *pLogSession; INT_PTR retVal; pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); if((index < 0) || (index >= m_logSessionDlg.m_logSessionArray.GetSize())) { AfxMessageBox(_T("Error Log Session Not Found!")); // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); return; } pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if(NULL == pLogSession) { return; } if(pLogSession->m_bDisplayExistingLogFileOnly) { // // pop-up our wizard/tab dialog to show/get properties // CLogFileDlg *pDialog = new CLogFileDlg(this, pLogSession); if(NULL == pDialog) { return; } retVal = pDialog->DoModal(); delete pDialog; if(IDOK != retVal) { if(IDCANCEL != retVal) { AfxMessageBox(_T("Failed To Get Log File Properties")); } return; } // // Now update the session // m_logSessionDlg.UpdateSession(pLogSession); return; } AddModifyLogSession(pLogSession); } void CMainFrame::OnUpdateProperties(CCmdUI *pCmdUI) { POSITION pos; int index; CLogSession *pLogSession; // // Taking this out altogether for now, but leaving it in // the code in case it needs to be put back // pCmdUI->Enable(FALSE); return; // // disable the properties option if there is more // than one selected log session // if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 1) { pCmdUI->Enable(FALSE); } // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); // // If the session is in process of stopping, don't allow the // properties dialog to be viewed // if((NULL == pLogSession) || (pLogSession->m_bStoppingTrace)) { pCmdUI->Enable(FALSE); } } void CMainFrame::OnStartTrace() { POSITION pos; LONG index; CLogSession *pLogSession; CDisplayDlg *pDisplayDlg; pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if(NULL == pLogSession) { continue; } pDisplayDlg = pLogSession->GetDisplayWnd(); ASSERT(pDisplayDlg != NULL); pDisplayDlg->BeginTrace(); } // // Force a redraw of the list control // m_logSessionDlg.m_displayCtrl.RedrawItems( m_logSessionDlg.m_displayCtrl.GetTopIndex(), m_logSessionDlg.m_displayCtrl.GetTopIndex() + m_logSessionDlg.m_displayCtrl.GetCountPerPage()); m_logSessionDlg.m_displayCtrl.UpdateWindow(); } #if 0 void CMainFrame::OnUpdateStartTraceButton(CCmdUI *pCmdUI) { POSITION pos; int index; CLogSession *pLogSession; BOOL bFound = FALSE; if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() == 0) { pCmdUI->Enable(FALSE); return; } pCmdUI->Enable(TRUE); // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) { break; } pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; if(pLogSession != NULL) { bFound = TRUE; if(pLogSession->m_bTraceActive) { pCmdUI->Enable(FALSE); break; } } } // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if(!bFound) { pCmdUI->Enable(FALSE); } } void CMainFrame::OnUpdateStopTraceButton(CCmdUI *pCmdUI) { POSITION pos; int index; CLogSession *pLogSession; pCmdUI->Enable(FALSE); // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) { pCmdUI->Enable(TRUE); pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) { pCmdUI->Enable(FALSE); break; } pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; if((pLogSession == NULL) || (!pLogSession->m_bTraceActive) || (pLogSession->m_bStoppingTrace)) { pCmdUI->Enable(FALSE); break; } } } // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); } void CMainFrame::OnUpdateViewTraceToolBar(CCmdUI *pCmdUI) { pCmdUI->SetCheck((m_wndTraceToolBar.IsWindowVisible()) != 0); } void CMainFrame::OnViewTraceToolBar() { // // toggle visible state // m_wndTraceToolBar.ShowWindow((m_wndTraceToolBar.IsWindowVisible()) == 0); RecalcLayout(); } #endif void CMainFrame::OnStopTrace() { POSITION pos; LONG index; CLogSession *pLogSession; pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if((pLogSession != NULL) && (pLogSession->m_bTraceActive)) { // // Stop tracing // pLogSession->GetDisplayWnd()->EndTrace(); } } } void CMainFrame::OnGroupSessions() { POSITION pos; int index; CLogSession *pLogSession; BOOL bFound = FALSE; CLogSession *pLog = NULL; BOOL bWasActive = FALSE; COLORREF textColor; COLORREF backgroundColor; CString str; CDisplayDlg *pDisplayDlg; CPtrArray *pLogSessionArray; CPtrArray *pGroupArray; PGROUP_SESSION_PARAMS pSessionParams; // // Can't group one session // if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() == 1) { return; } // // Allocate arrays // pLogSessionArray = new CPtrArray(); // // Make sure allocation succeeded // if(NULL == pLogSessionArray) { AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure")); return; } pGroupArray = new CPtrArray(); // // Make sure allocation succeeded // if(NULL == pGroupArray) { AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure")); delete pLogSessionArray; return; } // // Allocate our structure // pSessionParams = (PGROUP_SESSION_PARAMS)new CHAR[sizeof(GROUP_SESSION_PARAMS)]; // // Make sure allocation succeeded // if(NULL == pSessionParams) { AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure")); delete pLogSessionArray; delete pGroupArray; return; } // // Setup the params struct // pSessionParams->pGroupArray = pGroupArray; pSessionParams->pSessionArray = pLogSessionArray; for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) { pSessionParams->SessionDoneEventArray[ii] = CreateEvent(NULL, FALSE, FALSE, NULL); } // // Now walk through the selected sessions and put them in an array // pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); // // Get the index of the next selected item // index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); // // Get the next log session // pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if(pLogSession == NULL) { continue; } // // Add the session to the array // pLogSessionArray->Add(pLogSession); // // Get the group display dialog for the session // pDisplayDlg = pLogSession->GetDisplayWnd(); // // Set the state of the groups // pDisplayDlg->SetState(Grouping); // // Attempt to Stop the group // if(pDisplayDlg->EndTrace(pSessionParams->SessionDoneEventArray[pGroupArray->GetSize()])) { // // If stopped save the pointer to possibly start later // pGroupArray->Add(pDisplayDlg); } } if(pLogSessionArray->GetSize() > 1) { m_pGroupSessionsThread->PostThreadMessage(WM_USER_START_GROUP, (WPARAM)pSessionParams, 0); return; } // // Cleanup our allocations // delete pLogSessionArray; delete pGroupArray; for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) { CloseHandle(pSessionParams->SessionDoneEventArray[ii]); } delete [] pSessionParams; } void CMainFrame::OnCompleteGroup(WPARAM wParam, LPARAM lParam) { PGROUP_SESSION_PARAMS pSessionParams = (PGROUP_SESSION_PARAMS)wParam; CPtrArray *pGroupArray = pSessionParams->pGroupArray; CPtrArray *pLogSessionArray = pSessionParams->pSessionArray; CDisplayDlg *pDisplayDlg = NULL; // // Group the log sessions in a new group // m_logSessionDlg.GroupSessions(pLogSessionArray); // // Now restart any of the groups that we stopped previously // that are still around // while(pGroupArray->GetSize()) { // // Get the first entry in the array // pDisplayDlg = (CDisplayDlg *)pGroupArray->GetAt(0); pGroupArray->RemoveAt(0); // // Get the trace display window array protection // WaitForSingleObject(m_logSessionDlg.m_traceDisplayWndMutex, INFINITE); // // See if the group still exists and start it back up if so // for(LONG ii = 0; ii < m_logSessionDlg.m_traceDisplayWndArray.GetSize(); ii++) { if(pDisplayDlg == m_logSessionDlg.m_traceDisplayWndArray[ii]) { pDisplayDlg->BeginTrace(); } } // // Release the trace display window array protection // ReleaseMutex(m_logSessionDlg.m_traceDisplayWndMutex); } // // Cleanup our allocations // delete pLogSessionArray; delete pGroupArray; for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) { CloseHandle(pSessionParams->SessionDoneEventArray[ii]); } delete [] pSessionParams; } void CMainFrame::OnUngroupSessions() { POSITION pos; int index; CLogSession *pLogSession; CString str; CDisplayDlg *pDisplayDlg; BOOL bWasActive = FALSE; CPtrArray *pLogSessionArray; CPtrArray *pGroupArray; PGROUP_SESSION_PARAMS pSessionParams; // // Allocate arrays // pLogSessionArray = new CPtrArray(); // // Make sure allocation succeeded // if(NULL == pLogSessionArray) { AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure")); return; } pGroupArray = new CPtrArray(); // // Make sure allocation succeeded // if(NULL == pGroupArray) { AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure")); delete pLogSessionArray; return; } // // Allocate our structure // pSessionParams = (PGROUP_SESSION_PARAMS)new CHAR[sizeof(GROUP_SESSION_PARAMS)]; // // Make sure allocation succeeded // if(NULL == pSessionParams) { AfxMessageBox(_T("Unable To Group Sessions, Memory Allocation Failure")); delete pLogSessionArray; delete pGroupArray; return; } // // Setup the params struct // pSessionParams->pGroupArray = pGroupArray; pSessionParams->pSessionArray = pLogSessionArray; for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) { pSessionParams->SessionDoneEventArray[ii] = CreateEvent(NULL, FALSE, FALSE, NULL); } // // Walk selected sessions and check if they are grouped // pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if(pLogSession == NULL) { continue; } // // Get the display wnd for the session // pDisplayDlg = pLogSession->GetDisplayWnd(); if(NULL == pDisplayDlg) { continue; } // // Set the state of the groups // pDisplayDlg->SetState(UnGrouping); // // Store each log session in the array // pLogSessionArray->Add(pLogSession); // // Stop the group, and if stopped store it to possibly be // started again later // if(pDisplayDlg->EndTrace(pSessionParams->SessionDoneEventArray[pGroupArray->GetSize()])) { pGroupArray->Add(pDisplayDlg); } } m_pGroupSessionsThread->PostThreadMessage(WM_USER_START_UNGROUP, (WPARAM)pSessionParams, 0); return; } void CMainFrame::OnCompleteUnGroup(WPARAM wParam, LPARAM lParam) { PGROUP_SESSION_PARAMS pSessionParams = (PGROUP_SESSION_PARAMS)wParam; CPtrArray *pGroupArray = pSessionParams->pGroupArray; CPtrArray *pLogSessionArray = pSessionParams->pSessionArray; CDisplayDlg *pDisplayDlg = NULL; // // Group the log sessions in a new group // m_logSessionDlg.UnGroupSessions(pLogSessionArray); // // Now restart any of the groups that we stopped previously // that are still around // while(pGroupArray->GetSize()) { // // Get the first entry in the array // pDisplayDlg = (CDisplayDlg *)pGroupArray->GetAt(0); pGroupArray->RemoveAt(0); // // Get the trace display window array protection // WaitForSingleObject(m_logSessionDlg.m_traceDisplayWndMutex, INFINITE); // // See if the group still exists and start it back up if so // for(LONG ii = 0; ii < m_logSessionDlg.m_traceDisplayWndArray.GetSize(); ii++) { if(pDisplayDlg == m_logSessionDlg.m_traceDisplayWndArray[ii]) { pDisplayDlg->BeginTrace(); } } // // Release the trace display window array protection // ReleaseMutex(m_logSessionDlg.m_traceDisplayWndMutex); } // // Cleanup our allocations // delete pLogSessionArray; delete pGroupArray; for(LONG ii = 0; ii < MAX_LOG_SESSIONS; ii++) { CloseHandle(pSessionParams->SessionDoneEventArray[ii]); } delete [] pSessionParams; } void CMainFrame::OnRemoveLogSession() { m_logSessionDlg.RemoveSelectedLogSessions(); } void CMainFrame::OnUpdateUIGroupSessions(CCmdUI *pCmdUI) { POSITION pos; int index; CLogSession *pLogSession; CString str; OSVERSIONINFO osVersion; BOOL bOpenExisting = FALSE; BOOL bActiveTracing = FALSE; BOOL bDifferentGroups = FALSE; LONG groupNumber = -1; // // Default to enabled // pCmdUI->Enable(TRUE); // // disable the group option if there are not multiple groups // if(m_logSessionDlg.m_traceDisplayWndArray.GetSize() == 1) { pCmdUI->Enable(FALSE); return; } // // disable the group option if multiple sessions are not // selected // if(0 == m_logSessionDlg.m_displayCtrl.GetSelectedCount()) { pCmdUI->Enable(FALSE); return; } // // Make sure all selected sessions are of the same // type, that is active tracing or open exisiting logfile. // pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if(pLogSession != NULL) { // // If any session is not grouped, in the process of stopping, // or in the process of grouping or ungrouping already, // don't allow ungrouping // if((pLogSession->m_bStoppingTrace) || (pLogSession->m_bGroupingTrace)) { pCmdUI->Enable(FALSE); return; } // // Check the group numbers // if(groupNumber == -1) { groupNumber = pLogSession->GetGroupID(); } if(groupNumber != pLogSession->GetGroupID()) { bDifferentGroups = TRUE; } if(pLogSession->m_bDisplayExistingLogFileOnly) { // // Opened an existing log file // bOpenExisting = TRUE; } else { // // Active tracing sessions can only be // grouped on .Net and later, so we need to check // the OS version. .Net: Major = 5 Minor = 2. // // // call GetVersionEx using the OSVERSIONINFO structure, // ZeroMemory(&osVersion, sizeof(OSVERSIONINFO)); osVersion.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if(GetVersionEx((OSVERSIONINFO *)&osVersion)) { // // Make sure we are on .NET or later to group // real-time sessions // if(osVersion.dwMajorVersion < 5) { pCmdUI->Enable(FALSE); return; } if(osVersion.dwMinorVersion < 2) { pCmdUI->Enable(FALSE); return; } } bActiveTracing = TRUE; } } } // // Make sure there are multiple groups represented // if(!bDifferentGroups) { pCmdUI->Enable(FALSE); return; } // // Make sure that the log session types aren't mixed // if(bActiveTracing && bOpenExisting) { pCmdUI->Enable(FALSE); return; } } void CMainFrame::OnUpdateUngroupSessions(CCmdUI *pCmdUI) { POSITION pos; int index; CLogSession *pLogSession; CString str; // // Default to enabled // pCmdUI->Enable(TRUE); // // Walk selected sessions and check if they are grouped // pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if(pLogSession == NULL) { continue; } // // If any session is not grouped, in the process of stopping, // or in the process of grouping or ungrouping already, // don't allow ungrouping // if((pLogSession->GetDisplayWnd()->m_sessionArray.GetSize() == 1) || (pLogSession->m_bStoppingTrace) || (pLogSession->m_bGroupingTrace)) { pCmdUI->Enable(FALSE); return; } } } void CMainFrame::OnUpdateUIStartTrace(CCmdUI *pCmdUI) { POSITION pos; int index; CLogSession *pLogSession; BOOL bFound = FALSE; if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() != 1) { pCmdUI->Enable(FALSE); return; } pCmdUI->Enable(TRUE); pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); if(pLogSession != NULL) { bFound = TRUE; if((pLogSession->m_bTraceActive) || (pLogSession->m_bDisplayExistingLogFileOnly)) { pCmdUI->Enable(FALSE); break; } } } if(!bFound) { pCmdUI->Enable(FALSE); } } void CMainFrame::OnUpdateUIStopTrace(CCmdUI *pCmdUI) { POSITION pos; int index; CLogSession *pLogSession; pCmdUI->Enable(FALSE); // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); // // Don't allow stop if more than one session is selected // if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 1) { pCmdUI->Enable(FALSE); // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); return; } if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) { // // Default to enabling the stop option // pCmdUI->Enable(TRUE); pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) { // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); pCmdUI->Enable(FALSE); return; } pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); // // If no session is found, disable the stop option // // If the session is not active, is already being stopped, // or is for an existing logfile then disable the // stop option. // // Don't allow stop if the session was started outside of // traceview. We determine this by whether a valid handle // was obtained for the session. // if((pLogSession == NULL) || (!pLogSession->m_bTraceActive) || (pLogSession->m_bStoppingTrace) || (pLogSession->m_bDisplayExistingLogFileOnly) || (pLogSession->GetSessionHandle() == (TRACEHANDLE)INVALID_HANDLE_VALUE)) { pCmdUI->Enable(FALSE); } } } void CMainFrame::OnUpdateUIOpenExisting(CCmdUI *pCmdUI) { // // placeholder // } void CMainFrame::OnOpenExisting() { CLogSession *pLogSession = NULL; CString str; LONG newDisplayFlags = 0; LONG newColumnDisplayFlags; LONG logSessionDisplayFlags; CDisplayDlg *pDisplayDlg; DWORD extendedStyles; INT_PTR retVal; CLogSession *pLog; BOOL bNoID; LONG logSessionID = 0; CString extension; CString traceDirectory; LONG traceSessionID = 0; // // Get a unique ID for the session // logSessionID = m_logSessionDlg.GetLogSessionID(); // // Create an instance of the logsession class // pLogSession = new CLogSession(logSessionID, &m_logSessionDlg); if(NULL == pLogSession) { AfxMessageBox(_T("Unable To Create Log Session")); return; } // // Indicate the log session is not tracing real time // pLogSession->m_bRealTime = FALSE; // // Indicate the log session is only displaying an existing log session // pLogSession->m_bDisplayExistingLogFileOnly = TRUE; // // Clear the log file name so the user has to select // pLogSession->m_logFileName.Empty(); // // pop-up our wizard/tab dialog to show/get properties // CLogFileDlg *pDialog = new CLogFileDlg(this, pLogSession); if(NULL == pDialog) { AfxMessageBox(_T("Failed To Create Log File Session, Resource Error")); m_logSessionDlg.RemoveSession(pLogSession); delete pLogSession; return; } retVal = pDialog->DoModal(); if(IDOK != retVal) { if(IDCANCEL != retVal) { AfxMessageBox(_T("Failed To Get Log File Properties")); } m_logSessionDlg.RemoveSession(pLogSession); delete pDialog; delete pLogSession; return; } CTraceSession *pTraceSession = new CTraceSession(0); if(NULL == pTraceSession) { AfxMessageBox(_T("Failed To Process Log File")); m_logSessionDlg.RemoveSession(pLogSession); delete pDialog; delete pLogSession; return; } // // put the default trace session in the list // pLogSession->m_traceSessionArray.Add(pTraceSession); // // Now get the format info, prompt user for PDB or TMF // CProviderFormatSelectionDlg *pFormatDialog = new CProviderFormatSelectionDlg(this, pTraceSession); if(NULL == pFormatDialog) { AfxMessageBox(_T("Failed To Process Log File")); m_logSessionDlg.RemoveSession(pLogSession); delete pDialog; delete pLogSession; return; } if(IDOK != pFormatDialog->DoModal()) { delete pFormatDialog; m_logSessionDlg.RemoveSession(pLogSession); delete pDialog; delete pLogSession; return; } delete pFormatDialog; // // Now add the log session to the log session list // m_logSessionDlg.AddSession(pLogSession); // // Get the display dialog // pDisplayDlg = pLogSession->GetDisplayWnd(); // // Get the listing file name if selected from dialog // if(pDisplayDlg->m_bWriteListingFile = pDialog->m_bWriteListingFile) { pDisplayDlg->m_listingFileName = pDialog->m_listingFileName; } // // Get the summary file name if selected from dialog // if(pDisplayDlg->m_bWriteSummaryFile = pDialog->m_bWriteSummaryFile) { pDisplayDlg->m_summaryFileName = pDialog->m_summaryFileName; } delete pDialog; // // Now trace the contents of the logfile // pDisplayDlg->BeginTrace(); // // Force a redraw of the list control // m_logSessionDlg.m_displayCtrl.RedrawItems( m_logSessionDlg.m_displayCtrl.GetTopIndex(), m_logSessionDlg.m_displayCtrl.GetTopIndex() + m_logSessionDlg.m_displayCtrl.GetCountPerPage()); m_logSessionDlg.m_displayCtrl.UpdateWindow(); } void CMainFrame::OnStateColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_STATE) { flags &= ~LOGSESSION_DISPLAY_STATE; } else { flags |= LOGSESSION_DISPLAY_STATE; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnEventCountColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_EVENTCOUNT) { flags &= ~LOGSESSION_DISPLAY_EVENTCOUNT; } else { flags |= LOGSESSION_DISPLAY_EVENTCOUNT; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnLostEventsColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_LOSTEVENTS) { flags &= ~LOGSESSION_DISPLAY_LOSTEVENTS; } else { flags |= LOGSESSION_DISPLAY_LOSTEVENTS; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnBuffersReadColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_BUFFERSREAD) { flags &= ~LOGSESSION_DISPLAY_BUFFERSREAD; } else { flags |= LOGSESSION_DISPLAY_BUFFERSREAD; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateStateColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_STATE) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnUpdateEventCountColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_EVENTCOUNT) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnUpdateLostEventsColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_LOSTEVENTS) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnUpdateBuffersReadColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_BUFFERSREAD) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnFlagsColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_FLAGS) { flags &= ~LOGSESSION_DISPLAY_FLAGS; } else { flags |= LOGSESSION_DISPLAY_FLAGS; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateFlagsColumnDisplay(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_FLAGS) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnFlushTimeColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_FLUSHTIME) { flags &= ~LOGSESSION_DISPLAY_FLUSHTIME; } else { flags |= LOGSESSION_DISPLAY_FLUSHTIME; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateFlushTimeColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_FLUSHTIME) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnMaxBuffersColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_MAXBUF) { flags &= ~LOGSESSION_DISPLAY_MAXBUF; } else { flags |= LOGSESSION_DISPLAY_MAXBUF; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateMaxBuffersColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_MAXBUF) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnMinBuffersColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_MINBUF) { flags &= ~LOGSESSION_DISPLAY_MINBUF; } else { flags |= LOGSESSION_DISPLAY_MINBUF; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateMinBuffersColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_MINBUF) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnBufferSizeColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_BUFFERSIZE) { flags &= ~LOGSESSION_DISPLAY_BUFFERSIZE; } else { flags |= LOGSESSION_DISPLAY_BUFFERSIZE; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateBufferSizeColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_BUFFERSIZE) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnDecayTimeColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_DECAYTIME) { flags &= ~LOGSESSION_DISPLAY_DECAYTIME; } else { flags |= LOGSESSION_DISPLAY_DECAYTIME; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateDecayTimeColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_DECAYTIME) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnCircularColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_CIR) { flags &= ~LOGSESSION_DISPLAY_CIR; } else { flags |= LOGSESSION_DISPLAY_CIR; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateCircularColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_CIR) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnSequentialColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_SEQ) { flags &= ~LOGSESSION_DISPLAY_SEQ; } else { flags |= LOGSESSION_DISPLAY_SEQ; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateSequentialColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_SEQ) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnNewFileColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_NEWFILE) { flags &= ~LOGSESSION_DISPLAY_NEWFILE; } else { flags |= LOGSESSION_DISPLAY_NEWFILE; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateNewFileColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_NEWFILE) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnGlobalSeqColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_GLOBALSEQ) { flags &= ~LOGSESSION_DISPLAY_GLOBALSEQ; } else { flags |= LOGSESSION_DISPLAY_GLOBALSEQ; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateGlobalSeqColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_GLOBALSEQ) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnLocalSeqColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_LOCALSEQ) { flags &= ~LOGSESSION_DISPLAY_LOCALSEQ; } else { flags |= LOGSESSION_DISPLAY_LOCALSEQ; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateLocalSeqColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_LOCALSEQ) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnLevelColumnDisplayCheck() { LONG flags; flags = m_logSessionDlg.GetDisplayFlags(); if(flags & LOGSESSION_DISPLAY_LEVEL) { flags &= ~LOGSESSION_DISPLAY_LEVEL; } else { flags |= LOGSESSION_DISPLAY_LEVEL; } m_logSessionDlg.SetDisplayFlags(flags); } void CMainFrame::OnUpdateLevelColumnDisplayCheck(CCmdUI *pCmdUI) { if(m_logSessionDlg.GetDisplayFlags() & LOGSESSION_DISPLAY_LEVEL) { pCmdUI->SetCheck(TRUE); } else { pCmdUI->SetCheck(FALSE); } } void CMainFrame::OnUpdateRemoveTrace(CCmdUI *pCmdUI) { POSITION pos; int index; CLogSession *pLogSession; pCmdUI->Enable(FALSE); if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 1) { return; } // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) { pCmdUI->Enable(TRUE); pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); while(pos != NULL) { index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) { pCmdUI->Enable(FALSE); break; } pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; if((pLogSession == NULL) || pLogSession->m_bTraceActive || pLogSession->m_bStoppingTrace || pLogSession->m_bGroupingTrace || (pLogSession->GetDisplayWnd()->m_sessionArray.GetSize() > 1)) { pCmdUI->Enable(FALSE); break; } } } // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); } void CMainFrame::OnLogSessionDisplayOptions() { // // Just here to enable the menu item, nothing to do // } void CMainFrame::OnChangeTextColor() { if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) { CColorDialog colorDlg(0, 0, this); COLORREF color; POSITION pos; int index; CLogSession *pLogSession; if(IDOK == colorDlg.DoModal()) { color = colorDlg.GetColor(); } pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); while(pos != NULL) { index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) { break; } pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; if(pLogSession != NULL) { pLogSession->m_titleTextColor = color; m_logSessionDlg.m_displayCtrl.RedrawItems( m_logSessionDlg.m_displayCtrl.GetTopIndex(), m_logSessionDlg.m_displayCtrl.GetTopIndex() + m_logSessionDlg.m_displayCtrl.GetCountPerPage()); m_logSessionDlg.m_displayCtrl.UpdateWindow(); } } // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); } } void CMainFrame::OnChangeBackgroundColor() { if(m_logSessionDlg.m_displayCtrl.GetSelectedCount() > 0) { CColorDialog colorDlg(0, 0, this); COLORREF color; POSITION pos; int index; CLogSession *pLogSession; if(IDOK == colorDlg.DoModal()) { color = colorDlg.GetColor(); } pos = m_logSessionDlg.m_displayCtrl.GetFirstSelectedItemPosition(); // // Get the log session array protection // WaitForSingleObject(m_logSessionDlg.m_logSessionArrayMutex, INFINITE); while(pos != NULL) { index = m_logSessionDlg.m_displayCtrl.GetNextSelectedItem(pos); if(index >= m_logSessionDlg.m_logSessionArray.GetSize()) { break; } pLogSession = (CLogSession *)m_logSessionDlg.m_logSessionArray[index]; if(pLogSession != NULL) { pLogSession->m_titleBackgroundColor = color; m_logSessionDlg.m_displayCtrl.RedrawItems( m_logSessionDlg.m_displayCtrl.GetTopIndex(), m_logSessionDlg.m_displayCtrl.GetTopIndex() + m_logSessionDlg.m_displayCtrl.GetCountPerPage()); m_logSessionDlg.m_displayCtrl.UpdateWindow(); } } // // Release the log session array protection // ReleaseMutex(m_logSessionDlg.m_logSessionArrayMutex); } } void CMainFrame::OnUpdateChangeTextColor(CCmdUI *pCmdUI) { pCmdUI->Enable(FALSE); } void CMainFrame::OnUpdateChangeBackgroundColor(CCmdUI *pCmdUI) { pCmdUI->Enable(FALSE); } void CMainFrame::OnUpdateLogSessionList(WPARAM wParam, LPARAM lParam) { m_logSessionDlg.m_displayCtrl.RedrawItems( m_logSessionDlg.m_displayCtrl.GetTopIndex(), m_logSessionDlg.m_displayCtrl.GetTopIndex() + m_logSessionDlg.m_displayCtrl.GetCountPerPage()); m_logSessionDlg.m_displayCtrl.UpdateWindow(); } void CMainFrame::OnSetTmax() { // TODO: Add your command handler code here CMaxTraceDlg dlg; dlg.DoModal(); MaxTraceEntries = dlg.m_MaxTraceEntries; } void CMainFrame::OnUpdateSetTmax(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(); if( m_logSessionDlg.m_logSessionArray.GetSize() ) { pCmdUI->Enable(FALSE); } }