diff options
author | randomdan <randomdan@localhost> | 2012-03-19 08:46:03 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2012-03-19 08:46:03 +0000 |
commit | 1701f57f5dd0a8c8ad1c987ff947f5294cdf29f2 (patch) | |
tree | 7c231fc79af0651c68575c064127ff88b3513d8b | |
parent | Increased control over nesting and output; allows cut down output suitable fo... (diff) | |
download | project2-1701f57f5dd0a8c8ad1c987ff947f5294cdf29f2.tar.bz2 project2-1701f57f5dd0a8c8ad1c987ff947f5294cdf29f2.tar.xz project2-1701f57f5dd0a8c8ad1c987ff947f5294cdf29f2.zip |
Add init function to presenter because none default ones get cached between runs and need resetting
-rw-r--r-- | project2/cgi/cgiStageDefaultError.cpp | 1 | ||||
-rw-r--r-- | project2/cgi/cgiStageDefaultNotFound.cpp | 1 | ||||
-rw-r--r-- | project2/common/presenter.h | 1 | ||||
-rw-r--r-- | project2/common/viewHost.cpp | 1 | ||||
-rw-r--r-- | project2/console/consolePresenter.cpp | 5 | ||||
-rw-r--r-- | project2/console/consolePresenter.h | 1 | ||||
-rw-r--r-- | project2/json/presenter.cpp | 10 | ||||
-rw-r--r-- | project2/xml/xmlPresenter.cpp | 18 | ||||
-rw-r--r-- | project2/xml/xmlPresenter.h | 3 |
9 files changed, 33 insertions, 8 deletions
diff --git a/project2/cgi/cgiStageDefaultError.cpp b/project2/cgi/cgiStageDefaultError.cpp index 70efafc..c5642d5 100644 --- a/project2/cgi/cgiStageDefaultError.cpp +++ b/project2/cgi/cgiStageDefaultError.cpp @@ -29,6 +29,7 @@ CgiApplicationEngine::DefaultErrorStage::getHeader() const CgiApplicationEngine::NextStage CgiApplicationEngine::DefaultErrorStage::run() { + pres->init(); pres->addNamedValue("error-type", env()->scriptNamespacePrefix, buf); pres->addNamedValue("error-what", env()->scriptNamespacePrefix, what.c_str()); return NextStage(NULL, this, pres.get(), pres.get()); diff --git a/project2/cgi/cgiStageDefaultNotFound.cpp b/project2/cgi/cgiStageDefaultNotFound.cpp index 8b3d6cc..5b68bc6 100644 --- a/project2/cgi/cgiStageDefaultNotFound.cpp +++ b/project2/cgi/cgiStageDefaultNotFound.cpp @@ -23,6 +23,7 @@ CgiApplicationEngine::DefaultNotFoundStage::getHeader() const CgiApplicationEngine::NextStage CgiApplicationEngine::DefaultNotFoundStage::run() { + pres->init(); pres->addNamedValue("missing-resource", env()->scriptNamespacePrefix, nf.what()); return NextStage(NULL, this, pres.get(), pres.get()); } diff --git a/project2/common/presenter.h b/project2/common/presenter.h index 662af22..a16b32b 100644 --- a/project2/common/presenter.h +++ b/project2/common/presenter.h @@ -39,6 +39,7 @@ class MultiRowSetPresenter : public RowSetPresenter { virtual void finishRowSet() const = 0; virtual void addNewArray(const Glib::ustring & name, bool objects) const = 0; virtual void finishArray(bool objects) const = 0; + virtual void init() = 0; }; class Presenter : public MultiRowSetPresenter { diff --git a/project2/common/viewHost.cpp b/project2/common/viewHost.cpp index 64a8c8b..cbae417 100644 --- a/project2/common/viewHost.cpp +++ b/project2/common/viewHost.cpp @@ -22,6 +22,7 @@ ViewHost::executeViews() const loadScriptComponents(); MultiRowSetPresenterPtr presenter = getPresenter(); + presenter->init(); BOOST_FOREACH(const Views::value_type & s, views) { s->execute(presenter.get()); } diff --git a/project2/console/consolePresenter.cpp b/project2/console/consolePresenter.cpp index 3979c4e..c76f206 100644 --- a/project2/console/consolePresenter.cpp +++ b/project2/console/consolePresenter.cpp @@ -9,6 +9,11 @@ ConsolePresenter::ConsolePresenter() : } void +ConsolePresenter::init() +{ +} + +void ConsolePresenter::pushSub(const Glib::ustring & name, const Glib::ustring & ns) const { fprintf(stdout, "%*s", indent, ""); diff --git a/project2/console/consolePresenter.h b/project2/console/consolePresenter.h index 0540248..f551063 100644 --- a/project2/console/consolePresenter.h +++ b/project2/console/consolePresenter.h @@ -15,6 +15,7 @@ class ConsolePresenter : public Presenter { void addNewArray(const Glib::ustring&, bool objects) const; void finishArray(bool objects) const; void write(const boost::function1<std::ostream *, const std::string &> &) const; + void init(); private: mutable unsigned int indent; FileStreamVariableWriter out; diff --git a/project2/json/presenter.cpp b/project2/json/presenter.cpp index 01bb915..0eb484b 100644 --- a/project2/json/presenter.cpp +++ b/project2/json/presenter.cpp @@ -13,7 +13,17 @@ class JsonPresenter : public MultiRowSetPresenter, public ContentPresenter, publ SourceOf<json::Object>(s), SourceOf<WritableContent>(s), returnObject(s, "object", Null()) { + } + void init() + { + while (!curRowSet.empty()) { + curRowSet.pop(); + } + object.clear(); curRowSet.push(&object); + while (!vaStack.empty()) { + vaStack.pop(); + } vaStack.push(&JsonPresenter::addValueToObject); } typedef void (JsonPresenter::*ValueAdder)(const Glib::ustring &, const VariableType &) const; diff --git a/project2/xml/xmlPresenter.cpp b/project2/xml/xmlPresenter.cpp index 2650186..02ec82d 100644 --- a/project2/xml/xmlPresenter.cpp +++ b/project2/xml/xmlPresenter.cpp @@ -62,9 +62,9 @@ DECLARE_CUSTOM_COMPONENT_LOADER("xml", XmlPresenter, XmlPresenterLoader, Present XmlPresenter::XmlPresenter(const Glib::ustring & responseRootNodeName, const Glib::ustring & responseStyle, const Glib::ustring & ct) : ContentPresenter(ct), - responseDoc(XmlDocumentPtr(new xmlpp::Document("1.0"))) + root(responseRootNodeName), + style(responseStyle) { - createDoc(responseRootNodeName, responseStyle); } XmlPresenter::XmlPresenter(ScriptNodePtr e) : @@ -74,9 +74,9 @@ XmlPresenter::XmlPresenter(ScriptNodePtr e) : SourceOf<_xmlDoc>(e), SourceOf<boost::shared_ptr<xmlpp::Document> >(e), SourceOf<WritableContent>(e), - responseDoc(XmlDocumentPtr(new xmlpp::Document("1.0"))) + root(e, "root"), + style(e, "style", Null()) { - createDoc(e->value("root"), e->value("style", "")); } XmlPresenter::~XmlPresenter() @@ -84,15 +84,17 @@ XmlPresenter::~XmlPresenter() } void -XmlPresenter::createDoc(const Glib::ustring & responseRootNodeName, const Glib::ustring & responseStyle) const +XmlPresenter::init() { - nodeStack.push_back(responseDoc->create_root_node(responseRootNodeName)); + responseDoc = XmlDocumentPtr(new xmlpp::Document("1.0")); + nodeStack.clear(); + nodeStack.push_back(responseDoc->create_root_node(root())); declareNamespace(Environment::getCurrent()->scriptNamespacePrefix, Environment::getCurrent()->scriptNamespace); // XSLT Style char * buf; - if (!responseStyle.empty() && asprintf(&buf, "type=\"text/xsl\" href=\"%s\"", - responseStyle.c_str()) > 0) { + if (!style().isNull() && asprintf(&buf, "type=\"text/xsl\" href=\"%s\"", + style().as<const char *>()) > 0) { xmlAddPrevSibling(nodeStack.back()->cobj(), xmlNewDocPI(responseDoc->cobj(), BAD_CAST "xml-stylesheet", BAD_CAST buf)); free(buf); diff --git a/project2/xml/xmlPresenter.h b/project2/xml/xmlPresenter.h index 1c4391a..dc88fa9 100644 --- a/project2/xml/xmlPresenter.h +++ b/project2/xml/xmlPresenter.h @@ -33,11 +33,14 @@ class XmlPresenter : public Presenter, public ContentPresenter, public SourceOf< Class getContentClass() const; Glib::ustring getContentType() const; void writeTo(std::ostream &, const std::string & enc) const; + void init(); private: void createDoc(const Glib::ustring & responseRootNodeName, const Glib::ustring & responseStyle) const; XmlDocumentPtr responseDoc; mutable std::vector<xmlpp::Element *> nodeStack; + const Variable root; + const Variable style; }; typedef boost::intrusive_ptr<XmlPresenter> XmlPresenterPtr; |