HRESULT CPageEvents::UpdateNodeFromItem(LPARAM lNode) { // Typecast the tree item's param as an XML element pointer IXMLDOMElement* pElement = reinterpret_cast<IXMLDOMElement*>(lNode); if (!pElement) return S_FALSE; // Determine if the node is a group element or an event CComBSTR bstrTagName; VERIFY(SUCCEEDED(pElement->get_tagName(&bstrTagName))); bool bIsEvent = 0 == wcscmp(bstrTagName, m_bstrEvent); bool bIsGroup = !bIsEvent && 0 == wcscmp(bstrTagName, m_bstrEventGroup); ASSERT(bIsEvent || bIsGroup); if (bIsEvent) { // Set the LogAsNTEvent attribute if (GetDlgItem(IDC_LOG2NT)->IsWindowEnabled()) { CComVariant varLog2NT(!!IsDlgButtonChecked(IDC_LOG2NT)); pElement->setAttribute(m_bstrLogAsNTEvent, varLog2NT); } // Set the LogAsDBEvent attribute if (GetDlgItem(IDC_LOG2DB)->IsWindowEnabled()) { CComVariant varLog2DB(!!IsDlgButtonChecked(IDC_LOG2DB)); pElement->setAttribute(m_bstrLogAsDBEvent, varLog2DB); } } else { // TODO: Work-out how to best support indeterminate checkbox state } // Indicate success return S_OK; }
HRESULT CPageEvents::UpdateItemFromNode(LPARAM lNode) { USES_CONVERSION; // Typecast the tree item's param as an XML element pointer IXMLDOMElement* pElement = reinterpret_cast<IXMLDOMElement*>(lNode); if (!pElement) return S_FALSE; // Use to enable/disable the check boxes bool bEnableLog2NT = false; bool bEnableLog2DB = false; // Determine if the node is a group element or an event CComBSTR bstrTagName; VERIFY(SUCCEEDED(pElement->get_tagName(&bstrTagName))); bool bIsEvent = 0 == wcscmp(bstrTagName, m_bstrEvent); bool bIsGroup = !bIsEvent && 0 == wcscmp(bstrTagName, m_bstrEventGroup); ASSERT(bIsEvent || bIsGroup); if (bIsEvent) { // Get the Severity attribute CComVariant varSeverity; pElement->getAttribute(m_bstrSeverity, &varSeverity); VERIFY(SUCCEEDED(varSeverity.ChangeType(VT_BSTR))); SetDlgItemText(IDC_EVENT_TYPE, TypeFromSeverity(V_BSTR(&varSeverity))); // Get the event id attribute CComVariant varEventID; pElement->getAttribute(m_bstrID, &varEventID); VERIFY(SUCCEEDED(varEventID.ChangeType(VT_I4))); SetDlgItemInt(IDC_EVENT_ID, V_I4(&varEventID)); // Get the CanChangeLogAsNTEvent attribute IXMLDOMAttributePtr spAttrNT; if (S_OK == pElement->getAttributeNode(m_bstrCanChangeLogAsNTEvent, &spAttrNT)) { CComVariant varCanChange; spAttrNT->get_value(&varCanChange); VERIFY(SUCCEEDED(varCanChange.ChangeType(VT_BOOL))); bEnableLog2NT = !!V_BOOL(&varCanChange); } else { // When not specified, the default is true bEnableLog2NT = true; } // Get the LogAsNTEvent attribute CComVariant varLog2NT; pElement->getAttribute(m_bstrLogAsNTEvent, &varLog2NT); VERIFY(SUCCEEDED(varLog2NT.ChangeType(VT_BOOL))); CheckDlgButton(IDC_LOG2NT, V_BOOL(&varLog2NT)); // Get the CanChangeLogAsDBEvent attribute IXMLDOMAttributePtr spAttrDB; if (S_OK == pElement->getAttributeNode(m_bstrCanChangeLogAsDBEvent, &spAttrDB)) { CComVariant varCanChange; spAttrDB->get_value(&varCanChange); VERIFY(SUCCEEDED(varCanChange.ChangeType(VT_BOOL))); bEnableLog2DB = !!V_BOOL(&varCanChange); } else { // When not specified, the default is true bEnableLog2DB = true; } // Get the LogAsDBEvent attribute CComVariant varLog2DB; pElement->getAttribute(m_bstrLogAsDBEvent, &varLog2DB); VERIFY(SUCCEEDED(varLog2DB.ChangeType(VT_BOOL))); CheckDlgButton(IDC_LOG2DB, V_BOOL(&varLog2DB)); } else { // Always show the type as "Group" CString strGroup; strGroup.LoadString(IDS_TYPE_GROUP); SetDlgItemText(IDC_EVENT_TYPE, strGroup); // Get the group LowerBound attribute CComVariant varLowerBound; pElement->getAttribute(m_bstrLowerBound, &varLowerBound); VERIFY(SUCCEEDED(varLowerBound.ChangeType(VT_UI4))); // Get the group UpperBound attribute CComVariant varUpperBound; pElement->getAttribute(m_bstrUpperBound, &varUpperBound); VERIFY(SUCCEEDED(varUpperBound.ChangeType(VT_UI4))); // Format the group's range into a string TCHAR szID[_MAX_PATH]; wsprintf(szID, TEXT("%u - %u"), V_UI4(&varLowerBound), V_UI4(&varUpperBound)); SetDlgItemText(IDC_EVENT_ID, szID); // TODO: Work-out how to best support indeterminate checkbox state CheckDlgButton(IDC_LOG2NT, false); CheckDlgButton(IDC_LOG2DB, false); } // Get the event/group Description attribute CComVariant varDescription; pElement->getAttribute(m_bstrDescription, &varDescription); VERIFY(SUCCEEDED(varDescription.ChangeType(VT_BSTR))); SetDlgItemText(IDC_DESCRIPTION, OLE2CT(V_BSTR(&varDescription))); // Enable/disable checkboxes GetDlgItem(IDC_LOG2NT)->EnableWindow(bEnableLog2NT); GetDlgItem(IDC_LOG2DB)->EnableWindow(bEnableLog2DB); // Uncheck checkboxes that are disabled if (!bEnableLog2NT) CheckDlgButton(IDC_LOG2NT, false); if (!bEnableLog2DB) CheckDlgButton(IDC_LOG2DB, false); // Indicate success return S_OK; }
static HRESULT ParseToolsList(IXMLDOMDocument* pXMLDom, BOOL bIsStandard) { static const _bstr_t XMLFileTag(L"MSCONFIGTOOLFILE"); static const _bstr_t XMLToolsTag(L"MSCONFIGTOOLS"); HRESULT hr = S_OK; IXMLDOMNode *pIterator = NULL, *pTmp = NULL; IXMLDOMElement* pEl = NULL; DOMNodeType type; _bstr_t tagName; if (!pXMLDom) return E_POINTER; // E_INVALIDARG pXMLDom->get_documentElement(&pEl); pEl->get_tagName(&tagName.GetBSTR()); _wcsupr(tagName); if (tagName == XMLFileTag) { pEl->get_firstChild(&pIterator); SAFE_RELEASE(pEl); while (pIterator) { pIterator->get_nodeType(&type); if (type == NODE_ELEMENT) { pIterator->QueryInterface(IID_PPV_ARG(IXMLDOMElement, &pEl) /* IID_PPV_ARGS(&pEl) */); pEl->get_tagName(&tagName.GetBSTR()); _wcsupr(tagName); if (tagName == XMLToolsTag) { pEl->get_firstChild(&pIterator); SAFE_RELEASE(pEl); while (pIterator) { pIterator->QueryInterface(IID_PPV_ARG(IXMLDOMElement, &pEl) /* IID_PPV_ARGS(&pEl) */); AddTool(pEl, bIsStandard); SAFE_RELEASE(pEl); pIterator->get_nextSibling(&pTmp); SAFE_RELEASE(pIterator); pIterator = pTmp; } // SAFE_RELEASE(pIterator); break; } SAFE_RELEASE(pEl); } pIterator->get_nextSibling(&pTmp); SAFE_RELEASE(pIterator); pIterator = pTmp; } // SAFE_RELEASE(pIterator); } else if (tagName == XMLToolsTag) { pEl->get_firstChild(&pIterator); SAFE_RELEASE(pEl); while (pIterator) { pIterator->QueryInterface(IID_PPV_ARG(IXMLDOMElement, &pEl) /* IID_PPV_ARGS(&pEl) */); AddTool(pEl, bIsStandard); SAFE_RELEASE(pEl); pIterator->get_nextSibling(&pTmp); SAFE_RELEASE(pIterator); pIterator = pTmp; } // SAFE_RELEASE(pIterator); } SAFE_RELEASE(pEl); return hr; }