/* * 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/daeMetaAttribute.h> #include <dae/daeMetaElement.h> #include <dae/daeErrorHandler.h> #include <dae/daeDocument.h> void daeMetaAttribute::set(daeElement* e, daeString s) { stringToMemory(e, s); } void daeMetaAttribute::copy(daeElement* to, daeElement *from) { _type->copy(get(from), get(to)); } void daeMetaArrayAttribute::copy(daeElement* to, daeElement *from) { daeArray& fromArray = (daeArray&)*get(from); daeArray& toArray = (daeArray&)*get(to); _type->copyArray(fromArray, toArray); } void daeMetaAttribute::copyDefault(daeElement* element) { if (_defaultValue) _type->copy(_defaultValue, get(element)); } void daeMetaArrayAttribute::copyDefault(daeElement* element) { if (_defaultValue) _type->copyArray((daeArray&)*_defaultValue, (daeArray&)*get(element)); } daeInt daeMetaAttribute::compare(daeElement* elt1, daeElement* elt2) { return _type->compare(get(elt1), get(elt2)); } daeInt daeMetaArrayAttribute::compare(daeElement* elt1, daeElement* elt2) { daeArray& value1 = (daeArray&)*get(elt1); daeArray& value2 = (daeArray&)*get(elt2); return _type->compareArray(value1, value2); } daeInt daeMetaAttribute::compareToDefault(daeElement* e) { if (!_defaultValue) return 1; return _type->compare(get(e), _defaultValue); } daeInt daeMetaArrayAttribute::compareToDefault(daeElement* e) { if (!_defaultValue) return 1; daeArray& value1 = (daeArray&)*get(e); daeArray& value2 = (daeArray&)*_defaultValue; return _type->compareArray(value1, value2); } daeMetaAttribute::daeMetaAttribute() { _name = "noname"; _offset = -1; _type = NULL; _container = NULL; _defaultString = ""; _defaultValue = NULL; _isRequired = false; } daeMetaAttribute::~daeMetaAttribute() { if (_defaultValue) _type->destroy(_defaultValue); _defaultValue = NULL; } daeMetaArrayAttribute::~daeMetaArrayAttribute() { delete (daeArray*)_defaultValue; _defaultValue = NULL; } daeInt daeMetaAttribute::getSize() { return _type->getSize(); } daeInt daeMetaAttribute::getAlignment() { return _type->getAlignment(); } void daeMetaAttribute::memoryToString(daeElement* e, std::ostringstream& buffer) { _type->memoryToString(get(e), buffer); } void daeMetaAttribute::stringToMemory(daeElement* e, daeString s) { if (!strcmp(_name, "id") && e->getDocument()) e->getDocument()->changeElementID(e, s); else if (!strcmp(_name, "sid") && e->getDocument()) e->getDocument()->changeElementSID(e, s); _type->stringToMemory((daeChar*)s, get(e)); } daeChar* daeMetaAttribute::getWritableMemory(daeElement* e) { return (daeChar*)e + _offset; } daeMemoryRef daeMetaAttribute::get(daeElement* e) { return getWritableMemory(e); } void daeMetaAttribute::setDefaultString(daeString defaultVal) { _defaultString = defaultVal; if (!_defaultValue) _defaultValue = _type->create(); _type->stringToMemory((daeChar*)_defaultString.c_str(), _defaultValue); } void daeMetaAttribute::setDefaultValue(daeMemoryRef defaultVal) { if (!_defaultValue) _defaultValue = _type->create(); _type->copy(defaultVal, _defaultValue); std::ostringstream buffer; _type->memoryToString(_defaultValue, buffer); _defaultString = buffer.str(); } void daeMetaArrayAttribute::memoryToString(daeElement* e, std::ostringstream& buffer) { if (e) _type->arrayToString(*(daeArray*)get(e), buffer); } void daeMetaArrayAttribute::stringToMemory(daeElement* e, daeString s) { if (e) _type->stringToArray((daeChar*)s, *(daeArray*)get(e)); } void daeMetaArrayAttribute::setDefaultString(daeString defaultVal) { _defaultString = defaultVal; if (!_defaultValue) _defaultValue = (daeMemoryRef)_type->createArray(); _type->stringToArray((daeChar*)_defaultString.c_str(), (daeArray&)*_defaultValue); } void daeMetaArrayAttribute::setDefaultValue(daeMemoryRef defaultVal) { if (!_defaultValue) _defaultValue = (daeMemoryRef)_type->createArray(); _type->copyArray((daeArray&)*defaultVal, (daeArray&)*_defaultValue); std::ostringstream buffer; _type->arrayToString((daeArray&)*_defaultValue, buffer); _defaultString = buffer.str(); } daeString daeMetaAttribute::getDefaultString() { return _defaultString.c_str(); } daeMemoryRef daeMetaAttribute::getDefaultValue() { return _defaultValue; } void daeMetaAttribute::setDocument(daeElement* e, daeDocument* doc) { _type->setDocument(get(e), doc); } void daeMetaArrayAttribute::setDocument(daeElement* e, daeDocument* doc) { _type->setDocument(*(daeArray*)get(e), doc); }