]> git.mxchange.org Git - simgear.git/blobdiff - simgear/xml/easyxml.cxx
Add a function to calculate the normalmap from a regular texture.
[simgear.git] / simgear / xml / easyxml.cxx
index 12a87fe031307bb25460dfce78dbf3d030ea823a..3636fa9d3fe46feef6eda5ac48fdc59674d9983d 100644 (file)
@@ -8,36 +8,11 @@
 #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.
@@ -249,16 +224,18 @@ readXML (istream &input, XMLVisitor &visitor, const string &path)
       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");
     }
 
   }
@@ -266,10 +243,11 @@ readXML (istream &input, XMLVisitor &visitor, const string &path)
                                // 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);
@@ -280,10 +258,43 @@ readXML (const string &path, XMLVisitor &visitor)
 {
   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