xref: /reactos/dll/win32/mshtml/ipwindow.c (revision 50cf16b3)
1 /*
2  * Copyright 2010 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 "mshtml_private.h"
20 
21 typedef struct {
22     IOleInPlaceFrame IOleInPlaceFrame_iface;
23     LONG ref;
24 } InPlaceFrame;
25 
26 static inline InPlaceFrame *impl_from_IOleInPlaceFrame(IOleInPlaceFrame *iface)
27 {
28     return CONTAINING_RECORD(iface, InPlaceFrame, IOleInPlaceFrame_iface);
29 }
30 
31 static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface,
32                                                   REFIID riid, void **ppv)
33 {
34     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
35 
36     TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
37 
38     if(IsEqualGUID(&IID_IUnknown, riid)) {
39         *ppv = &This->IOleInPlaceFrame_iface;
40     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
41         *ppv = &This->IOleInPlaceFrame_iface;
42     }else if(IsEqualGUID(&IID_IOleInPlaceUIWindow, riid)) {
43         *ppv = &This->IOleInPlaceFrame_iface;
44     }else if(IsEqualGUID(&IID_IOleInPlaceFrame, riid)) {
45         *ppv = &This->IOleInPlaceFrame_iface;
46     }else {
47         WARN("Unsopported interface %s\n", debugstr_mshtml_guid(riid));
48         *ppv = NULL;
49         return E_NOINTERFACE;
50     }
51 
52     IUnknown_AddRef((IUnknown*)*ppv);
53     return S_OK;
54 }
55 
56 static ULONG WINAPI InPlaceFrame_AddRef(IOleInPlaceFrame *iface)
57 {
58     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
59     LONG ref = InterlockedIncrement(&This->ref);
60 
61     TRACE("(%p) ref=%d\n", This, ref);
62 
63     return ref;
64 }
65 
66 static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
67 {
68     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
69     LONG ref = InterlockedDecrement(&This->ref);
70 
71     TRACE("(%p) ref=%d\n", This, ref);
72 
73     if(!ref)
74         heap_free(This);
75 
76     return ref;
77 }
78 
79 static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
80 {
81     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
82     FIXME("(%p)->(%p)\n", This, phwnd);
83     return E_NOTIMPL;
84 }
85 
86 static HRESULT WINAPI InPlaceFrame_ContextSensitiveHelp(IOleInPlaceFrame *iface,
87                                                         BOOL fEnterMode)
88 {
89     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
90     FIXME("(%p)->(%x)\n", This, fEnterMode);
91     return E_NOTIMPL;
92 }
93 
94 static HRESULT WINAPI InPlaceFrame_GetBorder(IOleInPlaceFrame *iface, LPRECT lprectBorder)
95 {
96     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
97     FIXME("(%p)->(%p)\n", This, lprectBorder);
98     return E_NOTIMPL;
99 }
100 
101 static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
102                                                       LPCBORDERWIDTHS pborderwidths)
103 {
104     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
105     FIXME("(%p)->(%p)\n", This, pborderwidths);
106     return E_NOTIMPL;
107 }
108 
109 static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
110                                                   LPCBORDERWIDTHS pborderwidths)
111 {
112     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
113     FIXME("(%p)->(%p)\n", This, pborderwidths);
114     return E_NOTIMPL;
115 }
116 
117 static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
118         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
119 {
120     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
121     FIXME("(%p)->(%p %s)\n", This, pActiveObject, debugstr_w(pszObjName));
122     return E_NOTIMPL;
123 }
124 
125 static HRESULT WINAPI InPlaceFrame_InsertMenus(IOleInPlaceFrame *iface, HMENU hmenuShared,
126         LPOLEMENUGROUPWIDTHS lpMenuWidths)
127 {
128     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
129     FIXME("(%p)->(%p %p)\n", This, hmenuShared, lpMenuWidths);
130     return E_NOTIMPL;
131 }
132 
133 static HRESULT WINAPI InPlaceFrame_SetMenu(IOleInPlaceFrame *iface, HMENU hmenuShared,
134         HOLEMENU holemenu, HWND hwndActiveObject)
135 {
136     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
137     FIXME("(%p)->(%p %p %p)\n", This, hmenuShared, holemenu, hwndActiveObject);
138     return E_NOTIMPL;
139 }
140 
141 static HRESULT WINAPI InPlaceFrame_RemoveMenus(IOleInPlaceFrame *iface, HMENU hmenuShared)
142 {
143     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
144     FIXME("(%p)->(%p)\n", This, hmenuShared);
145     return E_NOTIMPL;
146 }
147 
148 static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface,
149                                                  LPCOLESTR pszStatusText)
150 {
151     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
152     FIXME("(%p)->(%s)\n", This, debugstr_w(pszStatusText));
153     return E_NOTIMPL;
154 }
155 
156 static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
157 {
158     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
159     FIXME("(%p)->(%x)\n", This, fEnable);
160     return E_NOTIMPL;
161 }
162 
163 static HRESULT WINAPI InPlaceFrame_TranslateAccelerator(IOleInPlaceFrame *iface, LPMSG lpmsg,
164                                                         WORD wID)
165 {
166     InPlaceFrame *This = impl_from_IOleInPlaceFrame(iface);
167     FIXME("(%p)->(%p %d)\n", This, lpmsg, wID);
168     return E_NOTIMPL;
169 }
170 
171 static const IOleInPlaceFrameVtbl OleInPlaceFrameVtbl = {
172     InPlaceFrame_QueryInterface,
173     InPlaceFrame_AddRef,
174     InPlaceFrame_Release,
175     InPlaceFrame_GetWindow,
176     InPlaceFrame_ContextSensitiveHelp,
177     InPlaceFrame_GetBorder,
178     InPlaceFrame_RequestBorderSpace,
179     InPlaceFrame_SetBorderSpace,
180     InPlaceFrame_SetActiveObject,
181     InPlaceFrame_InsertMenus,
182     InPlaceFrame_SetMenu,
183     InPlaceFrame_RemoveMenus,
184     InPlaceFrame_SetStatusText,
185     InPlaceFrame_EnableModeless,
186     InPlaceFrame_TranslateAccelerator
187 };
188 
189 HRESULT create_ip_frame(IOleInPlaceFrame **ret)
190 {
191     InPlaceFrame *frame;
192 
193     frame = heap_alloc_zero(sizeof(*frame));
194     if(!frame)
195         return E_OUTOFMEMORY;
196 
197     frame->IOleInPlaceFrame_iface.lpVtbl = &OleInPlaceFrameVtbl;
198     frame->ref = 1;
199 
200     *ret = &frame->IOleInPlaceFrame_iface;
201     return S_OK;
202 }
203 
204 typedef struct {
205     IOleInPlaceUIWindow IOleInPlaceUIWindow_iface;
206     LONG ref;
207 } InPlaceUIWindow;
208 
209 static inline InPlaceUIWindow *impl_from_IOleInPlaceUIWindow(IOleInPlaceUIWindow *iface)
210 {
211     return CONTAINING_RECORD(iface, InPlaceUIWindow, IOleInPlaceUIWindow_iface);
212 }
213 
214 static HRESULT WINAPI InPlaceUIWindow_QueryInterface(IOleInPlaceUIWindow *iface, REFIID riid, void **ppv)
215 {
216     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
217 
218     TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
219 
220     if(IsEqualGUID(&IID_IUnknown, riid)) {
221         *ppv = &This->IOleInPlaceUIWindow_iface;
222     }else if(IsEqualGUID(&IID_IOleWindow, riid)) {
223         *ppv = &This->IOleInPlaceUIWindow_iface;
224     }else if(IsEqualGUID(&IID_IOleInPlaceUIWindow, riid)) {
225         *ppv = &This->IOleInPlaceUIWindow_iface;
226     }else {
227         WARN("Unsopported interface %s\n", debugstr_mshtml_guid(riid));
228         *ppv = NULL;
229         return E_NOINTERFACE;
230     }
231 
232     IUnknown_AddRef((IUnknown*)*ppv);
233     return S_OK;
234 }
235 
236 static ULONG WINAPI InPlaceUIWindow_AddRef(IOleInPlaceUIWindow *iface)
237 {
238     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
239     LONG ref = InterlockedIncrement(&This->ref);
240 
241     TRACE("(%p) ref=%d\n", This, ref);
242 
243     return ref;
244 }
245 
246 static ULONG WINAPI InPlaceUIWindow_Release(IOleInPlaceUIWindow *iface)
247 {
248     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
249     LONG ref = InterlockedDecrement(&This->ref);
250 
251     TRACE("(%p) ref=%d\n", This, ref);
252 
253     if(!ref)
254         heap_free(This);
255 
256     return ref;
257 }
258 
259 static HRESULT WINAPI InPlaceUIWindow_GetWindow(IOleInPlaceUIWindow *iface, HWND *phwnd)
260 {
261     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
262     FIXME("(%p)->(%p)\n", This, phwnd);
263     return E_NOTIMPL;
264 }
265 
266 static HRESULT WINAPI InPlaceUIWindow_ContextSensitiveHelp(IOleInPlaceUIWindow *iface,
267         BOOL fEnterMode)
268 {
269     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
270     FIXME("(%p)->(%x)\n", This, fEnterMode);
271     return E_NOTIMPL;
272 }
273 
274 static HRESULT WINAPI InPlaceUIWindow_GetBorder(IOleInPlaceUIWindow *iface, LPRECT lprectBorder)
275 {
276     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
277     FIXME("(%p)->(%p)\n", This, lprectBorder);
278     return E_NOTIMPL;
279 }
280 
281 static HRESULT WINAPI InPlaceUIWindow_RequestBorderSpace(IOleInPlaceUIWindow *iface,
282         LPCBORDERWIDTHS pborderwidths)
283 {
284     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
285     FIXME("(%p)->(%p)\n", This, pborderwidths);
286     return E_NOTIMPL;
287 }
288 
289 static HRESULT WINAPI InPlaceUIWindow_SetBorderSpace(IOleInPlaceUIWindow *iface,
290         LPCBORDERWIDTHS pborderwidths)
291 {
292     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
293     FIXME("(%p)->(%p)\n", This, pborderwidths);
294     return E_NOTIMPL;
295 }
296 
297 static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceUIWindow *iface,
298         IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
299 {
300     InPlaceUIWindow *This = impl_from_IOleInPlaceUIWindow(iface);
301     FIXME("(%p)->(%p %s)\n", This, pActiveObject, debugstr_w(pszObjName));
302     return E_NOTIMPL;
303 }
304 
305 static const IOleInPlaceUIWindowVtbl OleInPlaceUIWindowVtbl = {
306     InPlaceUIWindow_QueryInterface,
307     InPlaceUIWindow_AddRef,
308     InPlaceUIWindow_Release,
309     InPlaceUIWindow_GetWindow,
310     InPlaceUIWindow_ContextSensitiveHelp,
311     InPlaceUIWindow_GetBorder,
312     InPlaceUIWindow_RequestBorderSpace,
313     InPlaceUIWindow_SetBorderSpace,
314     InPlaceUIWindow_SetActiveObject,
315 };
316 
317 HRESULT create_ip_window(IOleInPlaceUIWindow **ret)
318 {
319     InPlaceUIWindow *uiwindow;
320 
321     uiwindow = heap_alloc_zero(sizeof(*uiwindow));
322     if(!uiwindow)
323         return E_OUTOFMEMORY;
324 
325     uiwindow->IOleInPlaceUIWindow_iface.lpVtbl = &OleInPlaceUIWindowVtbl;
326     uiwindow->ref = 1;
327 
328     *ret = &uiwindow->IOleInPlaceUIWindow_iface;
329     return S_OK;
330 }
331