kernel32: FindFirstChangeNotification needs a static IO_STATUS_BLOCK.
[wine] / dlls / shdocvw / client.c
1 /*
2  * Copyright 2005 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include "wine/debug.h"
20 #include "shdocvw.h"
21
22 WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
23
24 #define CLIENTSITE_THIS(iface) DEFINE_THIS(WebBrowser, OleClientSite, iface)
25
26 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
27 {
28     WebBrowser *This = CLIENTSITE_THIS(iface);
29
30     *ppv = NULL;
31
32     if(IsEqualGUID(&IID_IUnknown, riid)) {
33         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
34         *ppv = CLIENTSITE(This);
35     }else if(IsEqualGUID(&IID_IOleClientSite, riid)) {
36         TRACE("(%p)->(IID_IOleClientSite %p)\n", This, ppv);
37         *ppv = CLIENTSITE(This);
38     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
39         TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv);
40         *ppv = INPLACESITE(This);
41     }else if(IsEqualGUID(&IID_IOleInPlaceSite, riid)) {
42         TRACE("(%p)->(IID_IOleInPlaceSite %p)\n", This, ppv);
43         *ppv = INPLACESITE(This);
44     }else if(IsEqualGUID(&IID_IDocHostUIHandler, riid)) {
45         TRACE("(%p)->(IID_IDocHostUIHandler %p)\n", This, ppv);
46         *ppv = DOCHOSTUI(This);
47     }else if(IsEqualGUID(&IID_IDocHostUIHandler2, riid)) {
48         TRACE("(%p)->(IID_IDocHostUIHandler2 %p)\n", This, ppv);
49         *ppv = DOCHOSTUI2(This);
50     }else if(IsEqualGUID(&IID_IOleDocumentSite, riid)) {
51         TRACE("(%p)->(IID_IOleDocumentSite %p)\n", This, ppv);
52         *ppv = DOCSITE(This);
53     }else if(IsEqualGUID(&IID_IOleClientSite, riid)) {
54         TRACE("(%p)->(IID_IOleClientSite %p)\n", This, ppv);
55         *ppv = CLOLECMD(This);
56     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
57         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
58         *ppv = CLDISP(This);
59     }
60
61     if(*ppv) {
62         IWebBrowser2_AddRef(WEBBROWSER(This));
63         return S_OK;
64     }
65
66     WARN("Unsupported intrface %s\n", debugstr_guid(riid));
67
68     return E_NOINTERFACE;
69 }
70
71 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
72 {
73     WebBrowser *This = CLIENTSITE_THIS(iface);
74     return IWebBrowser2_AddRef(WEBBROWSER(This));
75 }
76
77 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
78 {
79     WebBrowser *This = CLIENTSITE_THIS(iface);
80     return IWebBrowser2_Release(WEBBROWSER(This));
81 }
82
83 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
84 {
85     WebBrowser *This = CLIENTSITE_THIS(iface);
86     FIXME("(%p)\n", This);
87     return E_NOTIMPL;
88 }
89
90 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign,
91                                             DWORD dwWhichMoniker, IMoniker **ppmk)
92 {
93     WebBrowser *This = CLIENTSITE_THIS(iface);
94     FIXME("(%p)->(%ld %ld %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
95     return E_NOTIMPL;
96 }
97
98 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
99 {
100     WebBrowser *This = CLIENTSITE_THIS(iface);
101     FIXME("(%p)->(%p)\n", This, ppContainer);
102     return E_NOTIMPL;
103 }
104
105 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
106 {
107     WebBrowser *This = CLIENTSITE_THIS(iface);
108     FIXME("(%p)\n", This);
109     return E_NOTIMPL;
110 }
111
112 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
113 {
114     WebBrowser *This = CLIENTSITE_THIS(iface);
115     FIXME("(%p)->(%x)\n", This, fShow);
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
120 {
121     WebBrowser *This = CLIENTSITE_THIS(iface);
122     FIXME("(%p)\n", This);
123     return E_NOTIMPL;
124 }
125
126 #undef CLIENTSITE_THIS
127
128 static const IOleClientSiteVtbl OleClientSiteVtbl = {
129     ClientSite_QueryInterface,
130     ClientSite_AddRef,
131     ClientSite_Release,
132     ClientSite_SaveObject,
133     ClientSite_GetMoniker,
134     ClientSite_GetContainer,
135     ClientSite_ShowObject,
136     ClientSite_OnShowWindow,
137     ClientSite_RequestNewObjectLayout
138 };
139
140 #define INPLACESITE_THIS(iface) DEFINE_THIS(WebBrowser, OleInPlaceSite, iface)
141
142 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppv)
143 {
144     WebBrowser *This = INPLACESITE_THIS(iface);
145     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
146 }
147
148 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSite *iface)
149 {
150     WebBrowser *This = INPLACESITE_THIS(iface);
151     return IOleClientSite_AddRef(CLIENTSITE(This));
152 }
153
154 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSite *iface)
155 {
156     WebBrowser *This = INPLACESITE_THIS(iface);
157     return IOleClientSite_Release(CLIENTSITE(This));
158 }
159
160 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSite *iface, HWND *phwnd)
161 {
162     WebBrowser *This = INPLACESITE_THIS(iface);
163
164     TRACE("(%p)->(%p)\n", This, phwnd);
165
166     *phwnd = This->doc_view_hwnd;
167     return S_OK;
168 }
169
170 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
171 {
172     WebBrowser *This = INPLACESITE_THIS(iface);
173     FIXME("(%p)->(%x)\n", This, fEnterMode);
174     return E_NOTIMPL;
175 }
176
177 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSite *iface)
178 {
179     WebBrowser *This = INPLACESITE_THIS(iface);
180
181     TRACE("(%p)\n", This);
182
183     /* Nothing to do here */
184     return S_OK;
185 }
186
187 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSite *iface)
188 {
189     WebBrowser *This = INPLACESITE_THIS(iface);
190
191     TRACE("(%p)\n", This);
192
193     /* Nothing to do here */
194     return S_OK;
195 }
196
197 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSite *iface)
198 {
199     WebBrowser *This = INPLACESITE_THIS(iface);
200     FIXME("(%p)\n", This);
201     return E_NOTIMPL;
202 }
203
204 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface,
205         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
206         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
207 {
208     WebBrowser *This = INPLACESITE_THIS(iface);
209
210     TRACE("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect,
211           lprcClipRect, lpFrameInfo);
212
213     IOleInPlaceFrame_AddRef(INPLACEFRAME(This));
214     *ppFrame = INPLACEFRAME(This);
215     *ppDoc = NULL;
216
217     GetClientRect(This->doc_view_hwnd, lprcPosRect);
218     memcpy(lprcClipRect, lprcPosRect, sizeof(RECT));
219
220     lpFrameInfo->cb = sizeof(*lpFrameInfo);
221     lpFrameInfo->fMDIApp = FALSE;
222     lpFrameInfo->hwndFrame = This->shell_embedding_hwnd;
223     lpFrameInfo->haccel = NULL;
224     lpFrameInfo->cAccelEntries = 0; /* FIXME: should be 5 */
225
226     return S_OK;
227 }
228
229 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtent)
230 {
231     WebBrowser *This = INPLACESITE_THIS(iface);
232     FIXME("(%p)->({%ld %ld})\n", This, scrollExtent.cx, scrollExtent.cy);
233     return E_NOTIMPL;
234 }
235
236 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
237 {
238     WebBrowser *This = INPLACESITE_THIS(iface);
239     FIXME("(%p)->(%x)\n", This, fUndoable);
240     return E_NOTIMPL;
241 }
242
243 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite *iface)
244 {
245     WebBrowser *This = INPLACESITE_THIS(iface);
246     FIXME("(%p)\n", This);
247     return E_NOTIMPL;
248 }
249
250 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface)
251 {
252     WebBrowser *This = INPLACESITE_THIS(iface);
253     FIXME("(%p)\n", This);
254     return E_NOTIMPL;
255 }
256
257 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface)
258 {
259     WebBrowser *This = INPLACESITE_THIS(iface);
260     FIXME("(%p)\n", This);
261     return E_NOTIMPL;
262 }
263
264 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface,
265                                                   LPCRECT lprcPosRect)
266 {
267     WebBrowser *This = INPLACESITE_THIS(iface);
268     FIXME("(%p)->(%p)\n", This, lprcPosRect);
269     return E_NOTIMPL;
270 }
271
272 #undef INPLACESITE_THIS
273
274 static const IOleInPlaceSiteVtbl OleInPlaceSiteVtbl = {
275     InPlaceSite_QueryInterface,
276     InPlaceSite_AddRef,
277     InPlaceSite_Release,
278     InPlaceSite_GetWindow,
279     InPlaceSite_ContextSensitiveHelp,
280     InPlaceSite_CanInPlaceActivate,
281     InPlaceSite_OnInPlaceActivate,
282     InPlaceSite_OnUIActivate,
283     InPlaceSite_GetWindowContext,
284     InPlaceSite_Scroll,
285     InPlaceSite_OnUIDeactivate,
286     InPlaceSite_OnInPlaceDeactivate,
287     InPlaceSite_DiscardUndoState,
288     InPlaceSite_DeactivateAndUndo,
289     InPlaceSite_OnPosRectChange
290 };
291
292 #define DOCSITE_THIS(iface) DEFINE_THIS(WebBrowser, OleDocumentSite, iface)
293
294 static HRESULT WINAPI OleDocumentSite_QueryInterface(IOleDocumentSite *iface,
295                                                      REFIID riid, void **ppv)
296 {
297     WebBrowser *This = DOCSITE_THIS(iface);
298     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
299 }
300
301 static ULONG WINAPI OleDocumentSite_AddRef(IOleDocumentSite *iface)
302 {
303     WebBrowser *This = DOCSITE_THIS(iface);
304     return IOleClientSite_AddRef(CLIENTSITE(This));
305 }
306
307 static ULONG WINAPI OleDocumentSite_Release(IOleDocumentSite *iface)
308 {
309     WebBrowser *This = DOCSITE_THIS(iface);
310     return IOleClientSite_Release(CLIENTSITE(This));
311 }
312
313 static HRESULT WINAPI OleDocumentSite_ActivateMe(IOleDocumentSite *iface,
314                                                  IOleDocumentView *pViewToActivate)
315 {
316     WebBrowser *This = DOCSITE_THIS(iface);
317     IOleDocument *oledoc;
318     RECT rect;
319     HRESULT hres;
320
321     TRACE("(%p)->(%p)\n", This, pViewToActivate);
322
323     hres = IUnknown_QueryInterface(This->document, &IID_IOleDocument, (void**)&oledoc);
324     if(FAILED(hres))
325         return hres;
326
327     IOleDocument_CreateView(oledoc, INPLACESITE(This), NULL, 0, &This->view);
328     IOleDocument_Release(oledoc);
329
330     GetClientRect(This->doc_view_hwnd, &rect);
331     IOleDocumentView_SetRect(This->view, &rect);
332
333     hres = IOleDocumentView_Show(This->view, TRUE);
334
335     return hres;
336 }
337
338 #undef DOCSITE_THIS
339
340 static const IOleDocumentSiteVtbl OleDocumentSiteVtbl = {
341     OleDocumentSite_QueryInterface,
342     OleDocumentSite_AddRef,
343     OleDocumentSite_Release,
344     OleDocumentSite_ActivateMe
345 };
346
347 #define DISP_THIS(iface) DEFINE_THIS(WebBrowser, Dispatch, iface)
348
349 static HRESULT WINAPI ClDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
350 {
351     WebBrowser *This = DISP_THIS(iface);
352     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
353 }
354
355 static ULONG WINAPI ClDispatch_AddRef(IDispatch *iface)
356 {
357     WebBrowser *This = DISP_THIS(iface);
358     return IWebBrowser2_AddRef(WEBBROWSER(This));
359 }
360
361 static ULONG WINAPI ClDispatch_Release(IDispatch *iface)
362 {
363     WebBrowser *This = DISP_THIS(iface);
364     return IWebBrowser2_Release(WEBBROWSER(This));
365 }
366
367 static HRESULT WINAPI ClDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
368 {
369     WebBrowser *This = DISP_THIS(iface);
370     FIXME("(%p)->(%p)\n", This, pctinfo);
371     return E_NOTIMPL;
372 }
373
374 static HRESULT WINAPI ClDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
375                                       ITypeInfo **ppTInfo)
376 {
377     WebBrowser *This = DISP_THIS(iface);
378     FIXME("(%p)->(%u %ld %p)\n", This, iTInfo, lcid, ppTInfo);
379     return E_NOTIMPL;
380 }
381
382 static HRESULT WINAPI ClDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
383                                         UINT cNames, LCID lcid, DISPID *rgDispId)
384 {
385     WebBrowser *This = DISP_THIS(iface);
386     FIXME("(%p)->(%s %p %u %ld %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
387           lcid, rgDispId);
388     return E_NOTIMPL;
389 }
390
391 static HRESULT WINAPI ClDispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
392                                  LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
393                                  VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
394 {
395     WebBrowser *This = DISP_THIS(iface);
396     FIXME("(%p)->(%ld %s %ld %04x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
397           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
398     return E_NOTIMPL;
399 }
400
401 #undef DISP_THIS
402
403 static const IDispatchVtbl DispatchVtbl = {
404     ClDispatch_QueryInterface,
405     ClDispatch_AddRef,
406     ClDispatch_Release,
407     ClDispatch_GetTypeInfoCount,
408     ClDispatch_GetTypeInfo,
409     ClDispatch_GetIDsOfNames,
410     ClDispatch_Invoke
411 };
412
413 void WebBrowser_ClientSite_Init(WebBrowser *This)
414 {
415     This->lpOleClientSiteVtbl   = &OleClientSiteVtbl;
416     This->lpOleInPlaceSiteVtbl  = &OleInPlaceSiteVtbl;
417     This->lpOleDocumentSiteVtbl = &OleDocumentSiteVtbl;
418     This->lpDispatchVtbl        = &DispatchVtbl;
419
420     This->view = NULL;
421 }
422
423 void WebBrowser_ClientSite_Destroy(WebBrowser *This)
424 {
425     if(This->view)
426         IOleDocumentView_Release(This->view);
427 }