/*
* 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 <dae.h>
#include <dae/daeDom.h>
#include <dae/domAny.h>
#include <dae/daeMetaAttribute.h>
#include <dae/daeMetaCMPolicy.h>
#include <dae/daeMetaSequence.h>
#include <dae/daeMetaChoice.h>
#include <dae/daeMetaGroup.h>
#include <dae/daeMetaAny.h>
#include <dae/daeMetaElementAttribute.h>
#include <dae/daeErrorHandler.h>
daeElementRef
domAny::create(DAE& dae)
{
domAnyRef ref = new domAny;
return ref;
}
daeMetaElement *
domAny::registerElement(DAE& dae)
{
daeMetaElement *_Meta = new daeMetaElement(dae);
_Meta->setName( "any" );
_Meta->registerClass(domAny::create);
_Meta->setIsInnerClass( true );
daeMetaCMPolicy *cm = NULL;
cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 );
cm = new daeMetaAny( _Meta, cm, 0, 0, -1 );
cm->getParent()->appendChild( cm );
cm = cm->getParent();
cm->setMaxOrdinal( 0 );
_Meta->setCMRoot( cm );
_Meta->setAllowsAny( true );
_Meta->addContents(daeOffsetOf(domAny,_contents));
_Meta->addContentsOrder(daeOffsetOf(domAny,_contentsOrder));
//VALUE
{
daeMetaAttribute *ma = new daeMetaAttribute;
ma->setName( "_value" );
ma->setType( dae.getAtomicTypes().get("xsString"));
ma->setOffset( daeOffsetOf( domAny , _value ));
ma->setContainer( _Meta );
_Meta->appendAttribute(ma);
}
_Meta->setElementSize(sizeof(domAny));
_Meta->validate();
return _Meta;
}
domAny::~domAny() {
// domAny objects own their corresponding daeMetaElement
delete _meta;
}
// Implementation of daeMetaAttribute that understands how domAny works
class domAnyAttribute : public daeMetaAttribute {
public:
virtual daeChar* getWritableMemory(daeElement* e) {
return (daeChar*)&((domAny*)e)->attrs[_offset];
}
};
daeBool domAny::setAttribute(daeString attrName, daeString attrValue) {
if (_meta == NULL)
return false;
//if the attribute already exists set it.
if (daeElement::setAttribute(attrName, attrValue))
return true;
//else register it and then set it.
attrs.append("");
daeMetaAttribute *ma = new domAnyAttribute;
ma->setName( attrName );
ma->setType( getDAE()->getAtomicTypes().get("xsString"));
ma->setOffset((daeInt)attrs.getCount()-1);
ma->setContainer( _meta );
if (ma->getType()) {
_meta->appendAttribute(ma);
_validAttributeArray.append( true );
ma->stringToMemory(this, attrValue);
return true;
}
delete ma;
return false;
}