diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in index 5b9261f3416..d79e71c63ba 100644 --- a/dlls/msxml3/Makefile.in +++ b/dlls/msxml3/Makefile.in @@ -19,6 +19,7 @@ C_SRCS = \ nodelist.c \ nodemap.c \ parseerror.c \ + pi.c \ regsvr.c \ text.c \ uuid.c diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 35ff59efb99..1314811542b 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -744,8 +744,23 @@ static HRESULT WINAPI domdoc_createProcessingInstruction( BSTR data, IXMLDOMProcessingInstruction** pi ) { - FIXME("\n"); - return E_NOTIMPL; + xmlNodePtr xmlnode; + domdoc *This = impl_from_IXMLDOMDocument( iface ); + xmlChar *xml_target, *xml_content; + + TRACE("%p->(%s %s %p)\n", iface, debugstr_w(target), debugstr_w(data), pi); + + xml_target = xmlChar_from_wchar((WCHAR*)target); + xml_content = xmlChar_from_wchar((WCHAR*)data); + + xmlnode = xmlNewDocPI(get_doc(This), xml_target, xml_content); + TRACE("created xmlptr %p\n", xmlnode); + *pi = (IXMLDOMProcessingInstruction*)create_pi(xmlnode); + + HeapFree(GetProcessHeap(), 0, xml_content); + HeapFree(GetProcessHeap(), 0, xml_target); + + return S_OK; } diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 5516361f6fe..e9a6da7b1c0 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -35,6 +35,7 @@ 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 ); +extern IUnknown *create_pi( xmlNodePtr pi ); extern IUnknown *create_comment( xmlNodePtr comment ); extern IXMLDOMNodeList *create_nodelist( xmlNodePtr node ); extern IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node ); diff --git a/dlls/msxml3/pi.c b/dlls/msxml3/pi.c new file mode 100644 index 00000000000..148b8aef87c --- /dev/null +++ b/dlls/msxml3/pi.c @@ -0,0 +1,544 @@ +/* + * DOM processing instruction node implementation + * + * Copyright 2006 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS + +#include "config.h" + +#include +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "msxml2.h" + +#include "msxml_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msxml); + +#ifdef HAVE_LIBXML2 + +typedef struct _dom_pi +{ + const struct IXMLDOMProcessingInstructionVtbl *lpVtbl; + LONG ref; + IUnknown *node_unk; + IXMLDOMNode *node; +} dom_pi; + +static inline dom_pi *impl_from_IXMLDOMProcessingInstruction( IXMLDOMProcessingInstruction *iface ) +{ + return (dom_pi *)((char*)iface - FIELD_OFFSET(dom_pi, lpVtbl)); +} + +static inline xmlNodePtr get_pi( dom_pi *This ) +{ + return xmlNodePtr_from_domnode( This->node, XML_PI_NODE ); +} + +static HRESULT WINAPI dom_pi_QueryInterface( + IXMLDOMProcessingInstruction *iface, + REFIID riid, + void** ppvObject ) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_IXMLDOMProcessingInstruction ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = iface; + } + else if ( IsEqualGUID( riid, &IID_IDispatch ) || + IsEqualGUID( riid, &IID_IXMLDOMNode ) ) + { + return IUnknown_QueryInterface(This->node_unk, riid, ppvObject); + } + else + { + FIXME("Unsupported inteferace %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IXMLDOMProcessingInstruction_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI dom_pi_AddRef( + IXMLDOMProcessingInstruction *iface ) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return InterlockedIncrement( &This->ref ); +} + +static ULONG WINAPI dom_pi_Release( + IXMLDOMProcessingInstruction *iface ) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + ULONG ref; + + ref = InterlockedDecrement( &This->ref ); + if ( ref == 0 ) + { + IUnknown_Release( This->node_unk ); + HeapFree( GetProcessHeap(), 0, This ); + } + + return ref; +} + +static HRESULT WINAPI dom_pi_GetTypeInfoCount( + IXMLDOMProcessingInstruction *iface, + UINT* pctinfo ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI dom_pi_GetTypeInfo( + IXMLDOMProcessingInstruction *iface, + UINT iTInfo, LCID lcid, + ITypeInfo** ppTInfo ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI dom_pi_GetIDsOfNames( + IXMLDOMProcessingInstruction *iface, + REFIID riid, LPOLESTR* rgszNames, + UINT cNames, LCID lcid, DISPID* rgDispId ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI dom_pi_Invoke( + IXMLDOMProcessingInstruction *iface, + DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, + EXCEPINFO* pExcepInfo, UINT* puArgErr ) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI dom_pi_get_nodeName( + IXMLDOMProcessingInstruction *iface, + BSTR* p ) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_nodeName( This->node, p ); +} + +static HRESULT WINAPI dom_pi_get_nodeValue( + IXMLDOMProcessingInstruction *iface, + VARIANT* var1 ) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_nodeValue( This->node, var1 ); +} + +static HRESULT WINAPI dom_pi_put_nodeValue( + IXMLDOMProcessingInstruction *iface, + VARIANT var1 ) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_put_nodeValue( This->node, var1 ); +} + +static HRESULT WINAPI dom_pi_get_nodeType( + IXMLDOMProcessingInstruction *iface, + DOMNodeType* domNodeType ) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_nodeType( This->node, domNodeType ); +} + +static HRESULT WINAPI dom_pi_get_parentNode( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode** parent ) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_parentNode( This->node, parent ); +} + +static HRESULT WINAPI dom_pi_get_childNodes( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNodeList** outList) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_childNodes( This->node, outList ); +} + +static HRESULT WINAPI dom_pi_get_firstChild( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode** domNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_firstChild( This->node, domNode ); +} + +static HRESULT WINAPI dom_pi_get_lastChild( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode** domNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_lastChild( This->node, domNode ); +} + +static HRESULT WINAPI dom_pi_get_previousSibling( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode** domNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_previousSibling( This->node, domNode ); +} + +static HRESULT WINAPI dom_pi_get_nextSibling( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode** domNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_nextSibling( This->node, domNode ); +} + +static HRESULT WINAPI dom_pi_get_attributes( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNamedNodeMap** attributeMap) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_attributes( This->node, attributeMap ); +} + +static HRESULT WINAPI dom_pi_insertBefore( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode* newNode, VARIANT var1, + IXMLDOMNode** outOldNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_insertBefore( This->node, newNode, var1, outOldNode ); +} + +static HRESULT WINAPI dom_pi_replaceChild( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode* newNode, + IXMLDOMNode* oldNode, + IXMLDOMNode** outOldNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_replaceChild( This->node, newNode, oldNode, outOldNode ); +} + +static HRESULT WINAPI dom_pi_removeChild( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode* domNode, IXMLDOMNode** oldNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_removeChild( This->node, domNode, oldNode ); +} + +static HRESULT WINAPI dom_pi_appendChild( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode* newNode, IXMLDOMNode** outNewNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_appendChild( This->node, newNode, outNewNode ); +} + +static HRESULT WINAPI dom_pi_hasChildNodes( + IXMLDOMProcessingInstruction *iface, + VARIANT_BOOL* pbool) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_hasChildNodes( This->node, pbool ); +} + +static HRESULT WINAPI dom_pi_get_ownerDocument( + IXMLDOMProcessingInstruction *iface, + IXMLDOMDocument** domDocument) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_ownerDocument( This->node, domDocument ); +} + +static HRESULT WINAPI dom_pi_cloneNode( + IXMLDOMProcessingInstruction *iface, + VARIANT_BOOL pbool, IXMLDOMNode** outNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_cloneNode( This->node, pbool, outNode ); +} + +static HRESULT WINAPI dom_pi_get_nodeTypeString( + IXMLDOMProcessingInstruction *iface, + BSTR* p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_nodeTypeString( This->node, p ); +} + +static HRESULT WINAPI dom_pi_get_text( + IXMLDOMProcessingInstruction *iface, + BSTR* p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_text( This->node, p ); +} + +static HRESULT WINAPI dom_pi_put_text( + IXMLDOMProcessingInstruction *iface, + BSTR p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_put_text( This->node, p ); +} + +static HRESULT WINAPI dom_pi_get_specified( + IXMLDOMProcessingInstruction *iface, + VARIANT_BOOL* pbool) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_specified( This->node, pbool ); +} + +static HRESULT WINAPI dom_pi_get_definition( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode** domNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_definition( This->node, domNode ); +} + +static HRESULT WINAPI dom_pi_get_nodeTypedValue( + IXMLDOMProcessingInstruction *iface, + VARIANT* var1) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_nodeTypedValue( This->node, var1 ); +} + +static HRESULT WINAPI dom_pi_put_nodeTypedValue( + IXMLDOMProcessingInstruction *iface, + VARIANT var1) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_put_nodeTypedValue( This->node, var1 ); +} + +static HRESULT WINAPI dom_pi_get_dataType( + IXMLDOMProcessingInstruction *iface, + VARIANT* var1) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_dataType( This->node, var1 ); +} + +static HRESULT WINAPI dom_pi_put_dataType( + IXMLDOMProcessingInstruction *iface, + BSTR p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_put_dataType( This->node, p ); +} + +static HRESULT WINAPI dom_pi_get_xml( + IXMLDOMProcessingInstruction *iface, + BSTR* p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_xml( This->node, p ); +} + +static HRESULT WINAPI dom_pi_transformNode( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode* domNode, BSTR* p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_transformNode( This->node, domNode, p ); +} + +static HRESULT WINAPI dom_pi_selectNodes( + IXMLDOMProcessingInstruction *iface, + BSTR p, IXMLDOMNodeList** outList) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_selectNodes( This->node, p, outList ); +} + +static HRESULT WINAPI dom_pi_selectSingleNode( + IXMLDOMProcessingInstruction *iface, + BSTR p, IXMLDOMNode** outNode) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_selectSingleNode( This->node, p, outNode ); +} + +static HRESULT WINAPI dom_pi_get_parsed( + IXMLDOMProcessingInstruction *iface, + VARIANT_BOOL* pbool) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_parsed( This->node, pbool ); +} + +static HRESULT WINAPI dom_pi_get_namespaceURI( + IXMLDOMProcessingInstruction *iface, + BSTR* p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_namespaceURI( This->node, p ); +} + +static HRESULT WINAPI dom_pi_get_prefix( + IXMLDOMProcessingInstruction *iface, + BSTR* p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_prefix( This->node, p ); +} + +static HRESULT WINAPI dom_pi_get_baseName( + IXMLDOMProcessingInstruction *iface, + BSTR* p) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_get_baseName( This->node, p ); +} + +static HRESULT WINAPI dom_pi_transformNodeToObject( + IXMLDOMProcessingInstruction *iface, + IXMLDOMNode* domNode, VARIANT var1) +{ + dom_pi *This = impl_from_IXMLDOMProcessingInstruction( iface ); + return IXMLDOMNode_transformNodeToObject( This->node, domNode, var1 ); +} + +static HRESULT WINAPI dom_pi_get_target( + IXMLDOMProcessingInstruction *iface, + BSTR *p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI dom_pi_get_data( + IXMLDOMProcessingInstruction *iface, + BSTR *p) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI dom_pi_put_data( + IXMLDOMProcessingInstruction *iface, + BSTR data) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +static const struct IXMLDOMProcessingInstructionVtbl dom_pi_vtbl = +{ + dom_pi_QueryInterface, + dom_pi_AddRef, + dom_pi_Release, + dom_pi_GetTypeInfoCount, + dom_pi_GetTypeInfo, + dom_pi_GetIDsOfNames, + dom_pi_Invoke, + dom_pi_get_nodeName, + dom_pi_get_nodeValue, + dom_pi_put_nodeValue, + dom_pi_get_nodeType, + dom_pi_get_parentNode, + dom_pi_get_childNodes, + dom_pi_get_firstChild, + dom_pi_get_lastChild, + dom_pi_get_previousSibling, + dom_pi_get_nextSibling, + dom_pi_get_attributes, + dom_pi_insertBefore, + dom_pi_replaceChild, + dom_pi_removeChild, + dom_pi_appendChild, + dom_pi_hasChildNodes, + dom_pi_get_ownerDocument, + dom_pi_cloneNode, + dom_pi_get_nodeTypeString, + dom_pi_get_text, + dom_pi_put_text, + dom_pi_get_specified, + dom_pi_get_definition, + dom_pi_get_nodeTypedValue, + dom_pi_put_nodeTypedValue, + dom_pi_get_dataType, + dom_pi_put_dataType, + dom_pi_get_xml, + dom_pi_transformNode, + dom_pi_selectNodes, + dom_pi_selectSingleNode, + dom_pi_get_parsed, + dom_pi_get_namespaceURI, + dom_pi_get_prefix, + dom_pi_get_baseName, + dom_pi_transformNodeToObject, + + dom_pi_get_target, + dom_pi_get_data, + dom_pi_put_data +}; + +IUnknown* create_pi( xmlNodePtr pi ) +{ + dom_pi *This; + HRESULT hr; + + This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + if ( !This ) + return NULL; + + This->lpVtbl = &dom_pi_vtbl; + This->ref = 1; + + This->node_unk = create_basic_node( pi, (IUnknown*)&This->lpVtbl ); + if(!This->node_unk) + { + 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->lpVtbl; +} + +#endif