/*++ Copyright (C) 1997-2001 Microsoft Corporation Module Name: Abstract: History: --*/ // WMITestDoc.cpp : implementation of the CWMITestDoc class // #include "stdafx.h" //#include #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); }