summaryrefslogtreecommitdiff
path: root/project2/streams/viewStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'project2/streams/viewStream.cpp')
-rw-r--r--project2/streams/viewStream.cpp52
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);