qcap: Win64 printf format warning fixes.
[wine] / dlls / mshtml / htmlnode.c
CommitLineData
54036bf6
JC
1/*
2 * Copyright 2006 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
360a3f91 16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
54036bf6
JC
17 */
18
19#include "config.h"
20
21#include <stdarg.h>
22#include <stdio.h>
23
24#define COBJMACROS
25
26#include "windef.h"
27#include "winbase.h"
28#include "winuser.h"
29#include "winnls.h"
30#include "ole2.h"
31
32#include "wine/debug.h"
33
34#include "mshtml_private.h"
35
36WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
37
38#define NSSUPPORTS(x) ((nsISupports*) &(x)->lpSupportsVtbl)
39
40#define HTMLDOMNODE_THIS(iface) DEFINE_THIS(HTMLDOMNode, HTMLDOMNode, iface)
41
42static HRESULT WINAPI HTMLDOMNode_QueryInterface(IHTMLDOMNode *iface,
43 REFIID riid, void **ppv)
44{
45 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
3d9d3844 46 HRESULT hres;
54036bf6
JC
47
48 if(This->impl.unk)
49 return IUnknown_QueryInterface(This->impl.unk, riid, ppv);
50
3d9d3844
JC
51 hres = HTMLDOMNode_QI(This, riid, ppv);
52 if(FAILED(hres))
53 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
54036bf6 54
3d9d3844 55 return hres;
54036bf6
JC
56}
57
58static ULONG WINAPI HTMLDOMNode_AddRef(IHTMLDOMNode *iface)
59{
60 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
61
62 if(This->impl.unk)
63 return IUnknown_AddRef(This->impl.unk);
64
65 TRACE("(%p)\n", This);
66 return IHTMLDocument2_AddRef(HTMLDOC(This->doc));
67}
68
69static ULONG WINAPI HTMLDOMNode_Release(IHTMLDOMNode *iface)
70{
71 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
72
73 if(This->impl.unk)
74 return IUnknown_Release(This->impl.unk);
75
76 TRACE("(%p)\n", This);
77 return IHTMLDocument2_Release(HTMLDOC(This->doc));
78}
79
80static HRESULT WINAPI HTMLDOMNode_GetTypeInfoCount(IHTMLDOMNode *iface, UINT *pctinfo)
81{
82 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
83 FIXME("(%p)->(%p)\n", This, pctinfo);
84 return E_NOTIMPL;
85}
86
87static HRESULT WINAPI HTMLDOMNode_GetTypeInfo(IHTMLDOMNode *iface, UINT iTInfo,
88 LCID lcid, ITypeInfo **ppTInfo)
89{
90 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
0c74c0a9 91 FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
54036bf6
JC
92 return E_NOTIMPL;
93}
94
95static HRESULT WINAPI HTMLDOMNode_GetIDsOfNames(IHTMLDOMNode *iface, REFIID riid,
96 LPOLESTR *rgszNames, UINT cNames,
97 LCID lcid, DISPID *rgDispId)
98{
99 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
0c74c0a9 100 FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
54036bf6
JC
101 lcid, rgDispId);
102 return E_NOTIMPL;
103}
104
105static HRESULT WINAPI HTMLDOMNode_Invoke(IHTMLDOMNode *iface, DISPID dispIdMember,
106 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
107 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
108{
109 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
0c74c0a9 110 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
54036bf6
JC
111 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
112 return E_NOTIMPL;
113}
114
115static HRESULT WINAPI HTMLDOMNode_get_nodeType(IHTMLDOMNode *iface, long *p)
116{
117 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
118 FIXME("(%p)->(%p)\n", This, p);
119 return E_NOTIMPL;
120}
121
122static HRESULT WINAPI HTMLDOMNode_get_parentNode(IHTMLDOMNode *iface, IHTMLDOMNode **p)
123{
124 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
125 FIXME("(%p)->(%p)\n", This, p);
126 return E_NOTIMPL;
127}
128
129static HRESULT WINAPI HTMLDOMNode_hasChildNodes(IHTMLDOMNode *iface, VARIANT_BOOL *fChildren)
130{
131 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
132 FIXME("(%p)->(%p)\n", This, fChildren);
133 return E_NOTIMPL;
134}
135
136static HRESULT WINAPI HTMLDOMNode_get_childNodes(IHTMLDOMNode *iface, IDispatch **p)
137{
138 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
139 FIXME("(%p)->(%p)\n", This, p);
140 return E_NOTIMPL;
141}
142
143static HRESULT WINAPI HTMLDOMNode_get_attributes(IHTMLDOMNode *iface, IDispatch **p)
144{
145 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
146 FIXME("(%p)->(%p)\n", This, p);
147 return E_NOTIMPL;
148}
149
150static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
151 VARIANT refChild, IHTMLDOMNode **node)
152{
153 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
154 FIXME("(%p)->(%p v %p)\n", This, newChild, node);
155 return E_NOTIMPL;
156}
157
158static HRESULT WINAPI HTMLDOMNode_removeChild(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
159 IHTMLDOMNode **node)
160{
161 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
162 FIXME("(%p)->(%p %p)\n", This, newChild, node);
163 return E_NOTIMPL;
164}
165
166static HRESULT WINAPI HTMLDOMNode_replaceChild(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
167 IHTMLDOMNode *oldChild, IHTMLDOMNode **node)
168{
169 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
170 FIXME("(%p)->(%p %p %p)\n", This, newChild, oldChild, node);
171 return E_NOTIMPL;
172}
173
174static HRESULT WINAPI HTMLDOMNode_cloneNode(IHTMLDOMNode *iface, VARIANT_BOOL fDeep,
175 IHTMLDOMNode **clonedNode)
176{
177 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
178 FIXME("(%p)->(%x %p)\n", This, fDeep, clonedNode);
179 return E_NOTIMPL;
180}
181
182static HRESULT WINAPI HTMLDOMNode_removeNode(IHTMLDOMNode *iface, VARIANT_BOOL fDeep,
183 IHTMLDOMNode **removed)
184{
185 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
186 FIXME("(%p)->(%x %p)\n", This, fDeep, removed);
187 return E_NOTIMPL;
188}
189
190static HRESULT WINAPI HTMLDOMNode_swapNode(IHTMLDOMNode *iface, IHTMLDOMNode *otherNode,
191 IHTMLDOMNode **swappedNode)
192{
193 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
194 FIXME("(%p)->(%p %p)\n", This, otherNode, swappedNode);
195 return E_NOTIMPL;
196}
197
198static HRESULT WINAPI HTMLDOMNode_replaceNode(IHTMLDOMNode *iface, IHTMLDOMNode *replacement,
199 IHTMLDOMNode **replaced)
200{
201 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
202 FIXME("(%p)->(%p %p)\n", This, replacement, replaced);
203 return E_NOTIMPL;
204}
205
206static HRESULT WINAPI HTMLDOMNode_appendChild(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
207 IHTMLDOMNode **node)
208{
209 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
210 FIXME("(%p)->(%p %p)\n", This, newChild, node);
211 return E_NOTIMPL;
212}
213
214static HRESULT WINAPI HTMLDOMNode_get_nodeName(IHTMLDOMNode *iface, BSTR *p)
215{
216 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
217 FIXME("(%p)->(%p)\n", This, p);
218 return E_NOTIMPL;
219}
220
221static HRESULT WINAPI HTMLDOMNode_put_nodeValue(IHTMLDOMNode *iface, VARIANT v)
222{
223 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
224 FIXME("(%p)->()\n", This);
225 return E_NOTIMPL;
226}
227
228static HRESULT WINAPI HTMLDOMNode_get_nodeValue(IHTMLDOMNode *iface, VARIANT *p)
229{
230 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
231 FIXME("(%p)->(%p)\n", This, p);
232 return E_NOTIMPL;
233}
234
235static HRESULT WINAPI HTMLDOMNode_get_firstChild(IHTMLDOMNode *iface, IHTMLDOMNode **p)
236{
237 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
238 FIXME("(%p)->(%p)\n", This, p);
239 return E_NOTIMPL;
240}
241
242static HRESULT WINAPI HTMLDOMNode_get_lastChild(IHTMLDOMNode *iface, IHTMLDOMNode **p)
243{
244 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
245 FIXME("(%p)->(%p)\n", This, p);
246 return E_NOTIMPL;
247}
248
249static HRESULT WINAPI HTMLDOMNode_get_previousSibling(IHTMLDOMNode *iface, IHTMLDOMNode **p)
250{
251 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
252 FIXME("(%p)->(%p)\n", This, p);
253 return E_NOTIMPL;
254}
255
256static HRESULT WINAPI HTMLDOMNode_get_nextSibling(IHTMLDOMNode *iface, IHTMLDOMNode **p)
257{
258 HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
259 FIXME("(%p)->(%p)\n", This, p);
260 return E_NOTIMPL;
261}
262
263static const IHTMLDOMNodeVtbl HTMLDOMNodeVtbl = {
264 HTMLDOMNode_QueryInterface,
265 HTMLDOMNode_AddRef,
266 HTMLDOMNode_Release,
267 HTMLDOMNode_GetTypeInfoCount,
268 HTMLDOMNode_GetTypeInfo,
269 HTMLDOMNode_GetIDsOfNames,
270 HTMLDOMNode_Invoke,
271 HTMLDOMNode_get_nodeType,
272 HTMLDOMNode_get_parentNode,
273 HTMLDOMNode_hasChildNodes,
274 HTMLDOMNode_get_childNodes,
275 HTMLDOMNode_get_attributes,
276 HTMLDOMNode_insertBefore,
277 HTMLDOMNode_removeChild,
278 HTMLDOMNode_replaceChild,
279 HTMLDOMNode_cloneNode,
280 HTMLDOMNode_removeNode,
281 HTMLDOMNode_swapNode,
282 HTMLDOMNode_replaceNode,
283 HTMLDOMNode_appendChild,
284 HTMLDOMNode_get_nodeName,
285 HTMLDOMNode_put_nodeValue,
286 HTMLDOMNode_get_nodeValue,
287 HTMLDOMNode_get_firstChild,
288 HTMLDOMNode_get_lastChild,
289 HTMLDOMNode_get_previousSibling,
290 HTMLDOMNode_get_nextSibling
291};
292
3d9d3844
JC
293HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv)
294{
295 *ppv = NULL;
296
297 if(IsEqualGUID(&IID_IUnknown, riid)) {
298 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
299 *ppv = HTMLDOMNODE(This);
300 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
301 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
302 *ppv = HTMLDOMNODE(This);
303 }else if(IsEqualGUID(&IID_IHTMLDOMNode, riid)) {
304 TRACE("(%p)->(IID_IHTMLDOMNode %p)\n", This, ppv);
305 *ppv = HTMLDOMNODE(This);
306 }
307
308 if(*ppv) {
309 IUnknown_AddRef((IUnknown*)*ppv);
310 return S_OK;
311 }
312
313 return E_NOINTERFACE;
314}
315
54036bf6
JC
316/*
317 * FIXME
318 * List looks really ugly here. We should use a better data structure or
319 * (better) find a way to store HTMLDOMelement poiner in nsIDOMNode.
320 */
321
322HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode)
323{
324 HTMLDOMNode *iter = This->nodes, *ret;
325 PRUint16 node_type;
326
327 while(iter) {
328 if(iter->nsnode == nsnode)
329 break;
330 iter = iter->next;
331 }
332
333 if(iter)
334 return iter;
335
a4cc5bf2 336 ret = mshtml_alloc(sizeof(HTMLDOMNode));
54036bf6
JC
337 ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl;
338 ret->node_type = NT_UNKNOWN;
339 ret->impl.unk = NULL;
d6d76870 340 ret->destructor = NULL;
54036bf6
JC
341 ret->doc = This;
342
343 nsIDOMNode_AddRef(nsnode);
344 ret->nsnode = nsnode;
345
346 ret->next = This->nodes;
347 This->nodes = ret;
348
349 nsIDOMNode_GetNodeType(nsnode, &node_type);
350
54036bf6
JC
351 if(node_type == NS_ELEMENT_NODE
352 || node_type == NS_DOCUMENT_NODE)
353 HTMLElement_Create(ret);
54036bf6
JC
354
355 return ret;
356}
357
358void release_nodes(HTMLDocument *This)
359{
360 HTMLDOMNode *iter, *next;
361
362 if(!This->nodes)
363 return;
364
365 for(iter = This->nodes; iter; iter = next) {
366 next = iter->next;
367 if(iter->destructor)
368 iter->destructor(iter->impl.unk);
369 nsIDOMNode_Release(iter->nsnode);
a4cc5bf2 370 mshtml_free(iter);
54036bf6
JC
371 }
372}