From d0fdeeed970c8a60d3f07a7ac2f605e186b671ff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Tue, 21 Jul 2009 19:10:20 +0200
Subject: Add namespace support to LibXML parser.


diff --git a/Swiften/Parser/LibXMLParser.cpp b/Swiften/Parser/LibXMLParser.cpp
index 8f14f21..91ff72b 100644
--- a/Swiften/Parser/LibXMLParser.cpp
+++ b/Swiften/Parser/LibXMLParser.cpp
@@ -9,20 +9,16 @@
 
 namespace Swift {
 
-static void handleStartElement(void *client, const xmlChar* name, const xmlChar** attributes) {
+static void handleStartElement(void *client, const xmlChar* name, const xmlChar*, const xmlChar* xmlns, int, const xmlChar**, int nbAttributes, int, const xmlChar ** attributes) {
 	AttributeMap attributeValues;
-	const xmlChar** currentAttribute = attributes;
-	if (currentAttribute) {
-		while (*currentAttribute) {
-			attributeValues[String(reinterpret_cast<const char*>(*currentAttribute))] = String(reinterpret_cast<const char*>(*(currentAttribute+1)));
-			currentAttribute += 2;
-		}
+	for (int i = 0; i < nbAttributes*5; i += 5) {
+		attributeValues[String(reinterpret_cast<const char*>(attributes[i]))] = String(reinterpret_cast<const char*>(attributes[i+3]), attributes[i+4]-attributes[i+3]);
 	}
-	static_cast<XMLParserClient*>(client)->handleStartElement(reinterpret_cast<const char*>(name), attributeValues);
+	static_cast<XMLParserClient*>(client)->handleStartElement(reinterpret_cast<const char*>(name), (xmlns ? reinterpret_cast<const char*>(xmlns) : String()), attributeValues);
 }
 
-static void handleEndElement(void *client, const xmlChar* name) {
-	static_cast<XMLParserClient*>(client)->handleEndElement(reinterpret_cast<const char*>(name));
+static void handleEndElement(void *client, const xmlChar* name, const xmlChar*, const xmlChar* xmlns) {
+	static_cast<XMLParserClient*>(client)->handleEndElement(reinterpret_cast<const char*>(name), (xmlns ? reinterpret_cast<const char*>(xmlns) : String()));
 }
 
 static void handleCharacterData(void* client, const xmlChar* data, int len) {
@@ -40,8 +36,8 @@ static void handleWarning(void*, const char*, ... ) {
 LibXMLParser::LibXMLParser(XMLParserClient* client) : XMLParser(client) {
 	memset(&handler_, 0, sizeof(handler_) );
 	handler_.initialized = XML_SAX2_MAGIC;
-	handler_.startElement = &handleStartElement;
-	handler_.endElement = &handleEndElement;
+	handler_.startElementNs = &handleStartElement;
+	handler_.endElementNs = &handleEndElement;
 	handler_.characters = &handleCharacterData;
 	handler_.warning = &handleWarning;
 	handler_.error = &handleError;
diff --git a/Swiften/Parser/LibXMLParser.h b/Swiften/Parser/LibXMLParser.h
index f8faef6..58a65f1 100644
--- a/Swiften/Parser/LibXMLParser.h
+++ b/Swiften/Parser/LibXMLParser.h
@@ -1,5 +1,4 @@
-#ifndef SWIFTEN_LibXMLParser_H
-#define SWIFTEN_LibXMLParser_H
+#pragma once
 
 #include <libxml/parser.h>
 #include <boost/noncopyable.hpp>
@@ -19,5 +18,3 @@ namespace Swift {
 			xmlParserCtxtPtr context_;
 	};
 }
-
-#endif
-- 
cgit v0.10.2-6-g49f6