Commit | Line | Data |
---|---|---|
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 | ||
36 | WINE_DEFAULT_DEBUG_CHANNEL(mshtml); | |
37 | ||
38 | #define NSSUPPORTS(x) ((nsISupports*) &(x)->lpSupportsVtbl) | |
39 | ||
40 | #define HTMLDOMNODE_THIS(iface) DEFINE_THIS(HTMLDOMNode, HTMLDOMNode, iface) | |
41 | ||
42 | static 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 | ||
58 | static 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 | ||
69 | static 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 | ||
80 | static 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 | ||
87 | static 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 | ||
95 | static 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 | ||
105 | static 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 | ||
115 | static 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 | ||
122 | static 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 | ||
129 | static 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 | ||
136 | static 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 | ||
143 | static 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 | ||
150 | static 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 | ||
158 | static 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 | ||
166 | static 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 | ||
174 | static 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 | ||
182 | static 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 | ||
190 | static 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 | ||
198 | static 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 | ||
206 | static 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 | ||
214 | static 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 | ||
221 | static 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 | ||
228 | static 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 | ||
235 | static 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 | ||
242 | static 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 | ||
249 | static 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 | ||
256 | static 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 | ||
263 | static 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 |
293 | HRESULT 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 | ||
322 | HTMLDOMNode *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 | ||
358 | void 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 | } |