/* * 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_DATABASE__ #define __DAE_DATABASE__ #include #include #include #include #include #include #include /** * The @c daeDatabase class defines the COLLADA runtime database interface. */ class DLLSPEC daeDatabase { public: /** * Constructor */ daeDatabase(DAE& dae); /** * Destructor */ virtual ~daeDatabase() {} /** * Get the associated DAE object. * @return The associated DAE object. */ virtual DAE* getDAE(); /** * Creates a new document, defining its root as the dom object; returns an error if the document name already exists. * @param name Name of the new document, must be a valid URI. * @param dom Existing @c domCOLLADA root element of the document * @param document Pointer to a @c daeDocument pointer that receives the document created * @param zaeRootDocument Indicates if the new document is the root document of a ZAE archive. * @param extractedFileURI URI to extracted dae file. * @return Returns @c DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h. * @note The @c daeElement passed in as dom should always be a @c domCOLLADA object, the API may enforce this in the future. * @deprecated This function will be removed in future versions. Please use createDocument. */ virtual daeInt insertDocument(daeString name, daeElement* dom, daeDocument** document = NULL, bool zaeRootDocument = false, const std::string& extractedFileURI = "") = 0; /** * Creates a new @c domCOLLADA root element and a new document; returns an error if the document name already exists. * @param name Name of the new document, must be a valid URI. * @param document Pointer to a @c daeDocument pointer that receives the document created * @return Returns DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h. * @deprecated This function will be removed in future versions. Please use createDocument. */ virtual daeInt insertDocument(daeString name, daeDocument** document = NULL) = 0; /** * Creates a new document, defining its root as the dom object; returns an error if the document name already exists. * @param name Name of the new document, must be a valid URI. * @param dom Existing @c domCOLLADA root element of the document * @param document Pointer to a @c daeDocument pointer that receives the document created * @param zaeRootDocument Indicates if the new document is the root document of a ZAE archive. * @param extractedFileURI URI to extracted dae file. * @return Returns @c DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h. * @note The @c daeElement passed in as dom should always be a @c domCOLLADA object, the API may enforce this in the future. */ virtual daeInt createDocument(daeString name, daeElement* dom, daeDocument** document = NULL, bool zaeRootDocument = false, const std::string& extractedFileURI = "") = 0; /** * Creates a new @c domCOLLADA root element and a new document; returns an error if the document name already exists. * @param name Name of the new document, must be a valid URI. * @param document Pointer to a @c daeDocument pointer that receives the document created * @return Returns DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h. */ virtual daeInt createDocument(daeString name, daeDocument** document = NULL) = 0; /** * Inserts an already existing document into the database. * @param c The document to insert. * @return Returns DAE_OK if the document was inserted successfully, otherwise returns a negative value as defined in daeError.h. */ virtual daeInt insertDocument( daeDocument *c ) = 0; /** * Removes a document from the database. * @param document Document to remove from the database * @return Returns DAE_OK if the document was successfully removed, otherwise returns a negative value as defined in daeError.h. */ virtual daeInt removeDocument(daeDocument* document) = 0; /** * Gets the number of documents. * @return Returns the number of documents. */ virtual daeUInt getDocumentCount() = 0; /** * Gets a document based on the document index. * @param index Index of the document to get. * @return Returns a pointer on the document, or NULL if not found. */ virtual daeDocument* getDocument(daeUInt index) = 0; /** * Gets a document based on the document index. * @param index Index of the document to get. * @return Returns a pointer on the document, or NULL if not found. */ daeDocument* getDoc(daeUInt index); /** * Gets a document based on the document name. * @param name The name of the document as a URI. * @param skipUriNormalization Use the document name as is; don't normalize it first. * This is mostly for improved performance. * @return Returns a pointer to the document, or NULL if not found. * @note If the URI contains a fragment, the fragment is stripped off. */ virtual daeDocument* getDocument(daeString name, bool skipUriNormalization = false) = 0; /** * Gets a document name. * @param index Index of the document to get. * @return Returns the name of the document at the given index. */ virtual daeString getDocumentName(daeUInt index) = 0; /** * Indicates if a document is loaded or not. * @param name Name of the document as a URI. * @return Returns true if the document is loaded, false otherwise. * @note If the URI contains a fragment, the fragment is stripped off. */ virtual daeBool isDocumentLoaded(daeString name) = 0; /** * Inserts a @c daeElement into the runtime database. * @param document Document in which the @c daeElement lives. * @param element @c daeElement to insert in the database * @return Returns @c DAE_OK if element successfully inserted, otherwise returns a negative value as defined in daeError.h. */ virtual daeInt insertElement(daeDocument* document, daeElement* element) = 0; /** * Removes a @c daeElement from the runtime database; not implemented in the reference STL implementation. * @param document Document in which the @c daeElement lives. * @param element Element to remove. * @return Returns @c DAE_OK if element successfully removed, otherwise returns a negative value as defined in daeError.h. */ virtual daeInt removeElement(daeDocument* document, daeElement* element) = 0; /** * Updates the database to reflect a change to the ID of a @c daeElement. * @param element @c daeElement whose ID is going to change. * @param newID The ID that will be assigned to the element. * @return Returns @c DAE_OK if the database was successfully updated, otherwise returns a negative value as defined in daeError.h. * @note The database doesn't actually change the ID of the element, it * merely updates its internal structures to reflect the change. It's * expected that the ID will be assigned to the element by someone else. */ virtual daeInt changeElementID(daeElement* element, daeString newID) = 0; /** * Updates the database to reflect a change to the sid of a @c daeElement. * @param element @c daeElement whose sid is going to change. * @param newSID The sid that will be assigned to the element. * @return Returns @c DAE_OK if the database was successfully updated, otherwise returns a negative value as defined in daeError.h. * @note The database doesn't actually change the sid of the element, it * merely updates its internal structures to reflect the change. It's * expected that the sid will be assigned to the element by someone else. * Note - This function currently isn't implemented in the default database. */ virtual daeInt changeElementSID(daeElement* element, daeString newSID) = 0; /** * Unloads all of the documents of the runtime database. * This function frees all the @c dom* objects created so far, * except any objects on which you still have a smart pointer reference (@c daeSmartRef). * @return Returns @c DAE_OK if all documents successfully unloaded, otherwise returns a negative value as defined in daeError.h. */ virtual daeInt clear() = 0; /** * Lookup elements by ID, searching through all documents. * @param id The ID to match on. * @return The array of matching elements. */ virtual std::vector idLookup(const std::string& id) = 0; /** * Find an element with the given ID in a specific document. * @param id The ID to match on. * @param doc The document to search in. * @return The matching element if one is found, NULL otherwise. */ daeElement* idLookup(const std::string& id, daeDocument* doc); /** * Lookup elements by type ID. * @param typeID The type to match on, e.g. domNode::ID(). * @param doc The document to search in, or NULL to search in all documents. * @return The array of matching elements. */ std::vector typeLookup(daeInt typeID, daeDocument* doc = NULL); /** * Same as the previous method, but returns the array of matching elements via a * reference parameter for additional efficiency. * @param typeID The type to match on, e.g. domNode::ID(). * @param matchingElements The array of matching elements. * @param doc The document to search in, or NULL to search in all documents. */ virtual void typeLookup(daeInt typeID, std::vector& matchingElements, daeDocument* doc = NULL) = 0; /** * Lookup elements by type ID. * @param doc The document to search in, or NULL to search in all documents. * @return The array of matching elements. */ template std::vector typeLookup(daeDocument* doc = NULL) { std::vector result; typeLookup(result, doc); return result; } /** * Same as the previous method, but returns the array of matching elements via a * reference parameter for additional efficiency. * @param matchingElements The array of matching elements. * @param doc The document to search in, or NULL to search in all documents. */ template void typeLookup(std::vector& matchingElements, daeDocument* doc = NULL) { std::vector elts; typeLookup(T::ID(), elts, doc); matchingElements.clear(); matchingElements.reserve(elts.size()); for (size_t i = 0; i < elts.size(); i++) matchingElements.push_back((T*)elts[i]); } /** * Lookup elements by sid. * @param sid The sid to match on. * @param doc The document to search in, or NULL to search in all documents. * @return The array of matching elements. * Note - This function currently isn't implemented in the default database. */ std::vector sidLookup(const std::string& sid, daeDocument* doc = NULL); /** * Same as the previous method, but the results are returned via a parameter instead * of a return value, for extra efficiency. * @param sid The sid to match on. * @param matchingElements The array of matching elements. * @param doc The document to search in, or NULL to search in all documents. * Note - This function currently isn't implemented in the default database. */ virtual void sidLookup(const std::string& sid, std::vector& matchingElements, daeDocument* doc = NULL) = 0; /** * Sets the top meta object. * Called by @c dae::setDatabase() when the database changes. It passes to this function the * top meta object, which is the root of a * hierarchy of @c daeMetaElement objects. This top meta object is capable of creating * any of the root objects in the DOM tree. * @param _topMeta Top meta object to use to create objects to fill the database. * @return Returns DAE_OK if successful, otherwise returns a negative value defined in daeError.h. */ virtual daeInt setMeta(daeMetaElement *_topMeta) = 0; public: // The following methods are deprecated, and it's recommended that you don't use them. // Where appropriate, alternative methods are specified. virtual daeUInt getTypeCount() = 0; virtual daeString getTypeName(daeUInt index) = 0; // Instead of the following two methods, use idLookup or typeLookup. virtual daeUInt getElementCount(daeString name = NULL, daeString type = NULL, daeString file = NULL) = 0; virtual daeInt getElement(daeElement** pElement, daeInt index, daeString name = NULL, daeString type = NULL, daeString file = NULL ) = 0; inline daeInt insertCollection(daeString name, daeElement* dom, daeDocument** document = NULL) { return insertDocument( name, dom, document ); } inline daeInt insertCollection(daeString name, daeDocument** document = NULL) { return insertDocument( name, document ); } inline daeInt createCollection(daeString name, daeElement* dom, daeDocument** document = NULL) { return createDocument( name, dom, document ); } inline daeInt createCollection(daeString name, daeDocument** document = NULL) { return createDocument( name, document ); } inline daeInt insertCollection( daeDocument *c ) { return insertDocument( c ); } inline daeInt removeCollection(daeDocument* document) { return removeDocument( document ); } inline daeUInt getCollectionCount() { return getDocumentCount(); } inline daeDocument* getCollection(daeUInt index) { return getDocument( index ); } inline daeDocument* getCollection(daeString name) { return getDocument( name ); } inline daeString getCollectionName(daeUInt index) { return getDocumentName( index ); } inline daeBool isCollectionLoaded(daeString name) { return isDocumentLoaded( name ); } protected: DAE& dae; }; #endif //__DAE_DATABASE__