windows-nt/Source/XPSP1/NT/admin/hmonitor/snapin/wmibrowsedlg.cpp
2020-09-26 16:20:57 +08:00

335 lines
8.4 KiB
C++

// WmiBrowseDlg.cpp : implementation file
//
// 03/28/00 v-marfin 62468 : Added efficiencies to help queries with thousands of
// records load faster.
// 03/30/00 v-marfin 62469 : If no occurrences, disable the OK button
#include "stdafx.h"
#include "snapin.h"
#include "WmiBrowseDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CWmiBrowseDlg dialog
CWmiBrowseDlg::CWmiBrowseDlg(CWnd* pParent /*=NULL*/)
: CResizeableDialog(CWmiBrowseDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CWmiBrowseDlg)
m_sTitle = _T("");
//}}AFX_DATA_INIT
}
void CWmiBrowseDlg::DoDataExchange(CDataExchange* pDX)
{
CResizeableDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWmiBrowseDlg)
DDX_Control(pDX, IDC_LIST_WMI_ITEMS, m_Items);
DDX_Text(pDX, IDC_STATIC_TITLE, m_sTitle);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWmiBrowseDlg, CResizeableDialog)
//{{AFX_MSG_MAP(CWmiBrowseDlg)
ON_BN_CLICKED(IDC_BUTTON_HELP, OnButtonHelp)
ON_NOTIFY(NM_DBLCLK, IDC_LIST_WMI_ITEMS, OnDblclkListWmiItems)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWmiBrowseDlg message handlers
BOOL CWmiBrowseDlg::OnInitDialog()
{
CResizeableDialog::OnInitDialog();
// subclass header control
m_Items.SubclassHeaderCtrl();
// set the extended styles for the list control
m_Items.SetExtendedStyle(LVS_EX_LABELTIP|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
// set styles for the header control
CHeaderCtrl* pHdrCtrl = m_Items.GetHeaderCtrl();
DWORD dwStyle = GetWindowLong(pHdrCtrl->GetSafeHwnd(),GWL_STYLE);
dwStyle |= (HDS_DRAGDROP|HDS_BUTTONS);
SetWindowLong(pHdrCtrl->GetSafeHwnd(),GWL_STYLE,dwStyle);
SetControlInfo(IDC_STATIC_TITLE, ANCHOR_LEFT | ANCHOR_TOP | RESIZE_HOR);
SetControlInfo(IDC_LIST_WMI_ITEMS, ANCHOR_LEFT | ANCHOR_TOP | RESIZE_HOR | RESIZE_VER);
SetControlInfo(IDOK, ANCHOR_BOTTOM | ANCHOR_LEFT );
SetControlInfo(IDCANCEL, ANCHOR_BOTTOM | ANCHOR_LEFT );
SetControlInfo(IDC_BUTTON_HELP,ANCHOR_BOTTOM | ANCHOR_LEFT );
SetWindowText(m_sDlgTitle);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CWmiBrowseDlg::OnButtonHelp()
{
// TODO: Add your control notification handler code here
}
void CWmiBrowseDlg::OnDblclkListWmiItems(NMHDR* pNMHDR, LRESULT* pResult)
{
OnOK();
*pResult = 0;
}
void CWmiBrowseDlg::OnOK()
{
POSITION pos = m_Items.GetFirstSelectedItemPosition();
if( ! pos )
{
return;
}
int iIndex = m_Items.GetNextSelectedItem(pos);
if( iIndex < 0 )
{
return;
}
m_sSelectedItem = m_Items.GetItemText(iIndex,0);
CResizeableDialog::OnOK();
}
/////////////////////////////////////////////////////////////////////////////
// CWmiNamespaceBrowseDlg dialog
BOOL CWmiNamespaceBrowseDlg::OnInitDialog()
{
CWmiBrowseDlg::OnInitDialog();
CWaitCursor wait;
// add column headers to the list ctrl
CString sColName;
sColName.LoadString(IDS_STRING_NAME);
m_Items.InsertColumn(0,sColName);
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
// insert the root namespace
m_Items.InsertItem(0,_T("ROOT"));
if( m_sTitle.CompareNoCase(_T("ROOT")) == 0 )
{
m_Items.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED);
}
// enumerate all namespaces on the system recursively
EnumerateAllChildNamespaces(_T("ROOT"));
m_sTitle.Format(IDS_STRING_NAMESPACES_ON_SYSTEM,m_ClassObject.GetMachineName());
if( m_Items.GetItemCount() == 0 )
{
m_Items.DeleteColumn(0);
m_Items.InsertColumn(0,_T(""));
CString sNoInstancesFound;
sNoInstancesFound.LoadString(IDS_STRING_NO_ITEMS_FOUND);
m_Items.InsertItem(0,sNoInstancesFound);
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
m_Items.EnableWindow(FALSE);
}
UpdateData(FALSE);
return TRUE;
}
void CWmiNamespaceBrowseDlg::EnumerateAllChildNamespaces(const CString& sNamespace)
{
ULONG ulReturned = 0L;
int i = 0;
CWbemClassObject Namespaces;
Namespaces.Create(m_ClassObject.GetMachineName());
Namespaces.SetNamespace(sNamespace);
CString sTemp = IDS_STRING_MOF_NAMESPACE;
BSTR bsTemp = sTemp.AllocSysString();
if( ! CHECKHRESULT(Namespaces.CreateEnumerator(bsTemp)) )
{
::SysFreeString(bsTemp);
return;
}
::SysFreeString(bsTemp);
while( Namespaces.GetNextObject(ulReturned) == S_OK && ulReturned )
{
CString sName;
Namespaces.GetProperty(IDS_STRING_MOF_NAME,sName);
CString sTemp2;
Namespaces.GetProperty(IDS_STRING_MOF_NAMESPACE,sTemp2);
CString sNamespaceFound = sTemp2 + _T("\\") + sName;
int iIndex = m_Items.InsertItem(i++,sNamespaceFound);
if( sNamespaceFound.CompareNoCase(m_sTitle) == 0 )
{
m_Items.SetItemState(iIndex,LVIS_SELECTED,LVIS_SELECTED);
m_Items.EnsureVisible(iIndex,FALSE);
}
EnumerateAllChildNamespaces(sNamespaceFound);
}
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
}
/////////////////////////////////////////////////////////////////////////////
// CWmiClassBrowseDlg dialog
BOOL CWmiClassBrowseDlg::OnInitDialog()
{
CWmiBrowseDlg::OnInitDialog();
CWaitCursor wait;
// add column headers to the list ctrl
CString sColName;
sColName.LoadString(IDS_STRING_NAME);
m_Items.InsertColumn(0,sColName);
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
ULONG ulReturned = 0L;
int i = 0;
while( m_ClassObject.GetNextObject(ulReturned) == S_OK && ulReturned )
{
CString sName;
m_ClassObject.GetProperty(IDS_STRING_MOF_CLASSNAME,sName);
m_Items.InsertItem(i++,sName);
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
}
if( m_Items.GetItemCount() == 0 )
{
m_Items.DeleteColumn(0);
m_Items.InsertColumn(0,_T(""));
CString sNoInstancesFound;
sNoInstancesFound.LoadString(IDS_STRING_NO_ITEMS_FOUND);
m_Items.InsertItem(0,sNoInstancesFound);
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
m_Items.EnableWindow(FALSE);
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CWmiInstanceBrowseDlg dialog
BOOL CWmiInstanceBrowseDlg::OnInitDialog()
{
CWmiBrowseDlg::OnInitDialog();
CWaitCursor wait;
// add column headers to the list ctrl
CString sColName;
sColName.LoadString(IDS_STRING_PATH);
m_Items.InsertColumn(0,sColName);
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
sColName.LoadString(IDS_STRING_NAME);
m_Items.InsertColumn(1,sColName);
m_Items.SetColumnWidth(1,LVSCW_AUTOSIZE);
int order[] = { 1,0 };
m_Items.SetColumnOrderArray(2,order);
ULONG ulReturned = 0L;
int i = 0;
bool bNamePropertyExists = true;
// // v-marfin 62468 define CStrings outside of loop for performance purposes
CString sProperty; // v-marfin 62468
CString sNameProperty; // v-marfin 62468
HRESULT hr=0;
int iItemIndex=0;
while( m_ClassObject.GetNextObject(ulReturned) == S_OK && ulReturned )
{
m_ClassObject.GetProperty(IDS_STRING_MOF_RELPATH,sProperty);
iItemIndex = m_Items.InsertItem(i,sProperty);
// v-marfin 62468 : Don't check for this if we know the name doesn't exist.
if (bNamePropertyExists)
{
hr = m_ClassObject.GetProperty(IDS_STRING_MOF_NAME,sNameProperty);
if( !CHECKHRESULT(hr) )
{
bNamePropertyExists = false;
sNameProperty.Empty(); // v-marfin 62468
}
}
m_Items.SetItem(iItemIndex,1,LVIF_TEXT,sNameProperty,-1,-1,-1,0L);
// v-marfin 62468 : m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
// v-marfin 62468 : m_Items.SetColumnWidth(1,LVSCW_AUTOSIZE);
i++;
// v-marfin 62468
if (i > 1000)
break;
}
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE); // v-marfin 62468 :
m_Items.SetColumnWidth(1,LVSCW_AUTOSIZE); // v-marfin 62468
if( ! bNamePropertyExists )
{
m_Items.DeleteColumn(1);
}
int nCount = m_Items.GetItemCount();
if( m_Items.GetItemCount() == 0 )
{
m_Items.DeleteColumn(1);
m_Items.DeleteColumn(0);
m_Items.InsertColumn(0,_T(""));
CString sNoInstancesFound;
sNoInstancesFound.LoadString(IDS_STRING_NO_ITEMS_FOUND);
m_Items.InsertItem(0,sNoInstancesFound);
m_Items.SetColumnWidth(0,LVSCW_AUTOSIZE);
m_Items.EnableWindow(FALSE);
}
else
{
// v-marfin 62469
m_Items.SetItemState(0,LVIS_SELECTED,LVIS_SELECTED);
}
// v-marfin 62469 : If no occurrences, disable the OK button
GetDlgItem(IDOK)->EnableWindow(nCount);
return TRUE;
}