1 /* 2 * Copyright 2006 Sony Computer Entertainment Inc. 3 * 4 * Licensed under the MIT Open Source License, for details please see license.txt or the website 5 * http://www.opensource.org/licenses/mit-license.php 6 * 7 */ 8 9 #include <dae.h> 10 #include <dae/daeDom.h> 11 #include <dae/domAny.h> 12 #include <dae/daeMetaAttribute.h> 13 #include <dae/daeMetaCMPolicy.h> 14 #include <dae/daeMetaSequence.h> 15 #include <dae/daeMetaChoice.h> 16 #include <dae/daeMetaGroup.h> 17 #include <dae/daeMetaAny.h> 18 #include <dae/daeMetaElementAttribute.h> 19 #include <dae/daeErrorHandler.h> 20 21 daeElementRef 22 domAny::create(DAE& dae) 23 { 24 domAnyRef ref = new domAny; 25 return ref; 26 } 27 28 29 daeMetaElement * 30 domAny::registerElement(DAE& dae) 31 { 32 daeMetaElement *_Meta = new daeMetaElement(dae); 33 _Meta->setName( "any" ); 34 _Meta->registerClass(domAny::create); 35 _Meta->setIsInnerClass( true ); 36 37 daeMetaCMPolicy *cm = NULL; 38 cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); 39 40 cm = new daeMetaAny( _Meta, cm, 0, 0, -1 ); 41 cm->getParent()->appendChild( cm ); 42 cm = cm->getParent(); 43 44 cm->setMaxOrdinal( 0 ); 45 _Meta->setCMRoot( cm ); 46 _Meta->setAllowsAny( true ); 47 48 _Meta->addContents(daeOffsetOf(domAny,_contents)); 49 _Meta->addContentsOrder(daeOffsetOf(domAny,_contentsOrder)); 50 51 //VALUE 52 { 53 daeMetaAttribute *ma = new daeMetaAttribute; 54 ma->setName( "_value" ); 55 ma->setType( dae.getAtomicTypes().get("xsString")); 56 ma->setOffset( daeOffsetOf( domAny , _value )); 57 ma->setContainer( _Meta ); 58 _Meta->appendAttribute(ma); 59 } 60 61 _Meta->setElementSize(sizeof(domAny)); 62 _Meta->validate(); 63 64 return _Meta; 65 } 66 67 domAny::~domAny() { 68 // domAny objects own their corresponding daeMetaElement 69 delete _meta; 70 } 71 72 // Implementation of daeMetaAttribute that understands how domAny works 73 class domAnyAttribute : public daeMetaAttribute { 74 public: 75 virtual daeChar* getWritableMemory(daeElement* e) { 76 return (daeChar*)&((domAny*)e)->attrs[_offset]; 77 } 78 }; 79 80 daeBool domAny::setAttribute(daeString attrName, daeString attrValue) { 81 if (_meta == NULL) 82 return false; 83 84 //if the attribute already exists set it. 85 if (daeElement::setAttribute(attrName, attrValue)) 86 return true; 87 88 //else register it and then set it. 89 attrs.append(""); 90 daeMetaAttribute *ma = new domAnyAttribute; 91 ma->setName( attrName ); 92 ma->setType( getDAE()->getAtomicTypes().get("xsString")); 93 ma->setOffset((daeInt)attrs.getCount()-1); 94 ma->setContainer( _meta ); 95 if (ma->getType()) { 96 _meta->appendAttribute(ma); 97 _validAttributeArray.append( true ); 98 ma->stringToMemory(this, attrValue); 99 return true; 100 } 101 102 delete ma; 103 return false; 104 } 105 106 107