ReactOS 0.4.16-dev-2208-g6350669
domimpl.c
Go to the documentation of this file.
1/*
2 * DOM Document Implementation implementation
3 *
4 * Copyright 2007 Alistair Leslie-Hughes
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#define COBJMACROS
22
23#include <stdarg.h>
24
25#include "windef.h"
26#include "winbase.h"
27#include "winuser.h"
28#include "ole2.h"
29#include "msxml6.h"
30
31#include "msxml_dispex.h"
32
33#include "wine/debug.h"
34
36
37typedef struct _domimpl
38{
43
45{
46 return CONTAINING_RECORD(iface, domimpl, IXMLDOMImplementation_iface);
47}
48
52 void** ppvObject )
53{
55 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
56
57 if ( IsEqualGUID( riid, &IID_IXMLDOMImplementation ) ||
60 {
61 *ppvObject = iface;
62 }
63 else if (dispex_query_interface(&This->dispex, riid, ppvObject))
64 {
65 return *ppvObject ? S_OK : E_NOINTERFACE;
66 }
67 else
68 {
69 TRACE("Unsupported interface %s\n", debugstr_guid(riid));
70 *ppvObject = NULL;
71 return E_NOINTERFACE;
72 }
73
74 IXMLDOMImplementation_AddRef( iface );
75
76 return S_OK;
77}
78
80{
83 TRACE("%p, refcount %lu.\n", iface, ref);
84 return ref;
85}
86
88{
91
92 TRACE("%p, refcount %lu.\n", iface, ref);
93
94 if (!ref)
96
97 return ref;
98}
99
102 UINT* pctinfo )
103{
105 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
106}
107
110 UINT iTInfo, LCID lcid,
111 ITypeInfo** ppTInfo )
112{
114 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface,
115 iTInfo, lcid, ppTInfo);
116}
117
120 REFIID riid, LPOLESTR* rgszNames,
121 UINT cNames, LCID lcid, DISPID* rgDispId )
122{
124 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface,
125 riid, rgszNames, cNames, lcid, rgDispId);
126}
127
130 DISPID dispIdMember, REFIID riid, LCID lcid,
131 WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
132 EXCEPINFO* pExcepInfo, UINT* puArgErr )
133{
135 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface,
136 dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
137}
138
140{
141 static const WCHAR bVersion[] = {'1','.','0',0};
142 static const WCHAR bXML[] = {'X','M','L',0};
143 static const WCHAR bDOM[] = {'D','O','M',0};
144 static const WCHAR bMSDOM[] = {'M','S','-','D','O','M',0};
145 BOOL bValidFeature = FALSE;
146 BOOL bValidVersion = FALSE;
147
148 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(feature), debugstr_w(version), hasFeature);
149
150 if(!feature || !hasFeature)
151 return E_INVALIDARG;
152
153 *hasFeature = VARIANT_FALSE;
154
155 if(!version || lstrcmpiW(version, bVersion) == 0)
156 bValidVersion = TRUE;
157
158 if(lstrcmpiW(feature, bXML) == 0 || lstrcmpiW(feature, bDOM) == 0 || lstrcmpiW(feature, bMSDOM) == 0)
159 bValidFeature = TRUE;
160
161 if(bValidVersion && bValidFeature)
162 *hasFeature = VARIANT_TRUE;
163
164 return S_OK;
165}
166
167static const struct IXMLDOMImplementationVtbl domimpl_vtbl =
168{
177};
178
179static const tid_t domimpl_iface_tids[] =
180{
182 0
183};
184
186{
187 NULL,
189 NULL,
191};
192
194{
196
197 if (!(object = malloc(sizeof(*object))))
198 return E_OUTOFMEMORY;
199
200 object->IXMLDOMImplementation_iface.lpVtbl = &domimpl_vtbl;
201 object->ref = 1;
202 init_dispex(&object->dispex, (IUnknown *)&object->IXMLDOMImplementation_iface, &domimpl_dispex);
203
204 *ret = &object->IXMLDOMImplementation_iface;
205
206 return S_OK;
207}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
OLECHAR * BSTR
Definition: compat.h:2293
short VARIANT_BOOL
Definition: compat.h:2290
static const WCHAR version[]
Definition: asmname.c:66
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4265
LCID lcid
Definition: locale.c:5656
static dispex_static_data_t domimpl_dispex
Definition: domimpl.c:185
struct _domimpl domimpl
static HRESULT WINAPI domimpl_GetTypeInfo(IXMLDOMImplementation *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: domimpl.c:108
static ULONG WINAPI domimpl_AddRef(IXMLDOMImplementation *iface)
Definition: domimpl.c:79
HRESULT create_dom_implementation(IXMLDOMImplementation **ret)
Definition: domimpl.c:193
static HRESULT WINAPI domimpl_QueryInterface(IXMLDOMImplementation *iface, REFIID riid, void **ppvObject)
Definition: domimpl.c:49
static const struct IXMLDOMImplementationVtbl domimpl_vtbl
Definition: domimpl.c:167
static domimpl * impl_from_IXMLDOMImplementation(IXMLDOMImplementation *iface)
Definition: domimpl.c:44
static HRESULT WINAPI domimpl_hasFeature(IXMLDOMImplementation *This, BSTR feature, BSTR version, VARIANT_BOOL *hasFeature)
Definition: domimpl.c:139
static HRESULT WINAPI domimpl_Invoke(IXMLDOMImplementation *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: domimpl.c:128
static HRESULT WINAPI domimpl_GetIDsOfNames(IXMLDOMImplementation *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: domimpl.c:118
static HRESULT WINAPI domimpl_GetTypeInfoCount(IXMLDOMImplementation *iface, UINT *pctinfo)
Definition: domimpl.c:100
static ULONG WINAPI domimpl_Release(IXMLDOMImplementation *iface)
Definition: domimpl.c:87
static const tid_t domimpl_iface_tids[]
Definition: domimpl.c:179
return ret
Definition: mutex.c:146
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
tid_t
Definition: ieframe.h:311
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:919
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
static LPOLESTR
Definition: stg_prop.c:27
static VARIANTARG static DISPID
Definition: ordinal.c:49
INTERNETFEATURELIST feature
Definition: misc.c:1719
BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
Definition: dispex.c:1656
@ IXMLDOMImplementation_tid
Definition: msxml_dispex.h:49
unsigned int UINT
Definition: ndis.h:50
const GUID IID_IDispatch
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
DWORD LCID
Definition: nls.h:13
#define TRACE(s)
Definition: solgame.cpp:4
IXMLDOMImplementation IXMLDOMImplementation_iface
Definition: domimpl.c:40
DispatchEx dispex
Definition: domimpl.c:39
LONG ref
Definition: domimpl.c:41
Definition: send.c:48
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
__wchar_t WCHAR
Definition: xmlstorage.h:180