Merge branch '1.x' of ssh://authdev.it.ohio-state.edu/~scantor/git/cpp-xmltooling...
[shibboleth/cpp-xmltooling.git] / xmltooling / impl / AnyElement.cpp
1 /**
2  * Licensed to the University Corporation for Advanced Internet
3  * Development, Inc. (UCAID) under one or more contributor license
4  * agreements. See the NOTICE file distributed with this work for
5  * additional information regarding copyright ownership.
6  *
7  * UCAID licenses this file to you under the Apache License,
8  * Version 2.0 (the "License"); you may not use this file except
9  * in compliance with the License. You may obtain a copy of the
10  * License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17  * either express or implied. See the License for the specific
18  * language governing permissions and limitations under the License.
19  */
20
21 /**
22  * AnyElement.cpp
23  * 
24  * Advanced anyType implementation suitable for deep processing of unknown content.
25  */
26
27 #include "internal.h"
28 #include "exceptions.h"
29 #include "impl/AnyElement.h"
30 #include "util/NDC.h"
31 #include "util/XMLHelper.h"
32
33 #include <xercesc/util/XMLUniDefs.hpp>
34
35 using namespace xmltooling;
36 using namespace xercesc;
37 using namespace std;
38
39 AnyElementImpl::AnyElementImpl()
40 {
41 }
42
43 AnyElementImpl::AnyElementImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
44     : AbstractXMLObject(nsURI, localName, prefix, schemaType)
45 {
46 }
47
48 AnyElementImpl::~AnyElementImpl()
49 {
50 }
51
52 XMLObject* AnyElementImpl::clone() const {
53     auto_ptr<XMLObject> domClone(AbstractDOMCachingXMLObject::clone());
54     AnyElementImpl* ret=dynamic_cast<AnyElementImpl*>(domClone.get());
55     if (ret) {
56         domClone.release();
57         return ret;
58     }
59
60     return new AnyElementImpl(*this);
61 }
62
63 AnyElementImpl::AnyElementImpl(const AnyElementImpl& src)
64         : AbstractXMLObject(src),
65           AbstractDOMCachingXMLObject(src),
66           AbstractComplexElement(src),
67           AbstractAttributeExtensibleXMLObject(src) {
68     const vector<XMLObject*>& children = src.getUnknownXMLObjects();
69     for (vector<XMLObject*>::const_iterator i=children.begin(); i!=children.end(); ++i)
70         getUnknownXMLObjects().push_back((*i)->clone());
71 }       
72
73 void AnyElementImpl::marshallAttributes(DOMElement* domElement) const
74 {
75     marshallExtensionAttributes(domElement);
76 }
77
78 void AnyElementImpl::processChildElement(XMLObject* childXMLObject, const DOMElement* root)
79 {
80     getUnknownXMLObjects().push_back(childXMLObject);
81 }
82
83 void AnyElementImpl::processAttribute(const DOMAttr* attribute)
84 {
85     unmarshallExtensionAttribute(attribute);
86 }
87
88 XMLObject* AnyElementBuilder::buildObject(
89     const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType
90     ) const
91 {
92     return new AnyElementImpl(nsURI, localName, prefix, schemaType);
93 }