+/*\r
+* Copyright 2001-2006 Internet2\r
+ * \r
+* Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+/**\r
+ * XMLSecSignatureImpl.cpp\r
+ * \r
+ * Signature class for XMLSec-based signature-handling\r
+ */\r
+\r
+#include "internal.h"\r
+#include "AbstractElementProxy.h"\r
+#include "exceptions.h"\r
+#include "io/AbstractXMLObjectMarshaller.h"\r
+#include "io/AbstractXMLObjectUnmarshaller.h"\r
+#include "signature/impl/KeyInfoImpl.h"\r
+#include "util/NDC.h"\r
+#include "util/XMLHelper.h"\r
+#include "validation/AbstractValidatingXMLObject.h"\r
+\r
+#include <log4cpp/Category.hh>\r
+\r
+using namespace xmltooling;\r
+using namespace log4cpp;\r
+using namespace std;\r
+\r
+#if defined (_MSC_VER)\r
+ #pragma warning( push )\r
+ #pragma warning( disable : 4250 4251 )\r
+#endif\r
+\r
+namespace xmltooling {\r
+ \r
+ class XMLTOOL_DLLLOCAL KeyInfoImpl : public KeyInfo, public AbstractDOMCachingXMLObject, public AbstractElementProxy,\r
+ public AbstractValidatingXMLObject, public AbstractXMLObjectMarshaller, public AbstractXMLObjectUnmarshaller\r
+ {\r
+ public:\r
+ virtual ~KeyInfoImpl() {}\r
+\r
+ KeyInfoImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix)\r
+ : AbstractXMLObject(nsURI, localName, prefix), m_Id(NULL) {}\r
+ \r
+ KeyInfoImpl(const KeyInfoImpl& src) : AbstractXMLObject(src), AbstractDOMCachingXMLObject(src),\r
+ AbstractElementProxy(src), AbstractValidatingXMLObject(src), m_Id(XMLString::replicate(src.m_Id)) {\r
+ for (list<XMLObject*>::const_iterator i=src.m_children.begin(); i!=src.m_children.end(); i++) {\r
+ getXMLObjects().push_back((*i) ? (*i)->clone() : NULL);\r
+ }\r
+ }\r
+ \r
+ IMPL_XMLOBJECT_ATTRIB(Id);\r
+ IMPL_XMLOBJECT_CLONE(KeyInfo);\r
+\r
+ protected:\r
+ void marshallAttributes(DOMElement* domElement) const {\r
+ if(getId()) {\r
+ domElement->setAttributeNS(NULL, ID_ATTRIB_NAME, getId());\r
+ domElement->setIdAttributeNS(NULL, ID_ATTRIB_NAME);\r
+ }\r
+ }\r
+\r
+ void marshallElementContent(DOMElement* domElement) const {\r
+ if(getTextContent()) {\r
+ domElement->appendChild(domElement->getOwnerDocument()->createTextNode(getTextContent()));\r
+ }\r
+ }\r
+\r
+ void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {\r
+ getXMLObjects().push_back(childXMLObject);\r
+ }\r
+\r
+ void processAttribute(const DOMAttr* attribute) {\r
+ if (XMLHelper::isNodeNamed(attribute, NULL, ID_ATTRIB_NAME))\r
+ setId(attribute->getValue());\r
+ }\r
+\r
+ void processElementContent(const XMLCh* elementContent) {\r
+ setTextContent(elementContent);\r
+ }\r
+ };\r
+ \r
+};\r
+\r
+#if defined (_MSC_VER)\r
+ #pragma warning( pop )\r
+#endif\r
+\r
+KeyInfo* KeyInfoBuilderImpl::buildObject(const XMLCh* ns, const XMLCh* name, const XMLCh* prefix) const\r
+{\r
+ return new KeyInfoImpl(ns,name,prefix);\r
+}\r