]> git.mxchange.org Git - simgear.git/commitdiff
Add support for parsing an xml stream from an in memory buffer, rather than
authorcurt <curt>
Fri, 10 Sep 2004 15:57:52 +0000 (15:57 +0000)
committercurt <curt>
Fri, 10 Sep 2004 15:57:52 +0000 (15:57 +0000)
just from a specified file name.

simgear/props/props_io.cxx
simgear/props/props_io.hxx
simgear/xml/easyxml.cxx
simgear/xml/easyxml.hxx

index 997ac971d3918f3e23c1279a0a6d848fa4947497..e936f5b011f0fb6bab7f22abb350c33ea9fb8dfe 100644 (file)
@@ -322,6 +322,23 @@ readProperties (const string &file, SGPropertyNode * start_node)
 }
 
 
+/**
+ * Read properties from an in-memory buffer.
+ *
+ * @param buf A character buffer containing the xml data.
+ * @param size The size/length of the buffer in bytes
+ * @param start_node The root node for reading properties.
+ * @return true if the read succeeded, false otherwise.
+ */
+void readProperties (const char *buf, const int size,
+                     SGPropertyNode * start_node)
+{
+  PropsVisitor visitor(start_node, "");
+  readXML(buf, size, visitor);
+  if (visitor.hasException())
+    throw visitor.getException();
+}
+
 \f
 ////////////////////////////////////////////////////////////////////////
 // Property list writer.
index d541e1cedc145985717fd431154ab7d6110ef242..2706740ce7dd0f42503ce085ff9c3d951235b5f5 100644 (file)
@@ -41,6 +41,13 @@ void readProperties (istream &input, SGPropertyNode * start_node,
 void readProperties (const string &file, SGPropertyNode * start_node);
 
 
+/**
+ * Read properties from an in-memory buffer.
+ */
+void readProperties (const char *buf, const int size,
+                     SGPropertyNode * start_node);
+
+
 /**
  * Write properties to an XML output stream.
  */
index 43054d167f1a70aae2e531476f791a80364a7c71..3636fa9d3fe46feef6eda5ac48fdc59674d9983d 100644 (file)
@@ -274,4 +274,27 @@ readXML (const string &path, XMLVisitor &visitor)
   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
index d3f6a90ae5c8815686eea406158df1c4e786c062..6b91a86718efb30602d4adccbe1d294330bf7705 100644 (file)
@@ -401,5 +401,27 @@ extern void readXML (istream &input, XMLVisitor &visitor,
 extern void readXML (const string &path, XMLVisitor &visitor);
 
 
+/**
+ * @relates XMLVisitor
+ * Read an XML document.
+ *
+ * This function reads an XML document from the buffer provided,
+ * and invokes the callback methods in the visitor object to pass the 
+ * parsing events back to the application.  When this function
+ * returns, the parser will have reported all of the data in the XML
+ * document to the application through the visitor callback methods,
+ * and XML processing will be complete.
+ *
+ * @param buf The xml data buffer.
+ * @param size The size of the data buffer in bytes
+ * @param visitor An object that contains callbacks for XML parsing
+ * events.
+ * @exception Throws sg_io_exception or sg_xml_exception if there
+ * is a problem reading the file.
+ * @see XMLVisitor
+ */
+extern void readXML (const char *buf, const int size, XMLVisitor &visitor);
+
+
 #endif // __EASYXML_HXX