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 <sstream>
10#include <dae/daeMetaAttribute.h>
11#include <dae/daeMetaElement.h>
12#include <dae/daeErrorHandler.h>
13#include <dae/daeDocument.h>
14
15void daeMetaAttribute::set(daeElement* e, daeString s) {
16	stringToMemory(e, s);
17}
18
19void daeMetaAttribute::copy(daeElement* to, daeElement *from) {
20	_type->copy(get(from), get(to));
21}
22
23void daeMetaArrayAttribute::copy(daeElement* to, daeElement *from) {
24	daeArray& fromArray = (daeArray&)*get(from);
25	daeArray& toArray = (daeArray&)*get(to);
26	_type->copyArray(fromArray, toArray);
27}
28
29void daeMetaAttribute::copyDefault(daeElement* element) {
30	if (_defaultValue)
31		_type->copy(_defaultValue, get(element));
32}
33
34void daeMetaArrayAttribute::copyDefault(daeElement* element) {
35	if (_defaultValue)
36		_type->copyArray((daeArray&)*_defaultValue, (daeArray&)*get(element));
37}
38
39daeInt daeMetaAttribute::compare(daeElement* elt1, daeElement* elt2) {
40	return _type->compare(get(elt1), get(elt2));
41}
42
43daeInt daeMetaArrayAttribute::compare(daeElement* elt1, daeElement* elt2) {
44	daeArray& value1 = (daeArray&)*get(elt1);
45	daeArray& value2 = (daeArray&)*get(elt2);
46	return _type->compareArray(value1, value2);
47}
48
49daeInt daeMetaAttribute::compareToDefault(daeElement* e) {
50	if (!_defaultValue)
51		return 1;
52	return _type->compare(get(e), _defaultValue);
53}
54
55daeInt daeMetaArrayAttribute::compareToDefault(daeElement* e) {
56	if (!_defaultValue)
57		return 1;
58	daeArray& value1 = (daeArray&)*get(e);
59	daeArray& value2 = (daeArray&)*_defaultValue;
60	return _type->compareArray(value1, value2);
61}
62
63daeMetaAttribute::daeMetaAttribute()
64{
65	_name = "noname";
66	_offset = -1;
67	_type = NULL;
68	_container = NULL;
69	_defaultString = "";
70	_defaultValue = NULL;
71	_isRequired = false;
72}
73
74daeMetaAttribute::~daeMetaAttribute() {
75	if (_defaultValue)
76		_type->destroy(_defaultValue);
77	_defaultValue = NULL;
78}
79
80daeMetaArrayAttribute::~daeMetaArrayAttribute() {
81	delete (daeArray*)_defaultValue;
82	_defaultValue = NULL;
83}
84
85daeInt
86daeMetaAttribute::getSize()
87{
88	return _type->getSize();
89}
90daeInt
91daeMetaAttribute::getAlignment()
92{
93	return _type->getAlignment();
94}
95
96void daeMetaAttribute::memoryToString(daeElement* e, std::ostringstream& buffer) {
97	_type->memoryToString(get(e), buffer);
98}
99
100void daeMetaAttribute::stringToMemory(daeElement* e, daeString s) {
101	if (!strcmp(_name, "id") && e->getDocument())
102		e->getDocument()->changeElementID(e, s);
103	else if (!strcmp(_name, "sid") && e->getDocument())
104		e->getDocument()->changeElementSID(e, s);
105
106	_type->stringToMemory((daeChar*)s, get(e));
107}
108
109daeChar* daeMetaAttribute::getWritableMemory(daeElement* e) {
110	return (daeChar*)e + _offset;
111}
112
113daeMemoryRef daeMetaAttribute::get(daeElement* e) {
114	return getWritableMemory(e);
115}
116
117void daeMetaAttribute::setDefaultString(daeString defaultVal) {
118	_defaultString = defaultVal;
119	if (!_defaultValue)
120		_defaultValue = _type->create();
121	_type->stringToMemory((daeChar*)_defaultString.c_str(), _defaultValue);
122}
123
124void daeMetaAttribute::setDefaultValue(daeMemoryRef defaultVal) {
125	if (!_defaultValue)
126		_defaultValue = _type->create();
127	_type->copy(defaultVal, _defaultValue);
128	std::ostringstream buffer;
129	_type->memoryToString(_defaultValue, buffer);
130	_defaultString = buffer.str();
131}
132
133void daeMetaArrayAttribute::memoryToString(daeElement* e, std::ostringstream& buffer) {
134	if (e)
135		_type->arrayToString(*(daeArray*)get(e), buffer);
136}
137
138void daeMetaArrayAttribute::stringToMemory(daeElement* e, daeString s) {
139	if (e)
140		_type->stringToArray((daeChar*)s, *(daeArray*)get(e));
141}
142
143void daeMetaArrayAttribute::setDefaultString(daeString defaultVal) {
144	_defaultString = defaultVal;
145	if (!_defaultValue)
146		_defaultValue = (daeMemoryRef)_type->createArray();
147	_type->stringToArray((daeChar*)_defaultString.c_str(), (daeArray&)*_defaultValue);
148}
149
150void daeMetaArrayAttribute::setDefaultValue(daeMemoryRef defaultVal) {
151	if (!_defaultValue)
152		_defaultValue = (daeMemoryRef)_type->createArray();
153	_type->copyArray((daeArray&)*defaultVal, (daeArray&)*_defaultValue);
154	std::ostringstream buffer;
155	_type->arrayToString((daeArray&)*_defaultValue, buffer);
156	_defaultString = buffer.str();
157}
158
159daeString daeMetaAttribute::getDefaultString() {
160	return _defaultString.c_str();
161}
162
163daeMemoryRef daeMetaAttribute::getDefaultValue() {
164	return _defaultValue;
165}
166
167void daeMetaAttribute::setDocument(daeElement* e, daeDocument* doc) {
168	_type->setDocument(get(e), doc);
169}
170
171void daeMetaArrayAttribute::setDocument(daeElement* e, daeDocument* doc) {
172	_type->setDocument(*(daeArray*)get(e), doc);
173}
174