diff options
-rw-r--r-- | project2/cgi/cgiStagePresent.cpp | 4 | ||||
-rw-r--r-- | project2/common/viewHost.cpp | 72 | ||||
-rw-r--r-- | project2/common/viewHost.h | 18 | ||||
-rw-r--r-- | project2/common/xmlStorage.h | 24 | ||||
-rw-r--r-- | project2/console/consoleAppEngine.cpp | 2 |
5 files changed, 35 insertions, 85 deletions
diff --git a/project2/cgi/cgiStagePresent.cpp b/project2/cgi/cgiStagePresent.cpp index df05465..f1fd5e3 100644 --- a/project2/cgi/cgiStagePresent.cpp +++ b/project2/cgi/cgiStagePresent.cpp @@ -19,7 +19,7 @@ CgiApplicationEngine::PresentStage::run() runChecks(); try { executeViews(boost::bind(&PresenterLoader::createFrom, LoaderBase::getLoader<PresenterLoader, NotSupported>(e->defaultPresenter), _1)); - return NextStage(NULL, this, boost::dynamic_pointer_cast<TransformSource>(headPresenter()), headPresenter()); + return NextStage(NULL, this, boost::dynamic_pointer_cast<TransformSource>(presenter), presenter); } catch (ResponseStagePtr p) { return NextStage(NULL, p, boost::dynamic_pointer_cast<TransformSource>(p), boost::dynamic_pointer_cast<Presenter>(p)); @@ -37,7 +37,7 @@ CgiApplicationEngine::ResponseStage::ResponseStage(const CgiEnvironment * e) : CgiApplicationEngine::HttpHeaderPtr CgiApplicationEngine::PresentStage::getHeader() const { - ContentPresenter * cp = boost::dynamic_pointer_cast<ContentPresenter>(headPresenter()).get(); + ContentPresenter * cp = boost::dynamic_pointer_cast<ContentPresenter>(presenter).get(); Project2HttpHeader * header = new Project2HttpHeader("200 OK", cp ? cp->contentType : "text/plain"); header->addHeader("Cache-control", "no-cache"); return HttpHeaderPtr(header); diff --git a/project2/common/viewHost.cpp b/project2/common/viewHost.cpp index 7f7d6c7..01cf966 100644 --- a/project2/common/viewHost.cpp +++ b/project2/common/viewHost.cpp @@ -11,7 +11,7 @@ ViewHost::ViewHost(const boost::filesystem::path & file) : CheckHost(file) { loader.supportedStorers.insert(Storer::into(&views)); - loader.supportedStorers.insert(Storer::into(&pmp.presenters)); + loader.supportedStorers.insert(Storer::into(&presenter)); } ViewHost::~ViewHost() @@ -22,12 +22,12 @@ void ViewHost::executeViews(const DefaultPresenterProvider & dpp) const { parseDocument(); - if (pmp.presenters.empty()) { - pmp.presenters.insert(dpp(get_document()->get_root_node())); + if (!presenter) { + presenter = dpp(get_document()->get_root_node()); } BOOST_FOREACH(const Views::value_type & s, views) { - s->execute(&pmp); + s->execute(presenter.get()); } // Caches might open transactions BOOST_FOREACH(const DataSources::value_type & ds, datasources) { @@ -38,68 +38,10 @@ ViewHost::executeViews(const DefaultPresenterProvider & dpp) const void ViewHost::doTransforms() const { - BOOST_FOREACH (const PresenterPtr & p, pmp.presenters) { - TransformSourcePtr ts = boost::dynamic_pointer_cast<TransformSource>(p); - if (ts) { - ts->doTransforms(); - } + TransformSourcePtr ts = boost::dynamic_pointer_cast<TransformSource>(presenter); + if (ts) { + ts->doTransforms(); } } -PresenterPtr -ViewHost::headPresenter() const -{ - return *pmp.presenters.begin(); -} - -void -ViewHost::PresenterMultiplexer::declareNamespace(const Glib::ustring & prefix, const Glib::ustring & ns) const -{ - FOREACH_PRESENTER { p->declareNamespace(prefix, ns); } -} -void -ViewHost::PresenterMultiplexer::setNamespace(const Glib::ustring & prefix, const Glib::ustring & ns) const -{ - FOREACH_PRESENTER { p->setNamespace(prefix, ns); } -} -void -ViewHost::PresenterMultiplexer::pushSub(const Glib::ustring & name) const -{ - FOREACH_PRESENTER { p->pushSub(name); } -} -void -ViewHost::PresenterMultiplexer::pushSub(const Glib::ustring & name, const Glib::ustring & ns) const -{ - FOREACH_PRESENTER { p->pushSub(name, ns); } -} -void -ViewHost::PresenterMultiplexer::addAttribute(const Glib::ustring & name, const VariableType & value) const -{ - FOREACH_PRESENTER { p->addAttribute(name, value); } -} -void -ViewHost::PresenterMultiplexer::addAttribute(const Glib::ustring & name, const Glib::ustring & ns, const VariableType & value) const -{ - FOREACH_PRESENTER { p->addAttribute(name, ns, value); } -} -void -ViewHost::PresenterMultiplexer::addNamedValue(const Glib::ustring & name, const VariableType & value) const -{ - FOREACH_PRESENTER { p->addNamedValue(name, value); } -} -void -ViewHost::PresenterMultiplexer::addNamedValue(const Glib::ustring & name, const Glib::ustring & ns, const VariableType & value) const -{ - FOREACH_PRESENTER { p->addNamedValue(name, ns, value); } -} -void -ViewHost::PresenterMultiplexer::addText(const VariableType & value) const -{ - FOREACH_PRESENTER { p->addText(value); } -} -void -ViewHost::PresenterMultiplexer::popSub() const -{ - FOREACH_PRESENTER { p->popSub(); } -} diff --git a/project2/common/viewHost.h b/project2/common/viewHost.h index d5e8695..920bef0 100644 --- a/project2/common/viewHost.h +++ b/project2/common/viewHost.h @@ -11,21 +11,6 @@ class ViewHost : virtual public XmlScriptParser, virtual public CheckHost { public: - class PresenterMultiplexer : public Presenter { - public: - typedef std::set<PresenterPtr> Presenters; - void declareNamespace(const Glib::ustring & prefix, const Glib::ustring & ns) const; - void setNamespace(const Glib::ustring & prefix, const Glib::ustring & ns) const; - void pushSub(const Glib::ustring & name) const; - void pushSub(const Glib::ustring & name, const Glib::ustring & ns) const; - void addAttribute(const Glib::ustring & name, const VariableType & value) const; - void addAttribute(const Glib::ustring & name, const Glib::ustring & ns, const VariableType & value) const; - void addNamedValue(const Glib::ustring & name, const VariableType & value) const; - void addNamedValue(const Glib::ustring & name, const Glib::ustring & ns, const VariableType & value) const; - void addText(const VariableType & value) const; - void popSub() const; - Presenters presenters; - }; typedef boost::function1<PresenterPtr, const xmlpp::Element *> DefaultPresenterProvider; ViewHost(const boost::filesystem::path & file); @@ -33,10 +18,9 @@ class ViewHost : virtual public XmlScriptParser, virtual public CheckHost { void executeViews(const DefaultPresenterProvider &) const; void doTransforms() const; - PresenterPtr headPresenter() const; + mutable PresenterPtr presenter; private: - mutable PresenterMultiplexer pmp; typedef ANONORDEREDSTORAGEOF(View) Views; Views views; }; diff --git a/project2/common/xmlStorage.h b/project2/common/xmlStorage.h index 73fce0a..a700c64 100644 --- a/project2/common/xmlStorage.h +++ b/project2/common/xmlStorage.h @@ -10,6 +10,8 @@ SimpleMessageException(StoreFailed); +#define SINGLE(X) \ + boost::intrusive_ptr<X> #define STORAGEOF(X) \ std::map<std::string, boost::intrusive_ptr<X> > #define ANONORDEREDSTORAGEOF(X) \ @@ -22,6 +24,8 @@ typedef boost::intrusive_ptr<Storer> StorerPtr; class Storer : public virtual IntrusivePtrBase { public: template <class X> + static StorerPtr into(SINGLE(X) * obj); + template <class X> static StorerPtr into(STORAGEOF(X) * map); template <class X> static StorerPtr into(ANONSTORAGEOF(X) * set); @@ -55,6 +59,20 @@ class StorerImpl : public StorerBase<X, M> { bool insert(const xmlpp::Element *, boost::intrusive_ptr<X> O); }; template <class X> +class StorerImpl<X, SINGLE(X)> : public StorerBase<X, SINGLE(X)> { + public: + typedef SINGLE(X) Obj; + StorerImpl(SINGLE(X) * o) : obj(o) + { + } + bool insert(const xmlpp::Element *, boost::intrusive_ptr<X> O) + { + *obj = O; + return true; + } + Obj * obj; +}; +template <class X> class StorerImpl<X, STORAGEOF(X)> : public StorerBase<X, STORAGEOF(X)> { public: typedef STORAGEOF(X) Map; @@ -98,6 +116,12 @@ class StorerImpl<X, ANONORDEREDSTORAGEOF(X)> : public StorerBase<X, ANONORDEREDS template <class X> StorerPtr +Storer::into(SINGLE(X) * obj) { + return new StorerImpl<X, SINGLE(X)>(obj); +} + +template <class X> +StorerPtr Storer::into(STORAGEOF(X) * map) { return new StorerImpl<X, STORAGEOF(X)>(map); } diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp index ef1a04f..cf0548d 100644 --- a/project2/console/consoleAppEngine.cpp +++ b/project2/console/consoleAppEngine.cpp @@ -41,7 +41,7 @@ ConsoleApplicationEngine::process() const runChecks(); execute(); executeViews(boost::bind(&PresenterLoader::createFrom, LoaderBase::getLoader<PresenterLoader, NotSupported>("console"), _1)); - addAppData(headPresenter().get()); + addAppData(presenter.get()); } catch (const std::exception & e) { char * buf = __cxxabiv1::__cxa_demangle(typeid(e).name(), NULL, NULL, NULL); |