#include "xmlPresenter.h" #include "xmlObjectLoader.h" #include "variables.h" #include "appEngine.h" XmlPresenter::XmlPresenter() : responseDoc(XmlDocumentPtr(new xmlpp::Document("1.0"))) { } XmlPresenter::~XmlPresenter() { } void XmlPresenter::createDoc() const { if (nodeStack.empty()) { nodeStack.push_back(responseDoc->create_root_node(getResponseRootNodeName())); xmlNewNs(nodeStack.back()->cobj(), BAD_CAST ApplicationEngine::getCurrent()->env()->getXmlNamespace().c_str(), BAD_CAST ApplicationEngine::getCurrent()->env()->getXmlPrefix().c_str()); // XSLT Style char * buf; if (!getResponseStyle().empty() && asprintf(&buf, "type=\"text/xsl\" href=\"%s\"", getResponseStyle().c_str()) > 0) { xmlAddPrevSibling(nodeStack.back()->cobj(), xmlNewDocPI(responseDoc->cobj(), BAD_CAST "xml-stylesheet", BAD_CAST buf)); free(buf); } } } XmlProcessPresenter::XmlProcessPresenter(const std::string & group, const std::string & file, bool isInclusion) : present(group, file, isInclusion), responseRootNodeName(present.get_document()->get_root_node()->get_attribute_value("root")), responseStyle(present.get_document()->get_root_node()->get_attribute_value("style")), contentType(present.get_document()->get_root_node()->get_attribute_value("contenttype")) { LoaderBase loader(ApplicationEngine::getCurrent()->env()->getXmlNamespace(), true); loader.supportedStorers.insert(Storer::into(&rowSets)); loader.supportedStorers.insert(Storer::into(&views)); loader.supportedStorers.insert(Storer::into(¶meterChecks)); loader.collectAll(this, present.get_document()->get_root_node(), true); } XmlProcessPresenter::~XmlProcessPresenter() { } const Glib::ustring & XmlProcessPresenter::getResponseRootNodeName() const { return responseRootNodeName; } const Glib::ustring & XmlProcessPresenter::getResponseStyle() const { return responseStyle; } XmlPresenter::XmlDocumentPtr XmlPresenter::getDataDocument() const { return responseDoc; } void XmlPresenter::pushSub(const Glib::ustring & name, const Glib::ustring & ns) const { createDoc(); nodeStack.push_back(nodeStack.back()->add_child(name, ns)); } void XmlPresenter::addAttr(const Glib::ustring & name, const Glib::ustring & ns, const VariableType & value) const { if (!boost::get(&value)) { createDoc(); nodeStack.back()->set_attribute(name, value, ns); } } void XmlPresenter::setText(const VariableType & value) const { if (!boost::get(&value)) { createDoc(); nodeStack.back()->set_child_text(value); } } void XmlPresenter::popSub() const { nodeStack.pop_back(); }