blob: 5de214d734c26209f6820abc261039a4586635f5 [file] [log] [blame]
/*
* 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/daeMetaElementAttribute.h>
#include <dae/daeMetaElement.h>
daeMetaElementAttribute::daeMetaElementAttribute( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal,
daeInt minO, daeInt maxO) : daeMetaCMPolicy( container, parent, ordinal, minO, maxO )
{
_elementType = NULL;
}
daeMetaElementAttribute::~daeMetaElementAttribute()
{}
daeMetaElementArrayAttribute::daeMetaElementArrayAttribute( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal,
daeInt minO, daeInt maxO) : daeMetaElementAttribute( container, parent, ordinal, minO, maxO )
{
}
daeMetaElementArrayAttribute::~daeMetaElementArrayAttribute()
{}
void daeMetaElementAttribute::set(daeElement* e, daeString s)
{
//_type->stringToMemory((char*)s, getWritableMemory(e));
daeElementRef *ref = (daeElementRef*)(getWritableMemory(e));
if ((*ref) == NULL) {
(*ref) = _elementType->create();
}
(*ref)->getMeta()->getValueAttribute()->stringToMemory((*ref), s);
}
void daeMetaElementAttribute::copy(daeElement* to, daeElement *from) {
daeElement *cpy = (*(daeElementRef*)(getWritableMemory(from)))->clone();
(*(daeElementRef*)(getWritableMemory(to))) = cpy;
}
void daeMetaElementArrayAttribute::copy(daeElement* to, daeElement *from) {
(void)to;
(void)from;
}
void
daeMetaElementAttribute::setDocument( daeElement * parent, daeDocument* c )
{
daeElementRef* er = (daeElementRef*)getWritableMemory( parent );
if ( ((daeElement*)(*er)) != NULL ) {
(*er)->setDocument( c );
}
}
void
daeMetaElementArrayAttribute::setDocument( daeElement * parent, daeDocument* c )
{
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory( parent );
for ( unsigned int i = 0; i < era->getCount(); i++ ) {
era->get(i)->setDocument( c );
}
}
daeInt
daeMetaElementAttribute::getCount(daeElement* e)
{
if (e == NULL)
return 0;
return ((*((daeElementRef*)getWritableMemory(e))) != NULL);
}
daeMemoryRef
daeMetaElementAttribute::get(daeElement *e, daeInt index)
{
(void)index;
return getWritableMemory(e);
}
daeInt
daeMetaElementArrayAttribute::getCount(daeElement *e)
{
if (e == NULL)
return 0;
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(e);
if (era == NULL)
return 0;
return (daeInt)era->getCount();
}
daeMemoryRef
daeMetaElementArrayAttribute::get(daeElement* e, daeInt index)
{
if (e == NULL)
return NULL;
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(e);
if (era == NULL || index >= (daeInt)era->getCount() )
return NULL;
return (daeMemoryRef)&(era->get(index));
}
daeElement *
daeMetaElementAttribute::placeElement(daeElement* parent, daeElement* child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after )
{
(void)offset;
(void)before;
(void)after;
if ((parent == NULL)||(child == NULL))
return NULL;
if ( child->getMeta() != _elementType || strcmp( child->getElementName(), _name ) != 0 ) {
return NULL;
}
if (child->getParentElement() == parent) {
//I Don't know why this gets called when the child already has this as parent.
return child;
}
daeElementRef* er = (daeElementRef*)getWritableMemory(parent);
if ( *er != NULL )
{
return NULL;
}
daeElement::removeFromParent( child );
child->setParentElement( parent );
*er = child;
ordinal = _ordinalOffset;
return child;
}
daeElement *
daeMetaElementArrayAttribute::placeElement(daeElement* parent, daeElement* child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after )
{
if ((parent == NULL)||(child == NULL))
return NULL;
if ( child->getMeta() != _elementType)
return NULL;
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent);
if ( _maxOccurs != -1 && (daeInt)era->getCount()-offset >= _maxOccurs ) {
return NULL;
}
if (strcmp( child->getElementName(), _name ) != 0 )
return NULL;
daeElement *p = child->getParentElement();
removeElement( p, child );
child->setParentElement( parent );
if ( before != NULL && before->getMeta() == _elementType ) {
size_t idx(0);
if ( era->find( before, idx ) == DAE_OK ) {
era->insertAt( idx, child );
}
}
else if ( after != NULL && after->getMeta() == _elementType ) {
size_t idx(0);
if ( era->find( after, idx ) == DAE_OK ) {
era->insertAt( idx+1, child );
}
}
else {
era->append(child);
}
ordinal = _ordinalOffset;
return child;
}
// These are the opposite of the placeElement functions above
daeBool
daeMetaElementAttribute::removeElement(daeElement* parent, daeElement* child)
{
(void)child; // silence unused variable warning
if ((parent == NULL)||(child == NULL ))
return false;
daeElementRef* er = (daeElementRef*)getWritableMemory(parent);
if ( *er != child ) {
return false;
}
*er = NULL;
return true;
}
daeBool
daeMetaElementArrayAttribute::removeElement(daeElement* parent,
daeElement* child)
{
if ((parent == NULL)||(child == NULL))
return false ;
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent);
/* if ( (daeInt)era->getCount() <= _minOccurs ) {
return false;
}*/
daeInt error = era->remove(child);
if ( error != DAE_OK ) {
return false;
}
return true;
}
daeMetaElement *daeMetaElementAttribute::findChild( daeString elementName ) {
if ( strcmp( elementName, _name ) == 0 ) {
return _elementType;
}
return NULL;
}
void daeMetaElementAttribute::getChildren( daeElement *parent, daeElementRefArray &array ) {
daeElementRef* er = (daeElementRef*)getWritableMemory(parent);
if ( *er != NULL ) {
array.appendUnique( *er );
}
}
void daeMetaElementArrayAttribute::getChildren( daeElement *parent, daeElementRefArray &array ) {
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent);
size_t cnt = era->getCount();
for ( size_t x = 0; x < cnt; x++ ) {
array.appendUnique( era->get(x) );
}
}