updated COLLADA-DOM to the latest bleeding-edge (1.4.1) SVN version of today
This commit is contained in:
231
Extras/COLLADA_DOM/src/dae/daeMetaElementAttribute.cpp
Normal file
231
Extras/COLLADA_DOM/src/dae/daeMetaElementAttribute.cpp
Normal file
@@ -0,0 +1,231 @@
|
||||
/*
|
||||
* Copyright 2006 Sony Computer Entertainment Inc.
|
||||
*
|
||||
* Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this
|
||||
* file except in compliance with the License. You may obtain a copy of the License at:
|
||||
* http://research.scea.com/scea_shared_source_license.html
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
||||
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing permissions and limitations under the
|
||||
* License.
|
||||
*/
|
||||
|
||||
#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()->set((*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 || ( child->getElementName() != NULL && 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);
|
||||
|
||||
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 || ( child->getElementName() != NULL && 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;
|
||||
}
|
||||
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent);
|
||||
if ( _maxOccurs != -1 && (daeInt)era->getCount()-offset >= _maxOccurs ) {
|
||||
return NULL;
|
||||
}
|
||||
removeElement( child->getParentElement(), child );
|
||||
child->setParentElement( parent );
|
||||
|
||||
if ( before != NULL || after != NULL ) {
|
||||
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.append( *er );
|
||||
}
|
||||
}
|
||||
|
||||
void daeMetaElementArrayAttribute::getChildren( daeElement *parent, daeElementRefArray &array ) {
|
||||
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent);
|
||||
for ( size_t x = 0; x < era->getCount(); x++ ) {
|
||||
array.append( era->get(x) );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user