src/XMLDocumentConstructor.h
branchv_0
changeset 40 85b6f13f1088
parent 13 d5e2cb9e31f1
--- a/src/XMLDocumentConstructor.h	Thu Jul 22 01:06:14 2021 +0200
+++ b/src/XMLDocumentConstructor.h	Thu Jul 22 20:01:03 2021 +0200
@@ -34,24 +34,27 @@
 private:
 	std::istream* input = nullptr;
 	xmlpp::DomParser* parser = nullptr;
+	relpipe::in::asn1::lib::BasicASN1Reader reader;
+	std::shared_ptr<relpipe::in::asn1::lib::GenericASN1ContentHandler> asn1handler;
+	std::shared_ptr<relpipe::in::asn1::lib::DOMBuildingXMLContentHandler> saxHandler;
 public:
 
 	XMLDocumentConstructor(std::istream* input, xmlpp::DomParser* parser) : input(input), parser(parser) {
+		asn1handler = make_shared<relpipe::in::asn1::lib::GenericASN1ContentHandler>();
+		saxHandler = make_shared<relpipe::in::asn1::lib::DOMBuildingXMLContentHandler>(parser->get_document());
+		asn1handler->addHandler(saxHandler);
+		reader.addHandler(asn1handler);
 	}
 
 	void setOption(const std::string& uri, const std::string& value) {
+		int n = 0;
+		n += reader.setOption(uri, value);
+		n += asn1handler->setOption(uri, value);
+		n += saxHandler->setOption(uri, value);
+		if (n == 0) throw std::invalid_argument(std::string("Invalid parser option: „") + uri + "“ with value: „" + value + "“");
 	}
 
 	void process() {
-
-		relpipe::in::asn1::lib::BasicASN1Reader reader;
-		std::shared_ptr<relpipe::in::asn1::lib::GenericASN1ContentHandler> asn1handler = make_shared<relpipe::in::asn1::lib::GenericASN1ContentHandler>();
-		std::shared_ptr<relpipe::in::asn1::lib::DOMBuildingXMLContentHandler> saxHandler = make_shared<relpipe::in::asn1::lib::DOMBuildingXMLContentHandler>(parser->get_document());
-
-		asn1handler->addHandler(saxHandler);
-		reader.addHandler(asn1handler);
-
-
 		try {
 			// TODO: buffering? (reader itself also buffers)
 			for (uint8_t b = input->get(); input->good(); b = input->get()) reader.write(&b, 1);