# HG changeset patch # User František Kučera # Date 1623515659 -7200 # Node ID 7230e1ea0b07be57a93179248c03cf1f3ffcf630 # Parent 68026fe3aaf59be42b0968e2b42b3b58b1a8e000 proxy handlers forwarding events to all subordinate handlers diff -r 68026fe3aaf5 -r 7230e1ea0b07 src/XMLDocumentConstructor.h --- a/src/XMLDocumentConstructor.h Sun Mar 14 19:58:35 2021 +0100 +++ b/src/XMLDocumentConstructor.h Sat Jun 12 18:34:19 2021 +0200 @@ -16,6 +16,8 @@ */ #pragma once +#include + #include #include "lib/BasicASN1Reader.h" @@ -41,6 +43,13 @@ void process() { relpipe::in::asn1::lib::BasicASN1Reader reader; + std::shared_ptr asn1handler = make_shared(); + std::shared_ptr saxHandler = make_shared(parser->get_document()); + + asn1handler->addHandler(saxHandler); + reader.addHandler(asn1handler); + + reader.write(nullptr, 0); // FIXME: transfer data from input to reader + use DOMBuildingSAXContentHandler reader.close(); diff -r 68026fe3aaf5 -r 7230e1ea0b07 src/lib/ASN1ContentHandler.h --- a/src/lib/ASN1ContentHandler.h Sun Mar 14 19:58:35 2021 +0100 +++ b/src/lib/ASN1ContentHandler.h Sat Jun 12 18:34:19 2021 +0200 @@ -16,14 +16,53 @@ */ #pragma once +#include +#include + namespace relpipe { namespace in { namespace asn1 { namespace lib { class ASN1ContentHandler { +public: + + virtual ~ASN1ContentHandler() = default; + + virtual void abc() = 0; // FIXME: remove dummy method + virtual void def(int a) = 0; // FIXME: remove dummy method + virtual void ghi(int a, int b) = 0; // FIXME: remove dummy method + }; +class ASN1ContentHandlerProxy : public ASN1ContentHandler { +private: + std::vector> handlers; +public: + + void addHandler(std::shared_ptr handler) { + handlers.push_back(handler); + } + +#define handler for (auto ___h : handlers) ___h + + void abc() override { + handler->abc(); + } + + void def(int a) override { + handler->def(a); + } + + void ghi(int a, int b) override { + handler->ghi(a, b); + } + +#undef handler + +}; + + } } } diff -r 68026fe3aaf5 -r 7230e1ea0b07 src/lib/ASN1Reader.h --- a/src/lib/ASN1Reader.h Sun Mar 14 19:58:35 2021 +0100 +++ b/src/lib/ASN1Reader.h Sat Jun 12 18:34:19 2021 +0200 @@ -29,8 +29,13 @@ class ASN1Reader : public AbstractParser { public: virtual ~ASN1Reader() = default; - virtual void addHandler(std::shared_ptr handler) = 0; - virtual void process() = 0; + + virtual void addHandler(std::shared_ptr handler) { + handlers.addHandler(handler); + }; + +protected: + ASN1ContentHandlerProxy handlers; }; } diff -r 68026fe3aaf5 -r 7230e1ea0b07 src/lib/BasicASN1Reader.h --- a/src/lib/BasicASN1Reader.h Sun Mar 14 19:58:35 2021 +0100 +++ b/src/lib/BasicASN1Reader.h Sat Jun 12 18:34:19 2021 +0200 @@ -17,6 +17,7 @@ #pragma once #include +#include #include "ASN1Reader.h" @@ -29,19 +30,6 @@ * Reads ASN.1 data encoded as BER (DER, CER). */ class BasicASN1Reader : public ASN1Reader { -public: - virtual ~BasicASN1Reader() = default; - - virtual void addHandler(std::shared_ptr handler) { - }; - - virtual void process() { - }; - - static ASN1Reader* create(std::istream& input) { - return new BasicASN1Reader(); - } - private: enum class State { @@ -57,11 +45,11 @@ void update() override { if (state == State::A) { - + } else if (state == State::B) { - + } else if (state == State::C) { - + } diff -r 68026fe3aaf5 -r 7230e1ea0b07 src/lib/DOMBuildingSAXContentHandler.h --- a/src/lib/DOMBuildingSAXContentHandler.h Sun Mar 14 19:58:35 2021 +0100 +++ b/src/lib/DOMBuildingSAXContentHandler.h Sat Jun 12 18:34:19 2021 +0200 @@ -29,14 +29,19 @@ private: xmlpp::Document* document; +public: + DOMBuildingSAXContentHandler(xmlpp::Document* document) : document(document) { } -public: + void abc() override { + }; - static DOMBuildingSAXContentHandler* create(xmlpp::Document* document) { - return new DOMBuildingSAXContentHandler(document); - } + void def(int a) override { + }; + + void ghi(int a, int b) override { + }; }; diff -r 68026fe3aaf5 -r 7230e1ea0b07 src/lib/GenericASN1ContentHandler.h --- a/src/lib/GenericASN1ContentHandler.h Sun Mar 14 19:58:35 2021 +0100 +++ b/src/lib/GenericASN1ContentHandler.h Sat Jun 12 18:34:19 2021 +0200 @@ -16,12 +16,40 @@ */ #pragma once +#include "ASN1ContentHandler.h" +#include "SAXContentHandler.h" + namespace relpipe { namespace in { namespace asn1 { namespace lib { +/** + * Converts ASN.1 events to XML SAX events. + * + * Does not need to know anything about the model/schema – works with generic events (nodes). + */ class GenericASN1ContentHandler : public ASN1ContentHandler { +private: + SAXContentHandlerProxy handlers; +public: + + void addHandler(std::shared_ptr handler) { + handlers.addHandler(handler); + } + + virtual ~GenericASN1ContentHandler() { + } + + void abc() override { + }; + + void def(int a) override { + }; + + void ghi(int a, int b) override { + }; + }; } diff -r 68026fe3aaf5 -r 7230e1ea0b07 src/lib/SAXContentHandler.h --- a/src/lib/SAXContentHandler.h Sun Mar 14 19:58:35 2021 +0100 +++ b/src/lib/SAXContentHandler.h Sat Jun 12 18:34:19 2021 +0200 @@ -26,6 +26,37 @@ virtual ~SAXContentHandler() = default; + virtual void abc() = 0; // FIXME: remove dummy method + virtual void def(int a) = 0; // FIXME: remove dummy method + virtual void ghi(int a, int b) = 0; // FIXME: remove dummy method + +}; + +class SAXContentHandlerProxy : public SAXContentHandler { +private: + std::vector> handlers; +public: + + void addHandler(std::shared_ptr handler) { + handlers.push_back(handler); + } + +#define handler for (auto ___h : handlers) ___h + + void abc() override { + handler->abc(); + } + + void def(int a) override { + handler->def(a); + } + + void ghi(int a, int b) override { + handler->ghi(a, b); + } + +#undef handler + }; }