msi: Store the base URL of the MSI package if it is downloaded.
[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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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(DocHost, OleClientSite, iface)
25
26 static HRESULT WINAPI ClientSite_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppv)
27 {
28     DocHost *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_IOleCommandTarget, riid)) {
54         TRACE("(%p)->(IID_IOleCommandTarget %p)\n", This, ppv);
55         *ppv = OLECMD(This);
56     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
57         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
58         *ppv = CLDISP(This);
59     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
60         TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
61         *ppv = SERVPROV(This);
62     }
63
64     if(*ppv) {
65         IOleClientSite_AddRef(CLIENTSITE(This));
66         return S_OK;
67     }
68
69     WARN("Unsupported intrface %s\n", debugstr_guid(riid));
70
71     return E_NOINTERFACE;
72 }
73
74 static ULONG WINAPI ClientSite_AddRef(IOleClientSite *iface)
75 {
76     DocHost *This = CLIENTSITE_THIS(iface);
77     return IDispatch_AddRef(This->disp);
78 }
79
80 static ULONG WINAPI ClientSite_Release(IOleClientSite *iface)
81 {
82     DocHost *This = CLIENTSITE_THIS(iface);
83     return IDispatch_Release(This->disp);
84 }
85
86 static HRESULT WINAPI ClientSite_SaveObject(IOleClientSite *iface)
87 {
88     DocHost *This = CLIENTSITE_THIS(iface);
89     FIXME("(%p)\n", This);
90     return E_NOTIMPL;
91 }
92
93 static HRESULT WINAPI ClientSite_GetMoniker(IOleClientSite *iface, DWORD dwAssign,
94                                             DWORD dwWhichMoniker, IMoniker **ppmk)
95 {
96     DocHost *This = CLIENTSITE_THIS(iface);
97     FIXME("(%p)->(%d %d %p)\n", This, dwAssign, dwWhichMoniker, ppmk);
98     return E_NOTIMPL;
99 }
100
101 static HRESULT WINAPI ClientSite_GetContainer(IOleClientSite *iface, IOleContainer **ppContainer)
102 {
103     DocHost *This = CLIENTSITE_THIS(iface);
104     FIXME("(%p)->(%p)\n", This, ppContainer);
105     return E_NOTIMPL;
106 }
107
108 static HRESULT WINAPI ClientSite_ShowObject(IOleClientSite *iface)
109 {
110     DocHost *This = CLIENTSITE_THIS(iface);
111     FIXME("(%p)\n", This);
112     return E_NOTIMPL;
113 }
114
115 static HRESULT WINAPI ClientSite_OnShowWindow(IOleClientSite *iface, BOOL fShow)
116 {
117     DocHost *This = CLIENTSITE_THIS(iface);
118     FIXME("(%p)->(%x)\n", This, fShow);
119     return E_NOTIMPL;
120 }
121
122 static HRESULT WINAPI ClientSite_RequestNewObjectLayout(IOleClientSite *iface)
123 {
124     DocHost *This = CLIENTSITE_THIS(iface);
125     FIXME("(%p)\n", This);
126     return E_NOTIMPL;
127 }
128
129 #undef CLIENTSITE_THIS
130
131 static const IOleClientSiteVtbl OleClientSiteVtbl = {
132     ClientSite_QueryInterface,
133     ClientSite_AddRef,
134     ClientSite_Release,
135     ClientSite_SaveObject,
136     ClientSite_GetMoniker,
137     ClientSite_GetContainer,
138     ClientSite_ShowObject,
139     ClientSite_OnShowWindow,
140     ClientSite_RequestNewObjectLayout
141 };
142
143 #define INPLACESITE_THIS(iface) DEFINE_THIS(DocHost, OleInPlaceSite, iface)
144
145 static HRESULT WINAPI InPlaceSite_QueryInterface(IOleInPlaceSite *iface, REFIID riid, void **ppv)
146 {
147     DocHost *This = INPLACESITE_THIS(iface);
148     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
149 }
150
151 static ULONG WINAPI InPlaceSite_AddRef(IOleInPlaceSite *iface)
152 {
153     DocHost *This = INPLACESITE_THIS(iface);
154     return IOleClientSite_AddRef(CLIENTSITE(This));
155 }
156
157 static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSite *iface)
158 {
159     DocHost *This = INPLACESITE_THIS(iface);
160     return IOleClientSite_Release(CLIENTSITE(This));
161 }
162
163 static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSite *iface, HWND *phwnd)
164 {
165     DocHost *This = INPLACESITE_THIS(iface);
166
167     TRACE("(%p)->(%p)\n", This, phwnd);
168
169     *phwnd = This->hwnd;
170     return S_OK;
171 }
172
173 static HRESULT WINAPI InPlaceSite_ContextSensitiveHelp(IOleInPlaceSite *iface, BOOL fEnterMode)
174 {
175     DocHost *This = INPLACESITE_THIS(iface);
176     FIXME("(%p)->(%x)\n", This, fEnterMode);
177     return E_NOTIMPL;
178 }
179
180 static HRESULT WINAPI InPlaceSite_CanInPlaceActivate(IOleInPlaceSite *iface)
181 {
182     DocHost *This = INPLACESITE_THIS(iface);
183
184     TRACE("(%p)\n", This);
185
186     /* Nothing to do here */
187     return S_OK;
188 }
189
190 static HRESULT WINAPI InPlaceSite_OnInPlaceActivate(IOleInPlaceSite *iface)
191 {
192     DocHost *This = INPLACESITE_THIS(iface);
193
194     TRACE("(%p)\n", This);
195
196     /* Nothing to do here */
197     return S_OK;
198 }
199
200 static HRESULT WINAPI InPlaceSite_OnUIActivate(IOleInPlaceSite *iface)
201 {
202     DocHost *This = INPLACESITE_THIS(iface);
203     FIXME("(%p)\n", This);
204     return E_NOTIMPL;
205 }
206
207 static HRESULT WINAPI InPlaceSite_GetWindowContext(IOleInPlaceSite *iface,
208         IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect,
209         LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
210 {
211     DocHost *This = INPLACESITE_THIS(iface);
212
213     TRACE("(%p)->(%p %p %p %p %p)\n", This, ppFrame, ppDoc, lprcPosRect,
214           lprcClipRect, lpFrameInfo);
215
216     IOleInPlaceFrame_AddRef(INPLACEFRAME(This));
217     *ppFrame = INPLACEFRAME(This);
218     *ppDoc = NULL;
219
220     GetClientRect(This->hwnd, lprcPosRect);
221     memcpy(lprcClipRect, lprcPosRect, sizeof(RECT));
222
223     lpFrameInfo->cb = sizeof(*lpFrameInfo);
224     lpFrameInfo->fMDIApp = FALSE;
225     lpFrameInfo->hwndFrame = This->frame_hwnd;
226     lpFrameInfo->haccel = NULL;
227     lpFrameInfo->cAccelEntries = 0; /* FIXME: should be 5 */
228
229     return S_OK;
230 }
231
232 static HRESULT WINAPI InPlaceSite_Scroll(IOleInPlaceSite *iface, SIZE scrollExtent)
233 {
234     DocHost *This = INPLACESITE_THIS(iface);
235     FIXME("(%p)->({%d %d})\n", This, scrollExtent.cx, scrollExtent.cy);
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI InPlaceSite_OnUIDeactivate(IOleInPlaceSite *iface, BOOL fUndoable)
240 {
241     DocHost *This = INPLACESITE_THIS(iface);
242     FIXME("(%p)->(%x)\n", This, fUndoable);
243     return E_NOTIMPL;
244 }
245
246 static HRESULT WINAPI InPlaceSite_OnInPlaceDeactivate(IOleInPlaceSite *iface)
247 {
248     DocHost *This = INPLACESITE_THIS(iface);
249
250     TRACE("(%p)\n", This);
251
252     /* Nothing to do here */
253     return S_OK;
254 }
255
256 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface)
257 {
258     DocHost *This = INPLACESITE_THIS(iface);
259     FIXME("(%p)\n", This);
260     return E_NOTIMPL;
261 }
262
263 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface)
264 {
265     DocHost *This = INPLACESITE_THIS(iface);
266     FIXME("(%p)\n", This);
267     return E_NOTIMPL;
268 }
269
270 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface,
271                                                   LPCRECT lprcPosRect)
272 {
273     DocHost *This = INPLACESITE_THIS(iface);
274     FIXME("(%p)->(%p)\n", This, lprcPosRect);
275     return E_NOTIMPL;
276 }
277
278 #undef INPLACESITE_THIS
279
280 static const IOleInPlaceSiteVtbl OleInPlaceSiteVtbl = {
281     InPlaceSite_QueryInterface,
282     InPlaceSite_AddRef,
283     InPlaceSite_Release,
284     InPlaceSite_GetWindow,
285     InPlaceSite_ContextSensitiveHelp,
286     InPlaceSite_CanInPlaceActivate,
287     InPlaceSite_OnInPlaceActivate,
288     InPlaceSite_OnUIActivate,
289     InPlaceSite_GetWindowContext,
290     InPlaceSite_Scroll,
291     InPlaceSite_OnUIDeactivate,
292     InPlaceSite_OnInPlaceDeactivate,
293     InPlaceSite_DiscardUndoState,
294     InPlaceSite_DeactivateAndUndo,
295     InPlaceSite_OnPosRectChange
296 };
297
298 #define DOCSITE_THIS(iface) DEFINE_THIS(DocHost, OleDocumentSite, iface)
299
300 static HRESULT WINAPI OleDocumentSite_QueryInterface(IOleDocumentSite *iface,
301                                                      REFIID riid, void **ppv)
302 {
303     DocHost *This = DOCSITE_THIS(iface);
304     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
305 }
306
307 static ULONG WINAPI OleDocumentSite_AddRef(IOleDocumentSite *iface)
308 {
309     DocHost *This = DOCSITE_THIS(iface);
310     return IOleClientSite_AddRef(CLIENTSITE(This));
311 }
312
313 static ULONG WINAPI OleDocumentSite_Release(IOleDocumentSite *iface)
314 {
315     DocHost *This = DOCSITE_THIS(iface);
316     return IOleClientSite_Release(CLIENTSITE(This));
317 }
318
319 static HRESULT WINAPI OleDocumentSite_ActivateMe(IOleDocumentSite *iface,
320                                                  IOleDocumentView *pViewToActivate)
321 {
322     DocHost *This = DOCSITE_THIS(iface);
323     IOleDocument *oledoc;
324     RECT rect;
325     HRESULT hres;
326
327     TRACE("(%p)->(%p)\n", This, pViewToActivate);
328
329     hres = IUnknown_QueryInterface(This->document, &IID_IOleDocument, (void**)&oledoc);
330     if(FAILED(hres))
331         return hres;
332
333     IOleDocument_CreateView(oledoc, INPLACESITE(This), NULL, 0, &This->view);
334     IOleDocument_Release(oledoc);
335
336     GetClientRect(This->hwnd, &rect);
337     IOleDocumentView_SetRect(This->view, &rect);
338
339     hres = IOleDocumentView_Show(This->view, TRUE);
340
341     return hres;
342 }
343
344 #undef DOCSITE_THIS
345
346 static const IOleDocumentSiteVtbl OleDocumentSiteVtbl = {
347     OleDocumentSite_QueryInterface,
348     OleDocumentSite_AddRef,
349     OleDocumentSite_Release,
350     OleDocumentSite_ActivateMe
351 };
352
353 #define DISP_THIS(iface) DEFINE_THIS(DocHost, Dispatch, iface)
354
355 static HRESULT WINAPI ClDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
356 {
357     DocHost *This = DISP_THIS(iface);
358     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
359 }
360
361 static ULONG WINAPI ClDispatch_AddRef(IDispatch *iface)
362 {
363     DocHost *This = DISP_THIS(iface);
364     return IOleClientSite_AddRef(CLIENTSITE(This));
365 }
366
367 static ULONG WINAPI ClDispatch_Release(IDispatch *iface)
368 {
369     DocHost *This = DISP_THIS(iface);
370     return IOleClientSite_Release(CLIENTSITE(This));
371 }
372
373 static HRESULT WINAPI ClDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
374 {
375     DocHost *This = DISP_THIS(iface);
376
377     TRACE("(%p)->(%p)\n", This, pctinfo);
378
379     return E_NOTIMPL;
380 }
381
382 static HRESULT WINAPI ClDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
383                                              ITypeInfo **ppTInfo)
384 {
385     DocHost *This = DISP_THIS(iface);
386
387     TRACE("(%p)->(%u %d %p)\n", This, iTInfo, lcid, ppTInfo);
388
389     return E_NOTIMPL;
390 }
391
392 static HRESULT WINAPI ClDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
393                                                UINT cNames, LCID lcid, DISPID *rgDispId)
394 {
395     DocHost *This = DISP_THIS(iface);
396
397     TRACE("(%p)->(%s %p %u %d %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
398           lcid, rgDispId);
399
400     return E_NOTIMPL;
401 }
402
403 static HRESULT WINAPI ClDispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
404                                         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
405                                         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
406 {
407     DocHost *This = DISP_THIS(iface);
408     FIXME("(%p)->(%d %s %d %04x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
409           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
410     return E_NOTIMPL;
411 }
412
413 #undef DISP_THIS
414
415 static const IDispatchVtbl DispatchVtbl = {
416     ClDispatch_QueryInterface,
417     ClDispatch_AddRef,
418     ClDispatch_Release,
419     ClDispatch_GetTypeInfoCount,
420     ClDispatch_GetTypeInfo,
421     ClDispatch_GetIDsOfNames,
422     ClDispatch_Invoke
423 };
424
425 #define SERVPROV_THIS(iface) DEFINE_THIS(DocHost, ServiceProvider, iface)
426
427 static HRESULT WINAPI ClServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid,
428                                                        void **ppv)
429 {
430     DocHost *This = SERVPROV_THIS(iface);
431     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
432 }
433
434 static ULONG WINAPI ClServiceProvider_AddRef(IServiceProvider *iface)
435 {
436     DocHost *This = SERVPROV_THIS(iface);
437     return IOleClientSite_AddRef(CLIENTSITE(This));
438 }
439
440 static ULONG WINAPI ClServiceProvider_Release(IServiceProvider *iface)
441 {
442     DocHost *This = SERVPROV_THIS(iface);
443     return IOleClientSite_Release(CLIENTSITE(This));
444 }
445
446 static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
447                                                      REFIID riid, void **ppv)
448 {
449     DocHost *This = SERVPROV_THIS(iface);
450
451     if(IsEqualGUID(&IID_IHlinkFrame, guidService)) {
452         TRACE("(%p)->(IID_IHlinkFrame %s %p)\n", This, debugstr_guid(riid), ppv);
453         return IDispatch_QueryInterface(This->disp, riid, ppv);
454     }
455
456     FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
457
458     return E_NOINTERFACE;
459 }
460
461 #undef SERVPROV_THIS
462
463 static const IServiceProviderVtbl ServiceProviderVtbl = {
464     ClServiceProvider_QueryInterface,
465     ClServiceProvider_AddRef,
466     ClServiceProvider_Release,
467     ClServiceProvider_QueryService
468 };
469
470 void DocHost_ClientSite_Init(DocHost *This)
471 {
472     This->lpOleClientSiteVtbl   = &OleClientSiteVtbl;
473     This->lpOleInPlaceSiteVtbl  = &OleInPlaceSiteVtbl;
474     This->lpOleDocumentSiteVtbl = &OleDocumentSiteVtbl;
475     This->lpDispatchVtbl        = &DispatchVtbl;
476     This->lpServiceProviderVtbl = &ServiceProviderVtbl;
477
478     This->view = NULL;
479 }
480
481 void DocHost_ClientSite_Release(DocHost *This)
482 {
483     if(This->view)
484         IOleDocumentView_Release(This->view);
485 }