void MetaBlock::call(boost::shared_ptr<Context> ctx, boost::shared_ptr<InvokeContext> invoke_ctx) const throw (std::exception) { (void)ctx; XmlDocHelper doc(xmlNewDoc((const xmlChar*) "1.0")); XmlUtils::throwUnless(NULL != doc.get()); XmlNodeHelper node(xmlNewNode(NULL, (const xmlChar*)root_name_.c_str())); XmlUtils::throwUnless(NULL != node.get()); if (root_ns_) { node->nsDef = xmlCopyNamespace(root_ns_); xmlSetNs(node.get(), node->nsDef); } XmlNodeHelper meta_info = invoke_ctx->meta()->getXml(); if (NULL != meta_info.get()) { xmlAddChildList(node.get(), meta_info.release()); } xmlDocSetRootElement(doc.get(), node.release()); invoke_ctx->metaDoc(doc); }
xmlNodePtr PmmCloneNode( xmlNodePtr node, int recursive ) { xmlNodePtr retval = NULL; if ( node != NULL ) { switch ( node->type ) { case XML_ELEMENT_NODE: case XML_TEXT_NODE: case XML_CDATA_SECTION_NODE: case XML_ENTITY_REF_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: case XML_DOCUMENT_FRAG_NODE: case XML_ENTITY_DECL: retval = xmlCopyNode( node, recursive ? 1 : 2 ); break; case XML_ATTRIBUTE_NODE: retval = (xmlNodePtr) xmlCopyProp( NULL, (xmlAttrPtr) node ); break; case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: retval = (xmlNodePtr) xmlCopyDoc( (xmlDocPtr)node, recursive ); break; case XML_DOCUMENT_TYPE_NODE: case XML_DTD_NODE: retval = (xmlNodePtr) xmlCopyDtd( (xmlDtdPtr)node ); break; case XML_NAMESPACE_DECL: retval = ( xmlNodePtr ) xmlCopyNamespace( (xmlNsPtr) node ); break; default: break; } } return retval; }