#include "xmlparse.h"
#include STL_FSTREAM
+#include STL_IOSTREAM
SG_USING_STD(ifstream);
-\f
-////////////////////////////////////////////////////////////////////////
-// 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 ()
-{
-}
-
-
\f
////////////////////////////////////////////////////////////////////////
// Implementation of XMLAttributes.
throw sg_io_exception("Problem reading file",
sg_location(path,
XML_GetCurrentLineNumber(parser),
- XML_GetCurrentColumnNumber(parser)));
+ XML_GetCurrentColumnNumber(parser)),
+ "SimGear XML 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)));
+ throw sg_io_exception(XML_ErrorString(XML_GetErrorCode(parser)),
+ sg_location(path,
+ XML_GetCurrentLineNumber(parser),
+ XML_GetCurrentColumnNumber(parser)),
+ "SimGear XML Parser");
}
}
// Verify end of document.
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)));
+ throw sg_io_exception(XML_ErrorString(XML_GetErrorCode(parser)),
+ sg_location(path,
+ XML_GetCurrentLineNumber(parser),
+ XML_GetCurrentColumnNumber(parser)),
+ "SimGear XML Parser");
}
XML_ParserFree(parser);
{
ifstream input(path.c_str());
if (input.good()) {
- readXML(input, visitor, path);
+ try {
+ readXML(input, visitor, path);
+ } catch (sg_io_exception &e) {
+ input.close();
+ throw e;
+ } catch (sg_throwable &t) {
+ input.close();
+ throw t;
+ }
} else {
- throw sg_io_exception("Failed to open file", sg_location(path));
+ throw sg_io_exception("Failed to open file", sg_location(path),
+ "SimGear XML Parser");
+ }
+ input.close();
+}
+
+void
+readXML (const char *buf, const int size, XMLVisitor &visitor)
+{
+ XML_Parser parser = XML_ParserCreate(0);
+ XML_SetUserData(parser, &visitor);
+ XML_SetElementHandler(parser, start_element, end_element);
+ XML_SetCharacterDataHandler(parser, character_data);
+ XML_SetProcessingInstructionHandler(parser, processing_instruction);
+
+ visitor.startXML();
+
+ if (!XML_Parse(parser, buf, size, false)) {
+ XML_ParserFree(parser);
+ throw sg_io_exception(XML_ErrorString(XML_GetErrorCode(parser)),
+ sg_location("In-memory XML buffer",
+ XML_GetCurrentLineNumber(parser),
+ XML_GetCurrentColumnNumber(parser)),
+ "SimGear XML Parser");
}
+
+ XML_ParserFree(parser);
}
// end of easyxml.cxx