diff -r 9aed8c2ea97d -r 3ab78bf63467 src/StreamInputSource.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/StreamInputSource.h Fri Jan 11 00:29:32 2019 +0100 @@ -0,0 +1,72 @@ +/** + * Relational pipes + * Copyright © 2018 František Kučera (Frantovo.cz, GlobalCode.info) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +#include + +#include +#include +#include + +namespace relpipe { +namespace in { +namespace xml { + +class StreamInputSource : public xercesc::InputSource { +private: + std::istream& input; + + class StreamBinInputStream : public xercesc::BinInputStream { + private: + std::istream& input; + public: + + StreamBinInputStream(std::istream& input) : BinInputStream(), input(input) { + } + + XMLFilePos curPos() const override { + return input.tellg(); + } + + const XMLCh* getContentType() const override { + return nullptr; + } + + XMLSize_t readBytes(XMLByte * const toFill, const XMLSize_t maxToRead) override { + input.read((char*) toFill, maxToRead); + return input.gcount(); + } + }; + +public: + + StreamInputSource(std::istream& input, xercesc::MemoryManager * const manager = xercesc::XMLPlatformUtils::fgMemoryManager) : InputSource(manager), input(input) { + } + + virtual ~StreamInputSource() { + } + + xercesc::BinInputStream* makeStream() const override { + // TODO: avoid multiple calls, input can be used only once + return new StreamBinInputStream(input); + } +}; + +} +} +} \ No newline at end of file