src/XMLCommand.h
branchv_0
changeset 6 be83e0f457a8
parent 5 e5cf88ce91ac
child 7 85741b08db48
--- a/src/XMLCommand.h	Fri Jan 11 15:01:02 2019 +0100
+++ b/src/XMLCommand.h	Fri Jan 11 16:13:21 2019 +0100
@@ -32,6 +32,7 @@
 #include <relpipe/writer/typedefs.h>
 
 #include "StreamInputSource.h"
+#include "XercesStringConvertor.h"
 
 namespace relpipe {
 namespace in {
@@ -46,21 +47,7 @@
 	class RelpipeSaxHandler : public xercesc::DefaultHandler {
 	private:
 		unique_ptr<RelationalWriter> writer;
-
-		std::wstring_convert<std::codecvt_utf8<wchar_t>> convertor; // TODO: support also other encodings.
-
-		string_t toString(const XMLCh * const chars) {
-			// XMLCh = char16_t
-			// „All XML data is handled within Xerces-C++ as strings of XMLCh characters. Regardless of the size of the type chosen, the data stored in variables of type XMLCh will always be utf-16 encoded values.“
-			// see https://xerces.apache.org/xerces-c/program-others-3.html
-			// other solution (depends on boost): https://flylib.com/books/en/2.131.1/working_with_xerces_strings.html
-
-			// TODO: review this text conversion and test on various platforms
-			char* x = XMLString::transcode(chars);
-			string s = string(x);
-			XMLString::release(&x);
-			return convertor.from_bytes(s);
-		}
+		XercesStringConvertor xConvertor;
 
 	public:
 
@@ -81,25 +68,25 @@
 
 		void startElement(const XMLCh * const uri, const XMLCh * const localname, const XMLCh * const qname, const Attributes& attrs) override {
 			writer->writeAttribute(L"startElement");
-			writer->writeAttribute(toString(uri));
-			writer->writeAttribute(toString(localname));
-			writer->writeAttribute(toString(qname));
+			writer->writeAttribute(xConvertor.toString(uri));
+			writer->writeAttribute(xConvertor.toString(localname));
+			writer->writeAttribute(xConvertor.toString(qname));
 			writer->writeAttribute(L"");
 
 			for (int i = 0; i < attrs.getLength(); i++) {
 				writer->writeAttribute(L"attribute");
-				writer->writeAttribute(toString(attrs.getURI(i)));
-				writer->writeAttribute(toString(attrs.getLocalName(i)));
-				writer->writeAttribute(toString(attrs.getQName(i)));
-				writer->writeAttribute(toString(attrs.getValue(i)));
+				writer->writeAttribute(xConvertor.toString(attrs.getURI(i)));
+				writer->writeAttribute(xConvertor.toString(attrs.getLocalName(i)));
+				writer->writeAttribute(xConvertor.toString(attrs.getQName(i)));
+				writer->writeAttribute(xConvertor.toString(attrs.getValue(i)));
 			}
 		}
 
 		void endElement(const XMLCh * const uri, const XMLCh * const localname, const XMLCh * const qname) override {
 			writer->writeAttribute(L"endElement");
-			writer->writeAttribute(toString(uri));
-			writer->writeAttribute(toString(localname));
-			writer->writeAttribute(toString(qname));
+			writer->writeAttribute(xConvertor.toString(uri));
+			writer->writeAttribute(xConvertor.toString(localname));
+			writer->writeAttribute(xConvertor.toString(qname));
 			writer->writeAttribute(L"");
 		}
 
@@ -108,7 +95,7 @@
 			writer->writeAttribute(L"");
 			writer->writeAttribute(L"");
 			writer->writeAttribute(L"");
-			writer->writeAttribute(toString(chars));
+			writer->writeAttribute(xConvertor.toString(chars));
 		}
 
 		void comment(const XMLCh * const chars, const XMLSize_t length) override {
@@ -116,7 +103,7 @@
 			writer->writeAttribute(L"");
 			writer->writeAttribute(L"");
 			writer->writeAttribute(L"");
-			writer->writeAttribute(toString(chars));
+			writer->writeAttribute(xConvertor.toString(chars));
 		}
 
 		void startCDATA() override {