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.
 
 
 
 
 
 

1273 lines
32 KiB

/*++
Copyright (C) 1997-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
// WMITestDoc.cpp : implementation of the CWMITestDoc class
//
#include "stdafx.h"
//#include <cominit.h>
#include "utils.h"
#include "WMITest.h"
#include "OpWrap.h"
#include "WMITestDoc.h"
#include "LoginDlg.h"
#include "GetTextDlg.h"
#include "MainFrm.h"
#include "OpView.h"
#include "ObjVw.h"
#include "PrefDlg.h"
#include "ErrorDlg.h"
#include "PropsPg.H"
#include "PropQualsPg.h"
#include "ExecMethodDlg.h"
#include "MofDlg.h"
#include "BindingSheet.h"
#include "FilterPg.h"
#include "ConsumerPg.h"
#include "BindingPg.h"
#include "ExportDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CWMITestDoc
IMPLEMENT_DYNCREATE(CWMITestDoc, CDocument)
BEGIN_MESSAGE_MAP(CWMITestDoc, CDocument)
//{{AFX_MSG_MAP(CWMITestDoc)
ON_COMMAND(ID_CONNECT, OnConnect)
ON_UPDATE_COMMAND_UI_RANGE(ID_FIRST_NEED_CONNECTION, ID_LAST_NEED_CONNECTION, OnUpdateAgainstConnection)
ON_COMMAND(ID_QUERY, OnQuery)
ON_COMMAND(ID_NOTIFICATIONQUERY, OnNotificationQuery)
ON_COMMAND(ID_STOP, OnStop)
//ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
ON_COMMAND(ID_REFRESH_ALL, OnRefreshAll)
ON_COMMAND(ID_ENUMERATEINSTANCES, OnEnumerateInstances)
ON_COMMAND(ID_ENUMERATE_CLASSES, OnEnumerateClasses)
ON_COMMAND(ID_GET_CLASS, OnGetClass)
ON_COMMAND(ID_GETINSTANCE, OnGetInstance)
ON_COMMAND(ID_REFRESH_CURRENT, OnRefreshCurrent)
ON_COMMAND(ID_ASSOCIATORS, OnAssociators)
ON_UPDATE_COMMAND_UI(ID_ASSOCIATORS, OnUpdateAssociators)
ON_COMMAND(ID_REFERENCES, OnReferences)
ON_COMMAND(ID_INST_GET_CLASS, OnInstGetClass)
ON_COMMAND(ID_INST_GET_INST, OnInstGetInst)
ON_COMMAND(ID_CLASS_INSTANCES, OnClassInstances)
ON_COMMAND(ID_CLASS_SUPERCLASS, OnClassSuperclass)
ON_COMMAND(ID_CLASS_INSTANCES_DEEP, OnClassInstancesDeep)
ON_COMMAND(ID_CLASS_SUBCLASSES_DEEP, OnClassSubclassesDeep)
ON_COMMAND(ID_CLASS_SUBCLASSES, OnClassSubclasses)
ON_COMMAND(ID_OPTIONS, OnOptions)
ON_COMMAND(ID_SYSTEM_PROPS, OnSystemProps)
ON_UPDATE_COMMAND_UI(ID_SYSTEM_PROPS, OnUpdateSystemProps)
ON_COMMAND(ID_INHERITED_PROPS, OnInheritedProps)
ON_UPDATE_COMMAND_UI(ID_INHERITED_PROPS, OnUpdateInheritedProps)
ON_COMMAND(ID_RECONNECT, OnReconnect)
ON_UPDATE_COMMAND_UI(ID_RECONNECT, OnUpdateReconnect)
ON_COMMAND(ID_TRANSLATE_VALUES, OnTranslateValues)
ON_UPDATE_COMMAND_UI(ID_TRANSLATE_VALUES, OnUpdateTranslateValues)
ON_COMMAND(ID_SAVE, OnSave)
ON_UPDATE_COMMAND_UI(ID_SAVE, OnUpdateSave)
ON_COMMAND(ID_CREATE_CLASS, OnCreateClass)
ON_COMMAND(ID_CREATE_INSTANCE, OnCreateInstance)
ON_COMMAND(ID_CLASS_CREATE_INST, OnClassCreateInstance)
ON_COMMAND(ID_ERROR_DETAILS, OnErrorDetails)
ON_UPDATE_COMMAND_UI(ID_ERROR_DETAILS, OnUpdateErrorDetails)
ON_COMMAND(ID_EXEC_METHOD, OnExecMethod)
ON_COMMAND(ID_SHOW_MOF, OnShowMof)
ON_UPDATE_COMMAND_UI(ID_SHOW_MOF, OnUpdateShowMof)
ON_COMMAND(ID_EXPORT_TREE, OnExportTree)
ON_COMMAND(ID_EXPORT_ITEM, OnExportItem)
ON_COMMAND(ID_FILTER_BINDINGS, OnFilterBindings)
ON_COMMAND(ID_STOP_CURRENT, OnStopCurrent)
ON_UPDATE_COMMAND_UI(ID_REFRESH_CURRENT, OnUpdateRefreshCurrent)
ON_UPDATE_COMMAND_UI(ID_REFERENCES, OnUpdateAssociators)
ON_UPDATE_COMMAND_UI(ID_INST_GET_CLASS, OnUpdateAssociators)
ON_UPDATE_COMMAND_UI(ID_INST_GET_INST, OnUpdateAssociators)
ON_UPDATE_COMMAND_UI(ID_CLASS_INSTANCES, OnUpdateAssociators)
ON_UPDATE_COMMAND_UI(ID_CLASS_SUPERCLASS, OnUpdateAssociators)
ON_UPDATE_COMMAND_UI(ID_STOP_CURRENT, OnUpdateStopCurrent)
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(IDC_EXECUTE_METHOD_FIRST, IDC_EXECUTE_METHOD_LAST, OnExecuteMethod)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWMITestDoc construction/destruction
#define CLIPFORMAT_PROPERTIES _T("WMITest Properties")
#define CLIPFORMAT_OPS _T("WMITest Operations")
CWMITestDoc::CWMITestDoc() :
m_pOpView(NULL),
m_pObjView(NULL),
m_nBusyOps(0)
//m_pPrincipal(NULL),
//m_pAuthIdentity(NULL)
{
m_pNamespace = NULL;
m_cfProps = (CLIPFORMAT) RegisterClipboardFormat(CLIPFORMAT_PROPERTIES);
m_cfOps = (CLIPFORMAT) RegisterClipboardFormat(CLIPFORMAT_OPS);
}
CWMITestDoc::~CWMITestDoc()
{
}
BOOL CWMITestDoc::OnNewDocument()
{
if (m_pOpView)
m_pOpView->FlushItems();
if (!CDocument::OnNewDocument())
return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CWMITestDoc serialization
void CWMITestDoc::Serialize(CArchive& archive)
{
if (archive.IsStoring())
{
int nCount = m_pOpView->GetOpCount();
CTreeCtrl *pTree = m_pOpView->m_pTree;
// This will go into the op wrappers.
m_pObjView->SaveColumns();
archive << m_strNamespace;
archive << nCount;
for (HTREEITEM hitemOp = pTree->GetChildItem(m_pOpView->m_hitemRoot);
hitemOp != NULL;
hitemOp = pTree->GetNextSiblingItem(hitemOp))
{
COpWrap *pWrap = (COpWrap*) pTree->GetItemData(hitemOp);
pWrap->Serialize(archive);
}
}
else
{
if (!m_pOpView)
{
POSITION pos = GetFirstViewPosition();
m_pOpView = (COpView*) GetNextView(pos);
m_pObjView = (CObjView*) GetNextView(pos);
}
if (m_pOpView)
m_pOpView->FlushItems();
int nCount;
archive >> m_strNamespace;
if (SUCCEEDED(Connect(FALSE)))
{
archive >> nCount;
for (int i = 0; i < nCount; i++)
{
COpWrap *pWrap = new COpWrap;
pWrap->Serialize(archive);
m_pOpView->AddOpItem(pWrap);
}
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CWMITestDoc diagnostics
#ifdef _DEBUG
void CWMITestDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CWMITestDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CWMITestDoc commands
void CWMITestDoc::OnConnect()
{
CLoginDlg dlg;
dlg.m_strAuthority =
theApp.GetProfileString(_T("Login"), _T("Authority"), _T(""));
dlg.m_strNamespace =
theApp.GetProfileString(_T("Login"), _T("Namespace"), _T("root\\default"));
dlg.m_strUser = theApp.GetProfileString(_T("Login"), _T("User"), _T(""));
dlg.m_strLocale = theApp.GetProfileString(_T("Login"), _T("Locale"), _T(""));
dlg.m_dwImpLevel = theApp.GetProfileInt(_T("Login"), _T("Imp"),
RPC_C_IMP_LEVEL_IMPERSONATE);
dlg.m_dwAuthLevel = theApp.GetProfileInt(_T("Login"), _T("Auth"),
RPC_C_AUTHN_LEVEL_CONNECT);
dlg.m_bNullPassword = theApp.GetProfileInt(_T("Login"), _T("Null"), FALSE);
if (dlg.DoModal() == IDOK)
{
Disconnect();
theApp.WriteProfileString(_T("Login"), _T("Authority"), dlg.m_strAuthority);
theApp.WriteProfileString(_T("Login"), _T("Namespace"), dlg.m_strNamespace);
theApp.WriteProfileString(_T("Login"), _T("User"), dlg.m_strUser);
theApp.WriteProfileString(_T("Login"), _T("Locale"), dlg.m_strLocale);
theApp.WriteProfileInt(_T("Login"), _T("Imp"), dlg.m_dwImpLevel);
theApp.WriteProfileInt(_T("Login"), _T("Auth"), dlg.m_dwAuthLevel);
theApp.WriteProfileInt(_T("Login"), _T("Null"), dlg.m_bNullPassword);
m_strPassword = dlg.m_strPassword;
m_strNamespace = dlg.m_strNamespace;
Connect(FALSE, TRUE);
}
}
void CWMITestDoc::AutoConnect()
{
// Only do this if we're not already connected.
if (m_pNamespace == NULL)
{
// If we weren't able to connect without prompting for information,
// then display the connect dialog and try again.
if (FAILED(Connect(TRUE, TRUE)))
OnConnect();
}
}
void CWMITestDoc::SetInterfaceSecurity(IUnknown *pUnk)
{
CString strAuthority =
theApp.GetProfileString(_T("Login"), _T("Authority"), _T("")),
strUser =
theApp.GetProfileString(_T("Login"), _T("User"), _T(""));
BOOL bNullPassword = theApp.GetProfileInt(_T("Login"), _T("Null"),
FALSE);
BSTR pUser = strUser.IsEmpty() ? NULL :
strUser.AllocSysString(),
pPassword = bNullPassword || !pUser ? NULL :
m_strPassword.AllocSysString(),
pAuthority = strAuthority.IsEmpty() ? NULL :
strAuthority.AllocSysString();
DWORD dwImpLevel = theApp.GetProfileInt(_T("Login"), _T("Imp"),
RPC_C_IMP_LEVEL_IMPERSONATE),
dwAuthLevel = theApp.GetProfileInt(_T("Login"), _T("Auth"),
RPC_C_AUTHN_LEVEL_CONNECT);
SetSecurityHelper(
pUnk,
pAuthority,
pUser,
pPassword,
dwImpLevel,
dwAuthLevel);
if (pUser)
SysFreeString(pUser);
if (pPassword)
SysFreeString(pPassword);
if (pAuthority)
SysFreeString(pAuthority);
}
HRESULT CWMITestDoc::Connect(BOOL bSilent, BOOL bFlushItems)
{
// Create an instance of the WbemLocator interface.
IWbemLocator *pLocator = NULL;
HRESULT hr;
// Make sure this isn't empty.
if (m_strNamespace.IsEmpty())
m_strNamespace =
theApp.GetProfileString(
_T("Login"), _T("Namespace"), _T("root\\default"));
if ((hr = CoCreateInstance(
CLSID_WbemLocator,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *) &pLocator)) == S_OK)
{
CString strAuthority =
theApp.GetProfileString(_T("Login"), _T("Authority"), _T("")),
strUser =
theApp.GetProfileString(_T("Login"), _T("User"), _T("")),
strLocale =
theApp.GetProfileString(_T("Login"), _T("Locale"), _T(""));
BOOL bNullPassword = theApp.GetProfileInt(_T("Login"), _T("Null"), FALSE);
DWORD dwImpLevel = theApp.GetProfileInt(_T("Login"), _T("Imp"),
RPC_C_IMP_LEVEL_IMPERSONATE),
dwAuthLevel = theApp.GetProfileInt(_T("Login"), _T("Auth"),
RPC_C_AUTHN_LEVEL_CONNECT);
// Using the locator, connect to CIMOM in the given namespace.
CWaitCursor wait;
BSTR pNamespace = m_strNamespace.AllocSysString(),
pUser = strUser.IsEmpty() ? NULL :
strUser.AllocSysString(),
pPassword = bNullPassword || !pUser ? NULL :
m_strPassword.AllocSysString(),
pAuthority = strAuthority.IsEmpty() ? NULL :
strAuthority.AllocSysString(),
pLocale = strLocale.IsEmpty() ? NULL :
strLocale.AllocSysString();
#ifdef SVCEX
IWbemServices *pTemp = NULL;
#endif
if ((hr = pLocator->ConnectServer(
pNamespace,
pUser, // username
pPassword, // password
pLocale, // locale
0L, // securityFlags
pAuthority, // authority (domain for NTLM)
NULL, // context
#ifdef SVCEX
&pTemp)) == S_OK)
#else
&m_pNamespace)) == S_OK)
#endif
{
#ifdef SVCEX
pTemp->QueryInterface(IID_IWbemServicesEx, (void **) &m_pNamespace);
pTemp->Release();
#endif
SetSecurityHelper(
m_pNamespace,
pAuthority,
pUser,
pPassword,
dwImpLevel,
dwAuthLevel);
}
else
m_pNamespace = NULL;
/*
HRESULT hr;
IWbemClassObject *pClass = NULL;
_bstr_t strClass = L"__ProviderRegistration";
IWbemServices *pSvc = NULL;
m_pNamespace->QueryInterface(IID_IWbemServicesEx, (void **) &pSvc);
hr =
m_pNamespace->GetObject(
strClass,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pClass,
NULL);
*/
if (m_pOpView)
{
m_pOpView->UpdateRootText();
if (bFlushItems)
m_pOpView->FlushItems();
}
// Done with BSTR vars.
if (pNamespace)
SysFreeString(pNamespace);
if (pUser)
SysFreeString(pUser);
if (pPassword)
SysFreeString(pPassword);
if (pAuthority)
SysFreeString(pAuthority);
if (pLocale)
SysFreeString(pLocale);
// Done with pIWbemLocator.
pLocator->Release();
}
if (!bSilent && FAILED(hr))
CWMITestDoc::DisplayWMIErrorBox(hr);
return hr;
}
void CWMITestDoc::Disconnect()
{
// If already connected, release m_pIWbemServices.
if (m_pNamespace)
{
StopOps();
m_pNamespace->Release();
m_nBusyOps = 0;
m_pNamespace = NULL;
}
}
void CWMITestDoc::OnUpdateAgainstConnection(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pNamespace != NULL);
}
void CWMITestDoc::OnQuery()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_QUERY_PROMPT;
dlg.m_dwTitleID = IDS_QUERY_TITLE;
dlg.m_bAllowQueryBrowse = TRUE;
dlg.m_pNamespace = m_pNamespace;
dlg.LoadListViaReg(_T("QueryHistory"));
if (dlg.DoModal() == IDOK)
{
m_pOpView->AddOpItem(WMI_QUERY, dlg.m_strText);
}
}
void CWMITestDoc::OnCloseDocument()
{
if (m_pOpView)
m_pOpView->FlushItems();
Disconnect();
CDocument::OnCloseDocument();
}
void CWMITestDoc::DoConnectDlg()
{
OnConnect();
}
void CWMITestDoc::OnNotificationQuery()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_NOTIFICATION_QUERY_PROMPT;
dlg.m_dwTitleID = IDS_NOTIFICATION_QUERY_TITLE;
dlg.m_dwOptionID = IDS_MONITORY_QUERY;
dlg.m_bAllowQueryBrowse = TRUE;
dlg.m_pNamespace = m_pNamespace;
dlg.m_strSuperClass = _T("__EVENT");
dlg.LoadListViaReg(_T("NotiQueryHistory"));
dlg.m_bOptionChecked = theApp.GetProfileInt(_T("Settings"), _T("MonitorQuery"), FALSE);
if (dlg.DoModal() == IDOK)
{
theApp.WriteProfileInt(_T("Settings"), _T("MonitorQuery"), dlg.m_bOptionChecked);
m_pOpView->AddOpItem(WMI_EVENT_QUERY, dlg.m_strText, dlg.m_bOptionChecked);
}
}
void CWMITestDoc::OnStop()
{
StopOps();
}
void CWMITestDoc::StopOps()
{
CTreeCtrl *pTree = m_pOpView->m_pTree;
for (HTREEITEM hitemOp = pTree->GetChildItem(m_pOpView->m_hitemRoot);
hitemOp != NULL;
hitemOp = pTree->GetNextSiblingItem(hitemOp))
{
COpWrap *pWrap = (COpWrap*) pTree->GetItemData(hitemOp);
pWrap->CancelOp(m_pNamespace);
}
}
/*
void CWMITestDoc::OnUpdateStop(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nBusyOps != 0);
}
*/
void CWMITestDoc::OnRefreshAll()
{
m_pOpView->RefreshItems();
}
void CWMITestDoc::OnEnumerateInstances()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_ENUM_INST_PROMPT;
dlg.m_dwTitleID = IDS_ENUM_INST_TITLE;
dlg.m_dwOptionID = IDS_RECURSIVE;
dlg.m_bAllowClassBrowse = TRUE;
dlg.m_pNamespace = m_pNamespace;
dlg.LoadListViaReg(_T("EnumInstHistory"));
dlg.m_bOptionChecked = theApp.GetProfileInt(_T("Settings"), _T("Recurse"), FALSE);
if (dlg.DoModal() == IDOK)
{
theApp.WriteProfileInt(_T("Settings"), _T("Recurse"), dlg.m_bOptionChecked);
m_pOpView->AddOpItem(WMI_ENUM_OBJ, dlg.m_strText, dlg.m_bOptionChecked);
}
}
void CWMITestDoc::OnEnumerateClasses()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_ENUM_CLASS_PROMPT;
dlg.m_dwTitleID = IDS_ENUM_CLASS_TITLE;
dlg.m_dwOptionID = IDS_RECURSIVE;
dlg.m_bEmptyOK = TRUE;
dlg.m_bAllowClassBrowse = TRUE;
dlg.m_pNamespace = m_pNamespace;
dlg.LoadListViaReg(_T("EnumClassHistory"));
dlg.m_bOptionChecked = theApp.GetProfileInt(_T("Settings"), _T("Recurse"), FALSE);
if (dlg.DoModal() == IDOK)
{
theApp.WriteProfileInt(_T("Settings"), _T("Recurse"), dlg.m_bOptionChecked);
m_pOpView->AddOpItem(WMI_ENUM_CLASS, dlg.m_strText, dlg.m_bOptionChecked);
}
}
void CWMITestDoc::OnGetClass()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_GET_CLASS_PROMPT;
dlg.m_dwTitleID = IDS_GET_CLASS_TITLE;
dlg.m_bAllowClassBrowse = TRUE;
dlg.m_pNamespace = m_pNamespace;
dlg.LoadListViaReg(_T("GetClassHistory"));
if (dlg.DoModal() == IDOK)
{
m_pOpView->AddOpItem(WMI_GET_CLASS, dlg.m_strText);
}
}
void CWMITestDoc::OnCreateClass()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_CREATE_CLASS_PROMPT;
dlg.m_dwTitleID = IDS_CREATE_CLASS_TITLE;
dlg.m_bAllowClassBrowse = TRUE;
dlg.m_bEmptyOK = TRUE;
dlg.m_pNamespace = m_pNamespace;
dlg.LoadListViaReg(_T("GetClassHistory"));
if (dlg.DoModal() == IDOK)
{
m_pOpView->AddOpItem(WMI_CREATE_CLASS, dlg.m_strText);
}
}
void CWMITestDoc::OnGetInstance()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_GET_INST_PROMPT;
dlg.m_dwTitleID = IDS_GET_INST_TITLE;
dlg.LoadListViaReg(_T("GetInstHistory"));
if (dlg.DoModal() == IDOK)
{
m_pOpView->AddOpItem(WMI_GET_OBJ, dlg.m_strText);
}
}
void CWMITestDoc::OnCreateInstance()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_CREATE_OBJ_PROMPT;
dlg.m_dwTitleID = IDS_CREATE_OBJ_TITLE;
dlg.m_bAllowClassBrowse = TRUE;
dlg.m_pNamespace = m_pNamespace;
dlg.LoadListViaReg(_T("GetClassHistory"));
if (dlg.DoModal() == IDOK)
{
m_pOpView->AddOpItem(WMI_CREATE_OBJ, dlg.m_strText);
}
}
void CWMITestDoc::OnRefreshCurrent()
{
HTREEITEM hItem = m_pOpView->m_pTree->GetSelectedItem();
m_pOpView->RefreshItem(hItem);
}
HTREEITEM CWMITestDoc::GetCurrentItem()
{
CMainFrame *pFrame = (CMainFrame*) AfxGetMainWnd();
if (pFrame->GetActiveView() == m_pOpView)
return m_pOpView->m_pTree->GetSelectedItem();
else
return m_pObjView->GetSelectedItem();
}
CObjInfo *CWMITestDoc::GetCurrentObj()
{
HTREEITEM hitem = GetCurrentItem();
return m_pOpView->GetObjInfo(hitem);
}
void CWMITestDoc::OnAssociators()
{
/*
HTREEITEM hitem = GetCurrentItem();
if (hitem && m_pOpView->IsObj(hitem))
{
CString strQuery,
strPath;
strPath = m_pOpView->m_pTree->GetItemText(hitem);
strQuery.Format(
_T("associators of {%s}"),
(LPCTSTR) strPath);
m_pOpView->AddOpItem(WMI_QUERY, strQuery);
}
*/
CString strObj;
if (GetSelectedObjPath(strObj))
{
CString strQuery;
strQuery.Format(
_T("associators of {%s}"),
(LPCTSTR) strObj);
m_pOpView->AddOpItem(WMI_QUERY, strQuery);
}
}
void CWMITestDoc::OnUpdateAssociators(CCmdUI* pCmdUI)
{
//HTREEITEM hitem = GetCurrentItem();
//pCmdUI->Enable(hitem && m_pOpView->IsObj(hitem));
CString strObj;
pCmdUI->Enable(GetSelectedObjPath(strObj));
}
void CWMITestDoc::OnReferences()
{
/*
HTREEITEM hitem = GetCurrentItem();
if (hitem && m_pOpView->IsObj(hitem))
{
CString strQuery,
strPath;
strPath = m_pOpView->m_pTree->GetItemText(hitem);
strQuery.Format(
_T("references of {%s}"),
(LPCTSTR) strPath);
m_pOpView->AddOpItem(WMI_QUERY, strQuery);
}
*/
CString strObj;
if (GetSelectedObjPath(strObj))
{
CString strQuery;
strQuery.Format(
_T("references of {%s}"),
(LPCTSTR) strObj);
m_pOpView->AddOpItem(WMI_QUERY, strQuery);
}
}
void CWMITestDoc::OnInstGetClass()
{
CString strClass;
if (GetSelectedClass(strClass))
m_pOpView->AddOpItem(WMI_GET_CLASS, strClass);
}
void CWMITestDoc::OnInstGetInst()
{
CString strObj;
if (GetSelectedObjPath(strObj))
m_pOpView->AddOpItem(WMI_GET_OBJ, strObj);
}
void CWMITestDoc::OnClassInstances()
{
CObjInfo *pInfo = m_pOpView->GetObjInfo(GetCurrentItem());
if (pInfo)
{
CString strClass;
strClass = pInfo->GetStringPropValue(L"__CLASS");
m_pOpView->AddOpItem(WMI_ENUM_OBJ, strClass, FALSE);
}
}
void CWMITestDoc::OnClassSuperclass()
{
CObjInfo *pInfo = m_pOpView->GetObjInfo(GetCurrentItem());
if (pInfo)
{
CString strClass;
strClass = pInfo->GetStringPropValue(L"__SUPERCLASS");
if (!strClass.IsEmpty())
m_pOpView->AddOpItem(WMI_GET_CLASS, strClass);
else
AfxMessageBox(IDS_NO_SUPERCLASS);
}
}
void CWMITestDoc::OnClassInstancesDeep()
{
CObjInfo *pInfo = m_pOpView->GetObjInfo(GetCurrentItem());
if (pInfo)
{
CString strClass;
strClass = pInfo->GetStringPropValue(L"__CLASS");
m_pOpView->AddOpItem(WMI_ENUM_OBJ, strClass, TRUE);
}
}
void CWMITestDoc::OnClassSubclasses()
{
CObjInfo *pInfo = m_pOpView->GetObjInfo(GetCurrentItem());
if (pInfo)
{
CString strClass;
strClass = pInfo->GetStringPropValue(L"__CLASS");
m_pOpView->AddOpItem(WMI_ENUM_CLASS, strClass, FALSE);
}
}
void CWMITestDoc::OnClassSubclassesDeep()
{
CObjInfo *pInfo = m_pOpView->GetObjInfo(GetCurrentItem());
if (pInfo)
{
CString strClass;
strClass = pInfo->GetStringPropValue(L"__CLASS");
m_pOpView->AddOpItem(WMI_ENUM_CLASS, strClass, TRUE);
}
}
void CWMITestDoc::OnOptions()
{
CPrefDlg dlg;
dlg.m_bLoadLast = theApp.m_bLoadLastFile;
dlg.m_bShowInherited = theApp.m_bShowInheritedProperties;
dlg.m_bShowSystem = theApp.m_bShowSystemProperties;
dlg.m_dwUpdateFlag = theApp.m_dwUpdateFlag;
dlg.m_dwClassUpdateMode = theApp.m_dwClassUpdateMode;
dlg.m_bEnablePrivsOnStartup = theApp.m_bEnablePrivsOnStartup;
dlg.m_bPrivsEnabled = theApp.m_bPrivsEnabled;
if (dlg.DoModal() == IDOK)
{
theApp.m_bLoadLastFile = dlg.m_bLoadLast;
theApp.m_bShowInheritedProperties = dlg.m_bShowInherited;
theApp.m_bShowSystemProperties = dlg.m_bShowSystem;
theApp.m_dwUpdateFlag = dlg.m_dwUpdateFlag;
theApp.m_dwClassUpdateMode = dlg.m_dwClassUpdateMode;
theApp.m_bEnablePrivsOnStartup = dlg.m_bEnablePrivsOnStartup;
theApp.m_bPrivsEnabled = dlg.m_bPrivsEnabled;
//m_pOpView->UpdateCurrentObject();
m_pOpView->UpdateCurrentItem();
}
}
void CWMITestDoc::OnSystemProps()
{
theApp.m_bShowSystemProperties ^= 1;
m_pOpView->UpdateCurrentItem();
}
void CWMITestDoc::OnUpdateSystemProps(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(theApp.m_bShowSystemProperties);
}
void CWMITestDoc::OnInheritedProps()
{
theApp.m_bShowInheritedProperties ^= 1;
m_pOpView->UpdateCurrentItem();
}
void CWMITestDoc::OnUpdateInheritedProps(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(theApp.m_bShowInheritedProperties);
}
BOOL CWMITestDoc::GetSelectedObjPath(CString &strPath)
{
CMainFrame *pFrame = (CMainFrame*) AfxGetMainWnd();
if (pFrame->GetActiveView() == m_pOpView)
return m_pOpView->GetSelectedObjPath(strPath);
else
return m_pObjView->GetSelectedObjPath(strPath);
}
BOOL CWMITestDoc::GetSelectedClass(CString &strClass)
{
CMainFrame *pFrame = (CMainFrame*) AfxGetMainWnd();
if (pFrame->GetActiveView() == m_pOpView)
return m_pOpView->GetSelectedClass(strClass);
else
return m_pObjView->GetSelectedClass(strClass);
}
void CWMITestDoc::OnReconnect()
{
Disconnect();
// If we weren't able to connect without prompting for information,
// then display the connect dialog and try again.
if (FAILED(Connect(TRUE, FALSE)))
OnConnect();
OnRefreshAll();
}
void CWMITestDoc::OnUpdateReconnect(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pNamespace != NULL);
}
void CWMITestDoc::OnTranslateValues()
{
theApp.m_bTranslateValues ^= 1;
m_pOpView->UpdateCurrentItem();
}
void CWMITestDoc::OnUpdateTranslateValues(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(theApp.m_bTranslateValues);
}
void CWMITestDoc::OnSave()
{
CObjInfo *pObj = GetCurrentObj();
COpWrap *pWrap = m_pOpView->GetCurrentOp();
if (pObj)
{
HRESULT hr;
IWbemCallResult *pResult = NULL;
if (pObj->IsInstance())
hr = m_pNamespace->PutInstance(
pObj->m_pObj,
theApp.m_dwUpdateFlag | WBEM_FLAG_USE_AMENDED_QUALIFIERS,
NULL,
&pResult);
else
hr = m_pNamespace->PutClass(
pObj->m_pObj,
theApp.m_dwUpdateFlag | theApp.m_dwClassUpdateMode |
WBEM_FLAG_USE_AMENDED_QUALIFIERS,
NULL,
&pResult);
if (SUCCEEDED(hr))
{
if (pWrap && pWrap->m_type == WMI_CREATE_OBJ)
{
_variant_t var;
hr = pObj->m_pObj->Get(L"__RELPATH", 0, &var, NULL, NULL);
if (SUCCEEDED(hr))
{
// We created an instance, but since the key fields were
// generated by WMI we'll have to use GetResultString to
// get the path.
if (var.vt == VT_NULL)
{
BSTR bstr = NULL;
if (SUCCEEDED(hr =
pResult->GetResultString(WBEM_INFINITE, &bstr)))
{
var = bstr;
SysFreeString(bstr);
}
}
if (var.vt != VT_NULL)
{
pWrap->m_type = WMI_GET_OBJ;
pWrap->m_strOpText = var.bstrVal;
pObj->SetModified(FALSE);
m_pOpView->RefreshItem(pWrap);
m_pOpView->UpdateCurrentObject(TRUE);
}
}
}
else if (pWrap && pWrap->m_type == WMI_CREATE_CLASS)
{
_variant_t var;
hr = pObj->m_pObj->Get(L"__CLASS", 0, &var, NULL, NULL);
if (SUCCEEDED(hr))
{
pWrap->m_type = WMI_GET_CLASS;
pWrap->m_strOpText = var.bstrVal;
pObj->SetModified(FALSE);
m_pOpView->RefreshItem(pWrap);
m_pOpView->UpdateCurrentObject(TRUE);
}
}
else
{
pObj->SetModified(FALSE);
m_pOpView->UpdateCurrentObject(TRUE);
}
}
if (FAILED(hr))
DisplayWMIErrorBox(hr);
//DisplayWMIErrorBox(hr, pResult);
if (pResult)
pResult->Release();
}
}
void CWMITestDoc::OnUpdateSave(CCmdUI* pCmdUI)
{
CObjInfo *pObj = GetCurrentObj();
pCmdUI->Enable(pObj && pObj->IsModified());
}
void CWMITestDoc::DisplayWMIErrorBox(
HRESULT hres,
//IWbemCallResult *pResult,
IWbemClassObject *pObj)
{
CErrorDlg dlg;
dlg.m_hr = hres;
//dlg.m_pResult = pResult;
if (!pObj)
pObj = GetWMIErrorObject();
dlg.m_pObj.Attach(pObj, FALSE);
dlg.DoModal();
}
BOOL CWMITestDoc::EditGenericObject(DWORD dwPrompt, IWbemClassObject *pObj)
{
CPropertySheet sheet(dwPrompt);
CPropsPg pgProps;
CPropQualsPg pgQuals;
CObjInfo info;
info.SetObj(pObj);
info.SetBaseImage(IMAGE_OBJECT);
info.LoadProps(NULL);
pgProps.m_pNamespace = NULL;
pgProps.m_pObj = &info;
pgQuals.m_pObj = pObj;
pgQuals.m_bIsInstance = TRUE;
pgQuals.m_mode = CPropQualsPg::QMODE_CLASS;
sheet.AddPage(&pgProps);
sheet.AddPage(&pgQuals);
sheet.DoModal();
// This looks bad, but normally this is done by a controlling COpWrap. In
// this case we faked one, so we have to get rid of it ourselves.
delete info.GetProps();
// TODO: We need to see if this object changed before returning TRUE.
return TRUE;
}
void CWMITestDoc::DisplayWMIErrorDetails(IWbemClassObject *pObj)
{
EditGenericObject(IDS_VIEW_ERROR_INFO, pObj);
}
void CWMITestDoc::OnClassCreateInstance()
{
CObjInfo *pInfo = m_pOpView->GetObjInfo(GetCurrentItem());
if (pInfo)
{
CString strClass;
strClass = pInfo->GetStringPropValue(L"__CLASS");
m_pOpView->AddOpItem(WMI_CREATE_OBJ, strClass, FALSE);
}
}
void CWMITestDoc::OnErrorDetails()
{
COpWrap *pOp = m_pOpView->GetCurrentOp();
if (pOp && pOp->m_pErrorObj != NULL)
DisplayWMIErrorDetails(pOp->m_pErrorObj);
}
void CWMITestDoc::OnUpdateErrorDetails(CCmdUI* pCmdUI)
{
COpWrap *pOp = m_pOpView->GetCurrentOp();
pCmdUI->Enable(pOp && pOp->m_pErrorObj != NULL);
}
void CWMITestDoc::OnExecuteMethod(UINT uiCmd)
{
CObjInfo *pInfo = GetCurrentObj();
if (pInfo)
{
CPropInfoArray *pProps = pInfo->GetProps();
int iWhich = uiCmd - IDC_EXECUTE_METHOD_FIRST;
if (iWhich < pProps->GetMethodCount())
{
CMethodInfo &info = pProps->m_listMethods.GetAt(
pProps->m_listMethods.FindIndex(iWhich));
ExecuteMethod(pInfo, info.m_strName);
}
}
}
void CWMITestDoc::ExecuteMethod(CObjInfo *pObj, LPCTSTR szMethod)
{
CExecMethodDlg dlg;
dlg.m_strDefaultMethod = szMethod;
dlg.m_pInfo = pObj;
dlg.DoModal();
}
void CWMITestDoc::OnExecMethod()
{
CGetTextDlg dlg;
dlg.m_dwPromptID = IDS_PROMPT_EXEC_METHOD;
dlg.m_dwTitleID = IDS_EXEC_METHOD_TITLE;
dlg.m_bAllowClassBrowse = TRUE;
dlg.m_bEmptyOK = FALSE;
dlg.m_pNamespace = m_pNamespace;
dlg.LoadListViaReg(_T("ExecObjHistory"));
if (dlg.DoModal() == IDOK)
{
IWbemClassObjectPtr pObj;
HRESULT hr;
hr =
m_pNamespace->GetObject(
_bstr_t(dlg.m_strText),
WBEM_FLAG_RETURN_WBEM_COMPLETE,
NULL,
&pObj,
NULL);
if (SUCCEEDED(hr))
{
CObjInfo info;
info.SetObj(pObj);
info.SetBaseImage(IMAGE_OBJECT);
info.LoadProps(m_pNamespace);
// The method is blank so the user can choose when the dialog
// comes up.
ExecuteMethod(&info, _T(""));
// This looks bad, but normally this is done by a controlling COpWrap. In
// this case we faked one, so we have to get rid of it ourselves.
delete info.GetProps();
}
else
DisplayWMIErrorBox(hr);
}
}
void CWMITestDoc::OnShowMof()
{
CObjInfo *pObj = GetCurrentObj();
CMofDlg dlg;
dlg.m_pObj = pObj->m_pObj;
dlg.DoModal();
}
void CWMITestDoc::OnUpdateShowMof(CCmdUI* pCmdUI)
{
CObjInfo *pObj = GetCurrentObj();
pCmdUI->Enable(pObj != NULL);
}
void CWMITestDoc::ExportItem(HTREEITEM hitem)
{
CExportDlg dlg(FALSE);
dlg.m_bTranslate = theApp.GetProfileInt(_T("Settings"), _T("ExportTrans"), TRUE);
dlg.m_bShowSystemProps = theApp.GetProfileInt(_T("Settings"), _T("ExportShowSys"), TRUE);
if (dlg.DoModal() == IDOK)
{
theApp.WriteProfileInt(_T("Settings"), _T("ExportTrans"), dlg.m_bTranslate);
theApp.WriteProfileInt(_T("Settings"), _T("ExportShowSys"), dlg.m_bShowSystemProps);
m_pOpView->ExportItemToFile(
dlg.GetFileName(),
hitem,
dlg.m_bShowSystemProps,
dlg.m_bTranslate);
}
}
void CWMITestDoc::OnExportTree()
{
ExportItem(m_pOpView->m_hitemRoot);
}
void CWMITestDoc::OnExportItem()
{
ExportItem(GetCurrentItem());
}
void CWMITestDoc::OnFilterBindings()
{
CBindingSheet sheet(IDS_FILTER_TO_CONSUMER_BINDINGS);
CFilterPg pgFilters;
CConsumerPg pgConsumers;
CBindingPg pgBindings;
sheet.AddPage(&pgFilters);
sheet.AddPage(&pgConsumers);
sheet.AddPage(&pgBindings);
sheet.DoModal();
}
void CWMITestDoc::OnStopCurrent()
{
COpWrap *pWrap = m_pOpView->GetCurrentOp();
if (pWrap)
pWrap->CancelOp(m_pNamespace);
}
void CWMITestDoc::OnUpdateRefreshCurrent(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pOpView->GetCurrentOp() != NULL);
}
void CWMITestDoc::OnUpdateStopCurrent(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pOpView->GetCurrentOp() != NULL);
}