--- parser3/src/classes/xdoc.C 2002/01/28 08:20:33 1.78 +++ parser3/src/classes/xdoc.C 2002/02/08 07:27:41 1.84 @@ -1,14 +1,21 @@ /** @file Parser: @b xdoc parser class. - Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://paf.design.ru) - $Id: xdoc.C,v 1.78 2002/01/28 08:20:33 paf Exp $ + $Id: xdoc.C,v 1.84 2002/02/08 07:27:41 paf Exp $ */ -#include "pa_types.h" +#include "classes.h" #ifdef XML +#include "pa_stylesheet_connection.h" +#include "pa_request.h" +#include "pa_vxdoc.h" +#include "pa_charset.h" +#include "pa_vfile.h" +#include "xnode.h" + #include "gdome.h" #include "libxml/tree.h" extern "C" { @@ -19,15 +26,6 @@ extern "C" { #include "libxslt/transform.h" #include "libxslt/xsltutils.h" -#include "pa_stylesheet_connection.h" -#include "classes.h" -#include "pa_request.h" -#include "pa_vxdoc.h" -#include "pa_charset.h" -#include "pa_vfile.h" -#include "xnode.h" - - // defines #define XDOC_CLASS_NAME "xdoc" @@ -371,70 +369,84 @@ static void _getElementById(Request& r, &method_name, exc); } -/* -GdomeNode *gdome_doc_importNode (GdomeDocument *self, GdomeNode *importedNode, GdomeBoolean deep, GdomeException *exc); -GdomeElement *gdome_doc_createElementNS (GdomeDocument *self, GdomeDOMString *namespaceURI, GdomeDOMString *qualifiedName, GdomeException *exc); -GdomeAttr *gdome_doc_createAttributeNS (GdomeDocument *self, GdomeDOMString *namespaceURI, GdomeDOMString *qualifiedName, GdomeException *exc); -*/ - -static void _create(Request& r, const String& method_name, MethodParams *params) { - //_asm int 3; +static void _importNode(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); VXdoc& vdoc=*static_cast(r.self); - const String& qualifiedName=params->as_string(0, "qualifiedName must be string"); + GdomeNode *importedNode= + as_node(pool, method_name, params, 0, "importedNode must be node"); + bool deep= + params->as_bool(1, "deep must be bool", r); GdomeException exc; - /* - GdomeDocumentType *documentType=gdome_di_createDocumentType ( - docimpl, - pool.transcode(qualifiedName), - 0/*publicId* /, - 0/*systemId* /, - &exc); - if(!documentType || exc || xmlHaveGenericErrors()) - throw Exception(0, 0, - &method_name, - exc); - */ - GdomeDocument *document=gdome_di_createDocument (domimpl, - 0/*namespaceURI*/, - pool.transcode(qualifiedName).get(), - 0/*doctype*/, - &exc); - if(!document || exc || xmlHaveGenericErrors()) + GdomeNode *outputNode=gdome_doc_importNode(vdoc.get_document(&method_name), + importedNode, + deep, &exc); + if(exc) throw Exception(0, 0, &method_name, exc); - /// +xalan createXMLDecl ? - - // replace any previous parsed source - vdoc.set_document(document); + // write out result + r.write_no_lang(*new(pool) VXnode(pool, outputNode)); } +/* +GdomeElement *gdome_doc_createElementNS (GdomeDocument *self, GdomeDOMString *namespaceURI, GdomeDOMString *qualifiedName, GdomeException *exc); +GdomeAttr *gdome_doc_createAttributeNS (GdomeDocument *self, GdomeDOMString *namespaceURI, GdomeDOMString *qualifiedName, GdomeException *exc); +*/ + -static void _set(Request& r, const String& method_name, MethodParams *params) { -// _asm int 3; +static void _create(Request& r, const String& method_name, MethodParams *params) { + //_asm int 3; Pool& pool=r.pool(); VXdoc& vdoc=*static_cast(r.self); - Value& vxml=params->as_junction(0, "xml must be code"); - Temp_lang temp_lang(r, String::UL_XML); - const String& xml=r.process(vxml).as_string(); + Value& param=params->get(0); + GdomeDocument *document; + if(param.get_junction()) { // {} + Temp_lang temp_lang(r, String::UL_XML); + const String& xml=r.process(param).as_string(); + + const char *cstr=xml.cstr(String::UL_UNSPECIFIED); + document=(GdomeDocument *) + gdome_xml_n_mkref((xmlNode *)xmlParseMemory( + cstr, strlen(cstr) + )); + if(!document || xmlHaveGenericErrors()) { + GdomeException exc=0; + throw Exception(0, 0, + &method_name, + exc); + } + } else { // [name] + const String& qualifiedName=param.as_string(); - const char *cstr=xml.cstr(String::UL_UNSPECIFIED); - GdomeDocument *document=(GdomeDocument *) - gdome_xml_n_mkref((xmlNode *)xmlParseMemory( - cstr, strlen(cstr) - )); - if(!document || xmlHaveGenericErrors()) { - GdomeException exc=0; - throw Exception(0, 0, - &method_name, - exc); - } + GdomeException exc; + /* + GdomeDocumentType *documentType=gdome_di_createDocumentType ( + docimpl, + pool.transcode(qualifiedName), + 0/*publicId* /, + 0/*systemId* /, + &exc); + if(!documentType || exc || xmlHaveGenericErrors()) + throw Exception(0, 0, + &method_name, + exc); + */ + document=gdome_di_createDocument (domimpl, + 0/*namespaceURI*/, + pool.transcode(qualifiedName).get(), + 0/*doctype*/, + &exc); + if(!document || exc || xmlHaveGenericErrors()) + throw Exception(0, 0, + &method_name, + exc); + /// +xalan createXMLDecl ? + } // replace any previous parsed source vdoc.set_document(document); } @@ -797,17 +809,21 @@ MXdoc::MXdoc(Pool& apool) : MXnode(apool // ^xdoc.getElementsByTagNameNS[namespaceURI;localName] = array of nodes add_native_method("getElementsByTagNameNS", Method::CT_DYNAMIC, _getElementsByTagNameNS, 2, 2); - /// DOM2(?) + /// DOM2 // ^xdoc.getElementById[elementId] add_native_method("getElementById", Method::CT_DYNAMIC, _getElementById, 1, 1); + // Node (in Node importedNode, in boolean deep) raises(DOMException) + add_native_method("importNode", Method::CT_DYNAMIC, _importNode, 2, 2); + /// parser // ^xdoc::create{qualifiedName} + // ^xdoc::_create[xml] add_native_method("create", Method::CT_DYNAMIC, _create, 1, 1); - // ^xdoc::set[xml] - add_native_method("set", Method::CT_DYNAMIC, _set, 1, 1); + // for backward compatibility with <=v 1.82 2002/01/31 11:51:46 paf + add_native_method("set", Method::CT_DYNAMIC, _create, 1, 1); // ^xdoc::load[some.xml] add_native_method("load", Method::CT_DYNAMIC, _load, 1, 1);