ReactOS 0.4.16-dev-2224-g3637fd8
nodemap.c
Go to the documentation of this file.
1/*
2 * Node map implementation
3 *
4 * Copyright 2005 Mike McCormack
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#include <libxml/parser.h>
25#include <libxml/xmlerror.h>
26
27#include "windef.h"
28#include "winbase.h"
29#include "winuser.h"
30#include "winnls.h"
31#include "ole2.h"
32#include "msxml6.h"
33#include "msxml2did.h"
34
35#include "msxml_private.h"
36
37#include "wine/debug.h"
38
40
41typedef struct
42{
47
48 xmlNodePtr node;
51
52 const struct nodemap_funcs *funcs;
54
56{
58 return IXMLDOMNamedNodeMap_get_item((IXMLDOMNamedNodeMap*)iface, index, (IXMLDOMNode**)&V_DISPATCH(item));
59}
60
63 NULL
64};
65
67{
68 return CONTAINING_RECORD(iface, xmlnodemap, IXMLDOMNamedNodeMap_iface);
69}
70
72{
73 return CONTAINING_RECORD(iface, xmlnodemap, ISupportErrorInfo_iface);
74}
75
78 REFIID riid, void** ppvObject )
79{
81 TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppvObject);
82
83 if( IsEqualGUID( riid, &IID_IUnknown ) ||
85 IsEqualGUID( riid, &IID_IXMLDOMNamedNodeMap ) )
86 {
87 *ppvObject = iface;
88 }
89 else if (IsEqualGUID( riid, &IID_IEnumVARIANT ))
90 {
91 if (!This->enumvariant)
92 {
94 if (FAILED(hr)) return hr;
95 }
96
97 return IEnumVARIANT_QueryInterface(This->enumvariant, &IID_IEnumVARIANT, ppvObject);
98 }
99 else if (dispex_query_interface(&This->dispex, riid, ppvObject))
100 {
101 return *ppvObject ? S_OK : E_NOINTERFACE;
102 }
103 else if( IsEqualGUID( riid, &IID_ISupportErrorInfo ))
104 {
105 *ppvObject = &This->ISupportErrorInfo_iface;
106 }
107 else
108 {
109 TRACE("interface %s not implemented\n", debugstr_guid(riid));
110 *ppvObject = NULL;
111 return E_NOINTERFACE;
112 }
113
114 IXMLDOMNamedNodeMap_AddRef( iface );
115
116 return S_OK;
117}
118
120 IXMLDOMNamedNodeMap *iface )
121{
124 TRACE("%p, refcount %lu.\n", iface, ref);
125 return ref;
126}
127
129 IXMLDOMNamedNodeMap *iface )
130{
133
134 TRACE("%p, refcount %lu.\n", iface, ref);
135
136 if (!ref)
137 {
138 xmlnode_release( This->node );
139 xmldoc_release( This->node->doc );
140 if (This->enumvariant) IEnumVARIANT_Release(This->enumvariant);
141 free( This );
142 }
143
144 return ref;
145}
146
148 IXMLDOMNamedNodeMap *iface,
149 UINT* pctinfo )
150{
152 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
153}
154
156 IXMLDOMNamedNodeMap *iface,
157 UINT iTInfo, LCID lcid,
158 ITypeInfo** ppTInfo )
159{
161 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface,
162 iTInfo, lcid, ppTInfo);
163}
164
166 IXMLDOMNamedNodeMap *iface,
167 REFIID riid, LPOLESTR* rgszNames,
168 UINT cNames, LCID lcid, DISPID* rgDispId )
169{
171 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface,
172 riid, rgszNames, cNames, lcid, rgDispId);
173}
174
176 IXMLDOMNamedNodeMap *iface,
177 DISPID dispIdMember, REFIID riid, LCID lcid,
178 WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
179 EXCEPINFO* pExcepInfo, UINT* puArgErr )
180{
182 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface,
183 dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
184}
185
187 IXMLDOMNamedNodeMap *iface,
188 BSTR name,
190{
192
193 TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), item );
194
195 return This->funcs->get_named_item(This->node, name, item);
196}
197
199 IXMLDOMNamedNodeMap *iface,
200 IXMLDOMNode* newItem,
201 IXMLDOMNode** namedItem)
202{
204
205 TRACE("(%p)->(%p %p)\n", This, newItem, namedItem );
206
207 return This->funcs->set_named_item(This->node, newItem, namedItem);
208}
209
211 IXMLDOMNamedNodeMap *iface,
212 BSTR name,
213 IXMLDOMNode** namedItem)
214{
216
217 TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), namedItem );
218
219 return This->funcs->remove_named_item(This->node, name, namedItem);
220}
221
223 IXMLDOMNamedNodeMap *iface,
224 LONG index,
226{
228
229 TRACE("%p, %ld, %p.\n", iface, index, item);
230
231 return This->funcs->get_item(This->node, index, item);
232}
233
235 IXMLDOMNamedNodeMap *iface,
236 LONG *length)
237{
239
240 TRACE("(%p)->(%p)\n", This, length);
241
242 return This->funcs->get_length(This->node, length);
243}
244
246 IXMLDOMNamedNodeMap *iface,
247 BSTR baseName,
248 BSTR namespaceURI,
250{
252
253 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(baseName), debugstr_w(namespaceURI), item);
254
255 return This->funcs->get_qualified_item(This->node, baseName, namespaceURI, item);
256}
257
259 IXMLDOMNamedNodeMap *iface,
260 BSTR baseName,
261 BSTR namespaceURI,
263{
265
266 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(baseName), debugstr_w(namespaceURI), item);
267
268 return This->funcs->remove_qualified_item(This->node, baseName, namespaceURI, item);
269}
270
272 IXMLDOMNamedNodeMap *iface,
273 IXMLDOMNode** nextItem)
274{
276
277 TRACE("%p, %p, %ld.\n", iface, nextItem, This->iterator);
278
279 return This->funcs->next_node(This->node, &This->iterator, nextItem);
280}
281
283 IXMLDOMNamedNodeMap *iface )
284{
286
287 TRACE("%p, %ld.\n", iface, This->iterator);
288
289 This->iterator = 0;
290
291 return S_OK;
292}
293
295 IXMLDOMNamedNodeMap *iface,
296 IUnknown** enumv)
297{
299 TRACE("(%p)->(%p)\n", This, enumv);
301}
302
303static const struct IXMLDOMNamedNodeMapVtbl XMLDOMNamedNodeMapVtbl =
304{
322};
323
325 ISupportErrorInfo *iface,
326 REFIID riid, void** ppvObject )
327{
329 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
330 return IXMLDOMNamedNodeMap_QueryInterface(&This->IXMLDOMNamedNodeMap_iface, riid, ppvObject);
331}
332
334 ISupportErrorInfo *iface )
335{
337 return IXMLDOMNamedNodeMap_AddRef(&This->IXMLDOMNamedNodeMap_iface);
338}
339
341 ISupportErrorInfo *iface )
342{
344 return IXMLDOMNamedNodeMap_Release(&This->IXMLDOMNamedNodeMap_iface);
345}
346
348 ISupportErrorInfo *iface,
349 REFIID riid )
350{
352 TRACE("(%p)->(%s)\n", This, debugstr_guid(riid));
353 return IsEqualGUID(riid, &IID_IXMLDOMNamedNodeMap) ? S_OK : S_FALSE;
354}
355
356static const struct ISupportErrorInfoVtbl SupportErrorInfoVtbl =
357{
362};
363
365{
366 WCHAR *ptr;
367 int idx = 0;
368
369 for(ptr = name; *ptr >= '0' && *ptr <= '9'; ptr++)
370 idx = idx*10 + (*ptr-'0');
371 if(*ptr)
372 return DISP_E_UNKNOWNNAME;
373
375 TRACE("ret %lx\n", *dispid);
376 return S_OK;
377}
378
380 VARIANT *res, EXCEPINFO *ei)
381{
383
384 TRACE("%p, %ld, %lx, %x, %p, %p, %p.\n", iface, id, lcid, flags, params, res, ei);
385
388
389 if (id < DISPID_DOM_COLLECTION_BASE || id > DISPID_DOM_COLLECTION_MAX)
390 return DISP_E_UNKNOWNNAME;
391
392 switch(flags)
393 {
394 case INVOKE_PROPERTYGET:
395 {
396 IXMLDOMNode *disp = NULL;
397
398 IXMLDOMNamedNodeMap_get_item(&This->IXMLDOMNamedNodeMap_iface, id - DISPID_DOM_COLLECTION_BASE, &disp);
399 V_DISPATCH(res) = (IDispatch*)disp;
400 break;
401 }
402 default:
403 {
404 FIXME("unimplemented flags %x\n", flags);
405 break;
406 }
407 }
408
409 TRACE("ret %p\n", V_DISPATCH(res));
410
411 return S_OK;
412}
413
417};
418
419static const tid_t xmlnodemap_iface_tids[] = {
421 0
422};
423
427 NULL,
429};
430
432{
434
435 This = malloc(sizeof(*This));
436 if ( !This )
437 return NULL;
438
439 This->IXMLDOMNamedNodeMap_iface.lpVtbl = &XMLDOMNamedNodeMapVtbl;
440 This->ISupportErrorInfo_iface.lpVtbl = &SupportErrorInfoVtbl;
441 This->node = node;
442 This->ref = 1;
443 This->iterator = 0;
444 This->enumvariant = NULL;
445 This->funcs = funcs;
446
447 init_dispex(&This->dispex, (IUnknown*)&This->IXMLDOMNamedNodeMap_iface, &xmlnodemap_dispex);
448
450 xmldoc_add_ref(node->doc);
451
452 return &This->IXMLDOMNamedNodeMap_iface;
453}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
const GUID IID_IUnknown
#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
unsigned int idx
Definition: utils.c:41
OLECHAR * BSTR
Definition: compat.h:2293
@ VT_DISPATCH
Definition: compat.h:2304
LCID lcid
Definition: locale.c:5656
LONG xmldoc_release(xmlDocPtr doc)
Definition: domdoc.c:653
LONG xmldoc_add_ref(xmlDocPtr doc)
Definition: domdoc.c:619
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
GLuint index
Definition: glext.h:6031
GLenum const GLfloat * params
Definition: glext.h:5645
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
tid_t
Definition: ieframe.h:311
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
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 PVOID ptr
Definition: dispmode.c:27
static LPOLESTR
Definition: stg_prop.c:27
static VARIANTARG static DISPID
Definition: ordinal.c:49
BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
Definition: dispex.c:1656
#define DISPID_DOM_COLLECTION_MAX
Definition: msxml2did.h:71
#define DISPID_DOM_COLLECTION_BASE
Definition: msxml2did.h:70
@ IXMLDOMNamedNodeMap_tid
Definition: msxml_dispex.h:50
void xmlnode_add_ref(xmlNodePtr node)
Definition: node.c:420
HRESULT create_enumvariant(IUnknown *, BOOL, const struct enumvariant_funcs *, IEnumVARIANT **)
Definition: selection.c:565
void xmlnode_release(xmlNodePtr node)
Definition: node.c:426
unsigned int UINT
Definition: ndis.h:50
static ULONG WINAPI support_error_Release(ISupportErrorInfo *iface)
Definition: nodemap.c:340
static ULONG WINAPI xmlnodemap_AddRef(IXMLDOMNamedNodeMap *iface)
Definition: nodemap.c:119
static HRESULT WINAPI xmlnodemap_GetIDsOfNames(IXMLDOMNamedNodeMap *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: nodemap.c:165
static HRESULT WINAPI xmlnodemap_getQualifiedItem(IXMLDOMNamedNodeMap *iface, BSTR baseName, BSTR namespaceURI, IXMLDOMNode **item)
Definition: nodemap.c:245
static xmlnodemap * impl_from_IXMLDOMNamedNodeMap(IXMLDOMNamedNodeMap *iface)
Definition: nodemap.c:66
static HRESULT WINAPI xmlnodemap_reset(IXMLDOMNamedNodeMap *iface)
Definition: nodemap.c:282
static HRESULT WINAPI xmlnodemap_getNamedItem(IXMLDOMNamedNodeMap *iface, BSTR name, IXMLDOMNode **item)
Definition: nodemap.c:186
static HRESULT WINAPI xmlnodemap_QueryInterface(IXMLDOMNamedNodeMap *iface, REFIID riid, void **ppvObject)
Definition: nodemap.c:76
static HRESULT xmlnodemap_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei)
Definition: nodemap.c:379
static ULONG WINAPI support_error_AddRef(ISupportErrorInfo *iface)
Definition: nodemap.c:333
static const struct ISupportErrorInfoVtbl SupportErrorInfoVtbl
Definition: nodemap.c:356
static ULONG WINAPI xmlnodemap_Release(IXMLDOMNamedNodeMap *iface)
Definition: nodemap.c:128
static const struct IXMLDOMNamedNodeMapVtbl XMLDOMNamedNodeMapVtbl
Definition: nodemap.c:303
static HRESULT WINAPI xmlnodemap_removeQualifiedItem(IXMLDOMNamedNodeMap *iface, BSTR baseName, BSTR namespaceURI, IXMLDOMNode **item)
Definition: nodemap.c:258
static HRESULT WINAPI xmlnodemap__newEnum(IXMLDOMNamedNodeMap *iface, IUnknown **enumv)
Definition: nodemap.c:294
static HRESULT WINAPI xmlnodemap_get_item(IXMLDOMNamedNodeMap *iface, LONG index, IXMLDOMNode **item)
Definition: nodemap.c:222
static dispex_static_data_t xmlnodemap_dispex
Definition: nodemap.c:424
static xmlnodemap * impl_from_ISupportErrorInfo(ISupportErrorInfo *iface)
Definition: nodemap.c:71
static HRESULT WINAPI support_error_InterfaceSupportsErrorInfo(ISupportErrorInfo *iface, REFIID riid)
Definition: nodemap.c:347
static const tid_t xmlnodemap_iface_tids[]
Definition: nodemap.c:419
IXMLDOMNamedNodeMap * create_nodemap(xmlNodePtr node, const struct nodemap_funcs *funcs)
Definition: nodemap.c:431
static HRESULT WINAPI xmlnodemap_Invoke(IXMLDOMNamedNodeMap *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: nodemap.c:175
static HRESULT xmlnodemap_get_dispid(IUnknown *iface, BSTR name, DWORD flags, DISPID *dispid)
Definition: nodemap.c:364
static const dispex_static_data_vtbl_t xmlnodemap_dispex_vtbl
Definition: nodemap.c:414
static HRESULT WINAPI xmlnodemap_GetTypeInfoCount(IXMLDOMNamedNodeMap *iface, UINT *pctinfo)
Definition: nodemap.c:147
static HRESULT WINAPI support_error_QueryInterface(ISupportErrorInfo *iface, REFIID riid, void **ppvObject)
Definition: nodemap.c:324
static HRESULT WINAPI xmlnodemap_get_length(IXMLDOMNamedNodeMap *iface, LONG *length)
Definition: nodemap.c:234
static HRESULT nodemap_get_item(IUnknown *iface, LONG index, VARIANT *item)
Definition: nodemap.c:55
static const struct enumvariant_funcs nodemap_enumvariant
Definition: nodemap.c:61
static HRESULT WINAPI xmlnodemap_GetTypeInfo(IXMLDOMNamedNodeMap *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: nodemap.c:155
static HRESULT WINAPI xmlnodemap_removeNamedItem(IXMLDOMNamedNodeMap *iface, BSTR name, IXMLDOMNode **namedItem)
Definition: nodemap.c:210
static HRESULT WINAPI xmlnodemap_nextNode(IXMLDOMNamedNodeMap *iface, IXMLDOMNode **nextItem)
Definition: nodemap.c:271
static HRESULT WINAPI xmlnodemap_setNamedItem(IXMLDOMNamedNodeMap *iface, IXMLDOMNode *newItem, IXMLDOMNode **namedItem)
Definition: nodemap.c:198
#define V_VT(A)
Definition: oleauto.h:211
#define V_DISPATCH(A)
Definition: oleauto.h:239
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
static struct __wine_debug_functions funcs
Definition: debug.c:48
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
Definition: name.c:39
Definition: send.c:48
LONG iterator
Definition: nodemap.c:49
ISupportErrorInfo ISupportErrorInfo_iface
Definition: nodemap.c:45
const struct nodemap_funcs * funcs
Definition: nodemap.c:52
LONG ref
Definition: nodemap.c:46
DispatchEx dispex
Definition: nodemap.c:43
IEnumVARIANT * enumvariant
Definition: nodemap.c:50
IXMLDOMNamedNodeMap IXMLDOMNamedNodeMap_iface
Definition: nodemap.c:44
xmlNodePtr node
Definition: nodemap.c:48
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
Definition: dlist.c:348
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618
__wchar_t WCHAR
Definition: xmlstorage.h:180