Laelaps  2.3.5
RoadNarrows Robotics Small Outdoor Mobile Robot Project
laelaps::LaeXmlCfg Class Reference

LaeXmlCfg Laelaps XML configuration class. More...

#include <laeXmlCfg.h>

Inheritance diagram for laelaps::LaeXmlCfg:

Public Member Functions

 LaeXmlCfg ()
 Default constructor.
 
virtual ~LaeXmlCfg ()
 Destructor.
 
virtual int load (LaeDesc &desc, const std::string &strSearchPath, const std::string &strXmlFileName, bool bAllInstances=false)
 Load XML file into DOM and set the Laelaps description. More...
 
virtual int loadFile (const std::string &strXmlFileName=LaeEtcCfg)
 Load XML file into DOM. More...
 
virtual int loadFile (LaeDesc &desc, const std::string &strXmlFileName=LaeEtcCfg)
 Load XML file into DOM and set the Laelaps description. More...
 
virtual int saveFile (const std::string &strXmlFileName=LaeEtcCfg)
 Save DOM to XML file. More...
 
virtual int saveFile (const LaeDesc &desc, const std::string &strXmlFileName=LaeEtcCfg)
 Set DOM from Laelaps description and save XML file. More...
 
virtual int createTemplateFile (const std::string &strXmlFileName=LaeEtcCfg)
 Create a template Laelaps XML configuration file. root element. More...
 
virtual int setDescFromDOM (LaeDesc &desc)
 Set Laelaps description for DOM. More...
 
virtual int setDOMFromDesc (const LaeDesc &desc)
 Set the DOM from the Laelaps description. More...
 

Protected Member Functions

virtual int setBaseDesc (TiXmlElement *pElemMaj, LaeDesc &desc)
 Set Laelaps robotic base description for DOM. More...
 
virtual int setOptionsDesc (TiXmlElement *pElemMaj, LaeDesc &desc)
 Set Laelaps package options descriptions for DOM. More...
 
void warnUnknownElem (const std::string &strElem)
 Warn on unknown element. More...
 

Protected Attributes

std::string m_strMajElemBase
 robotic base major element name
 
std::string m_strMajElemOptions
 package options major element name
 

Detailed Description

LaeXmlCfg Laelaps XML configuration class.

Definition at line 71 of file laeXmlCfg.h.

Member Function Documentation

int LaeXmlCfg::createTemplateFile ( const std::string &  strXmlFileName = LaeEtcCfg)
virtual

Create a template Laelaps XML configuration file. root element.

Any current DOM is not accessed nor altered.

Parameters
strXmlFileNameXML file path name.
Returns
On success, OK(0) is returned.
On error, RC_ERROR(-1) is returned.

Definition at line 167 of file laeXmlCfg.cxx.

Referenced by ~LaeXmlCfg().

168 {
169  FILE *fp; // opened file pointer
170 
171  if( strXmlFileName.empty() )
172  {
173  setErrorMsg("No file name.");
174  LOGERROR("%s", m_bufErrMsg);
175  return -LAE_ECODE_XML;
176  }
177 
178  m_strXmlFileName = strXmlFileName;
179 
180  // open file
181  if( (fp = fopen(m_strXmlFileName.c_str(), "w+")) == NULL )
182  {
183  setErrorMsg("%s: %s(errno=%d).",
184  m_strXmlFileName.c_str(), strerror(errno), errno);
185  LOGERROR("%s", m_bufErrMsg);
186  return -LAE_ECODE_XML;
187  }
188 
189  makeXmlHead();
190  makeXmlTail();
191 
192  //
193  // XML head.
194  //
195  fprintf(fp, " <!-- RoadNarrows Laelaps Top-Level Description -->\n");
196  fprintf(fp, "%s", m_strXmlHead.c_str());
197 
198  //
199  // Robotic base major element.
200  //
201  fprintf(fp, " <!-- Laelaps robotic mobile base -->\n");
202  fprintf(fp, " <%s>\n", m_strMajElemBase.c_str());
203 
204  fprintf(fp, " <!-- DESCRIPTION ELEMENTS HERE -->\n");
205 
206  fprintf(fp, " </%s>\n\n", m_strMajElemBase.c_str());
207 
208  //
209  // Package options major element.
210  //
211  fprintf(fp, " <!-- Laelaps package options -->\n");
212  fprintf(fp, " <%s>\n", m_strMajElemOptions.c_str());
213 
214  fprintf(fp, " <!-- OPTION ELEMENTS HERE -->\n");
215 
216  fprintf(fp, " </%s>\n\n", m_strMajElemOptions.c_str());
217 
218  //
219  // XML tail
220  //
221  fprintf(fp, "%s", m_strXmlTail.c_str());
222 
223  fclose(fp);
224 
225  LOGDIAG3("Created file %s.", m_strXmlFileName.c_str());
226 
227  return LAE_OK;
228 }
std::string m_strMajElemOptions
package options major element name
Definition: laeXmlCfg.h:185
static const int LAE_ECODE_XML
XML error.
Definition: laelaps.h:92
std::string m_strMajElemBase
robotic base major element name
Definition: laeXmlCfg.h:184
static const int LAE_OK
not an error, success
Definition: laelaps.h:71
int LaeXmlCfg::load ( LaeDesc desc,
const std::string &  strSearchPath,
const std::string &  strXmlFileName,
bool  bAllInstances = false 
)
virtual

Load XML file into DOM and set the Laelaps description.

Parameters
[out]desc

Definition at line 65 of file laeXmlCfg.cxx.

References laelaps::LaeDesc::clear(), and laelaps::split().

Referenced by ~LaeXmlCfg().

69 {
70  vector<string> vecPath; // vector of search paths
71  string fqname; // fully qualified file name
72  bool bFoundInstance; // [not] found instance
73  size_t i; // working index
74  int rc; // return code
75 
76  split(strSearchPath, ':', vecPath);
77 
78  bFoundInstance = false;
79  rc = LAE_OK;
80 
81  desc.clear();
82 
83  for(i=0; i<vecPath.size(); ++i)
84  {
85  fqname = vecPath[i] + '/' + strXmlFileName;
86  if( access(fqname.c_str(), F_OK) == 0 )
87  {
88  LOGDIAG3("Loading Laelaps description XML file: %s.", fqname.c_str());
89 
90  bFoundInstance = true;
91 
92  if( (rc = Xml::loadFile(fqname)) < 0 )
93  {
94  LOGERROR("Parse of Laelaps description from XML file %s failed.",
95  fqname.c_str());
96  rc = -LAE_ECODE_XML;
97  }
98  else
99  {
100  rc = setDescFromDOM(desc);
101  }
102 
103  if( rc == LAE_OK )
104  {
105  LOGDIAG2("Loaded Laelaps description from XML file %s.",
106  fqname.c_str());
107  }
108 
109  if( !bAllInstances )
110  {
111  break;
112  }
113  }
114  }
115 
116  if( !bFoundInstance )
117  {
118  LOGERROR("XML file %s not found.", strXmlFileName.c_str());
119  rc = -LAE_ECODE_XML;
120  }
121 
122  return rc;
123 }
virtual int setDescFromDOM(LaeDesc &desc)
Set <b><i>Laelaps</i></b> description for DOM.
Definition: laeXmlCfg.cxx:230
void clear()
Clear description to the "unitialized" values.
Definition: laeDesc.cxx:748
std::vector< std::string > & split(const std::string &s, char delim, std::vector< std::string > &elems)
Split string at the delimiter character.
static const int LAE_ECODE_XML
XML error.
Definition: laelaps.h:92
static const int LAE_OK
not an error, success
Definition: laelaps.h:71
virtual int laelaps::LaeXmlCfg::loadFile ( const std::string &  strXmlFileName = LaeEtcCfg)
virtual

Load XML file into DOM.

Parameters
strXmlFileNameXML file path name.
Returns
On success, OK(0) is returned.
On error, RC_ERROR(-1) is returned.

Referenced by main(), mainInit(), and ~LaeXmlCfg().

virtual int laelaps::LaeXmlCfg::loadFile ( LaeDesc desc,
const std::string &  strXmlFileName = LaeEtcCfg 
)
virtual

Load XML file into DOM and set the Laelaps description.

Parameters
desc
virtual int laelaps::LaeXmlCfg::saveFile ( const std::string &  strXmlFileName = LaeEtcCfg)
virtual

Save DOM to XML file.

Parameters
strXmlFileNameXML file path name.
Returns
On success, OK(0) is returned.
On error, RC_ERROR(-1) is returned.

Referenced by ~LaeXmlCfg().

virtual int laelaps::LaeXmlCfg::saveFile ( const LaeDesc desc,
const std::string &  strXmlFileName = LaeEtcCfg 
)
virtual

Set DOM from Laelaps description and save XML file.

Parameters
desc
int LaeXmlCfg::setBaseDesc ( TiXmlElement *  pElemMaj,
LaeDesc desc 
)
protectedvirtual

Set Laelaps robotic base description for DOM.

Parameters
pElemMajPointer to major DOM base description element.
desc

Definition at line 279 of file laeXmlCfg.cxx.

References laelaps::LaeDesc::m_eProdId, laelaps::LaeDesc::m_strProdBrief, laelaps::LaeDesc::m_strProdFamily, laelaps::LaeDesc::m_strProdHwVer, laelaps::LaeDesc::m_strProdModel, laelaps::LaeDesc::m_strProdName, laelaps::LaeDesc::m_uProdHwVer, and laelaps::strToVersion().

280 {
281  // sub-elements
282  string strAttrProdId("product_id");
283  string strElemProdName("product_name");
284  string strElemProdBrief("product_brief");
285  string strElemProdFamily("product_family");
286  string strElemProdModel("product_model");
287  string strElemProdHwVer("hw_version");
288 
289  TiXmlElement *pElem;
290  const char *sValue;
291  string str;
292  int iVal;
293  int rc;
294 
295  if( (rc = strToInt(elemAttr(pElemMaj, strAttrProdId), iVal)) < 0 )
296  {
297  setErrorMsg("%s: No %s attribute of <%s> found or value not an integer.",
298  m_strXmlFileName.c_str(),
299  strAttrProdId.c_str(),
300  m_strMajElemBase.c_str());
301  LOGERROR("%s", m_bufErrMsg);
302  return -LAE_ECODE_XML;
303  }
304 
305  desc.m_eProdId = iVal;
306 
307  // child elements
308  for(pElem = pElemMaj->FirstChildElement(), rc = LAE_OK;
309  (pElem != NULL) && (rc == LAE_OK);
310  pElem = pElem->NextSiblingElement())
311  {
312  if( (sValue = pElem->Value()) == NULL )
313  {
314  continue;
315  }
316 
317  // product name
318  else if( !strcasecmp(sValue, strElemProdName.c_str()) )
319  {
320  desc.m_strProdName = elemText(pElem);
321  }
322 
323  // product brief
324  else if( !strcasecmp(sValue, strElemProdBrief.c_str()) )
325  {
326  desc.m_strProdBrief = elemText(pElem);
327  }
328 
329  // product family
330  else if( !strcasecmp(sValue, strElemProdFamily.c_str()) )
331  {
332  desc.m_strProdFamily = elemText(pElem);
333  }
334 
335  // product model
336  else if( !strcasecmp(sValue, strElemProdModel.c_str()) )
337  {
338  desc.m_strProdModel = elemText(pElem);
339  }
340 
341  // product hardware version
342  else if( !strcasecmp(sValue, strElemProdHwVer.c_str()) )
343  {
344  desc.m_strProdHwVer = elemText(pElem);
346  }
347 
348  else
349  {
350  warnUnknownElem(sValue);
351  }
352  }
353 
354  LOGDIAG3("%s: Laelaps robotic base description set.",
355  m_strXmlFileName.c_str());
356 
357  return LAE_OK;
358 }
uint_t strToVersion(const std::string &str)
Convert version dotted string to integer equivalent.
std::string m_strProdBrief
product brief
Definition: laeDesc.h:515
void warnUnknownElem(const std::string &strElem)
Warn on unknown element.
Definition: laeXmlCfg.h:212
std::string m_strProdModel
product model
Definition: laeDesc.h:513
std::string m_strProdHwVer
product hardware version string
Definition: laeDesc.h:516
std::string m_strProdFamily
product family
Definition: laeDesc.h:512
uint_t m_uProdHwVer
product hardware version number
Definition: laeDesc.h:517
int m_eProdId
base product id
Definition: laeDesc.h:511
static const int LAE_ECODE_XML
XML error.
Definition: laelaps.h:92
std::string m_strMajElemBase
robotic base major element name
Definition: laeXmlCfg.h:184
std::string m_strProdName
product name
Definition: laeDesc.h:514
static const int LAE_OK
not an error, success
Definition: laelaps.h:71
int LaeXmlCfg::setDescFromDOM ( LaeDesc desc)
virtual

Set Laelaps description for DOM.

Parameters
desc

Definition at line 230 of file laeXmlCfg.cxx.

Referenced by ~LaeXmlCfg().

231 {
232  TiXmlElement *pElem;
233  const char *sValue;
234  const char *sAttr;
235  const char *sText;
236  int n;
237  int rc;
238 
239  // root element
240  if( m_pElemRoot == NULL )
241  {
242  setErrorMsg("Missing DOM and/or <%s> root element missing.",
243  m_strRootElemName.c_str());
244  LOGERROR("%s", m_bufErrMsg);
245  return -LAE_ECODE_XML;
246  }
247 
248  // search secion elements
249  for(pElem = m_pElemRoot->FirstChildElement();
250  pElem != NULL;
251  pElem = pElem->NextSiblingElement())
252  {
253  if( (sValue = pElem->Value()) == NULL )
254  {
255  continue;
256  }
257 
258  // robotic base description
259  if( !strcasecmp(sValue, m_strMajElemBase.c_str()) )
260  {
261  setBaseDesc(pElem, desc);
262  }
263 
264  // robotic package options descriptions
265  else if( !strcasecmp(sValue, m_strMajElemOptions.c_str()) )
266  {
267  setOptionsDesc(pElem, desc);
268  }
269 
270  else
271  {
272  warnUnknownElem(sValue);
273  }
274  }
275 
276  return LAE_OK;
277 }
std::string m_strMajElemOptions
package options major element name
Definition: laeXmlCfg.h:185
void warnUnknownElem(const std::string &strElem)
Warn on unknown element.
Definition: laeXmlCfg.h:212
virtual int setBaseDesc(TiXmlElement *pElemMaj, LaeDesc &desc)
Set <b><i>Laelaps</i></b> robotic base description for DOM.
Definition: laeXmlCfg.cxx:279
virtual int setOptionsDesc(TiXmlElement *pElemMaj, LaeDesc &desc)
Set <b><i>Laelaps</i></b> package options descriptions for DOM.
Definition: laeXmlCfg.cxx:360
static const int LAE_ECODE_XML
XML error.
Definition: laelaps.h:92
std::string m_strMajElemBase
robotic base major element name
Definition: laeXmlCfg.h:184
static const int LAE_OK
not an error, success
Definition: laelaps.h:71
int LaeXmlCfg::setDOMFromDesc ( const LaeDesc desc)
virtual

Set the DOM from the Laelaps description.

Parameters
desc

Definition at line 427 of file laeXmlCfg.cxx.

Referenced by ~LaeXmlCfg().

428 {
429  // TODO
430  return -LAE_ECODE_GEN;
431 }
static const int LAE_ECODE_GEN
general, unspecified error
Definition: laelaps.h:73
int LaeXmlCfg::setOptionsDesc ( TiXmlElement *  pElemMaj,
LaeDesc desc 
)
protectedvirtual

Set Laelaps package options descriptions for DOM.

Parameters
pElemMajPointer to major DOM base description element.
desc

Definition at line 360 of file laeXmlCfg.cxx.

References laelaps::LaeDescOptions::m_strPkgFCam, and laelaps::LaeDescOptions::m_strPkgToF.

361 {
362  // sub-elements
363  string strElemOptToF("tof_option");
364  string strElemOptFCam("fcam_option");
365 
366  TiXmlElement *pElem;
367  const char *sValue;
368  string strText;
369 
370  // child elements
371  for(pElem = pElemMaj->FirstChildElement();
372  pElem != NULL;
373  pElem = pElem->NextSiblingElement())
374  {
375  if( (sValue = pElem->Value()) == NULL )
376  {
377  continue;
378  }
379 
380  // time-of-flight range sensor package
381  else if( !strcasecmp(sValue, strElemOptToF.c_str()) )
382  {
383  strText = elemText(pElem);
384  if( !strcasecmp(strText.c_str(), LaeDescOptions::PkgOptStd) )
385  {
386  desc.m_options.m_strPkgToF = LaeDescOptions::PkgOptStd;
387  }
388  else if( !strcasecmp(strText.c_str(), LaeDescOptions::PkgOptDeluxe) )
389  {
390  desc.m_options.m_strPkgToF = LaeDescOptions::PkgOptDeluxe;
391  }
392  else
393  {
394  LOGWARN("%s: unknown %s package option - assuming %s.",
395  strText.c_str(), strElemOptToF.c_str(), LaeDescOptions::PkgOptStd);
396  desc.m_options.m_strPkgToF = LaeDescOptions::PkgOptStd;
397  }
398  }
399 
400  // front camera sensor package
401  else if( !strcasecmp(sValue, strElemOptFCam.c_str()) )
402  {
403  strText = elemText(pElem);
404  if( !strcasecmp(strText.c_str(), LaeDescOptions::PkgOptStd) )
405  {
406  desc.m_options.m_strPkgFCam = LaeDescOptions::PkgOptStd;
407  }
408  else
409  {
410  LOGWARN("%s: unknown %s package option - assuming %s.",
411  strText.c_str(), strElemOptFCam.c_str(), LaeDescOptions::PkgOptStd);
412  desc.m_options.m_strPkgFCam = LaeDescOptions::PkgOptStd;
413  }
414  }
415 
416  else
417  {
418  warnUnknownElem(sValue);
419  }
420  }
421 
422  LOGDIAG3("%s: Laelaps package options set.", m_strXmlFileName.c_str());
423 
424  return LAE_OK;
425 }
static const char *const PkgOptDeluxe
deluxe package option
Definition: laeDesc.h:402
void warnUnknownElem(const std::string &strElem)
Warn on unknown element.
Definition: laeXmlCfg.h:212
std::string m_strPkgToF
range time-of-flight package
Definition: laeDesc.h:404
std::string m_strPkgFCam
front camera package
Definition: laeDesc.h:405
static const char *const PkgOptStd
standard package option
Definition: laeDesc.h:401
static const int LAE_OK
not an error, success
Definition: laelaps.h:71
void laelaps::LaeXmlCfg::warnUnknownElem ( const std::string &  strElem)
inlineprotected

Warn on unknown element.

Parameters
strElemElement name.

Definition at line 212 of file laeXmlCfg.h.

213  {
214  setErrorMsg("%s: Element <%s> unknown - ignoring.",
215  m_strXmlFileName.c_str(), strElem.c_str());
216  LOGWARN("%s", m_bufErrMsg);
217  }

The documentation for this class was generated from the following files: