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_DOCUMENT__
10 #define __DAE_DOCUMENT__
11 
12 #include <dae/daeTypes.h>
13 #include <dae/daeElement.h>
14 #include <dae/daeURI.h>
15 #include <dae/daeStringRef.h>
16 
17 class DAE;
18 class daeDatabase;
19 
20 /**
21  * The @c daeDocument class implements a COLLADA runtime database entry.
22  */
23 class DLLSPEC daeDocument
24 {
25 public:
26 	/**
27 	 * Constructor
28 	 * @param dae The dae that owns this document.
29      * @param zaeRootDocument Indicates if the new document is the root document of a ZAE archive.
30      * @param extractedFileURI URI to extracted dae file.
31 	 */
32     daeDocument(DAE& dae, bool zaeRootDocument = false, const std::string& extractedFileURI = "");
33 
34 	/**
35 	 * Destructor
36 	 */
37 	~daeDocument();
38 
39 	/**
40 	* Accessor to get the @c domCollada associated with this document.
41 	* @return A @c daeElementRef for the @c domCollada that is the root of this document.
42 	* @note This function should really return a domColladaRef,
43 	* but we're trying to avoid having @c dae classes depend on generated dom classes.
44 	*/
getDomRoot()45 	daeElement* getDomRoot() const {return(dom);}
46 	/**
47 	* Accessor to set the domCollada associated with this document
48 	* @param domRoot the domCollada that is the root of this document
49 	* @remarks Should really require a domColladaRef but we're trying to avoid having dae classes depend on generated dom classes.
50 	*/
setDomRoot(daeElement * domRoot)51 	void setDomRoot(daeElement* domRoot) {dom = domRoot; domRoot->setDocument(this); }
52 	/**
53 	* Accessor to get the URI associated with the document in this document;
54 	* this is currently set to the URI from which the document was loaded, but
55 	* is blank if the document was created with @c insertDocument().
56 	* @return Returns a pointer to the URI for this document.
57 	* @note This is the full URI of the document and not the document base URI.
58 	*/
getDocumentURI()59 	daeURI* getDocumentURI() {return (&uri);}
60 
61 	/**
62 	* Const accessor to get the URI associated with the document in this collection;
63 	* this is currently set to the URI from which the collection was loaded, but
64 	* is blank if the collection was created with @c insertCollection().
65 	* @return Returns a pointer to the URI for this collection.
66 	* @note This is the full URI of the document and not the document base URI.
67 	*/
getDocumentURI()68 	const daeURI* getDocumentURI() const {return (&uri);}
69 
70 	/**
71 	 * Accessor to get the DAE that owns this document.
72 	 * @return Returns the DAE that owns this document.
73 	 */
74 	DAE* getDAE();
75 
76 	/**
77 	 * Accessor to get the database associated with this document.
78 	 * @return Returns the database associated with this document.
79 	 */
80 	daeDatabase* getDatabase();
81 
82 	/**
83 	 * This function is used to track how a document gets modified. It gets called internally.
84 	 * @param element The element that was added to this document.
85 	 * @note This function is called internally and not meant to be called by the client application.
86 	 * Calling this function from the client application may result in unexpected behavior.
87 	 */
88 	void insertElement( daeElementRef element );
89 	/**
90 	 * This function is used to track how a document gets modified. It gets called internally.
91 	 * @param element The element that was removed from this document.
92 	 * @note This function is called internally and not meant to be called by the client application.
93 	 * Calling this function from the client application may result in unexpected behavior.
94 	 */
95 	void removeElement( daeElementRef element );
96 	/**
97 	 * This function is used to track how a document gets modified. It gets called internally.
98 	 * @param element The element whose ID is about to be changed.
99 	 * @param newID The ID that is going to be assigned to the element.
100 	 * @note This function is called internally and not meant to be called by the client application.
101 	 * Calling this function from the client application may result in unexpected behavior.
102 	 */
103 	void changeElementID( daeElementRef element, daeString newID );
104 	/**
105 	 * This function is just like changeElementID, except it keeps track of sids instead of IDs.
106 	 * @param element The element whose sid is about to be changed.
107 	 * @param newSID The sid that is going to be assigned to the element.
108 	 * @note This function is called internally and not meant to be called by the client application.
109 	 * Calling this function from the client application may result in unexpected behavior.
110 	 */
111 	void changeElementSID( daeElementRef element, daeString newSID );
112 
113     /**
114      * Returns true if this document is the root of a ZAE archive.
115      * In that case getExtractedFileURI() can be used to parse
116      * this document and for URI resolving.
117      * @note This function is called internally and not meant to be called by the client application.
118      */
isZAERootDocument()119     bool isZAERootDocument() {return mZAERootDocument;}
120 
121     /**
122      * If this document is the root of a ZAE archive, this method can be used
123      * to get the extracted file. Return value is only valid if isZAERootDocument()
124      * returns true.
125      * @note This function is called internally and not meant to be called by the client application.
126      */
getExtractedFileURI()127     const daeURI& getExtractedFileURI() {return mExtractedFileURI;}
128 
129 private:
130 	/**
131 	 * The DAE that owns this document. The DAE's database is notified by the document when
132 	 * elements are inserted, removed, or have their ID changed.
133 	 */
134 	DAE* dae;
135 
136 	/**
137 	 * Top Level element for of the document, always a domCollada
138 	 * @remarks This member will eventually be taken private, use getDomRoot() to access it.
139 	 */
140 	daeElementRef dom;
141 
142 	/**
143 	 * The URI of the document, may be blank if the document wasn't loaded from a URI
144 	 * @remarks This member will eventually be taken private, use getDocumentURI() to access it.
145 	 */
146 	daeURI uri;
147 
148     /**
149      * Indicates if this document is the root of a ZAE archive.
150      */
151     bool mZAERootDocument;
152 
153     /**
154      * URI pointing to the extracted root DAE if mZAERootDocument is true.
155      * Otherwise it is not valid.
156      */
157     daeURI mExtractedFileURI;
158 };
159 
160 typedef daeDocument daeCollection;
161 
162 #endif
163 
164