static cache_entry* cache_entry_from_xdr_doc(xmlDocPtr doc, xmlChar const* nsURI, MSXML_VERSION version) { cache_entry* entry = heap_alloc(sizeof(cache_entry)); xmlSchemaParserCtxtPtr spctx; xmlDocPtr new_doc = xmlCopyDoc(doc, 1), xsd_doc = XDR_to_XSD_doc(doc, nsURI); link_datatypes(xsd_doc); entry->type = CacheEntryType_XDR; entry->ref = 0; spctx = xmlSchemaNewDocParserCtxt(xsd_doc); if ((entry->schema = Schema_parse(spctx))) { entry->doc = new_doc; xmldoc_init(entry->schema->doc, version); xmldoc_init(entry->doc, version); xmldoc_add_ref(entry->doc); xmldoc_add_ref(entry->schema->doc); } else { FIXME("failed to parse doc\n"); xmlFreeDoc(new_doc); xmlFreeDoc(xsd_doc); heap_free(entry); entry = NULL; } xmlSchemaFreeParserCtxt(spctx); return entry; }
static cache_entry* cache_entry_from_xsd_doc(xmlDocPtr doc) { cache_entry* entry = heap_alloc(sizeof(cache_entry)); xmlSchemaParserCtxtPtr spctx; xmlDocPtr new_doc = xmlCopyDoc(doc, 1); entry->type = SCHEMA_TYPE_XSD; entry->ref = 0; spctx = xmlSchemaNewDocParserCtxt(new_doc); if ((entry->schema = xmlSchemaParse(spctx))) { xmldoc_init(entry->schema->doc, &CLSID_DOMDocument40); entry->doc = entry->schema->doc; xmldoc_add_ref(entry->doc); } else { FIXME("failed to parse doc\n"); xmlFreeDoc(new_doc); heap_free(entry); entry = NULL; } xmlSchemaFreeParserCtxt(spctx); return entry; }
static cache_entry* cache_entry_from_url(char const* url) { cache_entry* entry = heap_alloc(sizeof(cache_entry)); xmlSchemaParserCtxtPtr spctx = xmlSchemaNewParserCtxt(url); entry->type = SCHEMA_TYPE_XSD; entry->ref = 0; if (spctx) { if((entry->schema = xmlSchemaParse(spctx))) { xmldoc_init(entry->schema->doc, &CLSID_DOMDocument40); entry->doc = entry->schema->doc; xmldoc_add_ref(entry->doc); } else { heap_free(entry); entry = NULL; } xmlSchemaFreeParserCtxt(spctx); } else { FIXME("schema for nsURI %s not found\n", wine_dbgstr_a(url)); heap_free(entry); entry = NULL; } return entry; }
static cache_entry* cache_entry_from_xsd_doc(xmlDocPtr doc, xmlChar const* nsURI, MSXML_VERSION v) { cache_entry* entry = heap_alloc(sizeof(cache_entry)); xmlSchemaParserCtxtPtr spctx; xmlDocPtr new_doc = xmlCopyDoc(doc, 1); link_datatypes(new_doc); /* TODO: if the nsURI is different from the default xmlns or targetNamespace, * do we need to do something special here? */ entry->type = CacheEntryType_XSD; entry->ref = 0; spctx = xmlSchemaNewDocParserCtxt(new_doc); if ((entry->schema = Schema_parse(spctx))) { xmldoc_init(entry->schema->doc, v); entry->doc = entry->schema->doc; xmldoc_add_ref(entry->doc); } else { FIXME("failed to parse doc\n"); xmlFreeDoc(new_doc); heap_free(entry); entry = NULL; } xmlSchemaFreeParserCtxt(spctx); return entry; }
void init_xmlnode(xmlnode *This, xmlNodePtr node, IXMLDOMNode *node_iface, dispex_static_data_t *dispex_data) { if(node) { xmlnode_add_ref(node); xmldoc_add_ref(node->doc); } This->node = node; This->iface = node_iface; This->parent = NULL; init_dispex(&This->dispex, (IUnknown*)This->iface, dispex_data); }
static cache_entry* cache_entry_from_xdr_doc(xmlDocPtr doc) { cache_entry* entry = heap_alloc(sizeof(cache_entry)); xmlDocPtr new_doc = xmlCopyDoc(doc, 1); FIXME("XDR schema support not implemented\n"); entry->type = SCHEMA_TYPE_XDR; entry->ref = 0; entry->schema = NULL; entry->doc = new_doc; xmldoc_init(entry->doc, &CLSID_DOMDocument30); xmldoc_add_ref(entry->doc); return entry; }
IXMLDOMNodeList* create_children_nodelist( xmlNodePtr node ) { xmlnodelist *nodelist; nodelist = heap_alloc( sizeof *nodelist ); if ( !nodelist ) return NULL; nodelist->IXMLDOMNodeList_iface.lpVtbl = &xmlnodelist_vtbl; nodelist->ref = 1; nodelist->parent = node; nodelist->current = node->children; xmldoc_add_ref( node->doc ); return &nodelist->IXMLDOMNodeList_iface; }
IXMLDOMNodeList* create_children_nodelist( xmlNodePtr node ) { xmlnodelist *nodelist; nodelist = HeapAlloc( GetProcessHeap(), 0, sizeof *nodelist ); if ( !nodelist ) return NULL; nodelist->lpVtbl = &xmlnodelist_vtbl; nodelist->ref = 1; nodelist->parent = node; nodelist->current = node->children; xmldoc_add_ref( node->doc ); return (IXMLDOMNodeList*) &nodelist->lpVtbl; }
IXMLDOMNamedNodeMap *create_nodemap( const xmlNodePtr node ) { xmlnodemap *nodemap; nodemap = heap_alloc( sizeof *nodemap ); if ( !nodemap ) return NULL; nodemap->IXMLDOMNamedNodeMap_iface.lpVtbl = &xmlnodemap_vtbl; nodemap->ISupportErrorInfo_iface.lpVtbl = &support_error_vtbl; nodemap->node = node; nodemap->ref = 1; nodemap->iterator = 0; xmldoc_add_ref(node->doc); return &nodemap->IXMLDOMNamedNodeMap_iface; }
IXMLDOMNodeList* create_children_nodelist( xmlNodePtr node ) { xmlnodelist *This; This = heap_alloc( sizeof *This ); if ( !This ) return NULL; This->IXMLDOMNodeList_iface.lpVtbl = &xmlnodelist_vtbl; This->ref = 1; This->parent = node; This->current = node->children; xmldoc_add_ref( node->doc ); init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMNodeList_iface, &xmlnodelist_dispex); return &This->IXMLDOMNodeList_iface; }
HRESULT queryresult_create(xmlNodePtr node, LPWSTR szQuery, IXMLDOMNodeList **out) { queryresult *This = CoTaskMemAlloc(sizeof(queryresult)); xmlXPathContextPtr ctxt = xmlXPathNewContext(node->doc); xmlChar *str = xmlChar_from_wchar(szQuery); HRESULT hr; TRACE("(%p, %s, %p)\n", node, wine_dbgstr_w(szQuery), out); *out = NULL; if (This == NULL || ctxt == NULL || str == NULL) { hr = E_OUTOFMEMORY; goto cleanup; } This->lpVtbl = &queryresult_vtbl; This->ref = 1; This->resultPos = 0; This->node = node; xmldoc_add_ref(This->node->doc); ctxt->node = node; This->result = xmlXPathEval(str, ctxt); if (!This->result || This->result->type != XPATH_NODESET) { hr = E_FAIL; goto cleanup; } *out = (IXMLDOMNodeList *)This; hr = S_OK; TRACE("found %d matches\n", This->result->nodesetval->nodeNr); cleanup: if (This != NULL && FAILED(hr)) IXMLDOMNodeList_Release( (IXMLDOMNodeList*) &This->lpVtbl ); if (ctxt != NULL) xmlXPathFreeContext(ctxt); HeapFree(GetProcessHeap(), 0, str); return hr; }
static xmlnodelist *new_nodelist( xmlNodePtr node ) { xmlnodelist *nodelist; nodelist = HeapAlloc( GetProcessHeap(), 0, sizeof *nodelist ); if ( !nodelist ) return NULL; nodelist->lpVtbl = &xmlnodelist_vtbl; nodelist->ref = 1; nodelist->node = node; nodelist->current = node; nodelist->top_level_node = node; nodelist->enum_children = FALSE; xslt_info_init( &nodelist->xinfo ); if(node) xmldoc_add_ref( node->doc ); return nodelist; }
IXMLDOMNamedNodeMap *create_nodemap(xmlNodePtr node, const struct nodemap_funcs *funcs) { xmlnodemap *This; This = heap_alloc( sizeof *This ); if ( !This ) return NULL; This->IXMLDOMNamedNodeMap_iface.lpVtbl = &XMLDOMNamedNodeMapVtbl; This->ISupportErrorInfo_iface.lpVtbl = &SupportErrorInfoVtbl; This->node = node; This->ref = 1; This->iterator = 0; This->enumvariant = NULL; This->funcs = funcs; init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMNamedNodeMap_iface, &xmlnodemap_dispex); xmlnode_add_ref(node); xmldoc_add_ref(node->doc); return &This->IXMLDOMNamedNodeMap_iface; }
HRESULT create_selection(xmlNodePtr node, xmlChar* query, IXMLDOMNodeList **out) { domselection *This = heap_alloc(sizeof(domselection)); xmlXPathContextPtr ctxt = xmlXPathNewContext(node->doc); HRESULT hr; TRACE("(%p, %s, %p)\n", node, wine_dbgstr_a((char const*)query), out); *out = NULL; if (!This || !ctxt || !query) { xmlXPathFreeContext(ctxt); heap_free(This); return E_OUTOFMEMORY; } This->IXMLDOMSelection_iface.lpVtbl = &domselection_vtbl; This->ref = 1; This->resultPos = 0; This->node = node; This->enumvariant = NULL; init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMSelection_iface, &domselection_dispex); xmldoc_add_ref(This->node->doc); ctxt->error = query_serror; ctxt->node = node; registerNamespaces(ctxt); if (is_xpathmode(This->node->doc)) { xmlXPathRegisterAllFunctions(ctxt); This->result = xmlXPathEvalExpression(query, ctxt); } else { xmlChar* pattern_query = XSLPattern_to_XPath(ctxt, query); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"not", xmlXPathNotFunction); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"boolean", xmlXPathBooleanFunction); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"index", XSLPattern_index); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"end", XSLPattern_end); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"nodeType", XSLPattern_nodeType); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_IEq", XSLPattern_OP_IEq); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_INEq", XSLPattern_OP_INEq); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_ILt", XSLPattern_OP_ILt); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_ILEq", XSLPattern_OP_ILEq); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_IGt", XSLPattern_OP_IGt); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_IGEq", XSLPattern_OP_IGEq); This->result = xmlXPathEvalExpression(pattern_query, ctxt); xmlFree(pattern_query); } if (!This->result || This->result->type != XPATH_NODESET) { hr = E_FAIL; goto cleanup; } *out = (IXMLDOMNodeList*)&This->IXMLDOMSelection_iface; hr = S_OK; TRACE("found %d matches\n", xmlXPathNodeSetGetLength(This->result->nodesetval)); cleanup: if (This && FAILED(hr)) IXMLDOMSelection_Release( &This->IXMLDOMSelection_iface ); xmlXPathFreeContext(ctxt); return hr; }
HRESULT queryresult_create(xmlNodePtr node, xmlChar* szQuery, IXMLDOMNodeList **out) { queryresult *This = heap_alloc_zero(sizeof(queryresult)); xmlXPathContextPtr ctxt = xmlXPathNewContext(node->doc); HRESULT hr; TRACE("(%p, %s, %p)\n", node, wine_dbgstr_a((char const*)szQuery), out); *out = NULL; if (This == NULL || ctxt == NULL || szQuery == NULL) { hr = E_OUTOFMEMORY; goto cleanup; } This->lpVtbl = &queryresult_vtbl; This->ref = 1; This->resultPos = 0; This->node = node; xmldoc_add_ref(This->node->doc); ctxt->error = query_serror; ctxt->node = node; registerNamespaces(ctxt); if (is_xpathmode(This->node->doc)) { xmlXPathRegisterAllFunctions(ctxt); This->result = xmlXPathEvalExpression(szQuery, ctxt); } else { xmlChar* xslpQuery = XSLPattern_to_XPath(ctxt, szQuery); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"not", xmlXPathNotFunction); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"boolean", xmlXPathBooleanFunction); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"index", XSLPattern_index); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"end", XSLPattern_end); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"nodeType", XSLPattern_nodeType); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_IEq", XSLPattern_OP_IEq); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_INEq", XSLPattern_OP_INEq); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_ILt", XSLPattern_OP_ILt); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_ILEq", XSLPattern_OP_ILEq); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_IGt", XSLPattern_OP_IGt); xmlXPathRegisterFunc(ctxt, (xmlChar const*)"OP_IGEq", XSLPattern_OP_IGEq); This->result = xmlXPathEvalExpression(xslpQuery, ctxt); xmlFree(xslpQuery); } if (!This->result || This->result->type != XPATH_NODESET) { hr = E_FAIL; goto cleanup; } init_dispex(&This->dispex, (IUnknown*)&This->lpVtbl, &queryresult_dispex); *out = (IXMLDOMNodeList *) &This->lpVtbl; hr = S_OK; TRACE("found %d matches\n", xmlXPathNodeSetGetLength(This->result->nodesetval)); cleanup: if (This != NULL && FAILED(hr)) IXMLDOMNodeList_Release( (IXMLDOMNodeList*) &This->lpVtbl ); xmlXPathFreeContext(ctxt); return hr; }