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_IDREF_H__ 10 #define __DAE_IDREF_H__ 11 12 #include <string> 13 #include <dae/daeTypes.h> 14 #include <dae/daeElement.h> 15 class DAE; 16 17 /** 18 * The @c daeIDRef is a simple class designed to aid in the parsing and resolution of 19 * ID references inside of COLLADA elements. 20 * A @c daeIDRef is created for every IDREF data type in the COLLADA schema. 21 * It also has the capability to attempt to resolve this reference 22 * into a @c daeElement. If a @c daeIDRef is stored within a @c daeElement it fills 23 * in its container field to point to the containing element. 24 * 25 * The main API is the @c daeIDRef::resolveElement() will use a @c daeIDRefResolver 26 * to search for the @c daeElement inside of a @c daeDatabase. 27 * 28 */ 29 class DLLSPEC daeIDRef 30 { 31 public: 32 /** 33 * An enum describing the status of the ID resolution process. 34 */ 35 enum ResolveState{ 36 /** No ID specified */ 37 id_empty, 38 /** ID specified but not resolved */ 39 id_loaded, 40 /** ID resolution pending */ 41 id_pending, 42 /** ID resolved correctly */ 43 id_success, 44 /** Resolution failed because ID was not found */ 45 id_failed_id_not_found, 46 /** Resolution failed because ID was invalid */ 47 id_failed_invalid_id, 48 /** Resoltion failed due to invalid reference */ 49 id_failed_invalid_reference, 50 /** Resolution failed due to an external error */ 51 id_failed_externalization, 52 /** Resolution failed because we don't have a document in which to search for the element. 53 This means you probably forgot to set a container element. */ 54 id_failed_no_document 55 }; 56 57 private: 58 /** ID used to refer to another element */ 59 std::string id; 60 61 /** Element that owns this ID (if any) */ 62 daeElement* container; 63 64 public: 65 /** 66 * Simple Constructor 67 */ 68 daeIDRef(); 69 70 /** 71 * Constructs an id reference via a string, using @c setID(); loads the status. 72 * @param id ID to construct a reference for, passed to @c setID() automatically. 73 */ 74 daeIDRef(daeString id); 75 76 /** 77 * Constructs a new id reference by copying an existing one. 78 * @param constructFromIDRef @c daeIDRef to copy into this one. 79 */ 80 daeIDRef(const daeIDRef& constructFromIDRef); 81 82 /** 83 * Constructs an id reference with a container element 84 * @param container The container element. 85 */ 86 daeIDRef(daeElement& container); 87 88 /** 89 * Gets the ID string 90 * @return Returns the full ID string from <tt><i>id.</i></tt> 91 */ 92 daeString getID() const; 93 94 /** 95 * Copies <tt><i>ID</i></tt> into the <tt><i>id </i></tt> data member. 96 * After the call to @c setID(), the <tt><i>state</i></tt> is set to @c id_loaded 97 * @param ID String to use to configure this @c daeIDRef. 98 */ 99 void setID(daeString ID); 100 101 /** 102 * Gets the element that this URI resolves to in memory. 103 * @return Returns a ref to the element. 104 */ 105 daeElement* getElement() const; 106 107 /** 108 * Gets a pointer to the @c daeElement that contains this URI. 109 * @return Returns the pointer to the containing daeElmement. 110 */ 111 daeElement* getContainer() const; 112 113 /** 114 * Sets the pointer to the @c daeElement that contains this URI. 115 * @param cont Pointer to the containing @c daeElmement. 116 */ 117 void setContainer(daeElement* cont); 118 119 /** 120 * Outputs all components of this @c daeIDRef to stderr. 121 */ 122 void print(); 123 124 /** 125 * Resets this @c daeIDRef; frees all string references 126 * and returns <tt><i>state</i></tt> to @c empty. 127 */ 128 void reset(); 129 130 /** 131 * Initializes the @c daeIDREf, setting <tt><i>id, element,</i></tt> and <tt><i>container</i></tt> to NULL. 132 */ 133 void initialize(); 134 135 /** 136 * Comparison operator. 137 * @return Returns true if URI's are equal. 138 */ 139 bool operator==(const daeIDRef& other) const; 140 141 /** 142 * Assignment operator. 143 * @return Returns a reference to this object. 144 */ 145 daeIDRef &operator=( const daeIDRef& other); 146 147 // These methods are only provided for backwards compatibility. Use the listed alternatives. 148 daeIDRef &get( daeUInt idx ); // Never should have existed. No alternative. 149 size_t getCount() const; // Never should have existed. No alternative. 150 daeIDRef& operator[](size_t index); // Never should have existed. No alternative. 151 void resolveElement( daeString typeNameHint = NULL ); // Call getElement. No separate "resolve" step needed. 152 void resolveID(); // Never should have existed. No alternative. 153 void validate(); // Never should have existed. No alternative. 154 void copyFrom(const daeIDRef& from); // Use the assignment operator instead. 155 ResolveState getState() const; // Never should have existed. No alternative. 156 }; 157 158 /** 159 * The @c daeIDRefResolver class is the plugin point for @c daeIDRef resolution. 160 * This class is an abstract base class that defines an interface for 161 * resolving @c daeIDRefs. 162 */ 163 class DLLSPEC daeIDRefResolver 164 { 165 public: 166 /** 167 * Constructor 168 */ 169 daeIDRefResolver(DAE& dae); 170 171 /** 172 * Destructor 173 */ 174 virtual ~daeIDRefResolver(); 175 176 /** 177 * Provides an abstract interface to convert a @c daeIDRef into a @c daeElement. 178 * @param id The ID of the element to find. 179 * @param doc The document containing the element. 180 * @return Returns a daeElement with matching ID, if one is found. 181 */ 182 virtual daeElement* resolveElement(const std::string& id, daeDocument* doc) = 0; 183 184 185 /** 186 * Gets the name of this resolver. 187 * @return Returns the string name. 188 */ 189 virtual daeString getName() = 0; 190 191 protected: 192 DAE* dae; 193 }; 194 195 196 /** 197 * The @c daeDefaultIDRefResolver resolves a @c daeIDRef by checking with a database. 198 * It is a concrete implementation for @c daeIDRefResolver. 199 */ 200 class DLLSPEC daeDefaultIDRefResolver : public daeIDRefResolver 201 { 202 public: 203 daeDefaultIDRefResolver(DAE& dae); 204 ~daeDefaultIDRefResolver(); 205 virtual daeElement* resolveElement(const std::string& id, daeDocument* doc); 206 virtual daeString getName(); 207 }; 208 209 210 // This is a container class for storing a modifiable list of daeIDRefResolver objects. 211 class DLLSPEC daeIDRefResolverList { 212 public: 213 daeIDRefResolverList(); 214 ~daeIDRefResolverList(); 215 216 void addResolver(daeIDRefResolver* resolver); 217 void removeResolver(daeIDRefResolver* resolver); 218 219 daeElement* resolveElement(const std::string& id, daeDocument* doc); 220 221 private: 222 // Disabled copy constructor/assignment operator 223 daeIDRefResolverList(const daeIDRefResolverList& resolverList) { }; 224 daeIDRefResolverList& operator=(const daeIDRefResolverList& resolverList) { return *this; }; 225 226 daeTArray<daeIDRefResolver*> resolvers; 227 }; 228 229 230 #endif //__DAE_IDREF_H__ 231