Home | History | Annotate | Download | only in dae
      1 /*
      2 * Copyright 2006 Sony Computer Entertainment Inc.
      3 *
      4 * Licensed under the MIT Open Source License, for details please see license.txt or the website
      5 * http://www.opensource.org/licenses/mit-license.php
      6 *
      7 */
      8 
      9 #ifndef __DAE_DATABASE__
     10 #define __DAE_DATABASE__
     11 
     12 #include <memory>
     13 #include <vector>
     14 #include <dae.h>
     15 #include <dae/daeTypes.h>
     16 #include <dae/daeElement.h>
     17 #include <dae/daeURI.h>
     18 #include <dae/daeDocument.h>
     19 
     20 
     21 /**
     22  * The @c daeDatabase class defines the COLLADA runtime database interface.
     23  */
     24 class DLLSPEC daeDatabase
     25 {
     26 public:
     27 	/**
     28 	 * Constructor
     29 	 */
     30 	daeDatabase(DAE& dae);
     31 
     32 	/**
     33 	 * Destructor
     34 	 */
     35 	virtual ~daeDatabase() {}
     36 
     37 	/**
     38 	 * Get the associated DAE object.
     39 	 * @return The associated DAE object.
     40 	 */
     41 	virtual DAE* getDAE();
     42 
     43 	/**
     44 	* Creates a new document, defining its root as the <tt><i>dom</i></tt> object; returns an error if the document name already exists.
     45 	* @param name Name of the new document, must be a valid URI.
     46 	* @param dom Existing @c domCOLLADA root element of the document
     47 	* @param document Pointer to a @c daeDocument pointer that receives the document created
     48     * @param zaeRootDocument Indicates if the new document is the root document of a ZAE archive.
     49     * @param extractedFileURI URI to extracted dae file.
     50 	* @return Returns @c DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h.
     51 	* @note The @c daeElement passed in as <tt><i>dom</i></tt> should always be a @c domCOLLADA object, the API may enforce this in the future.
     52 	* @deprecated This function will be removed in future versions. Please use createDocument.
     53 	*/
     54 	virtual daeInt insertDocument(daeString name, daeElement* dom, daeDocument** document = NULL, bool zaeRootDocument = false, const std::string& extractedFileURI = "") = 0;
     55 	/**
     56 	* Creates a new @c domCOLLADA root element and a new document; returns an error if the document name already exists.
     57 	* @param name Name of the new document, must be a valid URI.
     58 	* @param document Pointer to a @c daeDocument pointer that receives the document created
     59 	* @return Returns DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h.
     60 	* @deprecated This function will be removed in future versions. Please use createDocument.
     61 	*/
     62 	virtual daeInt insertDocument(daeString name, daeDocument** document = NULL) = 0;
     63 	/**
     64 	* Creates a new document, defining its root as the <tt><i>dom</i></tt> object; returns an error if the document name already exists.
     65 	* @param name Name of the new document, must be a valid URI.
     66 	* @param dom Existing @c domCOLLADA root element of the document
     67 	* @param document Pointer to a @c daeDocument pointer that receives the document created
     68     * @param zaeRootDocument Indicates if the new document is the root document of a ZAE archive.
     69     * @param extractedFileURI URI to extracted dae file.
     70 	* @return Returns @c DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h.
     71 	* @note The @c daeElement passed in as <tt><i>dom</i></tt> should always be a @c domCOLLADA object, the API may enforce this in the future.
     72 	*/
     73 	virtual daeInt createDocument(daeString name, daeElement* dom, daeDocument** document = NULL, bool zaeRootDocument = false, const std::string& extractedFileURI = "") = 0;
     74 	/**
     75 	* Creates a new @c domCOLLADA root element and a new document; returns an error if the document name already exists.
     76 	* @param name Name of the new document, must be a valid URI.
     77 	* @param document Pointer to a @c daeDocument pointer that receives the document created
     78 	* @return Returns DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h.
     79 	*/
     80 	virtual daeInt createDocument(daeString name, daeDocument** document = NULL) = 0;
     81 
     82 	/**
     83 	 * Inserts an already existing document into the database.
     84 	 * @param c The document to insert.
     85 	 * @return Returns DAE_OK if the document was inserted successfully, otherwise returns a negative value as defined in daeError.h.
     86 	 */
     87 	virtual daeInt insertDocument( daeDocument *c ) = 0;
     88 
     89 	/**
     90 	* Removes a document from the database.
     91 	* @param document Document to remove from the database
     92 	* @return Returns DAE_OK if the document was successfully removed, otherwise returns a negative value as defined in daeError.h.
     93 	*/
     94 	virtual daeInt removeDocument(daeDocument* document) = 0;
     95 	/**
     96 	* Gets the number of documents.
     97 	* @return Returns the number of documents.
     98 	*/
     99 	virtual daeUInt getDocumentCount() = 0;
    100 	/**
    101 	* Gets a document based on the document index.
    102 	* @param index Index of the document to get.
    103 	* @return Returns a pointer on the document, or NULL if not found.
    104 	*/
    105 	virtual daeDocument* getDocument(daeUInt index) = 0;
    106 	/**
    107 	* Gets a document based on the document index.
    108 	* @param index Index of the document to get.
    109 	* @return Returns a pointer on the document, or NULL if not found.
    110 	*/
    111 	daeDocument* getDoc(daeUInt index);
    112 	/**
    113 	* Gets a document based on the document name.
    114 	* @param name The name of the document as a URI.
    115 	* @param skipUriNormalization Use the document name as is; don't normalize it first.
    116 	*   This is mostly for improved performance.
    117 	* @return Returns a pointer to the document, or NULL if not found.
    118 	* @note If the URI contains a fragment, the fragment is stripped off.
    119 	*/
    120 	virtual daeDocument* getDocument(daeString name, bool skipUriNormalization = false) = 0;
    121 	/**
    122 	* Gets a document name.
    123 	* @param index Index of the document to get.
    124 	* @return Returns the name of the document at the given index.
    125 	*/
    126 	virtual daeString getDocumentName(daeUInt index) = 0;
    127 	/**
    128 	* Indicates if a document is loaded or not.
    129 	* @param name Name of the document  as a URI.
    130 	* @return Returns true if the document is loaded, false otherwise.
    131 	* @note If the URI contains a fragment, the fragment is stripped off.
    132 	*/
    133 	virtual daeBool isDocumentLoaded(daeString name) = 0;
    134 
    135 	/**
    136 	* Inserts a @c daeElement into the runtime database.
    137 	* @param document Document in which the @c daeElement lives.
    138 	* @param element @c daeElement to insert in the database
    139 	* @return Returns @c DAE_OK if element successfully inserted, otherwise returns a negative value as defined in daeError.h.
    140 	*/
    141 	virtual daeInt insertElement(daeDocument* document,
    142 	                             daeElement* element) = 0;
    143 	/**
    144 	* Removes a @c daeElement from the runtime database; not implemented in the reference STL implementation.
    145 	* @param document Document in which the @c daeElement lives.
    146 	* @param element Element to remove.
    147 	* @return Returns @c DAE_OK if element successfully removed, otherwise returns a negative value as defined in daeError.h.
    148 	*/
    149 	virtual daeInt removeElement(daeDocument* document,
    150 	                             daeElement* element) = 0;
    151 	/**
    152 	 * Updates the database to reflect a change to the ID of a @c daeElement.
    153 	 * @param element @c daeElement whose ID is going to change.
    154 	 * @param newID The ID that will be assigned to the element.
    155 	 * @return Returns @c DAE_OK if the database was successfully updated, otherwise returns a negative value as defined in daeError.h.
    156 	 * @note The database doesn't actually change the ID of the element, it
    157 	 * merely updates its internal structures to reflect the change. It's
    158 	 * expected that the ID will be assigned to the element by someone else.
    159 	 */
    160 	virtual daeInt changeElementID(daeElement* element,
    161 	                               daeString newID) = 0;
    162 
    163 	/**
    164 	 * Updates the database to reflect a change to the sid of a @c daeElement.
    165 	 * @param element @c daeElement whose sid is going to change.
    166 	 * @param newSID The sid that will be assigned to the element.
    167 	 * @return Returns @c DAE_OK if the database was successfully updated, otherwise returns a negative value as defined in daeError.h.
    168 	 * @note The database doesn't actually change the sid of the element, it
    169 	 * merely updates its internal structures to reflect the change. It's
    170 	 * expected that the sid will be assigned to the element by someone else.
    171  	 * Note - This function currently isn't implemented in the default database.
    172 	 */
    173 	virtual daeInt changeElementSID(daeElement* element,
    174 	                                daeString newSID) = 0;
    175 
    176 	/**
    177 	* Unloads all of the documents of the runtime database.
    178 	* This function frees all the @c dom* objects created so far,
    179 	* except any objects on which you still have a smart pointer reference (@c daeSmartRef).
    180 	* @return Returns @c DAE_OK if all documents successfully unloaded, otherwise returns a negative value as defined in daeError.h.
    181 	*/
    182 	virtual daeInt clear() = 0;
    183 
    184 	/**
    185 	 * Lookup elements by ID, searching through all documents.
    186 	 * @param id The ID to match on.
    187 	 * @return The array of matching elements.
    188 	 */
    189 	virtual std::vector<daeElement*> idLookup(const std::string& id) = 0;
    190 
    191 	/**
    192 	 * Find an element with the given ID in a specific document.
    193 	 * @param id The ID to match on.
    194 	 * @param doc The document to search in.
    195 	 * @return The matching element if one is found, NULL otherwise.
    196 	 */
    197 	daeElement* idLookup(const std::string& id, daeDocument* doc);
    198 
    199 	/**
    200 	 * Lookup elements by type ID.
    201 	 * @param typeID The type to match on, e.g. domNode::ID().
    202 	 * @param doc The document to search in, or NULL to search in all documents.
    203 	 * @return The array of matching elements.
    204 	 */
    205 	std::vector<daeElement*> typeLookup(daeInt typeID, daeDocument* doc = NULL);
    206 
    207 	/**
    208 	 * Same as the previous method, but returns the array of matching elements via a
    209 	 * reference parameter for additional efficiency.
    210 	 * @param typeID The type to match on, e.g. domNode::ID().
    211 	 * @param matchingElements The array of matching elements.
    212 	 * @param doc The document to search in, or NULL to search in all documents.
    213 	 */
    214 	virtual void typeLookup(daeInt typeID,
    215 	                        std::vector<daeElement*>& matchingElements,
    216 	                        daeDocument* doc = NULL) = 0;
    217 
    218 	/**
    219 	 * Lookup elements by type ID.
    220 	 * @param doc The document to search in, or NULL to search in all documents.
    221 	 * @return The array of matching elements.
    222 	 */
    223 	template<typename T>
    224 	std::vector<T*> typeLookup(daeDocument* doc = NULL) {
    225 		std::vector<T*> result;
    226 		typeLookup(result, doc);
    227 		return result;
    228 	}
    229 
    230 	/**
    231 	 * Same as the previous method, but returns the array of matching elements via a
    232 	 * reference parameter for additional efficiency.
    233 	 * @param matchingElements The array of matching elements.
    234 	 * @param doc The document to search in, or NULL to search in all documents.
    235 	 */
    236 	template<typename T> void
    237 	typeLookup(std::vector<T*>& matchingElements, daeDocument* doc = NULL) {
    238 		std::vector<daeElement*> elts;
    239 		typeLookup(T::ID(), elts, doc);
    240 		matchingElements.clear();
    241 		matchingElements.reserve(elts.size());
    242 		for (size_t i = 0; i < elts.size(); i++)
    243 			matchingElements.push_back((T*)elts[i]);
    244 	}
    245 
    246 	/**
    247 	 * Lookup elements by sid.
    248 	 * @param sid The sid to match on.
    249 	 * @param doc The document to search in, or NULL to search in all documents.
    250 	 * @return The array of matching elements.
    251 	 * Note - This function currently isn't implemented in the default database.
    252 	 */
    253 	std::vector<daeElement*> sidLookup(const std::string& sid, daeDocument* doc = NULL);
    254 
    255 	/**
    256 	 * Same as the previous method, but the results are returned via a parameter instead
    257 	 * of a return value, for extra efficiency.
    258 	 * @param sid The sid to match on.
    259 	 * @param matchingElements The array of matching elements.
    260 	 * @param doc The document to search in, or NULL to search in all documents.
    261 	 * Note - This function currently isn't implemented in the default database.
    262 	 */
    263 	virtual void sidLookup(const std::string& sid,
    264 	                       std::vector<daeElement*>& matchingElements,
    265 	                       daeDocument* doc = NULL) = 0;
    266 
    267 	/**
    268 	* Sets the top meta object.
    269 	* Called by @c dae::setDatabase() when the database changes. It passes to this function the
    270 	* top meta object, which is the root of a
    271     * hierarchy of @c daeMetaElement objects. This top meta object is capable of creating
    272 	* any of the root objects in the DOM tree.
    273 	* @param _topMeta Top meta object to use to create objects to fill the database.
    274 	* @return Returns DAE_OK if successful, otherwise returns a negative value defined in daeError.h.
    275 	*/
    276 	virtual daeInt setMeta(daeMetaElement *_topMeta) = 0;
    277 
    278 public:
    279 	// The following methods are deprecated, and it's recommended that you don't use them.
    280 	// Where appropriate, alternative methods are specified.
    281 
    282 	virtual daeUInt getTypeCount() = 0;
    283 	virtual daeString getTypeName(daeUInt index) = 0;
    284 
    285 	// Instead of the following two methods, use idLookup or typeLookup.
    286 	virtual daeUInt getElementCount(daeString name = NULL,
    287 	                                daeString type = NULL,
    288 	                                daeString file = NULL) = 0;
    289 	virtual daeInt getElement(daeElement** pElement,
    290 	                          daeInt index,
    291 	                          daeString name = NULL,
    292 	                          daeString type = NULL,
    293 	                          daeString file = NULL ) = 0;
    294 
    295 	inline daeInt insertCollection(daeString name, daeElement* dom, daeDocument** document = NULL) {
    296 		return insertDocument( name, dom, document );
    297 	}
    298 	inline daeInt insertCollection(daeString name, daeDocument** document = NULL) {
    299 		return insertDocument( name, document );
    300 	}
    301 	inline daeInt createCollection(daeString name, daeElement* dom, daeDocument** document = NULL) {
    302 		return createDocument( name, dom, document );
    303 	}
    304 	inline daeInt createCollection(daeString name, daeDocument** document = NULL) {
    305 		return createDocument( name, document );
    306 	}
    307 	inline daeInt insertCollection( daeDocument *c ) {
    308 		return insertDocument( c );
    309 	}
    310 	inline daeInt removeCollection(daeDocument* document) {
    311 		return removeDocument( document );
    312 	}
    313 	inline daeUInt getCollectionCount() {
    314 		return getDocumentCount();
    315 	}
    316 	inline daeDocument* getCollection(daeUInt index) {
    317 		return getDocument( index );
    318 	}
    319 	inline daeDocument* getCollection(daeString name) {
    320 		return getDocument( name );
    321 	}
    322 	inline daeString getCollectionName(daeUInt index) {
    323 		return getDocumentName( index );
    324 	}
    325 	inline daeBool isCollectionLoaded(daeString name) {
    326 		return isDocumentLoaded( name );
    327 	}
    328 
    329 protected:
    330 	DAE& dae;
    331 };
    332 
    333 #endif //__DAE_DATABASE__
    334 
    335