November 13, 2006
Re-applied the 'INF' fix for constraint limits.
This commit is contained in:
ejcoumans
2006-12-19 02:33:05 +00:00
parent 818b672f60
commit a0f320764b
391 changed files with 9317 additions and 5101 deletions

View File

@@ -37,13 +37,21 @@
extern daeString COLLADA_VERSION;
daeInt DAEInstanceCount = 0;
daeMetaElement *DAE::topMeta = NULL;
void
DAE::cleanup()
{
if (DAEInstanceCount == 0) {
if (topMeta != NULL) {
daeMetaElement::releaseMetas();
daeAtomicType::uninitializeKnownTypes();
topMeta = NULL;
//Contributed by Nus - Wed, 08 Nov 2006
terminateURI();
terminateResolveArray();
daeStringRef::releaseStringTable();
daeIDRefResolver::terminateIDRefSolver();
//----------------------
}
}
@@ -56,7 +64,14 @@ DAE::DAE() : database(NULL),
defaultPlugin(false),
registerFunc(NULL)
{
topMeta = initializeDomMeta();
//Contributed by Nus - Wed, 08 Nov 2006
initializeURI();
initializeResolveArray();
daeIDRefResolver::initializeIDRefSolver();
//------------------------
if ( DAEInstanceCount == 0 ) {
topMeta = initializeDomMeta();
}
DAEInstanceCount++;
}
@@ -69,8 +84,12 @@ DAE::~DAE()
delete resolver;
delete idResolver;
}
topMeta = NULL;
daeElement::clearResolveArray();
--DAEInstanceCount;
if ( DAEInstanceCount <= 0 )
{
cleanup();
}
}
// Database setup
@@ -259,7 +278,7 @@ daeInt DAE::saveAs(daeString name, daeString documentName, daeBool replace)
// Make a URI from "name" and save to that
daeURI tempURI(name);
daeURI tempURI(name, true);
return plugin->write(&tempURI, document, replace);
}
@@ -297,6 +316,7 @@ daeInt DAE::unload(daeString name)
daeInt DAE::clear()
{
daeElement::clearResolveArray();
if (database)
database->clear();
return DAE_OK;

View File

@@ -70,8 +70,8 @@ daeArray::grow(size_t sz)
if (_data != NULL)
memcpy(newData,_data,_capacity*_elementSize);
else
memset(newData,0,_capacity*_elementSize);
//else
// memset(newData,0,_capacity*_elementSize);
memset(newData+_capacity*_elementSize,0,
(newCapacity-_capacity)*_elementSize);
@@ -82,3 +82,4 @@ daeArray::grow(size_t sz)
_data = newData;
_capacity = newCapacity;
}

View File

@@ -17,6 +17,7 @@
#include <dae/daeIDRef.h>
#include <dae/daeMetaElement.h>
#include <dae/daeDatabase.h>
#include <dae/daeErrorHandler.h>
daeAtomicTypeArray* daeAtomicType::_Types = NULL;
daeBool daeAtomicType::_TypesInitialized = false;
@@ -33,14 +34,17 @@ daeAtomicType::initializeKnownTypes()
void
daeAtomicType::uninitializeKnownTypes()
{
_TypesInitialized = false;
unsigned int i;
for (i=0;i<_Types->getCount();i++)
{
daeAtomicType* type = _Types->get(i);
delete type;
if ( _TypesInitialized )
{
_TypesInitialized = false;
unsigned int i;
for (i=0;i<_Types->getCount();i++)
{
daeAtomicType* type = _Types->get(i);
delete type;
}
delete _Types;
}
delete _Types;
}
void
@@ -210,8 +214,8 @@ daeLongType::daeLongType()
_maxStringLength = 32;
_nameBindings.append("xsLong");
_nameBindings.append("xsLongArray");
_printFormat = "%ld";
_scanFormat = "%ld";
_printFormat = "%lld";
_scanFormat = "%lld";
_typeString = "long";
}
daeShortType::daeShortType()
@@ -249,8 +253,8 @@ daeULongType::daeULongType()
_maxStringLength = 32;
_nameBindings.append("ulong");
_nameBindings.append("xsUnsignedLong");
_printFormat = "%lu";
_scanFormat = "%lu";
_printFormat = "%llu";
_scanFormat = "%llu";
_typeString = "ulong";
}
daeFloatType::daeFloatType()
@@ -398,7 +402,44 @@ daeBool
daeFloatType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize)
{
if (_maxStringLength > dstSize) return false;
sprintf(dst,_printFormat,*((daeFloat*)src));
if ( *(daeFloat*)src != *(daeFloat*)src ) //NAN
{
strcpy( dst, "NaN" );
}
else if ( *(daeInt*)src == 0x7f800000 ) //+INF
{
strcpy( dst, "INF" );
}
else if ( *(daeInt*)src == 0xff800000 ) //-INF
{
strcpy( dst, "-INF" );
}
else
{
sprintf(dst,_printFormat,*((daeFloat*)src));
}
return true;
}
daeBool
daeFloatType::stringToMemory(daeChar *src, daeChar* dstMemory)
{
if ( strcmp(src, "NaN") == 0 ) {
daeErrorHandler::get()->handleWarning("NaN encountered while setting an attribute or value\n");
*(daeInt*)(dstMemory) = 0x7f800002;
}
else if ( strcmp(src, "INF") == 0 ) {
daeErrorHandler::get()->handleWarning( "INF encountered while setting an attribute or value\n" );
*(daeInt*)(dstMemory) = 0x7f800000;
}
else if ( strcmp(src, "-INF") == 0 ) {
daeErrorHandler::get()->handleWarning( "-INF encountered while setting an attribute or value\n" );
*(daeInt*)(dstMemory) = 0xff800000;
}
else
{
sscanf(src, _scanFormat, dstMemory);
}
return true;
}
@@ -406,9 +447,47 @@ daeBool
daeDoubleType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize)
{
if (_maxStringLength > dstSize) return false;
sprintf(dst,_printFormat,*((daeDouble*)src));
if ( *(daeDouble*)src != *(daeDouble*)src ) //NAN
{
strcpy( dst, "NaN" );
}
else if ( *(daeLong*)src == 0x7ff0000000000000LL ) //+INF
{
strcpy( dst, "INF" );
}
else if ( *(daeLong*)src == 0xfff0000000000000LL ) //-INF
{
strcpy( dst, "-INF" );
}
else
{
sprintf(dst,_printFormat,*((daeDouble*)src));
}
return true;
}
daeBool
daeDoubleType::stringToMemory(daeChar *src, daeChar* dstMemory)
{
if ( strcmp(src, "NaN") == 0 ) {
daeErrorHandler::get()->handleWarning( "NaN encountered while setting an attribute or value\n" );
*(daeLong*)(dstMemory) = 0x7ff0000000000002LL;
}
else if ( strcmp(src, "INF") == 0 ) {
daeErrorHandler::get()->handleWarning( "INF encountered while setting an attribute or value\n" );
*(daeLong*)(dstMemory) = 0x7ff0000000000000LL;
}
else if ( strcmp(src, "-INF") == 0 ) {
daeErrorHandler::get()->handleWarning( "-INF encountered while setting an attribute or value\n" );
*(daeLong*)(dstMemory) = 0xfff0000000000000LL;
}
else
{
sscanf(src, _scanFormat, dstMemory);
}
return true;
}
daeBool
daeRawRefType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize)
{
@@ -468,7 +547,7 @@ daeResolverType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize)
// or some other document so we know what URI to write out.
// !!!GAC this approach should be safe, if the collection pointer of our document matches the collection pointer
// !!!GAC of the element our URI is pointing at, we are pointing at our own doc.
if(thisURI->getElement()->getCollection() == thisURI->getContainer()->getDocument())
if(thisURI->getElement()->getDocument() == thisURI->getContainer()->getDocument())
{
// we will send back the original URI if we're pointing at ourselves
s = thisURI->getOriginalURI();
@@ -552,17 +631,17 @@ daeIDResolverType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize)
}
void
daeAtomicType::resolve(daeElementRef element, daeMetaAttributeRef ma)
daeAtomicType::resolve(daeElementRef element, daeChar* src)
{
// just to remove the warnings
(void)element;
(void)ma;
(void)src;
}
void
daeResolverType::resolve(daeElementRef element, daeMetaAttributeRef ma)
daeResolverType::resolve(daeElementRef element, daeChar* src)
{
daeURI* resolver = (daeURI*)ma->getWritableMemory(element);
daeURI* resolver = (daeURI*)src;
resolver->setContainer(element);
resolver->resolveElement();
}
@@ -570,13 +649,35 @@ daeResolverType::resolve(daeElementRef element, daeMetaAttributeRef ma)
daeBool
daeResolverType::stringToMemory(daeChar* src, daeChar* dstMemory)
{
((daeURI*)dstMemory)->setURI(src);
#define MAX_PATH 1024
daeChar tempstr[MAX_PATH];
memset(tempstr,0,MAX_PATH);
daeChar* s;
daeChar* t;
for(s=src, t=tempstr; *s!=0; s++,t++)
{
if (*s == '%') {
if ((*(s+1) == '2') && (*(s+2) == '0'))
{
(*t)=' ';
s+=2;
continue;
}
} else if (*s == ' ') {
char err[512];
memset( err, 0, 512 );
sprintf(err,"uri contains white space, dom will convert them to %20 in output files!\n uri=%s", src);
daeErrorHandler::get()->handleWarning( err );
}
*t=*s;
}
((daeURI*)dstMemory)->setURI(tempstr);
return true;
}
void
daeIDResolverType::resolve(daeElementRef element, daeMetaAttributeRef ma)
daeIDResolverType::resolve(daeElementRef element, daeChar* src)
{
daeIDRef* resolver = (daeIDRef*)ma->getWritableMemory(element);
daeIDRef* resolver = (daeIDRef*)src;
resolver->setContainer( element );
resolver->resolveElement();
}

View File

@@ -13,6 +13,14 @@
#include <dae/daeDocument.h>
// sthomas
daeDocument::~daeDocument()
{
for( unsigned int i = 0; i < externalURIs.getCount(); i++ ) {
delete externalURIs[i];
}
}
void daeDocument::insertElement( daeElementRef element ) {
daeElement *parent = element->getParentElement();
size_t idx;
@@ -84,3 +92,13 @@ void daeDocument::resolveExternals( daeString docURI ) {
return;
}
}
const daeTArray<daeURI*> *daeDocument::getExternalURIs(daeStringRef docURI) const
{
size_t idx;
if (referencedDocuments.find(docURI, idx) != DAE_OK)
return NULL;
return externalURIs[idx];
}

View File

@@ -33,9 +33,34 @@ daeElementRef DAECreateElement(int nbytes)
return new(nbytes) daeElement;
}
static daeElementRefArray resolveArray;
//Contributed by Nus - Wed, 08 Nov 2006
// static daeElementRefArray resolveArray;
static daeElementRefArray* pResolveArray = NULL;
//static char StaticIndentBuf[] = "";
extern "C" void initializeResolveArray(void)
{
if(!pResolveArray) {
pResolveArray = new daeElementRefArray;
}
}
extern "C" void terminateResolveArray(void)
{
if(pResolveArray) {
delete pResolveArray;
pResolveArray = NULL;
}
}
//----------------------------------
// sthomas (see https://collada.org/public_forum/viewtopic.php?t=325&)
void daeElement::releaseElements()
{
// resolveArray.clear();
pResolveArray->clear();
}
daeIntegrationObject*
daeElement::getIntObject( IntegrationState from_state, IntegrationState to_state )
{
@@ -211,7 +236,15 @@ void daeElement::setDocument( daeDocument *c ) {
if( _document == c ) {
return;
}
if (_document != NULL )
{
_document->removeElement(this);
}
_document = c;
if ( _document != NULL )
{
_document->insertElement(this);
}
daeElementRefArray ea;
getChildren( ea );
@@ -243,7 +276,7 @@ daeElement::setAttribute(daeString attrName, daeString attrValue)
if (metaAttrs[i]->getType() != NULL)
{
metaAttrs[i]->set(this,attrValue);
_validAttributeArray[i] = true;
_validAttributeArray.set(i, true);
}
return true;
}
@@ -302,19 +335,46 @@ daeMemoryRef daeElement::getAttributeValue( daeString attrName ) {
return NULL;
}
daeBool daeElement::hasValue() {
if (_meta == NULL)
return false;
return (_meta->getValueAttribute() != NULL );
}
daeMemoryRef daeElement::getValuePointer() {
if (_meta == NULL)
return false;
if ( _meta->getValueAttribute() != NULL )
{
return _meta->getValueAttribute()->getWritableMemory(this);
}
return NULL;
}
void
daeElement::appendResolveElement(daeElement* elem)
{
resolveArray.append(elem);
//Contributed by Nus - Wed, 08 Nov 2006
// resolveArray.append(elem);
pResolveArray->append(elem);
//----------------------
}
void
daeElement::resolveAll()
{
int cnt;
while(resolveArray.getCount()) {
cnt = (int)resolveArray.getCount();
daeElementRef elem = resolveArray[cnt-1];
resolveArray.removeIndex(cnt-1);
//Contributed by Nus - Wed, 08 Nov 2006
// while(resolveArray.getCount()) {
while(pResolveArray->getCount()) {
// cnt = (int)resolveArray.getCount();
cnt = (int)pResolveArray->getCount();
// daeElementRef elem = resolveArray[cnt-1];
daeElementRef elem = (*pResolveArray)[cnt-1];
// resolveArray.removeIndex(cnt-1);
pResolveArray->removeIndex(cnt-1);
//--------------------------
elem->resolve();
}
/*size_t cnt = resolveArray.getCount();
@@ -324,13 +384,22 @@ daeElement::resolveAll()
resolveArray.clear();*/
}
void
daeElement::clearResolveArray()
{
//Contributed by Nus - Wed, 08 Nov 2006
// resolveArray.clear();
pResolveArray->clear();
//------------------------
}
void
daeElement::resolve()
{
if (_meta == NULL)
return;
daeMetaAttributeRefArray& maa = _meta->getMetaAttributes();
daeMetaAttributePtrArray& maa = _meta->getMetaResolvers();
int n = (int)maa.getCount();
int i;
for(i=0;i<n;i++)
@@ -363,9 +432,9 @@ daeElement::setup(daeMetaElement* meta)
attrs[i]->set(this, attrs[i]->getDefault());
_validAttributeArray[i] = true;
}
else {
_validAttributeArray[i] = false;
}
// else {
// _validAttributeArray[i] = false;
// }
}
#if 0
@@ -438,6 +507,7 @@ daeSmartRef<daeElement> daeElement::clone(daeString idSuffix, daeString nameSuff
for ( unsigned int i = 0; i < attrs.getCount(); i++ ) {
//memcpy( attrs[i]->getWritableMemory( ret ), attrs[i]->getWritableMemory( this ), attrs[i]->getSize() );
attrs[i]->copy( ret, this );
ret->_validAttributeArray[i] = _validAttributeArray[i];
}
if ( _meta->getValueAttribute() != NULL ) {
daeMetaAttribute *val = _meta->getValueAttribute();
@@ -458,7 +528,8 @@ daeSmartRef<daeElement> daeElement::clone(daeString idSuffix, daeString nameSuff
if ( strcmp( str, "" ) ) {
strcat( str, idSuffix );
}
id->getType()->stringToMemory( str, id->getWritableMemory( ret ) );
//id->getType()->stringToMemory( str, id->getWritableMemory( ret ) );
id->set( ret, str );
}
//mangle the name
daeMetaAttribute *nm = _meta->getMetaAttribute("name");
@@ -468,7 +539,8 @@ daeSmartRef<daeElement> daeElement::clone(daeString idSuffix, daeString nameSuff
if ( strcmp( str, "" ) ) {
strcat( str, nameSuffix );
}
nm->getType()->stringToMemory( str, nm->getWritableMemory( ret ) );
//nm->getType()->stringToMemory( str, nm->getWritableMemory( ret ) );
nm->set( ret, str );
}
//ret->_intObject = _intObject;
return ret;

View File

@@ -15,7 +15,9 @@
#include <dae/daeDatabase.h>
#include <dae/daeErrorHandler.h>
daeIDRefResolverPtrArray daeIDRefResolver::_KnownResolvers;
//Contributed by Nus - Wed, 08 Nov 2006
daeIDRefResolverPtrArray* daeIDRefResolver::_KnownResolvers = NULL;
//----------------------------------
void
daeIDRef::initialize()
@@ -49,6 +51,7 @@ daeIDRef::daeIDRef(daeIDRef& copyFrom)
element = copyFrom.element;
setID(copyFrom.getID());
state = copyFrom.state;
container = copyFrom.container;
}
void
@@ -57,6 +60,7 @@ daeIDRef::copyFrom(daeIDRef& copyFrom)
element = copyFrom.element;
setID(copyFrom.getID());
state = copyFrom.state;
container = copyFrom.container;
}
daeString emptyID = "";
@@ -134,25 +138,54 @@ daeIDRef::resolveID()
}
}
//Contributed by Nus - Wed, 08 Nov 2006
void daeIDRefResolver::initializeIDRefSolver(void)
{
if(!_KnownResolvers) {
_KnownResolvers = new daeIDRefResolverPtrArray();
}
}
void daeIDRefResolver::terminateIDRefSolver(void)
{
if(_KnownResolvers) {
delete _KnownResolvers;
_KnownResolvers = NULL;
}
}
//-------------------------------------
void
daeIDRefResolver::attemptResolveElement(daeIDRef& id, daeString typeNameHint)
{
int i;
int cnt = (int)_KnownResolvers.getCount();
//Contributed by Nus - Wed, 08 Nov 2006
// int cnt = (int)_KnownResolvers.getCount();
int cnt = (int)_KnownResolvers->getCount();
//-------------------------------
for(i=0;i<cnt;i++)
if (_KnownResolvers[i]->resolveElement(id, typeNameHint))
//Contributed by Nus - Wed, 08 Nov 2006
// if (_KnownResolvers[i]->resolveElement(id, typeNameHint))
if ((*_KnownResolvers)[i]->resolveElement(id, typeNameHint))
//-------------------------
return;
}
void
daeIDRefResolver::attemptResolveID(daeIDRef& id)
{
int i,cnt = (int)_KnownResolvers.getCount();
//Contributed by Nus - Wed, 08 Nov 2006
// int i,cnt = (int)_KnownResolvers.getCount();
int i,cnt = (int)_KnownResolvers->getCount();
//-------------------------------
// daeBool foundProtocol = false;
for(i=0;i<cnt;i++)
if (_KnownResolvers[i]->resolveID(id))
//Contributed by Nus - Wed, 08 Nov 2006
// if (_KnownResolvers[i]->resolveID(id))
if ((*_KnownResolvers)[i]->resolveID(id))
//-----------------------------
return;
#if defined(_DEBUG) && defined(WIN32)
@@ -165,12 +198,18 @@ daeIDRefResolver::attemptResolveID(daeIDRef& id)
daeIDRefResolver::daeIDRefResolver()
{
_KnownResolvers.append((daeIDRefResolver*)this);
//Contributed by Nus - Wed, 08 Nov 2006
// _KnownResolvers.append((daeIDRefResolver*)this);
_KnownResolvers->append((daeIDRefResolver*)this);
//------------------------------
}
daeIDRefResolver::~daeIDRefResolver()
{
_KnownResolvers.remove((daeIDRefResolver*)this);
//Contributed by Nus - Wed, 08 Nov 2006
// _KnownResolvers.remove((daeIDRefResolver*)this);
_KnownResolvers->remove((daeIDRefResolver*)this);
//-----------------------------------------
}
@@ -208,7 +247,15 @@ daeDefaultIDRefResolver::resolveElement(daeIDRef& idref, daeString typeNameHint)
daeString id = idref.getID();
status = _database->getElement(&resolved,0,id,typeNameHint,NULL);
if ( idref.getContainer() == NULL )
{
char msg[128];
sprintf(msg,"daeDefaultIDRefResolver::resolveElement() - failed to resolve %s\n",idref.getID(), ". IDRef needs a container element!" );
daeErrorHandler::get()->handleWarning( msg );
return false;
}
status = _database->getElement( &resolved, 0, id, typeNameHint, idref.getContainer()->getDocumentURI()->getURI() );
idref.setElement( resolved );

View File

@@ -43,7 +43,8 @@ daeBool daeMetaAny::removeElement( daeElement *parent, daeElement *child ) {
daeMetaElement * daeMetaAny::findChild( daeString elementName ) {
if ( elementName != NULL ) {
const daeMetaElementRefArray &metas = daeMetaElement::getAllMetas();
for ( size_t x = 0; x < metas.getCount(); x++ ) {
size_t cnt = metas.getCount();
for ( size_t x = 0; x < cnt; x++ ) {
if ( !metas[x]->getIsInnerClass() && strcmp( elementName, metas[x]->getName() ) == 0 ) {
return metas[x];
}

View File

@@ -44,7 +44,7 @@ daeMetaAttribute::set(daeElement* e, daeString s)
void daeMetaAttribute::copy(daeElement* to, daeElement *from) {
daeChar str[4096];
_type->memoryToString( getWritableMemory(from), str, 2048 );
_type->memoryToString( getWritableMemory(from), str, 4096 );
_type->stringToMemory( str, getWritableMemory( to ) );
//memcpy( getWritableMemory( to ), getWritableMemory( from ), getSize() );
}
@@ -110,7 +110,18 @@ void
daeMetaAttribute::resolve(daeElementRef element)
{
if (_type != NULL)
_type->resolve(element, this);
_type->resolve(element, getWritableMemory(element) );
}
void
daeMetaArrayAttribute::resolve(daeElementRef element)
{
daeArray* era = (daeArray*)getWritableMemory(element);
size_t cnt = era->getCount();
for ( size_t i = 0; i < cnt; i++ )
{
_type->resolve( element, era->getRawData()+(i*era->getElementSize()) );
}
}
daeInt

View File

@@ -34,8 +34,10 @@ daeElement *daeMetaChoice::placeElement( daeElement *parent, daeElement *child,
}
daeElement *retVal = NULL;
size_t cnt = _children.getCount();
for ( daeInt i = 0; ( i < _maxOccurs || _maxOccurs == -1 ); i++ ) {
for ( size_t x = 0; x < _children.getCount(); x++ ) {
for ( size_t x = 0; x < cnt; x++ ) {
if ( _children[x]->placeElement( parent, child, ordinal, i, before, after ) != NULL ) {
retVal = child;
ordinal = ordinal + _ordinalOffset;
@@ -68,7 +70,8 @@ daeElement *daeMetaChoice::placeElement( daeElement *parent, daeElement *child,
}
daeBool daeMetaChoice::removeElement( daeElement *parent, daeElement *child ) {
for ( size_t x = 0; x < _children.getCount(); x++ ) {
size_t cnt = _children.getCount();
for ( size_t x = 0; x < cnt; x++ ) {
if ( _children[x]->removeElement( parent, child ) ) {
return true;
}
@@ -78,7 +81,8 @@ daeBool daeMetaChoice::removeElement( daeElement *parent, daeElement *child ) {
daeMetaElement * daeMetaChoice::findChild( daeString elementName ) {
daeMetaElement *me = NULL;
for ( size_t x = 0; x < _children.getCount(); x++ ) {
size_t cnt = _children.getCount();
for ( size_t x = 0; x < cnt; x++ ) {
me = _children[x]->findChild( elementName );
if ( me != NULL ) {
return me;

View File

@@ -18,7 +18,8 @@
#include <dae/daeMetaCMPolicy.h>
#include <dae/daeMetaElementAttribute.h>
daeMetaElementRefArray daeMetaElement::_metas;
static daeMetaElementRefArray *mera = NULL;
static daeTArray< daeMetaElement** > *mes = NULL;
daeElementRef
daeMetaElement::create()
@@ -101,6 +102,7 @@ daeMetaElement::daeMetaElement()
_elementSize = sizeof(daeElement);
_metaValue = NULL;
_metaContents = NULL;
_metaContentsOrder = NULL; // sthomas
_metaIntegration = NULL;
_metaID = NULL;
_isTrackableForQueries = true;
@@ -109,7 +111,7 @@ daeMetaElement::daeMetaElement()
_isAbstract = false;
_allowsAny = false;
_innerClass = false;
_metas.append(this);
_metas().append(this);
_contentModel = NULL;
}
@@ -118,6 +120,17 @@ daeMetaElement::~daeMetaElement()
{
if (_metaContents)
delete _metaContents;
if (_contentModel) // sthomas
delete _contentModel;
if (_metaContentsOrder) // sthomas
delete _metaContentsOrder;
}
void daeMetaElement::setCMRoot( daeMetaCMPolicy *cm )
{
if (_contentModel)
delete _contentModel;
_contentModel = cm;
}
void
@@ -139,6 +152,10 @@ daeMetaElement::addContentsOrder(daeInt offset)
meaa->setName("contentsOrder");
meaa->setOffset(offset);
meaa->setContainer( this);
if (_metaContentsOrder)
delete _metaContentsOrder;
_metaContentsOrder = meaa;
}
@@ -237,7 +254,23 @@ daeMetaElement::getMetaAttribute(daeString s)
void daeMetaElement::releaseMetas()
{
_metas.clear();
_metas().clear();
size_t count = _classMetaPointers().getCount();
for ( size_t i = 0; i < count; i++ )
{
*(_classMetaPointers()[i]) = NULL;
}
_classMetaPointers().clear();
if (mera)
{
delete mera;
mera = NULL;
}
if (mes)
{
delete mes;
mes = NULL;
}
}
daeBool daeMetaElement::place(daeElement *parent, daeElement *child, daeUInt *ordinal )
@@ -261,7 +294,8 @@ daeBool daeMetaElement::place(daeElement *parent, daeElement *child, daeUInt *or
daeUIntArray* contentsOrder =
(daeUIntArray*)_metaContentsOrder->getWritableMemory(parent);
daeBool needsAppend = true;
for ( size_t x = 0; x < contentsOrder->getCount(); x++ ) {
size_t cnt = contentsOrder->getCount();
for ( size_t x = 0; x < cnt; x++ ) {
if ( contentsOrder->get(x) > ord ) {
contents->insertAt( x, retVal );
contentsOrder->insertAt( x, ord );
@@ -300,7 +334,12 @@ daeBool daeMetaElement::placeAt( daeInt index, daeElement *parent, daeElement *c
validLoc = contentsOrder->get(index) >= ord && contentsOrder->get(index) <= ord;
}
else {
validLoc = contentsOrder->get(index) >= ord;
if ( contentsOrder->getCount() == 0 ) {
validLoc = true;
}
else {
validLoc = contentsOrder->get(index) >= ord;
}
}
if ( validLoc ) {
contents->insertAt( index, retVal );
@@ -462,3 +501,22 @@ void daeMetaElement::getChildren( daeElement* parent, daeElementRefArray &array
_contentModel->getChildren( parent, array );
}
}
daeMetaElementRefArray &daeMetaElement::_metas()
{
if (!mera)
{
mera = new daeMetaElementRefArray();
}
return *mera;
}
daeTArray< daeMetaElement** > &daeMetaElement::_classMetaPointers()
{
if (!mes)
{
mes = new daeTArray< daeMetaElement** >();
}
return *mes;
}

View File

@@ -141,29 +141,24 @@ daeMetaElementArrayAttribute::placeElement(daeElement* parent, daeElement* child
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;
}
daeElement *p = child->getParentElement();
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent);
if ( _maxOccurs != -1 && (daeInt)era->getCount()-offset >= _maxOccurs ) {
return NULL;
}
removeElement( child->getParentElement(), child );
removeElement( p, 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 );
}
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 if ( after != NULL && after->getMeta() == _elementType ) {
size_t idx(0);
if ( era->find( after, idx ) == DAE_OK ) {
era->insertAt( idx+1, child );
}
}
else {
@@ -225,7 +220,8 @@ void daeMetaElementAttribute::getChildren( daeElement *parent, daeElementRefArra
void daeMetaElementArrayAttribute::getChildren( daeElement *parent, daeElementRefArray &array ) {
daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent);
for ( size_t x = 0; x < era->getCount(); x++ ) {
size_t cnt = era->getCount();
for ( size_t x = 0; x < cnt; x++ ) {
array.append( era->get(x) );
}
}

View File

@@ -34,8 +34,9 @@ daeElement *daeMetaSequence::placeElement( daeElement *parent, daeElement *child
}
}
size_t cnt = _children.getCount();
for ( daeInt i = 0; ( i < _maxOccurs || _maxOccurs == -1 ); i++ ) {
for ( size_t x = 0; x < _children.getCount(); x++ ) {
for ( size_t x = 0; x < cnt; x++ ) {
if ( _children[x]->placeElement( parent, child, ordinal, i, before, after ) != NULL ) {
ordinal = ordinal + (i * ( _maxOrdinal + 1 )) + _ordinalOffset;
return child;
@@ -46,7 +47,8 @@ daeElement *daeMetaSequence::placeElement( daeElement *parent, daeElement *child
}
daeBool daeMetaSequence::removeElement( daeElement *parent, daeElement *child ) {
for ( size_t x = 0; x < _children.getCount(); x++ ) {
size_t cnt = _children.getCount();
for ( size_t x = 0; x < cnt; x++ ) {
if ( _children[x]->removeElement( parent, child ) ) {
return true;
}
@@ -56,7 +58,8 @@ daeBool daeMetaSequence::removeElement( daeElement *parent, daeElement *child )
daeMetaElement * daeMetaSequence::findChild( daeString elementName ) {
daeMetaElement *me = NULL;
for ( size_t x = 0; x < _children.getCount(); x++ ) {
size_t cnt = _children.getCount();
for ( size_t x = 0; x < cnt; x++ ) {
me = _children[x]->findChild( elementName );
if ( me != NULL ) {
return me;
@@ -66,7 +69,8 @@ daeMetaElement * daeMetaSequence::findChild( daeString elementName ) {
}
void daeMetaSequence::getChildren( daeElement *parent, daeElementRefArray &array ) {
for ( size_t x = 0; x < _children.getCount(); x++ ) {
size_t cnt = _children.getCount();
for ( size_t x = 0; x < cnt; x++ ) {
_children[x]->getChildren( parent, array );
}
}

View File

@@ -20,6 +20,10 @@
daeSIDResolver::daeSIDResolver( daeElement *container, daeString target, daeString profile )
{
element = NULL;
doubleArray = NULL;
doublePtr = NULL;
this->container = container;
if ( target != NULL ) {
this->target = new char[ strlen( target ) +1 ];
@@ -161,6 +165,7 @@ void daeSIDResolver::resolve()
if ( idref.getState() != daeIDRef::id_success ) {
state = sid_failed_not_found;
delete[] id;
element = NULL;
return;
}
element = idref.getElement();

View File

@@ -13,17 +13,41 @@
#include <dae/daeStringRef.h>
daeStringTable daeStringRef::_stringTable;
//Contributed by Nus - Wed, 08 Nov 2006
// Nus: Use global pointer instead of local static.
static daeStringTable *pST = NULL;
//---------------------------
daeStringTable &daeStringRef::_stringTable()
{
//Contributed by Nus - Wed, 08 Nov 2006
// static daeStringTable *st = new daeStringTable();
// return *st;
if(!pST)
pST = new daeStringTable();
return *pST;
}
void daeStringRef::releaseStringTable(void)
{
if(pST) {
delete pST;
pST = NULL;
}
}
//--------------------------------
daeStringRef::daeStringRef(daeString string)
{
_string = _stringTable.allocString(string);
daeStringTable &st = _stringTable();
_string = st.allocString(string);
}
const daeStringRef&
daeStringRef::set(daeString string)
{
_string = _stringTable.allocString(string);
daeStringTable &st = _stringTable();
_string = st.allocString(string);
return *this;
}

View File

@@ -15,8 +15,9 @@
daeStringTable::daeStringTable(int stringBufferSize):_stringBufferSize(stringBufferSize), _empty( "" )
{
_stringBufferIndex = _stringBufferSize;
//allocate initial buffer
allocateBuffer();
//allocateBuffer();
}
daeString daeStringTable::allocateBuffer()

View File

@@ -26,21 +26,59 @@ daeString safeCreate(daeString src);
void safeDelete(daeString src);
daeString findCharacterReverse(daeString string, daeChar stopChar);
daeURIResolverPtrArray daeURIResolver::_KnownResolvers;
//Contributed by Nus - Wed, 08 Nov 2006
static daeURIResolverPtrArray *pKR = NULL;
//---------------------------
static daeURI ApplicationURI(1);
daeURIResolverPtrArray &daeURIResolver::_KnownResolvers()
{
//Contributed by Nus - Wed, 08 Nov 2006
// static daeURIResolverPtrArray *kr = new daeURIResolverPtrArray();
// return *kr;
return *pKR;
//--------------------------------
}
//Contributed by Nus - Wed, 08 Nov 2006
static daeURI* pAppURI = NULL;
// static daeURI ApplicationURI(1);
extern "C" void initializeURI(void)
{
if(!pAppURI) {
pAppURI = new daeURI(1);
}
if(!pKR) {
pKR = new daeURIResolverPtrArray();
}
}
extern "C" void terminateURI(void)
{
delete pAppURI;
pAppURI = NULL;
delete pKR;
pKR = NULL;
}
//--------------------------------------
void
daeURI::setBaseURI(daeURI& uri)
{
ApplicationURI.reset();
ApplicationURI.setURI(uri.getURI());
//Contributed by Nus - Wed, 08 Nov 2006
// ApplicationURI.reset();
// ApplicationURI.setURI(uri.getURI());
pAppURI->reset();
pAppURI->setURI(uri.getURI());
//------------------------
}
daeURI*
daeURI::getBaseURI()
{
return &ApplicationURI;
//Contributed by Nus - Wed, 08 Nov 2006
return pAppURI;
//--------------------------------------
}
void
@@ -252,6 +290,18 @@ void safeDelete(daeString src)
void
daeURI::setURI(daeString _URIString)
{
//Contributed by Nus - Wed, 08 Nov 2006
// Nus: Checking for existing string.
if(originalURIString && _URIString) {
if(strcmp(originalURIString, _URIString) == 0)
return;
}
// Nus: If the string exist, delete it first.
if(originalURIString) {
safeDelete(originalURIString);
originalURIString = NULL;
}
//---------------------------
originalURIString = safeCreate(_URIString);
internalSetURI(_URIString);
}
@@ -646,7 +696,7 @@ daeURI::validate(daeURI* baseURI)
uriString = newURI;
state = uri_pending;
if ( container != NULL ) {
if ( container != NULL && container->getDocumentURI() != NULL ) {
daeString fp = container->getDocumentURI()->getFilepath();
daeString f = container->getDocumentURI()->getFile();
if ( strcmp( fp, filepath ) != 0 || strcmp( f, file ) != 0 ) {
@@ -897,27 +947,27 @@ void
daeURIResolver::attemptResolveElement(daeURI& uri, daeString typeNameHint)
{
int i;
int cnt =(int) _KnownResolvers.getCount();
int cnt =(int) _KnownResolvers().getCount();
for(i=0;i<cnt;i++)
if ((_KnownResolvers[i]->isProtocolSupported(uri.getProtocol()))&&
if ((_KnownResolvers()[i]->isProtocolSupported(uri.getProtocol()))&&
((uri.getFile() == NULL) ||
(uri.getFile()[0] == '\0') ||
(_KnownResolvers[i]->isExtensionSupported(uri.getExtension()))) &&
(_KnownResolvers[i]->resolveElement(uri, typeNameHint)))
(_KnownResolvers()[i]->isExtensionSupported(uri.getExtension()))) &&
(_KnownResolvers()[i]->resolveElement(uri, typeNameHint)))
return;
}
void
daeURIResolver::attemptResolveURI(daeURI& uri)
{
int i,cnt = (int)_KnownResolvers.getCount();
int i,cnt = (int)_KnownResolvers().getCount();
daeBool foundProtocol = false;
for(i=0;i<cnt;i++)
if (_KnownResolvers[i]->isProtocolSupported(uri.getProtocol())) {
if (_KnownResolvers()[i]->isProtocolSupported(uri.getProtocol())) {
foundProtocol = true;
if (_KnownResolvers[i]->resolveURI(uri))
if (_KnownResolvers()[i]->resolveURI(uri))
return;
}
#if defined(_DEBUG) && defined(WIN32)
@@ -949,12 +999,12 @@ daeBool daeURIResolver::_loadExternalDocuments = true;
daeURIResolver::daeURIResolver()
{
_KnownResolvers.append((daeURIResolver*)this);
_KnownResolvers().append((daeURIResolver*)this);
}
daeURIResolver::~daeURIResolver()
{
_KnownResolvers.remove((daeURIResolver*)this);
_KnownResolvers().remove((daeURIResolver*)this);
}
// This code is loosely based on the RFC 2396 normalization code from
// libXML. Specifically it does the RFC steps 6.c->6.g from section 5.2
@@ -1220,3 +1270,13 @@ int daeURI::makeRelativeTo(daeURI* relativeToURI)
return(DAE_OK);
}
void daeURIResolver::setAutoLoadExternalDocuments( daeBool load )
{
_loadExternalDocuments = load;
}
daeBool daeURIResolver::getAutoLoadExternalDocuments()
{
return _loadExternalDocuments;
}

View File

@@ -37,14 +37,18 @@ domAny::registerElement()
daeMetaElement *_Meta = new daeMetaElement;
_Meta->setName( "any" );
//_Meta->setStaticPointerAddress(&domAny::_Meta);
_Meta->registerConstructor(domAny::create);
_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 ); // sthomas
cm = cm->getParent();
cm->setMaxOrdinal( 0 );
_Meta->setCMRoot( cm );
_Meta->setCMRoot( cm );
_Meta->setAllowsAny( true );
_Meta->addContents(daeOffsetOf(domAny,_contents));