diff options
author | randomdan <randomdan@localhost> | 2012-01-01 04:26:45 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2012-01-01 04:26:45 +0000 |
commit | 4c53ec26519716e086e67796dc15a0e7dce70bd0 (patch) | |
tree | 9b938a3d4f289a42b3543ac4327bc9f5ea644aba /project2/cgi | |
parent | Remove useless typedef requiring extra template parameter (diff) | |
download | project2-4c53ec26519716e086e67796dc15a0e7dce70bd0.tar.bz2 project2-4c53ec26519716e086e67796dc15a0e7dce70bd0.tar.xz project2-4c53ec26519716e086e67796dc15a0e7dce70bd0.zip |
Regeneralise some code
Fully customisable output chain
Minor supporting tweaks here and there
Diffstat (limited to 'project2/cgi')
-rw-r--r-- | project2/cgi/cgiAppEngine.cpp | 44 | ||||
-rw-r--r-- | project2/cgi/cgiAppEngine.h | 9 | ||||
-rw-r--r-- | project2/cgi/cgiHttpHeader.cpp | 7 | ||||
-rw-r--r-- | project2/cgi/cgiHttpHeader.h | 1 | ||||
-rw-r--r-- | project2/cgi/cgiStageCustomError.cpp | 4 | ||||
-rw-r--r-- | project2/cgi/cgiStageCustomNotFound.cpp | 4 | ||||
-rw-r--r-- | project2/cgi/cgiStageDefaultError.cpp | 2 | ||||
-rw-r--r-- | project2/cgi/cgiStageDefaultNotFound.cpp | 2 | ||||
-rw-r--r-- | project2/cgi/cgiStagePresent.cpp | 22 | ||||
-rw-r--r-- | project2/cgi/cgiStageRequest.cpp | 9 |
10 files changed, 74 insertions, 30 deletions
diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index 8d079f9..8093ef3 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -4,7 +4,6 @@ #include <cgicc/HTTPHeader.h> #include "cgiEnvironment.h" #include "iterate.h" -#include "logger.h" #include <boost/bind.hpp> #include <boost/foreach.hpp> #include "ostreamWrapper.h" @@ -44,6 +43,43 @@ CgiApplicationEngine::env() const return _env; } +class CgiResult : public TransformChainLink { + public: + CgiResult(CgiApplicationEngine::HttpHeaderPtr & h, std::ostream & s) : + header(h), + stream(s) { + } + CgiApplicationEngine::HttpHeaderPtr header; + std::ostream & stream; +}; + +class WriteToCgiResult : public TransformImpl<WritableContent, CgiResult> { + public: + void transform(const WritableContent * wc, CgiResult * cr) const { + cr->header->addHeader("Content-Type", wc->getContentType()); + cr->header->render(cr->stream); + wc->writeTo(cr->stream); + } +}; +DECLARE_TRANSFORM(WriteToCgiResult); + +bool +addFinalTransformTarget(TransformSourcePtr ts, TransformChainLink * tcl) +{ + if (ts->getTargets().empty()) { + ts->addTarget(tcl, NULL); + return true; + } + BOOST_FOREACH(const Targets::value_type & t, ts->getTargets()) { + if (TransformSource * tr = dynamic_cast<TransformSource *>(t.first.get())) { + if (addFinalTransformTarget(tr, tcl)) { + return true; + } + } + } + return false; +} + void CgiApplicationEngine::process() const { @@ -89,9 +125,9 @@ CgiApplicationEngine::process() const header->setCookie(cgicc::HTTPCookie(SESSIONID, cursession->ID.str(), "Session ID", _env->getServerName().substr(_env->getServerName().find(".")), env()->sessionTimeOut, "/", false)); } - header->render(IO); if (currentStage.get<2>()) { TransformSourcePtr ts = currentStage.get<2>(); + addFinalTransformTarget(ts, new CgiResult(header, IO)); std::fstream * ddd = NULL; if (!_env->dumpdatadoc.empty()) { ddd = new std::fstream(_env->dumpdatadoc.c_str(), std::fstream::trunc | std::fstream::out); @@ -99,12 +135,14 @@ CgiApplicationEngine::process() const ts->addTarget(new ostreamWrapper(*ddd)); } } - ts->addTarget(new ostreamWrapper(IO)); ts->doTransforms(); if (ddd) { delete ddd; } } + else { + header->render(IO); + } } CgiApplicationEngine::Stage::Stage(const CgiEnvironment * env) : diff --git a/project2/cgi/cgiAppEngine.h b/project2/cgi/cgiAppEngine.h index e339576..80dad6e 100644 --- a/project2/cgi/cgiAppEngine.h +++ b/project2/cgi/cgiAppEngine.h @@ -13,6 +13,7 @@ #include <boost/intrusive_ptr.hpp> #include <boost/tuple/tuple.hpp> #include "cgiOutputOptions.h" +#include "cgiHttpHeader.h" class CgiEnvironment; class Session; @@ -23,7 +24,7 @@ namespace cgicc { class CgiApplicationEngine : public ApplicationEngine, public TransformChainLink { public: - typedef boost::shared_ptr<cgicc::HTTPHeader> HttpHeaderPtr; + typedef boost::shared_ptr<Project2HttpHeader> HttpHeaderPtr; CgiApplicationEngine(const CgiEnvironment *, std::ostream &); virtual ~CgiApplicationEngine(); @@ -94,9 +95,13 @@ class CgiApplicationEngine : public ApplicationEngine, public TransformChainLink class PresentStage : public virtual ResponseStage, ViewHost { public: PresentStage(const CgiEnvironment * e, ScriptReaderPtr); - + MultiRowSetPresenterPtr getPresenter() const; + virtual NextStage run(); virtual HttpHeaderPtr getHeader() const; + protected: + mutable MultiRowSetPresenterPtr presenter; + ScriptNodePtr root; }; /// The built-in fail-safe not found stage diff --git a/project2/cgi/cgiHttpHeader.cpp b/project2/cgi/cgiHttpHeader.cpp index 20b20ea..b71a647 100644 --- a/project2/cgi/cgiHttpHeader.cpp +++ b/project2/cgi/cgiHttpHeader.cpp @@ -8,13 +8,6 @@ Project2HttpHeader::Project2HttpHeader(const std::string & s) : addHeader("Status", s); } -Project2HttpHeader::Project2HttpHeader(const std::string & s, const std::string & t) : - cgicc::HTTPHeader("") -{ - addHeader("Status", s); - addHeader("Content-Type", t); -} - void Project2HttpHeader::addHeader(const std::string & name, const Glib::ustring & value) { diff --git a/project2/cgi/cgiHttpHeader.h b/project2/cgi/cgiHttpHeader.h index 87edde5..ffa5e70 100644 --- a/project2/cgi/cgiHttpHeader.h +++ b/project2/cgi/cgiHttpHeader.h @@ -10,7 +10,6 @@ class Project2HttpHeader : public cgicc::HTTPHeader { public: typedef std::map<std::string, const Glib::ustring> Headers; Project2HttpHeader(const std::string & s); - Project2HttpHeader(const std::string & s, const std::string & t); void addHeader(const std::string & name, const Glib::ustring & value); void render(std::ostream & out) const; private: diff --git a/project2/cgi/cgiStageCustomError.cpp b/project2/cgi/cgiStageCustomError.cpp index 82fc6a1..eb66ff0 100644 --- a/project2/cgi/cgiStageCustomError.cpp +++ b/project2/cgi/cgiStageCustomError.cpp @@ -6,8 +6,8 @@ CgiApplicationEngine::CustomErrorStage::CustomErrorStage(const CgiEnvironment * env, const std::exception & ex, ScriptReaderPtr s) : CgiApplicationEngine::ResponseStage(env), - ::CommonObjects(s), - ::CheckHost(s), + ::CommonObjects(s->root()), + ::CheckHost(s->root()), CgiApplicationEngine::DefaultErrorStage(env, ex), CgiApplicationEngine::PresentStage(env, s) { diff --git a/project2/cgi/cgiStageCustomNotFound.cpp b/project2/cgi/cgiStageCustomNotFound.cpp index 8a224fa..e6520dd 100644 --- a/project2/cgi/cgiStageCustomNotFound.cpp +++ b/project2/cgi/cgiStageCustomNotFound.cpp @@ -6,8 +6,8 @@ CgiApplicationEngine::CustomNotFoundStage::CustomNotFoundStage(const CgiEnvironment * env, const ScriptNotFound & notfound, ScriptReaderPtr s) : CgiApplicationEngine::ResponseStage(env), - ::CommonObjects(s), - ::CheckHost(s), + ::CommonObjects(s->root()), + ::CheckHost(s->root()), CgiApplicationEngine::DefaultNotFoundStage(env, notfound), CgiApplicationEngine::PresentStage(env, s) { diff --git a/project2/cgi/cgiStageDefaultError.cpp b/project2/cgi/cgiStageDefaultError.cpp index ad27d2d..e464981 100644 --- a/project2/cgi/cgiStageDefaultError.cpp +++ b/project2/cgi/cgiStageDefaultError.cpp @@ -23,7 +23,7 @@ CgiApplicationEngine::DefaultErrorStage::~DefaultErrorStage() CgiApplicationEngine::HttpHeaderPtr CgiApplicationEngine::DefaultErrorStage::getHeader() const { - return HttpHeaderPtr(new Project2HttpHeader("500 Internal Server Error", pres->contentType)); + return HttpHeaderPtr(new Project2HttpHeader("500 Internal Server Error")); } CgiApplicationEngine::NextStage diff --git a/project2/cgi/cgiStageDefaultNotFound.cpp b/project2/cgi/cgiStageDefaultNotFound.cpp index be32658..2cf0475 100644 --- a/project2/cgi/cgiStageDefaultNotFound.cpp +++ b/project2/cgi/cgiStageDefaultNotFound.cpp @@ -17,7 +17,7 @@ CgiApplicationEngine::DefaultNotFoundStage::DefaultNotFoundStage(const CgiEnviro CgiApplicationEngine::HttpHeaderPtr CgiApplicationEngine::DefaultNotFoundStage::getHeader() const { - return HttpHeaderPtr(new Project2HttpHeader("404 Not found", pres->contentType)); + return HttpHeaderPtr(new Project2HttpHeader("404 Not found")); } CgiApplicationEngine::NextStage diff --git a/project2/cgi/cgiStagePresent.cpp b/project2/cgi/cgiStagePresent.cpp index 8eb0487..1330cdc 100644 --- a/project2/cgi/cgiStagePresent.cpp +++ b/project2/cgi/cgiStagePresent.cpp @@ -7,11 +7,13 @@ CgiApplicationEngine::PresentStage::PresentStage(const CgiEnvironment * e, ScriptReaderPtr s) : CgiApplicationEngine::ResponseStage(e), - CommonObjects(s), - CheckHost(s), - ViewHost(s) + CommonObjects(s->root()), + CheckHost(s->root()), + ViewHost(s->root()), + root(s->root()) { s->loader.addLoadTarget(s->root(), Storer::into<OutputOptionsLoader>(&outputOptions)); + s->loader.addLoadTarget(s->root(), Storer::into<PresenterLoader>(&presenter)); } CgiApplicationEngine::NextStage @@ -19,7 +21,7 @@ CgiApplicationEngine::PresentStage::run() { runChecks(); try { - executeViews(boost::bind(&PresenterLoader::createFrom, LoaderBase::getLoader<PresenterLoader, NotSupported>(e->defaultPresenter), _1)); + executeViews(); return NextStage(NULL, this, boost::dynamic_pointer_cast<TransformSource>(presenter), presenter); } catch (ResponseStagePtr p) { @@ -30,6 +32,15 @@ CgiApplicationEngine::PresentStage::run() } } +MultiRowSetPresenterPtr +CgiApplicationEngine::PresentStage::getPresenter() const +{ + if (!presenter) { + presenter = LoaderBase::getLoader<PresenterLoader, NotSupported>(e->defaultPresenter)->createFrom(root); + } + return presenter; +} + CgiApplicationEngine::ResponseStage::ResponseStage(const CgiEnvironment * e) : CgiApplicationEngine::Stage(e) { @@ -38,8 +49,7 @@ CgiApplicationEngine::ResponseStage::ResponseStage(const CgiEnvironment * e) : CgiApplicationEngine::HttpHeaderPtr CgiApplicationEngine::PresentStage::getHeader() const { - const ContentPresenter * cp = dynamic_cast<const ContentPresenter *>(presenter.get()); - Project2HttpHeader * header = new Project2HttpHeader("200 OK", cp ? cp->contentType : "text/plain; charset=UTF-8"); + Project2HttpHeader * header = new Project2HttpHeader("200 OK"); header->addHeader("Cache-control", "no-cache"); return HttpHeaderPtr(header); } diff --git a/project2/cgi/cgiStageRequest.cpp b/project2/cgi/cgiStageRequest.cpp index ac8516b..d505f3c 100644 --- a/project2/cgi/cgiStageRequest.cpp +++ b/project2/cgi/cgiStageRequest.cpp @@ -7,10 +7,10 @@ CgiApplicationEngine::RequestStage::RequestStage(const CgiEnvironment * e, ScriptReaderPtr s) : SourceObject(s->root()), - CommonObjects(s), - ::CheckHost(s), + CommonObjects(s->root()), + ::CheckHost(s->root()), CgiApplicationEngine::ResponseStage(e), - ::TaskHost(s), + ::TaskHost(s->root()), present(s->root()->value("present","").as<std::string>()) { } @@ -23,11 +23,10 @@ CgiApplicationEngine::RequestStage::run() return NextStage(present.empty() ? NULL : new PresentStage(e, e->resolveScript(e->presentRoot, present, false)), this); } -const std::string contentType = "text/plain"; CgiApplicationEngine::HttpHeaderPtr CgiApplicationEngine::RequestStage::getHeader() const { - Project2HttpHeader * header = new Project2HttpHeader("200 OK", contentType); + Project2HttpHeader * header = new Project2HttpHeader("200 OK"); header->addHeader("Cache-control", "no-cache"); return HttpHeaderPtr(header); } |