twain_32: Split out the sane specific parts from twain_32 code.
[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(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 = CLOLECMD(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)->(%ld %ld %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)->({%ld %ld})\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     FIXME("(%p)\n", This);
250     return E_NOTIMPL;
251 }
252
253 static HRESULT WINAPI InPlaceSite_DiscardUndoState(IOleInPlaceSite *iface)
254 {
255     DocHost *This = INPLACESITE_THIS(iface);
256     FIXME("(%p)\n", This);
257     return E_NOTIMPL;
258 }
259
260 static HRESULT WINAPI InPlaceSite_DeactivateAndUndo(IOleInPlaceSite *iface)
261 {
262     DocHost *This = INPLACESITE_THIS(iface);
263     FIXME("(%p)\n", This);
264     return E_NOTIMPL;
265 }
266
267 static HRESULT WINAPI InPlaceSite_OnPosRectChange(IOleInPlaceSite *iface,
268                                                   LPCRECT lprcPosRect)
269 {
270     DocHost *This = INPLACESITE_THIS(iface);
271     FIXME("(%p)->(%p)\n", This, lprcPosRect);
272     return E_NOTIMPL;
273 }
274
275 #undef INPLACESITE_THIS
276
277 static const IOleInPlaceSiteVtbl OleInPlaceSiteVtbl = {
278     InPlaceSite_QueryInterface,
279     InPlaceSite_AddRef,
280     InPlaceSite_Release,
281     InPlaceSite_GetWindow,
282     InPlaceSite_ContextSensitiveHelp,
283     InPlaceSite_CanInPlaceActivate,
284     InPlaceSite_OnInPlaceActivate,
285     InPlaceSite_OnUIActivate,
286     InPlaceSite_GetWindowContext,
287     InPlaceSite_Scroll,
288     InPlaceSite_OnUIDeactivate,
289     InPlaceSite_OnInPlaceDeactivate,
290     InPlaceSite_DiscardUndoState,
291     InPlaceSite_DeactivateAndUndo,
292     InPlaceSite_OnPosRectChange
293 };
294
295 #define DOCSITE_THIS(iface) DEFINE_THIS(DocHost, OleDocumentSite, iface)
296
297 static HRESULT WINAPI OleDocumentSite_QueryInterface(IOleDocumentSite *iface,
298                                                      REFIID riid, void **ppv)
299 {
300     DocHost *This = DOCSITE_THIS(iface);
301     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
302 }
303
304 static ULONG WINAPI OleDocumentSite_AddRef(IOleDocumentSite *iface)
305 {
306     DocHost *This = DOCSITE_THIS(iface);
307     return IOleClientSite_AddRef(CLIENTSITE(This));
308 }
309
310 static ULONG WINAPI OleDocumentSite_Release(IOleDocumentSite *iface)
311 {
312     DocHost *This = DOCSITE_THIS(iface);
313     return IOleClientSite_Release(CLIENTSITE(This));
314 }
315
316 static HRESULT WINAPI OleDocumentSite_ActivateMe(IOleDocumentSite *iface,
317                                                  IOleDocumentView *pViewToActivate)
318 {
319     DocHost *This = DOCSITE_THIS(iface);
320     IOleDocument *oledoc;
321     RECT rect;
322     HRESULT hres;
323
324     TRACE("(%p)->(%p)\n", This, pViewToActivate);
325
326     hres = IUnknown_QueryInterface(This->document, &IID_IOleDocument, (void**)&oledoc);
327     if(FAILED(hres))
328         return hres;
329
330     IOleDocument_CreateView(oledoc, INPLACESITE(This), NULL, 0, &This->view);
331     IOleDocument_Release(oledoc);
332
333     GetClientRect(This->hwnd, &rect);
334     IOleDocumentView_SetRect(This->view, &rect);
335
336     hres = IOleDocumentView_Show(This->view, TRUE);
337
338     return hres;
339 }
340
341 #undef DOCSITE_THIS
342
343 static const IOleDocumentSiteVtbl OleDocumentSiteVtbl = {
344     OleDocumentSite_QueryInterface,
345     OleDocumentSite_AddRef,
346     OleDocumentSite_Release,
347     OleDocumentSite_ActivateMe
348 };
349
350 #define DISP_THIS(iface) DEFINE_THIS(DocHost, Dispatch, iface)
351
352 static HRESULT WINAPI ClDispatch_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
353 {
354     DocHost *This = DISP_THIS(iface);
355     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
356 }
357
358 static ULONG WINAPI ClDispatch_AddRef(IDispatch *iface)
359 {
360     DocHost *This = DISP_THIS(iface);
361     return IOleClientSite_AddRef(CLIENTSITE(This));
362 }
363
364 static ULONG WINAPI ClDispatch_Release(IDispatch *iface)
365 {
366     DocHost *This = DISP_THIS(iface);
367     return IOleClientSite_Release(CLIENTSITE(This));
368 }
369
370 static HRESULT WINAPI ClDispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
371 {
372     DocHost *This = DISP_THIS(iface);
373
374     TRACE("(%p)->(%p)\n", This, pctinfo);
375
376     return E_NOTIMPL;
377 }
378
379 static HRESULT WINAPI ClDispatch_GetTypeInfo(IDispatch *iface, UINT iTInfo, LCID lcid,
380                                              ITypeInfo **ppTInfo)
381 {
382     DocHost *This = DISP_THIS(iface);
383
384     TRACE("(%p)->(%u %ld %p)\n", This, iTInfo, lcid, ppTInfo);
385
386     return E_NOTIMPL;
387 }
388
389 static HRESULT WINAPI ClDispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOLESTR *rgszNames,
390                                                UINT cNames, LCID lcid, DISPID *rgDispId)
391 {
392     DocHost *This = DISP_THIS(iface);
393
394     TRACE("(%p)->(%s %p %u %ld %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
395           lcid, rgDispId);
396
397     return E_NOTIMPL;
398 }
399
400 static HRESULT WINAPI ClDispatch_Invoke(IDispatch *iface, DISPID dispIdMember, REFIID riid,
401                                         LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
402                                         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
403 {
404     DocHost *This = DISP_THIS(iface);
405     FIXME("(%p)->(%ld %s %ld %04x %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
406           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
407     return E_NOTIMPL;
408 }
409
410 #undef DISP_THIS
411
412 static const IDispatchVtbl DispatchVtbl = {
413     ClDispatch_QueryInterface,
414     ClDispatch_AddRef,
415     ClDispatch_Release,
416     ClDispatch_GetTypeInfoCount,
417     ClDispatch_GetTypeInfo,
418     ClDispatch_GetIDsOfNames,
419     ClDispatch_Invoke
420 };
421
422 #define SERVPROV_THIS(iface) DEFINE_THIS(DocHost, ServiceProvider, iface)
423
424 static HRESULT WINAPI ClServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid,
425                                                        void **ppv)
426 {
427     DocHost *This = SERVPROV_THIS(iface);
428     return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppv);
429 }
430
431 static ULONG WINAPI ClServiceProvider_AddRef(IServiceProvider *iface)
432 {
433     DocHost *This = SERVPROV_THIS(iface);
434     return IOleClientSite_AddRef(CLIENTSITE(This));
435 }
436
437 static ULONG WINAPI ClServiceProvider_Release(IServiceProvider *iface)
438 {
439     DocHost *This = SERVPROV_THIS(iface);
440     return IOleClientSite_Release(CLIENTSITE(This));
441 }
442
443 static HRESULT WINAPI ClServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
444                                                      REFIID riid, void **ppv)
445 {
446     DocHost *This = SERVPROV_THIS(iface);
447
448     if(IsEqualGUID(&IID_IHlinkFrame, guidService)) {
449         TRACE("(%p)->(IID_IHlinkFrame %s %p)\n", This, debugstr_guid(riid), ppv);
450         return IDispatch_QueryInterface(This->disp, riid, ppv);
451     }
452
453     FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
454
455     return E_NOINTERFACE;
456 }
457
458 #undef SERVPROV_THIS
459
460 static const IServiceProviderVtbl ServiceProviderVtbl = {
461     ClServiceProvider_QueryInterface,
462     ClServiceProvider_AddRef,
463     ClServiceProvider_Release,
464     ClServiceProvider_QueryService
465 };
466
467 void DocHost_ClientSite_Init(DocHost *This)
468 {
469     This->lpOleClientSiteVtbl   = &OleClientSiteVtbl;
470     This->lpOleInPlaceSiteVtbl  = &OleInPlaceSiteVtbl;
471     This->lpOleDocumentSiteVtbl = &OleDocumentSiteVtbl;
472     This->lpDispatchVtbl        = &DispatchVtbl;
473     This->lpServiceProviderVtbl = &ServiceProviderVtbl;
474
475     This->view = NULL;
476 }
477
478 void DocHost_ClientSite_Release(DocHost *This)
479 {
480     if(This->view)
481         IOleDocumentView_Release(This->view);
482 }