From 328c6ef1b6ce90b7330a51f2492460d3646b81cf Mon Sep 17 00:00:00 2001
From: randomdan <randomdan@localhost>
Date: Fri, 4 Jan 2013 21:51:43 +0000
Subject: Use media-type for content type of XSL transformed documents Allow
 setting up a default transformation chain with default presenters Remove
 mod_transform requirement from sites

---
 project2/cgi/cgiEnvironment.cpp  |  4 ++++
 project2/cgi/cgiEnvironment.h    |  2 ++
 project2/cgi/cgiStagePresent.cpp | 11 ++++++++++-
 project2/xml/transformHtml.cpp   |  6 +++---
 project2/xml/transformHtml.h     |  2 +-
 5 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/project2/cgi/cgiEnvironment.cpp b/project2/cgi/cgiEnvironment.cpp
index 7bb68d2..439f6d8 100644
--- a/project2/cgi/cgiEnvironment.cpp
+++ b/project2/cgi/cgiEnvironment.cpp
@@ -34,6 +34,10 @@ CgiEnvironment::CgiEnvironment() :
 	cgiOptions
 		("cgi.defaultPresenter", Options::value(&defaultPresenter, "xml"),
 		 "The default engine for formatting presentations")
+		("cgi.transformContentType", Options::value(&transformContentType, "text/xml-xslt"),
+		 "The content type specified to enable standard internal transformations")
+		("cgi.transformTargetType", Options::value(&transformTargetType, "htmldocument"),
+		 "The transform target type used in standard internal transformations")
 		("cgi.defaultPresent", Options::value(&defaultPresent, "index"),
 		 "The present script to use when no other is specified")
 		("cgi.presentRoot", Options::value(&presentRoot, "present"),
diff --git a/project2/cgi/cgiEnvironment.h b/project2/cgi/cgiEnvironment.h
index cfe9c7b..6797a24 100644
--- a/project2/cgi/cgiEnvironment.h
+++ b/project2/cgi/cgiEnvironment.h
@@ -60,6 +60,8 @@ class CgiEnvironment : public Environment {
 		Glib::ustring errorContentType;
 		Glib::ustring errorTransformStyle;
 		std::string defaultPresent;
+		std::string transformContentType;
+		std::string transformTargetType;
 		std::string presentRoot;
 		std::string requestRoot;
 		std::string errorPresentRoot;
diff --git a/project2/cgi/cgiStagePresent.cpp b/project2/cgi/cgiStagePresent.cpp
index 8e4a6ff..c66f409 100644
--- a/project2/cgi/cgiStagePresent.cpp
+++ b/project2/cgi/cgiStagePresent.cpp
@@ -11,7 +11,16 @@ CgiApplicationEngine::PresentStage::PresentStage(ScriptReaderPtr s) :
 	CommonObjects(s->root()),
 	CheckHost(s->root()),
 	ViewHost(s->root()),
-	presenter([root,this] { return PresenterLoader::getFor(this->env()->defaultPresenter)->create(root, Default); })
+	presenter([root,this] {
+			auto p = PresenterLoader::getFor(this->env()->defaultPresenter)->create(root, Default);
+			auto xp = dynamic_cast<TransformSource *>(p);
+			auto cp = dynamic_cast<ContentPresenter *>(p);
+			if (xp && cp && cp->contentType == this->env()->transformContentType) {
+				auto h = TransformTargetLoader::getFor(this->env()->transformTargetType)->create(root, Default);
+				xp->addTarget(h, root);
+			}
+			return p;
+		})
 {
 	s->loader.addLoadTarget(s->root(), Storer::into<OutputOptionsLoader>(&outputOptions));
 	s->loader.addLoadTarget(s->root(), Storer::into<PresenterLoader>(&presenter, Scripted));
diff --git a/project2/xml/transformHtml.cpp b/project2/xml/transformHtml.cpp
index 1070ada..bbc6549 100644
--- a/project2/xml/transformHtml.cpp
+++ b/project2/xml/transformHtml.cpp
@@ -8,8 +8,7 @@ HtmlDocument::HtmlDocument(ScriptNodePtr s, ObjectSource os) :
 	TransformSource(s, os),
 	SourceOf<HtmlDocument>(s, os),
 	SourceOf<WritableContent>(s, os),
-	doc(NULL),
-	contentType(s, "contenttype", "text/html")
+	doc(NULL)
 {
 }
 
@@ -45,7 +44,7 @@ HtmlDocument::writeTo(std::ostream & o, const std::string & encoding) const
 Glib::ustring
 HtmlDocument::getContentType() const
 {
-	return contentType();
+	return contentType;
 }
 
 WritableContent::Class
@@ -71,6 +70,7 @@ class TransformXmlToHtml : public TransformImpl<xmlpp::Document, HtmlDocument> {
 			if (!result->doc) {
 				throw xmlpp::exception("Failed to perform transformation");
 			}
+			result->contentType = (char*)(cur.get()->mediaType);
 		}
 		void configure(ScriptNodePtr e)
 		{
diff --git a/project2/xml/transformHtml.h b/project2/xml/transformHtml.h
index 7273bb0..0a6c432 100644
--- a/project2/xml/transformHtml.h
+++ b/project2/xml/transformHtml.h
@@ -14,7 +14,7 @@ class HtmlDocument : public SourceOf<HtmlDocument>, public WritableContent, publ
 		Class getContentClass() const;
 		Glib::ustring getContentType() const;
 		void writeTo(std::ostream &, const std::string & encoding) const;
-		Variable contentType;
+		Glib::ustring contentType;
 };
 
 #endif
-- 
cgit v1.2.3