|
|
/*++
Copyright (C) 1997-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
// PropQualsPg.cpp : implementation file
//
#include "stdafx.h"
#include "wmitest.h"
#include "WMITestDoc.h"
#include "MainFrm.h"
#include "OpWrap.h"
#include "PropQualsPg.h"
#include "EditQualDlg.h"
#include "OpView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CPropQualsPg property page
IMPLEMENT_DYNCREATE(CPropQualsPg, CPropertyPage)
CPropQualsPg::CPropQualsPg() : CPropertyPage(CPropQualsPg::IDD), m_mode(QMODE_PROP), m_bIsInstance(FALSE), m_pObj(NULL), m_pQuals(NULL) { //{{AFX_DATA_INIT(CPropQualsPg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CPropQualsPg::~CPropQualsPg() { if (m_pQuals) m_pQuals->Release(); }
void CPropQualsPg::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPropQualsPg)
DDX_Control(pDX, IDC_QUALS, m_ctlQuals); //}}AFX_DATA_MAP
if (!pDX->m_bSaveAndValidate) { } else { /*
// Delete the quals in m_listQualsToDelete.
POSITION pos = m_listQualsToDelete.GetHeadPosition();
while(pos) { CQual &qual = m_listQualsToDelete.GetNext(pos); HRESULT hr;
hr = m_pQuals->Delete(_bstr_t(qual.m_strName)); }
// Add our quals.
BOOL bNoFlavor = m_bIsInstance || !m_bInPropQualMode;
pos = m_listQuals.GetHeadPosition();
while(pos) { CQual &qual = m_listQuals.GetNext(pos); HRESULT hr;
hr = m_pQuals->Put( _bstr_t(qual.m_strName), &qual.m_var, bNoFlavor ? 0 : qual.m_lFlavor);
if (FAILED(hr)) // TODO: We need to tell the user which qualifer
// failed here.
CWMITestDoc::DisplayWMIErrorBox(hr, NULL); } */ if (!m_bIsInstance) { // Now put in the standard qualifer.
PROP_TYPE type = (PROP_TYPE) (GetCheckedRadioButton(IDC_KEY, IDC_NORMAL) - IDC_KEY);
// Get rid of the previous one since these are apparently mutually
// exclusive but winmgmt doesn't do it for us.
if (type != m_type && m_type != PROP_NORMAL) m_pQuals->Delete(TypeToQual(m_type));
if (type != PROP_NORMAL) { _variant_t var = true; LPCWSTR szVar = TypeToQual(type); HRESULT hr;
hr = m_pQuals->Put( szVar, &var, 0);
if (FAILED(hr)) // TODO: We need to tell the user which qualifer
// failed here.
CWMITestDoc::DisplayWMIErrorBox(hr); } } } }
void CPropQualsPg::InitListCtrl() { RECT rect; CString strTemp; m_ctlQuals.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_ctlQuals.SetImageList(&((CMainFrame *) AfxGetMainWnd())->m_imageList, LVSIL_SMALL); m_ctlQuals.GetClientRect(&rect);
strTemp.LoadString(IDS_NAME); m_ctlQuals.InsertColumn(0, strTemp, LVCFMT_LEFT, rect.right * 25 / 100); strTemp.LoadString(IDS_TYPE); m_ctlQuals.InsertColumn(1, strTemp, LVCFMT_LEFT, rect.right * 25 / 100); strTemp.LoadString(IDS_VALUE); m_ctlQuals.InsertColumn(2, strTemp, LVCFMT_LEFT, rect.right * 50 / 100); }
LPCWSTR CPropQualsPg::TypeToQual(PROP_TYPE type) { LPCWSTR szRet = NULL;
switch(type) { case PROP_KEY: szRet = L"key"; break;
case PROP_INDEXED: szRet = L"indexed"; break;
case PROP_NOT_NULL: szRet = L"not_null"; break; }
return szRet; }
HRESULT CPropQualsPg::InitQualSet() { HRESULT hr;
if (m_mode == QMODE_PROP) hr = m_pObj->GetPropertyQualifierSet( _bstr_t(m_propInfo.m_strName), &m_pQuals); else if (m_mode == QMODE_CLASS) hr = m_pObj->GetQualifierSet(&m_pQuals); else hr = m_pObj->GetMethodQualifierSet( _bstr_t(m_strMethodName), &m_pQuals);
return hr; }
void CPropQualsPg::LoadQuals() { HRESULT hr; //CString strType;
//int iImage;
//m_propInfo.GetPropType(strType, &iImage);
//SetDlgItemText(IDC_TYPE, strType);
m_ctlQuals.DeleteAllItems(); m_listQuals.RemoveAll();
m_type = PROP_NORMAL;
if (SUCCEEDED(hr = InitQualSet())) { int iItem = 0;
if (SUCCEEDED(hr = m_pQuals->BeginEnumeration(0))) { BSTR pName = NULL; _variant_t var; long lFlavor; BOOL bIgnoreQual = FALSE;
while(1) { hr = m_pQuals->Next( 0, &pName, &var, &lFlavor);
if (FAILED(hr) || hr == WBEM_S_NO_MORE_DATA) break;
// We won't add every qual to our list when editing a property's
// qualifiers.
if (IsInPropMode()) { bIgnoreQual = TRUE;
if (!_wcsicmp(pName, L"key")) { if ((bool) var) m_type = PROP_KEY; } else if (!_wcsicmp(pName, L"indexed")) { if ((bool) var) m_type = PROP_INDEXED; } else if (!_wcsicmp(pName, L"not_null")) { if ((bool) var) m_type = PROP_NOT_NULL; } // Just skip this lame one.
else if (!_wcsicmp(pName, L"CIMTYPE")) { } else bIgnoreQual = FALSE; }
if (!bIgnoreQual) AddQualifier(_bstr_t(pName), &var, lFlavor);
SysFreeString(pName); } } } UpdateButtons();
CheckRadioButton(IDC_KEY, IDC_NORMAL, IDC_KEY + m_type);
if (FAILED(hr)) CWMITestDoc::DisplayWMIErrorBox(hr); }
CIMTYPE CPropQualsPg::QualTypeToCIMTYPE(VARENUM vt) { CIMTYPE type;
switch((long) vt & ~VT_ARRAY) { case VT_BSTR: type = CIM_STRING; break;
case VT_BOOL: type = CIM_BOOLEAN; break;
case VT_I4: type = CIM_SINT32; break;
case VT_R8: type = CIM_REAL64; break; }
if (vt & VT_ARRAY) type |= CIM_FLAG_ARRAY;
return type; }
BEGIN_MESSAGE_MAP(CPropQualsPg, CPropertyPage) //{{AFX_MSG_MAP(CPropQualsPg)
ON_BN_CLICKED(IDC_ADD, OnAdd) ON_BN_CLICKED(IDC_EDIT, OnEdit) ON_BN_CLICKED(IDC_DELETE, OnDelete) ON_NOTIFY(NM_DBLCLK, IDC_QUALS, OnDblclkQuals) ON_NOTIFY(LVN_ITEMCHANGED, IDC_QUALS, OnItemchangedQuals) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPropQualsPg message handlers
BOOL CPropQualsPg::OnInitDialog() { CPropertyPage::OnInitDialog(); InitListCtrl();
if (m_bIsInstance || m_mode == QMODE_METHOD) { const DWORD dwIDs[] = { IDC_KEY, IDC_INDEXED, IDC_NON_NULL, IDC_NORMAL, };
for (int i = 0; i < sizeof(dwIDs) / sizeof(dwIDs[0]); i++) GetDlgItem(dwIDs[i])->EnableWindow(FALSE); }
LoadQuals(); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
#define DEF_FLAVOR (WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE | \
WBEM_FLAVOR_FLAG_PROPAGATE_TO_DERIVED_CLASS | \ WBEM_FLAVOR_OVERRIDABLE | \ WBEM_FLAVOR_NOT_AMENDED)
void CPropQualsPg::OnAdd() { CEditQualDlg dlg; _variant_t var;
dlg.m_propUtil.m_bNewProperty = TRUE; dlg.m_propUtil.m_bIsQualifier = TRUE; dlg.m_propUtil.m_pNamespace = g_pOpView->GetDocument()->m_pNamespace; dlg.m_bIsInstance = m_bIsInstance; dlg.m_propUtil.m_prop.SetType(CIM_STRING); dlg.m_propUtil.m_pVar = &var; dlg.m_lFlavor = DEF_FLAVOR;
if (dlg.DoModal() == IDOK) { HRESULT hr;
if (SUCCEEDED(hr = m_pQuals->Put( _bstr_t(dlg.m_propUtil.m_prop.m_strName), &var, m_bIsInstance ? 0 : dlg.m_lFlavor))) { AddQualifier( dlg.m_propUtil.m_prop.m_strName, &var, dlg.m_lFlavor); } else CWMITestDoc::DisplayWMIErrorBox(hr); } }
void CPropQualsPg::OnEdit() { int iItem = m_ctlQuals.GetSelectionMark();
if (iItem != -1) { CEditQualDlg dlg; CQual &qual = m_listQuals.GetAt(m_listQuals.FindIndex(iItem)); _variant_t var = qual.m_var;
dlg.m_propUtil.m_bNewProperty = FALSE; dlg.m_propUtil.m_bIsQualifier = TRUE; dlg.m_bIsInstance = m_bIsInstance; dlg.m_propUtil.m_prop.m_strName = qual.m_strName; dlg.m_propUtil.m_prop.SetType(QualTypeToCIMTYPE((VARENUM) qual.m_var.vt)); dlg.m_propUtil.m_pVar = &var; dlg.m_lFlavor = qual.m_lFlavor;
if (dlg.DoModal() == IDOK) { CString strValue; HRESULT hr;
if (SUCCEEDED(hr = m_pQuals->Put( _bstr_t(qual.m_strName), &var, m_bIsInstance ? 0 : dlg.m_lFlavor))) { qual.m_lFlavor = dlg.m_lFlavor; qual.m_var = var;
dlg.m_propUtil.m_prop.VariantToString(&qual.m_var, strValue, TRUE); m_ctlQuals.SetItemText(iItem, 2, strValue); } else CWMITestDoc::DisplayWMIErrorBox(hr); } } }
void CPropQualsPg::OnDelete() { int iItem = m_ctlQuals.GetSelectionMark();
if (iItem != -1) { CQual qual = m_listQuals.GetAt(m_listQuals.FindIndex(iItem)); HRESULT hr; if (SUCCEEDED(hr = m_pQuals->Delete(_bstr_t(qual.m_strName)))) { m_ctlQuals.DeleteItem(iItem);
m_listQuals.RemoveAt(m_listQuals.FindIndex(iItem));
// Save this so we can delete it later.
//m_listQualsToDelete.AddTail(qual);
int nItems = m_ctlQuals.GetItemCount();
if (iItem >= nItems) iItem--;
if (iItem >= 0) m_ctlQuals.SetItemState(iItem, LVIS_SELECTED, LVIS_SELECTED); } else CWMITestDoc::DisplayWMIErrorBox(hr); } }
void CPropQualsPg::UpdateButtons() { int iIndex = GetSelectedItem();
GetDlgItem(IDC_DELETE)->EnableWindow(iIndex != -1); GetDlgItem(IDC_EDIT)->EnableWindow(iIndex != -1); }
void CPropQualsPg::AddQualifier(LPCTSTR szName, VARIANT *pVar, long lFlavor) { CQual qual;
qual.m_strName = szName; qual.m_var = *pVar; qual.m_lFlavor = lFlavor;
m_listQuals.AddTail(qual);
CPropInfo prop; int iImage, iItem = m_ctlQuals.GetItemCount(); CIMTYPE type = QualTypeToCIMTYPE((VARENUM) pVar->vt); CString strType, strValue;
prop.SetType(type); prop.GetPropType(strType, &iImage); prop.VariantToString(&qual.m_var, strValue, TRUE);
m_ctlQuals.InsertItem(iItem, qual.m_strName, iImage); m_ctlQuals.SetItemText(iItem, 1, strType); m_ctlQuals.SetItemText(iItem, 2, strValue); }
int CPropQualsPg::GetSelectedItem() { POSITION pos = m_ctlQuals.GetFirstSelectedItemPosition();
if (pos) return m_ctlQuals.GetNextSelectedItem(pos); else return -1; }
void CPropQualsPg::OnDblclkQuals(NMHDR* pNMHDR, LRESULT* pResult) { OnEdit(); *pResult = 0; }
void CPropQualsPg::OnItemchangedQuals(NMHDR* pNMHDR, LRESULT* pResult) { //NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
UpdateButtons(); *pResult = 0; }
|