#include "xmlPresenter.h" #include "xmlObjectLoader.h" #include "variables.h" #include "appEngine.h" #include DECLARE_COMPONENT_LOADER("xml", XmlPresenter, PresenterLoader) XmlPresenter::XmlPresenter(const Glib::ustring & responseRootNodeName, const Glib::ustring & responseStyle, const Glib::ustring & ct) : ContentPresenter(ct), responseDoc(XmlDocumentPtr(new xmlpp::Document("1.0"))) { createDoc(responseRootNodeName, responseStyle); } XmlPresenter::XmlPresenter(const xmlpp::Element * e) : ContentPresenter(e->get_attribute_value("contenttype")), responseDoc(XmlDocumentPtr(new xmlpp::Document("1.0"))) { createDoc(e->get_attribute_value("root"), e->get_attribute_value("style")); } XmlPresenter::~XmlPresenter() { } void XmlPresenter::createDoc(const Glib::ustring & responseRootNodeName, const Glib::ustring & responseStyle) const { nodeStack.push_back(responseDoc->create_root_node(responseRootNodeName)); declareNamespace(Environment::getCurrent()->getXmlPrefix(), Environment::getCurrent()->getXmlNamespace()); // XSLT Style char * buf; if (!responseStyle.empty() && asprintf(&buf, "type=\"text/xsl\" href=\"%s\"", responseStyle.c_str()) > 0) { xmlAddPrevSibling(nodeStack.back()->cobj(), xmlNewDocPI(responseDoc->cobj(), BAD_CAST "xml-stylesheet", BAD_CAST buf)); free(buf); } } XmlPresenter::operator const xmlpp::Document * () const { return responseDoc.get(); } XmlPresenter::operator const xmlDoc * () const { return responseDoc->cobj(); } void XmlPresenter::declareNamespace(const Glib::ustring & prefix, const Glib::ustring & ns) const { xmlNewNs(nodeStack.back()->cobj(), BAD_CAST ns.c_str(), BAD_CAST prefix.c_str()); } void XmlPresenter::setNamespace(const Glib::ustring & prefix, const Glib::ustring & ns) const { nodeStack.back()->set_namespace_declaration(ns, prefix); } void XmlPresenter::pushSub(const Glib::ustring & name, const Glib::ustring & ns) const { 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 (!value.get()) { nodeStack.back()->set_attribute(name, value, ns); } } void XmlPresenter::addText(const VariableType & value) const { if (!value.get()) { nodeStack.back()->add_child_text(value); } } void XmlPresenter::popSub() const { nodeStack.pop_back(); }