/* * Copyright 1999-2001,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * $Id: XMLDOMElement.cpp 176026 2004-09-08 13:57:07Z peiyongz $ */ #include "stdafx.h" #include "xml4com.h" #include "XMLDOMElement.h" #include "XMLDOMAttribute.h" #include "XMLDOMNodeList.h" // IXMLDOMElement methods STDMETHODIMP CXMLDOMElement::get_tagName(BSTR *pVal) { ATLTRACE(_T("CXMLDOMElement::get_tagName\n")); if (NULL == pVal) return E_POINTER; *pVal = NULL; try { *pVal = SysAllocString(element->getTagName()); } catch(DOMException& ex) { return MakeHRESULT(ex); } catch(...) { return E_FAIL; } return S_OK; } STDMETHODIMP CXMLDOMElement::getAttribute(BSTR name, VARIANT *pVal) { ATLTRACE(_T("CXMLDOMElement::getAttribute\n")); if (NULL == pVal) return E_POINTER; ::VariantInit(pVal); V_VT(pVal) = VT_EMPTY; try { V_VT(pVal) = VT_BSTR; V_BSTR(pVal) = SysAllocString(element->getAttribute(name)); } catch(DOMException& ex) { return MakeHRESULT(ex); } catch(...) { return E_FAIL; } return S_OK; } STDMETHODIMP CXMLDOMElement::setAttribute(BSTR name, VARIANT value) { ATLTRACE(_T("CXMLDOMElement::setAttribute\n")); try { if (V_VT(&value) == VT_BSTR) { element->setAttribute(name, value.bstrVal); } else { element->setAttribute(name,(BSTR) (_bstr_t) value); } } catch(DOMException& ex) { return MakeHRESULT(ex); } catch(...) { return E_FAIL; } return S_OK; } STDMETHODIMP CXMLDOMElement::removeAttribute(BSTR name) { ATLTRACE(_T("CXMLDOMElement::removeAttribute\n")); try { element->removeAttribute(name); } catch(DOMException& ex) { return MakeHRESULT(ex); } catch(...) { return E_FAIL; } return S_OK; } STDMETHODIMP CXMLDOMElement::getAttributeNode(BSTR name, IXMLDOMAttribute **attr) { ATLTRACE(_T("CXMLDOMElement::getAttributeNode\n")); if (NULL == attr) return E_POINTER; *attr = NULL; DOMAttr* attrNode=element->getAttributeNode(name); if(attrNode==NULL) return S_OK; CXMLDOMAttributeObj *pObj = NULL; HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj); if (S_OK != hr) return hr; pObj->AddRef(); pObj->SetOwnerDoc(m_pIXMLDOMDocument); try { pObj->attr = attrNode; } catch(DOMException& ex) { pObj->Release(); return MakeHRESULT(ex); } catch(...) { pObj->Release(); return E_FAIL; } hr = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast (attr)); if (S_OK != hr) *attr = NULL; pObj->Release(); return hr; } STDMETHODIMP CXMLDOMElement::setAttributeNode(IXMLDOMAttribute *attr, IXMLDOMAttribute **attributeNode) { ATLTRACE(_T("CXMLDOMElement::setAttributeNode\n")); if (NULL == attr || NULL == attributeNode) return E_POINTER; *attributeNode = NULL; DOMAttr* newAttr = NULL; IIBMXMLDOMNodeIdentity* nodeID = NULL; HRESULT sc = attr->QueryInterface(IID_IIBMXMLDOMNodeIdentity,(void**) &nodeID); if(SUCCEEDED(sc)) { long id = 0; sc = nodeID->get_NodeId(&id); nodeID->Release(); if(SUCCEEDED(sc)) { // // any subsequent failure will be reported as an invalid arg // sc = E_INVALIDARG; try { DOMNode* newNode = (DOMNode*) id; if(newNode->getNodeType() == DOMNode::ATTRIBUTE_NODE) { newAttr = (DOMAttr*) newNode; } } catch(...) { } } } // // if we couldn't extract an attribute out of the // argument, then return with a failure code if(newAttr == NULL) return sc; sc = S_OK; try { DOMAttr* oldAttr = element->setAttributeNode(newAttr); if(oldAttr!=NULL) { CXMLDOMAttributeObj *pObj = NULL; sc = CXMLDOMAttributeObj::CreateInstance(&pObj); if (SUCCEEDED(sc)) { pObj->attr = oldAttr; pObj->AddRef(); pObj->SetOwnerDoc(m_pIXMLDOMDocument); sc = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast (attributeNode)); pObj->Release(); } } } catch(DOMException& ex) { return MakeHRESULT(ex); } catch(...) { return E_FAIL; } return sc; } STDMETHODIMP CXMLDOMElement::removeAttributeNode(IXMLDOMAttribute *attr, IXMLDOMAttribute * *attributeNode) { ATLTRACE(_T("CXMLDOMElement::removeAttributeNode\n")); if (NULL == attr || NULL == attributeNode) return E_POINTER; *attributeNode = NULL; CXMLDOMAttributeObj *pObj = NULL; HRESULT hr = CXMLDOMAttributeObj::CreateInstance(&pObj); if (S_OK != hr) return hr; pObj->AddRef(); pObj->SetOwnerDoc(m_pIXMLDOMDocument); try { long id = 0; IIBMXMLDOMNodeIdentity* nodeID = NULL; if(SUCCEEDED(attr->QueryInterface(IID_IIBMXMLDOMNodeIdentity,(void**) &nodeID))) { nodeID->get_NodeId(&id); nodeID->Release(); } pObj->attr = element->removeAttributeNode((DOMAttr*) id); } catch(DOMException& ex) { pObj->Release(); return MakeHRESULT(ex); } catch(...) { pObj->Release(); return E_FAIL; } hr = pObj->QueryInterface(IID_IXMLDOMAttribute, reinterpret_cast (attributeNode)); if (S_OK != hr) *attributeNode = NULL; pObj->Release(); return hr; } STDMETHODIMP CXMLDOMElement::getElementsByTagName(BSTR tagName, IXMLDOMNodeList **pVal) { ATLTRACE(_T("CXMLDOMElement::getElementsByTagName\n")); if (NULL == pVal) return E_POINTER; *pVal = NULL; CXMLDOMNodeListObj *pObj = NULL; HRESULT hr = CXMLDOMNodeListObj::CreateInstance(&pObj); if (S_OK != hr) return hr; pObj->AddRef(); pObj->SetOwnerDoc(m_pIXMLDOMDocument); try { pObj->m_container = element->getElementsByTagName(tagName); } catch(DOMException& ex) { pObj->Release(); return MakeHRESULT(ex); } catch(...) { pObj->Release(); return E_FAIL; } hr = pObj->QueryInterface(IID_IXMLDOMNodeList, reinterpret_cast (pVal)); if (S_OK != hr) *pVal = NULL; pObj->Release(); return hr; } STDMETHODIMP CXMLDOMElement::normalize(void) { ATLTRACE(_T("CXMLDOMElement::normalize\n")); try { element->normalize(); } catch(DOMException& ex) { return MakeHRESULT(ex); } catch(...) { return E_FAIL; } return S_OK; }