IUnknown* create_attribute( xmlNodePtr attribute )
{
domattr *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
This->lpVtbl = &domattr_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( attribute, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( attribute, (IUnknown*)&This->lpVtbl );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
IUnknown* create_cdata( xmlNodePtr text )
{
domcdata *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
This->lpVtbl = &domcdata_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( text, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( text, (IUnknown*)&This->lpVtbl );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
IUnknown* create_comment( xmlNodePtr comment )
{
domcomment *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
This->lpVtbl = &domcomment_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( comment, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( comment, (IUnknown*)&This->lpVtbl );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
}else if(IsEqualGUID(&IID_UndocumentedScriptIface, riid)) {
TRACE("(%p)->(IID_UndocumentedScriptIface %p) returning NULL\n", This, ppv);
*ppv = NULL;
+ }else if (IsEqualGUID(&IID_IObjectIdentity, riid)) {
+ TRACE("IID_IObjectIdentity not supported returning NULL\n");
+ *ppv = NULL;
}else {
return FALSE;
}
IUnknown* create_doc_fragment( xmlNodePtr fragment )
{
domfrag *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
This->lpVtbl = &domfrag_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( fragment, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( fragment, (IUnknown*)&This->lpVtbl );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
VARIANT_BOOL resolving;
VARIANT_BOOL preserving;
BOOL bUseXPath;
- IUnknown *node_unk;
- IXMLDOMNode *node;
+ xmlnode *node;
IXMLDOMSchemaCollection *schema;
bsc_t *bsc;
HRESULT error;
return S_FALSE;
}
-static HRESULT attach_xmldoc( IXMLDOMNode *node, xmlDocPtr xml )
+static HRESULT attach_xmldoc( xmlnode *node, xmlDocPtr xml )
{
- xmlnode *This = impl_from_IXMLDOMNode( node );
+ if(node->node)
+ xmldoc_release(node->node->doc);
- if(This->node)
- xmldoc_release(This->node->doc);
-
- This->node = (xmlNodePtr) xml;
- if(This->node)
- xmldoc_add_ref(This->node->doc);
+ node->node = (xmlNodePtr) xml;
+ if(node->node)
+ xmldoc_add_ref(node->node->doc);
return S_OK;
}
static inline xmlDocPtr get_doc( domdoc *This )
{
- return (xmlDocPtr) xmlNodePtr_from_domnode( This->node, XML_DOCUMENT_NODE );
+ return (xmlDocPtr)This->node->node;
}
static inline domdoc *impl_from_IPersistStream(IPersistStream *iface)
TRACE("(%p, %p, %d)\n", iface, pStm, fClearDirty);
- hr = IXMLDOMNode_get_xml( This->node, &xmlString );
+ hr = IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(This->node), &xmlString );
if(hr == S_OK)
{
DWORD count;
}
else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
{
- return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
+ *ppvObject = IXMLDOMNode_from_impl(This->node);
}
else if (IsEqualGUID(&IID_IPersistStream, riid))
{
return E_NOINTERFACE;
}
- IXMLDOMDocument_AddRef( iface );
+ IUnknown_AddRef((IUnknown*)*ppvObject);
return S_OK;
}
if (This->site)
IUnknown_Release( This->site );
- IUnknown_Release( This->node_unk );
+ IXMLDOMNode_Release(IXMLDOMNode_from_impl(This->node));
if(This->schema) IXMLDOMSchemaCollection_Release( This->schema );
if (This->stream) IStream_Release(This->stream);
HeapFree( GetProcessHeap(), 0, This );
BSTR* name )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeName( This->node, name );
+ return IXMLDOMNode_get_nodeName( IXMLDOMNode_from_impl(This->node), name );
}
VARIANT* value )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeValue( This->node, value );
+ return IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(This->node), value );
}
VARIANT value)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_put_nodeValue( This->node, value );
+ return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(This->node), value );
}
DOMNodeType* type )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeType( This->node, type );
+ return IXMLDOMNode_get_nodeType( IXMLDOMNode_from_impl(This->node), type );
}
IXMLDOMNode** parent )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_parentNode( This->node, parent );
+ return IXMLDOMNode_get_parentNode( IXMLDOMNode_from_impl(This->node), parent );
}
IXMLDOMNodeList** childList )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_childNodes( This->node, childList );
+ return IXMLDOMNode_get_childNodes( IXMLDOMNode_from_impl(This->node), childList );
}
IXMLDOMNode** firstChild )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_firstChild( This->node, firstChild );
+ return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(This->node), firstChild );
}
IXMLDOMNode** lastChild )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_lastChild( This->node, lastChild );
+ return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(This->node), lastChild );
}
IXMLDOMNode** previousSibling )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_previousSibling( This->node, previousSibling );
+ return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(This->node), previousSibling );
}
IXMLDOMNode** nextSibling )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nextSibling( This->node, nextSibling );
+ return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(This->node), nextSibling );
}
IXMLDOMNamedNodeMap** attributeMap )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_attributes( This->node, attributeMap );
+ return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(This->node), attributeMap );
}
IXMLDOMNode** outNewChild )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_insertBefore( This->node, newChild, refChild, outNewChild );
+ return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(This->node), newChild, refChild, outNewChild );
}
IXMLDOMNode** outOldChild)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_replaceChild( This->node, newChild, oldChild, outOldChild );
+ return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(This->node), newChild, oldChild, outOldChild );
}
IXMLDOMNode** oldChild)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_removeChild( This->node, childNode, oldChild );
+ return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(This->node), childNode, oldChild );
}
IXMLDOMNode** outNewChild)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_appendChild( This->node, newChild, outNewChild );
+ return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(This->node), newChild, outNewChild );
}
VARIANT_BOOL* hasChild)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_hasChildNodes( This->node, hasChild );
+ return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(This->node), hasChild );
}
IXMLDOMDocument** DOMDocument)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_ownerDocument( This->node, DOMDocument );
+ return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(This->node), DOMDocument );
}
IXMLDOMNode** cloneRoot)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_cloneNode( This->node, deep, cloneRoot );
+ return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(This->node), deep, cloneRoot );
}
BSTR* nodeType )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeTypeString( This->node, nodeType );
+ return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(This->node), nodeType );
}
BSTR* text )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_text( This->node, text );
+ return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(This->node), text );
}
BSTR text )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_put_text( This->node, text );
+ return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(This->node), text );
}
VARIANT_BOOL* isSpecified )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_specified( This->node, isSpecified );
+ return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(This->node), isSpecified );
}
IXMLDOMNode** definitionNode )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_definition( This->node, definitionNode );
+ return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(This->node), definitionNode );
}
VARIANT* typedValue )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_nodeTypedValue( This->node, typedValue );
+ return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(This->node), typedValue );
}
static HRESULT WINAPI domdoc_put_nodeTypedValue(
VARIANT typedValue )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_put_nodeTypedValue( This->node, typedValue );
+ return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(This->node), typedValue );
}
VARIANT* dataTypeName )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_dataType( This->node, dataTypeName );
+ return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(This->node), dataTypeName );
}
BSTR dataTypeName )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_put_dataType( This->node, dataTypeName );
+ return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(This->node), dataTypeName );
}
BSTR* xmlString )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_xml( This->node, xmlString );
+ return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(This->node), xmlString );
}
BSTR* xmlString )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_transformNode( This->node, styleSheet, xmlString );
+ return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(This->node), styleSheet, xmlString );
}
IXMLDOMNodeList** resultList )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_selectNodes( This->node, queryString, resultList );
+ return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(This->node), queryString, resultList );
}
IXMLDOMNode** resultNode )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_selectSingleNode( This->node, queryString, resultNode );
+ return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(This->node), queryString, resultNode );
}
VARIANT_BOOL* isParsed )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_parsed( This->node, isParsed );
+ return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(This->node), isParsed );
}
BSTR* namespaceURI )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_namespaceURI( This->node, namespaceURI );
+ return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(This->node), namespaceURI );
}
BSTR* prefixString )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_prefix( This->node, prefixString );
+ return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(This->node), prefixString );
}
BSTR* nameString )
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_get_baseName( This->node, nameString );
+ return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(This->node), nameString );
}
VARIANT outputObject)
{
domdoc *This = impl_from_IXMLDOMDocument2( iface );
- return IXMLDOMNode_transformNodeToObject( This->node, stylesheet, outputObject );
+ return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(This->node), stylesheet, outputObject );
}
HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document)
{
domdoc *doc;
- HRESULT hr;
doc = HeapAlloc( GetProcessHeap(), 0, sizeof (*doc) );
if( !doc )
doc->safeopt = 0;
doc->bsc = NULL;
- doc->node_unk = create_basic_node( (xmlNodePtr)xmldoc, (IUnknown*)&doc->lpVtbl );
- if(!doc->node_unk)
+ doc->node = create_basic_node( (xmlNodePtr)xmldoc, (IUnknown*)&doc->lpVtbl );
+ if(!doc->node)
{
HeapFree(GetProcessHeap(), 0, doc);
return E_FAIL;
}
- hr = IUnknown_QueryInterface(doc->node_unk, &IID_IXMLDOMNode, (LPVOID*)&doc->node);
- if(FAILED(hr))
- {
- IUnknown_Release(doc->node_unk);
- HeapFree( GetProcessHeap(), 0, doc );
- return E_FAIL;
- }
-
init_dispex(&doc->dispex, (IUnknown*)&doc->lpVtbl, &domdoc_dispex);
- /* The ref on doc->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(doc->node);
-
*document = (IXMLDOMDocument2*)&doc->lpVtbl;
TRACE("returning iface %p\n", *document);
const struct IUnknownVtbl *lpInternalUnkVtbl;
IUnknown *pUnkOuter;
LONG ref;
- IUnknown *node_unk;
- IXMLDOMNode *node;
+ xmlnode *node;
} domelem;
static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface )
static inline xmlNodePtr get_element( domelem *This )
{
- return xmlNodePtr_from_domnode( This->node, XML_ELEMENT_NODE );
+ return This->node->node;
}
static HRESULT WINAPI domelem_QueryInterface(
BSTR* p )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeName( This->node, p );
+ return IXMLDOMNode_get_nodeName( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_nodeValue(
VARIANT* var1 )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeValue( This->node, var1 );
+ return IXMLDOMNode_get_nodeValue( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_put_nodeValue(
VARIANT var1 )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_nodeValue( This->node, var1 );
+ return IXMLDOMNode_put_nodeValue( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_get_nodeType(
DOMNodeType* domNodeType )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeType( This->node, domNodeType );
+ return IXMLDOMNode_get_nodeType( IXMLDOMNode_from_impl(This->node), domNodeType );
}
static HRESULT WINAPI domelem_get_parentNode(
IXMLDOMNode** parent )
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_parentNode( This->node, parent );
+ return IXMLDOMNode_get_parentNode( IXMLDOMNode_from_impl(This->node), parent );
}
static HRESULT WINAPI domelem_get_childNodes(
IXMLDOMNodeList** outList)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_childNodes( This->node, outList );
+ return IXMLDOMNode_get_childNodes( IXMLDOMNode_from_impl(This->node), outList );
}
static HRESULT WINAPI domelem_get_firstChild(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_firstChild( This->node, domNode );
+ return IXMLDOMNode_get_firstChild( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_lastChild(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_lastChild( This->node, domNode );
+ return IXMLDOMNode_get_lastChild( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_previousSibling(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_previousSibling( This->node, domNode );
+ return IXMLDOMNode_get_previousSibling( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_nextSibling(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nextSibling( This->node, domNode );
+ return IXMLDOMNode_get_nextSibling( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_attributes(
IXMLDOMNamedNodeMap** attributeMap)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_attributes( This->node, attributeMap );
+ return IXMLDOMNode_get_attributes( IXMLDOMNode_from_impl(This->node), attributeMap );
}
static HRESULT WINAPI domelem_insertBefore(
IXMLDOMNode** outOldNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode );
+ return IXMLDOMNode_insertBefore( IXMLDOMNode_from_impl(This->node), newNode, var1, outOldNode );
}
static HRESULT WINAPI domelem_replaceChild(
IXMLDOMNode** outOldNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode );
+ return IXMLDOMNode_replaceChild( IXMLDOMNode_from_impl(This->node), newNode, oldNode, outOldNode );
}
static HRESULT WINAPI domelem_removeChild(
IXMLDOMNode* domNode, IXMLDOMNode** oldNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_removeChild( This->node, domNode, oldNode );
+ return IXMLDOMNode_removeChild( IXMLDOMNode_from_impl(This->node), domNode, oldNode );
}
static HRESULT WINAPI domelem_appendChild(
IXMLDOMNode* newNode, IXMLDOMNode** outNewNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_appendChild( This->node, newNode, outNewNode );
+ return IXMLDOMNode_appendChild( IXMLDOMNode_from_impl(This->node), newNode, outNewNode );
}
static HRESULT WINAPI domelem_hasChildNodes(
VARIANT_BOOL* pbool)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_hasChildNodes( This->node, pbool );
+ return IXMLDOMNode_hasChildNodes( IXMLDOMNode_from_impl(This->node), pbool );
}
static HRESULT WINAPI domelem_get_ownerDocument(
IXMLDOMDocument** domDocument)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_ownerDocument( This->node, domDocument );
+ return IXMLDOMNode_get_ownerDocument( IXMLDOMNode_from_impl(This->node), domDocument );
}
static HRESULT WINAPI domelem_cloneNode(
VARIANT_BOOL pbool, IXMLDOMNode** outNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_cloneNode( This->node, pbool, outNode );
+ return IXMLDOMNode_cloneNode( IXMLDOMNode_from_impl(This->node), pbool, outNode );
}
static HRESULT WINAPI domelem_get_nodeTypeString(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeTypeString( This->node, p );
+ return IXMLDOMNode_get_nodeTypeString( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_text(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_text( This->node, p );
+ return IXMLDOMNode_get_text( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_put_text(
BSTR p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_text( This->node, p );
+ return IXMLDOMNode_put_text( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_specified(
VARIANT_BOOL* pbool)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_specified( This->node, pbool );
+ return IXMLDOMNode_get_specified( IXMLDOMNode_from_impl(This->node), pbool );
}
static HRESULT WINAPI domelem_get_definition(
IXMLDOMNode** domNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_definition( This->node, domNode );
+ return IXMLDOMNode_get_definition( IXMLDOMNode_from_impl(This->node), domNode );
}
static HRESULT WINAPI domelem_get_nodeTypedValue(
VARIANT* var1)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_nodeTypedValue( This->node, var1 );
+ return IXMLDOMNode_get_nodeTypedValue( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_put_nodeTypedValue(
VARIANT var1)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_nodeTypedValue( This->node, var1 );
+ return IXMLDOMNode_put_nodeTypedValue( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_get_dataType(
VARIANT* var1)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_dataType( This->node, var1 );
+ return IXMLDOMNode_get_dataType( IXMLDOMNode_from_impl(This->node), var1 );
}
static HRESULT WINAPI domelem_put_dataType(
BSTR p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_put_dataType( This->node, p );
+ return IXMLDOMNode_put_dataType( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_xml(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_xml( This->node, p );
+ return IXMLDOMNode_get_xml( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_transformNode(
IXMLDOMNode* domNode, BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_transformNode( This->node, domNode, p );
+ return IXMLDOMNode_transformNode( IXMLDOMNode_from_impl(This->node), domNode, p );
}
static HRESULT WINAPI domelem_selectNodes(
BSTR p, IXMLDOMNodeList** outList)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_selectNodes( This->node, p, outList );
+ return IXMLDOMNode_selectNodes( IXMLDOMNode_from_impl(This->node), p, outList );
}
static HRESULT WINAPI domelem_selectSingleNode(
BSTR p, IXMLDOMNode** outNode)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_selectSingleNode( This->node, p, outNode );
+ return IXMLDOMNode_selectSingleNode( IXMLDOMNode_from_impl(This->node), p, outNode );
}
static HRESULT WINAPI domelem_get_parsed(
VARIANT_BOOL* pbool)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_parsed( This->node, pbool );
+ return IXMLDOMNode_get_parsed( IXMLDOMNode_from_impl(This->node), pbool );
}
static HRESULT WINAPI domelem_get_namespaceURI(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_namespaceURI( This->node, p );
+ return IXMLDOMNode_get_namespaceURI( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_prefix(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_prefix( This->node, p );
+ return IXMLDOMNode_get_prefix( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_get_baseName(
BSTR* p)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_get_baseName( This->node, p );
+ return IXMLDOMNode_get_baseName( IXMLDOMNode_from_impl(This->node), p );
}
static HRESULT WINAPI domelem_transformNodeToObject(
IXMLDOMNode* domNode, VARIANT var1)
{
domelem *This = impl_from_IXMLDOMElement( iface );
- return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 );
+ return IXMLDOMNode_transformNodeToObject( IXMLDOMNode_from_impl(This->node), domNode, var1 );
}
static HRESULT WINAPI domelem_get_tagName(
}
else if ( IsEqualGUID( riid, &IID_IXMLDOMNode ) )
{
- return IUnknown_QueryInterface(This->node_unk, riid, ppvObject);
+ *ppvObject = IXMLDOMNode_from_impl(This->node);
}
else
{
ref = InterlockedDecrement( &This->ref );
if ( ref == 0 )
{
- IUnknown_Release( This->node_unk );
+ IXMLDOMNode_Release( IXMLDOMNode_from_impl(This->node) );
HeapFree( GetProcessHeap(), 0, This );
}
IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter )
{
domelem *This;
- HRESULT hr;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
else
This->pUnkOuter = (IUnknown *)&This->lpInternalUnkVtbl;
- This->node_unk = create_basic_node( element, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ This->node = create_basic_node( element, (IUnknown*)&This->lpVtbl );
+ if(!This->node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
-
return (IUnknown*) &This->lpInternalUnkVtbl;
}
IUnknown* create_doc_entity_ref( xmlNodePtr entity )
{
entityref *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
This->lpVtbl = &entityref_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( entity, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( entity, (IUnknown*)&This->lpVtbl );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
#include "msxml.h"
#include "msxml2.h"
+#include "wine/unicode.h"
#include "wine/debug.h"
#include "wine/library.h"
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
+#ifdef HAVE_LIBXML2
+
+/* Support for loading xml files from a Wine Windows drive */
+static int wineXmlMatchCallback (char const * filename)
+{
+ int nRet = 0;
+
+ TRACE("%s\n", filename);
+
+ /*
+ * We will deal with loading XML files from the file system
+ * We only care about files that linux cannot find.
+ * e.g. C:,D: etc
+ */
+ if(isalpha(filename[0]) && filename[1] == ':')
+ nRet = 1;
+
+ return nRet;
+}
+
+static void *wineXmlOpenCallback (char const * filename)
+{
+ BSTR sFilename = bstr_from_xmlChar( (xmlChar*)filename);
+ HANDLE hFile;
+
+ TRACE("%s\n", debugstr_w(sFilename));
+
+ hFile = CreateFileW(sFilename, GENERIC_READ,FILE_SHARE_READ, NULL,
+ OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
+ if(hFile == INVALID_HANDLE_VALUE) hFile = 0;
+ SysFreeString(sFilename);
+ return hFile;
+}
+
+static int wineXmlReadCallback(void * context, char * buffer, int len)
+{
+ DWORD dwBytesRead;
+
+ TRACE("%p %s %d\n", context, buffer, len);
+
+ if ((context == NULL) || (buffer == NULL))
+ return(-1);
+
+ if(!ReadFile( context, buffer,len, &dwBytesRead, NULL))
+ {
+ ERR("Failed to read file\n");
+ return -1;
+ }
+
+ TRACE("Read %d\n", dwBytesRead);
+
+ return dwBytesRead;
+}
+
+static int wineXmlFileCloseCallback (void * context)
+{
+ return CloseHandle(context) ? 0 : -1;
+}
+
+#endif
+
+
HRESULT WINAPI DllCanUnloadNow(void)
{
FIXME("\n");
for this thread and as default for new threads */
xmlTreeIndentString = "\t";
xmlThrDefTreeIndentString("\t");
+
+ /* Register callbacks for loading XML files */
+ if(xmlRegisterInputCallbacks(wineXmlMatchCallback, wineXmlOpenCallback,
+ wineXmlReadCallback, wineXmlFileCloseCallback) == -1)
+ WARN("Failed to register callbacks\n");
+
#endif
init_libxslt();
DisableThreadLibraryCalls(hInstDLL);
}
#endif
#ifdef HAVE_LIBXML2
+ /* Restore default Callbacks */
+ xmlCleanupInputCallbacks();
+ xmlRegisterDefaultInputCallbacks();
+
xmlCleanupParser();
#endif
release_typelib();
extern IUnknown *create_domdoc( xmlNodePtr document );
extern IUnknown *create_xmldoc( void );
extern IXMLDOMNode *create_node( xmlNodePtr node );
-extern IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter );
extern IUnknown *create_element( xmlNodePtr element, IUnknown *pUnkOuter );
extern IUnknown *create_attribute( xmlNodePtr attribute );
extern IUnknown *create_text( xmlNodePtr text );
/* helpers */
extern xmlChar *xmlChar_from_wchar( LPWSTR str );
-extern BSTR bstr_from_xmlChar( const xmlChar *buf );
extern LONG xmldoc_add_ref( xmlDocPtr doc );
extern LONG xmldoc_release( xmlDocPtr doc );
return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
}
+static inline IXMLDOMNode *IXMLDOMNode_from_impl(xmlnode *This)
+{
+ return (IXMLDOMNode*)&This->lpVtbl;
+}
+
+extern xmlnode *create_basic_node(xmlNodePtr,IUnknown*);
+
extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document);
+static inline BSTR bstr_from_xmlChar(const xmlChar *str)
+{
+ BSTR ret = NULL;
+
+ if(str) {
+ DWORD len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)str, -1, NULL, 0);
+ ret = SysAllocStringLen(NULL, len-1);
+ if(ret)
+ MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)str, -1, ret, len);
+ }
+
+ return ret;
+}
+
#endif
void* libxslt_handle;
return S_OK;
}
-BSTR bstr_from_xmlChar( const xmlChar *buf )
-{
- DWORD len;
- LPWSTR str;
- BSTR bstr;
-
- if ( !buf )
- return NULL;
-
- len = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) buf, -1, NULL, 0 );
- str = HeapAlloc( GetProcessHeap(), 0, len * sizeof (WCHAR) );
- if ( !str )
- return NULL;
- MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) buf, -1, str, len );
- bstr = SysAllocString( str );
- HeapFree( GetProcessHeap(), 0, str );
- return bstr;
-}
-
static HRESULT WINAPI xmlnode_get_nodeValue(
IXMLDOMNode *iface,
VARIANT* value)
Internal_Release
};
-IUnknown *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
+xmlnode *create_basic_node( xmlNodePtr node, IUnknown *pUnkOuter )
{
xmlnode *This;
This->ref = 1;
This->node = node;
- return (IUnknown*)&This->lpInternalUnkVtbl;
+ return This;
}
IXMLDOMNode *create_node( xmlNodePtr node )
break;
default:
FIXME("only creating basic node for type %d\n", node->type);
- pUnk = create_basic_node( node, NULL );
+ pUnk = (IUnknown*)&create_basic_node( node, NULL )->lpInternalUnkVtbl;
}
hr = IUnknown_QueryInterface(pUnk, &IID_IXMLDOMNode, (LPVOID*)&ret);
IUnknown* create_pi( xmlNodePtr pi )
{
dom_pi *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
This->lpVtbl = &dom_pi_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( pi, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( pi, (IUnknown*)&This->lpVtbl );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}
"Msxml2.SAXXMLReader",
"3.0"
},
+ { &CLSID_MXXMLWriter,
+ "IMXWriter interface",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.MXXMLWriter",
+ "3.0"
+ },
+ { &CLSID_MXXMLWriter30,
+ "IMXWriter interface 3.0",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.MXXMLWriter",
+ "3.0"
+ },
{ NULL } /* list terminator */
};
&CLSID_SAXXMLReader30,
NULL
},
+ { "Msxml2.MXXMLWriter",
+ "MXXMLWriter",
+ &CLSID_MXXMLWriter,
+ "Msxml2.MXXMLWriter.3.0"
+ },
+ { "Msxml2.MXXMLWriter.3.0",
+ "MXXMLWriter 3.0",
+ &CLSID_MXXMLWriter30,
+ NULL
+ },
{ NULL } /* list terminator */
};
IUnknown* create_text( xmlNodePtr text )
{
domtext *This;
- HRESULT hr;
+ xmlnode *node;
This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
if ( !This )
This->lpVtbl = &domtext_vtbl;
This->ref = 1;
- This->node_unk = create_basic_node( text, (IUnknown*)&This->lpVtbl );
- if(!This->node_unk)
+ node = create_basic_node( text, (IUnknown*)&This->lpVtbl );
+ if(!node)
{
HeapFree(GetProcessHeap(), 0, This);
return NULL;
}
- hr = IUnknown_QueryInterface(This->node_unk, &IID_IXMLDOMNode, (LPVOID*)&This->node);
- if(FAILED(hr))
- {
- IUnknown_Release(This->node_unk);
- HeapFree( GetProcessHeap(), 0, This );
- return NULL;
- }
- /* The ref on This->node is actually looped back into this object, so release it */
- IXMLDOMNode_Release(This->node);
+ This->node_unk = (IUnknown*)&node->lpInternalUnkVtbl;
+ This->node = IXMLDOMNode_from_impl(node);
return (IUnknown*) &This->lpVtbl;
}