diff options
Diffstat (limited to 'project2/cgi/cgiAppEngine.h')
-rw-r--r-- | project2/cgi/cgiAppEngine.h | 78 |
1 files changed, 55 insertions, 23 deletions
diff --git a/project2/cgi/cgiAppEngine.h b/project2/cgi/cgiAppEngine.h index cfab7c4..de9b95a 100644 --- a/project2/cgi/cgiAppEngine.h +++ b/project2/cgi/cgiAppEngine.h @@ -47,19 +47,29 @@ class CgiApplicationEngine : public ApplicationEngine { class Stage; typedef boost::intrusive_ptr<Stage> StagePtr; + /// Base class for a stage iteration that should eventually produce a response for the client class Stage : public virtual CommonObjects { public: - Stage(); + Stage(const CgiEnvironment * e); virtual ~Stage() = 0; virtual StagePtr run() = 0; - virtual XmlDocPtr getDataDocument() const = 0; - virtual HttpHeaderPtr getHeader() const = 0; + virtual XmlDocPtr getDataDocument() const; + virtual HttpHeaderPtr getHeader() const; + protected: + const CgiEnvironment * e; + }; + + /// 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(); }; + /// Stage to process POST requests class RequestStage : public Stage, public XmlPresenter, RequestHost { public: - RequestStage(const std::string & id); - virtual ~RequestStage(); + RequestStage(const CgiEnvironment *, const std::string & id); virtual StagePtr run(); virtual XmlDocPtr getDataDocument() const; @@ -77,51 +87,73 @@ class CgiApplicationEngine : public ApplicationEngine { static const Glib::ustring style; }; - class PresentStage : public Stage, public XmlProcessPresenter { + /// Stage to process GET requests and follow up RequestStages + class PresentStage : public virtual Stage, public XmlProcessPresenter { public: - PresentStage(const std::string & id); - virtual ~PresentStage(); + 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 HttpHeaderPtr getHeader() const; }; - class FailStage : public Stage, public XmlPresenter { + /// The built-in fail-safe not found stage + class DefaultNotFoundStage : public virtual Stage, public XmlPresenter { public: - FailStage(const CgiEnvironment *); - virtual ~FailStage(); + DefaultNotFoundStage(const CgiEnvironment *, const XmlScriptParser::NotFound &); - virtual const Glib::ustring & getResponseStyle() const; + virtual XmlDocPtr getDataDocument() const; + 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 CgiEnvironment * e; + const XmlScriptParser::NotFound nf; + }; - protected: - const CgiEnvironment * env; + /// 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; + virtual HttpHeaderPtr getHeader() const; + virtual const Glib::ustring & getResponseRootNodeName() const; + virtual const Glib::ustring & getResponseStyle() const; }; - class NotFoundStage : public FailStage { + /// The built-in fail-safe unhandled error stage + class DefaultErrorStage : public virtual Stage, public XmlPresenter { public: - NotFoundStage(const CgiEnvironment *, const XmlScriptParser::NotFound &); - virtual ~NotFoundStage(); + DefaultErrorStage(const CgiEnvironment *, const std::exception &); + ~DefaultErrorStage(); virtual XmlDocPtr getDataDocument() const; 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 CgiEnvironment * e; + char * buf; + std::string what; }; - class ErrorStage : public FailStage { + /// Custom unhandled error handling stage + class CustomErrorStage : public DefaultErrorStage, public PresentStage { public: - ErrorStage(const CgiEnvironment *, const std::exception &); - virtual ~ErrorStage(); - + CustomErrorStage(const CgiEnvironment *, const std::exception &); + virtual StagePtr run(); virtual XmlDocPtr getDataDocument() const; virtual HttpHeaderPtr getHeader() const; virtual const Glib::ustring & getResponseRootNodeName() const; - private: - static const Glib::ustring resp; + virtual const Glib::ustring & getResponseStyle() const; }; + mutable StagePtr currentStage; mutable UUID sessionID; }; |