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;
}
Beispiel #3
0
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;
}