Make IOleControl and IOleInPlaceObject interface heap based.
[wine] / dlls / shdocvw / webbrowser.c
1 /*
2  * Implementation of IWebBrowser interface for WebBrowser control
3  *
4  * Copyright 2001 John R. Sheets (for CodeWeavers)
5  * Copyright 2005 Jacek Caban
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #include "wine/debug.h"
23 #include "shdocvw.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
26
27 /**********************************************************************
28  * Implement the IWebBrowser interface
29  */
30
31 #define WEBBROWSER_THIS(iface) DEFINE_THIS(WebBrowser, WebBrowser, iface)
32
33 static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser *iface, REFIID riid, LPVOID *ppv)
34 {
35     WebBrowser *This = WEBBROWSER_THIS(iface);
36
37     if (ppv == NULL)
38         return E_POINTER;
39     *ppv = NULL;
40
41     if(IsEqualGUID(&IID_IUnknown, riid)) {
42         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
43         *ppv = WEBBROWSER(This);
44     }else if(IsEqualGUID (&IID_IDispatch, riid)) {
45         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
46         *ppv = WEBBROWSER(This);
47     }else if(IsEqualGUID(&IID_IWebBrowser, riid)) {
48         TRACE("(%p)->(IID_IWebBrowser %p)\n", This, ppv);
49         *ppv = WEBBROWSER(This);
50     }else if(IsEqualGUID(&IID_IOleObject, riid)) {
51         TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv);
52         *ppv = OLEOBJ(This);
53     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
54         TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
55         *ppv = INPLACEOBJ(This);
56     }else if(IsEqualGUID (&IID_IOleInPlaceObject, riid)) {
57         TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv);
58         *ppv = INPLACEOBJ(This);
59     }else if(IsEqualGUID (&IID_IOleControl, riid)) {
60         FIXME("(%p)->(IID_IOleControl %p)\n", This, ppv);
61         *ppv = CONTROL(This);
62     }else if(IsEqualGUID (&IID_IPersistStorage, riid)) {
63         FIXME("(%p)->(IID_IPersistStorage %p)\n", This, ppv);
64         *ppv = &SHDOCVW_PersistStorage;
65     }else if(IsEqualGUID (&IID_IPersistStreamInit, riid)) {
66         FIXME("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
67         *ppv = &SHDOCVW_PersistStreamInit;
68     }else if(IsEqualGUID (&IID_IProvideClassInfo, riid)) {
69         FIXME("(%p)->(IID_IProvideClassInfo %p)\n", This, ppv);
70         *ppv = &SHDOCVW_ProvideClassInfo;
71     }else if(IsEqualGUID (&IID_IProvideClassInfo2, riid)) {
72         FIXME("(%p)->(IID_IProvideClassInfo2 %p)\n", This, ppv);
73         *ppv = &SHDOCVW_ProvideClassInfo2;
74     }else if(IsEqualGUID (&IID_IQuickActivate, riid)) {
75         FIXME("(%p)->(IID_IQuickActivate %p)\n", This, ppv);
76         *ppv = &SHDOCVW_QuickActivate;
77     }else if(IsEqualGUID (&IID_IConnectionPointContainer, riid)) {
78         FIXME("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
79         *ppv = &SHDOCVW_ConnectionPointContainer;
80     }
81
82     if(*ppv) {
83         IUnknown_AddRef((IUnknown*)*ppv);
84         return S_OK;
85     }
86
87     FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv);
88     return E_NOINTERFACE;
89 }
90
91 static ULONG WINAPI WebBrowser_AddRef(IWebBrowser *iface)
92 {
93     WebBrowser *This = WEBBROWSER_THIS(iface);
94     LONG ref = InterlockedIncrement(&This->ref);
95     TRACE("(%p) ref=%ld\n", This, ref);
96     return ref;
97 }
98
99 static ULONG WINAPI WebBrowser_Release(IWebBrowser *iface)
100 {
101     WebBrowser *This = WEBBROWSER_THIS(iface);
102     LONG ref = InterlockedDecrement(&This->ref);
103
104     TRACE("(%p) ref=%ld\n", This, ref);
105
106     if(!ref) {
107         HeapFree(GetProcessHeap(), 0, This);
108         SHDOCVW_UnlockModule();
109     }
110
111     return ref;
112 }
113
114 /* IDispatch methods */
115 static HRESULT WINAPI WebBrowser_GetTypeInfoCount(IWebBrowser *iface, UINT *pctinfo)
116 {
117     WebBrowser *This = WEBBROWSER_THIS(iface);
118     FIXME("(%p)->(%p)\n", This, pctinfo);
119     return E_NOTIMPL;
120 }
121
122 static HRESULT WINAPI WebBrowser_GetTypeInfo(IWebBrowser *iface, UINT iTInfo, LCID lcid,
123                                      LPTYPEINFO *ppTInfo)
124 {
125     WebBrowser *This = WEBBROWSER_THIS(iface);
126     FIXME("(%p)->(%d %ld %p)\n", This, iTInfo, lcid, ppTInfo);
127     return E_NOTIMPL;
128 }
129
130 static HRESULT WINAPI WebBrowser_GetIDsOfNames(IWebBrowser *iface, REFIID riid,
131                                        LPOLESTR *rgszNames, UINT cNames,
132                                        LCID lcid, DISPID *rgDispId)
133 {
134     WebBrowser *This = WEBBROWSER_THIS(iface);
135     FIXME("(%p)->(%s %p %d %ld %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
136             lcid, rgDispId);
137     return E_NOTIMPL;
138 }
139
140 static HRESULT WINAPI WebBrowser_Invoke(IWebBrowser *iface, DISPID dispIdMember,
141                                 REFIID riid, LCID lcid, WORD wFlags,
142                                 DISPPARAMS *pDispParams, VARIANT *pVarResult,
143                                 EXCEPINFO *pExepInfo, UINT *puArgErr)
144 {
145     WebBrowser *This = WEBBROWSER_THIS(iface);
146     FIXME("(%p)->(%ld %s %ld %08x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
147             lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
148     return E_NOTIMPL;
149 }
150
151 /* IWebBrowser methods */
152 static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser *iface)
153 {
154     WebBrowser *This = WEBBROWSER_THIS(iface);
155     FIXME("(%p)\n", This);
156     return E_NOTIMPL;
157 }
158
159 static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser *iface)
160 {
161     WebBrowser *This = WEBBROWSER_THIS(iface);
162     FIXME("(%p)\n", This);
163     return E_NOTIMPL;
164 }
165
166 static HRESULT WINAPI WebBrowser_GoHome(IWebBrowser *iface)
167 {
168     WebBrowser *This = WEBBROWSER_THIS(iface);
169     FIXME("(%p)\n", This);
170     return E_NOTIMPL;
171 }
172
173 static HRESULT WINAPI WebBrowser_GoSearch(IWebBrowser *iface)
174 {
175     WebBrowser *This = WEBBROWSER_THIS(iface);
176     FIXME("(%p)\n", This);
177     return E_NOTIMPL;
178 }
179
180 static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser *iface, BSTR URL,
181                                   VARIANT *Flags, VARIANT *TargetFrameName,
182                                   VARIANT *PostData, VARIANT *Headers)
183 {
184     WebBrowser *This = WEBBROWSER_THIS(iface);
185     FIXME("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(URL), Flags, TargetFrameName,
186           PostData, Headers);
187     return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser *iface)
191 {
192     WebBrowser *This = WEBBROWSER_THIS(iface);
193     FIXME("(%p)\n", This);
194     return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser *iface, VARIANT *Level)
198 {
199     WebBrowser *This = WEBBROWSER_THIS(iface);
200     FIXME("(%p)->(%p)\n", This, Level);
201     return E_NOTIMPL;
202 }
203
204 static HRESULT WINAPI WebBrowser_Stop(IWebBrowser *iface)
205 {
206     WebBrowser *This = WEBBROWSER_THIS(iface);
207     FIXME("(%p)\n", This);
208     return E_NOTIMPL;
209 }
210
211 static HRESULT WINAPI WebBrowser_get_Application(IWebBrowser *iface, IDispatch **ppDisp)
212 {
213     WebBrowser *This = WEBBROWSER_THIS(iface);
214     FIXME("(%p)->(%p)\n", This, ppDisp);
215     return E_NOTIMPL;
216 }
217
218 static HRESULT WINAPI WebBrowser_get_Parent(IWebBrowser *iface, IDispatch **ppDisp)
219 {
220     WebBrowser *This = WEBBROWSER_THIS(iface);
221     FIXME("(%p)->(%p)\n", This, ppDisp);
222     return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI WebBrowser_get_Container(IWebBrowser *iface, IDispatch **ppDisp)
226 {
227     WebBrowser *This = WEBBROWSER_THIS(iface);
228     FIXME("(%p)->(%p)\n", This, ppDisp);
229     return E_NOTIMPL;
230 }
231
232 static HRESULT WINAPI WebBrowser_get_Document(IWebBrowser *iface, IDispatch **ppDisp)
233 {
234     WebBrowser *This = WEBBROWSER_THIS(iface);
235     FIXME("(%p)->(%p)\n", This, ppDisp);
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI WebBrowser_get_TopLevelContainer(IWebBrowser *iface, VARIANT_BOOL *pBool)
240 {
241     WebBrowser *This = WEBBROWSER_THIS(iface);
242     FIXME("(%p)->(%p)\n", This, pBool);
243     return E_NOTIMPL;
244 }
245
246 static HRESULT WINAPI WebBrowser_get_Type(IWebBrowser *iface, BSTR *Type)
247 {
248     WebBrowser *This = WEBBROWSER_THIS(iface);
249     FIXME("(%p)->(%p)\n", This, Type);
250     return E_NOTIMPL;
251 }
252
253 static HRESULT WINAPI WebBrowser_get_Left(IWebBrowser *iface, long *pl)
254 {
255     WebBrowser *This = WEBBROWSER_THIS(iface);
256     FIXME("(%p)->(%p)\n", This, pl);
257     return E_NOTIMPL;
258 }
259
260 static HRESULT WINAPI WebBrowser_put_Left(IWebBrowser *iface, long Left)
261 {
262     WebBrowser *This = WEBBROWSER_THIS(iface);
263     FIXME("(%p)->(%ld)\n", This, Left);
264     return E_NOTIMPL;
265 }
266
267 static HRESULT WINAPI WebBrowser_get_Top(IWebBrowser *iface, long *pl)
268 {
269     WebBrowser *This = WEBBROWSER_THIS(iface);
270     FIXME("(%p)->(%p)\n", This, pl);
271     return E_NOTIMPL;
272 }
273
274 static HRESULT WINAPI WebBrowser_put_Top(IWebBrowser *iface, long Top)
275 {
276     WebBrowser *This = WEBBROWSER_THIS(iface);
277     FIXME("(%p)->(%ld)\n", This, Top);
278     return E_NOTIMPL;
279 }
280
281 static HRESULT WINAPI WebBrowser_get_Width(IWebBrowser *iface, long *pl)
282 {
283     WebBrowser *This = WEBBROWSER_THIS(iface);
284     FIXME("(%p)->(%p)\n", This, pl);
285     return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI WebBrowser_put_Width(IWebBrowser *iface, long Width)
289 {
290     WebBrowser *This = WEBBROWSER_THIS(iface);
291     FIXME("(%p)->(%ld)\n", This, Width);
292     return E_NOTIMPL;
293 }
294
295 static HRESULT WINAPI WebBrowser_get_Height(IWebBrowser *iface, long *pl)
296 {
297     WebBrowser *This = WEBBROWSER_THIS(iface);
298     FIXME("(%p)->(%p)\n", This, pl);
299     return E_NOTIMPL;
300 }
301
302 static HRESULT WINAPI WebBrowser_put_Height(IWebBrowser *iface, long Height)
303 {
304     WebBrowser *This = WEBBROWSER_THIS(iface);
305     FIXME("(%p)->(%ld)\n", This, Height);
306     return E_NOTIMPL;
307 }
308
309 static HRESULT WINAPI WebBrowser_get_LocationName(IWebBrowser *iface, BSTR *LocationName)
310 {
311     WebBrowser *This = WEBBROWSER_THIS(iface);
312     FIXME("(%p)->(%p)\n", This, LocationName);
313     return E_NOTIMPL;
314 }
315
316 static HRESULT WINAPI WebBrowser_get_LocationURL(IWebBrowser *iface, BSTR *LocationURL)
317 {
318     WebBrowser *This = WEBBROWSER_THIS(iface);
319     FIXME("(%p)->(%p)\n", This, LocationURL);
320     return E_NOTIMPL;
321 }
322
323 static HRESULT WINAPI WebBrowser_get_Busy(IWebBrowser *iface, VARIANT_BOOL *pBool)
324 {
325     WebBrowser *This = WEBBROWSER_THIS(iface);
326     FIXME("(%p)->(%p)\n", This, pBool);
327     return E_NOTIMPL;
328 }
329
330 #undef WEBBROWSER_THIS
331
332 /**********************************************************************
333  * IWebBrowser virtual function table for IWebBrowser interface
334  */
335
336 static const IWebBrowserVtbl WebBrowserVtbl =
337 {
338     WebBrowser_QueryInterface,
339     WebBrowser_AddRef,
340     WebBrowser_Release,
341     WebBrowser_GetTypeInfoCount,
342     WebBrowser_GetTypeInfo,
343     WebBrowser_GetIDsOfNames,
344     WebBrowser_Invoke,
345     WebBrowser_GoBack,
346     WebBrowser_GoForward,
347     WebBrowser_GoHome,
348     WebBrowser_GoSearch,
349     WebBrowser_Navigate,
350     WebBrowser_Refresh,
351     WebBrowser_Refresh2,
352     WebBrowser_Stop,
353     WebBrowser_get_Application,
354     WebBrowser_get_Parent,
355     WebBrowser_get_Container,
356     WebBrowser_get_Document,
357     WebBrowser_get_TopLevelContainer,
358     WebBrowser_get_Type,
359     WebBrowser_get_Left,
360     WebBrowser_put_Left,
361     WebBrowser_get_Top,
362     WebBrowser_put_Top,
363     WebBrowser_get_Width,
364     WebBrowser_put_Width,
365     WebBrowser_get_Height,
366     WebBrowser_put_Height,
367     WebBrowser_get_LocationName,
368     WebBrowser_get_LocationURL,
369     WebBrowser_get_Busy
370 };
371
372 HRESULT WebBrowser_Create(IUnknown *pOuter, REFIID riid, void **ppv)
373 {
374     WebBrowser *ret;
375     HRESULT hres;
376
377     TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv);
378
379     ret = HeapAlloc(GetProcessHeap(), 0, sizeof(WebBrowser));
380
381     ret->lpWebBrowserVtbl = &WebBrowserVtbl;
382     ret->ref = 0;
383
384     WebBrowser_OleObject_Init(ret);
385
386     hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);
387     if(SUCCEEDED(hres)) {
388         SHDOCVW_LockModule();
389     }else {
390         HeapFree(GetProcessHeap(), 0, ret);
391         return hres;
392     }
393
394     return hres;
395 }