/* * 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 * */ #include <sstream> #include <dae.h> #include <dae/daeIDRef.h> #include <dae/daeDatabase.h> #include <dae/daeErrorHandler.h> using namespace std; void daeIDRef::initialize() { id = ""; container = NULL; } daeIDRef::daeIDRef() { initialize(); } daeIDRef::daeIDRef(daeString IDRefString) { initialize(); setID(IDRefString); } daeIDRef::daeIDRef(const daeIDRef& copyFrom_) { initialize(); copyFrom(copyFrom_); } daeIDRef::daeIDRef(daeElement& container) { initialize(); setContainer(&container); } void daeIDRef::reset() { setID(""); } bool daeIDRef::operator==(const daeIDRef& other) const { return (!strcmp(other.getID(), getID())); } daeIDRef &daeIDRef::operator=( const daeIDRef& other) { if (!container) container = other.container; id = other.getID(); return *this; } daeString daeIDRef::getID() const { return id.c_str(); } void daeIDRef::setID(daeString _IDString) { id = _IDString ? _IDString : ""; } daeElement* daeIDRef::getElement() const { if (container) return container->getDAE()->getIDRefResolvers().resolveElement(id, container->getDocument()); return NULL; } daeElement* daeIDRef::getContainer() const { return(container); } void daeIDRef::setContainer(daeElement* cont) { container = cont; } void daeIDRef::print() { fprintf(stderr,"id = %s\n",id.c_str()); fflush(stderr); } // These methods are provided for backward compatibility only. void daeIDRef::validate() { } void daeIDRef::resolveElement( daeString ) { } void daeIDRef::resolveID() { } daeIDRef &daeIDRef::get( daeUInt idx ) { (void)idx; return *this; } size_t daeIDRef::getCount() const { return 1; } daeIDRef& daeIDRef::operator[](size_t index) { (void)index; return *this; } void daeIDRef::copyFrom(const daeIDRef& copyFrom) { *this = copyFrom; } daeIDRef::ResolveState daeIDRef::getState() const { if (id.empty()) return id_empty; if (getElement()) return id_success; return id_failed_id_not_found; } daeIDRefResolver::daeIDRefResolver(DAE& dae) : dae(&dae) { } daeIDRefResolver::~daeIDRefResolver() { } daeDefaultIDRefResolver::daeDefaultIDRefResolver(DAE& dae) : daeIDRefResolver(dae) { } daeDefaultIDRefResolver::~daeDefaultIDRefResolver() { } daeString daeDefaultIDRefResolver::getName() { return "DefaultIDRefResolver"; } daeElement* daeDefaultIDRefResolver::resolveElement(const string& id, daeDocument* doc) { return doc ? dae->getDatabase()->idLookup(id, doc) : NULL; } daeIDRefResolverList::daeIDRefResolverList() { } daeIDRefResolverList::~daeIDRefResolverList() { for (size_t i = 0; i < resolvers.getCount(); i++) delete resolvers[i]; } void daeIDRefResolverList::addResolver(daeIDRefResolver* resolver) { resolvers.append(resolver); } void daeIDRefResolverList::removeResolver(daeIDRefResolver* resolver) { resolvers.remove(resolver); } daeElement* daeIDRefResolverList::resolveElement(const string& id, daeDocument* doc) { for(size_t i = 0; i < resolvers.getCount(); i++) if (daeElement* el = resolvers[i]->resolveElement(id, doc)) return el; return NULL; }