Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

315 lines
8.1 KiB

/*++
Copyright (C) 1997-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
// NamespaceDlg.cpp : implementation file
//
#include "stdafx.h"
#include "wmitest.h"
#include "WMITestDoc.h"
#include "NamespaceDlg.h"
#include "MainFrm.h"
//#include <cominit.h>
#include "utils.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNamespaceDlg dialog
CNamespaceDlg::CNamespaceDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNamespaceDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CNamespaceDlg)
m_strNamespace = _T("");
//}}AFX_DATA_INIT
}
void CNamespaceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNamespaceDlg)
DDX_Control(pDX, IDC_NAMESPACE_TREE, m_ctlNamespace);
DDX_Text(pDX, IDC_NAMESPACE, m_strNamespace);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNamespaceDlg, CDialog)
//{{AFX_MSG_MAP(CNamespaceDlg)
ON_NOTIFY(TVN_SELCHANGED, IDC_NAMESPACE_TREE, OnSelchangedNamespaceTree)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNamespaceDlg message handlers
BOOL CNamespaceDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_ctlNamespace.SetImageList(
&((CMainFrame *) AfxGetMainWnd())->m_imageList,
TVSIL_NORMAL);
if (!PopulateTree())
OnCancel();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
_COM_SMARTPTR_TYPEDEF(IWbemLocator, __uuidof(IWbemLocator));
_COM_SMARTPTR_TYPEDEF(IWbemServices, __uuidof(IWbemServices));
_COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, __uuidof(IEnumWbemClassObject));
_COM_SMARTPTR_TYPEDEF(IWbemClassObject, __uuidof(IWbemClassObject));
typedef CList<_bstr_t, LPCWSTR> CBstrList;
BOOL CNamespaceDlg::AddNamespaceToTree(
HTREEITEM hitemParent,
LPCWSTR szNamespace,
IWbemLocator *pLocator,
BSTR pUser,
BSTR pPassword,
BSTR pAuthority,
DWORD dwImpLevel,
DWORD dwAuthLevel)
{
HRESULT hr;
IWbemServicesPtr pNamespace;
if (SUCCEEDED(hr = pLocator->ConnectServer(
_bstr_t(szNamespace),
pUser, // username
pPassword, // password
0, // locale
0, // securityFlags
pAuthority, // authority (domain for NTLM)
NULL, // context
&pNamespace)))
{
SetSecurityHelper(
pNamespace,
pAuthority,
pUser,
pPassword,
dwImpLevel,
dwAuthLevel);
IEnumWbemClassObjectPtr pEnum;
if (SUCCEEDED(hr =
pNamespace->ExecQuery(
_bstr_t(L"WQL"),
_bstr_t(L"SELECT NAME FROM __NAMESPACE"),
WBEM_FLAG_USE_AMENDED_QUALIFIERS,
NULL,
&pEnum)))
{
IWbemClassObjectPtr pObj;
DWORD dwCount;
CBstrList listNamespaces;
_variant_t vNamespace;
HTREEITEM hitem;
LPCWSTR szBaseName = wcsrchr(szNamespace, '\\');
if (szBaseName)
szBaseName++;
else
szBaseName = szNamespace;
// Insert the parent into the tree.
hitem =
m_ctlNamespace.InsertItem(
_bstr_t(szBaseName),
IMAGE_ROOT,
IMAGE_ROOT,
hitemParent);
SetSecurityHelper(
pEnum,
pAuthority,
pUser,
pPassword,
dwImpLevel,
dwAuthLevel);
// Enum the child namespace names and put them into a list. We're
// putting them into a list so we don't have a bunch of namespaces
// open like we would if we were to recursively call this function
// without first building a list and then closing the currently
// open namespace.
while (SUCCEEDED(hr =
pEnum->Next(
WBEM_INFINITE,
1,
&pObj,
&dwCount)) &&
dwCount == 1 &&
SUCCEEDED(hr =
pObj->Get(
L"NAME",
0,
&vNamespace,
NULL,
NULL)))
{
listNamespaces.AddTail(V_BSTR(&vNamespace));
}
// This will release it.
pNamespace = NULL;
POSITION pos = listNamespaces.GetHeadPosition();
while (pos)
{
WCHAR szNewNamespace[256];
swprintf(
szNewNamespace,
L"%s\\%s",
szNamespace,
(LPWSTR) listNamespaces.GetNext(pos));
if (!AddNamespaceToTree(
hitem,
szNewNamespace,
pLocator,
pUser,
pPassword,
pAuthority,
dwImpLevel,
dwAuthLevel))
{
hr = WBEM_E_FAILED;
break;
}
}
m_ctlNamespace.SortChildren(hitem);
}
}
if (FAILED(hr))
CWMITestDoc::DisplayWMIErrorBox(hr);
return SUCCEEDED(hr);
}
BOOL CNamespaceDlg::PopulateTree()
{
HRESULT hr;
IWbemLocatorPtr pLocator;
IWbemServicesPtr pSvc;
CWaitCursor wait;
CString strNamespace = m_strNamespace;
int iWhere;
BOOL bRet;
strNamespace.MakeUpper();
// See if we can find a server name.
if ((iWhere = strNamespace.Find("\\ROOT")) != -1 && iWhere != 0)
m_strServer = m_strNamespace.Left(iWhere);
// If we get something like \\server\root\blah we need to strip off
// everything after the \\server\root.
if ((iWhere = strNamespace.Find("ROOT\\")) != -1)
strNamespace = m_strNamespace.Left(iWhere + 4);
if ((hr = CoCreateInstance(
CLSID_WbemLocator,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *) &pLocator)) == S_OK)
{
// Using the locator, connect to CIMOM in the given namespace.
BSTR pUser = m_strUser.IsEmpty() ? NULL :
m_strUser.AllocSysString(),
pPassword = m_bNullPassword || !pUser ? NULL :
m_strPassword.AllocSysString(),
pAuthority = m_strAuthority.IsEmpty() ? NULL :
m_strAuthority.AllocSysString();
bRet =
AddNamespaceToTree(
TVI_ROOT,
_bstr_t(strNamespace),
pLocator, pUser, pPassword, pAuthority,
m_dwImpLevel,
m_dwAuthLevel);
m_ctlNamespace.Expand(m_ctlNamespace.GetRootItem(), TVE_EXPAND);
// Done with BSTR vars.
if (pUser)
SysFreeString(pUser);
if (pPassword)
SysFreeString(pPassword);
if (pAuthority)
SysFreeString(pAuthority);
}
else
{
CWMITestDoc::DisplayWMIErrorBox(hr);
bRet = FALSE;
}
return bRet;
}
void CNamespaceDlg::RefreshNamespaceText()
{
CString strNamespace;
HTREEITEM hitem = m_ctlNamespace.GetSelectedItem();
while (hitem != NULL)
{
CString strItem = m_ctlNamespace.GetItemText(hitem);
if (!strNamespace.IsEmpty())
strNamespace = strItem + "\\" + strNamespace;
else
strNamespace = strItem;
hitem = m_ctlNamespace.GetParentItem(hitem);
}
if (!m_strServer.IsEmpty())
strNamespace = m_strServer + "\\" + strNamespace;
SetDlgItemText(IDC_NAMESPACE, strNamespace);
}
void CNamespaceDlg::OnSelchangedNamespaceTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW*)pNMHDR;
if ((pNMTreeView->itemNew.state & TVIS_SELECTED))
RefreshNamespaceText();
*pResult = 0;
}