When decoding a signed cert, make sure it's really a cert.
[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         TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv);
61         *ppv = CONTROL(This);
62     }else if(IsEqualGUID(&IID_IPersist, riid)) {
63         TRACE("(%p)->(IID_IPersist %p)\n", This, ppv);
64         *ppv = PERSTORAGE(This);
65     }else if(IsEqualGUID(&IID_IPersistStorage, riid)) {
66         TRACE("(%p)->(IID_IPersistStorage %p)\n", This, ppv);
67         *ppv = PERSTORAGE(This);
68     }else if(IsEqualGUID (&IID_IPersistStreamInit, riid)) {
69         TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv);
70         *ppv = PERSTRINIT(This);
71     }else if(IsEqualGUID (&IID_IProvideClassInfo, riid)) {
72         TRACE("(%p)->(IID_IProvideClassInfo %p)\n", This, ppv);
73         *ppv = CLASSINFO(This);
74     }else if(IsEqualGUID (&IID_IProvideClassInfo2, riid)) {
75         TRACE("(%p)->(IID_IProvideClassInfo2 %p)\n", This, ppv);
76         *ppv = CLASSINFO(This);
77     }else if(IsEqualGUID (&IID_IQuickActivate, riid)) {
78         TRACE("(%p)->(IID_IQuickActivate %p)\n", This, ppv);
79         *ppv = QUICKACT(This);
80     }else if(IsEqualGUID (&IID_IConnectionPointContainer, riid)) {
81         FIXME("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
82         *ppv = &SHDOCVW_ConnectionPointContainer;
83     }
84
85     if(*ppv) {
86         IUnknown_AddRef((IUnknown*)*ppv);
87         return S_OK;
88     }
89
90     FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv);
91     return E_NOINTERFACE;
92 }
93
94 static ULONG WINAPI WebBrowser_AddRef(IWebBrowser *iface)
95 {
96     WebBrowser *This = WEBBROWSER_THIS(iface);
97     LONG ref = InterlockedIncrement(&This->ref);
98     TRACE("(%p) ref=%ld\n", This, ref);
99     return ref;
100 }
101
102 static ULONG WINAPI WebBrowser_Release(IWebBrowser *iface)
103 {
104     WebBrowser *This = WEBBROWSER_THIS(iface);
105     LONG ref = InterlockedDecrement(&This->ref);
106
107     TRACE("(%p) ref=%ld\n", This, ref);
108
109     if(!ref) {
110         HeapFree(GetProcessHeap(), 0, This);
111         SHDOCVW_UnlockModule();
112     }
113
114     return ref;
115 }
116
117 /* IDispatch methods */
118 static HRESULT WINAPI WebBrowser_GetTypeInfoCount(IWebBrowser *iface, UINT *pctinfo)
119 {
120     WebBrowser *This = WEBBROWSER_THIS(iface);
121     FIXME("(%p)->(%p)\n", This, pctinfo);
122     return E_NOTIMPL;
123 }
124
125 static HRESULT WINAPI WebBrowser_GetTypeInfo(IWebBrowser *iface, UINT iTInfo, LCID lcid,
126                                      LPTYPEINFO *ppTInfo)
127 {
128     WebBrowser *This = WEBBROWSER_THIS(iface);
129     FIXME("(%p)->(%d %ld %p)\n", This, iTInfo, lcid, ppTInfo);
130     return E_NOTIMPL;
131 }
132
133 static HRESULT WINAPI WebBrowser_GetIDsOfNames(IWebBrowser *iface, REFIID riid,
134                                        LPOLESTR *rgszNames, UINT cNames,
135                                        LCID lcid, DISPID *rgDispId)
136 {
137     WebBrowser *This = WEBBROWSER_THIS(iface);
138     FIXME("(%p)->(%s %p %d %ld %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
139             lcid, rgDispId);
140     return E_NOTIMPL;
141 }
142
143 static HRESULT WINAPI WebBrowser_Invoke(IWebBrowser *iface, DISPID dispIdMember,
144                                 REFIID riid, LCID lcid, WORD wFlags,
145                                 DISPPARAMS *pDispParams, VARIANT *pVarResult,
146                                 EXCEPINFO *pExepInfo, UINT *puArgErr)
147 {
148     WebBrowser *This = WEBBROWSER_THIS(iface);
149     FIXME("(%p)->(%ld %s %ld %08x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
150             lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr);
151     return E_NOTIMPL;
152 }
153
154 /* IWebBrowser methods */
155 static HRESULT WINAPI WebBrowser_GoBack(IWebBrowser *iface)
156 {
157     WebBrowser *This = WEBBROWSER_THIS(iface);
158     FIXME("(%p)\n", This);
159     return E_NOTIMPL;
160 }
161
162 static HRESULT WINAPI WebBrowser_GoForward(IWebBrowser *iface)
163 {
164     WebBrowser *This = WEBBROWSER_THIS(iface);
165     FIXME("(%p)\n", This);
166     return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI WebBrowser_GoHome(IWebBrowser *iface)
170 {
171     WebBrowser *This = WEBBROWSER_THIS(iface);
172     FIXME("(%p)\n", This);
173     return E_NOTIMPL;
174 }
175
176 static HRESULT WINAPI WebBrowser_GoSearch(IWebBrowser *iface)
177 {
178     WebBrowser *This = WEBBROWSER_THIS(iface);
179     FIXME("(%p)\n", This);
180     return E_NOTIMPL;
181 }
182
183 static HRESULT WINAPI WebBrowser_Navigate(IWebBrowser *iface, BSTR URL,
184                                   VARIANT *Flags, VARIANT *TargetFrameName,
185                                   VARIANT *PostData, VARIANT *Headers)
186 {
187     WebBrowser *This = WEBBROWSER_THIS(iface);
188     FIXME("(%p)->(%s %p %p %p %p)\n", This, debugstr_w(URL), Flags, TargetFrameName,
189           PostData, Headers);
190     return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI WebBrowser_Refresh(IWebBrowser *iface)
194 {
195     WebBrowser *This = WEBBROWSER_THIS(iface);
196     FIXME("(%p)\n", This);
197     return E_NOTIMPL;
198 }
199
200 static HRESULT WINAPI WebBrowser_Refresh2(IWebBrowser *iface, VARIANT *Level)
201 {
202     WebBrowser *This = WEBBROWSER_THIS(iface);
203     FIXME("(%p)->(%p)\n", This, Level);
204     return E_NOTIMPL;
205 }
206
207 static HRESULT WINAPI WebBrowser_Stop(IWebBrowser *iface)
208 {
209     WebBrowser *This = WEBBROWSER_THIS(iface);
210     FIXME("(%p)\n", This);
211     return E_NOTIMPL;
212 }
213
214 static HRESULT WINAPI WebBrowser_get_Application(IWebBrowser *iface, IDispatch **ppDisp)
215 {
216     WebBrowser *This = WEBBROWSER_THIS(iface);
217     FIXME("(%p)->(%p)\n", This, ppDisp);
218     return E_NOTIMPL;
219 }
220
221 static HRESULT WINAPI WebBrowser_get_Parent(IWebBrowser *iface, IDispatch **ppDisp)
222 {
223     WebBrowser *This = WEBBROWSER_THIS(iface);
224     FIXME("(%p)->(%p)\n", This, ppDisp);
225     return E_NOTIMPL;
226 }
227
228 static HRESULT WINAPI WebBrowser_get_Container(IWebBrowser *iface, IDispatch **ppDisp)
229 {
230     WebBrowser *This = WEBBROWSER_THIS(iface);
231     FIXME("(%p)->(%p)\n", This, ppDisp);
232     return E_NOTIMPL;
233 }
234
235 static HRESULT WINAPI WebBrowser_get_Document(IWebBrowser *iface, IDispatch **ppDisp)
236 {
237     WebBrowser *This = WEBBROWSER_THIS(iface);
238     FIXME("(%p)->(%p)\n", This, ppDisp);
239     return E_NOTIMPL;
240 }
241
242 static HRESULT WINAPI WebBrowser_get_TopLevelContainer(IWebBrowser *iface, VARIANT_BOOL *pBool)
243 {
244     WebBrowser *This = WEBBROWSER_THIS(iface);
245     FIXME("(%p)->(%p)\n", This, pBool);
246     return E_NOTIMPL;
247 }
248
249 static HRESULT WINAPI WebBrowser_get_Type(IWebBrowser *iface, BSTR *Type)
250 {
251     WebBrowser *This = WEBBROWSER_THIS(iface);
252     FIXME("(%p)->(%p)\n", This, Type);
253     return E_NOTIMPL;
254 }
255
256 static HRESULT WINAPI WebBrowser_get_Left(IWebBrowser *iface, long *pl)
257 {
258     WebBrowser *This = WEBBROWSER_THIS(iface);
259     FIXME("(%p)->(%p)\n", This, pl);
260     return E_NOTIMPL;
261 }
262
263 static HRESULT WINAPI WebBrowser_put_Left(IWebBrowser *iface, long Left)
264 {
265     WebBrowser *This = WEBBROWSER_THIS(iface);
266     FIXME("(%p)->(%ld)\n", This, Left);
267     return E_NOTIMPL;
268 }
269
270 static HRESULT WINAPI WebBrowser_get_Top(IWebBrowser *iface, long *pl)
271 {
272     WebBrowser *This = WEBBROWSER_THIS(iface);
273     FIXME("(%p)->(%p)\n", This, pl);
274     return E_NOTIMPL;
275 }
276
277 static HRESULT WINAPI WebBrowser_put_Top(IWebBrowser *iface, long Top)
278 {
279     WebBrowser *This = WEBBROWSER_THIS(iface);
280     FIXME("(%p)->(%ld)\n", This, Top);
281     return E_NOTIMPL;
282 }
283
284 static HRESULT WINAPI WebBrowser_get_Width(IWebBrowser *iface, long *pl)
285 {
286     WebBrowser *This = WEBBROWSER_THIS(iface);
287     FIXME("(%p)->(%p)\n", This, pl);
288     return E_NOTIMPL;
289 }
290
291 static HRESULT WINAPI WebBrowser_put_Width(IWebBrowser *iface, long Width)
292 {
293     WebBrowser *This = WEBBROWSER_THIS(iface);
294     FIXME("(%p)->(%ld)\n", This, Width);
295     return E_NOTIMPL;
296 }
297
298 static HRESULT WINAPI WebBrowser_get_Height(IWebBrowser *iface, long *pl)
299 {
300     WebBrowser *This = WEBBROWSER_THIS(iface);
301     FIXME("(%p)->(%p)\n", This, pl);
302     return E_NOTIMPL;
303 }
304
305 static HRESULT WINAPI WebBrowser_put_Height(IWebBrowser *iface, long Height)
306 {
307     WebBrowser *This = WEBBROWSER_THIS(iface);
308     FIXME("(%p)->(%ld)\n", This, Height);
309     return E_NOTIMPL;
310 }
311
312 static HRESULT WINAPI WebBrowser_get_LocationName(IWebBrowser *iface, BSTR *LocationName)
313 {
314     WebBrowser *This = WEBBROWSER_THIS(iface);
315     FIXME("(%p)->(%p)\n", This, LocationName);
316     return E_NOTIMPL;
317 }
318
319 static HRESULT WINAPI WebBrowser_get_LocationURL(IWebBrowser *iface, BSTR *LocationURL)
320 {
321     WebBrowser *This = WEBBROWSER_THIS(iface);
322     FIXME("(%p)->(%p)\n", This, LocationURL);
323     return E_NOTIMPL;
324 }
325
326 static HRESULT WINAPI WebBrowser_get_Busy(IWebBrowser *iface, VARIANT_BOOL *pBool)
327 {
328     WebBrowser *This = WEBBROWSER_THIS(iface);
329     FIXME("(%p)->(%p)\n", This, pBool);
330     return E_NOTIMPL;
331 }
332
333 #undef WEBBROWSER_THIS
334
335 /**********************************************************************
336  * IWebBrowser virtual function table for IWebBrowser interface
337  */
338
339 static const IWebBrowserVtbl WebBrowserVtbl =
340 {
341     WebBrowser_QueryInterface,
342     WebBrowser_AddRef,
343     WebBrowser_Release,
344     WebBrowser_GetTypeInfoCount,
345     WebBrowser_GetTypeInfo,
346     WebBrowser_GetIDsOfNames,
347     WebBrowser_Invoke,
348     WebBrowser_GoBack,
349     WebBrowser_GoForward,
350     WebBrowser_GoHome,
351     WebBrowser_GoSearch,
352     WebBrowser_Navigate,
353     WebBrowser_Refresh,
354     WebBrowser_Refresh2,
355     WebBrowser_Stop,
356     WebBrowser_get_Application,
357     WebBrowser_get_Parent,
358     WebBrowser_get_Container,
359     WebBrowser_get_Document,
360     WebBrowser_get_TopLevelContainer,
361     WebBrowser_get_Type,
362     WebBrowser_get_Left,
363     WebBrowser_put_Left,
364     WebBrowser_get_Top,
365     WebBrowser_put_Top,
366     WebBrowser_get_Width,
367     WebBrowser_put_Width,
368     WebBrowser_get_Height,
369     WebBrowser_put_Height,
370     WebBrowser_get_LocationName,
371     WebBrowser_get_LocationURL,
372     WebBrowser_get_Busy
373 };
374
375 HRESULT WebBrowser_Create(IUnknown *pOuter, REFIID riid, void **ppv)
376 {
377     WebBrowser *ret;
378     HRESULT hres;
379
380     TRACE("(%p %s %p)\n", pOuter, debugstr_guid(riid), ppv);
381
382     ret = HeapAlloc(GetProcessHeap(), 0, sizeof(WebBrowser));
383
384     ret->lpWebBrowserVtbl = &WebBrowserVtbl;
385     ret->ref = 0;
386
387     WebBrowser_OleObject_Init(ret);
388     WebBrowser_Persist_Init(ret);
389     WebBrowser_ClassInfo_Init(ret);
390     WebBrowser_Misc_Init(ret);
391
392     hres = IWebBrowser_QueryInterface(WEBBROWSER(ret), riid, ppv);
393     if(SUCCEEDED(hres)) {
394         SHDOCVW_LockModule();
395     }else {
396         HeapFree(GetProcessHeap(), 0, ret);
397         return hres;
398     }
399
400     return hres;
401 }