#include "exceptions.h"\r
#include "io/AbstractXMLObjectMarshaller.h"\r
#include "io/AbstractXMLObjectUnmarshaller.h"\r
-#include "signature/impl/KeyInfoImpl.h"\r
+#include "signature/KeyInfo.h"\r
#include "util/XMLHelper.h"\r
#include "validation/AbstractValidatingXMLObject.h"\r
\r
-#include <typeinfo.h>\r
+#include <xercesc/util/XMLUniDefs.hpp>\r
\r
using namespace xmltooling;\r
using namespace std;\r
\r
namespace xmltooling {\r
\r
+ class XMLTOOL_DLLLOCAL RSAKeyValueImpl\r
+ : public RSAKeyValue,\r
+ public AbstractDOMCachingXMLObject,\r
+ public AbstractValidatingXMLObject,\r
+ public AbstractXMLObjectMarshaller,\r
+ public AbstractXMLObjectUnmarshaller\r
+ {\r
+ public:\r
+ virtual ~RSAKeyValueImpl() {}\r
+\r
+ RSAKeyValueImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
+ : AbstractXMLObject(nsURI, localName, prefix, schemaType) {\r
+ init();\r
+ }\r
+ \r
+ RSAKeyValueImpl(const RSAKeyValueImpl& src)\r
+ : AbstractXMLObject(src),\r
+ AbstractDOMCachingXMLObject(src),\r
+ AbstractValidatingXMLObject(src) {\r
+ init();\r
+ setModulus(src.getModulus());\r
+ setExponent(src.getExponent());\r
+ }\r
+ \r
+ void init() {\r
+ m_Modulus=NULL;\r
+ m_Exponent=NULL;\r
+ m_children.push_back(NULL);\r
+ m_children.push_back(NULL);\r
+ m_pos_Modulus=m_children.begin();\r
+ m_pos_Exponent=m_children.begin();\r
+ m_pos_Exponent++;\r
+ }\r
+ \r
+ IMPL_XMLOBJECT_CLONE(RSAKeyValue);\r
+ IMPL_XMLOBJECT_CHILD(Modulus);\r
+ IMPL_XMLOBJECT_CHILD(Exponent);\r
+\r
+ protected:\r
+ void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {\r
+ PROC_XMLOBJECT_CHILD(Modulus,XMLConstants::XMLSIG_NS);\r
+ PROC_XMLOBJECT_CHILD(Exponent,XMLConstants::XMLSIG_NS);\r
+ \r
+ throw UnmarshallingException("Invalid child element: $1",params(1,childXMLObject->getElementQName().toString()));\r
+ }\r
+ };\r
+ \r
class XMLTOOL_DLLLOCAL KeyInfoImpl\r
: public KeyInfo,\r
public AbstractDOMCachingXMLObject,\r
m_Id(XMLString::replicate(src.m_Id)) {\r
\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
+ if (*i) {\r
+ KeyName* kn=dynamic_cast<KeyName*>(*i);\r
+ if (kn) {\r
+ getKeyNames().push_back(kn->cloneKeyName());\r
+ continue;\r
+ }\r
+ MgmtData* md=dynamic_cast<MgmtData*>(*i);\r
+ if (md) {\r
+ getMgmtDatas().push_back(md->cloneMgmtData());\r
+ continue;\r
+ }\r
+ getXMLObjects().push_back((*i)->clone());\r
+ }\r
}\r
}\r
\r
IMPL_XMLOBJECT_CLONE(KeyInfo);\r
IMPL_XMLOBJECT_ATTRIB(Id);\r
+ IMPL_XMLOBJECT_CHILDREN(KeyName,m_children.end());\r
+ IMPL_XMLOBJECT_CHILDREN(MgmtData,m_children.end());\r
\r
protected:\r
void marshallAttributes(DOMElement* domElement) const {\r
}\r
\r
void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {\r
- getXMLObjects().push_back(childXMLObject);\r
+ PROC_XMLOBJECT_CHILDREN(KeyName,XMLConstants::XMLSIG_NS);\r
+ PROC_XMLOBJECT_CHILDREN(MgmtData,XMLConstants::XMLSIG_NS);\r
+ \r
+ // Unknown child.\r
+ const XMLCh* nsURI=childXMLObject->getElementQName().getNamespaceURI();\r
+ if (!XMLString::equals(nsURI,XMLConstants::XMLSIG_NS) && nsURI && *nsURI)\r
+ getXMLObjects().push_back(childXMLObject);\r
+ \r
+ throw UnmarshallingException("Invalid child element: $1",params(1,childXMLObject->getElementQName().toString()));\r
}\r
\r
void processAttribute(const DOMAttr* attribute) {\r
}\r
};\r
\r
- class XMLTOOL_DLLLOCAL KeyNameImpl\r
- : public KeyName,\r
- public AbstractDOMCachingXMLObject,\r
- public AbstractValidatingXMLObject,\r
- public AbstractXMLObjectMarshaller,\r
- public AbstractXMLObjectUnmarshaller\r
- {\r
- public:\r
- virtual ~KeyNameImpl() {}\r
-\r
- KeyNameImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
- : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Name(NULL) {\r
- }\r
- \r
- KeyNameImpl(const KeyNameImpl& src)\r
- : AbstractXMLObject(src),\r
- AbstractDOMCachingXMLObject(src),\r
- AbstractValidatingXMLObject(src),\r
- m_Name(XMLString::replicate(src.m_Name)) {\r
- }\r
- \r
- IMPL_XMLOBJECT_CLONE(KeyName);\r
- IMPL_XMLOBJECT_CONTENT(Name);\r
- };\r
-\r
- class XMLTOOL_DLLLOCAL MgmtDataImpl\r
- : public MgmtData,\r
- public AbstractDOMCachingXMLObject,\r
- public AbstractValidatingXMLObject,\r
- public AbstractXMLObjectMarshaller,\r
- public AbstractXMLObjectUnmarshaller\r
- {\r
- public:\r
- virtual ~MgmtDataImpl() {}\r
-\r
- MgmtDataImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType)\r
- : AbstractXMLObject(nsURI, localName, prefix, schemaType), m_Data(NULL) {\r
- }\r
- \r
- MgmtDataImpl(const MgmtDataImpl& src)\r
- : AbstractXMLObject(src),\r
- AbstractDOMCachingXMLObject(src),\r
- AbstractValidatingXMLObject(src),\r
- m_Data(XMLString::replicate(src.m_Data)) {\r
- }\r
- \r
- IMPL_XMLOBJECT_CLONE(MgmtData);\r
- IMPL_XMLOBJECT_CONTENT(Data);\r
- };\r
+ DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,KeyName,Name);\r
+ DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,MgmtData,Data);\r
+ DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Modulus,Value);\r
+ DECL_XMLOBJECTIMPL_SIMPLE(XMLTOOL_DLLLOCAL,Exponent,Value);\r
};\r
\r
#if defined (_MSC_VER)\r
IMPL_XMLOBJECTBUILDER(KeyInfo);\r
IMPL_XMLOBJECTBUILDER(KeyName);\r
IMPL_XMLOBJECTBUILDER(MgmtData);\r
-\r
-// Validators\r
-\r
-void KeyInfoSchemaValidator::validate(const XMLObject* xmlObject) const\r
-{\r
- const KeyInfo* ptr=dynamic_cast<const KeyInfo*>(xmlObject);\r
- if (!ptr)\r
- throw ValidationException("KeyInfoSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
- if (!ptr->hasChildren())\r
- throw ValidationException("KeyInfo is empty");\r
-}\r
-\r
-void KeyNameSchemaValidator::validate(const XMLObject* xmlObject) const\r
-{\r
- const KeyName* ptr=dynamic_cast<const KeyName*>(xmlObject);\r
- if (!ptr)\r
- throw ValidationException("KeyNameSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
- if (XMLString::stringLen(ptr->getName())==0)\r
- throw ValidationException("KeyName is empty");\r
-}\r
-\r
-void MgmtDataSchemaValidator::validate(const XMLObject* xmlObject) const\r
-{\r
- const MgmtData* ptr=dynamic_cast<const MgmtData*>(xmlObject);\r
- if (!ptr)\r
- throw ValidationException("MgmtDataSchemaValidator: unsupported object type ($1)",params(1,typeid(xmlObject).name()));\r
- if (XMLString::stringLen(ptr->getData())==0)\r
- throw ValidationException("MgmtData is empty");\r
-}\r
+IMPL_XMLOBJECTBUILDER(Modulus);\r
+IMPL_XMLOBJECTBUILDER(Exponent);\r
+IMPL_XMLOBJECTBUILDER(RSAKeyValue);\r
+\r
+const XMLCh KeyInfo::LOCAL_NAME[] = UNICODE_LITERAL_7(K,e,y,I,n,f,o);\r
+const XMLCh KeyInfo::TYPE_NAME[] = UNICODE_LITERAL_11(K,e,y,I,n,f,o,T,y,p,e);\r
+const XMLCh KeyInfo::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,d);\r
+const XMLCh MgmtData::LOCAL_NAME[] = UNICODE_LITERAL_8(M,g,m,t,D,a,t,a);\r
+const XMLCh KeyName::LOCAL_NAME[] = UNICODE_LITERAL_7(K,e,y,N,a,m,e);\r
+const XMLCh Modulus::LOCAL_NAME[] = UNICODE_LITERAL_7(M,o,d,u,l,u,s);\r
+const XMLCh Exponent::LOCAL_NAME[] = UNICODE_LITERAL_8(E,x,p,o,n,e,n,t);\r
+const XMLCh RSAKeyValue::LOCAL_NAME[] = UNICODE_LITERAL_11(R,S,A,K,e,y,V,a,l,u,e);\r
+const XMLCh RSAKeyValue::TYPE_NAME[] = UNICODE_LITERAL_15(R,S,A,K,e,y,V,a,l,u,e,T,y,p,e);\r