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 #include <sstream>
10 #include <dae.h>
11 #include <dae/daeIDRef.h>
12 #include <dae/daeDatabase.h>
13 #include <dae/daeErrorHandler.h>
14
15 using namespace std;
16
17 void
initialize()18 daeIDRef::initialize()
19 {
20 id = "";
21 container = NULL;
22 }
23
daeIDRef()24 daeIDRef::daeIDRef()
25 {
26 initialize();
27 }
28
daeIDRef(daeString IDRefString)29 daeIDRef::daeIDRef(daeString IDRefString)
30 {
31 initialize();
32 setID(IDRefString);
33 }
34
daeIDRef(const daeIDRef & copyFrom_)35 daeIDRef::daeIDRef(const daeIDRef& copyFrom_)
36 {
37 initialize();
38 copyFrom(copyFrom_);
39 }
40
daeIDRef(daeElement & container)41 daeIDRef::daeIDRef(daeElement& container) {
42 initialize();
43 setContainer(&container);
44 }
45
46
47 void
reset()48 daeIDRef::reset()
49 {
50 setID("");
51 }
52
operator ==(const daeIDRef & other) const53 bool daeIDRef::operator==(const daeIDRef& other) const {
54 return (!strcmp(other.getID(), getID()));
55 }
56
operator =(const daeIDRef & other)57 daeIDRef &daeIDRef::operator=( const daeIDRef& other) {
58 if (!container)
59 container = other.container;
60 id = other.getID();
61 return *this;
62 }
63
64 daeString
getID() const65 daeIDRef::getID() const
66 {
67 return id.c_str();
68 }
69
70 void
setID(daeString _IDString)71 daeIDRef::setID(daeString _IDString)
72 {
73 id = _IDString ? _IDString : "";
74 }
75
getElement() const76 daeElement* daeIDRef::getElement() const {
77 if (container)
78 return container->getDAE()->getIDRefResolvers().resolveElement(id, container->getDocument());
79 return NULL;
80 }
81
getContainer() const82 daeElement* daeIDRef::getContainer() const {
83 return(container);
84 }
85
setContainer(daeElement * cont)86 void daeIDRef::setContainer(daeElement* cont) {
87 container = cont;
88 }
89
90 void
print()91 daeIDRef::print()
92 {
93 fprintf(stderr,"id = %s\n",id.c_str());
94 fflush(stderr);
95 }
96
97 // These methods are provided for backward compatibility only.
validate()98 void daeIDRef::validate() { }
99
resolveElement(daeString)100 void daeIDRef::resolveElement( daeString ) { }
101
resolveID()102 void daeIDRef::resolveID() { }
103
get(daeUInt idx)104 daeIDRef &daeIDRef::get( daeUInt idx ) {
105 (void)idx;
106 return *this;
107 }
108
getCount() const109 size_t daeIDRef::getCount() const {
110 return 1;
111 }
112
operator [](size_t index)113 daeIDRef& daeIDRef::operator[](size_t index) {
114 (void)index;
115 return *this;
116 }
117
118 void
copyFrom(const daeIDRef & copyFrom)119 daeIDRef::copyFrom(const daeIDRef& copyFrom) {
120 *this = copyFrom;
121 }
122
getState() const123 daeIDRef::ResolveState daeIDRef::getState() const {
124 if (id.empty())
125 return id_empty;
126 if (getElement())
127 return id_success;
128 return id_failed_id_not_found;
129 }
130
131
daeIDRefResolver(DAE & dae)132 daeIDRefResolver::daeIDRefResolver(DAE& dae) : dae(&dae) { }
133
~daeIDRefResolver()134 daeIDRefResolver::~daeIDRefResolver() { }
135
136
daeDefaultIDRefResolver(DAE & dae)137 daeDefaultIDRefResolver::daeDefaultIDRefResolver(DAE& dae) : daeIDRefResolver(dae) { }
138
~daeDefaultIDRefResolver()139 daeDefaultIDRefResolver::~daeDefaultIDRefResolver() { }
140
141 daeString
getName()142 daeDefaultIDRefResolver::getName()
143 {
144 return "DefaultIDRefResolver";
145 }
146
resolveElement(const string & id,daeDocument * doc)147 daeElement* daeDefaultIDRefResolver::resolveElement(const string& id, daeDocument* doc) {
148 return doc ? dae->getDatabase()->idLookup(id, doc) : NULL;
149 }
150
151
daeIDRefResolverList()152 daeIDRefResolverList::daeIDRefResolverList() { }
153
~daeIDRefResolverList()154 daeIDRefResolverList::~daeIDRefResolverList() {
155 for (size_t i = 0; i < resolvers.getCount(); i++)
156 delete resolvers[i];
157 }
158
addResolver(daeIDRefResolver * resolver)159 void daeIDRefResolverList::addResolver(daeIDRefResolver* resolver) {
160 resolvers.append(resolver);
161 }
162
removeResolver(daeIDRefResolver * resolver)163 void daeIDRefResolverList::removeResolver(daeIDRefResolver* resolver) {
164 resolvers.remove(resolver);
165 }
166
resolveElement(const string & id,daeDocument * doc)167 daeElement* daeIDRefResolverList::resolveElement(const string& id, daeDocument* doc) {
168 for(size_t i = 0; i < resolvers.getCount(); i++)
169 if (daeElement* el = resolvers[i]->resolveElement(id, doc))
170 return el;
171 return NULL;
172 }
173