123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- /*
- * Copyright 2006 Sony Computer Entertainment Inc.
- *
- * Licensed under the MIT Open Source License, for details please see license.txt or the website
- * http://www.opensource.org/licenses/mit-license.php
- *
- */
- #ifndef __DAE_META_ELEMENT_H__
- #define __DAE_META_ELEMENT_H__
- #include <dae/daeTypes.h>
- #include <dae/daeArrayTypes.h>
- #include <dae/daeElement.h>
- #include <dae/daeMetaAttribute.h>
- #include <dae/daeRefCountedObj.h>
- class DAE;
- class daeMetaCMPolicy;
- class daeMetaElementArrayAttribute;
- typedef daeElementRef (*daeElementConstructFunctionPtr)(DAE& dae);
- /**
- * Each instance of the @c daeMetaElement class describes a C++ COLLADA dom
- * element type.
- * @par
- * The meta information in @c daeMetaElement is a combination of the information
- * required to create and maintain C++ object instances and
- * the information necessary to parse and construct a hierarchy of COLLADA
- * elements.
- * @par
- * @c daeMetaElement objects also act as factories for C++ COLLADA dom classes where
- * each @c daeElement is capable of creating an instance of the class it describes.
- * Further, each @c daeMetaElement contains references to other @c daeMetaElements
- * for potential XML children elements. This enables this system to easily
- * create @c daeElements of the appropriate type while navigating through XML
- * recursive parse.
- * @par
- * See @c daeElement for information about the functionality that every @c daeElement implements.
- */
- class daeMetaElement : public daeRefCountedObj
- {
- protected:
- daeStringRef _name;
- daeElementConstructFunctionPtr _createFunc;
- daeInt _elementSize;
-
- daeMetaAttributeRefArray _metaAttributes;
- daeMetaAttributeRef _metaValue;
- daeMetaElementArrayAttribute* _metaContents;
- daeMetaArrayAttribute* _metaContentsOrder;
- daeMetaAttributeRef _metaID;
- daeBool _isTrackableForQueries;
- daeBool _usesStringContents;
- daeBool _isTransparent;
- daeBool _isAbstract;
- daeBool _allowsAny;
- daeBool _innerClass;
-
- daeMetaCMPolicy* _contentModel;
- daeMetaArrayAttribute* _metaCMData;
- daeUInt _numMetaChoices;
- DAE& dae;
- public:
- /**
- * Constructor
- */
- DLLSPEC daeMetaElement(DAE& dae);
- /**
- * Destructor
- */
- DLLSPEC ~daeMetaElement();
- public: // public accessors
- /**
- * Gets the DAE object that owns this daeMetaElement.
- * @return Returns the owning DAE.
- */
- DAE* getDAE();
-
- /**
- * Determines if elements of this type is an inner class.
- * @return Returns true if this element type is an inner class.
- */
- daeBool getIsInnerClass() { return _innerClass; }
- /**
- * Sets if elements of this type are inner classes.
- * @param abstract True if this type is an inner class.
- */
- void setIsInnerClass( daeBool ic ) { _innerClass = ic; }
- /**
- * Determines if elements of this type can be placed in the object model.
- * @return Returns true if this element type is abstract, false otherwise.
- */
- daeBool getIsAbstract() { return _isAbstract; }
- /**
- * Determines if elements of this type should have an element tag printed when saving.
- * @return Returns true if this element type should not have a tag, false otherwise.
- */
- daeBool getIsTransparent() { return _isTransparent; }
- /**
- * Sets if elements of this type are abstract.
- * @param abstract True if this type is abstract.
- */
- void setIsAbstract( daeBool abstract ) { _isAbstract = abstract; }
- /**
- * Sets whether or not elements of this type should have an element tag printed when saving.
- * @param transparent True if this type is transparent.
- */
- void setIsTransparent( daeBool transparent ) { _isTransparent = transparent; }
- /**
- * Determines if elements of this type should be tracked
- * for daeDatabase queries.
- * @return Returns true if this element type should be tracked
- */
- daeBool getIsTrackableForQueries() { return _isTrackableForQueries; }
- /**
- * Sets whether elements of this type should be tracked
- * for @c daeDatabase queries.
- * @param trackable Indicates whether this element should be tracked.
- * A value of true indicates this element type should be tracked and be available for
- * database queries.
- */
- void setIsTrackableForQueries(daeBool trackable) {
- _isTrackableForQueries = trackable; }
-
- /**
- * Determines if elements of this type allow for any element as a child.
- * @return Returns true if this element can have any child element, false otherwise.
- */
- daeBool getAllowsAny() { return _allowsAny; }
- /**
- * Sets if elements of this type allow for any element as a child.
- * @param allows True if this element allows for any child element, false otherwise.
- */
- void setAllowsAny( daeBool allows ) { _allowsAny = allows; }
- /**
- * Gets the @c daeMetaAttribute for the non-element contents of a @c daeElement.
- * This corresponds to a @c daeMetaFloatAttribute, @c daeMetaFloatArrayAttribute,
- * et cetera.
- * @return Returns the @c daeMetaAttribute pointer for the non-element contents of
- * this element type.
- */
- daeMetaAttribute* getValueAttribute() { return _metaValue; }
- /**
- * Gets the @c daeMetaAttribute for the ID attribute of a @c daeElement.
- * @return Returns the ID @c daeMetaAttribute, or NULL if the element type
- * does not have an ID attribute.
- */
- daeMetaAttribute* getIDAttribute() { return _metaID; }
- /**
- * Gets the name of this element type.
- * @return Returns the name of this element type.
- */
- daeStringRef getName() { return _name; }
- /**
- * Sets the name of this element type.
- * @param s String name to set.
- */
- void setName(daeString s) { _name = s; }
- /**
- * Gets the array of all known attributes on this element type.
- * This includes all meta attributes except those describing child
- * elements. It does include the value element.
- * @return Returns the array of @c daeMetaAttributeRefs.
- */
- daeMetaAttributeRefArray& getMetaAttributes() {
- return _metaAttributes; }
- /**
- * Gets the attribute which has a name as provided by the <tt><i>s</i></tt> parameter.
- * @param s String containing the desired attribute's name.
- * @return Returns the corresponding @c daeMetaAttribute, or NULL if none found.
- */
- DLLSPEC daeMetaAttribute* getMetaAttribute(daeString s);
- /**
- * Sets the size in bytes of each instance of this element type.
- * Used for factory element creation.
- * @param size Number of bytes for each C++ element instance.
- */
- void setElementSize(daeInt size) {_elementSize = size;}
- /**
- * Gets the size in bytes of each instance of this element type.
- * Used for factory element creation.
- * @return Returns the number of bytes for each C++ element instance.
- */
- daeInt getElementSize() { return _elementSize;}
-
- public:
- /**
- * Registers with the reflective object system that the dom class described by this @c daeMetaElement
- * contains a <tt><i>_contents</i></tt> array. This method is @em only for @c daeMetaElement contstuction, and
- * should only be called by the system as it sets up the Reflective Object System.
- * @param offset Byte offset for the contents field in the C++ element class.
- */
- DLLSPEC void addContents(daeInt offset);
- /**
- * Registers with the reflective object system the array that stores the _contents ordering. This method is @em
- * only for @c daeMetaElement contstuction, and should only be called by the system as it sets up the Reflective
- * Object System.
- * @param offset Byte offset for the contents order array in the C++ element class.
- */
- DLLSPEC void addContentsOrder( daeInt offset );
- /**
- * Registers with the reflective object system that the dom class described by this @c daeMetaElement
- * contains at least one choice group in the content model for this element. This method is @em only
- * for @c daeMetaElement contstuction, and should only be called by the system as it sets up the
- * Reflective Object System.
- * @param offset Byte offset for the contents field in the C++ element class.
- * @param numChoices The number of choice content model blocks there are for this element type.
- */
- DLLSPEC void addCMDataArray( daeInt offset, daeUInt numChoices );
- /**
- * Gets the attribute associated with the contents meta information.
- * @see @c addContents()
- * @return Returns the @c daeMetaElementArrayAttribute.
- */
- daeMetaElementArrayAttribute* getContents() { return _metaContents; }
- /**
- * Gets the attribute associated with the CMData array meta information.
- * @see @c addCMDataArray()
- * @return Returns the @c daeMetaArrayAttribute for the CMData of an element.
- */
- daeMetaArrayAttribute* getMetaCMData() { return _metaCMData; }
- /**
- * Gets the number of choice content model blocks there are for this element type.
- * @return Returns the number of daeMetaChoice's there are in the content model.
- */
- daeUInt getNumChoices() const { return _numMetaChoices; }
- /**
- * Appends a @c daeMetaAttribute that represents a field corresponding to an
- * XML attribute to the C++ version of this element type.
- * @param attr Attribute to append to this element types list
- * of potential attributes.
- */
- DLLSPEC void appendAttribute(daeMetaAttribute* attr);
- /**
- * Registers the function that can construct a C++ instance of this class.
- * Necessary for the factory system such that C++ can still call @c new and the
- * @c vptr will still be initialized even when constructed via the factory system.
- * @param func Pointer to a function that does object construction.
- */
- void registerClass(daeElementConstructFunctionPtr func) {
- _createFunc = func; }
- /**
- * Validates this class to be used by the runtime c++ object model
- * including factory creation.
- */
- DLLSPEC void validate();
-
- /**
- * Places a child element into the <tt><i>parent</i></tt> element where the
- * calling object is the @c daeMetaElement for the parent element.
- * @param parent Element to act as the container.
- * @param child Child element to place in the parent.
- * @return Returns true if the operation was successful, false otherwise.
- */
- DLLSPEC daeBool place(daeElement *parent, daeElement *child, daeUInt *ordinal = NULL);
- /**
- * Places a child element into the <tt><i>parent</i></tt> element at a specific location
- * where the calling object is the @c daeMetaElement for the parent element.
- * @param index The location in the contents array to insert.
- * @param parent Element to act as the container.
- * @param child Child element to place in the parent.
- * @return Returns true if the operation was successful, false otherwise.
- * @note This should only be called on elements that have a _contents array. Elements without
- * a _contents array will be placed normally.
- */
- DLLSPEC daeBool placeAt( daeInt index, daeElement *parent, daeElement *child );
- /**
- * Places a child element into the <tt><i>parent</i></tt> element at a specific location which is right
- * before the marker element.
- * @param marker The element location in the contents array to insert before.
- * @param parent Element to act as the container.
- * @param child Child element to place in the parent.
- * @return Returns true if the operation was successful, false otherwise.
- */
- DLLSPEC daeBool placeBefore( daeElement* marker, daeElement *parent, daeElement *child, daeUInt *ordinal = NULL );
- /**
- * Places a child element into the <tt><i>parent</i></tt> element at a specific location which is right
- * after the marker element.
- * @param marker The element location in the contents array to insert after.
- * @param parent Element to act as the container.
- * @param child Child element to place in the parent.
- * @return Returns true if the operation was successful, false otherwise.
- */
- DLLSPEC daeBool placeAfter( daeElement* marker, daeElement *parent, daeElement *child, daeUInt *ordinal = NULL );
- /**
- * Removes a child element from its parent element.
- * @param parent Element That is the parent.
- * @param child Child element to remove.
- * @return Returns true if the operation was successful, false otherwise.
- */
- DLLSPEC daeBool remove( daeElement *parent, daeElement *child );
- /**
- * Gets all of the children from an element of this type.
- * @param parent The element that you want to get the children from.
- * @param array The return value. An elementref array to append this element's children to.
- */
- DLLSPEC void getChildren( daeElement* parent, daeElementRefArray &array );
- /**
- * Invokes the factory element creation routine set by @c registerConstructor()
- * to return a C++ COLLADA Object Model instance of this element type.
- * @return Returns a created @c daeElement of appropriate type via the
- * object creation function and the <tt> daeElement::setup() </tt> function.
- */
- DLLSPEC daeElementRef create();
- /**
- * Looks through the list of potential child elements
- * for this element type finding the corresponding element type; if a corresponding element type
- * is found, use that type as a factory and return an instance of that
- * child type. Typically @c place() is called after @c create(childelementname)
- * @param childElementTypeName Type name to create.
- * @return Returns the created element if the type was found as a potential child element.
- */
- DLLSPEC daeElementRef create(daeString childElementTypeName);
- /**
- * Gets the root of the content model policy tree.
- * @return Returns the root element of the tree of content model policy elements.
- */
- daeMetaCMPolicy *getCMRoot() { return _contentModel; }
- /**
- * Sets the root of the content model policy tree.
- * @param cm The root element of the tree of content model policy elements.
- */
- DLLSPEC void setCMRoot( daeMetaCMPolicy *cm );
- };
- typedef daeSmartRef<daeMetaElement> daeMetaElementRef;
- typedef daeTArray<daeMetaElementRef> daeMetaElementRefArray;
- #endif //__DAE_META_ELEMENT_H__
|