diff options
Diffstat (limited to 'project2/cgi/cgiAppEngine.h')
-rw-r--r-- | project2/cgi/cgiAppEngine.h | 84 |
1 files changed, 37 insertions, 47 deletions
diff --git a/project2/cgi/cgiAppEngine.h b/project2/cgi/cgiAppEngine.h index 78f796f..e2ad1a2 100644 --- a/project2/cgi/cgiAppEngine.h +++ b/project2/cgi/cgiAppEngine.h @@ -4,11 +4,14 @@ #include "../appEngine.h" #include "../task.h" #include "../paramChecker.h" -#include "../xmlPresenter.h" #include "../commonObjects.h" #include "../uuid.h" -#include "../requestHost.h" +#include "../taskHost.h" +#include "../viewHost.h" +#include "../transform.h" +#include "../xmlPresenter.h" #include <boost/intrusive_ptr.hpp> +#include <boost/tuple/tuple.hpp> class CgiEnvironment; class Session; @@ -19,16 +22,15 @@ namespace xmlpp { class Document; } -class CgiApplicationEngine : public ApplicationEngine { +class CgiApplicationEngine : public ApplicationEngine, public TransformChainLink { public: typedef boost::shared_ptr<xmlpp::Document> XmlDocPtr; typedef boost::shared_ptr<cgicc::HTTPHeader> HttpHeaderPtr; - CgiApplicationEngine(const CgiEnvironment *); + CgiApplicationEngine(const CgiEnvironment *, std::ostream &); virtual ~CgiApplicationEngine(); void process() const; - void write(std::ostream &) const; const Environment * env() const; SessionPtr session() const; virtual Glib::ustring resolveCurrentConfig() const; @@ -45,115 +47,103 @@ class CgiApplicationEngine : public ApplicationEngine { bool checkDomain(const DomainPlatforms::value_type & i) const; void loadEngineSection(const xmlpp::Element *) const; + public: class Stage; + class ResponseStage; typedef boost::intrusive_ptr<Stage> StagePtr; + typedef boost::intrusive_ptr<ResponseStage> ResponseStagePtr; + typedef boost::tuple<StagePtr, ResponseStagePtr, TransformSourcePtr, PresenterPtr> NextStage; /// Base class for a stage iteration that should eventually produce a response for the client - class Stage : public virtual CommonObjects { + class Stage : public virtual IntrusivePtrBase { public: Stage(const CgiEnvironment * e); virtual ~Stage() = 0; - virtual StagePtr run() = 0; - virtual XmlDocPtr getDataDocument() const; - virtual HttpHeaderPtr getHeader() const; + virtual NextStage run() = 0; protected: const CgiEnvironment * e; }; + /// Base class for a stage that can be a response to the client + class ResponseStage : public Stage { + public: + ResponseStage(const CgiEnvironment * e); + virtual HttpHeaderPtr getHeader() const = 0; + }; + /// Stage implementation used to bootstrap the iteration process based on the CGI environment class InitialStage : public Stage { public: InitialStage(const CgiEnvironment * e); - virtual StagePtr run(); + virtual NextStage run(); }; /// Stage to process POST requests - class RequestStage : public Stage, public XmlPresenter, RequestHost { + class RequestStage : public ResponseStage, TaskHost { public: RequestStage(const CgiEnvironment *, const std::string & id); - virtual StagePtr run(); - virtual XmlDocPtr getDataDocument() const; + virtual NextStage run(); virtual HttpHeaderPtr getHeader() const; - virtual const Glib::ustring & getResponseRootNodeName() const; - virtual const Glib::ustring & getResponseStyle() const; - protected: std::string present; - typedef Storage<ParamChecker>::Objects ParamCheckers; - ParamCheckers parameterChecks; - - private: - static const Glib::ustring resp; - static const Glib::ustring style; }; /// Stage to process GET requests and follow up RequestStages - class PresentStage : public virtual Stage, public XmlProcessPresenter { + class PresentStage : public virtual ResponseStage, ViewHost { public: PresentStage(const CgiEnvironment * e, const std::string & id); PresentStage(const CgiEnvironment * e, const std::string & group, const std::string & id); - virtual StagePtr run(); - virtual XmlDocPtr getDataDocument() const; + virtual NextStage run(); virtual HttpHeaderPtr getHeader() const; }; /// The built-in fail-safe not found stage - class DefaultNotFoundStage : public virtual Stage, public XmlPresenter { + class DefaultNotFoundStage : public virtual ResponseStage { public: DefaultNotFoundStage(const CgiEnvironment *, const XmlScriptParser::NotFound &); - virtual XmlDocPtr getDataDocument() const; + virtual NextStage run(); virtual HttpHeaderPtr getHeader() const; - virtual StagePtr run(); - virtual const Glib::ustring & getResponseRootNodeName() const; - virtual const Glib::ustring & getResponseStyle() const; private: - static const Glib::ustring resp; const XmlScriptParser::NotFound nf; + XmlPresenterPtr pres; }; /// Custom not found handling stage class CustomNotFoundStage : public DefaultNotFoundStage, public PresentStage { public: - CustomNotFoundStage(const CgiEnvironment *, const XmlScriptParser::NotFound &); - virtual StagePtr run(); - virtual XmlDocPtr getDataDocument() const; + CustomNotFoundStage(const CgiEnvironment *, const ::XmlScriptParser::NotFound &); + virtual NextStage run(); virtual HttpHeaderPtr getHeader() const; - virtual const Glib::ustring & getResponseRootNodeName() const; - virtual const Glib::ustring & getResponseStyle() const; }; /// The built-in fail-safe unhandled error stage - class DefaultErrorStage : public virtual Stage, public XmlPresenter { + class DefaultErrorStage : public virtual ResponseStage { public: DefaultErrorStage(const CgiEnvironment *, const std::exception &); ~DefaultErrorStage(); - virtual XmlDocPtr getDataDocument() const; + virtual NextStage run(); virtual HttpHeaderPtr getHeader() const; - virtual StagePtr run(); - virtual const Glib::ustring & getResponseRootNodeName() const; - virtual const Glib::ustring & getResponseStyle() const; private: - static const Glib::ustring resp; char * buf; std::string what; + XmlPresenterPtr pres; }; /// Custom unhandled error handling stage class CustomErrorStage : public DefaultErrorStage, public PresentStage { public: CustomErrorStage(const CgiEnvironment *, const std::exception &); - virtual StagePtr run(); - virtual XmlDocPtr getDataDocument() const; + virtual NextStage run(); virtual HttpHeaderPtr getHeader() const; - virtual const Glib::ustring & getResponseRootNodeName() const; - virtual const Glib::ustring & getResponseStyle() const; }; - mutable StagePtr currentStage; + private: + mutable NextStage currentStage; mutable UUID sessionID; + mutable std::ostream & IO; }; #endif |