Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/util/loading/load_param.cc @ 7201

Last change on this file since 7201 was 7201, checked in by bensch, 18 years ago

orxonox/trunk: no more segfaults

File size: 7.8 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOADING
17
18#include "util/loading/load_param.h"
19#include "load_param_description.h"
20
21#include <stdarg.h>
22
23/**
24 * Constructs a new LoadParameter
25 * @param root the XML-element to load this Parameter from
26 * @param paramName the Parameter to load
27 * @param object the BaseObject, to load this parameter on to (will be cast to executor's Parameter)
28 * @param executor the Executor, that executes the loading procedure.
29 */
30CLoadParam::CLoadParam(const TiXmlElement* root, const char* paramName, BaseObject* object, const Executor& executor, bool inLoadCycle)
31{
32  this->paramName = paramName;
33  this->object = object;
34  this->inLoadCycle = inLoadCycle;
35
36  // determin the LoadString.
37  if (likely(!inLoadCycle))
38    this->loadElem = grabParameterElement(root, paramName);
39  //this->loadString = grabParameter(root, paramName);
40  else if (!strcmp(root->Value(), paramName))
41    this->loadElem = (TiXmlElement*)root->FirstChild();
42  else
43    this->loadElem = NULL;
44
45  // set the Executor.
46  this->executor = executor.clone();
47
48  if (this->executor)
49    this->executor->setName(paramName);
50}
51
52/**
53 * This is a VERY SPECIAL deconsrtuctor.
54 * It is made, so that it loads the Parameters on destruction.
55 * meaning, if an Executor a valid Object exist, and all
56 * Execution-Conditions are met, they are executed here.
57 */
58CLoadParam::~CLoadParam()
59{
60  if (likely(this->executor != NULL))
61  {
62    if (this->loadElem != NULL &&  this->loadElem->ToText())
63      this->loadString = this->loadElem->Value();
64    else
65      this->loadString = NULL;
66    if (likely(this->object != NULL) &&
67        ( this->loadString != NULL ||
68          ((this->executor->getType() & Executor_NoLoadString) == Executor_NoLoadString)))
69    {
70      PRINTF(4)("Loading '%s' with Parameters '%s' onto: '%s'(%s)\n", this->paramName, this->loadString, this->object->getName(), this->object->getClassName());
71      this->executor->execute(this->object, this->loadString);
72    }
73    delete this->executor;
74  }
75}
76
77/**
78 * @brief set the default values of the executor
79 * @param value0 the first default value
80 * @param value1 the second default value
81 * @param value2 the third default value
82 * @param value3 the fourth default value
83 * @param value4 the fifth default value
84 */
85CLoadParam& CLoadParam::defaultValues(const MultiType& value0, const MultiType& value1,
86                                      const MultiType& value2, const MultiType& value3,
87                                      const MultiType& value4)
88{
89  assert(this->executor != NULL);
90  this->executor->defaultValues(value0, value1, value2, value3, value4);
91
92  return *this;
93}
94
95
96
97/**
98 * @param descriptionText The text to set as a description for this Parameter
99 * @returns a pointer to itself.
100*/
101CLoadParam& CLoadParam::describe(const char* descriptionText)
102{
103  if (LoadClassDescription::parametersDescription && this->paramDesc && !this->paramDesc->getDescription())
104  {
105    this->paramDesc->setDescription(descriptionText);
106  }
107  return *this;
108}
109
110// const LoadParamDescription* LoadParamDescription::getClass(const char* className)
111// {
112//   tIterator<LoadClassDescription>* iterator = LoadClassDescription::classList->getIterator();
113//   LoadClassDescription* enumClassDesc = iterator->firstElement();
114//   while (enumClassDesc)
115//   {
116//     if (!strcmp(enumClassDesc->className, classNameBegin, className))
117//     {
118//       delete iterator;
119//       return enumClassDesc;
120//     }
121//     enumClassDesc = iterator->nextElement();
122//   }
123//   delete iterator;
124//
125//   return NULL;
126// }
127
128
129
130
131/*
132 * @param object The object this Parameter is loaded too.
133 * @param root: the XML-element to load this option from.
134 * @param paramName: The name of the parameter loaded.
135 * @param paramCount: how many parameters this loading-function takes
136 * @param multi: if false LoadParam assumes only one occurence of this parameter in root, if true it assumes multiple occurences.
137 * @param ...: the parameter information (1. Parameter, 2. Default Value for the Parameter, ...)
138*/
139/*LoadParam::LoadParam(const TiXmlElement* root, BaseObject* object, const char* paramName,
140                             int paramCount, bool multi, const void* pointerToParam, ...)
141{
142  this->setClassID(CL_LOAD_PARAM, "LoadParam");
143  this->executor = NULL;
144
145  this->loadString = NULL;
146  this->pointerToParam = pointerToParam;
147
148  if (paramCount == 0 || this->pointerToParam != NULL)
149    this->loadString = "none";
150  else
151{
152      if (likely(!multi))
153        this->loadString = grabParameter(root, paramName);
154      else
155{
156          if (!strcmp(root->Value(), paramName))
157{
158              const TiXmlNode* val = root->FirstChild();
159              if( val->ToText())
160                this->loadString = val->Value();
161}
162}
163}
164
165  this->paramDesc = NULL;
166  if (LoadClassDescription::parametersDescription)
167{
168    // locating the class
169    this->classDesc = LoadClassDescription::addClass(object->getClassName());
170
171    if ((this->paramDesc = this->classDesc->addParam(paramName)) != NULL)
172{
173
174      this->paramDesc->paramCount = paramCount;
175      this->paramDesc->types = new int[paramCount];
176      this->paramDesc->defaultValues = new char*[paramCount];
177
178      va_list types;
179      va_start (types, pointerToParam);
180      char defaultVal[512];
181      for(int i = 0; i < paramCount; i++)
182{
183        defaultVal[0] = '\0';
184          // parameters parsed
185        int tmpType = va_arg (types, int);
186        this->paramDesc->types[i] = tmpType;
187        switch (tmpType)
188{
189  case MT_INT:
190            sprintf(defaultVal, "%d", va_arg(types, int));
191            break;
192//          case MT_LONG:
193//            sprintf(defaultVal, "%0.3f", va_arg(types, l_LONG_TYPE));
194//            break;
195  case MT_FLOAT:
196            sprintf(defaultVal, "%0.3f", va_arg(types, double));
197            break;
198  case MT_STRING:
199            sprintf(defaultVal, "%s", va_arg(types, l_STRING_TYPE));
200            break;
201  case MT_EXT1:
202            sprintf(defaultVal, "");
203            break;
204}
205        this->paramDesc->defaultValues[i] = new char[strlen(defaultVal)+1];
206        strcpy(this->paramDesc->defaultValues[i], defaultVal);
207}
208      va_end(types);
209
210      int argCount = 0;
211}
212}
213}*/
214
215
216
217
218
219
220
221
222
223
224//////////////////////
225// HELPER FUNCTIONS //
226//////////////////////
227/**
228 * @param root: The XML-element to grab a parameter from
229 * @param parameterName: the parameter to grab
230 * @returns the Value of the parameter if found, NULL otherwise
231*/
232const char* grabParameter(const TiXmlElement* root, const char* parameterName)
233{
234  const TiXmlElement* element;
235  const TiXmlNode* node;
236
237  if (root == NULL || parameterName == NULL)
238    return NULL;
239  assert( parameterName != NULL);
240
241  element = root->FirstChildElement( parameterName);
242  if( element == NULL) return NULL;
243
244  node = element->FirstChild();
245  while( node != NULL)
246  {
247    if( node->ToText()) return node->Value();
248    node = node->NextSibling();
249  }
250  return NULL;
251}
252
253/**
254 * @param root: The XML-element to grab a parameter from
255 * @param parameterName: the parameter to grab
256 * @returns the Element of the parameter if found, NULL otherwise
257 */
258const TiXmlElement* grabParameterElement(const TiXmlElement* root, const char* parameterName)
259{
260  const TiXmlElement* element;
261  const TiXmlNode* node;
262
263  if (root == NULL || parameterName == NULL)
264    return NULL;
265  assert( parameterName != NULL);
266
267  element = root->FirstChildElement( parameterName);
268  if( element == NULL) return NULL;
269
270  node = element->FirstChild();
271  while( node != NULL)
272  {
273    if( node->ToText()) return (TiXmlElement*)node;
274    node = node->NextSibling();
275  }
276  return NULL;
277}
278
279
280
Note: See TracBrowser for help on using the repository browser.