/*
* 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;
}