X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2Fbase.h;h=6c6d359939cb26d70d1b58c4dc6ccba58a4dff4e;hb=36769dc1d8419136e55dde51697b47683b376214;hp=bc24a43b974a30a3fffa3a01ac9777ec92e0748c;hpb=f4ff096a4048e157b8b377ddf253f2e76b7fee53;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/base.h b/xmltooling/base.h index bc24a43..6c6d359 100644 --- a/xmltooling/base.h +++ b/xmltooling/base.h @@ -312,11 +312,52 @@ static const XMLCh LOCAL_NAME[] /** + * Begins the declaration of an XMLObject specialization with five base classes. + * Basic boilerplate includes a protected constructor, empty virtual destructor, + * and Unicode constants for the default associated element's name and prefix. + * + * @param linkage linkage specifier for the class + * @param cname the name of the class to declare + * @param base the first base class to derive from using public virtual inheritance + * @param base2 the second base class to derive from using public virtual inheritance + * @param base3 the third base class to derive from using public virtual inheritance + * @param base4 the fourth base class to derive from using public virtual inheritance + * @param base5 the fifth base class to derive from using public virtual inheritance + * @param desc documentation comment for class + */ +#define BEGIN_XMLOBJECT5(linkage,cname,base,base2,base3,base4,base5,desc) \ + XMLTOOLING_DOXYGEN(desc) \ + class linkage cname : public virtual base, public virtual base2, public virtual base3, public virtual base4, public virtual base5 { \ + protected: \ + cname() {} \ + public: \ + virtual ~cname() {} \ + XMLTOOLING_DOXYGEN(Type-specific clone method.) \ + virtual cname* clone##cname() const=0; \ + XMLTOOLING_DOXYGEN(Element local name) \ + static const XMLCh LOCAL_NAME[] + +/** * Ends the declaration of an XMLObject specialization. */ #define END_XMLOBJECT } /** + * Declares abstract set method for a typed XML attribute. + * The get method is omitted. + * + * @param proper the proper name of the attribute + * @param upcased the upcased name of the attribute + * @param type the attribute's data type + */ +#define DECL_INHERITED_XMLOBJECT_ATTRIB(proper,upcased,type) \ + public: \ + XMLTOOLING_DOXYGEN(proper attribute name) \ + static const XMLCh upcased##_ATTRIB_NAME[]; \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void set##proper(const type* proper)=0 + +/** * Declares abstract get/set methods for a typed XML attribute. * * @param proper the proper name of the attribute @@ -333,6 +374,16 @@ virtual void set##proper(const type* proper)=0 /** + * Declares abstract set method for a string XML attribute. + * The get method is omitted. + * + * @param proper the proper name of the attribute + * @param upcased the upcased name of the attribute + */ +#define DECL_INHERITED_STRING_ATTRIB(proper,upcased) \ + DECL_INHERITED_XMLOBJECT_ATTRIB(proper,upcased,XMLCh) + +/** * Declares abstract get/set methods for a string XML attribute. * * @param proper the proper name of the attribute @@ -342,7 +393,21 @@ DECL_XMLOBJECT_ATTRIB(proper,upcased,XMLCh) /** - * Declares abstract get/set methods for a string XML attribute. + * Declares abstract set method for a DateTime XML attribute. + * The get method is omitted. + * + * @param proper the proper name of the attribute + * @param upcased the upcased name of the attribute + */ +#define DECL_INHERITED_DATETIME_ATTRIB(proper,upcased) \ + DECL_INHERITED_XMLOBJECT_ATTRIB(proper,upcased,xmltooling::DateTime); \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void set##proper(time_t proper)=0; \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void set##proper(const XMLCh* proper)=0 + +/** + * Declares abstract get/set methods for a DateTime XML attribute. * * @param proper the proper name of the attribute * @param upcased the upcased name of the attribute @@ -357,6 +422,22 @@ virtual void set##proper(const XMLCh* proper)=0 /** + * Declares abstract set method for an integer XML attribute. + * The get method is omitted. + * + * @param proper the proper name of the attribute + * @param upcased the upcased name of the attribute + */ +#define DECL_INHERITED_INTEGER_ATTRIB(proper,upcased) \ + public: \ + XMLTOOLING_DOXYGEN(proper attribute name) \ + static const XMLCh upcased##_ATTRIB_NAME[]; \ + XMLTOOLING_DOXYGEN(Sets the proper attribute using a string value.) \ + virtual void set##proper(const XMLCh* proper)=0; \ + XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ + virtual void set##proper(int proper)=0 + +/** * Declares abstract get/set methods for an integer XML attribute. * * @param proper the proper name of the attribute @@ -378,41 +459,55 @@ * * @param proper the proper name of the attribute * @param upcased the upcased name of the attribute + * @param def the default/presumed value, if no explicit value has been set */ -#define DECL_BOOLEAN_ATTRIB(proper,upcased) \ +#define DECL_BOOLEAN_ATTRIB(proper,upcased,def) \ public: \ XMLTOOLING_DOXYGEN(proper attribute name) \ static const XMLCh upcased##_ATTRIB_NAME[]; \ - XMLTOOLING_DOXYGEN(Returns the proper attribute after a NULL indicator.) \ - virtual std::pair proper() const=0; \ + XMLTOOLING_DOXYGEN(Returns the proper attribute or def if not set.) \ + bool proper() const { \ + switch (get##proper()) { \ + case xmlconstants::XML_BOOL_TRUE: \ + case xmlconstants::XML_BOOL_ONE: \ + return true; \ + case xmlconstants::XML_BOOL_FALSE: \ + case xmlconstants::XML_BOOL_ZERO: \ + return false; \ + default: \ + return def; \ + } \ + } \ + XMLTOOLING_DOXYGEN(Returns the proper attribute as an explicit enumerated value.) \ + virtual xmlconstants::xmltooling_bool_t get##proper() const=0; \ XMLTOOLING_DOXYGEN(Sets the proper attribute using an enumerated value.) \ - virtual void proper(xmltooling::XMLConstants::xmltooling_bool_t value)=0; \ + virtual void proper(xmlconstants::xmltooling_bool_t value)=0; \ XMLTOOLING_DOXYGEN(Sets the proper attribute.) \ void proper(bool value) { \ - proper(value ? xmltooling::XMLConstants::XML_BOOL_ONE : xmltooling::XMLConstants::XML_BOOL_ZERO); \ + proper(value ? xmlconstants::XML_BOOL_ONE : xmlconstants::XML_BOOL_ZERO); \ } \ XMLTOOLING_DOXYGEN(Sets the proper attribute using a string constant.) \ void set##proper(const XMLCh* value) { \ if (value) { \ switch (*value) { \ case chLatin_t: \ - proper(xmltooling::XMLConstants::XML_BOOL_TRUE); \ + proper(xmlconstants::XML_BOOL_TRUE); \ break; \ case chLatin_f: \ - proper(xmltooling::XMLConstants::XML_BOOL_FALSE); \ + proper(xmlconstants::XML_BOOL_FALSE); \ break; \ case chDigit_1: \ - proper(xmltooling::XMLConstants::XML_BOOL_ONE); \ + proper(xmlconstants::XML_BOOL_ONE); \ break; \ case chDigit_0: \ - proper(xmltooling::XMLConstants::XML_BOOL_ZERO); \ + proper(xmlconstants::XML_BOOL_ZERO); \ break; \ default: \ - proper(xmltooling::XMLConstants::XML_BOOL_NULL); \ + proper(xmlconstants::XML_BOOL_NULL); \ } \ } \ else \ - proper(xmltooling::XMLConstants::XML_BOOL_NULL); \ + proper(xmlconstants::XML_BOOL_NULL); \ } /** @@ -441,6 +536,18 @@ IMPL_XMLOBJECT_ATTRIB(proper,XMLCh) /** + * Implements get/set methods and a private member for a string XML attribute, + * plus a getXMLID override. + * + * @param proper the proper name of the attribute + */ +#define IMPL_ID_ATTRIB(proper) \ + IMPL_XMLOBJECT_ATTRIB(proper,XMLCh) \ + const XMLCh* getXMLID() const { \ + return m_##proper; \ + } + +/** * Implements get/set methods and a private member for a DateTime XML attribute. * * @param proper the proper name of the attribute @@ -482,7 +589,7 @@ XMLCh* m_##proper; \ public: \ pair get##proper() const { \ - return make_pair((m_##proper!=NULL),(m_##proper!=NULL ? XMLString::parseInt(m_##proper): NULL)); \ + return make_pair((m_##proper!=NULL),(m_##proper!=NULL ? XMLString::parseInt(m_##proper): 0)); \ } \ void set##proper(const XMLCh* proper) { \ m_##proper = prepareForAssignment(m_##proper,proper); \ @@ -501,15 +608,12 @@ */ #define IMPL_BOOLEAN_ATTRIB(proper) \ protected: \ - XMLConstants::xmltooling_bool_t m_##proper; \ + xmlconstants::xmltooling_bool_t m_##proper; \ public: \ - pair proper() const { \ - return make_pair( \ - (m_##proper!=XMLConstants::XML_BOOL_NULL), \ - (m_##proper==XMLConstants::XML_BOOL_TRUE || m_##proper==XMLConstants::XML_BOOL_ONE) \ - ); \ + xmlconstants::xmltooling_bool_t get##proper() const { \ + return m_##proper; \ } \ - void proper(XMLConstants::xmltooling_bool_t value) { \ + void proper(xmlconstants::xmltooling_bool_t value) { \ if (m_##proper != value) { \ releaseThisandParentDOM(); \ m_##proper = value; \ @@ -517,6 +621,18 @@ } /** + * Declares abstract set method for a typed XML child object in a foreign namespace. + * The get method is omitted. + * + * @param proper the proper name of the child type + * @param ns the C++ namespace for the type + */ +#define DECL_INHERITED_TYPED_FOREIGN_CHILD(proper,ns) \ + public: \ + XMLTOOLING_DOXYGEN(Sets the proper child.) \ + virtual void set##proper(ns::proper* child)=0 + +/** * Declares abstract get/set methods for a typed XML child object in a foreign namespace. * * @param proper the proper name of the child type @@ -530,6 +646,17 @@ virtual void set##proper(ns::proper* child)=0 /** + * Declares abstract set method for a typed XML child object. + * The get method is omitted. + * + * @param proper the proper name of the child type + */ +#define DECL_INHERITED_TYPED_CHILD(proper) \ + public: \ + XMLTOOLING_DOXYGEN(Sets the proper child.) \ + virtual void set##proper(proper* child)=0 + +/** * Declares abstract get/set methods for a typed XML child object. * * @param proper the proper name of the child type @@ -745,19 +872,19 @@ */ #define MARSHALL_BOOLEAN_ATTRIB(proper,ucase,namespaceURI) \ switch (m_##proper) { \ - case XMLConstants::XML_BOOL_TRUE: \ - domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, XMLConstants::XML_TRUE); \ + case xmlconstants::XML_BOOL_TRUE: \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, xmlconstants::XML_TRUE); \ break; \ - case XMLConstants::XML_BOOL_ONE: \ - domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, XMLConstants::XML_ONE); \ + case xmlconstants::XML_BOOL_ONE: \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, xmlconstants::XML_ONE); \ break; \ - case XMLConstants::XML_BOOL_FALSE: \ - domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, XMLConstants::XML_FALSE); \ + case xmlconstants::XML_BOOL_FALSE: \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, xmlconstants::XML_FALSE); \ break; \ - case XMLConstants::XML_BOOL_ZERO: \ - domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, XMLConstants::XML_ZERO); \ + case xmlconstants::XML_BOOL_ZERO: \ + domElement->setAttributeNS(namespaceURI, ucase##_ATTRIB_NAME, xmlconstants::XML_ZERO); \ break; \ - case XMLConstants::XML_BOOL_NULL: \ + case xmlconstants::XML_BOOL_NULL: \ break; \ } @@ -938,11 +1065,11 @@ } /** - * Declares aliased get/set methods for named XML element content. + * Declares aliased get/set methods for named XML element simple content. * * @param proper the proper name to label the element's content */ -#define DECL_XMLOBJECT_CONTENT(proper) \ +#define DECL_SIMPLE_CONTENT(proper) \ XMLTOOLING_DOXYGEN(Returns proper.) \ const XMLCh* get##proper() const { \ return getTextContent(); \ @@ -975,30 +1102,15 @@ } /** - * Implements marshalling/unmarshalling for element content. - */ -#define IMPL_XMLOBJECT_CONTENT \ - protected: \ - void marshallElementContent(DOMElement* domElement) const { \ - if(getTextContent()) { \ - domElement->appendChild(domElement->getOwnerDocument()->createTextNode(getTextContent())); \ - } \ - } \ - void processElementContent(const XMLCh* elementContent) { \ - setTextContent(elementContent); \ - } - - -/** * Implements cloning methods for an XMLObject specialization implementation class. * * @param cname the name of the XMLObject specialization */ #define IMPL_XMLOBJECT_CLONE(cname) \ cname* clone##cname() const { \ - return clone(); \ + return dynamic_cast(clone()); \ } \ - cname* clone() const { \ + xmltooling::XMLObject* clone() const { \ std::auto_ptr domClone(xmltooling::AbstractDOMCachingXMLObject::clone()); \ cname##Impl* ret=dynamic_cast(domClone.get()); \ if (ret) { \ @@ -1018,8 +1130,8 @@ * @param desc documentation for class */ #define DECL_XMLOBJECT_SIMPLE(linkage,cname,proper,desc) \ - BEGIN_XMLOBJECT(linkage,cname,xmltooling::SimpleElement,desc); \ - DECL_XMLOBJECT_CONTENT(proper); \ + BEGIN_XMLOBJECT(linkage,cname,xmltooling::XMLObject,desc); \ + DECL_SIMPLE_CONTENT(proper); \ END_XMLOBJECT /** @@ -1033,7 +1145,6 @@ class linkage cname##Impl \ : public virtual cname, \ public xmltooling::AbstractSimpleElement, \ - public xmltooling::AbstractChildlessElement, \ public xmltooling::AbstractDOMCachingXMLObject, \ public xmltooling::AbstractXMLObjectMarshaller, \ public xmltooling::AbstractXMLObjectUnmarshaller \ @@ -1048,9 +1159,10 @@ xmltooling::AbstractSimpleElement(src), \ xmltooling::AbstractDOMCachingXMLObject(src) {} \ IMPL_XMLOBJECT_CLONE(cname) \ - IMPL_XMLOBJECT_CONTENT \ } - + +#ifdef HAVE_COVARIANT_RETURNS + /** * Begins the declaration of an XMLObjectBuilder specialization. * Basic boilerplate includes an empty virtual destructor, and @@ -1114,6 +1226,73 @@ return new cname##Impl(nsURI,localName,prefix,schemaType); \ } +#else /* !HAVE_COVARIANT_RETURNS */ + +/** + * Begins the declaration of an XMLObjectBuilder specialization. + * Basic boilerplate includes an empty virtual destructor, and + * a default builder that defaults the element name. + * + * @param linkage linkage specifier for the class + * @param cname the name of the XMLObject specialization + * @param namespaceURI the XML namespace of the default associated element + * @param namespacePrefix the XML namespace prefix of the default associated element + */ +#define BEGIN_XMLOBJECTBUILDER(linkage,cname,namespaceURI,namespacePrefix) \ + XMLTOOLING_DOXYGEN(Builder for cname objects.) \ + class linkage cname##Builder : public xmltooling::XMLObjectBuilder { \ + public: \ + virtual ~cname##Builder() {} \ + XMLTOOLING_DOXYGEN(Default builder.) \ + virtual xmltooling::XMLObject* buildObject() const { \ + return buildObject(namespaceURI,cname::LOCAL_NAME,namespacePrefix); \ + } \ + XMLTOOLING_DOXYGEN(Builder that allows element/type override.) \ + virtual xmltooling::XMLObject* buildObject( \ + const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix=NULL, const xmltooling::QName* schemaType=NULL \ + ) const + +/** + * Ends the declaration of an XMLObjectBuilder specialization. + */ +#define END_XMLOBJECTBUILDER } + +/** + * Declares a generic XMLObjectBuilder specialization. + * + * @param linkage linkage specifier for the class + * @param cname the name of the XMLObject specialization + * @param namespaceURI the XML namespace of the default associated element + * @param namespacePrefix the XML namespace prefix of the default associated element + */ + #define DECL_XMLOBJECTBUILDER(linkage,cname,namespaceURI,namespacePrefix) \ + BEGIN_XMLOBJECTBUILDER(linkage,cname,namespaceURI,namespacePrefix); \ + XMLTOOLING_DOXYGEN(Singleton builder.) \ + static cname* build##cname() { \ + const cname##Builder* b = dynamic_cast( \ + XMLObjectBuilder::getBuilder(xmltooling::QName(namespaceURI,cname::LOCAL_NAME)) \ + ); \ + if (b) \ + return dynamic_cast(b->buildObject()); \ + throw xmltooling::XMLObjectException("Unable to obtain typed builder for "#cname"."); \ + } \ + END_XMLOBJECTBUILDER + +/** + * Implements the standard XMLObjectBuilder specialization function. + * + * @param cname the name of the XMLObject specialization + */ +#define IMPL_XMLOBJECTBUILDER(cname) \ + xmltooling::XMLObject* cname##Builder::buildObject( \ + const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const QName* schemaType \ + ) const \ + { \ + return new cname##Impl(nsURI,localName,prefix,schemaType); \ + } + +#endif /* HAVE_COVARIANT_RETURNS */ + /** * Begins the declaration of a Schema Validator specialization. *