ntdll: Increase the buffer size dynamically for relay debug lists.
[wine] / dlls / mshtml / htmlbody.c
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
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
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 typedef struct {
39     HTMLTextContainer textcont;
40
41     const IHTMLBodyElementVtbl *lpHTMLBodyElementVtbl;
42
43     ConnectionPoint cp_propnotif;
44
45     nsIDOMHTMLBodyElement *nsbody;
46 } HTMLBodyElement;
47
48 #define HTMLBODY(x)  ((IHTMLBodyElement*)  &(x)->lpHTMLBodyElementVtbl)
49
50 #define HTMLBODY_THIS(iface) DEFINE_THIS(HTMLBodyElement, HTMLBodyElement, iface)
51
52 static HRESULT WINAPI HTMLBodyElement_QueryInterface(IHTMLBodyElement *iface,
53                                                      REFIID riid, void **ppv)
54 {
55     HTMLBodyElement *This = HTMLBODY_THIS(iface);
56
57     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->textcont.element.node), riid, ppv);
58 }
59
60 static ULONG WINAPI HTMLBodyElement_AddRef(IHTMLBodyElement *iface)
61 {
62     HTMLBodyElement *This = HTMLBODY_THIS(iface);
63
64     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->textcont.element.node));
65 }
66
67 static ULONG WINAPI HTMLBodyElement_Release(IHTMLBodyElement *iface)
68 {
69     HTMLBodyElement *This = HTMLBODY_THIS(iface);
70
71     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->textcont.element.node));
72 }
73
74 static HRESULT WINAPI HTMLBodyElement_GetTypeInfoCount(IHTMLBodyElement *iface, UINT *pctinfo)
75 {
76     HTMLBodyElement *This = HTMLBODY_THIS(iface);
77     FIXME("(%p)->(%p)\n", This, pctinfo);
78     return E_NOTIMPL;
79 }
80
81 static HRESULT WINAPI HTMLBodyElement_GetTypeInfo(IHTMLBodyElement *iface, UINT iTInfo,
82                                               LCID lcid, ITypeInfo **ppTInfo)
83 {
84     HTMLBodyElement *This = HTMLBODY_THIS(iface);
85     FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
86     return E_NOTIMPL;
87 }
88
89 static HRESULT WINAPI HTMLBodyElement_GetIDsOfNames(IHTMLBodyElement *iface, REFIID riid,
90                                                 LPOLESTR *rgszNames, UINT cNames,
91                                                 LCID lcid, DISPID *rgDispId)
92 {
93     HTMLBodyElement *This = HTMLBODY_THIS(iface);
94     FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
95                                         lcid, rgDispId);
96     return E_NOTIMPL;
97 }
98
99 static HRESULT WINAPI HTMLBodyElement_Invoke(IHTMLBodyElement *iface, DISPID dispIdMember,
100                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
101                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
102 {
103     HTMLBodyElement *This = HTMLBODY_THIS(iface);
104     FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
105             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
106     return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI HTMLBodyElement_put_background(IHTMLBodyElement *iface, BSTR v)
110 {
111     HTMLBodyElement *This = HTMLBODY_THIS(iface);
112     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
113     return E_NOTIMPL;
114 }
115
116 static HRESULT WINAPI HTMLBodyElement_get_background(IHTMLBodyElement *iface, BSTR *p)
117 {
118     HTMLBodyElement *This = HTMLBODY_THIS(iface);
119     nsAString background_str;
120     nsresult nsres;
121
122     TRACE("(%p)->(%p)\n", This, p);
123
124     nsAString_Init(&background_str, NULL);
125
126     nsres = nsIDOMHTMLBodyElement_GetBackground(This->nsbody, &background_str);
127     if(NS_SUCCEEDED(nsres)) {
128         const PRUnichar *background;
129         nsAString_GetData(&background_str, &background);
130         *p = *background ? SysAllocString(background) : NULL;
131     }else {
132         ERR("GetBackground failed: %08x\n", nsres);
133         *p = NULL;
134     }
135
136     nsAString_Finish(&background_str);
137
138     TRACE("*p = %s\n", debugstr_w(*p));
139     return S_OK;
140 }
141
142 static HRESULT WINAPI HTMLBodyElement_put_bgProperties(IHTMLBodyElement *iface, BSTR v)
143 {
144     HTMLBodyElement *This = HTMLBODY_THIS(iface);
145     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
146     return E_NOTIMPL;
147 }
148
149 static HRESULT WINAPI HTMLBodyElement_get_bgProperties(IHTMLBodyElement *iface, BSTR *p)
150 {
151     HTMLBodyElement *This = HTMLBODY_THIS(iface);
152     FIXME("(%p)->(%p)\n", This, p);
153     return E_NOTIMPL;
154 }
155
156 static HRESULT WINAPI HTMLBodyElement_put_leftMargin(IHTMLBodyElement *iface, VARIANT v)
157 {
158     HTMLBodyElement *This = HTMLBODY_THIS(iface);
159     FIXME("(%p)->()\n", This);
160     return E_NOTIMPL;
161 }
162
163 static HRESULT WINAPI HTMLBodyElement_get_leftMargin(IHTMLBodyElement *iface, VARIANT *p)
164 {
165     HTMLBodyElement *This = HTMLBODY_THIS(iface);
166     FIXME("(%p)->(%p)\n", This, p);
167     return E_NOTIMPL;
168 }
169
170 static HRESULT WINAPI HTMLBodyElement_put_topMargin(IHTMLBodyElement *iface, VARIANT v)
171 {
172     HTMLBodyElement *This = HTMLBODY_THIS(iface);
173     FIXME("(%p)->()\n", This);
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI HTMLBodyElement_get_topMargin(IHTMLBodyElement *iface, VARIANT *p)
178 {
179     HTMLBodyElement *This = HTMLBODY_THIS(iface);
180     FIXME("(%p)->(%p)\n", This, p);
181     return E_NOTIMPL;
182 }
183
184 static HRESULT WINAPI HTMLBodyElement_put_rightMargin(IHTMLBodyElement *iface, VARIANT v)
185 {
186     HTMLBodyElement *This = HTMLBODY_THIS(iface);
187     FIXME("(%p)->()\n", This);
188     return E_NOTIMPL;
189 }
190
191 static HRESULT WINAPI HTMLBodyElement_get_rightMargin(IHTMLBodyElement *iface, VARIANT *p)
192 {
193     HTMLBodyElement *This = HTMLBODY_THIS(iface);
194     FIXME("(%p)->(%p)\n", This, p);
195     return E_NOTIMPL;
196 }
197
198 static HRESULT WINAPI HTMLBodyElement_put_bottomMargin(IHTMLBodyElement *iface, VARIANT v)
199 {
200     HTMLBodyElement *This = HTMLBODY_THIS(iface);
201     FIXME("(%p)->()\n", This);
202     return E_NOTIMPL;
203 }
204
205 static HRESULT WINAPI HTMLBodyElement_get_bottomMargin(IHTMLBodyElement *iface, VARIANT *p)
206 {
207     HTMLBodyElement *This = HTMLBODY_THIS(iface);
208     FIXME("(%p)->(%p)\n", This, p);
209     return E_NOTIMPL;
210 }
211
212 static HRESULT WINAPI HTMLBodyElement_put_noWrap(IHTMLBodyElement *iface, VARIANT_BOOL v)
213 {
214     HTMLBodyElement *This = HTMLBODY_THIS(iface);
215     FIXME("(%p)->(%x)\n", This, v);
216     return E_NOTIMPL;
217 }
218
219 static HRESULT WINAPI HTMLBodyElement_get_noWrap(IHTMLBodyElement *iface, VARIANT_BOOL *p)
220 {
221     HTMLBodyElement *This = HTMLBODY_THIS(iface);
222     FIXME("(%p)->(%p)\n", This, p);
223     return E_NOTIMPL;
224 }
225
226 static HRESULT WINAPI HTMLBodyElement_put_bgColor(IHTMLBodyElement *iface, VARIANT v)
227 {
228     HTMLBodyElement *This = HTMLBODY_THIS(iface);
229     FIXME("(%p)->()\n", This);
230     return E_NOTIMPL;
231 }
232
233 static HRESULT WINAPI HTMLBodyElement_get_bgColor(IHTMLBodyElement *iface, VARIANT *p)
234 {
235     HTMLBodyElement *This = HTMLBODY_THIS(iface);
236     FIXME("(%p)->(%p)\n", This, p);
237     return E_NOTIMPL;
238 }
239
240 static HRESULT WINAPI HTMLBodyElement_put_text(IHTMLBodyElement *iface, VARIANT v)
241 {
242     HTMLBodyElement *This = HTMLBODY_THIS(iface);
243     FIXME("(%p)->()\n", This);
244     return E_NOTIMPL;
245 }
246
247 static HRESULT WINAPI HTMLBodyElement_get_text(IHTMLBodyElement *iface, VARIANT *p)
248 {
249     HTMLBodyElement *This = HTMLBODY_THIS(iface);
250     FIXME("(%p)->(%p)\n", This, p);
251     return E_NOTIMPL;
252 }
253
254 static HRESULT WINAPI HTMLBodyElement_put_link(IHTMLBodyElement *iface, VARIANT v)
255 {
256     HTMLBodyElement *This = HTMLBODY_THIS(iface);
257     FIXME("(%p)->()\n", This);
258     return E_NOTIMPL;
259 }
260
261 static HRESULT WINAPI HTMLBodyElement_get_link(IHTMLBodyElement *iface, VARIANT *p)
262 {
263     HTMLBodyElement *This = HTMLBODY_THIS(iface);
264     FIXME("(%p)->(%p)\n", This, p);
265     return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI HTMLBodyElement_put_vLink(IHTMLBodyElement *iface, VARIANT v)
269 {
270     HTMLBodyElement *This = HTMLBODY_THIS(iface);
271     FIXME("(%p)->()\n", This);
272     return E_NOTIMPL;
273 }
274
275 static HRESULT WINAPI HTMLBodyElement_get_vLink(IHTMLBodyElement *iface, VARIANT *p)
276 {
277     HTMLBodyElement *This = HTMLBODY_THIS(iface);
278     FIXME("(%p)->(%p)\n", This, p);
279     return E_NOTIMPL;
280 }
281
282 static HRESULT WINAPI HTMLBodyElement_put_aLink(IHTMLBodyElement *iface, VARIANT v)
283 {
284     HTMLBodyElement *This = HTMLBODY_THIS(iface);
285     FIXME("(%p)->()\n", This);
286     return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI HTMLBodyElement_get_aLink(IHTMLBodyElement *iface, VARIANT *p)
290 {
291     HTMLBodyElement *This = HTMLBODY_THIS(iface);
292     FIXME("(%p)->(%p)\n", This, p);
293     return E_NOTIMPL;
294 }
295
296 static HRESULT WINAPI HTMLBodyElement_put_onload(IHTMLBodyElement *iface, VARIANT v)
297 {
298     HTMLBodyElement *This = HTMLBODY_THIS(iface);
299     FIXME("(%p)->()\n", This);
300     return E_NOTIMPL;
301 }
302
303 static HRESULT WINAPI HTMLBodyElement_get_onload(IHTMLBodyElement *iface, VARIANT *p)
304 {
305     HTMLBodyElement *This = HTMLBODY_THIS(iface);
306     FIXME("(%p)->(%p)\n", This, p);
307     return E_NOTIMPL;
308 }
309
310 static HRESULT WINAPI HTMLBodyElement_put_onunload(IHTMLBodyElement *iface, VARIANT v)
311 {
312     HTMLBodyElement *This = HTMLBODY_THIS(iface);
313     FIXME("(%p)->()\n", This);
314     return E_NOTIMPL;
315 }
316
317 static HRESULT WINAPI HTMLBodyElement_get_onunload(IHTMLBodyElement *iface, VARIANT *p)
318 {
319     HTMLBodyElement *This = HTMLBODY_THIS(iface);
320     FIXME("(%p)->(%p)\n", This, p);
321     return E_NOTIMPL;
322 }
323
324 static HRESULT WINAPI HTMLBodyElement_put_scroll(IHTMLBodyElement *iface, BSTR v)
325 {
326     HTMLBodyElement *This = HTMLBODY_THIS(iface);
327     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
328     return E_NOTIMPL;
329 }
330
331 static HRESULT WINAPI HTMLBodyElement_get_scroll(IHTMLBodyElement *iface, BSTR *p)
332 {
333     HTMLBodyElement *This = HTMLBODY_THIS(iface);
334     FIXME("(%p)->(%p)\n", This, p);
335     return E_NOTIMPL;
336 }
337
338 static HRESULT WINAPI HTMLBodyElement_put_onselect(IHTMLBodyElement *iface, VARIANT v)
339 {
340     HTMLBodyElement *This = HTMLBODY_THIS(iface);
341     FIXME("(%p)->()\n", This);
342     return E_NOTIMPL;
343 }
344
345 static HRESULT WINAPI HTMLBodyElement_get_onselect(IHTMLBodyElement *iface, VARIANT *p)
346 {
347     HTMLBodyElement *This = HTMLBODY_THIS(iface);
348     FIXME("(%p)->(%p)\n", This, p);
349     return E_NOTIMPL;
350 }
351
352 static HRESULT WINAPI HTMLBodyElement_put_onbeforeunload(IHTMLBodyElement *iface, VARIANT v)
353 {
354     HTMLBodyElement *This = HTMLBODY_THIS(iface);
355     FIXME("(%p)->()\n", This);
356     return E_NOTIMPL;
357 }
358
359 static HRESULT WINAPI HTMLBodyElement_get_onbeforeunload(IHTMLBodyElement *iface, VARIANT *p)
360 {
361     HTMLBodyElement *This = HTMLBODY_THIS(iface);
362     FIXME("(%p)->(%p)\n", This, p);
363     return E_NOTIMPL;
364 }
365
366 static HRESULT WINAPI HTMLBodyElement_createTextRange(IHTMLBodyElement *iface, IHTMLTxtRange **range)
367 {
368     HTMLBodyElement *This = HTMLBODY_THIS(iface);
369     nsIDOMRange *nsrange = NULL;
370
371     TRACE("(%p)->(%p)\n", This, range);
372
373     if(This->textcont.element.node.doc->nscontainer) {
374         nsIDOMDocument *nsdoc;
375         nsIDOMDocumentRange *nsdocrange;
376         nsresult nsres;
377
378         nsIWebNavigation_GetDocument(This->textcont.element.node.doc->nscontainer->navigation, &nsdoc);
379         nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMDocumentRange, (void**)&nsdocrange);
380         nsIDOMDocument_Release(nsdoc);
381
382         nsres = nsIDOMDocumentRange_CreateRange(nsdocrange, &nsrange);
383         if(NS_SUCCEEDED(nsres)) {
384             nsres = nsIDOMRange_SelectNodeContents(nsrange, This->textcont.element.node.nsnode);
385             if(NS_FAILED(nsres))
386                 ERR("SelectNodeContents failed: %08x\n", nsres);
387         }else {
388             ERR("CreateRange failed: %08x\n", nsres);
389         }
390
391         nsIDOMDocumentRange_Release(nsdocrange);
392     }
393
394     *range = HTMLTxtRange_Create(This->textcont.element.node.doc, nsrange);
395     return S_OK;
396 }
397
398 #undef HTMLBODY_THIS
399
400 static const IHTMLBodyElementVtbl HTMLBodyElementVtbl = {
401     HTMLBodyElement_QueryInterface,
402     HTMLBodyElement_AddRef,
403     HTMLBodyElement_Release,
404     HTMLBodyElement_GetTypeInfoCount,
405     HTMLBodyElement_GetTypeInfo,
406     HTMLBodyElement_GetIDsOfNames,
407     HTMLBodyElement_Invoke,
408     HTMLBodyElement_put_background,
409     HTMLBodyElement_get_background,
410     HTMLBodyElement_put_bgProperties,
411     HTMLBodyElement_get_bgProperties,
412     HTMLBodyElement_put_leftMargin,
413     HTMLBodyElement_get_leftMargin,
414     HTMLBodyElement_put_topMargin,
415     HTMLBodyElement_get_topMargin,
416     HTMLBodyElement_put_rightMargin,
417     HTMLBodyElement_get_rightMargin,
418     HTMLBodyElement_put_bottomMargin,
419     HTMLBodyElement_get_bottomMargin,
420     HTMLBodyElement_put_noWrap,
421     HTMLBodyElement_get_noWrap,
422     HTMLBodyElement_put_bgColor,
423     HTMLBodyElement_get_bgColor,
424     HTMLBodyElement_put_text,
425     HTMLBodyElement_get_text,
426     HTMLBodyElement_put_link,
427     HTMLBodyElement_get_link,
428     HTMLBodyElement_put_vLink,
429     HTMLBodyElement_get_vLink,
430     HTMLBodyElement_put_aLink,
431     HTMLBodyElement_get_aLink,
432     HTMLBodyElement_put_onload,
433     HTMLBodyElement_get_onload,
434     HTMLBodyElement_put_onunload,
435     HTMLBodyElement_get_onunload,
436     HTMLBodyElement_put_scroll,
437     HTMLBodyElement_get_scroll,
438     HTMLBodyElement_put_onselect,
439     HTMLBodyElement_get_onselect,
440     HTMLBodyElement_put_onbeforeunload,
441     HTMLBodyElement_get_onbeforeunload,
442     HTMLBodyElement_createTextRange
443 };
444
445 #define HTMLBODY_NODE_THIS(iface) DEFINE_THIS2(HTMLBodyElement, textcont.element.node, iface)
446
447 static HRESULT HTMLBodyElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
448 {
449     HTMLBodyElement *This = HTMLBODY_NODE_THIS(iface);
450
451     *ppv = NULL;
452
453     if(IsEqualGUID(&IID_IUnknown, riid)) {
454         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
455         *ppv = HTMLBODY(This);
456     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
457         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
458         *ppv = HTMLBODY(This);
459     }else if(IsEqualGUID(&IID_IHTMLBodyElement, riid)) {
460         TRACE("(%p)->(IID_IHTMLBodyElement %p)\n", This, ppv);
461         *ppv = HTMLBODY(This);
462     }else if(IsEqualGUID(&IID_IHTMLTextContainer, riid)) {
463         TRACE("(%p)->(IID_IHTMLTextContainer %p)\n", &This->textcont, ppv);
464         *ppv = HTMLTEXTCONT(&This->textcont);
465     }
466
467     if(*ppv) {
468         IUnknown_AddRef((IUnknown*)*ppv);
469         return S_OK;
470     }
471
472     return HTMLElement_QI(&This->textcont.element.node, riid, ppv);
473 }
474
475 static void HTMLBodyElement_destructor(HTMLDOMNode *iface)
476 {
477     HTMLBodyElement *This = HTMLBODY_NODE_THIS(iface);
478
479     nsIDOMHTMLBodyElement_Release(This->nsbody);
480
481     HTMLElement_destructor(&This->textcont.element.node);
482 }
483
484 #undef HTMLBODY_NODE_THIS
485
486 static const NodeImplVtbl HTMLBodyElementImplVtbl = {
487     HTMLBodyElement_QI,
488     HTMLBodyElement_destructor
489 };
490
491 HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement *nselem)
492 {
493     HTMLBodyElement *ret = heap_alloc(sizeof(HTMLBodyElement));
494     nsresult nsres;
495
496     TRACE("(%p)->(%p)\n", ret, nselem);
497
498     HTMLTextContainer_Init(&ret->textcont);
499
500     ret->lpHTMLBodyElementVtbl = &HTMLBodyElementVtbl;
501     ret->textcont.element.node.vtbl = &HTMLBodyElementImplVtbl;
502
503     ConnectionPoint_Init(&ret->cp_propnotif, &ret->textcont.element.cp_container, &IID_IPropertyNotifySink);
504
505     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLBodyElement,
506                                              (void**)&ret->nsbody);
507     if(NS_FAILED(nsres))
508         ERR("Could not get nsDOMHTMLBodyElement: %08x\n", nsres);
509
510     return &ret->textcont.element;
511 }