From e9e58f07d2ca688bd14c27ec0b37d567416456ed Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 5 Nov 2010 01:34:01 +0300 Subject: [PATCH] msxml3: Stub IXMLDOMDocumentType support. --- dlls/msxml3/Makefile.in | 1 + dlls/msxml3/doctype.c | 626 ++++++++++++++++++++++++++++++++++++++++++++ dlls/msxml3/msxml_private.h | 2 + dlls/msxml3/node.c | 3 + 4 files changed, 632 insertions(+) create mode 100644 dlls/msxml3/doctype.c diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in index 629e7c8b067..4ee98fd19be 100644 --- a/dlls/msxml3/Makefile.in +++ b/dlls/msxml3/Makefile.in @@ -11,6 +11,7 @@ C_SRCS = \ comment.c \ dispex.c \ docfrag.c \ + doctype.c \ domdoc.c \ domimpl.c \ element.c \ diff --git a/dlls/msxml3/doctype.c b/dlls/msxml3/doctype.c new file mode 100644 index 00000000000..8538f3f580f --- /dev/null +++ b/dlls/msxml3/doctype.c @@ -0,0 +1,626 @@ +/* + * DOM DTD node implementation + * + * Copyright 2010 Nikolay Sivov + * + * 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 "winnls.h" +#include "ole2.h" +#include "msxml6.h" + +#include "msxml_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msxml); + +#ifdef HAVE_LIBXML2 + +typedef struct _domdoctype +{ + xmlnode node; + const struct IXMLDOMDocumentTypeVtbl *lpVtbl; + LONG ref; +} domdoctype; + +static inline domdoctype *impl_from_IXMLDOMDocumentType( IXMLDOMDocumentType *iface ) +{ + return (domdoctype *)((char*)iface - FIELD_OFFSET(domdoctype, lpVtbl)); +} + +static HRESULT WINAPI domdoctype_QueryInterface( + IXMLDOMDocumentType *iface, + REFIID riid, + void** ppvObject ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_IXMLDOMDocumentType ) || + IsEqualGUID( riid, &IID_IXMLDOMNode ) || + IsEqualGUID( riid, &IID_IDispatch ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = &This->lpVtbl; + } + else if(node_query_interface(&This->node, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } + else + { + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef( (IUnknown*)*ppvObject ); + return S_OK; +} + +static ULONG WINAPI domdoctype_AddRef( + IXMLDOMDocumentType *iface ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI domdoctype_Release( + IXMLDOMDocumentType *iface ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) { + destroy_xmlnode(&This->node); + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI domdoctype_GetTypeInfoCount( + IXMLDOMDocumentType *iface, + UINT* pctinfo ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + + TRACE("(%p)->(%p)\n", This, pctinfo); + + *pctinfo = 1; + + return S_OK; +} + +static HRESULT WINAPI domdoctype_GetTypeInfo( + IXMLDOMDocumentType *iface, + UINT iTInfo, LCID lcid, + ITypeInfo** ppTInfo ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + HRESULT hr; + + TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); + + hr = get_typeinfo(IXMLDOMDocumentType_tid, ppTInfo); + + return hr; +} + +static HRESULT WINAPI domdoctype_GetIDsOfNames( + IXMLDOMDocumentType *iface, + REFIID riid, LPOLESTR* rgszNames, + UINT cNames, LCID lcid, DISPID* rgDispId ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, + lcid, rgDispId); + + if(!rgszNames || cNames == 0 || !rgDispId) + return E_INVALIDARG; + + hr = get_typeinfo(IXMLDOMDocumentType_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI domdoctype_Invoke( + IXMLDOMDocumentType *iface, + DISPID dispIdMember, REFIID riid, LCID lcid, + WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, + EXCEPINFO* pExcepInfo, UINT* puArgErr ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + + hr = get_typeinfo(IXMLDOMDocumentType_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI domdoctype_get_nodeName( + IXMLDOMDocumentType *iface, + BSTR* p ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_nodeValue( + IXMLDOMDocumentType *iface, + VARIANT* value) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, value); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_put_nodeValue( + IXMLDOMDocumentType *iface, + VARIANT value) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p): stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_nodeType( + IXMLDOMDocumentType *iface, + DOMNodeType* domNodeType ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + + TRACE("(%p)->(%p)\n", This, domNodeType); + + *domNodeType = NODE_DOCUMENT_TYPE; + return S_OK; +} + +static HRESULT WINAPI domdoctype_get_parentNode( + IXMLDOMDocumentType *iface, + IXMLDOMNode** parent ) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, parent); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_childNodes( + IXMLDOMDocumentType *iface, + IXMLDOMNodeList** outList) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, outList); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_firstChild( + IXMLDOMDocumentType *iface, + IXMLDOMNode** domNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, domNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_lastChild( + IXMLDOMDocumentType *iface, + IXMLDOMNode** domNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, domNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_previousSibling( + IXMLDOMDocumentType *iface, + IXMLDOMNode** domNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, domNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_nextSibling( + IXMLDOMDocumentType *iface, + IXMLDOMNode** domNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, domNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_attributes( + IXMLDOMDocumentType *iface, + IXMLDOMNamedNodeMap** attributeMap) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, attributeMap); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_insertBefore( + IXMLDOMDocumentType *iface, + IXMLDOMNode* newNode, VARIANT refChild, + IXMLDOMNode** outOldNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + + FIXME("(%p)->(%p x%d %p): stub\n", This, newNode, V_VT(&refChild), outOldNode); + + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_replaceChild( + IXMLDOMDocumentType *iface, + IXMLDOMNode* newNode, + IXMLDOMNode* oldNode, + IXMLDOMNode** outOldNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + + FIXME("(%p)->(%p %p %p): stub\n", This, newNode, oldNode, outOldNode); + + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_removeChild( + IXMLDOMDocumentType *iface, + IXMLDOMNode* domNode, IXMLDOMNode** oldNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p %p): stub\n", This, domNode, oldNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_appendChild( + IXMLDOMDocumentType *iface, + IXMLDOMNode* newNode, IXMLDOMNode** outNewNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p %p): stub\n", This, newNode, outNewNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_hasChildNodes( + IXMLDOMDocumentType *iface, + VARIANT_BOOL* pbool) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, pbool); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_ownerDocument( + IXMLDOMDocumentType *iface, + IXMLDOMDocument** domDocument) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, domDocument); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_cloneNode( + IXMLDOMDocumentType *iface, + VARIANT_BOOL deep, IXMLDOMNode** outNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%d %p): stub\n", This, deep, outNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_nodeTypeString( + IXMLDOMDocumentType *iface, + BSTR* p) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_text( + IXMLDOMDocumentType *iface, + BSTR* p) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_put_text( + IXMLDOMDocumentType *iface, + BSTR p) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(p)); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_specified( + IXMLDOMDocumentType *iface, + VARIANT_BOOL* isSpecified) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, isSpecified); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_definition( + IXMLDOMDocumentType *iface, + IXMLDOMNode** definitionNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p)\n", This, definitionNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_nodeTypedValue( + IXMLDOMDocumentType *iface, + VARIANT* var1) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, var1); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_put_nodeTypedValue( + IXMLDOMDocumentType *iface, + VARIANT value) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p): stub\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_dataType( + IXMLDOMDocumentType *iface, + VARIANT* typename) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, typename); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_put_dataType( + IXMLDOMDocumentType *iface, + BSTR p) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%s): stub\n", This, debugstr_w(p)); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_xml( + IXMLDOMDocumentType *iface, + BSTR* p) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_transformNode( + IXMLDOMDocumentType *iface, + IXMLDOMNode* domNode, BSTR* p) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p %p): stub\n", This, domNode, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_selectNodes( + IXMLDOMDocumentType *iface, + BSTR p, IXMLDOMNodeList** outList) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%s %p): stub\n", This, debugstr_w(p), outList); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_selectSingleNode( + IXMLDOMDocumentType *iface, + BSTR p, IXMLDOMNode** outNode) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%s %p): stub\n", This, debugstr_w(p), outNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_parsed( + IXMLDOMDocumentType *iface, + VARIANT_BOOL* isParsed) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, isParsed); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_namespaceURI( + IXMLDOMDocumentType *iface, + BSTR* p) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_prefix( + IXMLDOMDocumentType *iface, + BSTR* prefix) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, prefix); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_baseName( + IXMLDOMDocumentType *iface, + BSTR* name) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, name); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_transformNodeToObject( + IXMLDOMDocumentType *iface, + IXMLDOMNode* domNode, VARIANT var1) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, domNode); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_name( + IXMLDOMDocumentType *iface, + BSTR *p) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_entities( + IXMLDOMDocumentType *iface, + IXMLDOMNamedNodeMap **entityMap) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, entityMap); + return E_NOTIMPL; +} + +static HRESULT WINAPI domdoctype_get_notations( + IXMLDOMDocumentType *iface, + IXMLDOMNamedNodeMap **notationMap) +{ + domdoctype *This = impl_from_IXMLDOMDocumentType( iface ); + FIXME("(%p)->(%p): stub\n", This, notationMap); + return E_NOTIMPL; +} + +static const struct IXMLDOMDocumentTypeVtbl domdoctype_vtbl = +{ + domdoctype_QueryInterface, + domdoctype_AddRef, + domdoctype_Release, + domdoctype_GetTypeInfoCount, + domdoctype_GetTypeInfo, + domdoctype_GetIDsOfNames, + domdoctype_Invoke, + domdoctype_get_nodeName, + domdoctype_get_nodeValue, + domdoctype_put_nodeValue, + domdoctype_get_nodeType, + domdoctype_get_parentNode, + domdoctype_get_childNodes, + domdoctype_get_firstChild, + domdoctype_get_lastChild, + domdoctype_get_previousSibling, + domdoctype_get_nextSibling, + domdoctype_get_attributes, + domdoctype_insertBefore, + domdoctype_replaceChild, + domdoctype_removeChild, + domdoctype_appendChild, + domdoctype_hasChildNodes, + domdoctype_get_ownerDocument, + domdoctype_cloneNode, + domdoctype_get_nodeTypeString, + domdoctype_get_text, + domdoctype_put_text, + domdoctype_get_specified, + domdoctype_get_definition, + domdoctype_get_nodeTypedValue, + domdoctype_put_nodeTypedValue, + domdoctype_get_dataType, + domdoctype_put_dataType, + domdoctype_get_xml, + domdoctype_transformNode, + domdoctype_selectNodes, + domdoctype_selectSingleNode, + domdoctype_get_parsed, + domdoctype_get_namespaceURI, + domdoctype_get_prefix, + domdoctype_get_baseName, + domdoctype_transformNodeToObject, + domdoctype_get_name, + domdoctype_get_entities, + domdoctype_get_notations +}; + +static const tid_t domdoctype_iface_tids[] = { + IXMLDOMDocumentType_tid, + 0 +}; + +static dispex_static_data_t domdoctype_dispex = { + NULL, + IXMLDOMDocumentType_tid, + NULL, + domdoctype_iface_tids +}; + +IUnknown* create_doc_type( xmlNodePtr doctype ) +{ + domdoctype *This; + + This = heap_alloc( sizeof *This ); + if ( !This ) + return NULL; + + This->lpVtbl = &domdoctype_vtbl; + This->ref = 1; + + init_xmlnode(&This->node, doctype, (IXMLDOMNode*)&This->lpVtbl, &domdoctype_dispex); + + return (IUnknown*) &This->lpVtbl; +} + +#endif diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 4af9bca2511..1fd91b1cb42 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -37,6 +37,7 @@ typedef enum tid_t { IXMLDOMDocument_tid, IXMLDOMDocument2_tid, IXMLDOMDocumentFragment_tid, + IXMLDOMDocumentType_tid, IXMLDOMElement_tid, IXMLDOMEntityReference_tid, IXMLDOMImplementation_tid, @@ -124,6 +125,7 @@ extern IXMLDOMNamedNodeMap *create_nodemap( IXMLDOMNode *node ); extern IUnknown *create_doc_Implementation(void); extern IUnknown *create_doc_fragment( xmlNodePtr fragment ); extern IUnknown *create_doc_entity_ref( xmlNodePtr entity ); +extern IUnknown *create_doc_type( xmlNodePtr doctype ); extern HRESULT queryresult_create( xmlNodePtr, LPCWSTR, IXMLDOMNodeList ** ); diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 9e8177a924e..0b814188efc 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -1959,6 +1959,9 @@ IXMLDOMNode *create_node( xmlNodePtr node ) case XML_DOCUMENT_FRAG_NODE: pUnk = create_doc_fragment( node ); break; + case XML_DTD_NODE: + pUnk = create_doc_type( node ); + break; default: { unknode *new_node; -- 2.11.4.GIT