diff options
Diffstat (limited to 'project2/streams/viewStream.cpp')
-rw-r--r-- | project2/streams/viewStream.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/project2/streams/viewStream.cpp b/project2/streams/viewStream.cpp new file mode 100644 index 0000000..77ecf45 --- /dev/null +++ b/project2/streams/viewStream.cpp @@ -0,0 +1,52 @@ +#include "scriptLoader.h" +#include "stream.h" +#include "scopeObject.h" +#include "ostreamWrapper.h" +#include "viewHost.h" +#include <boost/iostreams/stream.hpp> +#include <boost/iostreams/concepts.hpp> + +class SinkStream : public boost::iostreams::sink { + public: + SinkStream(const Stream::Sink & s) : + sink(s) + { + } + std::streamsize write(const char * data, std::streamsize len) + { + return sink(data, len); + } + + const Stream::Sink & sink; +}; + +class ViewStream : public Stream, public ViewHost { + public: + ViewStream(ScriptNodePtr p) : + CheckHost(p), + Stream(p), + ViewHost(p) + { + p->script->loader.addLoadTarget(p, Storer::into<PresenterLoader>(&presenter)); + } + void runStream(const Stream::Sink & s) const + { + TransformSourcePtr t = boost::dynamic_pointer_cast<TransformSource>(getPresenter()); + if (t) { + boost::iostreams::stream<SinkStream> strm(s); + ostreamWrapper * o = new ostreamWrapper(strm); + executeViews(); + t->addTarget(o); + ScopeObject remove([&t] { t->clearTargets(); }); + doTransforms(); + } + } + + private: + MultiRowSetPresenterPtr getPresenter() const { + return presenter; + } + MultiRowSetPresenterPtr presenter; +}; + +DECLARE_LOADER("viewstream", ViewStream); |