/*++ Copyright (C) 1998-1999 Microsoft Corporation Module Name: tracprop.cpp Abstract: Implementation of the advanced trace buffer property page. --*/ #include "stdafx.h" #include // for MIN_TIME_VALUE, MAX_TIME_VALUE #include "smcfgmsg.h" #include "smlogs.h" #include "smtraceq.h" #include "tracprop.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif static ULONG s_aulHelpIds[] = { IDC_TRACE_BUF_FLUSH_CHECK, IDH_TRACE_BUF_FLUSH_CHECK, IDC_TRACE_BUFFER_SIZE_EDIT, IDH_TRACE_BUFFER_SIZE_EDIT, IDC_TRACE_BUFFER_SIZE_SPIN, IDH_TRACE_BUFFER_SIZE_EDIT, IDC_TRACE_MIN_BUF_EDIT, IDH_TRACE_MIN_BUF_EDIT, IDC_TRACE_MIN_BUF_SPIN, IDH_TRACE_MIN_BUF_EDIT, IDC_TRACE_MAX_BUF_EDIT, IDH_TRACE_MAX_BUF_EDIT, IDC_TRACE_MAX_BUF_SPIN, IDH_TRACE_MAX_BUF_EDIT, IDC_TRACE_FLUSH_INT_EDIT, IDH_TRACE_FLUSH_INT_EDIT, IDC_TRACE_FLUSH_INT_SPIN, IDH_TRACE_FLUSH_INT_EDIT, 0,0 }; ///////////////////////////////////////////////////////////////////////////// // CTraceProperty property page IMPLEMENT_DYNCREATE(CTraceProperty, CSmPropertyPage) CTraceProperty::CTraceProperty(MMC_COOKIE lCookie, LONG_PTR hConsole) : CSmPropertyPage ( CTraceProperty::IDD, hConsole ) { // save pointers from arg list m_pTraceLogQuery = reinterpret_cast (lCookie); ASSERT ( m_pTraceLogQuery->CastToTraceLogQuery() ); m_pQuery = dynamic_cast (m_pTraceLogQuery); // EnableAutomation(); //{{AFX_DATA_INIT(CTraceProperty) m_dwBufferSize = 0; m_dwFlushInterval = 0; m_dwMaxBufCount = 0; m_dwMinBufCount = 0; m_bEnableBufferFlush = FALSE; //}}AFX_DATA_INIT } CTraceProperty::CTraceProperty() : CSmPropertyPage(CTraceProperty::IDD) { ASSERT (FALSE); // only the constructor w/args should be called EnableAutomation(); // //{{AFX_DATA_INIT(CTraceProperty) m_dwBufferSize = 0; m_dwFlushInterval = 0; m_dwMaxBufCount = 0; m_dwMinBufCount = 0; m_bEnableBufferFlush = FALSE; // //}}AFX_DATA_INIT } CTraceProperty::~CTraceProperty() { } void CTraceProperty::OnFinalRelease() { // When the last reference for an automation object is released // OnFinalRelease is called. The base class will automatically // deletes the object. Add additional cleanup required for your // object before calling the base class. CPropertyPage::OnFinalRelease(); } void CTraceProperty::DoDataExchange(CDataExchange* pDX) { CString strTemp; AFX_MANAGE_STATE(AfxGetStaticModuleState( )); CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTraceProperty) ValidateTextEdit(pDX, IDC_TRACE_BUFFER_SIZE_EDIT, 4, & m_dwBufferSize, eMinBufSize, eMaxBufSize); ValidateTextEdit(pDX, IDC_TRACE_FLUSH_INT_EDIT, 3, & m_dwFlushInterval, eMinFlushInt, eMaxFlushInt); ValidateTextEdit(pDX, IDC_TRACE_MAX_BUF_EDIT, 3, & m_dwMaxBufCount, eMinBufCount, eMaxBufCount); ValidateTextEdit(pDX, IDC_TRACE_MIN_BUF_EDIT, 3, & m_dwMinBufCount, eMinBufCount, eMaxBufCount); DDX_Check(pDX, IDC_TRACE_BUF_FLUSH_CHECK, m_bEnableBufferFlush); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTraceProperty, CSmPropertyPage) //{{AFX_MSG_MAP(CTraceProperty) ON_WM_DESTROY() ON_BN_CLICKED(IDC_TRACE_BUF_FLUSH_CHECK, OnTraceBufFlushCheck) ON_EN_CHANGE(IDC_TRACE_BUFFER_SIZE_EDIT, OnChangeTraceBufferSizeEdit) ON_EN_KILLFOCUS(IDC_TRACE_BUFFER_SIZE_EDIT, OnKillfocusTraceBufferSizeEdit) ON_NOTIFY(UDN_DELTAPOS, IDC_TRACE_BUFFER_SIZE_SPIN, OnDeltaposTraceBufferSizeSpin) ON_EN_CHANGE(IDC_TRACE_FLUSH_INT_EDIT, OnChangeTraceFlushIntEdit) ON_EN_KILLFOCUS(IDC_TRACE_FLUSH_INT_EDIT, OnKillfocusTraceFlushIntEdit) ON_NOTIFY(UDN_DELTAPOS, IDC_TRACE_FLUSH_INT_SPIN, OnDeltaposTraceFlushIntSpin) ON_EN_CHANGE(IDC_TRACE_MAX_BUF_EDIT, OnChangeTraceMaxBufEdit) ON_EN_KILLFOCUS(IDC_TRACE_MAX_BUF_EDIT, OnKillfocusTraceMaxBufEdit) ON_NOTIFY(UDN_DELTAPOS, IDC_TRACE_MAX_BUF_SPIN, OnDeltaposTraceMaxBufSpin) ON_EN_CHANGE(IDC_TRACE_MIN_BUF_EDIT, OnChangeTraceMinBufEdit) ON_EN_KILLFOCUS(IDC_TRACE_MIN_BUF_EDIT, OnKillfocusTraceMinBufEdit) ON_NOTIFY(UDN_DELTAPOS, IDC_TRACE_MIN_BUF_SPIN, OnDeltaposTraceMinBufSpin) //}}AFX_MSG_MAP END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(CTraceProperty, CSmPropertyPage) //{{AFX_DISPATCH_MAP(CTraceProperty) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_DISPATCH_MAP END_DISPATCH_MAP() // Note: we add support for IID_ITraceProperty to support typesafe binding // from VBA. This IID must match the GUID that is attached to the // dispinterface in the .ODL file. // {65154EAF-BDBE-11D1-BF99-00C04F94A83A} static const IID IID_ITraceProperty = { 0x65154eaf, 0xbdbe, 0x11d1, { 0xbf, 0x99, 0x0, 0xc0, 0x4f, 0x94, 0xa8, 0x3a } }; BEGIN_INTERFACE_MAP(CTraceProperty, CSmPropertyPage) INTERFACE_PART(CTraceProperty, IID_ITraceProperty, Dispatch) END_INTERFACE_MAP() BOOL CTraceProperty::SetFlushIntervalMode() { BOOL bShow; bShow = ((CButton *)(GetDlgItem(IDC_TRACE_BUF_FLUSH_CHECK)))->GetCheck(); GetDlgItem(IDC_TRACE_FLUSH_INT_EDIT)->EnableWindow(bShow); GetDlgItem(IDC_TRACE_FLUSH_INT_SPIN)->EnableWindow(bShow); GetDlgItem(IDC_TRACE_INTERVAL_SECONDS_CAPTION)->EnableWindow(bShow); return TRUE; } BOOL CTraceProperty::IsValidLocalData () { BOOL bIsValid = TRUE; if (bIsValid) { bIsValid = ValidateDWordInterval(IDC_TRACE_BUFFER_SIZE_EDIT, m_pTraceLogQuery->GetLogName(), (long) m_dwBufferSize, eMinBufSize, eMaxBufSize); } if (bIsValid && m_bEnableBufferFlush) { bIsValid = ValidateDWordInterval(IDC_TRACE_FLUSH_INT_EDIT, m_pTraceLogQuery->GetLogName(), (long) m_dwFlushInterval, eMinFlushInt, eMaxFlushInt); } if (bIsValid) { bIsValid = ValidateDWordInterval(IDC_TRACE_MIN_BUF_EDIT, m_pTraceLogQuery->GetLogName(), (long) m_dwMinBufCount, eMinBufCount, eMaxBufCount); } if (bIsValid) { bIsValid = ValidateDWordInterval(IDC_TRACE_MAX_BUF_EDIT, m_pTraceLogQuery->GetLogName(), (long) m_dwMaxBufCount, eMinBufCount, eMaxBufCount); } // Extra data validation if (bIsValid && m_dwMaxBufCount < m_dwMinBufCount) { CString csMessage; csMessage.LoadString ( IDS_TRACE_MAX_BUFF ); MessageBox ( csMessage, m_pTraceLogQuery->GetLogName(), MB_OK | MB_ICONERROR); SetFocusAnyPage ( IDC_TRACE_MAX_BUF_EDIT ); bIsValid = FALSE; } return bIsValid; } BOOL CTraceProperty::SaveDataToModel ( ) { SLQ_TRACE_LOG_INFO stlInfo; BOOL bContinue = TRUE; ResourceStateManager rsm; // Write the data to the query. if ( bContinue ) { memset (&stlInfo, 0, sizeof(stlInfo)); stlInfo.dwBufferSize = m_dwBufferSize; stlInfo.dwMinimumBuffers = m_dwMinBufCount; stlInfo.dwMaximumBuffers = m_dwMaxBufCount; stlInfo.dwBufferFlushInterval = m_dwFlushInterval; if ( m_bEnableBufferFlush ) stlInfo.dwBufferFlags |= SLQ_TLI_ENABLE_BUFFER_FLUSH; m_pTraceLogQuery->SetTraceLogInfo ( &stlInfo ); if ( bContinue ) { // ApplyRunAs must be called before UpdateService bContinue = ApplyRunAs( m_pTraceLogQuery ); } // Save property page shared data. m_pTraceLogQuery->UpdatePropPageSharedData(); bContinue = UpdateService ( m_pTraceLogQuery, TRUE ); } return bContinue; } ///////////////////////////////////////////////////////////////////////////// // CTraceProperty message handlers BOOL CTraceProperty::OnSetActive() { BOOL bReturn; bReturn = CSmPropertyPage::OnSetActive(); if (bReturn) { m_pTraceLogQuery->GetPropPageSharedData ( &m_SharedData ); } return bReturn; } BOOL CTraceProperty::OnKillActive() { BOOL bContinue = TRUE; bContinue = CPropertyPage::OnKillActive(); if ( bContinue ) { bContinue = IsValidData(m_pTraceLogQuery, VALIDATE_FOCUS ); } // The trace advanced page does not modify shared data, so no reason to update it. if ( bContinue ) { SetIsActive ( FALSE ); } return bContinue; } void CTraceProperty::OnCancel() { m_pTraceLogQuery->SyncPropPageSharedData(); // Clear the memory shared between property pages. } BOOL CTraceProperty::OnApply() { BOOL bContinue = TRUE; bContinue = UpdateData(TRUE); if ( bContinue ) { bContinue = IsValidData( m_pTraceLogQuery, VALIDATE_APPLY ); } if ( bContinue ) { bContinue = SaveDataToModel(); } if ( bContinue ) bContinue = CSmPropertyPage::OnApply(); return bContinue; } BOOL CTraceProperty::OnInitDialog() { SLQ_TRACE_LOG_INFO tlInfo; ResourceStateManager rsm; memset(&tlInfo, 0, sizeof(tlInfo)); m_pTraceLogQuery->GetTraceLogInfo (&tlInfo); m_dwBufferSize = tlInfo.dwBufferSize; m_dwFlushInterval = tlInfo.dwBufferFlushInterval; m_dwMaxBufCount = tlInfo.dwMaximumBuffers; m_dwMinBufCount = tlInfo.dwMinimumBuffers; m_bEnableBufferFlush = (BOOL)((tlInfo.dwBufferFlags & SLQ_TLI_ENABLE_BUFFER_FLUSH) != 0); CSmPropertyPage::OnInitDialog(); SetHelpIds ( (DWORD*)&s_aulHelpIds ); SetFlushIntervalMode(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CTraceProperty::OnTraceBufFlushCheck() { UpdateData( TRUE); SetFlushIntervalMode(); SetModifiedPage(TRUE); } void CTraceProperty::OnChangeTraceBufferSizeEdit() { DWORD dwOldValue; dwOldValue = m_dwBufferSize; UpdateData ( TRUE ); if (dwOldValue != m_dwBufferSize) { SetModifiedPage(TRUE); } } void CTraceProperty::OnKillfocusTraceBufferSizeEdit() { DWORD dwOldValue; dwOldValue = m_dwBufferSize; UpdateData ( TRUE ); if (dwOldValue != m_dwBufferSize) { SetModifiedPage(TRUE); } } void CTraceProperty::OnDeltaposTraceBufferSizeSpin(NMHDR* pNMHDR, LRESULT* pResult) { OnDeltaposSpin(pNMHDR, pResult, & m_dwBufferSize, eMinBufSize, eMaxBufSize); } void CTraceProperty::OnChangeTraceFlushIntEdit() { DWORD dwOldValue; dwOldValue = m_dwFlushInterval; UpdateData ( TRUE ); if (dwOldValue != m_dwFlushInterval) { SetModifiedPage(TRUE); } } void CTraceProperty::OnKillfocusTraceFlushIntEdit() { DWORD dwOldValue; dwOldValue = m_dwFlushInterval; UpdateData ( TRUE ); if (dwOldValue != m_dwFlushInterval) { SetModifiedPage(TRUE); } } void CTraceProperty::OnDeltaposTraceFlushIntSpin(NMHDR* pNMHDR, LRESULT* pResult) { OnDeltaposSpin(pNMHDR, pResult, & m_dwFlushInterval, eMinFlushInt, eMaxFlushInt); } void CTraceProperty::OnChangeTraceMaxBufEdit() { DWORD dwOldValue; dwOldValue = m_dwMaxBufCount; UpdateData ( TRUE ); if (dwOldValue != m_dwMaxBufCount) { SetModifiedPage(TRUE); } } void CTraceProperty::OnKillfocusTraceMaxBufEdit() { DWORD dwOldValue; dwOldValue = m_dwMaxBufCount; UpdateData ( TRUE ); if (dwOldValue != m_dwMaxBufCount) { SetModifiedPage(TRUE); } } void CTraceProperty::OnDeltaposTraceMaxBufSpin(NMHDR* pNMHDR, LRESULT* pResult) { OnDeltaposSpin(pNMHDR, pResult, & m_dwMaxBufCount, eMinBufCount, eMaxBufCount); } void CTraceProperty::OnChangeTraceMinBufEdit() { DWORD dwOldValue; dwOldValue = m_dwMinBufCount; UpdateData ( TRUE ); if (dwOldValue != m_dwMinBufCount) { SetModifiedPage(TRUE); } } void CTraceProperty::OnKillfocusTraceMinBufEdit() { DWORD dwOldValue; dwOldValue = m_dwMinBufCount; UpdateData ( TRUE ); if (dwOldValue != m_dwMinBufCount) { SetModifiedPage(TRUE); } } void CTraceProperty::OnDeltaposTraceMinBufSpin(NMHDR* pNMHDR, LRESULT* pResult) { OnDeltaposSpin(pNMHDR, pResult, & m_dwMinBufCount, eMinBufCount, eMaxBufCount); } void CTraceProperty::PostNcDestroy() { // delete this; CPropertyPage::PostNcDestroy(); }