зеркало из https://github.com/mozilla/gecko-dev.git
227 строки
4.4 KiB
C++
227 строки
4.4 KiB
C++
// XMLElement.cpp : Implementation of CXMLElement
|
|
#include "stdafx.h"
|
|
//#include "Activexml.h"
|
|
#include "XMLElement.h"
|
|
|
|
|
|
CXMLElement::CXMLElement()
|
|
{
|
|
m_nType = 0;
|
|
m_pParent = NULL;
|
|
}
|
|
|
|
|
|
CXMLElement::~CXMLElement()
|
|
{
|
|
}
|
|
|
|
|
|
HRESULT CXMLElement::SetParent(IXMLElement *pParent)
|
|
{
|
|
// Note: parent is not refcounted
|
|
m_pParent = pParent;
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT CXMLElement::PutType(long nType)
|
|
{
|
|
m_nType = nType;
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT CXMLElement::ReleaseAll()
|
|
{
|
|
// Release all children
|
|
m_cChildren.clear();
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXMLElement
|
|
|
|
|
|
// Return the element's tag name
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::get_tagName(/* [out][retval] */ BSTR __RPC_FAR *p)
|
|
{
|
|
if (p == NULL)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
USES_CONVERSION;
|
|
*p = SysAllocString(A2OLE(m_szTagName.c_str()));
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// Store the tag name
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::put_tagName(/* [in] */ BSTR p)
|
|
{
|
|
if (p == NULL)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
USES_CONVERSION;
|
|
m_szTagName = OLE2A(p);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// Returns the parent element
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::get_parent(/* [out][retval] */ IXMLElement __RPC_FAR *__RPC_FAR *ppParent)
|
|
{
|
|
if (ppParent == NULL)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
*ppParent = NULL;
|
|
if (m_pParent)
|
|
{
|
|
return m_pParent->QueryInterface(IID_IXMLElement, (void **) ppParent);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// Set the specified attribute value
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::setAttribute(/* [in] */ BSTR strPropertyName, /* [in] */ VARIANT PropertyValue)
|
|
{
|
|
if (strPropertyName == NULL || PropertyValue.vt != VT_BSTR)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
USES_CONVERSION;
|
|
std::string szPropertyName = OLE2A(strPropertyName);
|
|
std::string szPropertyValue = OLE2A(PropertyValue.bstrVal);
|
|
m_cAttributes[szPropertyName] = szPropertyValue;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// Return the requested attribute
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::getAttribute(/* [in] */ BSTR strPropertyName, /* [out][retval] */ VARIANT __RPC_FAR *PropertyValue)
|
|
{
|
|
if (strPropertyName == NULL || PropertyValue == NULL)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
USES_CONVERSION;
|
|
std::string szPropertyName = OLE2A(strPropertyName);
|
|
StringMap::iterator i = m_cAttributes.find(szPropertyName);
|
|
if (i == m_cAttributes.end())
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
PropertyValue->vt = VT_BSTR;
|
|
PropertyValue->bstrVal = SysAllocString(A2OLE((*i).second.c_str()));
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// Find and remove the specified attribute
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::removeAttribute(/* [in] */ BSTR strPropertyName)
|
|
{
|
|
if (strPropertyName == NULL)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
USES_CONVERSION;
|
|
std::string szPropertyName = OLE2A(strPropertyName);
|
|
StringMap::iterator i = m_cAttributes.find(szPropertyName);
|
|
if (i == m_cAttributes.end())
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
m_cAttributes.erase(i);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
// Return the child collection for this element
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::get_children(/* [out][retval] */ IXMLElementCollection __RPC_FAR *__RPC_FAR *pp)
|
|
{
|
|
CXMLElementCollectionInstance *pCollection = NULL;
|
|
CXMLElementCollectionInstance::CreateInstance(&pCollection);
|
|
if (pCollection == NULL)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
// Add children to the collection
|
|
for (ElementList::iterator i = m_cChildren.begin(); i != m_cChildren.end(); i++)
|
|
{
|
|
pCollection->Add(*i);
|
|
}
|
|
|
|
pCollection->QueryInterface(IID_IXMLElementCollection, (void **) pp);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::get_type(/* [out][retval] */ long __RPC_FAR *plType)
|
|
{
|
|
if (plType == NULL)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
*plType = m_nType;
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::get_text(/* [out][retval] */ BSTR __RPC_FAR *p)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::put_text(/* [in] */ BSTR p)
|
|
{
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::addChild(/* [in] */ IXMLElement __RPC_FAR *pChildElem, long lIndex, long lReserved)
|
|
{
|
|
if (pChildElem == NULL)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
// Set the child's parent to be this element
|
|
((CXMLElement *) pChildElem)->SetParent(this);
|
|
|
|
if (lIndex < 0 || lIndex >= m_cChildren.size())
|
|
{
|
|
// Append to end
|
|
m_cChildren.push_back(pChildElem);
|
|
}
|
|
else
|
|
{
|
|
// TODO m_cChildren.insert(&m_cChildren[lIndex]);
|
|
m_cChildren.push_back(pChildElem);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE CXMLElement::removeChild(/* [in] */ IXMLElement __RPC_FAR *pChildElem)
|
|
{
|
|
// TODO
|
|
return E_NOTIMPL;
|
|
}
|
|
|