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
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
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
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
*
* @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<bool,bool> 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); \
}
/**
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
XMLCh* m_##proper; \
public: \
pair<bool,int> 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); \
*/
#define IMPL_BOOLEAN_ATTRIB(proper) \
protected: \
- XMLConstants::xmltooling_bool_t m_##proper; \
+ xmlconstants::xmltooling_bool_t m_##proper; \
public: \
- pair<bool,bool> 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; \
}
/**
+ * 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
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
*/
#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; \
}
}
/**
- * 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(); \
}
/**
- * 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<cname*>(clone()); \
} \
- cname* clone() const { \
+ xmltooling::XMLObject* clone() const { \
std::auto_ptr<xmltooling::XMLObject> domClone(xmltooling::AbstractDOMCachingXMLObject::clone()); \
cname##Impl* ret=dynamic_cast<cname##Impl*>(domClone.get()); \
if (ret) { \
* @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
/**
class linkage cname##Impl \
: public virtual cname, \
public xmltooling::AbstractSimpleElement, \
- public xmltooling::AbstractChildlessElement, \
public xmltooling::AbstractDOMCachingXMLObject, \
public xmltooling::AbstractXMLObjectMarshaller, \
public xmltooling::AbstractXMLObjectUnmarshaller \
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
return new cname##Impl(nsURI,localName,prefix,schemaType); \
}
+#else /* !HAVE_COVARIANT_RETURNS */\r
+
+/**
+ * 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<const cname##Builder*>( \
+ XMLObjectBuilder::getBuilder(xmltooling::QName(namespaceURI,cname::LOCAL_NAME)) \
+ ); \
+ if (b) \
+ return dynamic_cast<cname*>(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.
*