msxml3: Don't allocate new strings when returning namespace related data.
[wine] / dlls / mshtml / htmlhead.c
1  /*
2  * Copyright 2011 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 <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "wine/debug.h"
29
30 #include "mshtml_private.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
33
34 typedef struct {
35     HTMLElement element;
36
37     IHTMLTitleElement IHTMLTitleElement_iface;
38 } HTMLTitleElement;
39
40 static inline HTMLTitleElement *impl_from_IHTMLTitleElement(IHTMLTitleElement *iface)
41 {
42     return CONTAINING_RECORD(iface, HTMLTitleElement, IHTMLTitleElement_iface);
43 }
44
45 static HRESULT WINAPI HTMLTitleElement_QueryInterface(IHTMLTitleElement *iface,
46                                                          REFIID riid, void **ppv)
47 {
48     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
49
50     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
51 }
52
53 static ULONG WINAPI HTMLTitleElement_AddRef(IHTMLTitleElement *iface)
54 {
55     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
56
57     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
58 }
59
60 static ULONG WINAPI HTMLTitleElement_Release(IHTMLTitleElement *iface)
61 {
62     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
63
64     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
65 }
66
67 static HRESULT WINAPI HTMLTitleElement_GetTypeInfoCount(IHTMLTitleElement *iface, UINT *pctinfo)
68 {
69     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
70
71     return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
72 }
73
74 static HRESULT WINAPI HTMLTitleElement_GetTypeInfo(IHTMLTitleElement *iface, UINT iTInfo,
75         LCID lcid, ITypeInfo **ppTInfo)
76 {
77     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
78
79     return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
80             ppTInfo);
81 }
82
83 static HRESULT WINAPI HTMLTitleElement_GetIDsOfNames(IHTMLTitleElement *iface, REFIID riid,
84         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
85 {
86     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
87
88     return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
89             cNames, lcid, rgDispId);
90 }
91
92 static HRESULT WINAPI HTMLTitleElement_Invoke(IHTMLTitleElement *iface, DISPID dispIdMember,
93         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
94         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
95 {
96     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
97
98     return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
99             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
100 }
101
102 static HRESULT WINAPI HTMLTitleElement_put_text(IHTMLTitleElement *iface, BSTR v)
103 {
104     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
105     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
106     return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI HTMLTitleElement_get_text(IHTMLTitleElement *iface, BSTR *p)
110 {
111     HTMLTitleElement *This = impl_from_IHTMLTitleElement(iface);
112     FIXME("(%p)->(%p)\n", This, p);
113     return E_NOTIMPL;
114 }
115
116 static const IHTMLTitleElementVtbl HTMLTitleElementVtbl = {
117     HTMLTitleElement_QueryInterface,
118     HTMLTitleElement_AddRef,
119     HTMLTitleElement_Release,
120     HTMLTitleElement_GetTypeInfoCount,
121     HTMLTitleElement_GetTypeInfo,
122     HTMLTitleElement_GetIDsOfNames,
123     HTMLTitleElement_Invoke,
124     HTMLTitleElement_put_text,
125     HTMLTitleElement_get_text
126 };
127
128 static inline HTMLTitleElement *HTMLTitleElement_from_HTMLDOMNode(HTMLDOMNode *iface)
129 {
130     return CONTAINING_RECORD(iface, HTMLTitleElement, element.node);
131 }
132
133 static HRESULT HTMLTitleElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
134 {
135     HTMLTitleElement *This = HTMLTitleElement_from_HTMLDOMNode(iface);
136
137     if(IsEqualGUID(&IID_IHTMLTitleElement, riid)) {
138         TRACE("(%p)->(IID_IHTMLTitleElement %p)\n", This, ppv);
139         *ppv = &This->IHTMLTitleElement_iface;
140     }else {
141         return HTMLElement_QI(&This->element.node, riid, ppv);
142     }
143
144     IUnknown_AddRef((IUnknown*)*ppv);
145     return S_OK;
146 }
147
148 static void HTMLTitleElement_destructor(HTMLDOMNode *iface)
149 {
150     HTMLTitleElement *This = HTMLTitleElement_from_HTMLDOMNode(iface);
151
152     HTMLElement_destructor(&This->element.node);
153 }
154
155 static const NodeImplVtbl HTMLTitleElementImplVtbl = {
156     HTMLTitleElement_QI,
157     HTMLTitleElement_destructor,
158     HTMLElement_clone,
159     HTMLElement_get_attr_col
160 };
161
162 static const tid_t HTMLTitleElement_iface_tids[] = {
163     HTMLELEMENT_TIDS,
164     IHTMLTitleElement_tid,
165     0
166 };
167 static dispex_static_data_t HTMLTitleElement_dispex = {
168     NULL,
169     DispHTMLTitleElement_tid,
170     NULL,
171     HTMLTitleElement_iface_tids
172 };
173
174 HRESULT HTMLTitleElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
175 {
176     HTMLTitleElement *ret;
177
178     ret = heap_alloc_zero(sizeof(*ret));
179     if(!ret)
180         return E_OUTOFMEMORY;
181
182     ret->IHTMLTitleElement_iface.lpVtbl = &HTMLTitleElementVtbl;
183     ret->element.node.vtbl = &HTMLTitleElementImplVtbl;
184
185     HTMLElement_Init(&ret->element, doc, nselem, &HTMLTitleElement_dispex);
186
187     *elem = &ret->element;
188     return S_OK;
189 }
190
191 typedef struct {
192     HTMLElement element;
193
194     IHTMLHeadElement IHTMLHeadElement_iface;
195 } HTMLHeadElement;
196
197 static inline HTMLHeadElement *impl_from_IHTMLHeadElement(IHTMLHeadElement *iface)
198 {
199     return CONTAINING_RECORD(iface, HTMLHeadElement, IHTMLHeadElement_iface);
200 }
201
202 static HRESULT WINAPI HTMLHeadElement_QueryInterface(IHTMLHeadElement *iface,
203                                                          REFIID riid, void **ppv)
204 {
205     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
206
207     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
208 }
209
210 static ULONG WINAPI HTMLHeadElement_AddRef(IHTMLHeadElement *iface)
211 {
212     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
213
214     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
215 }
216
217 static ULONG WINAPI HTMLHeadElement_Release(IHTMLHeadElement *iface)
218 {
219     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
220
221     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
222 }
223
224 static HRESULT WINAPI HTMLHeadElement_GetTypeInfoCount(IHTMLHeadElement *iface, UINT *pctinfo)
225 {
226     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
227
228     return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
229 }
230
231 static HRESULT WINAPI HTMLHeadElement_GetTypeInfo(IHTMLHeadElement *iface, UINT iTInfo,
232                                               LCID lcid, ITypeInfo **ppTInfo)
233 {
234     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
235
236     return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
237             ppTInfo);
238 }
239
240 static HRESULT WINAPI HTMLHeadElement_GetIDsOfNames(IHTMLHeadElement *iface, REFIID riid,
241                                                 LPOLESTR *rgszNames, UINT cNames,
242                                                 LCID lcid, DISPID *rgDispId)
243 {
244     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
245
246     return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
247             cNames, lcid, rgDispId);
248 }
249
250 static HRESULT WINAPI HTMLHeadElement_Invoke(IHTMLHeadElement *iface, DISPID dispIdMember,
251                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
252                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
253 {
254     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
255
256     return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
257             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
258 }
259
260 static HRESULT WINAPI HTMLHeadElement_put_profile(IHTMLHeadElement *iface, BSTR v)
261 {
262     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
263     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
264     return E_NOTIMPL;
265 }
266
267 static HRESULT WINAPI HTMLHeadElement_get_profile(IHTMLHeadElement *iface, BSTR *p)
268 {
269     HTMLHeadElement *This = impl_from_IHTMLHeadElement(iface);
270     FIXME("(%p)->(%p)\n", This, p);
271     return E_NOTIMPL;
272 }
273
274 static const IHTMLHeadElementVtbl HTMLHeadElementVtbl = {
275     HTMLHeadElement_QueryInterface,
276     HTMLHeadElement_AddRef,
277     HTMLHeadElement_Release,
278     HTMLHeadElement_GetTypeInfoCount,
279     HTMLHeadElement_GetTypeInfo,
280     HTMLHeadElement_GetIDsOfNames,
281     HTMLHeadElement_Invoke,
282     HTMLHeadElement_put_profile,
283     HTMLHeadElement_get_profile
284 };
285
286 static inline HTMLHeadElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
287 {
288     return CONTAINING_RECORD(iface, HTMLHeadElement, element.node);
289 }
290
291 static HRESULT HTMLHeadElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
292 {
293     HTMLHeadElement *This = impl_from_HTMLDOMNode(iface);
294
295     if(IsEqualGUID(&IID_IHTMLHeadElement, riid)) {
296         TRACE("(%p)->(IID_IHTMLHeadElement %p)\n", This, ppv);
297         *ppv = &This->IHTMLHeadElement_iface;
298     }else {
299         return HTMLElement_QI(&This->element.node, riid, ppv);
300     }
301
302     IUnknown_AddRef((IUnknown*)*ppv);
303     return S_OK;
304 }
305
306 static void HTMLHeadElement_destructor(HTMLDOMNode *iface)
307 {
308     HTMLHeadElement *This = impl_from_HTMLDOMNode(iface);
309
310     HTMLElement_destructor(&This->element.node);
311 }
312
313 static const NodeImplVtbl HTMLHeadElementImplVtbl = {
314     HTMLHeadElement_QI,
315     HTMLHeadElement_destructor,
316     HTMLElement_clone,
317     HTMLElement_get_attr_col
318 };
319
320 static const tid_t HTMLHeadElement_iface_tids[] = {
321     HTMLELEMENT_TIDS,
322     IHTMLHeadElement_tid,
323     0
324 };
325 static dispex_static_data_t HTMLHeadElement_dispex = {
326     NULL,
327     DispHTMLHeadElement_tid,
328     NULL,
329     HTMLHeadElement_iface_tids
330 };
331
332 HRESULT HTMLHeadElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
333 {
334     HTMLHeadElement *ret;
335
336     ret = heap_alloc_zero(sizeof(*ret));
337     if(!ret)
338         return E_OUTOFMEMORY;
339
340     ret->IHTMLHeadElement_iface.lpVtbl = &HTMLHeadElementVtbl;
341     ret->element.node.vtbl = &HTMLHeadElementImplVtbl;
342
343     HTMLElement_Init(&ret->element, doc, nselem, &HTMLHeadElement_dispex);
344
345     *elem = &ret->element;
346     return S_OK;
347 }