First cut at signing support.
[shibboleth/cpp-xmltooling.git] / xmltooling / io / AbstractXMLObjectMarshaller.cpp
index d5c4ac0..8a718a7 100644 (file)
@@ -42,7 +42,7 @@ using namespace std;
 AbstractXMLObjectMarshaller::AbstractXMLObjectMarshaller()\r
     : m_log(&Category::getInstance(XMLTOOLING_LOGCAT".Marshaller")) {}\r
 \r
-DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMDocument* document) const\r
+DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMDocument* document, MarshallingContext* ctx) const\r
 {\r
 #ifdef _DEBUG\r
     xmltooling::NDC ndc("marshall");\r
@@ -88,7 +88,7 @@ DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMDocum
             xmlObject->getElementQName().getNamespaceURI(), xmlObject->getElementQName().getLocalPart()\r
             );\r
         setDocumentElement(document, domElement);\r
-        marshallInto(*xmlObject, domElement);\r
+        marshallInto(*xmlObject, domElement, ctx);\r
 \r
         //Recache the DOM.\r
         if (dc) {\r
@@ -108,7 +108,7 @@ DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMDocum
     }\r
 }\r
 \r
-DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMElement* parentElement) const\r
+DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMElement* parentElement, MarshallingContext* ctx) const\r
 {\r
 #ifdef _DEBUG\r
     xmltooling::NDC ndc("marshall");\r
@@ -147,7 +147,7 @@ DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMEleme
         xmlObject->getElementQName().getNamespaceURI(), xmlObject->getElementQName().getLocalPart()\r
         );\r
     parentElement->appendChild(domElement);\r
-    marshallInto(*xmlObject, domElement);\r
+    marshallInto(*xmlObject, domElement, ctx);\r
 \r
     //Recache the DOM.\r
     if (dc) {\r
@@ -158,8 +158,19 @@ DOMElement* AbstractXMLObjectMarshaller::marshall(XMLObject* xmlObject, DOMEleme
 \r
     return domElement;\r
 }\r
-        \r
-void AbstractXMLObjectMarshaller::marshallInto(XMLObject& xmlObject, DOMElement* targetElement) const\r
+\r
+#ifndef XMLTOOLING_NO_XMLSEC\r
+    class _signit : public unary_function<const pair<Signature*,const SigningContext*>&, void> {\r
+    public:\r
+        void operator()(const pair<Signature*,const SigningContext*>& p) const {\r
+            p.first->sign(p.second);\r
+        }\r
+    };\r
+#endif\r
+\r
+void AbstractXMLObjectMarshaller::marshallInto(\r
+    XMLObject& xmlObject, DOMElement* targetElement, MarshallingContext* ctx\r
+    ) const\r
 {\r
     if (xmlObject.getElementQName().hasPrefix())\r
         targetElement->setPrefix(xmlObject.getElementQName().getPrefix());\r
@@ -169,15 +180,11 @@ void AbstractXMLObjectMarshaller::marshallInto(XMLObject& xmlObject, DOMElement*
     marshallChildElements(xmlObject, targetElement);\r
     marshallElementContent(xmlObject, targetElement);\r
 \r
-    /* TODO Signing/Encryption\r
-    if (xmlObject instanceof SignableXMLObject) {\r
-        signElement(targetElement, xmlObject);\r
-    }\r
-\r
-    if (xmlObject instanceof EncryptableXMLObject) {\r
-        encryptElement(targetElement, xmlObject);\r
+#ifndef XMLTOOLING_NO_XMLSEC\r
+    if (ctx) {\r
+        for_each(ctx->m_signingContexts.begin(),ctx->m_signingContexts.end(),_signit());\r
     }\r
-    */\r
+#endif\r
 }\r
 \r
 void AbstractXMLObjectMarshaller::marshallElementType(XMLObject& xmlObject, DOMElement* domElement) const\r
@@ -298,7 +305,7 @@ public:
                 );\r
             throw MarshallingException("Marshaller found unknown child element, but no default marshaller was found.");\r
         }\r
-        element->appendChild(marshaller->marshall(obj, element));\r
+        marshaller->marshall(obj, element);\r
     }\r
 };\r
 \r