Commit 65293d8e authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

Create a node object and use it to hold libxml2 pointers.

parent 2255e6fe
......@@ -13,6 +13,7 @@ C_SRCS = \
element.c \
factory.c \
main.c \
node.c \
nodemap.c
@MAKE_DLL_RULES@
......
......@@ -26,6 +26,7 @@
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winnls.h"
#include "ole2.h"
#include "ocidl.h"
#include "msxml.h"
......@@ -44,7 +45,7 @@ typedef struct _domdoc
const struct IXMLDOMDocumentVtbl *lpVtbl;
LONG ref;
VARIANT_BOOL async;
xmlDocPtr xmldoc;
IXMLDOMNode *node;
} domdoc;
static inline domdoc *impl_from_IXMLDOMDocument( IXMLDOMDocument *iface )
......@@ -94,7 +95,7 @@ static ULONG WINAPI domdoc_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
xmlFreeDoc( This->xmldoc );
IXMLDOMElement_Release( This->node );
HeapFree( GetProcessHeap(), 0, This );
}
......@@ -500,10 +501,27 @@ static HRESULT WINAPI domdoc_get_documentElement(
IXMLDOMElement** DOMElement )
{
domdoc *This = impl_from_IXMLDOMDocument( iface );
xmlDocPtr xmldoc = NULL;
xmlNodePtr root = NULL;
TRACE("%p\n", This);
FIXME("%p\n", This);
*DOMElement = NULL;
return DOMElement_create(DOMElement, This->xmldoc);
if ( !This->node )
return S_FALSE;
xmldoc = xmldoc_from_xmlnode( This->node );
if ( !xmldoc )
return S_FALSE;
root = xmlDocGetRootElement( xmldoc );
if ( !root )
return S_FALSE;
*DOMElement = create_element( root );
return S_OK;
}
......@@ -669,9 +687,15 @@ static HRESULT WINAPI domdoc_load(
{
domdoc *This = impl_from_IXMLDOMDocument( iface );
LPWSTR filename = NULL;
xmlDocPtr xd;
xmlDocPtr xmldoc;
TRACE("%p\n", This);
TRACE("type %d\n", V_VT(&xmlSource) );
if ( This->node )
{
IXMLDOMNode_Release( This->node );
This->node = NULL;
}
switch( V_VT(&xmlSource) )
{
......@@ -680,17 +704,20 @@ static HRESULT WINAPI domdoc_load(
}
if ( !filename )
return E_FAIL;
return S_FALSE;
xd = doread( filename );
if ( !xd )
return E_FAIL;
xmldoc = doread( filename );
if ( !xmldoc )
return S_FALSE;
/* free the old document before overwriting it */
if ( This->xmldoc )
xmlFreeDoc( This->xmldoc );
This->xmldoc = xd;
This->node = create_domdoc_node( xmldoc );
if ( !This->node )
{
*isSuccessful = VARIANT_FALSE;
return S_FALSE;
}
*isSuccessful = VARIANT_TRUE;
return S_OK;
}
......@@ -942,7 +969,7 @@ HRESULT DOMDocument_create(IUnknown *pUnkOuter, LPVOID *ppObj)
doc->lpVtbl = &domdoc_vtbl;
doc->ref = 1;
doc->async = 0;
doc->xmldoc = NULL;
doc->node = NULL;
*ppObj = &doc->lpVtbl;
......
......@@ -44,7 +44,7 @@ typedef struct _domelem
{
const struct IXMLDOMElementVtbl *lpVtbl;
LONG ref;
xmlDocPtr xmldoc;
IXMLDOMNode *node;
} domelem;
static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
......@@ -90,6 +90,7 @@ static ULONG WINAPI domelem_Release(
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
IXMLDOMNode_Release( This->node );
HeapFree( GetProcessHeap(), 0, This );
}
......@@ -216,14 +217,8 @@ static HRESULT WINAPI domelem_get_attributes(
IXMLDOMElement *iface,
IXMLDOMNamedNodeMap** attributeMap)
{
domelem *This = impl_from_IXMLDOMElement( iface );
xmlNodePtr root;
root = xmlDocGetRootElement( This->xmldoc );
if( !root )
return E_FAIL;
return NodeMap_create( attributeMap, This->xmldoc, root );
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT WINAPI domelem_insertBefore(
......@@ -558,21 +553,25 @@ static const struct IXMLDOMElementVtbl domelem_vtbl =
domelem_normalize,
};
HRESULT DOMElement_create( IXMLDOMElement** DOMElement, xmlDocPtr xmldoc )
IXMLDOMElement* create_element( xmlNodePtr element )
{
domelem *elem;
domelem *This;
elem = HeapAlloc( GetProcessHeap(), 0, sizeof *elem );
if( !elem )
return E_OUTOFMEMORY;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
return NULL;
elem->lpVtbl = &domelem_vtbl;
elem->xmldoc = xmldoc;
elem->ref = 1;
This->lpVtbl = &domelem_vtbl;
This->node = create_element_node( element );
This->ref = 1;
*DOMElement = (IXMLDOMElement*) &elem->lpVtbl;
if ( !This->node )
{
HeapFree( GetProcessHeap(), 0, This );
return NULL;
}
return S_OK;
return (IXMLDOMElement*) &This->lpVtbl;
}
#endif
......@@ -27,8 +27,21 @@
#include <libxml/parser.h>
extern HRESULT DOMElement_create( IXMLDOMElement** DOMElement, xmlDocPtr xmldoc );
extern HRESULT NodeMap_create(IXMLDOMNamedNodeMap** DomNamedNodeMap, xmlDocPtr xmldoc, xmlNodePtr node );
/* constructors */
extern IXMLDOMNode *create_domdoc_node( xmlDocPtr node );
extern IUnknown *create_domdoc( void );
extern IXMLDOMNode *create_attribute_node( xmlAttrPtr attr );
extern IUnknown *create_xmldoc( void );
extern IXMLDOMElement *create_element( xmlNodePtr element );
extern IXMLDOMNode *create_element_node( xmlNodePtr element );
/* data accessors */
extern xmlDocPtr xmldoc_from_xmlnode( IXMLDOMNode *iface );
extern xmlNodePtr xmlelement_from_xmlnode( IXMLDOMNode *iface );
/* helpers */
extern xmlChar *xmlChar_from_wchar( LPWSTR str );
extern BSTR bstr_from_xmlChar( const xmlChar *buf );
#endif
......
......@@ -133,7 +133,7 @@ static HRESULT WINAPI xmlnodemap_Invoke(
return E_NOTIMPL;
}
static xmlChar *xmlChar_from_wchar( LPWSTR str )
xmlChar *xmlChar_from_wchar( LPWSTR str )
{
DWORD len;
xmlChar *xmlstr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment