X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2Fimpl%2FAnyElement.cpp;h=bdb3ccce617e1be7142205dec52d41a0ba69f629;hb=77769b2e300d1295b8a5d717d9ede50e27d70cea;hp=132e49a6b2c6bb273575af178a53576368c288b6;hpb=2db9cdcc7164114b818749651d221c83895642f2;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/impl/AnyElement.cpp b/xmltooling/impl/AnyElement.cpp index 132e49a..bdb3ccc 100644 --- a/xmltooling/impl/AnyElement.cpp +++ b/xmltooling/impl/AnyElement.cpp @@ -15,18 +15,14 @@ */ /** - * @file AnyElement.h + * AnyElement.cpp * * Advanced anyType implementation suitable for deep processing of unknown content. */ #include "internal.h" -#include "AbstractAttributeExtensibleXMLObject.h" -#include "AbstractElementProxy.h" #include "exceptions.h" #include "impl/AnyElement.h" -#include "io/AbstractXMLObjectMarshaller.h" -#include "io/AbstractXMLObjectUnmarshaller.h" #include "util/NDC.h" #include "util/XMLHelper.h" @@ -37,85 +33,38 @@ using namespace xmltooling; using namespace log4cpp; using namespace std; -#if defined (_MSC_VER) - #pragma warning( push ) - #pragma warning( disable : 4250 4251 ) -#endif +XMLObject* AnyElementImpl::clone() const { + auto_ptr domClone(AbstractDOMCachingXMLObject::clone()); + AnyElementImpl* ret=dynamic_cast(domClone.get()); + if (ret) { + domClone.release(); + return ret; + } -namespace xmltooling { - - /** - * Implements a smart wrapper around unknown DOM content. - */ - class XMLTOOL_DLLLOCAL AnyElementImpl : public AbstractElementProxy, public AbstractAttributeExtensibleXMLObject, - public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller - { - public: - AnyElementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix) - : AbstractXMLObject(nsURI, localName, prefix) {} - virtual ~AnyElementImpl() {} - - AnyElementImpl* clone() const { - auto_ptr domClone(AbstractDOMCachingXMLObject::clone()); - AnyElementImpl* ret=dynamic_cast(domClone.get()); - if (ret) { - domClone.release(); - return ret; - } - - ret=new AnyElementImpl( - getElementQName().getNamespaceURI(),getElementQName().getLocalPart(),getElementQName().getPrefix() - ); - ret->m_namespaces=m_namespaces; - for (map::const_iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++) { - ret->m_attributeMap[i->first]=XMLString::replicate(i->second); - } - ret->setTextContent(getTextContent()); - xmltooling::clone(m_children, ret->m_children); - return ret; - } - - void marshallAttributes(DOMElement* domElement) const { - for (map::const_iterator i=m_attributeMap.begin(); i!=m_attributeMap.end(); i++) { - DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(i->first.getNamespaceURI(),i->first.getLocalPart()); - if (i->first.hasPrefix()) - attr->setPrefix(i->first.getPrefix()); - attr->setNodeValue(i->second); - domElement->setAttributeNode(attr); - } - } - - void marshallElementContent(DOMElement* domElement) const { - if(getTextContent()) { - domElement->appendChild(domElement->getOwnerDocument()->createTextNode(getTextContent())); - } - } - - void processChildElement(XMLObject* childXMLObject, const DOMElement* root) { - getXMLObjects().push_back(childXMLObject); - } - - void processAttribute(const DOMAttr* attribute) { - QName q(attribute->getNamespaceURI(),attribute->getLocalName(),attribute->getPrefix()); - setAttribute(q,attribute->getNodeValue()); - } + return new AnyElementImpl(*this); +} - void processElementContent(const XMLCh* elementContent) { - setTextContent(elementContent); - } - }; +AnyElementImpl::AnyElementImpl(const AnyElementImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src), + AbstractElementProxy(src), AbstractAttributeExtensibleXMLObject(src) { + for (list::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) { + getXMLObjects().push_back((*i) ? (*i)->clone() : NULL); + } +} -}; +void AnyElementImpl::marshallAttributes(DOMElement* domElement) const { + marshallExtensionAttributes(domElement); +} -#if defined (_MSC_VER) - #pragma warning( pop ) -#endif +void AnyElementImpl::processChildElement(XMLObject* childXMLObject, const DOMElement* root) { + getXMLObjects().push_back(childXMLObject); +} +void AnyElementImpl::processAttribute(const DOMAttr* attribute) { + unmarshallExtensionAttribute(attribute); +} XMLObject* AnyElementBuilder::buildObject( - const XMLCh* namespaceURI, const XMLCh* elementLocalName, const XMLCh* namespacePrefix + const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType ) const { - if (XMLString::stringLen(elementLocalName)==0) - throw XMLObjectException("Constructing this object requires an element name."); - return new AnyElementImpl(namespaceURI,elementLocalName,namespacePrefix); + return new AnyElementImpl(nsURI, localName, prefix, schemaType); }