- implemented sg_xml_exception class

- implemented new readXML function with path instead of stream
- modified existing readXML function to use optional path parameter
- modified readXML to throw exceptions rather than returning a bool
  value on error
This commit is contained in:
curt
2001-07-19 02:33:58 +00:00
parent 6f7fe4b481
commit 5f17edbc72

View File

@@ -7,6 +7,37 @@
#include "easyxml.hxx"
#include "xmlparse.h"
#include STL_FSTREAM
SG_USING_STD(ifstream);
////////////////////////////////////////////////////////////////////////
// Implementation of sg_xml_exception.
////////////////////////////////////////////////////////////////////////
sg_xml_exception::sg_xml_exception ()
: sg_io_exception("", "SimGear XML parser")
{
}
sg_xml_exception::sg_xml_exception (const string &message)
: sg_io_exception(message, "SimGear XML parser")
{
}
sg_xml_exception::sg_xml_exception (const string &message,
const sg_location &location)
: sg_io_exception(message, location, "SimGear XML parser")
{
}
sg_xml_exception::~sg_xml_exception ()
{
}
////////////////////////////////////////////////////////////////////////
// Implementation of XMLAttributes.
@@ -162,7 +193,7 @@ ExpatAtts::getValue (int i) const
// Static callback functions for Expat.
////////////////////////////////////////////////////////////////////////
#define VISITOR (*((XMLVisitor*)userData))
#define VISITOR (*((XMLVisitor *)userData))
static void
start_element (void * userData, const char * name, const char ** atts)
@@ -198,11 +229,9 @@ processing_instruction (void * userData,
// Implementation of XMLReader.
////////////////////////////////////////////////////////////////////////
bool
readXML (istream &input, XMLVisitor &visitor)
void
readXML (istream &input, XMLVisitor &visitor, const string &path)
{
bool retval = true;
XML_Parser parser = XML_ParserCreate(0);
XML_SetUserData(parser, &visitor);
XML_SetElementHandler(parser, start_element, end_element);
@@ -214,26 +243,47 @@ readXML (istream &input, XMLVisitor &visitor)
char buf[16384];
while (!input.eof()) {
input.read(buf,16384);
// TODO: deal with bad stream.
if (!XML_Parse(parser, buf, input.gcount(), false)) {
visitor.error(XML_ErrorString(XML_GetErrorCode(parser)),
XML_GetCurrentColumnNumber(parser),
XML_GetCurrentLineNumber(parser));
retval = false;
// FIXME: get proper error string from system
if (!input.good()) {
XML_ParserFree(parser);
throw sg_io_exception("Problem reading file",
sg_location(path,
XML_GetCurrentLineNumber(parser),
XML_GetCurrentColumnNumber(parser)));
}
input.read(buf,16384);
if (!XML_Parse(parser, buf, input.gcount(), false)) {
XML_ParserFree(parser);
throw sg_xml_exception(XML_ErrorString(XML_GetErrorCode(parser)),
sg_location(path,
XML_GetCurrentLineNumber(parser),
XML_GetCurrentColumnNumber(parser)));
}
}
// Verify end of document.
if (!XML_Parse(parser, buf, 0, true))
retval = false;
if (retval)
visitor.endXML();
if (!XML_Parse(parser, buf, 0, true)) {
XML_ParserFree(parser);
throw sg_xml_exception(XML_ErrorString(XML_GetErrorCode(parser)),
sg_location(path,
XML_GetCurrentLineNumber(parser),
XML_GetCurrentColumnNumber(parser)));
}
XML_ParserFree(parser);
}
return retval;
void
readXML (const string &path, XMLVisitor &visitor)
{
ifstream input(path.c_str());
if (input.good()) {
readXML(input, visitor, path);
} else {
throw sg_io_exception("Failed to open file", sg_location(path));
}
}
// end of easyxml.cxx