// HMEventResultsPaneItem.cpp: implementation of the CHMEventResultsPaneItem class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "snapin.h" #include "HMEventResultsPaneItem.h" #include "HealthmonResultsPane.h" #include "ScopePaneItem.h" #include "ResultsPaneView.h" #include "AlertPage.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif IMPLEMENT_DYNCREATE(CHMEventResultsPaneItem,CHMResultsPaneItem) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CHMEventResultsPaneItem::CHMEventResultsPaneItem() { ZeroMemory(&m_st,sizeof(SYSTEMTIME)); m_iState = HMS_UNKNOWN; m_iDateTimeColumn = -1; } CHMEventResultsPaneItem::~CHMEventResultsPaneItem() { Destroy(); m_iState = -1; m_iDateTimeColumn = -1; } ///////////////////////////////////////////////////////////////////////////// // Display Names Members CString CHMEventResultsPaneItem::GetDisplayName(int nIndex /* = 0*/) { TRACEX(_T("CResultsPaneItem::GetDisplayName\n")); TRACEARGn(nIndex); if( nIndex >= m_saDisplayNames.GetSize() || nIndex < 0 ) { TRACE(_T("FAILED : nIndex is out of array bounds.\n")); return _T(""); } if( nIndex == GetDateTimeColumn() ) { CString sTime; CString sDate; int iLen = GetTimeFormat(LOCALE_USER_DEFAULT,0L,&m_st,NULL,NULL,0); iLen = GetTimeFormat(LOCALE_USER_DEFAULT,0L,&m_st,NULL,sTime.GetBuffer(iLen+(sizeof(TCHAR)*1)),iLen); sTime.ReleaseBuffer(); iLen = GetDateFormat(LOCALE_USER_DEFAULT,0L,&m_st,NULL,NULL,0); iLen = GetDateFormat(LOCALE_USER_DEFAULT,0L,&m_st,NULL,sDate.GetBuffer(iLen+(sizeof(TCHAR)*1)),iLen); sDate.ReleaseBuffer(); return sDate + _T(" ") + sTime; } return m_saDisplayNames[nIndex]; } ///////////////////////////////////////////////////////////////////////////// // MMC-Related Members int CHMEventResultsPaneItem::CompareItem(CResultsPaneItem* pItem, int iColumn /*= 0*/ ) { TRACEX(_T("CResultsPaneItem::CompareItem\n")); TRACEARGn(pItem); TRACEARGn(iColumn); CHMEventResultsPaneItem* pEventItem = (CHMEventResultsPaneItem*)pItem; if( ! GfxCheckObjPtr(pEventItem,CHMEventResultsPaneItem) ) { return CResultsPaneItem::CompareItem(pItem,iColumn); } if( iColumn == GetDateTimeColumn() ) { CTime time1(m_st); CTime time2(pEventItem->m_st); if( time1 == time2 ) return 0; if( time1 < time2 ) return 1; if( time1 > time2 ) return -1; } if( iColumn == 0 && IsLowerPane() ) { if( m_iState == pEventItem->m_iState ) return 0; if( m_iState < pEventItem->m_iState ) return 1; if( m_iState > pEventItem->m_iState ) return -1; } return CResultsPaneItem::CompareItem(pItem,iColumn); } HRESULT CHMEventResultsPaneItem::WriteExtensionData(LPSTREAM pStream) { TRACEX(_T("CHMEventResultsPaneItem::WriteExtensionData\n")); TRACEARGn(pStream); HRESULT hr = S_OK; ULONG ulSize = GetDisplayName(3).GetLength() + 1; ulSize *= sizeof(TCHAR); if( ! CHECKHRESULT(hr = pStream->Write(GetDisplayName(3), ulSize, NULL)) ) { return hr; } CString sType = IDS_STRING_MOF_HMR_STATUS; ulSize = sType.GetLength() + 1; ulSize *= sizeof(TCHAR); if( ! CHECKHRESULT(hr = pStream->Write(sType, ulSize, NULL)) ) { return hr; } ulSize = m_sGuid.GetLength() + 1; ulSize *= sizeof(TCHAR); if( ! CHECKHRESULT(hr = pStream->Write(m_sGuid, ulSize, NULL)) ) { return hr; } return S_OK; } ///////////////////////////////////////////////////////////////////////////// // MMC Notify Handlers ///////////////////////////////////////////////////////////////////////////// HRESULT CHMEventResultsPaneItem::OnAddMenuItems(LPCONTEXTMENUCALLBACK piCallback,long __RPC_FAR *pInsertionAllowed) { TRACEX(_T("CHMEventResultsPaneItem::OnAddMenuItems\n")); TRACEARGn(piCallback); TRACEARGn(pInsertionAllowed); HRESULT hr = S_OK; // Add New Menu Items if( CCM_INSERTIONALLOWED_NEW & *pInsertionAllowed ) { // TODO: Add any context menu items for the New Menu here } // Add Task Menu Items if( CCM_INSERTIONALLOWED_TASK & *pInsertionAllowed ) { // TODO: Add any context menu items for the Task Menu here } // Add Top Menu Items if( CCM_INSERTIONALLOWED_TOP & *pInsertionAllowed ) { CONTEXTMENUITEM cmi; CString sResString; CString sResString2; // Copy sResString.LoadString(IDS_STRING_COPY); cmi.strName = LPTSTR(LPCTSTR(sResString)); cmi.strStatusBarText = NULL; cmi.lCommandID = IDM_COPY; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = 0; cmi.fSpecialFlags = 0; hr = piCallback->AddItem(&cmi); if( !SUCCEEDED(hr) ) { TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n")); return hr; } if( ! IsStatsPane() ) { // Delete sResString.LoadString(IDS_STRING_CLEAR); cmi.strName = LPTSTR(LPCTSTR(sResString)); cmi.strStatusBarText = NULL; cmi.lCommandID = IDM_DELETE; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = 0; cmi.fSpecialFlags = 0; hr = piCallback->AddItem(&cmi); if( !SUCCEEDED(hr) ) { TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n")); return hr; } // Refresh sResString.LoadString(IDS_STRING_REFRESH); cmi.strName = LPTSTR(LPCTSTR(sResString)); cmi.strStatusBarText = NULL; cmi.lCommandID = IDM_REFRESH; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = 0; cmi.fSpecialFlags = 0; hr = piCallback->AddItem(&cmi); if( !SUCCEEDED(hr) ) { TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n")); return hr; } if( ! IsUpperPane() ) { cmi.strName = NULL; cmi.strStatusBarText = NULL; cmi.lCommandID = 0; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = MF_SEPARATOR; cmi.fSpecialFlags = 0; hr = piCallback->AddItem(&cmi); if( !SUCCEEDED(hr) ) { TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n")); return hr; } // Properties sResString.LoadString(IDS_STRING_ALERT_PROPERTIES); cmi.strName = LPTSTR(LPCTSTR(sResString)); cmi.strStatusBarText = NULL; cmi.lCommandID = IDM_PROPERTIES; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = 0; cmi.fSpecialFlags = 0; hr = piCallback->AddItem(&cmi); if( !SUCCEEDED(hr) ) { TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n")); return hr; } cmi.strName = NULL; cmi.strStatusBarText = NULL; cmi.lCommandID = 0; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = MF_SEPARATOR; cmi.fSpecialFlags = 0; hr = piCallback->AddItem(&cmi); if( !SUCCEEDED(hr) ) { TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n")); return hr; } } // Help sResString.LoadString(IDS_STRING_HELP); cmi.strName = LPTSTR(LPCTSTR(sResString)); cmi.strStatusBarText = NULL; cmi.lCommandID = IDM_HELP; cmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP; cmi.fFlags = 0; cmi.fSpecialFlags = 0; hr = piCallback->AddItem(&cmi); if( !SUCCEEDED(hr) ) { TRACE(_T("FAILED : IContextMenuCallback::AddItem failed.\n")); return hr; } } } return S_OK; } HRESULT CHMEventResultsPaneItem::OnCommand(CResultsPane* pPane, long lCommandID) { TRACEX(_T("CHMEventResultsPaneItem::OnCommand\n")); TRACEARGn(pPane); TRACEARGn(lCommandID); CHealthmonResultsPane* pHMRP = (CHealthmonResultsPane*)pPane; if( ! GfxCheckObjPtr(pHMRP,CHealthmonResultsPane) ) { return E_FAIL; } HRESULT hr = S_OK; switch( lCommandID ) { case IDM_CUT: { } break; case IDM_COPY: { _DHMListView* pListView = IsStatsPane() ? pHMRP->GetStatsListCtrl() : pHMRP->GetLowerListCtrl(); if( ! pListView ) { return E_FAIL; } CTypedPtrArray Items; int iIndex = pListView->GetNextItem(-1,LVNI_SELECTED); while( iIndex != -1 ) { LPARAM lParam = pListView->GetItem(iIndex); CHMEventResultsPaneItem* pItem = (CHMEventResultsPaneItem*)lParam; if( GfxCheckObjPtr(pItem,CHMEventResultsPaneItem) ) { Items.Add(pItem); } int iNextIndex = pListView->GetNextItem(iIndex,LVNI_SELECTED|LVNI_BELOW); if( iNextIndex == iIndex ) { break; } else { iIndex = iNextIndex; } } CString sData; for( int i = 0; i < Items.GetSize(); i++ ) { CHMEventResultsPaneItem* pItem = Items[i]; if( IsStatsPane() ) { for( int l = 0; l < pItem->GetDisplayNameCount(); l++ ) { sData += pItem->m_saDisplayNames[l] + _T("\t"); } } else { for( int l = 0; l < pItem->GetDisplayNameCount(); l++ ) { sData += pItem->GetDisplayName(l) + _T("\t"); } } sData.TrimRight(_T("\t")); sData += _T("\r\n"); } COleDataSource* pDataSource = new COleDataSource; // Allocate memory for the stream HGLOBAL hGlobal = GlobalAlloc( GMEM_SHARE, (sData.GetLength()+1)*sizeof(TCHAR) ); if( ! hGlobal ) { hr = E_OUTOFMEMORY; TRACE(_T("FAILED : Out of Memory.\n")); return hr; } LPVOID lpGlobal = GlobalLock(hGlobal); CopyMemory(lpGlobal,(LPCTSTR)sData,(sData.GetLength()+1)*sizeof(TCHAR)); GlobalUnlock(hGlobal); pDataSource->CacheGlobalData(CF_UNICODETEXT,hGlobal); pDataSource->SetClipboard(); } break; case IDM_DELETE: { CHMListViewEventSink* pSink = pHMRP->GetLowerListSink(); pSink->OnDelete(); } break; case IDM_PROPERTIES: { _DHMListView* pListView = IsStatsPane() ? pHMRP->GetStatsListCtrl() : pHMRP->GetLowerListCtrl(); CPropertySheet sheet(IDS_STRING_PROPERTIES_OF_ALERT); sheet.m_psh.dwFlags |= PSH_HASHELP; sheet.m_psh.dwFlags |= PSH_NOAPPLYNOW; CAlertPage page; page.m_psp.dwFlags |= PSP_HASHELP; sheet.AddPage(&page); page.m_sSeverity = GetDisplayName(0); page.m_sID = GetDisplayName(1); page.m_sDTime = GetDisplayName(2); page.m_sDataCollector = GetDisplayName(3); page.m_sComputer = GetDisplayName(4); page.m_sAlert = GetDisplayName(5); page.m_pScopePane = pHMRP->GetOwnerScopePane(); page.m_pListView = pListView; #ifndef IA64 page.m_iIndex = pListView->FindItemByLParam((LPARAM)this); // Needs ptr fixing #endif // IA64 sheet.DoModal(); } break; case IDM_REFRESH: { CResultsPaneView* pView = GetOwnerResultsView(); if( pView ) { CScopePaneItem* pSPI = pView->GetOwnerScopeItem(); if( GfxCheckObjPtr(pSPI,CScopePaneItem) ) { pSPI->OnRefresh(); } } } break; case IDM_HELP: { CResultsPaneView* pView = GetOwnerResultsView(); if( pView ) { CScopePaneItem* pSPI = pView->GetOwnerScopeItem(); if( GfxCheckObjPtr(pSPI,CScopePaneItem) ) { pSPI->OnContextHelp(); } } } break; } return S_OK; }